Configuration

Every key the Marmot config file accepts.

Marmot keeps your default provider and model for each verb in a single config file at ~/.marmot/ai/config.json. marmot setup and marmot config set write to it for you. This page lists every key the file accepts.

Top level

{
  "version": 1,
  "defaults":  {  },
  "providers": {  },
  "presets":   {  }
}
KeyTypeNotes
versionnumberAlways 1. Bumped on breaking schema changes.
defaultsobjectPer-verb defaults (which provider backs each verb, which model).
providersobjectPer-provider settings (enable, response cache, custom env vars).
presetsobjectSaved bundles of flags, used via marmot @<name> and --preset.

Defaults

Every key under defaults is optional. Resolution differs by verb type:

  • AI verbs (text, image, speech, transcription): with no default and no --provider flag, marmot runs first-run auto-config — it detects available API keys in your env, picks the first ready provider in pecking order (ollamaopenroutervercelcloudflareopenaianthropic; image/speech/transcription skip ollama and anthropic), persists the choice to this file, and continues the call. A one-line stderr note announces it.
  • Web/data verbs (search, scrape, enrich, lookup, verify, etc.): no auto-config. With no default and no --provider, the call errors and points you at marmot setup.
{
  "defaults": {
    "text":          { "provider": "openrouter", "model": "openai/gpt-oss-120b" },
    "image":         { "provider": "openrouter", "model": "google/gemini-2.5-flash-image-preview" },
    "speech":        { "provider": "openrouter", "model": "openai/tts-1", "voice": "alloy" },
    "transcription": { "provider": "openrouter", "model": "openai/whisper-1" },

    "search":   { "provider": "tavily" },
    "scrape":   { "provider": "firecrawl" },
    "answer":   { "provider": "tavily" },
    "map":      { "provider": "tavily" },
    "crawl":    { "provider": "firecrawl" },
    "research": { "provider": "parallel" },
    "findall":  { "provider": "parallel" }
  }
}

AI verbs

PathTypeAllowed values
defaults.text.providerstringopenrouter, anthropic, openai, vercel, cloudflare, ollama
defaults.text.modelstringAny model id valid for the chosen provider
defaults.image.providerstringopenai, openrouter, vercel, cloudflare
defaults.image.modelstringAny image model valid for the chosen provider
defaults.speech.providerstringopenai, openrouter, vercel, cloudflare
defaults.speech.modelstringTTS model id
defaults.speech.voicestringVoice id (provider-specific)
defaults.transcription.providerstringopenai, openrouter, vercel, cloudflare
defaults.transcription.modelstringSTT model id

Web data verbs

PathTypeAllowed providers
defaults.search.providerstringbrave, exa, firecrawl, parallel, tavily
defaults.scrape.providerstringexa, firecrawl, parallel, tavily
defaults.answer.providerstringbrave, exa, tavily
defaults.map.providerstringfirecrawl, tavily
defaults.crawl.providerstringfirecrawl, tavily
defaults.research.providerstringexa, firecrawl, parallel, tavily
defaults.findall.providerstringexa, parallel

People and org verbs

PathTypeAllowed providers
defaults.enrich.providerstringapollo, hunter, pdl, tomba, datagma
defaults.lookup.providerstringapollo, hunter, pdl, tomba
defaults.verify.providerstringhunter, tomba, bouncer, datagma, zerobounce, kickbox

Data verbs only store provider. There is no per-verb model concept on these. The enrich, lookup, and verify defaults gate which provider serves the verb. The capability matrix per --type (person, org, email) lives on each verb's page.

Providers

Per-provider settings, keyed by provider slug. All fields optional. Applies to AI, web, and data providers uniformly.

{
  "providers": {
    "tavily": {
      "enabled": true,
      "cache": { "enabled": true, "ttlDays": 30 }
    },
    "apollo": {
      "apiKeyEnvVar": "MY_APOLLO_KEY"
    },
    "tomba": {
      "apiKeyEnvVar": "WORK_TOMBA_KEY",
      "apiSecretEnvVar": "WORK_TOMBA_SECRET"
    }
  }
}
PathTypeNotes
providers.<slug>.enabledbooleanfalse blocks all calls routed to this provider. Default: enabled.
providers.<slug>.apiKeyEnvVarstringCustom env var name for the API key. Default: each provider's built-in (e.g. APOLLO_API_KEY).
providers.<slug>.apiSecretEnvVarstringCustom env var name for a secondary credential (Tomba secret, Cloudflare account id).
providers.<slug>.cache.enabledbooleanCache responses for this provider's sync verbs. Web/data only. Default: false.
providers.<slug>.cache.ttlDaysinteger (≥1)TTL for cached responses. Default: 30.

Auth resolution order, per credential:

  1. --api-key flag on the command line
  2. providers.<slug>.apiKeyEnvVar env var if configured
  3. Built-in env var (APOLLO_API_KEY, TAVILY_API_KEY, etc.)

See Caching for the full cache model.

Resolution order

  1. Command-line flag for the call
  2. ~/.marmot/ai/config.json
  3. Error, with a hint to run marmot setup

Setting keys from the CLI

Three key shapes are accepted:

# AI verb defaults (under defaults.<verb>.<field>)
marmot config set text.provider anthropic
marmot config set image.model google/gemini-2.5-flash-image-preview
marmot config set speech.voice alloy

# Web/data verb defaults (under defaults.<verb>.provider)
marmot config set search.provider tavily
marmot config set enrich.provider pdl

# Per-provider settings (under providers.<slug>.<field>)
marmot config set providers.tavily.cache.enabled true
marmot config set providers.tavily.cache.ttlDays 14
marmot config set providers.apollo.apiKeyEnvVar MY_APOLLO_KEY
marmot config set providers.openrouter.enabled false

Boolean values must be true or false. ttlDays must be a positive integer.

marmot config unset providers.tavily.cache.ttlDays  # remove a single key
marmot config show                                  # human-readable
marmot config show --json                           # raw envelope
marmot config path                                  # print the config file path

marmot config show also reports the total response cache size and entry count, broken down per provider. See Caching.