Skip to content

Providers

Anode names models as provider/model. Set one key and Anode registers that provider. Add config when you need custom endpoints, model lists, timeouts, or provider-specific behavior.

anode -x --model anthropic/claude-sonnet-4-6 "hello"
anode -x --model openai/gpt-5.5 "hello"

Set one key:

export ANTHROPIC_API_KEY="..."
anode

Or use OpenAI login:

anode login

Open the model picker in the TUI:

/model
Provider IDEnvironment variableBuilt-in model list starts with
anthropicANTHROPIC_API_KEYclaude-opus-4-7, claude-sonnet-4-6, claude-haiku-4-5
openaiOPENAI_API_KEYgpt-5.5, gpt-5.5-pro, gpt-5.4
zaiZAI_API_KEYglm-5.1, glm-5, glm-5-turbo
zai-codingZAI_CODING_API_KEYGLM-5.1, GLM-5, GLM-5-Turbo
geminiGEMINI_API_KEYgemini-2.5-flash, gemini-2.5-pro
groqGROQ_API_KEYllama-3.3-70b-versatile, llama-3.1-8b-instant
deepseekDEEPSEEK_API_KEYdeepseek-v4-pro, deepseek-v4-flash
mistralMISTRAL_API_KEYmistral-large-latest, codestral-latest
fireworksFIREWORKS_API_KEYFireworks model paths
xaiXAI_API_KEYgrok-4.3, grok-4.20-0309-reasoning
openrouterOPENROUTER_API_KEYpass-through OpenRouter model names
togetherTOGETHER_API_KEYTogether model names
cerebrasCEREBRAS_API_KEYllama-4-scout-17b-16e-instruct, qwen3-32b
deepinfraDEEPINFRA_API_KEYDeepInfra model names
huggingfaceHUGGINGFACE_API_KEYHugging Face Inference model names
ollamaOLLAMA_HOSTllama3.3, qwen3, codestral

Default model selection prefers anthropic/claude-sonnet-4-6, then openai/gpt-5.5, then zai-coding/GLM-5.1, then zai/glm-5.1.

Add providers in ~/.config/anode/config.json or the selected $ANODE_CONFIG:

{
"providers": {
"my-llm": {
"type": "openai-compatible",
"apiKey": "{env:MY_LLM_KEY}",
"baseURL": "https://llm.example.com/v1",
"models": ["fast", "large"]
}
},
"model": "my-llm/fast"
}

Provider fields:

FieldUse
typeProvider type. If omitted, many built-in provider IDs work as their own type.
apiFormatCustom endpoint wire format: openai, anthropic, gemini, or generic. Used with type: "custom".
apiKeyLiteral key, {env:VAR}, bare env var name, or !shell command.
baseURLEndpoint override. Required for most custom providers.
modelsModel names Anode should offer for this provider.
modelDefaultsPer-model BYOK defaults (display name, reasoning capability, thinking budgets, token limits, vision support). See Configuration → Per-Model Defaults. The legacy modelCapabilities name still works.
timeoutSecRequest timeout. Default 120.
maxRetriesRetry count. Default 2; negative disables retries.

Retries apply to retryable HTTP responses, including rate limits and server errors. Anthropic, OpenAI-compatible, OpenAI Responses, and Gemini-native providers honor bounded Retry-After seconds or HTTP-date headers before falling back to exponential retry delays. When a run retries and then succeeds, the harness ledger records provider retry telemetry so anode harness inspect and anode harness ledger <run-id> can show the hidden backoff instead of making the run look clean but slow.

Use openai-compatible for vLLM, LiteLLM, LM Studio, SGLang, and similar servers:

{
"providers": {
"local": {
"type": "openai-compatible",
"baseURL": "http://localhost:8000/v1",
"models": ["default"]
}
},
"model": "local/default"
}

For local endpoints, omit apiKey if the server does not require one.

custom is similar, but keeps the configured provider ID and display name:

{
"providers": {
"lab": {
"type": "custom",
"apiKey": "{env:LAB_KEY}",
"baseURL": "https://lab.example.com/v1",
"models": ["lab-large"]
}
}
}

Custom providers can also select a non-OpenAI wire format while keeping the same endpoint picker in /connect:

{
"providers": {
"claude-proxy": {
"type": "custom",
"apiFormat": "anthropic",
"apiKey": "{env:CLAUDE_PROXY_KEY}",
"baseURL": "https://claude-proxy.example.com",
"models": ["claude-sonnet-4-6"]
},
"gemini-proxy": {
"type": "custom",
"apiFormat": "gemini",
"apiKey": "{env:GEMINI_PROXY_KEY}",
"baseURL": "https://generativelanguage.googleapis.com/v1beta",
"models": ["gemini-2.5-pro"]
}
}
}

generic is a conservative Chat Completions variant for endpoints that reject OpenAI-only extras such as developer-role messages or stream options.

export OLLAMA_HOST="http://localhost:11434"
anode -x --model ollama/llama3.3 "hello"

If OLLAMA_HOST is not set and you do not configure an Ollama provider, Anode does not register Ollama.

These are config-only providers:

{
"providers": {
"azure": {
"type": "azure-openai",
"apiKey": "{env:AZURE_OPENAI_KEY}",
"baseURL": "https://example.openai.azure.com/openai/deployments/gpt-4o",
"models": ["gpt-4o"]
},
"bedrock": {
"type": "bedrock",
"apiKey": "{env:BEDROCK_KEY}",
"baseURL": "https://bedrock-runtime.us-east-1.amazonaws.com",
"models": ["anthropic.claude-sonnet-4"]
}
}
}

Some models expose reasoning effort. Anode maps the profile effort level to the provider-specific parameter and clamps it to the model capability range.

Use the TUI command:

/effort

Profiles set their default effort with defaultEffort.

If you connect to a custom or proxy provider that exposes models the built-in registry doesn’t recognize (private aliases, preview names, in-house BYOK wrappers), declare per-model defaults under providers[*].modelDefaults so the model picker shows a friendly label, /effort and reasoning controls work, and the agent assembles prompts within the right context/output budgets. See Configuration → Per-Model Defaults.

  • provider not found means the provider did not register. Check the env var or config entry.
  • model not found means the selected model is not in that provider’s model list.
  • If a config provider has apiKey already set, environment auto-detection does not overwrite it.

Keep going: