OpenRouter
One key, every vendor — vendor/model slugs pass through the gateway verbatim, per-call cost comes from the gateway's own usage accounting, and any agent can route through it independently.
OpenRouter is a gateway: one API key that fronts effectively every commercial model. If
you want to try a vendor without opening an account, mix families without juggling five
keys, or route a single pipeline role through a different vendor, this is the provider.
Stella speaks the OpenAI-compatible dialect against https://openrouter.ai/api/v1.
Setup
export OPENROUTER_API_KEY="sk-or-..."OpenRouter sits seventh in auto-detection — behind
every direct-vendor key, ahead only of the cloud providers. Alternatively, store the key
in ~/.config/stella/credentials.toml, or rename the
env var Stella reads with providers.openrouter.api_key_env — see
overriding the key source.
Selecting models
The provider id is openrouter; the default model is openrouter/auto — OpenRouter's
meta-router, which picks a backing model per request. Gateway slugs are vendor/model,
and they pass through unseeded: any slug the gateway serves works verbatim, whether
or not Stella's catalog has ever heard of it. A typo fails with OpenRouter's own 400/404,
not a Stella error.
stella --model openrouter/auto run "tidy the changelog"
stella --model openrouter/openai/gpt-5.5 run "review this diff as a strict judge"
stella --model openrouter/anthropic/claude-fable-5 run "refactor the scheduler"Real prices, not catalog prices
Stella's catalog deliberately prices openrouter/auto at 0 = gateway-priced, because
the honest number only exists per call. So Stella sends app attribution headers and
requests the gateway's usage accounting on every response — the per-call cost recorded
in your telemetry is the routed call's real price, exactly
as OpenRouter billed it, not a seed-catalog estimate.
Reasoning and sampling
Stella's effort setting maps to OpenRouter's reasoning object, which the gateway
translates for whichever backing vendor serves the call. The dialect also accepts the
long tail of sampling parameters — including top_k and repetition_penalty — set per
agent under agent_engine_config.
Per-agent gateway routing
The killer feature: agent_engine_config
routes each engine agent through its own provider — so your worker can run on your direct
Anthropic key while the judge routes through OpenRouter, giving you a cross-family judge
without opening another vendor account:
{
"agent_engine_config": {
"pipeline_worker_model": "anthropic/claude-fable-5",
"agents": {
"judge": {
"provider": "openrouter",
"model": "openai/gpt-5.5"
}
}
}
}In the pipeline
OpenRouter shines wherever the model you want is not the key you have — most often the judge seat, where cross-family judging matters most (see the Model guide). The Examples profiles show gateway-routed judge variants alongside the direct-key versions.
Catalog pricing
| Model | Context | In $/Mtok | Out $/Mtok | Cached-in $/Mtok |
|---|---|---|---|---|
openrouter/auto | 128k | gateway-priced | gateway-priced | — |
The catalog price is deliberately zero — the gateway's usage accounting supplies the real per-call cost, and the Observatory's models view aggregates it per routed model.
Z.ai
GLM models over an OpenAI-compatible API — Stella's default worker tier, first in auto-detection, with a dedicated coding-plan endpoint for subscription pricing.
Local
Point Stella at any OpenAI-compatible server — Ollama, vLLM, LM Studio, llama.cpp — with no API key, no auto-detection, and zero token cost.