Skip to main content

LLM configuration reference

An LLM config tells an agent which model to call and how to authenticate. Each agent references one by name (llmConfigName). The same configs ship with both the Admin UI and the CLI, under src/main/resources/initial-data/llm-configs/.

You select a model per agent by setting its llmConfigName to one of these.

tip

For managing configs in the Admin UI (create / edit / test, and how API keys resolve from environment variables), see Admin UI → LLM Configs.

Supported providers​

ConfigProviderDefault modelAuth / endpoint env vars
claude-defaultAnthropicclaude-sonnet-4-6ANTHROPIC_API_KEY
claude-haiku-defaultAnthropicclaude-haiku-4-5ANTHROPIC_API_KEY
openai-defaultOpenAIgpt-5.4-miniOPENAI_API_KEY
azure-openai-defaultAzure OpenAIdeployment gpt-4oAZURE_OPENAI_API_KEY, AZURE_OPENAI_ENDPOINT, AZURE_OPENAI_DEPLOYMENT
gemini-defaultGoogle Geminigemini-2.0-flashGEMINI_API_KEY
lm-studio-defaultLM Studio (local)openai/gpt-oss-120bnone — local server at http://localhost:1234
gemma-readerLM Studio (local)google/gemma-4-e4bnone — a small local model for page-reading sub-agents, GEMMA_MODEL to override
agent-defaultalias → openai-default—whatever the target needs; the default every bundled agent uses
embeddingsLM Studio (local), EMBEDDINGtext-embedding-nomic-embed-text-v1.5none — EMBEDDING_BASE_URL, EMBEDDING_MODEL to override
openai-embeddingsOpenAI, EMBEDDINGtext-embedding-3-smallOPENAI_API_KEY, OPENAI_EMBEDDING_MODEL
agent-default is the default

Every bundled agent references agent-default. It is an alias, not a provider config of its own: out of the box it delegates to openai-default, so the agents work as soon as OPENAI_API_KEY is set. To move all of them to another provider at once, repoint the alias — edit delegatesTo in agent-default.json or in the Admin UI (for example to claude-default, or to lm-studio-default for a fully local setup). To move a single agent, change its llmConfigName instead.

Anatomy of a config​

llm-configs/claude-default.json
{
"name": "claude-default",
"provider": "ANTHROPIC",
"model": "${CLAUDE_MODEL:claude-sonnet-4-6}",
"baseUrl": "https://api.anthropic.com",
"apiKey": "${ANTHROPIC_API_KEY}",
"contextWindowTokens": 200000,
"capabilities": ["TOOL_CALLING", "VISION", "DOCUMENTS"],
"additionalParams": {
"thinking": "adaptive",
"effort": "high"
},
"rateLimit": { "maxConcurrentRequests": 3 },
"retry": {
"enabled": true,
"maxAttempts": 5,
"baseBackoffMillis": 2000,
"maxBackoffMillis": 30000
},
"fallbackModels": ["openai-default", "gemini-default"]
}
FieldMeaning
providerANTHROPIC, OPENAI, AZURE_OPENAI, GOOGLE_GEMINI, LM_STUDIO, GROQ, OLLAMA, MISTRAL, DEEPSEEK, XAI (Grok), MOONSHOT (Kimi), TOGETHER, OPENROUTER, PERPLEXITY or FIREWORKS
modelModel id. ${VAR:default} reads an env var with a fallback
baseUrlAPI endpoint. Optional: each provider knows its own (LlmProvider.defaultBaseUrl()), so set it only for a proxy, a local server, or an Azure resource
apiKeyAPI key, usually injected from an env var
contextWindowTokensToken budget used to size the working-memory window
capabilitiesWhat the model reads and does — TOOL_CALLING, VISION, DOCUMENTS, AUDIO_INPUT. Vision and documents decide whether an image or PDF reaches the model as content or as a placeholder. Omitted: the provider's default applies
additionalParamsProvider-specific options — Anthropic thinking / effort, reasoning_effort on every OpenAI-compatible provider
rateLimitOptional — cap concurrent requests
retryOptional — automatic retry with backoff
fallbackModelsOptional — other configs, by name, to switch to when this one is rate-limited (see rate limits and fallbacks)

What a config costs is not part of it: prices are their own entity, one per config, model and validity period — a price applies only to calls the config served with that model, so a changed model (or a ${VAR} that now resolves to another one) never inherits the old model's rates — maintained in the admin UI's Pricing section and stored beside the configs (system/llm-prices/, or mc_llm_price on Postgres).

Setting API keys​

Export the relevant variable before starting the Admin UI or CLI. For example:

export ANTHROPIC_API_KEY=sk-ant-...
# or
export OPENAI_API_KEY=sk-...

Local providers (lm-studio-default, gemma-reader, embeddings) need no key — just a running LM Studio instance. agent-default needs whatever its target needs: OPENAI_API_KEY as shipped.

Providers without a bundled config​

Not every supported provider ships a seed config — there is nothing to seed but a model name and a key. Create one in the Admin UI (the base URL fills itself in, the model list loads once the key is there) or drop a JSON file next to the others:

llm-configs/grok.json
{
"id": "00000001-0000-0000-0000-000000000020",
"name": "grok",
"provider": "XAI",
"model": "${XAI_MODEL:grok-4}",
"apiKey": "${XAI_API_KEY}",
"defaultTemperature": 0.7,
"maxOutputTokens": 8192,
"contextWindowTokens": 256000
}

The same shape works for MOONSHOT (Kimi — set baseUrl to https://api.moonshot.cn for the mainland-China endpoint), DEEPSEEK, MISTRAL, GROQ and the rest: leave baseUrl out and the provider's own endpoint applies.

Adding your own​

Drop a new JSON file into initial-data/llm-configs/, give it a unique name, and reference that name from an agent's llmConfigName. In the Admin UI you can also create and edit configs from the LLM Configs screen.