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"Fast Setup
Section titled “Fast Setup”Set one key:
export ANTHROPIC_API_KEY="..."anodeOr use OpenAI login:
anode loginOpen the model picker in the TUI:
/modelAuto-Detected Providers
Section titled “Auto-Detected Providers”| Provider ID | Environment variable | Built-in model list starts with |
|---|---|---|
anthropic | ANTHROPIC_API_KEY | claude-opus-4-7, claude-sonnet-4-6, claude-haiku-4-5 |
openai | OPENAI_API_KEY | gpt-5.5, gpt-5.5-pro, gpt-5.4 |
zai | ZAI_API_KEY | glm-5.1, glm-5, glm-5-turbo |
zai-coding | ZAI_CODING_API_KEY | GLM-5.1, GLM-5, GLM-5-Turbo |
gemini | GEMINI_API_KEY | gemini-2.5-flash, gemini-2.5-pro |
groq | GROQ_API_KEY | llama-3.3-70b-versatile, llama-3.1-8b-instant |
deepseek | DEEPSEEK_API_KEY | deepseek-v4-pro, deepseek-v4-flash |
mistral | MISTRAL_API_KEY | mistral-large-latest, codestral-latest |
fireworks | FIREWORKS_API_KEY | Fireworks model paths |
xai | XAI_API_KEY | grok-4.3, grok-4.20-0309-reasoning |
openrouter | OPENROUTER_API_KEY | pass-through OpenRouter model names |
together | TOGETHER_API_KEY | Together model names |
cerebras | CEREBRAS_API_KEY | llama-4-scout-17b-16e-instruct, qwen3-32b |
deepinfra | DEEPINFRA_API_KEY | DeepInfra model names |
huggingface | HUGGINGFACE_API_KEY | Hugging Face Inference model names |
ollama | OLLAMA_HOST | llama3.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.
Configured Providers
Section titled “Configured Providers”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:
| Field | Use |
|---|---|
type | Provider type. If omitted, many built-in provider IDs work as their own type. |
apiFormat | Custom endpoint wire format: openai, anthropic, gemini, or generic. Used with type: "custom". |
apiKey | Literal key, {env:VAR}, bare env var name, or !shell command. |
baseURL | Endpoint override. Required for most custom providers. |
models | Model names Anode should offer for this provider. |
modelDefaults | Per-model BYOK defaults (display name, reasoning capability, thinking budgets, token limits, vision support). See Configuration → Per-Model Defaults. The legacy modelCapabilities name still works. |
timeoutSec | Request timeout. Default 120. |
maxRetries | Retry 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.
OpenAI-Compatible Endpoints
Section titled “OpenAI-Compatible Endpoints”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.
Ollama
Section titled “Ollama”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.
Azure OpenAI And Bedrock
Section titled “Azure OpenAI And Bedrock”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"] } }}Reasoning Effort
Section titled “Reasoning Effort”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:
/effortProfiles 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.
Troubleshooting
Section titled “Troubleshooting”provider not foundmeans the provider did not register. Check the env var or config entry.model not foundmeans the selected model is not in that provider’s model list.- If a config provider has
apiKeyalready set, environment auto-detection does not overwrite it.
Keep going: