--- title: "OpenRouter" description: "Route Fabro models through OpenRouter's multi-provider gateway" --- [OpenRouter](https://openrouter.ai/) is an aggregator that fronts hundreds of models behind one OpenAI-compatible API. Fabro ships a disabled `openrouter` provider entry with a curated model catalog, so you can opt in from `settings.toml` without changing Fabro code. ## Prerequisites - An [OpenRouter account](https://openrouter.ai/) with credit for paid models - An API key from [openrouter.ai/keys](https://openrouter.ai/keys) ## Enable the provider Fabro runs execute through a Fabro server. Add the provider override to the settings file used by that server. For a local server, this is usually `~/.fabro/settings.toml`; for a remote deployment, update the server host's Fabro settings. ```toml title="settings.toml" _version = 1 [llm.providers.openrouter] enabled = true ``` ## Configure credentials Store the key in the target Fabro server vault: ```bash fabro provider login --provider openrouter # For a non-default remote server: fabro provider login --server https://your-fabro.example --provider openrouter # Or set the vault token directly: fabro secret set OPENROUTER_API_KEY sk-or-v1-... fabro secret --server https://your-fabro.example set OPENROUTER_API_KEY sk-or-v1-... ``` Direct SDK usage outside a Fabro server can use an env-backed credential source explicitly: ```bash export OPENROUTER_API_KEY=sk-or-v1-... ``` ## Included models The built-in catalog gives OpenRouter offerings the same human-facing model slugs used by direct providers. Vendor-namespaced OpenRouter IDs remain opaque `api_id` values: | Fabro model slug | OpenRouter API ID / notes | | --- | --- | | `claude-fable-5`, `claude-opus-5`, `claude-opus-4-8`, `claude-opus-4-7` | Matching `anthropic/...` API IDs; Anthropic-style cache billing | | `claude-sonnet-4-6` | `anthropic/claude-sonnet-4.6`; provider default | | `claude-haiku-4-5` | `anthropic/claude-haiku-4.5`; provider small default | | `gpt-5.6-sol`, `gpt-5.6-terra`, `gpt-5.6-luna`, `gpt-5.4`, `gpt-5.5` | Matching `openai/...` API IDs | | `gemini-3.1-pro-preview`, `gemini-3.5-flash` | `google/...` API IDs | | `deepseek-v4-pro`, `deepseek-v4-flash` (`deepseek`, `deepseek-v4`, `deepseek-flash`) | `deepseek/...` API IDs; Flash uses the `deepseek-v4-flash-0731` release | | `kimi-k3`, `kimi-k2.6`, `qwen3-coder`, `qwen3.6-flash` | Vendor-prefixed API IDs | | `laguna-s-2.1`, `laguna-xs-2.1` | `poolside/...`; native reasoning and tool use | | `glm-5.2` (`glm`, `glm5`, `glm52`, `glm5.2`), `glm-4.6` | `z-ai/...` API IDs | | `minimax-m2.7`, `mimo-v2.5-pro` | Vendor-prefixed API IDs | | `nemotron-3-super-120b-a12b`, `devstral-2512` | Vendor-prefixed API IDs | Any other OpenRouter model can be added under the provider. Choose a stable Fabro model slug as the table key and put OpenRouter's exact vendor/model string in `api_id`: ```toml title="settings.toml" [llm.providers.openrouter.models."llama-4-maverick"] api_id = "meta-llama/llama-4-maverick" display_name = "Llama 4 Maverick" family = "llama-4" [llm.providers.openrouter.models."llama-4-maverick".limits] context_window = 1000000 [llm.providers.openrouter.models."llama-4-maverick".features] tools = true vision = false reasoning = false ``` ## Use OpenRouter models ```bash fabro model list --provider openrouter fabro model test --provider openrouter --model claude-sonnet-4-6 fabro run workflow.fabro --provider openrouter --model deepseek-v4-flash ``` When targeting a non-default remote server, pass the same `--server` value to verification commands: ```bash fabro model list --server https://your-fabro.example --provider openrouter fabro model test --server https://your-fabro.example --model anthropic/claude-sonnet-4-6 ``` In workflow stylesheets: ```dot title="workflow.fabro" digraph Example { graph [ model_stylesheet=" * { model: anthropic/claude-sonnet-4-6; } " ] start [shape=Mdiamond, label="Start"] work [label="Work", prompt="Use the configured OpenRouter model."] exit [shape=Msquare, label="Exit"] start -> work -> exit } ``` ## Cost telemetry Every OpenRouter response includes an inline `usage.cost` with authoritative USD billing. Fabro surfaces it as `cost_usd` with `cost_source = "authoritative"` on completion responses. Other providers populate the same fields from catalog price estimates with `cost_source = "estimated"`. The catalog prices on OpenRouter model rows are best-effort estimates used only before the authoritative figure arrives (for example, mid-stream rollups). ## Provider routing OpenRouter's [provider routing preferences](https://openrouter.ai/docs/guides/routing/provider-selection) pass through verbatim via `provider_options.openrouter` on API/SDK requests — the keys merge into the top level of the request body: ```json { "model": "anthropic/claude-sonnet-4-6", "provider_options": { "openrouter": { "provider": { "sort": "throughput", "data_collection": "deny" }, "models": ["anthropic/claude-sonnet-4.6", "deepseek/deepseek-v4-pro"] } } } ``` ## Attribution headers Fabro does not send OpenRouter's optional attribution headers (`HTTP-Referer`, `X-Title`) by default, so self-hosted installations stay anonymous on OpenRouter's public app leaderboard. Workflow runs do send `x-session-id: ` for request grouping; an explicit provider `extra_headers` value for that header takes precedence. To opt in to attribution: ```toml title="settings.toml" [llm.providers.openrouter.extra_headers] "HTTP-Referer" = "https://your-site.example" "X-Title" = "Your App" ``` ## Troubleshooting **"No API key configured"** — Set the key on the target server with `fabro provider login --provider openrouter` or `fabro secret set OPENROUTER_API_KEY ...`. For direct SDK usage outside a Fabro server, export `OPENROUTER_API_KEY` in the invoking shell. **"provider 'openrouter' is not configured in the server model catalog"** — Confirm the server host's `settings.toml` has `[llm.providers.openrouter]` with `enabled = true`. Fabro live-reloads `settings.toml` within a few seconds; after that, `fabro model list --provider openrouter` against the same server should show the enabled catalog. **402 / insufficient credits** — Paid OpenRouter models require prepaid credit; check your balance at [openrouter.ai/credits](https://openrouter.ai/credits). **Unknown model** — Confirm the model's `api_id` matches an OpenRouter slug exactly (including the vendor prefix), then run `fabro model test --model `. ## Further reading How Fabro routes model IDs, providers, and fallbacks. Full reference for provider settings and provider-scoped model offerings.