Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Provider Catalog

Every model-provider family ZeroClaw ships with. For each: config shape, notes on auth and endpoint behavior, and the slot key to use under [providers.models.<type>.<alias>].

See Configuration for universal fields (api_key, uri, model, …) and resolution order.

Examples below use home as the alias to underline that the alias half is operator-chosen, pick whatever name fits (work, personal, cn, prod, …). Reference it from an agent via model_provider = "<type>.<alias>".


Native

Anthropic / Claude: slot anthropic

Supports Console API keys and tokens generated by claude setup-token for Claude Max. Both credential forms live on the canonical anthropic slot’s api_key field; Quickstart exposes them as api_key and setup_token choices. Streaming, tool calls, vision, and reasoning all supported. Custom endpoints (Anthropic-compatible proxies, e.g. Z.AI’s Anthropic API) go on this slot too: set uri to override.

OpenAI: slot openai

GPT-4o, GPT-5, o-series reasoning models. When reasoning is streamed, it is carried in the optional reasoning field of a StreamChunk wrapped by TextDelta; see Streaming.

OpenAI Codex: openai slot with requires_openai_auth = true

OpenAI Codex subscription auth lives on the openai slot. Set wire_api = "responses" to route through POST /v1/responses and requires_openai_auth = true to use the Codex subscription login (from the Codex CLI’s own ~/.codex/auth.json) instead of an api_key field on the entry. The subscription path does not read OPENAI_API_KEY; that variable applies only to the metered openai API-key mode. See Provider Configuration → OAuth and subscription auth for the credential model.

Ollama: slot ollama

Local inference via Ollama’s native /api/chat. Schema-based structured output via format. No API key.

Bedrock: slot bedrock

Gemini: slot gemini

Google’s Gemini API. Supports vision and pre-executed grounded search (see Streaming for PreExecutedToolCall events).

Gemini CLI: slot gemini_cli

Shells out to the gemini CLI; uses the CLI’s existing auth.

Grok Build CLI: slot grok_cli

Shells out to the Grok Build CLI through the documented grok agent stdio ACP surface and uses the CLI’s login cache by default. Run grok login, or use the explicit API-key bridge shown below. The typed alias api_key is not used, and ambient XAI_API_KEY is not inherited unless the alias opts in, so the Grok CLI remains the authentication owner. This is the only transport: initialize → authenticate → session/new → session/prompt over newline-delimited JSON-RPC. Small and large prompts both travel on stdin and never appear in argv or a prompt file.

The documented ACP integration and default argument profile are validated against Grok Build CLI 0.2.118 (ACP advertise/live probes) with earlier baseline 0.2.111. Treat upgrades of the external CLI as a compatibility change and revalidate grok agent stdio before deploying them.

ACP vision / image input (current Grok Build behavior)

Grok Build CLI (checked through 0.2.118) still advertises promptCapabilities.image = false on ACP initialize. That is not an env-var override on either side: ZeroClaw never rewrites Grok’s advertisement. The only ZeroClaw control is the shared per-alias config field vision.

LayerBehavior on 0.2.118
ACP advertisepromptCapabilities.image = false
Default grok_clivision unset → ZeroClaw treats the alias as non-vision; image markers stay text
vision = trueZeroClaw reports vision on the alias and sends ACP {type: image, data, mimeType} blocks (does not change Grok’s advertise)
Model recognitionLive probe: image blocks are accepted by session/prompt (no protocol error) but the agent answered as if no image was received
[providers.models.grok_cli.default]
model = "grok-4.5"
working_directory = "/srv/zeroclaw/grok-workspace"
# Optional experiment only: send ACP image blocks despite image=false advertise.
# Does not make Grok Build 0.2.118 reliably see or describe the image.
# vision = true

Leave vision unset for production grok_cli aliases. Do not route channel attachments that require real image understanding to grok_cli until a deployed CLI both advertises image = true and a live smoke shows the model using the image content. When that holds, drop any temporary vision = true opt-in and revisit whether ZeroClaw should follow the advertise bit instead of a local override (GrokCliModelProvider::acp_prompt_content).

Ubuntu 24.04: keep the Grok sandbox when bwrap needs user namespaces

When deploying Grok Build 0.2.112 or later, verify ACP initialization on the target host. On Ubuntu 24.04 hosts with kernel.apparmor_restrict_unprivileged_userns=1, Grok can exit before ACP initialization with bwrap: setting up uid map: Permission denied. This is a host sandbox setup failure, not an ACP, stdout, or authentication failure.

Keep the ZeroClaw default --sandbox strict (or an explicit workspace profile) and grant only the actual Grok executable permission to create a user namespace. This is a host-administrator change; it preserves the global user namespace restriction and does not turn off Grok’s sandbox.

readlink -f "$(command -v grok)"

Create /etc/apparmor.d/grok-build-userns, replacing the placeholder with that absolute path:

abi <abi/4.0>,

include <tunables/global>

profile grok-build-userns /absolute/path/to/grok flags=(unconfined) {
  userns,
}

Then load it and verify the profile is active:

sudo apparmor_parser -r /etc/apparmor.d/grok-build-userns
sudo aa-status | grep grok-build-userns

flags=(unconfined) is Ubuntu’s per-executable AppArmor exception mechanism: it grants userns to the named Grok binary but does not add AppArmor file rules to it. Grok’s own requested sandbox remains enabled, and the host-wide user-namespace restriction remains enabled. Use a fully confined organization-specific profile if Grok also needs AppArmor file restrictions. Because self-updates can change the downloaded executable path, resolve the path and reload this profile after each Grok update.

Do not use --sandbox off merely to avoid this error: it disables Grok’s sandbox. Do not disable kernel.apparmor_restrict_unprivileged_userns system-wide. xAI documents Landlock for normal Linux sandboxing and documents bubblewrap only for custom read-deny profiles; if this occurs without a custom non-empty deny list, report the version, exact error, sandbox profile, and non-secret host/AppArmor diagnostics to xAI.

max_acp_stdout_bytes bounds all stdout read from the Grok ACP child during one request, including protocol frames and native-tool updates. It defaults to 4 MiB; set it per alias when a reviewed tool-enabled workload needs a larger bounded budget.

[providers.models.grok_cli.default]
model = "grok-4.5"
working_directory = "/srv/zeroclaw/grok-workspace"
env_passthrough = ["XAI_API_KEY"]
# Optional: 4 MiB by default; accepted range is 1-64 MiB.
max_acp_stdout_bytes = 8388608

Export XAI_API_KEY into the daemon environment before starting ZeroClaw. The ACP client selects xai.api_key only when that name is listed in env_passthrough and a non-empty value is present in the process environment at child spawn (not snapshotted into the long-lived provider handle). Otherwise it falls back to the CLI login cache. Typed alias api_key remains rejected: this is an intentional process-env bridge rather than a second Config secret field. Values are not written to provider TOML; a future typed Config bridge may load the same name at config time without changing the operator surface.

An existing absolute working_directory is required. It is canonicalized and used for both the child cwd and ACP session boundary, so the provider never falls back to the daemon cwd. Optional binary_path selects a non-PATH binary. Alias timeout_secs bounds protocol reads and writes (default 600s).

The child environment is cleared before spawn. Process-runtime, locale, proxy, and CA variables on the built-in allowlist remain available; all other names are blocked unless that provider alias lists them in env_passthrough. This field is for the explicit XAI_API_KEY authentication bridge and environment variables required by explicitly enabled Grok tools, such as cloud CLI credentials. Values are read from the ZeroClaw process environment at spawn time and are not stored in provider config. The default list is empty. Keep it narrow because every listed secret is exposed to Grok and any tools enabled for that alias. Other provider-owned XAI_* names and all GROK_* names are rejected. Grok’s discovered user and project configuration, together with alias extra_args, owns Grok tool policy.

The default argv adds --no-auto-update, --no-plan, --sandbox strict, --permission-mode dontAsk, and --tools "". By default, the ACP client fails permission requests closed. When the request supplies a reject_once option, the client selects it instead of cancelling the complete agent turn; otherwise it cancels the request. The requested tool still fails closed, while Grok can consume the rejection and produce a final answer or retry with an operation its policy allows.

An alias explicitly configured with --always-approve, --dangerously-skip-permissions, --yolo, or --permission-mode=bypassPermissions changes the headless ACP response policy: the client selects the request’s allow_once option. It never substitutes allow_always, and cancels when the requested allow_once option is absent. This approval applies only to the current permission request; Grok’s permission rules and active OS sandbox can still reject or confine the operation.

[providers.models.grok_cli.ops]
working_directory = "/path/to/agents/ops/workspace"
extra_args = [
  "--tools=run_terminal_cmd",
  "--permission-mode=bypassPermissions",
]

Treat these bypass flags as authorization for Grok to execute every request-supported tool on that alias without a human approval round trip. Other permission modes, including acceptEdits, do not enable ACP auto-approval. Grok evaluates CLI --allow / --deny rules and discovered user/project permission configuration before asking the ACP client. Those surfaces are trusted operator policy: a matching allow rule may pre-authorize a tool so the ACP client never sees a permission request, and project MCP servers, plugins, or hooks may add capabilities. Use a dedicated, reviewed working_directory for channel agents.

When an allow rule does not pre-authorize the tool, Grok still sends session/request_permission and ZeroClaw’s default reject-once policy fails the tool closed. In practice this matters for shell/execute tools under the default --sandbox strict: a CLI --allow=Bash(...) rule can still escalate to the ACP host on current Grok Build, so a tool-enabled shell alias should either set an explicit bypass flag (--always-approve / --permission-mode=bypassPermissions) or pair allow rules with a sandbox profile that Grok will pre-authorize without host approval (for example --sandbox=workspace). Read-only tool grants such as --tools=Read,Grep with matching --allow remain the narrower opt-in.

Operators can also grant tools or relax sandbox/permission policy with alias extra_args; both surfaces are explicit opt-ins to a wider subprocess boundary. Transport, prompt, model, session, cwd, and update flags remain provider-owned and are rejected in extra_args. Positional and short arguments are also rejected. Known value-taking options accept either ["--flag", "value"] or --flag=value; unknown option shapes require the inline form so they cannot consume the trailing ACP command.

Grok may emit progress as an agent_message_chunk before a plan, tool call, or permission request. The provider discards the preceding message segment at those ACP boundaries and returns only the latest answer segment, so planning or tool-gathering narration is not delivered as the channel reply. Explicit --no-plan also keeps the default one-shot channel alias out of Grok’s plan mode; tool/MCP configuration remains an operator-controlled capability.

ACP stdout frames, aggregate stdout, assistant text, and stderr processing are bounded while the child is running. Stderr is drained but its content is never stored, logged, or returned. Public provider errors stay stable and do not echo child-controlled protocol free-text. After every one-shot request (success, timeout, cancellation, or protocol error), ZeroClaw terminates the child process group on Unix or the Job Object on Windows and reaps the direct child. That covers ordinary descendants; a process that creates a new session or process group can escape group kill on Unix. Windows Job Object coverage is compile-covered in CI and not fully executed on every Linux developer host.

Use a dedicated provider alias for the messaging agent (for example agents.default). The default alias grants no Grok built-in tools. Grok still loads its normal user and project configuration, so use a dedicated workspace whose permission rules, MCP servers, plugins, and hooks have been reviewed for the channel trust boundary. Use a separate alias and workspace for an operator-approved coding/ops agent.

Reply-intent precheck (classifier): ZeroClaw runs a short REPLY / NO_REPLY[*] classification before the full agent loop. Prefer a stable chat-completions API for that precheck (for example the HTTP/OAuth xai slot, or any other non-CLI model alias), and keep grok_cli only for model_provider (the full answer). CLI agent backends often emit planning prose instead of a single sentinel token; that prose can be delivered as the channel message (“staying silent” / “no Slack reply”). Empty classifier_provider reuses model_provider: fine for API models, not for CLI channel bots. ACP channels skip the classifier entirely.

# Full answers: ACP, strict sandbox, no built-in tools, reviewed Grok config
[providers.models.grok_cli.default]
model = "grok-4.5"
binary_path = "/home/you/.grok/bin/grok"
working_directory = "/path/to/agents/default/workspace"

# REPLY / NO_REPLY precheck - API (format-stable). Reuse an existing xAI
# HTTP alias if you already have one; do not point this at grok_cli.
[providers.models.xai.default]
model = "grok-4.5"
# uri / auth as for the normal xAI provider (OAuth session or api_key)

# Ops / coding agents: explicit policy and tool opt-in
[providers.models.grok_cli.ops]
model = "grok-4.5"
binary_path = "/home/you/.grok/bin/grok"
working_directory = "/path/to/agents/ops/workspace"
env_passthrough = ["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY"]
# Read-only tools: matching --allow can pre-authorize without ACP approval.
extra_args = ["--tools=Read,Grep", "--allow=Read", "--allow=Grep"]

# Shell-capable ops alias: either bypass ACP approval, or pair allow with a
# sandbox profile that Grok pre-authorizes (workspace is the common choice).
[providers.models.grok_cli.ops_shell]
model = "grok-4.5"
binary_path = "/home/you/.grok/bin/grok"
working_directory = "/path/to/agents/ops/workspace"
extra_args = [
  "--tools=run_terminal_cmd",
  "--allow=Bash(printf *)",
  "--sandbox=workspace",
]

[agents.default]
model_provider = "grok_cli.default"
classifier_provider = "xai.default"
channels = ["slack.default"]   # example

[agents.dependabot]
model_provider = "grok_cli.ops"
LayerWherePurpose
Reply precheckclassifier_provider → API alias (e.g. xai.default)REPLY / NO_REPLY[*] only; avoids CLI thinking text as the message body
Full answermodel_providergrok_cli.defaultGrok Build ACP; prompt only on stdin
OS sandboxDefault --sandbox strict (or extra_args override)Read CWD + system paths; write CWD + ~/.grok + tmp; child network blocked on Linux. Built-ins are not a permanent credential boundary - use custom deny for secrets
App permissionsEmpty built-in tool set + fail-closed ACP defaultExplicit bypass flags select allow_once; discovered Grok rules may also pre-authorize configured tools
Channel deliveryZeroClaw thread_replies / channel configSingle in-thread reply path
Optional gateSlack mention_only + strict_mention_in_threadDrop unmentioned group/thread traffic before the agent (see Slack); independent of the classifier

Keep channel-facing aliases at the defaults and give them dedicated, reviewed workspaces. Permission rules, MCP servers, plugins, and hooks discovered by Grok, along with permission/sandbox/tool flags in extra_args, are trusted operator policy and can widen the subprocess boundary.

Grok CLI OS sandbox (how to use it from ZeroClaw)

This is Grok Build’s process sandbox (Landlock / Seatbelt / seccomp on the grok subprocess). It is not ZeroClaw’s tool sandbox on [risk_profiles.*.sandbox_*]: that wraps ZeroClaw tools after native tool calls. If an operator opts a provider alias into Grok tools, Grok’s --sandbox is the effective confinement for that work. See also Sandboxing for ZeroClaw’s risk-profile sandbox.

ZeroClaw always supplies an explicit sandbox flag. The default is strict. Set --sandbox=<profile> in that provider alias’s extra_args to choose a different profile; ambient Grok config or GROK_SANDBOX cannot silently relax the provider-owned default.

Project .grok/config.toml can hold MCP / plugins / [permission]. Grok loads that file as trusted operator policy; matching allow rules may authorize tools without an ACP permission request. It does not select the active sandbox profile by itself. Profile names and custom profile bodies can live in project <workspace>/.grok/sandbox.toml; pass --sandbox=<name> through extra_args to turn that profile on.

Built-in profiles (from Grok’s sandbox docs):

ProfileFS readFS writeChild process network (Linux)Typical use
off (default)unrestrictedunrestrictedunrestrictedFull access
workspaceeverywhereCWD + ~/.grok + tmpallowedEveryday coding
read-onlyeverywhere~/.grok + tmp onlyblockedReview when broad reads are OK
strictCWD + system pathsCWD + ~/.grok + tmpblockedDefault channel chatbot (recommended)
devboxeverywheremost of the treeallowedDisposable VMs

Child-network blocking applies to shell children on Linux only; in-process Grok tools (LLM, built-in web search) still need network. Prefer strict for messaging bots to narrow the default filesystem write surface to the agent workspace plus Grok runtime paths. Built-in profiles are not a permanent credential boundary: xAI’s sandbox docs warn that paths such as ~/.ssh are not guaranteed protected by built-ins, and recommend a custom profile with a kernel-enforced deny list for secrets. Use read-only only when the agent must read outside the workspace without writing project files.

Custom profile example (define in workspace, select from ZeroClaw):

# <agent-workspace>/.grok/sandbox.toml
[profiles.channel-bot]
extends = "strict"
# Optional kernel deny paths (needs bubblewrap on Linux when non-empty):
# deny = ["**/.env", "**/*.pem"]
# ZeroClaw config.toml
[providers.models.grok_cli.default]
working_directory = "/path/to/agents/default/workspace"
extra_args = ["--sandbox=channel-bot"]

Per-agent sandbox: use separate provider aliases with different, explicit extra_args and dedicated working directories. Keep channel aliases on the strict/no-built-in-tools default, review the Grok configuration discovered for each workspace, and point each agent at the matching model_provider alias.

Azure OpenAI: slot azure

resource, deployment, and api_version live in this typed config, they are not read from environment variables.

Copilot: slot copilot

Uses a GitHub Copilot subscription for agent inference. Authentication uses a Copilot OAuth token obtained from GitHub.

Telnyx: slot telnyx

Voice-oriented AI endpoint. Pair with the clawdtalk channel for real-time SIP calls.

KiloCLI: slot kilocli

Local inference via KiloCLI.

Kilo AI Gateway: slot kilo

[providers.models.kilo.home]
model   = "anthropic/claude-sonnet-4-6"
api_key = "..."
# endpoint = "gateway"  # default → https://api.kilo.ai/api/gateway

Cloud API via Kilo AI Gateway. Bearer-token auth with multiple model tiers (free, balanced, pro). The /models endpoint is public (PUBLIC_MODEL_LISTING), so model listing works without a credential. Because it is queried live, it is the source that carries pricing into the cost-rates editor. The shared models.dev catalog (kilo key) is only a fallback for when the live endpoint is unreachable, and it does not include pricing.

Naming migration: kilo now refers to this gateway provider. The KiloCLI subprocess provider keeps its kilocli slot (synonym kilo-cli). If you previously configured the CLI provider under the kilo shorthand, switch to kilocli.

ZeroRouter: slot zerorouter

[providers.models.zerorouter.gateway]
model   = "anthropic/claude-sonnet-5"
api_key = "..."   # a ZeroRouter key (prefix `zcr_`); or inject from the env
# uri = "http://localhost:8080/v1"  # a self-hosted or local router; omit for the hosted default

OpenAI-compatible LLM gateway; Bearer-token auth. ZeroRouter is currently in beta. The slot defaults to the public hosted deployment at https://zerorouter.ai/v1, so model discovery works with no configuration at all. ZeroRouter is also self-hostable (AGPL); to reach your own router, locally at http://localhost:8080/v1 or anywhere else, set uri explicitly. A key minted on one router does not authenticate on another, so api_key must come from the deployment uri points at.

Beyond the chat-completions wire this slot speaks, ZeroRouter also serves the OpenAI Responses API inbound (POST /v1/responses), so Responses-wire clients, such as a Codex CLI model_provider with wire_api = "responses", can point at the same deployment and key directly.

The /v1/models endpoint is public (PUBLIC_MODEL_LISTING), so model listing and its prompt/completion pricing come live from the router itself without a credential; because it is queried live, it is the source that carries pricing into the cost-rates editor (this family has no models.dev or OpenRouter fallback). Inference does require a key: set api_key directly, or inject it from the environment the same way as any other provider key (see Configuration for api_key resolution order).

No built-in login. This preset configures the provider through the standard typed api_key path only; it does not add a device-flow login, OAuth, or provider-specific credential storage. Set api_key (or its env injection) to run inference.


All slots

Every canonical slot, its default endpoint, whether it runs locally, and its full config field set, generated from the provider registry and the config schema. Click a slot to expand its fields; click a field to see how to set it. Fixed entries show canonical defaults. operator required means the alias needs endpoint input, such as an Azure resource and deployment or a custom uri. dynamic / resolved at runtime endpoints may depend on credentials, region, discovery, or runtime state and do not necessarily require uri. CLI-backed providers use their local command.

Shared fields

Every provider slot accepts these fields. Slot-specific extras are listed per provider below.

api_key 🔑 secret · default

Secret API token for this model_provider. Grab it from the model_provider’s dashboard (OpenAI platform, Anthropic console, OpenRouter keys page, etc.). Stored via the OS keyring when possible; never commit it to config.toml directly.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/openrouter and set the providers.models.openrouter.<alias>.api_key field.

zerocode

In the Config pane, set the providers.models.openrouter.<alias>.api_key field.

zeroclaw config

zeroclaw config set providers.models.openrouter.<alias>.api_key    # masked input, stored encrypted

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__openrouter__<alias>__api_key=
chat_template_kwargs table · default

Arbitrary key/value pairs forwarded verbatim as a top-level chat_template_kwargs object in the request body of OpenAI-compatible providers. Consumed by chat-template-aware backends such as vLLM, SGLang, and llama.cpp to pass model-family template variables that control behaviour not exposed by other fields. Must be a JSON object (TOML inline table); non-object values are ignored with a warning. Example (Qwen3 thinking suppression): chat_template_kwargs = { enable_thinking = false }

Set it on any surface:

Gateway dashboard

Open /config/providers.models/openrouter and set the providers.models.openrouter.<alias>.chat_template_kwargs field.

zerocode

In the Config pane, set the providers.models.openrouter.<alias>.chat_template_kwargs field.

zeroclaw config

zeroclaw config set providers.models.openrouter.<alias>.chat_template_kwargs <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__openrouter__<alias>__chat_template_kwargs=
context_window integer? · default

Context window size (max input tokens) for this model. Auto-populated on setup from provider’s /models endpoint if available. Override manually for custom endpoints or when auto-detection fails.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/openrouter and set the providers.models.openrouter.<alias>.context_window field.

zerocode

In the Config pane, set the providers.models.openrouter.<alias>.context_window field.

zeroclaw config

zeroclaw config set providers.models.openrouter.<alias>.context_window <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__openrouter__<alias>__context_window=
extra_headers 🔑 secret · default

Extra HTTP headers sent with every request. Niche: used for auth bridges, corporate proxies, or custom gateways that demand a tracing header. Most users never touch this; edit config.toml directly if you need it.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/openrouter and set the providers.models.openrouter.<alias>.extra_headers field.

zerocode

In the Config pane, set the providers.models.openrouter.<alias>.extra_headers field.

zeroclaw config

zeroclaw config set providers.models.openrouter.<alias>.extra_headers    # masked input, stored encrypted

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__openrouter__<alias>__extra_headers=
fallback string[] · default

Ordered list of other provider aliases to try when every model on this alias has failed. Each entry is a dotted <type>.<alias> reference into providers.models and resolves with its own credentials, endpoint, and model. A fallback never inherits this alias’s key. The walk is depth-first: this alias’s models are exhausted first, then each fallback alias is descended in turn (applying its own fallback_models and fallback). Empty means no provider-level fallback.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/openrouter and set the providers.models.openrouter.<alias>.fallback field.

zerocode

In the Config pane, set the providers.models.openrouter.<alias>.fallback field.

zeroclaw config

zeroclaw config set providers.models.openrouter.<alias>.fallback <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__openrouter__<alias>__fallback=
fallback_models string[] · default

Ordered alternate models to try on THIS provider before falling over to the fallback aliases. Same endpoint, key, and headers as the primary model. Only the model identifier changes. Use this when a provider serves a backup model (e.g. a smaller or older variant) that should be tried before leaving the provider entirely. Empty means only model is tried.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/openrouter and set the providers.models.openrouter.<alias>.fallback_models field.

zerocode

In the Config pane, set the providers.models.openrouter.<alias>.fallback_models field.

zeroclaw config

zeroclaw config set providers.models.openrouter.<alias>.fallback_models <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__openrouter__<alias>__fallback_models=
kind string? · default

Provider implementation to instantiate for this profile. Use this when a canonical typed slot should run through a compatible implementation, e.g. [providers.models.openai.proxy] kind = "openai-compatible".

Set it on any surface:

Gateway dashboard

Open /config/providers.models/openrouter and set the providers.models.openrouter.<alias>.kind field.

zerocode

In the Config pane, set the providers.models.openrouter.<alias>.kind field.

zeroclaw config

zeroclaw config set providers.models.openrouter.<alias>.kind <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__openrouter__<alias>__kind=
live_pricing bool · default

Pull live token prices for this provider’s models from its own OpenAI-compatible /models listing (the gateway is the source of truth for its prices), filling cost-tracking rates for models the operator has NOT priced under [cost.rates] / pricing. Models the gateway does not price (or providers with no HTTP /models listing at all, such as a subprocess gateway like kilocli) fall back to the public models.dev catalog. Configured rates always win; live prices only fill gaps. A background task refreshes the price snapshot hourly; the cost-recording path reads the cached snapshot and never blocks on the network. Default false: off means no fetching and behavior identical to a build without the feature.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/openrouter and set the providers.models.openrouter.<alias>.live_pricing field.

zerocode

In the Config pane, set the providers.models.openrouter.<alias>.live_pricing field.

zeroclaw config

zeroclaw config set providers.models.openrouter.<alias>.live_pricing <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__openrouter__<alias>__live_pricing=
max_tokens integer? · default

Hard cap on response length in tokens. Most models enforce sensible built-in limits already; leave unset unless you specifically need to clip long outputs for cost or latency reasons.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/openrouter and set the providers.models.openrouter.<alias>.max_tokens field.

zerocode

In the Config pane, set the providers.models.openrouter.<alias>.max_tokens field.

zeroclaw config

zeroclaw config set providers.models.openrouter.<alias>.max_tokens <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__openrouter__<alias>__max_tokens=
merge_system_into_user bool · default

ModelProvider-specific quirk: fold the system prompt into the first user message instead of sending a separate system role. Only needed for models that reject (or mishandle) a standalone system role, e.g. certain older Mistral variants.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/openrouter and set the providers.models.openrouter.<alias>.merge_system_into_user field.

zerocode

In the Config pane, set the providers.models.openrouter.<alias>.merge_system_into_user field.

zeroclaw config

zeroclaw config set providers.models.openrouter.<alias>.merge_system_into_user <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__openrouter__<alias>__merge_system_into_user=
model string? · default

Model identifier to send with each request: the ID string from the model_provider’s catalog (e.g. gpt-4o, claude-sonnet-4-5, llama-3.3-70b). Must match a model the model_provider actually serves on this account.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/openrouter and set the providers.models.openrouter.<alias>.model field.

zerocode

In the Config pane, set the providers.models.openrouter.<alias>.model field.

zeroclaw config

zeroclaw config set providers.models.openrouter.<alias>.model <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__openrouter__<alias>__model=
native_tools bool? · default

Override the provider’s default for native tool calling. None (default) honors the provider’s built-in choice. Some(true) forces native tool calls on, Some(false) forces text-fallback. Currently consulted only by the Groq factory, which defaults to text-fallback because llama-family Groq models reject native tool calls with HTTP 400. Setting native_tools = true re-enables native tool calling for Groq models that support it.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/openrouter and set the providers.models.openrouter.<alias>.native_tools field.

zerocode

In the Config pane, set the providers.models.openrouter.<alias>.native_tools field.

zeroclaw config

zeroclaw config set providers.models.openrouter.<alias>.native_tools <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__openrouter__<alias>__native_tools=
pricing map · default

Per-model pricing for cost tracking, USD per 1M tokens. Free-form key/value map. Keys are user-defined model identifiers; an optional .input / .output suffix encodes pricing dimension when the operator wants to split rates. A bare key without a suffix is used as a flat per-token rate when neither dimension is specified. Default is empty: cost tracking falls back to “unknown” rates and only token usage is recorded. Example: pricing = { opus = 15.0, sonnet = 3.0 } Or split: pricing = { "opus.input" = 15.0, "opus.output" = 75.0 }

Set it on any surface:

Gateway dashboard

Open /config/providers.models/openrouter and set the providers.models.openrouter.<alias>.pricing field.

zerocode

In the Config pane, set the providers.models.openrouter.<alias>.pricing field.

zeroclaw config

zeroclaw config set providers.models.openrouter.<alias>.pricing <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__openrouter__<alias>__pricing=
provider_extra table · default

Extra JSON parameters to include in API requests. Merged at the top level of the request body, allowing provider-specific features (routing, transforms, etc.) without code changes. Example: provider_extra = { model_provider = { only = ["Anthropic"] } }

Set it on any surface:

Gateway dashboard

Open /config/providers.models/openrouter and set the providers.models.openrouter.<alias>.provider_extra field.

zerocode

In the Config pane, set the providers.models.openrouter.<alias>.provider_extra field.

zeroclaw config

zeroclaw config set providers.models.openrouter.<alias>.provider_extra <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__openrouter__<alias>__provider_extra=
replay_assistant_reasoning bool? · default

Whether stored assistant reasoning should be replayed on outbound assistant history messages. Some(false) strips reasoning_content and reasoning before sending. None (default) honours the provider’s built-in default (true for most compat providers, false for Groq).

Set it on any surface:

Gateway dashboard

Open /config/providers.models/openrouter and set the providers.models.openrouter.<alias>.replay_assistant_reasoning field.

zerocode

In the Config pane, set the providers.models.openrouter.<alias>.replay_assistant_reasoning field.

zeroclaw config

zeroclaw config set providers.models.openrouter.<alias>.replay_assistant_reasoning <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__openrouter__<alias>__replay_assistant_reasoning=
requires_openai_auth bool · default

When true, the client pulls credentials from ZeroClaw’s stored openai-codex auth profile instead of the api_key field above. Import an existing Codex CLI login with zeroclaw auth login --model-provider openai-codex --import ~/.codex/auth.json, or run zeroclaw auth login --model-provider openai-codex. Turn on only for the OpenAI Codex model_provider; leave off for standard API-key model_providers.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/openrouter and set the providers.models.openrouter.<alias>.requires_openai_auth field.

zerocode

In the Config pane, set the providers.models.openrouter.<alias>.requires_openai_auth field.

zeroclaw config

zeroclaw config set providers.models.openrouter.<alias>.requires_openai_auth <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__openrouter__<alias>__requires_openai_auth=
temperature number? · default

Sampling temperature passed to the model. Lower values (0.0–0.3) give deterministic, near-verbatim output, which fits code, routing, summarization. Higher values (0.7–1.2) give more varied output, which fits open-ended chat.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/openrouter and set the providers.models.openrouter.<alias>.temperature field.

zerocode

In the Config pane, set the providers.models.openrouter.<alias>.temperature field.

zeroclaw config

zeroclaw config set providers.models.openrouter.<alias>.temperature <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__openrouter__<alias>__temperature=
think bool? · default

Enable or disable chain-of-thought thinking for models that support it (e.g. Qwen3, GLM-4). true turns thinking on, false turns it off. None (default) lets the model decide. Forwarded as enable_thinking in the request body; mirrors the Ollama provider’s think field.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/openrouter and set the providers.models.openrouter.<alias>.think field.

zerocode

In the Config pane, set the providers.models.openrouter.<alias>.think field.

zeroclaw config

zeroclaw config set providers.models.openrouter.<alias>.think <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__openrouter__<alias>__think=
timeout_secs integer? · default

HTTP request timeout in seconds. Bump this for slow local model_providers (Ollama on CPU, big local models) or high-latency networks; leave unset otherwise.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/openrouter and set the providers.models.openrouter.<alias>.timeout_secs field.

zerocode

In the Config pane, set the providers.models.openrouter.<alias>.timeout_secs field.

zeroclaw config

zeroclaw config set providers.models.openrouter.<alias>.timeout_secs <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__openrouter__<alias>__timeout_secs=
tls_ca_cert_path string? · default

Path to a PEM-encoded CA certificate for TLS connections to this provider. Must be an absolute path; shell expansion (e.g. ~) is not performed. Leave unset to use the system’s default trust store.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/openrouter and set the providers.models.openrouter.<alias>.tls_ca_cert_path field.

zerocode

In the Config pane, set the providers.models.openrouter.<alias>.tls_ca_cert_path field.

zeroclaw config

zeroclaw config set providers.models.openrouter.<alias>.tls_ca_cert_path <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__openrouter__<alias>__tls_ca_cert_path=
tool_result_image_policy table · default

Policy for image markers embedded in native tool-result content.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/openrouter and set the providers.models.openrouter.<alias>.tool_result_image_policy field.

zerocode

In the Config pane, set the providers.models.openrouter.<alias>.tool_result_image_policy field.

zeroclaw config

zeroclaw config set providers.models.openrouter.<alias>.tool_result_image_policy <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__openrouter__<alias>__tool_result_image_policy=
uri string? · default

Endpoint URI the client hits. Override the family’s default endpoint when pointing at a self-hosted gateway (LiteLLM, vLLM, Ollama), a custom proxy, or any non-standard URL. Leave unset to use the family’s default URI from its ModelEndpoint impl. Set this to the FULL endpoint URL; there is no separate path-suffix field.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/openrouter and set the providers.models.openrouter.<alias>.uri field.

zerocode

In the Config pane, set the providers.models.openrouter.<alias>.uri field.

zeroclaw config

zeroclaw config set providers.models.openrouter.<alias>.uri <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__openrouter__<alias>__uri=
vision bool? · default

Override the provider’s vision (image input) capability. None (default) uses the provider family’s built-in default. Several families (llama.cpp, the generic OpenAI-compatible endpoint, etc.) assume vision-capable because they can serve multimodal models. Set vision = false for a text-only model served by such a family (e.g. a text LLM behind llama.cpp) so image messages are routed to a configured [multimodal] vision_model_provider instead of being sent to a model that rejects them. Some(true) forces vision on.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/openrouter and set the providers.models.openrouter.<alias>.vision field.

zerocode

In the Config pane, set the providers.models.openrouter.<alias>.vision field.

zeroclaw config

zeroclaw config set providers.models.openrouter.<alias>.vision <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__openrouter__<alias>__vision=
wire_api `responses` \| `chat_completions` · default

Wire protocol flavor for the model_provider client. responses routes through OpenAI’s Responses API (POST /v1/responses); chat_completions routes through the legacy /v1/chat/completions (or the family’s chat-completions-compatible endpoint). New OpenAI provider slots default to responses; other families default to chat-completions (or ignore the field) when unset.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/openrouter and set the providers.models.openrouter.<alias>.wire_api field.

zerocode

In the Config pane, set the providers.models.openrouter.<alias>.wire_api field.

zeroclaw config

zeroclaw config set providers.models.openrouter.<alias>.wire_api <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__openrouter__<alias>__wire_api=

Primary

openrouter https://openrouter.ai/api/v1
anthropic https://api.anthropic.com
openai dynamic / resolved at runtime
telnyx https://api.telnyx.com/v2/ai
azure operator required

Slot-specific fields (in addition to the shared fields above):

api_version string? · default

Azure API version string (e.g. 2024-10-21).

Set it on any surface:

Gateway dashboard

Open /config/providers.models/azure and set the providers.models.azure.<alias>.api_version field.

zerocode

In the Config pane, set the providers.models.azure.<alias>.api_version field.

zeroclaw config

zeroclaw config set providers.models.azure.<alias>.api_version <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__azure__<alias>__api_version=
deployment string? · default

Azure deployment name: the deployment created in Azure AI Studio.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/azure and set the providers.models.azure.<alias>.deployment field.

zerocode

In the Config pane, set the providers.models.azure.<alias>.deployment field.

zeroclaw config

zeroclaw config set providers.models.azure.<alias>.deployment <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__azure__<alias>__deployment=
resource string? · default

Azure resource name (the <resource> part of <resource>.openai.azure.com).

Set it on any surface:

Gateway dashboard

Open /config/providers.models/azure and set the providers.models.azure.<alias>.resource field.

zerocode

In the Config pane, set the providers.models.azure.<alias>.resource field.

zeroclaw config

zeroclaw config set providers.models.azure.<alias>.resource <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__azure__<alias>__resource=
ollama http://localhost:11434/v1 · local

Slot-specific fields (in addition to the shared fields above):

num_ctx integer? · default

Override the Ollama num_ctx (context window, in tokens) sent on every /api/chat request. Defaults to the framework constant (OLLAMA_DEFAULT_NUM_CTX) when unset.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/ollama and set the providers.models.ollama.<alias>.num_ctx field.

zerocode

In the Config pane, set the providers.models.ollama.<alias>.num_ctx field.

zeroclaw config

zeroclaw config set providers.models.ollama.<alias>.num_ctx <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__ollama__<alias>__num_ctx=
num_predict integer? · default

Override the Ollama num_predict (max output tokens) sent on every /api/chat request. Defaults to the framework constant (OLLAMA_DEFAULT_NUM_PREDICT) when unset.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/ollama and set the providers.models.ollama.<alias>.num_predict field.

zerocode

In the Config pane, set the providers.models.ollama.<alias>.num_predict field.

zeroclaw config

zeroclaw config set providers.models.ollama.<alias>.num_predict <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__ollama__<alias>__num_predict=
temperature_override number? · default

Force every Ollama /api/chat request to use this temperature, overriding the per-call value passed through ModelProvider::chat_with_system(.., temperature). When unset (None, the default), the per-call temperature wins: full backward compatibility.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/ollama and set the providers.models.ollama.<alias>.temperature_override field.

zerocode

In the Config pane, set the providers.models.ollama.<alias>.temperature_override field.

zeroclaw config

zeroclaw config set providers.models.ollama.<alias>.temperature_override <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__ollama__<alias>__temperature_override=
gemini dynamic / resolved at runtime

Slot-specific fields (in addition to the shared fields above):

auth_mode table · default

Authentication mode for model model_provider families that support more than one (e.g. Qwen, Minimax can use API key OR OAuth). Families that only support a single auth flow simply omit this field from their config struct.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/gemini and set the providers.models.gemini.<alias>.auth_mode field.

zerocode

In the Config pane, set the providers.models.gemini.<alias>.auth_mode field.

zeroclaw config

zeroclaw config set providers.models.gemini.<alias>.auth_mode <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__gemini__<alias>__auth_mode=
oauth_client_id string? · default

Google OAuth app client_id, used when this alias drives ZeroClaw’s own browser/device-code login flow (zeroclaw auth login --model-provider gemini --profile <alias>). Operators relying on the upstream gemini login tool don’t need this; that tool writes its own client_id / client_secret into ~/.gemini/oauth_creds.json.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/gemini and set the providers.models.gemini.<alias>.oauth_client_id field.

zerocode

In the Config pane, set the providers.models.gemini.<alias>.oauth_client_id field.

zeroclaw config

zeroclaw config set providers.models.gemini.<alias>.oauth_client_id <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__gemini__<alias>__oauth_client_id=
oauth_client_secret string? · default

Google OAuth app client_secret. Set alongside oauth_client_id.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/gemini and set the providers.models.gemini.<alias>.oauth_client_secret field.

zerocode

In the Config pane, set the providers.models.gemini.<alias>.oauth_client_secret field.

zeroclaw config

zeroclaw config set providers.models.gemini.<alias>.oauth_client_secret <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__gemini__<alias>__oauth_client_secret=
oauth_project string? · default

Pin a specific GCP project ID for the OAuth loadCodeAssist discovery call. When unset, the discovery probes for an already-onboarded project on the credential’s account. Replaces GOOGLE_CLOUD_PROJECT / GOOGLE_CLOUD_PROJECT_ID env vars.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/gemini and set the providers.models.gemini.<alias>.oauth_project field.

zerocode

In the Config pane, set the providers.models.gemini.<alias>.oauth_project field.

zeroclaw config

zeroclaw config set providers.models.gemini.<alias>.oauth_project <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__gemini__<alias>__oauth_project=

OpenAI-compatible

venice https://api.venice.ai
nearai https://cloud-api.near.ai/v1
vercel https://ai-gateway.vercel.sh/v1
cloudflare https://gateway.ai.cloudflare.com/v1
atlascloud https://api.atlascloud.ai/v1
moonshot dynamic / resolved at runtime

Slot-specific fields (in addition to the shared fields above):

endpoint table · default

Moonshot endpoint variants. Operators pick the region that matches their account; the runtime resolves the URI from the chosen variant unless overridden by base.uri. Code variant is intl-only.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/moonshot and set the providers.models.moonshot.<alias>.endpoint field.

zerocode

In the Config pane, set the providers.models.moonshot.<alias>.endpoint field.

zeroclaw config

zeroclaw config set providers.models.moonshot.<alias>.endpoint <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__moonshot__<alias>__endpoint=
synthetic https://api.synthetic.new/openai/v1
opencode https://opencode.ai/zen/v1
zai dynamic / resolved at runtime

Slot-specific fields (in addition to the shared fields above):

endpoint `cn` \| `global` · default

Set it on any surface:

Gateway dashboard

Open /config/providers.models/zai and set the providers.models.zai.<alias>.endpoint field.

zerocode

In the Config pane, set the providers.models.zai.<alias>.endpoint field.

zeroclaw config

zeroclaw config set providers.models.zai.<alias>.endpoint <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__zai__<alias>__endpoint=
glm dynamic / resolved at runtime

Slot-specific fields (in addition to the shared fields above):

endpoint `cn` \| `global` · default

Set it on any surface:

Gateway dashboard

Open /config/providers.models/glm and set the providers.models.glm.<alias>.endpoint field.

zerocode

In the Config pane, set the providers.models.glm.<alias>.endpoint field.

zeroclaw config

zeroclaw config set providers.models.glm.<alias>.endpoint <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__glm__<alias>__endpoint=
minimax dynamic / resolved at runtime

Slot-specific fields (in addition to the shared fields above):

auth_mode table · default

Authentication mode for model model_provider families that support more than one (e.g. Qwen, Minimax can use API key OR OAuth). Families that only support a single auth flow simply omit this field from their config struct.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/minimax and set the providers.models.minimax.<alias>.auth_mode field.

zerocode

In the Config pane, set the providers.models.minimax.<alias>.auth_mode field.

zeroclaw config

zeroclaw config set providers.models.minimax.<alias>.auth_mode <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__minimax__<alias>__auth_mode=
endpoint `cn` \| `intl` · default

Set it on any surface:

Gateway dashboard

Open /config/providers.models/minimax and set the providers.models.minimax.<alias>.endpoint field.

zerocode

In the Config pane, set the providers.models.minimax.<alias>.endpoint field.

zeroclaw config

zeroclaw config set providers.models.minimax.<alias>.endpoint <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__minimax__<alias>__endpoint=
oauth_client_id string? · default

Override of MiniMax’s published OAuth client_id. Most operators should leave this unset; the runtime defaults to the vendor-published client_id (same one MiniMax’s own portal uses).

Set it on any surface:

Gateway dashboard

Open /config/providers.models/minimax and set the providers.models.minimax.<alias>.oauth_client_id field.

zerocode

In the Config pane, set the providers.models.minimax.<alias>.oauth_client_id field.

zeroclaw config

zeroclaw config set providers.models.minimax.<alias>.oauth_client_id <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__minimax__<alias>__oauth_client_id=
oauth_refresh_token string? · default

Long-lived OAuth refresh token issued by MiniMax. When set, the runtime exchanges it for a short-lived access token at provider construction time and uses that as the API credential. Operators who prefer dashboard-generated long-lived API keys can leave this unset and populate api_key directly.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/minimax and set the providers.models.minimax.<alias>.oauth_refresh_token field.

zerocode

In the Config pane, set the providers.models.minimax.<alias>.oauth_refresh_token field.

zeroclaw config

zeroclaw config set providers.models.minimax.<alias>.oauth_refresh_token <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__minimax__<alias>__oauth_refresh_token=
bedrock dynamic / resolved at runtime

Slot-specific fields (in addition to the shared fields above):

region string? · default

AWS region for the Bedrock endpoint (e.g. us-east-1, eu-west-1).

Set it on any surface:

Gateway dashboard

Open /config/providers.models/bedrock and set the providers.models.bedrock.<alias>.region field.

zerocode

In the Config pane, set the providers.models.bedrock.<alias>.region field.

zeroclaw config

zeroclaw config set providers.models.bedrock.<alias>.region <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__bedrock__<alias>__region=
qianfan https://qianfan.baidubce.com/v2
doubao https://ark.cn-beijing.volces.com/api/v3
qwen dynamic / resolved at runtime

Slot-specific fields (in addition to the shared fields above):

auth_mode table · default

Authentication mode for model model_provider families that support more than one (e.g. Qwen, Minimax can use API key OR OAuth). Families that only support a single auth flow simply omit this field from their config struct.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/qwen and set the providers.models.qwen.<alias>.auth_mode field.

zerocode

In the Config pane, set the providers.models.qwen.<alias>.auth_mode field.

zeroclaw config

zeroclaw config set providers.models.qwen.<alias>.auth_mode <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__qwen__<alias>__auth_mode=
endpoint table · default

Qwen endpoint variants. Operators pick the region matching their account.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/qwen and set the providers.models.qwen.<alias>.endpoint field.

zerocode

In the Config pane, set the providers.models.qwen.<alias>.endpoint field.

zeroclaw config

zeroclaw config set providers.models.qwen.<alias>.endpoint <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__qwen__<alias>__endpoint=
oauth_client_id string? · default

Override of Qwen’s published OAuth client_id. Most operators should leave this unset.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/qwen and set the providers.models.qwen.<alias>.oauth_client_id field.

zerocode

In the Config pane, set the providers.models.qwen.<alias>.oauth_client_id field.

zeroclaw config

zeroclaw config set providers.models.qwen.<alias>.oauth_client_id <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__qwen__<alias>__oauth_client_id=
oauth_refresh_token string? · default

Long-lived Qwen OAuth refresh token. When set, the runtime exchanges it for a short-lived access token at provider construction time. Operators relying on the upstream qwen login tool (which writes ~/.qwen/oauth_creds.json) leave this unset; the file-cache integration takes over.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/qwen and set the providers.models.qwen.<alias>.oauth_refresh_token field.

zerocode

In the Config pane, set the providers.models.qwen.<alias>.oauth_refresh_token field.

zeroclaw config

zeroclaw config set providers.models.qwen.<alias>.oauth_refresh_token <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__qwen__<alias>__oauth_refresh_token=
oauth_resource_url string? · default

Operator override of the resource URL the refreshed access token is paired with. When unset, the runtime falls back to the endpoint-derived URL (or the cached resource_url when reading from ~/.qwen/oauth_creds.json).

Set it on any surface:

Gateway dashboard

Open /config/providers.models/qwen and set the providers.models.qwen.<alias>.oauth_resource_url field.

zerocode

In the Config pane, set the providers.models.qwen.<alias>.oauth_resource_url field.

zeroclaw config

zeroclaw config set providers.models.qwen.<alias>.oauth_resource_url <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__qwen__<alias>__oauth_resource_url=
groq https://api.groq.com/openai/v1
mistral https://api.mistral.ai/v1
xai https://api.x.ai/v1
deepseek https://api.deepseek.com
together https://api.together.xyz
fireworks https://api.fireworks.ai/inference/v1
novita https://api.novita.ai/openai
perplexity https://api.perplexity.ai
cohere https://api.cohere.com/compatibility
copilot dynamic / resolved at runtime
gemini_cli CLI-backed · local

Slot-specific fields (in addition to the shared fields above):

binary_path string? · default

Path to the gemini CLI binary. Falls back to gemini (PATH lookup).

Set it on any surface:

Gateway dashboard

Open /config/providers.models/gemini_cli and set the providers.models.gemini_cli.<alias>.binary_path field.

zerocode

In the Config pane, set the providers.models.gemini_cli.<alias>.binary_path field.

zeroclaw config

zeroclaw config set providers.models.gemini_cli.<alias>.binary_path <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__gemini_cli__<alias>__binary_path=
grok_cli CLI-backed · local

Slot-specific fields (in addition to the shared fields above):

binary_path string? · default

Path to the grok CLI binary. Falls back to grok (PATH lookup).

Set it on any surface:

Gateway dashboard

Open /config/providers.models/grok_cli and set the providers.models.grok_cli.<alias>.binary_path field.

zerocode

In the Config pane, set the providers.models.grok_cli.<alias>.binary_path field.

zeroclaw config

zeroclaw config set providers.models.grok_cli.<alias>.binary_path <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__grok_cli__<alias>__binary_path=
env_passthrough string[] · default

Extra environment variable names inherited by the grok subprocess. Values are resolved from the ZeroClaw process environment at spawn time. The default is empty so unrelated daemon secrets remain blocked. XAI_API_KEY is the sole supported provider-owned name and enables API-key authentication when explicitly listed and non-empty; other XAI_* and all GROK_* names are rejected.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/grok_cli and set the providers.models.grok_cli.<alias>.env_passthrough field.

zerocode

In the Config pane, set the providers.models.grok_cli.<alias>.env_passthrough field.

zeroclaw config

zeroclaw config set providers.models.grok_cli.<alias>.env_passthrough <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__grok_cli__<alias>__env_passthrough=
extra_args string[] · default

Extra global Grok long flags inserted before agent stdio. Known options may put their value in the next token; other value-taking options use --flag=value. Positional and short arguments are rejected. ZeroClaw defaults to --sandbox strict, --permission-mode dontAsk, and an empty built-in tool set. Providing the corresponding flags here is an explicit per-alias opt-in to relax those defaults. ACP transport, prompt/model/session, cwd, debug-file, and update-policy flags are reserved.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/grok_cli and set the providers.models.grok_cli.<alias>.extra_args field.

zerocode

In the Config pane, set the providers.models.grok_cli.<alias>.extra_args field.

zeroclaw config

zeroclaw config set providers.models.grok_cli.<alias>.extra_args <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__grok_cli__<alias>__extra_args=
max_acp_stdout_bytes integer? · default

Maximum cumulative stdout bytes accepted from grok agent stdio for one ACP request. When unset, ZeroClaw uses 4 MiB. Values must be between 1 MiB and 64 MiB; the provider rejects invalid values when it is constructed.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/grok_cli and set the providers.models.grok_cli.<alias>.max_acp_stdout_bytes field.

zerocode

In the Config pane, set the providers.models.grok_cli.<alias>.max_acp_stdout_bytes field.

zeroclaw config

zeroclaw config set providers.models.grok_cli.<alias>.max_acp_stdout_bytes <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__grok_cli__<alias>__max_acp_stdout_bytes=
working_directory* string · default

Required absolute working directory for the grok subprocess and ACP session boundary. The directory must exist when the provider is built. Project-scoped Grok config is resolved relative to this path.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/grok_cli and set the providers.models.grok_cli.<alias>.working_directory field.

zerocode

In the Config pane, set the providers.models.grok_cli.<alias>.working_directory field.

zeroclaw config

zeroclaw config set providers.models.grok_cli.<alias>.working_directory <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__grok_cli__<alias>__working_directory=
kilocli CLI-backed · local

Slot-specific fields (in addition to the shared fields above):

binary_path string? · default

Path to the kilo CLI binary. Falls back to kilo (PATH lookup).

Set it on any surface:

Gateway dashboard

Open /config/providers.models/kilocli and set the providers.models.kilocli.<alias>.binary_path field.

zerocode

In the Config pane, set the providers.models.kilocli.<alias>.binary_path field.

zeroclaw config

zeroclaw config set providers.models.kilocli.<alias>.binary_path <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__kilocli__<alias>__binary_path=
kilo https://api.kilo.ai/api/gateway

Slot-specific fields (in addition to the shared fields above):

endpoint `gateway` · default

Kilo AI Gateway endpoint. Single canonical endpoint at kilo.ai.

Set it on any surface:

Gateway dashboard

Open /config/providers.models/kilo and set the providers.models.kilo.<alias>.endpoint field.

zerocode

In the Config pane, set the providers.models.kilo.<alias>.endpoint field.

zeroclaw config

zeroclaw config set providers.models.kilo.<alias>.endpoint <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__kilo__<alias>__endpoint=
zerorouter https://zerorouter.ai/v1
lmstudio http://localhost:1234/v1 · local
llamacpp http://localhost:8080/v1 · local
sglang http://localhost:30000/v1 · local
vllm http://localhost:8000/v1 · local
osaurus http://localhost:1337/v1 · local
nvidia https://integrate.api.nvidia.com/v1
siliconflow https://api.siliconflow.com/v1
aihubmix https://aihubmix.com/v1
litellm http://localhost:4000/v1
atomic_chat http://127.0.0.1:1337/v1 · local
astrai https://as-trai.com/v1
deepmyst https://api.deepmyst.com/v1
manifest https://app.manifest.build/v1
morph https://api.morphllm.com/v1
github_models https://models.github.ai/inference
upstage https://api.upstage.ai/v1
featherless https://api.featherless.ai/v1
arcee https://api.arcee.ai/api/v1
lambda_ai https://api.lambda.ai/v1
inception https://api.inceptionlabs.ai/v1
custom operator required

Fast inference

cerebras https://api.cerebras.ai/v1
sambanova https://api.sambanova.ai/v1
hyperbolic https://api.hyperbolic.xyz/v1

Model hosting platforms

deepinfra https://api.deepinfra.com/v1/openai
huggingface https://router.huggingface.co/v1
ai21 https://api.ai21.com/studio/v1
reka https://api.reka.ai/v1
baseten https://inference.baseten.co/v1
nscale https://inference.api.nscale.com/v1
anyscale https://api.endpoints.anyscale.com/v1
nebius https://api.tokenfactory.nebius.com/v1
friendli https://api.friendli.ai/serverless/v1
lepton https://llama3-1-405b.lepton.run/api/v1

Chinese AI

stepfun dynamic / resolved at runtime

Slot-specific fields (in addition to the shared fields above):

endpoint table · default

Set it on any surface:

Gateway dashboard

Open /config/providers.models/stepfun and set the providers.models.stepfun.<alias>.endpoint field.

zerocode

In the Config pane, set the providers.models.stepfun.<alias>.endpoint field.

zeroclaw config

zeroclaw config set providers.models.stepfun.<alias>.endpoint <value>

Environment variable

Export the override (POSIX shells; drop into ~/.bashrc, ~/.zshrc, .env, or a Dockerfile). Replace <alias> with the literal alias:

export ZEROCLAW_providers__models__stepfun__<alias>__endpoint=
baichuan https://api.baichuan-ai.com/v1
yi https://api.lingyiwanwu.com/v1
hunyuan https://api.hunyuan.cloud.tencent.com/v1

Cloud AI endpoints

ovh https://oai.endpoints.kepler.ai.cloud.ovh.net/v1
avian https://api.avian.io/v1

For a worked example per family, see Configuration. If your vendor isn’t listed, use the custom slot (Custom providers).

Worked examples: Morph, GitHub Models, Upstage, Featherless, Arcee, Lambda AI, Inception

Each of these is a standard OpenAI-compatible slot: set model and api_key, leave uri off (the typed endpoint supplies it). None of them ship a public model index, so the model picker stays empty until you paste a credential. Once a key is set, ZeroClaw lists models from the provider’s live /models endpoint. The model IDs below are illustrative; confirm the current catalog in the vendor dashboard.

Morph: slot morph. Fast apply-edits models (morph-v3-large, morph-v3-fast, or auto). Key from the Morph dashboard.

GitHub Models: slot github_models (alias github-models). OpenAI / Meta / Microsoft models behind a single GitHub Personal Access Token. Create a PAT with the models permission (fine-grained); a Copilot token is not the same credential. Model IDs are publisher-prefixed (e.g. openai/gpt-4o).

Upstage: slot upstage. Solar Pro / Solar Mini (e.g. solar-pro2). Key from the Upstage console.

Featherless: slot featherless. Serverless open-weight models, addressed by their Hugging Face repo IDs (e.g. meta-llama/Meta-Llama-3.1-8B-Instruct). Key from featherless.ai.

Arcee: slot arcee. Native models include conductor, maestro, virtuoso-large, coder-large, and blitz. Key from the Arcee platform. Arcee’s Platform API uses the non-standard /api/v1 base path; the typed endpoint already accounts for this, so still leave uri off.

Lambda AI: slot lambda_ai (alias lambda-ai). Lambda’s hosted inference (e.g. hermes3-405b). Key from the Lambda Cloud API-keys page.

Inception: slot inception. The Mercury diffusion-LLM family (mercury-coder and the newer mercury-2). Key from the Inception platform.

Atlas Cloud: slot atlascloud. OpenAI-compatible endpoint https://api.atlascloud.ai/v1 with bearer-token auth. Use the canonical atlascloud slot only; atlas, atlas-cloud, and atlas_cloud are not runtime aliases.

[providers.models.atlascloud.home]
model = "..."
api_key = "..."

Credentials come only from config (api_key) or the --credential override at run time, these slots do not read a per-provider *_API_KEY environment variable.

NEAR AI Cloud example:

[providers.models.nearai.tee]
model   = "..."       # pick a modelId from https://cloud-api.near.ai/v1/model/list
api_key = "..."

The nearai slot uses https://cloud-api.near.ai/v1 by default and sends Authorization: Bearer <api_key>. To bridge an existing NEARAI_API_KEY shell variable into ZeroClaw’s schema-mirror env surface, set ZEROCLAW_providers__models__nearai__tee__api_key="$NEARAI_API_KEY".


Multi-region families

Several Chinese vendors expose distinct regional endpoints with different default models. Use one canonical slot and pick the region with the typed endpoint field on the alias entry.

Moonshot: slot moonshot

Variants: cn, intl, code.

Qwen / DashScope: slot qwen

OAuth-backed Qwen accounts use the same slot with auth_mode = "o_auth".

GLM: slot glm

MiniMax: slot minimax

[providers.models.minimax.intl]
model    = "MiniMax-M3"                       # or MiniMax-M2.7, MiniMax-M2.7-highspeed
api_key  = "..."
endpoint = "intl"                            # variants: cn, intl

For MiniMax’s Anthropic-compatible API, use [providers.models.anthropic.minimax] with uri = "https://api.minimax.io/anthropic" (Global) or uri = "https://api.minimaxi.com/anthropic" (China) instead.

Z.AI: slot zai

For Z.AI’s Anthropic-compatible API, use [providers.models.anthropic.zai] with uri = "https://api.z.ai/api/anthropic" instead.

Doubao / Volcengine: slot doubao

The remaining Chinese-region slots (yi, hunyuan, qianfan, baichuan) appear in the all-slots table above; select the region with the typed endpoint field on the alias entry.


Routing layers

OpenRouter is treated as a single first-class provider, not a meta-router. The runtime sees one endpoint; OpenRouter handles vendor fan-out behind that endpoint.

For per-task routing, run multiple agents and let channels pick which agent handles which traffic, see Routing. For a narrower in-config hint mechanism, use [[model_routes]].


Something missing?

  • If the endpoint is OpenAI-compatible, use the custom slot with uri set.
  • If it has its own canonical slot above, use that, even if you only see one of its regions, the slot’s endpoint enum covers the rest.
  • If it speaks a non-OpenAI wire format and needs its own implementation, see Custom providers.