the provider catalog
OpenRouter
One key and one endpoint route to many vendors: the model id carries the vendor and the router owns the hop, fallbacks included. One provider/model line moves a workflow here or away again: the same file runs on every provider the catalog names, and swapping is a one-word diff. Machines read the catalog; the binary answers nika catalog.
- 2pinned modelsaliases pin exact upstream ids
- cloudfamilybring your own key; it rides an env var and stays yours
- OPENROUTER_API_KEYthe key rides herean env var, never a config file
- openai-chatwire dialectthe adapter speaks it
the wire
cloud · bring your own key; it rides an env var and stays yoursA workflow names this provider in the model line (model: openrouter/anthropic/claude-sonnet-4-20250514), and the engine speaks openai-chat on the wire. The key rides OPENROUTER_API_KEY in the environment, never a config file, never the workflow. The provider id also answers to or.
- default
anthropic/claude-sonnet-4-20250514- cheap
anthropic/claude-haiku-4-5-20251001- dialect
openai-chat- tags
- function-calling · streaming
the models
2 pinsAliases are what the file may write; the engine pins each one to an exact upstream id, so a run stays reproducible after a vendor rotates names.
defaultanthropic/claude-sonnet-4-20250514ctx 128k · reasoning · vision · json:schema$3/M in · $15/M outcheapanthropic/claude-haiku-4-5-20251001ctx 128k · reasoning · vision · json:schema
prices are the ENGINE's, not ours: the audit's pricing snapshot (models.dev · pinned 2026-07-07): the same table nika check prices your ceiling with.
in the released catalog
2 roomsThe wire models this provider serves in the released binary's catalog · each one is a room with its seats, exact prices and measured energy.
- anthropic/claude-haiku-4-5-20251001as cheap
- anthropic/claude-sonnet-4-20250514as default
the whole register: /catalog/models · what the released binary knows, vendored at the engine pin.
in a real file
a complete workflow · shown wholenika: v1workflow: id: one-key-two-vendors description: "two vendors' models through one endpoint — the router owns the hop"tasks: first_opinion: infer: model: openrouter/anthropic/claude-sonnet-4-20250514 max_tokens: 120 prompt: | One sentence: what breaks when prompts live in a wiki instead of version control? second_opinion: with: claim: ${{ tasks.first_opinion.output }} infer: model: openrouter/anthropic/claude-haiku-4-5-20251001 max_tokens: 120 prompt: | Disagree in one sentence, if you can: ${{ with.claim }}outputs: debate: ${{ tasks.second_opinion.output }}check-green against the released engine · 2 tasks · 2 waves · no closed ceiling: an unpriced model is unpriced, never free · the drift gate re-proves this copy on every test run · open it in the playground →
get set up
keys at openrouter.ai- 1Create a key in the settings.
- 2The key rides the environment, never the file
export OPENROUTER_API_KEY=…
Pick it for comparing vendors, or refusing to carry one key per provider. Then prove the seat: nika doctor names every provider this binary can reach.
swap it
10 more cloud seatsMoving off OpenRouter is editing one line. The rest of the file (tasks, permits, outputs, the trace) does not change. The register orders the catalog local first; beyond it the engine embeds 21 more OpenAI-compatible endpoints.
cross-references
the words that meet it
Try it in the playground, or install and go local first. Read the spec →