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.
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.
anthropic
Base URLhttps://api.anthropic.com/v1 · API key ANTHROPIC_API_KEY
deepseek
Base URLhttps://api.deepseek.com · API key DEEPSEEK_API_KEY
kimi
Base URLhttps://api.moonshot.ai/v1 · API key MOONSHOT_API_KEY
mistral
Base URLhttps://api.mistral.ai/v1 · API key MISTRAL_API_KEY
openai
Base URLhttps://api.openai.com/v1 · API key OPENAI_API_KEY
opencode
Base URLhttps://opencode.ai/zen/v1 · API key OPENCODE_API_KEY
openrouter
Base URLhttps://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 inspecs.yaml. The recurring ones:
Models on a surface warpllm does not serve
Models on a surface warpllm does not serve
Embeddings, moderation, images, audio, realtime, and legacy completions.
Also OpenAI’s
-pro models, which serve the Responses API rather than chat
completions.Models with a near retirement date
Models with a near retirement date
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.
Moving aliases
Moving aliases
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.Dated snapshots
Dated snapshots
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:--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.