LLM config JSON
The format of a file in
initial-data/llm-configs/. One file per config.
Example
llm-configs/claude-default.json
{
"id": "00000001-0000-0000-0000-000000000002",
"name": "claude-default",
"provider": "ANTHROPIC",
"model": "${CLAUDE_MODEL:claude-sonnet-4-6}",
"baseUrl": "https://api.anthropic.com",
"apiKey": "${ANTHROPIC_API_KEY}",
"defaultTemperature": 0.7,
"maxOutputTokens": 8192,
"additionalParams": {
"thinking": "adaptive",
"effort": "high"
},
"contextWindowTokens": 200000,
"capabilities": ["TOOL_CALLING", "VISION", "DOCUMENTS"],
"rateLimit": {
"maxConcurrentRequests": 3
},
"retry": {
"enabled": true,
"maxAttempts": 5,
"baseBackoffMillis": 2000,
"maxBackoffMillis": 30000
},
"fallbackModels": ["openai-default", "gemini-default"]
}
A minimal local config (no key needed):
llm-configs/lm-studio-default.json
{
"id": "00000001-0000-0000-0000-000000000001",
"name": "lm-studio-default",
"provider": "LM_STUDIO",
"model": "openai/gpt-oss-120b",
"baseUrl": "http://localhost:1234",
"apiKey": "lm-studio",
"defaultTemperature": 0.7,
"maxOutputTokens": 8192,
"additionalParams": {},
"contextWindowTokens": 131072
}
An alias carries no provider settings of its own and just names another
config. The bundled agent-default, which every shipped agent references, is
one:
llm-configs/agent-default.json
{
"id": "00000001-0000-0000-0000-000000000000",
"name": "agent-default",
"isAlias": true,
"delegatesTo": "openai-default"
}
Fields
| Field | Type | Description |
|---|---|---|
id | UUID | Stable identifier. Use a fresh UUID for a new config. |
name | string | Unique name; what an agent references via llmConfigName. |
provider | enum | One of ANTHROPIC, OPENAI, AZURE_OPENAI, GOOGLE_GEMINI, LM_STUDIO, GROQ, OLLAMA, MISTRAL, DEEPSEEK, XAI (Grok), MOONSHOT (Kimi), TOGETHER, OPENROUTER, PERPLEXITY, FIREWORKS. |
model | string | Model id. Supports ${VAR} / ${VAR:default}. |
baseUrl | string | API endpoint. Optional — left out, the provider's own endpoint applies (https://api.openai.com, https://api.mistral.ai, https://api.groq.com/openai, http://localhost:11434 …). Set it for a proxy, a local server, or an Azure resource, which has no default. |
apiKey | string | API key — almost always an env-var placeholder like ${ANTHROPIC_API_KEY}. Literal keys are stored encrypted in the Admin UI (the CLI stores them as-is — use placeholders there). |
type | enum? | CHAT (default), EMBEDDING or SPEECH_TO_TEXT. Embedding configs power the vector store; speech-to-text configs turn a recording into text through LlmTranscription (since 0.5.3). Only chat configs have sampling settings. |
capabilities | string[]? | What the model reads and does: any of TOOL_CALLING, VISION (images), DOCUMENTS (PDF), AUDIO_INPUT. VISION and DOCUMENTS decide whether an image or PDF sent with a message reaches the model as content or as a placeholder line. Omitted means not declared — the provider's default applies (Anthropic and OpenAI: tool calling, vision, documents; Gemini: those plus audio; Azure OpenAI: tool calling, vision; local servers and routers: tool calling only). A declared list, [] included, always wins over that default. Chat configs only. |
defaultTemperature | number | Sampling temperature (e.g. 0.7). |
maxOutputTokens | int | Max tokens the model may generate per response. |
contextWindowTokens | int | Token budget used to size the working-memory window. |
additionalParams | object | Provider-specific options. For Anthropic thinking (adaptive/disabled) and effort (low, medium, high, xhigh, max); for OpenAI also reasoning_summary (auto, concise, detailed, none); for every OpenAI-compatible provider reasoning_effort (none, minimal, low, medium, high, xhigh — which levels apply depends on the model; local servers ignore it, and OpenAI is only sent it with a reasoning model, since it rejects it elsewhere). |
rateLimit | object? | Optional. maxConcurrentRequests caps in-flight calls. |
retry | object? | Optional. enabled, maxAttempts, baseBackoffMillis, maxBackoffMillis. Omitting the block means no retry at all — the built-in defaults only apply when the block is present and enabled. |
fallbackModels | string[]? | Optional. Other configs, by name, to try in order when this one is rate-limited (HTTP 429) or the provider is overloaded (529) — after retry is exhausted. Point them at a different provider: its limit is a different limit. A fallback may name an alias. Omitted or [] means the call fails with the rate-limit error. Chat configs only. |
isAlias / delegatesTo | bool / string | Alias configs forward to another config by name — useful to give a stable name (agent-default) that you can repoint. |
Env-var placeholders
name, model, baseUrl and apiKey support ${VAR} / ${VAR:default},
resolved at use time — the raw placeholder stays in storage. See
how API keys resolve and the
environment variables page.
See also the LLM configuration reference for the bundled configs and supported providers.