Skip to main content
These tables are generated from crates/warpllm/src/registry/specs.yaml, the registry compiled into the shipped binary. What you see here is what warpllm will route.
The roster is closed. A name that is not below is an error, not a guess — see Model routing.
These tables are generated from main, so they can be ahead of the package you installed. A provider or model added since the last release routes only once the next release ships — until then the string resolves on a build from source and is rejected by the published packages. The changelog says what landed in which version.

Reading the columns

what you send
The full provider/model value for the request’s model field.
what the provider sees
Usually the same as the last segment. It differs when warpllm’s routing alias differs from the provider’s own name — every OpenRouter entry, for instance, where the provider’s identifier is a two-segment slug.
tokens
The provider’s published context window, recorded verbatim. Note this is the window, not the provider’s “maximum input tokens” figure, which is usually the window minus the output ceiling.
tokens
The provider’s published output ceiling.
A dash means the provider publishes no figure — never that the limit is unlimited. The registry omits a number rather than guessing one.

anthropic

Base URL https://api.anthropic.com/v1 · API key ANTHROPIC_API_KEY

deepseek

Base URL https://api.deepseek.com · API key DEEPSEEK_API_KEY

kimi

Base URL https://api.moonshot.ai/v1 · API key MOONSHOT_API_KEY

mistral

Base URL https://api.mistral.ai/v1 · API key MISTRAL_API_KEY

openai

Base URL https://api.openai.com/v1 · API key OPENAI_API_KEY

opencode

Base URL https://opencode.ai/zen/v1 · API key OPENCODE_API_KEY

openrouter

Base URL https://openrouter.ai/api/v1 · API key OPENROUTER_API_KEY

About the OpenRouter entries

OpenRouter is an aggregator, so each entry is a curated pick from its catalog rather than a catch-all. One slug is not one model on one host: it fans out across every provider serving those weights, and they disagree about limits. The registry records the narrowest figure any endpoint offers, because an unpinned request may land on any of them. Where the spread is too wide to promise anything — moonshotai/kimi-k2.6 runs across 21 endpoints whose max output spans 16,384 to 262,144 — the limit is omitted instead. openrouter/auto is OpenRouter’s alias for letting it pick the model per request, so it carries no limits at all.

About the OpenCode Zen entries

Zen re-hosts other people’s models, and it is the first provider here that does not serve its whole catalog over one protocol — it publishes an endpoint per model. Only /chat/completions is a surface warpllm implements, so that is what the opencode provider is. Its GPT, Grok, and Muse models are absent because they sit on the Responses API; its Claude and Qwen models speak Anthropic’s /messages, and its Gemini models Google’s own shape. None of those have an api: here yet, and registering them would hand back a model string that resolves and then fails upstream on every request. anthropic_messages is now implemented and routable — the anthropic provider uses it — so Zen’s Claude models are a data entry rather than a blocked one. What is missing is the endpoint mapping: Zen serves them at /zen/v1/messages and a provider entry carries ONE base_url, so registering them needs a second anthropic-speaking provider entry pointed at that path. Its GPT, Grok, Muse and Gemini models still wait on #41 and #35. No entry carries capabilities: Zen publishes a price per model and no context window, output ceiling, or concurrency figure. Every model is re-hosted, so the original provider’s numbers are not Zen’s to promise.

What is deliberately absent

The registry leaves out more than it includes, and each omission is recorded with a reason in specs.yaml. The recurring ones:
Embeddings, moderation, images, audio, realtime, and legacy completions. Also OpenAI’s -pro models, which serve the Responses API rather than chat completions.
Registering a name that breaks within the quarter would hand callers a migration. Where a provider names a replacement, the replacement is on the roster instead.
OpenAI’s chat-latest serves chat completions, but the snapshot underneath it moves — so any limits recorded for it would go stale without the file changing.
gpt-5-2025-08-07 and its kind. The aliases are what callers name.

Keeping this page honest

The tables are regenerated from the registry rather than maintained by hand:
Add --check to fail instead of rewriting, which is what CI should run so a registry change cannot ship without the docs following.

Next

Add a model

The registry edit and the rules its tests enforce.

Model routing

How these strings resolve at request time.