From c7ca5aedfc5148849b494bfb90ea8a2119999c16 Mon Sep 17 00:00:00 2001 From: Neil Vallecer Date: Tue, 2 Jun 2026 02:41:32 +0800 Subject: [PATCH 1/4] feat: add issue templates --- .github/ISSUE_TEMPLATE/bug_report.yml | 65 ++++++++++++++++++++++ .github/ISSUE_TEMPLATE/config.yml | 1 + .github/ISSUE_TEMPLATE/feature_request.yml | 55 ++++++++++++++++++ 3 files changed, 121 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..52010aa --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,65 @@ +name: Bug report +description: Report something that's broken +title: "[Bug]: " +labels: ["bug"] +body: + - type: textarea + id: description + attributes: + label: What happened? + description: Be specific. Include error messages if any. + validations: + required: true + + - type: textarea + id: repro + attributes: + label: Steps to reproduce + description: Minimal steps to trigger the bug. + validations: + required: true + + - type: textarea + id: expected + attributes: + label: Expected behavior + description: What should have happened instead? + placeholder: "I expected zot to..." + validations: + required: true + + - type: input + id: version + attributes: + label: Version + description: "e.g. 0.0.1 — run `zot --version` to check" + validations: + required: true + + - type: dropdown + id: os + attributes: + label: Operating system + options: + - macOS + - Linux + - Windows + - Other + validations: + required: true + + - type: textarea + id: logs + attributes: + label: Logs / screenshots + description: | + If applicable, paste relevant terminal output or attach screenshots. + render: shell + + - type: checkboxes + id: checks + attributes: + label: Before submitting + options: + - label: I searched existing issues and didn't find a duplicate + required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..3ba13e0 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1 @@ +blank_issues_enabled: false diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..781798a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,55 @@ +name: Feature request +description: Suggest a new feature or improvement +title: "[Feature]: " +labels: ["enhancement"] +body: + - type: markdown + attributes: + value: | + Thanks for the idea! A short conversation here saves everyone time before any code is written. + + Zot is intentionally focused — not every idea will make it in. A "no" is not a judgment of the idea. + + - type: textarea + id: problem + attributes: + label: What problem does this solve? + description: | + The **why**, not the **what**. What were you trying to do when you wished this existed? + placeholder: "When I'm working with multiple providers, I want to switch between them without restarting zot." + validations: + required: true + + - type: textarea + id: proposal + attributes: + label: Proposed solution + description: How would you imagine using this? UX sketch, CLI flags, behavior, anything that helps us picture it. + validations: + required: true + + - type: textarea + id: alternatives + attributes: + label: Alternatives considered + description: What workarounds have you tried? What other tools handle this well? + placeholder: "I tried X, but it doesn't solve Y because..." + + - type: dropdown + id: contribution + attributes: + label: Are you willing to contribute the implementation? + options: + - "Yes, with guidance" + - "Yes, I can do it" + - "No, just suggesting" + validations: + required: true + + - type: checkboxes + id: checks + attributes: + label: Before submitting + options: + - label: I searched existing issues and didn't find a duplicate + required: true From 88b93da57fa8cacd693d00c470a58430c6aa8fb9 Mon Sep 17 00:00:00 2001 From: Dawid Piotrkowski <199792507+piotrkowski@users.noreply.github.com> Date: Fri, 5 Jun 2026 15:20:54 +0200 Subject: [PATCH 2/4] provider: discover OpenRouter models live, drop baked-in catalog --- packages/agent/modelsync.go | 7 + packages/provider/catalog_builtin.go | 273 +-------------------------- packages/provider/discover.go | 107 +++++++++++ packages/provider/extra_providers.go | 2 +- packages/provider/models.go | 11 ++ packages/provider/openai.go | 9 +- packages/provider/provider_test.go | 67 +++++++ 7 files changed, 201 insertions(+), 275 deletions(-) diff --git a/packages/agent/modelsync.go b/packages/agent/modelsync.go index 078f338..dc73e72 100644 --- a/packages/agent/modelsync.go +++ b/packages/agent/modelsync.go @@ -150,6 +150,13 @@ func refreshModels() { all = append(all, live...) } } + if _, _, err := ResolveCredential("openrouter", ""); err == nil { + // /models is public; gate on a credential so the picker only + // fills with OpenRouter's hundreds of routes for users who use it. + if live, err := provider.DiscoverOpenRouter(ctx, ""); err == nil { + all = append(all, live...) + } + } if len(all) == 0 { return diff --git a/packages/provider/catalog_builtin.go b/packages/provider/catalog_builtin.go index fc64dd8..750ffc5 100644 --- a/packages/provider/catalog_builtin.go +++ b/packages/provider/catalog_builtin.go @@ -307,39 +307,7 @@ var builtinCatalog = []Model{ {Provider: "opencode-go", ID: "minimax-m2.7", DisplayName: "MiniMax M2.7", ContextWindow: 204800, MaxOutput: 131072, Reasoning: true, PriceInput: 0.3, PriceOutput: 1.2, PriceCacheRead: 0.06, BaseURL: "https://opencode.ai/zen/go/v1"}, {Provider: "opencode-go", ID: "qwen3.5-plus", DisplayName: "Qwen3.5 Plus", ContextWindow: 262144, MaxOutput: 65536, Reasoning: true, PriceInput: 0.2, PriceOutput: 1.2, PriceCacheRead: 0.02, PriceCacheWrite: 0.25, BaseURL: "https://opencode.ai/zen/go/v1"}, {Provider: "opencode-go", ID: "qwen3.6-plus", DisplayName: "Qwen3.6 Plus", ContextWindow: 262144, MaxOutput: 65536, Reasoning: true, PriceInput: 0.5, PriceOutput: 3, PriceCacheRead: 0.05, PriceCacheWrite: 0.625, BaseURL: "https://opencode.ai/zen/go/v1"}, - // ----- openrouter ----- - {Provider: "openrouter", ID: "ai21/jamba-large-1.7", DisplayName: "AI21: Jamba Large 1.7", ContextWindow: 256000, MaxOutput: 4096, Reasoning: false, PriceInput: 2, PriceOutput: 8, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "alibaba/tongyi-deepresearch-30b-a3b", DisplayName: "Tongyi DeepResearch 30B A3B", ContextWindow: 131072, MaxOutput: 131072, Reasoning: true, PriceInput: 0.09, PriceOutput: 0.45, PriceCacheRead: 0.09, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "amazon/nova-2-lite-v1", DisplayName: "Amazon: Nova 2 Lite", ContextWindow: 1000000, MaxOutput: 65535, Reasoning: true, PriceInput: 0.3, PriceOutput: 2.5, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "amazon/nova-lite-v1", DisplayName: "Amazon: Nova Lite 1.0", ContextWindow: 300000, MaxOutput: 5120, Reasoning: false, PriceInput: 0.06, PriceOutput: 0.24, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "amazon/nova-micro-v1", DisplayName: "Amazon: Nova Micro 1.0", ContextWindow: 128000, MaxOutput: 5120, Reasoning: false, PriceInput: 0.035, PriceOutput: 0.14, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "amazon/nova-premier-v1", DisplayName: "Amazon: Nova Premier 1.0", ContextWindow: 1000000, MaxOutput: 32000, Reasoning: false, PriceInput: 2.5, PriceOutput: 12.5, PriceCacheRead: 0.625, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "amazon/nova-pro-v1", DisplayName: "Amazon: Nova Pro 1.0", ContextWindow: 300000, MaxOutput: 5120, Reasoning: false, PriceInput: 0.8, PriceOutput: 3.2, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "anthropic/claude-3-haiku", DisplayName: "Anthropic: Claude 3 Haiku", ContextWindow: 200000, MaxOutput: 4096, Reasoning: false, PriceInput: 0.25, PriceOutput: 1.25, PriceCacheRead: 0.03, PriceCacheWrite: 0.3, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "anthropic/claude-3.5-haiku", DisplayName: "Anthropic: Claude 3.5 Haiku", ContextWindow: 200000, MaxOutput: 8192, Reasoning: false, PriceInput: 0.8, PriceOutput: 4, PriceCacheRead: 0.08, PriceCacheWrite: 1, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "anthropic/claude-haiku-4.5", DisplayName: "Anthropic: Claude Haiku 4.5", ContextWindow: 200000, MaxOutput: 64000, Reasoning: true, PriceInput: 1, PriceOutput: 5, PriceCacheRead: 0.1, PriceCacheWrite: 1.25, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "anthropic/claude-opus-4", DisplayName: "Anthropic: Claude Opus 4", ContextWindow: 200000, MaxOutput: 32000, Reasoning: true, PriceInput: 15, PriceOutput: 75, PriceCacheRead: 1.5, PriceCacheWrite: 18.75, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "anthropic/claude-opus-4.1", DisplayName: "Anthropic: Claude Opus 4.1", ContextWindow: 200000, MaxOutput: 32000, Reasoning: true, PriceInput: 15, PriceOutput: 75, PriceCacheRead: 1.5, PriceCacheWrite: 18.75, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "anthropic/claude-opus-4.5", DisplayName: "Anthropic: Claude Opus 4.5", ContextWindow: 200000, MaxOutput: 64000, Reasoning: true, PriceInput: 5, PriceOutput: 25, PriceCacheRead: 0.5, PriceCacheWrite: 6.25, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "anthropic/claude-opus-4.6", DisplayName: "Anthropic: Claude Opus 4.6", ContextWindow: 1000000, MaxOutput: 128000, Reasoning: true, PriceInput: 5, PriceOutput: 25, PriceCacheRead: 0.5, PriceCacheWrite: 6.25, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "anthropic/claude-opus-4.6-fast", DisplayName: "Anthropic: Claude Opus 4.6 (Fast)", ContextWindow: 1000000, MaxOutput: 128000, Reasoning: true, PriceInput: 30, PriceOutput: 150, PriceCacheRead: 3, PriceCacheWrite: 37.5, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "anthropic/claude-opus-4.7", DisplayName: "Anthropic: Claude Opus 4.7", ContextWindow: 1000000, MaxOutput: 128000, Reasoning: true, PriceInput: 5, PriceOutput: 25, PriceCacheRead: 0.5, PriceCacheWrite: 6.25, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "anthropic/claude-opus-4.7-fast", DisplayName: "Anthropic: Claude Opus 4.7 (Fast)", ContextWindow: 1000000, MaxOutput: 128000, Reasoning: true, PriceInput: 30, PriceOutput: 150, PriceCacheRead: 3, PriceCacheWrite: 37.5, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "anthropic/claude-opus-4.8", DisplayName: "Anthropic: Claude Opus 4.8", ContextWindow: 1000000, MaxOutput: 128000, Reasoning: true, PriceInput: 5, PriceOutput: 25, PriceCacheRead: 0.5, PriceCacheWrite: 6.25, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "anthropic/claude-opus-4.8-fast", DisplayName: "Anthropic: Claude Opus 4.8 (Fast)", ContextWindow: 1000000, MaxOutput: 128000, Reasoning: true, PriceInput: 30, PriceOutput: 150, PriceCacheRead: 3, PriceCacheWrite: 37.5, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "anthropic/claude-sonnet-4", DisplayName: "Anthropic: Claude Sonnet 4", ContextWindow: 1000000, MaxOutput: 64000, Reasoning: true, PriceInput: 3, PriceOutput: 15, PriceCacheRead: 0.3, PriceCacheWrite: 3.75, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "anthropic/claude-sonnet-4.5", DisplayName: "Anthropic: Claude Sonnet 4.5", ContextWindow: 1000000, MaxOutput: 64000, Reasoning: true, PriceInput: 3, PriceOutput: 15, PriceCacheRead: 0.3, PriceCacheWrite: 3.75, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "anthropic/claude-sonnet-4.6", DisplayName: "Anthropic: Claude Sonnet 4.6", ContextWindow: 1000000, MaxOutput: 128000, Reasoning: true, PriceInput: 3, PriceOutput: 15, PriceCacheRead: 0.3, PriceCacheWrite: 3.75, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "arcee-ai/trinity-large-thinking", DisplayName: "Arcee AI: Trinity Large Thinking", ContextWindow: 262144, MaxOutput: 262144, Reasoning: true, PriceInput: 0.22, PriceOutput: 0.85, PriceCacheRead: 0.06, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "arcee-ai/trinity-large-thinking:free", DisplayName: "Arcee AI: Trinity Large Thinking (free)", ContextWindow: 262144, MaxOutput: 80000, Reasoning: true, PriceInput: 0, PriceOutput: 0, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "arcee-ai/trinity-mini", DisplayName: "Arcee AI: Trinity Mini", ContextWindow: 131072, MaxOutput: 131072, Reasoning: true, PriceInput: 0.045, PriceOutput: 0.15, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "arcee-ai/virtuoso-large", DisplayName: "Arcee AI: Virtuoso Large", ContextWindow: 131072, MaxOutput: 64000, Reasoning: false, PriceInput: 0.75, PriceOutput: 1.2, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "auto", DisplayName: "Auto", ContextWindow: 2000000, MaxOutput: 30000, Reasoning: true, PriceInput: 0, PriceOutput: 0, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "baidu/cobuddy:free", DisplayName: "Baidu Qianfan: CoBuddy (free)", ContextWindow: 131072, MaxOutput: 65536, Reasoning: true, PriceInput: 0, PriceOutput: 0, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "baidu/ernie-4.5-21b-a3b", DisplayName: "Baidu: ERNIE 4.5 21B A3B", ContextWindow: 131072, MaxOutput: 8000, Reasoning: false, PriceInput: 0.07, PriceOutput: 0.28, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "baidu/ernie-4.5-vl-28b-a3b", DisplayName: "Baidu: ERNIE 4.5 VL 28B A3B", ContextWindow: 131072, MaxOutput: 8000, Reasoning: true, PriceInput: 0.14, PriceOutput: 0.56, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "bytedance-seed/seed-1.6", DisplayName: "ByteDance Seed: Seed 1.6", ContextWindow: 262144, MaxOutput: 32768, Reasoning: true, PriceInput: 0.25, PriceOutput: 2, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "bytedance-seed/seed-1.6-flash", DisplayName: "ByteDance Seed: Seed 1.6 Flash", ContextWindow: 262144, MaxOutput: 32768, Reasoning: true, PriceInput: 0.075, PriceOutput: 0.3, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, + // openrouter: discovered live via DiscoverOpenRouter, none baked in. // ----- together ----- {Provider: "together", ID: "MiniMaxAI/MiniMax-M2.5", DisplayName: "MiniMax-M2.5", ContextWindow: 204800, MaxOutput: 131072, Reasoning: true, PriceInput: 0.3, PriceOutput: 1.2, PriceCacheRead: 0.06, BaseURL: "https://api.together.ai/v1"}, {Provider: "together", ID: "MiniMaxAI/MiniMax-M2.7", DisplayName: "MiniMax-M2.7", ContextWindow: 202752, MaxOutput: 131072, Reasoning: true, PriceInput: 0.3, PriceOutput: 1.2, PriceCacheRead: 0.06, BaseURL: "https://api.together.ai/v1"}, @@ -705,243 +673,4 @@ var builtinCatalog = []Model{ {Provider: "opencode", ID: "nemotron-3-super-free", DisplayName: "Nemotron 3 Super Free", ContextWindow: 204800, MaxOutput: 128000, Reasoning: true, PriceInput: 0, PriceOutput: 0, PriceCacheRead: 0, BaseURL: "https://opencode.ai/zen/v1"}, {Provider: "opencode", ID: "qwen3.5-plus", DisplayName: "Qwen3.5 Plus", ContextWindow: 262144, MaxOutput: 65536, Reasoning: true, PriceInput: 0.2, PriceOutput: 1.2, PriceCacheRead: 0.02, PriceCacheWrite: 0.25, BaseURL: "https://opencode.ai/zen"}, {Provider: "opencode", ID: "qwen3.6-plus", DisplayName: "Qwen3.6 Plus", ContextWindow: 262144, MaxOutput: 65536, Reasoning: true, PriceInput: 0.5, PriceOutput: 3, PriceCacheRead: 0.05, PriceCacheWrite: 0.625, BaseURL: "https://opencode.ai/zen"}, - // ----- openrouter (additional synced entries) ----- - {Provider: "openrouter", ID: "bytedance-seed/seed-2.0-lite", DisplayName: "ByteDance Seed: Seed-2.0-Lite", ContextWindow: 262144, MaxOutput: 131072, Reasoning: true, PriceInput: 0.25, PriceOutput: 2, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "bytedance-seed/seed-2.0-mini", DisplayName: "ByteDance Seed: Seed-2.0-Mini", ContextWindow: 262144, MaxOutput: 131072, Reasoning: true, PriceInput: 0.1, PriceOutput: 0.4, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "cohere/command-r-08-2024", DisplayName: "Cohere: Command R (08-2024)", ContextWindow: 128000, MaxOutput: 4000, Reasoning: false, PriceInput: 0.15, PriceOutput: 0.6, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "cohere/command-r-plus-08-2024", DisplayName: "Cohere: Command R+ (08-2024)", ContextWindow: 128000, MaxOutput: 4000, Reasoning: false, PriceInput: 2.5, PriceOutput: 10, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "deepseek/deepseek-chat", DisplayName: "DeepSeek: DeepSeek V3", ContextWindow: 163840, MaxOutput: 16384, Reasoning: false, PriceInput: 0.32, PriceOutput: 0.89, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "deepseek/deepseek-chat-v3-0324", DisplayName: "DeepSeek: DeepSeek V3 0324", ContextWindow: 163840, MaxOutput: 16384, Reasoning: false, PriceInput: 0.2, PriceOutput: 0.77, PriceCacheRead: 0.135, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "deepseek/deepseek-chat-v3.1", DisplayName: "DeepSeek: DeepSeek V3.1", ContextWindow: 163840, MaxOutput: 32768, Reasoning: true, PriceInput: 0.21, PriceOutput: 0.79, PriceCacheRead: 0.13, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "deepseek/deepseek-r1", DisplayName: "DeepSeek: R1", ContextWindow: 163840, MaxOutput: 16000, Reasoning: true, PriceInput: 0.7, PriceOutput: 2.5, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "deepseek/deepseek-r1-0528", DisplayName: "DeepSeek: R1 0528", ContextWindow: 163840, MaxOutput: 32768, Reasoning: true, PriceInput: 0.5, PriceOutput: 2.15, PriceCacheRead: 0.35, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "deepseek/deepseek-v3.1-terminus", DisplayName: "DeepSeek: DeepSeek V3.1 Terminus", ContextWindow: 163840, MaxOutput: 32768, Reasoning: true, PriceInput: 0.27, PriceOutput: 0.95, PriceCacheRead: 0.13, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "deepseek/deepseek-v3.2", DisplayName: "DeepSeek: DeepSeek V3.2", ContextWindow: 131072, MaxOutput: 65536, Reasoning: true, PriceInput: 0.252, PriceOutput: 0.378, PriceCacheRead: 0.0252, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "deepseek/deepseek-v3.2-exp", DisplayName: "DeepSeek: DeepSeek V3.2 Exp", ContextWindow: 163840, MaxOutput: 65536, Reasoning: true, PriceInput: 0.27, PriceOutput: 0.41, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "deepseek/deepseek-v4-flash", DisplayName: "DeepSeek: DeepSeek V4 Flash", ContextWindow: 1048576, MaxOutput: 16384, Reasoning: true, PriceInput: 0.1, PriceOutput: 0.2, PriceCacheRead: 0.02, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "deepseek/deepseek-v4-flash:free", DisplayName: "DeepSeek: DeepSeek V4 Flash (free)", ContextWindow: 1048576, MaxOutput: 384000, Reasoning: true, PriceInput: 0, PriceOutput: 0, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "deepseek/deepseek-v4-pro", DisplayName: "DeepSeek: DeepSeek V4 Pro", ContextWindow: 1048576, MaxOutput: 384000, Reasoning: true, PriceInput: 0.435, PriceOutput: 0.87, PriceCacheRead: 0.003625, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "essentialai/rnj-1-instruct", DisplayName: "EssentialAI: Rnj 1 Instruct", ContextWindow: 32768, MaxOutput: 4096, Reasoning: false, PriceInput: 0.15, PriceOutput: 0.15, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "google/gemini-2.0-flash-001", DisplayName: "Google: Gemini 2.0 Flash", ContextWindow: 1000000, MaxOutput: 8192, Reasoning: false, PriceInput: 0.1, PriceOutput: 0.4, PriceCacheRead: 0.025, PriceCacheWrite: 0.0833333333333, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "google/gemini-2.0-flash-lite-001", DisplayName: "Google: Gemini 2.0 Flash Lite", ContextWindow: 1048576, MaxOutput: 8192, Reasoning: false, PriceInput: 0.075, PriceOutput: 0.3, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "google/gemini-2.5-flash", DisplayName: "Google: Gemini 2.5 Flash", ContextWindow: 1048576, MaxOutput: 65535, Reasoning: true, PriceInput: 0.3, PriceOutput: 2.5, PriceCacheRead: 0.03, PriceCacheWrite: 0.0833333333333, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "google/gemini-2.5-flash-lite", DisplayName: "Google: Gemini 2.5 Flash Lite", ContextWindow: 1048576, MaxOutput: 65535, Reasoning: true, PriceInput: 0.1, PriceOutput: 0.4, PriceCacheRead: 0.01, PriceCacheWrite: 0.0833333333333, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "google/gemini-2.5-flash-lite-preview-09-2025", DisplayName: "Google: Gemini 2.5 Flash Lite Preview 09-2025", ContextWindow: 1048576, MaxOutput: 65535, Reasoning: true, PriceInput: 0.1, PriceOutput: 0.4, PriceCacheRead: 0.01, PriceCacheWrite: 0.0833333333333, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "google/gemini-2.5-pro", DisplayName: "Google: Gemini 2.5 Pro", ContextWindow: 1048576, MaxOutput: 65536, Reasoning: true, PriceInput: 1.25, PriceOutput: 10, PriceCacheRead: 0.125, PriceCacheWrite: 0.375, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "google/gemini-2.5-pro-preview", DisplayName: "Google: Gemini 2.5 Pro Preview 06-05", ContextWindow: 1048576, MaxOutput: 65536, Reasoning: true, PriceInput: 1.25, PriceOutput: 10, PriceCacheRead: 0.125, PriceCacheWrite: 0.375, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "google/gemini-2.5-pro-preview-05-06", DisplayName: "Google: Gemini 2.5 Pro Preview 05-06", ContextWindow: 1048576, MaxOutput: 65535, Reasoning: true, PriceInput: 1.25, PriceOutput: 10, PriceCacheRead: 0.125, PriceCacheWrite: 0.375, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "google/gemini-3-flash-preview", DisplayName: "Google: Gemini 3 Flash Preview", ContextWindow: 1048576, MaxOutput: 65536, Reasoning: true, PriceInput: 0.5, PriceOutput: 3, PriceCacheRead: 0.05, PriceCacheWrite: 0.0833333333333, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "google/gemini-3.1-flash-lite", DisplayName: "Google: Gemini 3.1 Flash Lite", ContextWindow: 1048576, MaxOutput: 65536, Reasoning: true, PriceInput: 0.25, PriceOutput: 1.5, PriceCacheRead: 0.025, PriceCacheWrite: 0.0833333333333, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "google/gemini-3.1-flash-lite-preview", DisplayName: "Google: Gemini 3.1 Flash Lite Preview", ContextWindow: 1048576, MaxOutput: 65536, Reasoning: true, PriceInput: 0.25, PriceOutput: 1.5, PriceCacheRead: 0.025, PriceCacheWrite: 0.0833333333333, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "google/gemini-3.1-pro-preview", DisplayName: "Google: Gemini 3.1 Pro Preview", ContextWindow: 1048576, MaxOutput: 65536, Reasoning: true, PriceInput: 2, PriceOutput: 12, PriceCacheRead: 0.2, PriceCacheWrite: 0.375, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "google/gemini-3.1-pro-preview-customtools", DisplayName: "Google: Gemini 3.1 Pro Preview Custom Tools", ContextWindow: 1048756, MaxOutput: 65536, Reasoning: true, PriceInput: 2, PriceOutput: 12, PriceCacheRead: 0.2, PriceCacheWrite: 0.375, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "google/gemini-3.5-flash", DisplayName: "Google: Gemini 3.5 Flash", ContextWindow: 1048576, MaxOutput: 65536, Reasoning: true, PriceInput: 1.5, PriceOutput: 9, PriceCacheRead: 0.15, PriceCacheWrite: 0.0833333333333, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "google/gemma-3-12b-it", DisplayName: "Google: Gemma 3 12B", ContextWindow: 131072, MaxOutput: 16384, Reasoning: false, PriceInput: 0.04, PriceOutput: 0.13, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "google/gemma-3-27b-it", DisplayName: "Google: Gemma 3 27B", ContextWindow: 131072, MaxOutput: 16384, Reasoning: false, PriceInput: 0.08, PriceOutput: 0.16, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "google/gemma-4-26b-a4b-it", DisplayName: "Google: Gemma 4 26B A4B ", ContextWindow: 262144, MaxOutput: 4096, Reasoning: true, PriceInput: 0.06, PriceOutput: 0.33, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "google/gemma-4-26b-a4b-it:free", DisplayName: "Google: Gemma 4 26B A4B (free)", ContextWindow: 262144, MaxOutput: 32768, Reasoning: true, PriceInput: 0, PriceOutput: 0, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "google/gemma-4-31b-it", DisplayName: "Google: Gemma 4 31B", ContextWindow: 262144, MaxOutput: 16384, Reasoning: true, PriceInput: 0.12, PriceOutput: 0.37, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "google/gemma-4-31b-it:free", DisplayName: "Google: Gemma 4 31B (free)", ContextWindow: 262144, MaxOutput: 32768, Reasoning: true, PriceInput: 0, PriceOutput: 0, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "ibm-granite/granite-4.1-8b", DisplayName: "IBM: Granite 4.1 8B", ContextWindow: 131072, MaxOutput: 131072, Reasoning: false, PriceInput: 0.05, PriceOutput: 0.1, PriceCacheRead: 0.05, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "inception/mercury-2", DisplayName: "Inception: Mercury 2", ContextWindow: 128000, MaxOutput: 50000, Reasoning: true, PriceInput: 0.25, PriceOutput: 0.75, PriceCacheRead: 0.025, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "inclusionai/ling-2.6-1t", DisplayName: "inclusionAI: Ling-2.6-1T", ContextWindow: 262144, MaxOutput: 32768, Reasoning: false, PriceInput: 0.075, PriceOutput: 0.625, PriceCacheRead: 0.015, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "inclusionai/ling-2.6-flash", DisplayName: "inclusionAI: Ling-2.6-flash", ContextWindow: 262144, MaxOutput: 32768, Reasoning: false, PriceInput: 0.01, PriceOutput: 0.03, PriceCacheRead: 0.002, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "inclusionai/ring-2.6-1t", DisplayName: "inclusionAI: Ring-2.6-1T", ContextWindow: 262144, MaxOutput: 65536, Reasoning: true, PriceInput: 0.075, PriceOutput: 0.625, PriceCacheRead: 0.015, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "kwaipilot/kat-coder-pro-v2", DisplayName: "Kwaipilot: KAT-Coder-Pro V2", ContextWindow: 256000, MaxOutput: 80000, Reasoning: false, PriceInput: 0.3, PriceOutput: 1.2, PriceCacheRead: 0.06, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "meta-llama/llama-3.1-70b-instruct", DisplayName: "Meta: Llama 3.1 70B Instruct", ContextWindow: 131072, MaxOutput: 16384, Reasoning: false, PriceInput: 0.4, PriceOutput: 0.4, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "meta-llama/llama-3.1-8b-instruct", DisplayName: "Meta: Llama 3.1 8B Instruct", ContextWindow: 131072, MaxOutput: 16384, Reasoning: false, PriceInput: 0.02, PriceOutput: 0.05, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "meta-llama/llama-3.3-70b-instruct", DisplayName: "Meta: Llama 3.3 70B Instruct", ContextWindow: 131072, MaxOutput: 16384, Reasoning: false, PriceInput: 0.1, PriceOutput: 0.32, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "meta-llama/llama-3.3-70b-instruct:free", DisplayName: "Meta: Llama 3.3 70B Instruct (free)", ContextWindow: 131072, MaxOutput: 4096, Reasoning: false, PriceInput: 0, PriceOutput: 0, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "meta-llama/llama-4-scout", DisplayName: "Meta: Llama 4 Scout", ContextWindow: 10000000, MaxOutput: 16384, Reasoning: false, PriceInput: 0.08, PriceOutput: 0.3, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "minimax/minimax-m1", DisplayName: "MiniMax: MiniMax M1", ContextWindow: 1000000, MaxOutput: 40000, Reasoning: true, PriceInput: 0.4, PriceOutput: 2.2, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "minimax/minimax-m2", DisplayName: "MiniMax: MiniMax M2", ContextWindow: 204800, MaxOutput: 196608, Reasoning: true, PriceInput: 0.255, PriceOutput: 1, PriceCacheRead: 0.03, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "minimax/minimax-m2.1", DisplayName: "MiniMax: MiniMax M2.1", ContextWindow: 204800, MaxOutput: 196608, Reasoning: true, PriceInput: 0.29, PriceOutput: 0.95, PriceCacheRead: 0.03, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "minimax/minimax-m2.5", DisplayName: "MiniMax: MiniMax M2.5", ContextWindow: 204800, MaxOutput: 196608, Reasoning: true, PriceInput: 0.15, PriceOutput: 1.15, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "minimax/minimax-m2.5:free", DisplayName: "MiniMax: MiniMax M2.5 (free)", ContextWindow: 204800, MaxOutput: 8192, Reasoning: true, PriceInput: 0, PriceOutput: 0, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "minimax/minimax-m2.7", DisplayName: "MiniMax: MiniMax M2.7", ContextWindow: 204800, MaxOutput: 131072, Reasoning: true, PriceInput: 0.279, PriceOutput: 1.2, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "mistralai/codestral-2508", DisplayName: "Mistral: Codestral 2508", ContextWindow: 256000, MaxOutput: 4096, Reasoning: false, PriceInput: 0.3, PriceOutput: 0.9, PriceCacheRead: 0.03, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "mistralai/devstral-2512", DisplayName: "Mistral: Devstral 2 2512", ContextWindow: 262144, MaxOutput: 4096, Reasoning: false, PriceInput: 0.4, PriceOutput: 2, PriceCacheRead: 0.04, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "mistralai/devstral-medium", DisplayName: "Mistral: Devstral Medium", ContextWindow: 131072, MaxOutput: 4096, Reasoning: false, PriceInput: 0.4, PriceOutput: 2, PriceCacheRead: 0.04, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "mistralai/devstral-small", DisplayName: "Mistral: Devstral Small 1.1", ContextWindow: 131072, MaxOutput: 4096, Reasoning: false, PriceInput: 0.1, PriceOutput: 0.3, PriceCacheRead: 0.01, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "mistralai/ministral-14b-2512", DisplayName: "Mistral: Ministral 3 14B 2512", ContextWindow: 262144, MaxOutput: 4096, Reasoning: false, PriceInput: 0.2, PriceOutput: 0.2, PriceCacheRead: 0.02, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "mistralai/ministral-3b-2512", DisplayName: "Mistral: Ministral 3 3B 2512", ContextWindow: 131072, MaxOutput: 4096, Reasoning: false, PriceInput: 0.1, PriceOutput: 0.1, PriceCacheRead: 0.01, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "mistralai/ministral-8b-2512", DisplayName: "Mistral: Ministral 3 8B 2512", ContextWindow: 262144, MaxOutput: 4096, Reasoning: false, PriceInput: 0.15, PriceOutput: 0.15, PriceCacheRead: 0.015, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "mistralai/mistral-large", DisplayName: "Mistral Large", ContextWindow: 128000, MaxOutput: 4096, Reasoning: false, PriceInput: 2, PriceOutput: 6, PriceCacheRead: 0.2, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "mistralai/mistral-large-2407", DisplayName: "Mistral Large 2407", ContextWindow: 131072, MaxOutput: 4096, Reasoning: false, PriceInput: 2, PriceOutput: 6, PriceCacheRead: 0.2, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "mistralai/mistral-large-2411", DisplayName: "Mistral Large 2411", ContextWindow: 131072, MaxOutput: 4096, Reasoning: false, PriceInput: 2, PriceOutput: 6, PriceCacheRead: 0.2, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "mistralai/mistral-large-2512", DisplayName: "Mistral: Mistral Large 3 2512", ContextWindow: 262144, MaxOutput: 4096, Reasoning: false, PriceInput: 0.5, PriceOutput: 1.5, PriceCacheRead: 0.05, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "mistralai/mistral-medium-3", DisplayName: "Mistral: Mistral Medium 3", ContextWindow: 131072, MaxOutput: 4096, Reasoning: false, PriceInput: 0.4, PriceOutput: 2, PriceCacheRead: 0.04, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "mistralai/mistral-medium-3-5", DisplayName: "Mistral: Mistral Medium 3.5", ContextWindow: 262144, MaxOutput: 4096, Reasoning: true, PriceInput: 1.5, PriceOutput: 7.5, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "mistralai/mistral-medium-3.1", DisplayName: "Mistral: Mistral Medium 3.1", ContextWindow: 131072, MaxOutput: 4096, Reasoning: false, PriceInput: 0.4, PriceOutput: 2, PriceCacheRead: 0.04, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "mistralai/mistral-nemo", DisplayName: "Mistral: Mistral Nemo", ContextWindow: 131072, MaxOutput: 4096, Reasoning: false, PriceInput: 0.02, PriceOutput: 0.03, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "mistralai/mistral-saba", DisplayName: "Mistral: Saba", ContextWindow: 32768, MaxOutput: 4096, Reasoning: false, PriceInput: 0.2, PriceOutput: 0.6, PriceCacheRead: 0.02, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "mistralai/mistral-small-2603", DisplayName: "Mistral: Mistral Small 4", ContextWindow: 262144, MaxOutput: 4096, Reasoning: true, PriceInput: 0.15, PriceOutput: 0.6, PriceCacheRead: 0.015, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "mistralai/mistral-small-3.2-24b-instruct", DisplayName: "Mistral: Mistral Small 3.2 24B", ContextWindow: 128000, MaxOutput: 16384, Reasoning: false, PriceInput: 0.075, PriceOutput: 0.2, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "mistralai/mixtral-8x22b-instruct", DisplayName: "Mistral: Mixtral 8x22B Instruct", ContextWindow: 65536, MaxOutput: 4096, Reasoning: false, PriceInput: 2, PriceOutput: 6, PriceCacheRead: 0.2, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "mistralai/pixtral-large-2411", DisplayName: "Mistral: Pixtral Large 2411", ContextWindow: 131072, MaxOutput: 4096, Reasoning: false, PriceInput: 2, PriceOutput: 6, PriceCacheRead: 0.2, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "mistralai/voxtral-small-24b-2507", DisplayName: "Mistral: Voxtral Small 24B 2507", ContextWindow: 32000, MaxOutput: 4096, Reasoning: false, PriceInput: 0.1, PriceOutput: 0.3, PriceCacheRead: 0.01, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "moonshotai/kimi-k2", DisplayName: "MoonshotAI: Kimi K2 0711", ContextWindow: 131072, MaxOutput: 32768, Reasoning: false, PriceInput: 0.57, PriceOutput: 2.3, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "moonshotai/kimi-k2-0905", DisplayName: "MoonshotAI: Kimi K2 0905", ContextWindow: 262144, MaxOutput: 262144, Reasoning: false, PriceInput: 0.6, PriceOutput: 2.5, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "moonshotai/kimi-k2-thinking", DisplayName: "MoonshotAI: Kimi K2 Thinking", ContextWindow: 262144, MaxOutput: 262144, Reasoning: true, PriceInput: 0.6, PriceOutput: 2.5, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "moonshotai/kimi-k2.5", DisplayName: "MoonshotAI: Kimi K2.5", ContextWindow: 262144, MaxOutput: 4096, Reasoning: true, PriceInput: 0.41, PriceOutput: 2.06, PriceCacheRead: 0.07, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "moonshotai/kimi-k2.6", DisplayName: "MoonshotAI: Kimi K2.6", ContextWindow: 262144, MaxOutput: 262142, Reasoning: true, PriceInput: 0.73, PriceOutput: 3.49, PriceCacheRead: 0.25, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "nex-agi/deepseek-v3.1-nex-n1", DisplayName: "Nex AGI: DeepSeek V3.1 Nex N1", ContextWindow: 131072, MaxOutput: 163840, Reasoning: false, PriceInput: 0.135, PriceOutput: 0.5, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "nvidia/llama-3.3-nemotron-super-49b-v1.5", DisplayName: "NVIDIA: Llama 3.3 Nemotron Super 49B V1.5", ContextWindow: 131072, MaxOutput: 16384, Reasoning: true, PriceInput: 0.1, PriceOutput: 0.4, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "nvidia/nemotron-3-nano-30b-a3b", DisplayName: "NVIDIA: Nemotron 3 Nano 30B A3B", ContextWindow: 262144, MaxOutput: 228000, Reasoning: true, PriceInput: 0.05, PriceOutput: 0.2, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "nvidia/nemotron-3-nano-30b-a3b:free", DisplayName: "NVIDIA: Nemotron 3 Nano 30B A3B (free)", ContextWindow: 256000, MaxOutput: 4096, Reasoning: true, PriceInput: 0, PriceOutput: 0, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free", DisplayName: "NVIDIA: Nemotron 3 Nano Omni (free)", ContextWindow: 256000, MaxOutput: 65536, Reasoning: true, PriceInput: 0, PriceOutput: 0, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "nvidia/nemotron-3-super-120b-a12b", DisplayName: "NVIDIA: Nemotron 3 Super", ContextWindow: 1000000, MaxOutput: 4096, Reasoning: true, PriceInput: 0.09, PriceOutput: 0.45, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "nvidia/nemotron-3-super-120b-a12b:free", DisplayName: "NVIDIA: Nemotron 3 Super (free)", ContextWindow: 1000000, MaxOutput: 262144, Reasoning: true, PriceInput: 0, PriceOutput: 0, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "nvidia/nemotron-3-ultra-550b-a55b", DisplayName: "NVIDIA: Nemotron 3 Ultra", ContextWindow: 1000000, MaxOutput: 16384, Reasoning: true, PriceInput: 0.5, PriceOutput: 2.5, PriceCacheRead: 0.15, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "nvidia/nemotron-3-ultra-550b-a55b:free", DisplayName: "NVIDIA: Nemotron 3 Ultra (free)", ContextWindow: 1000000, MaxOutput: 65536, Reasoning: true, PriceInput: 0, PriceOutput: 0, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "nvidia/nemotron-nano-12b-v2-vl:free", DisplayName: "NVIDIA: Nemotron Nano 12B 2 VL (free)", ContextWindow: 128000, MaxOutput: 128000, Reasoning: true, PriceInput: 0, PriceOutput: 0, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "nvidia/nemotron-nano-9b-v2", DisplayName: "NVIDIA: Nemotron Nano 9B V2", ContextWindow: 131072, MaxOutput: 16384, Reasoning: true, PriceInput: 0.04, PriceOutput: 0.16, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "nvidia/nemotron-nano-9b-v2:free", DisplayName: "NVIDIA: Nemotron Nano 9B V2 (free)", ContextWindow: 128000, MaxOutput: 4096, Reasoning: true, PriceInput: 0, PriceOutput: 0, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-3.5-turbo", DisplayName: "OpenAI: GPT-3.5 Turbo", ContextWindow: 16385, MaxOutput: 4096, Reasoning: false, PriceInput: 0.5, PriceOutput: 1.5, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-3.5-turbo-0613", DisplayName: "OpenAI: GPT-3.5 Turbo (older v0613)", ContextWindow: 4095, MaxOutput: 4096, Reasoning: false, PriceInput: 1, PriceOutput: 2, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-3.5-turbo-16k", DisplayName: "OpenAI: GPT-3.5 Turbo 16k", ContextWindow: 16385, MaxOutput: 4096, Reasoning: false, PriceInput: 3, PriceOutput: 4, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-4", DisplayName: "OpenAI: GPT-4", ContextWindow: 8191, MaxOutput: 4096, Reasoning: false, PriceInput: 30, PriceOutput: 60, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-4-0314", DisplayName: "OpenAI: GPT-4 (older v0314)", ContextWindow: 8191, MaxOutput: 4096, Reasoning: false, PriceInput: 30, PriceOutput: 60, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-4-1106-preview", DisplayName: "OpenAI: GPT-4 Turbo (older v1106)", ContextWindow: 128000, MaxOutput: 4096, Reasoning: false, PriceInput: 10, PriceOutput: 30, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-4-turbo", DisplayName: "OpenAI: GPT-4 Turbo", ContextWindow: 128000, MaxOutput: 4096, Reasoning: false, PriceInput: 10, PriceOutput: 30, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-4-turbo-preview", DisplayName: "OpenAI: GPT-4 Turbo Preview", ContextWindow: 128000, MaxOutput: 4096, Reasoning: false, PriceInput: 10, PriceOutput: 30, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-4.1", DisplayName: "OpenAI: GPT-4.1", ContextWindow: 1047576, MaxOutput: 4096, Reasoning: false, PriceInput: 2, PriceOutput: 8, PriceCacheRead: 0.5, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-4.1-mini", DisplayName: "OpenAI: GPT-4.1 Mini", ContextWindow: 1047576, MaxOutput: 32768, Reasoning: false, PriceInput: 0.4, PriceOutput: 1.6, PriceCacheRead: 0.1, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-4.1-nano", DisplayName: "OpenAI: GPT-4.1 Nano", ContextWindow: 1047576, MaxOutput: 32768, Reasoning: false, PriceInput: 0.1, PriceOutput: 0.4, PriceCacheRead: 0.025, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-4o", DisplayName: "OpenAI: GPT-4o", ContextWindow: 128000, MaxOutput: 16384, Reasoning: false, PriceInput: 2.5, PriceOutput: 10, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-4o-2024-05-13", DisplayName: "OpenAI: GPT-4o (2024-05-13)", ContextWindow: 128000, MaxOutput: 4096, Reasoning: false, PriceInput: 5, PriceOutput: 15, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-4o-2024-08-06", DisplayName: "OpenAI: GPT-4o (2024-08-06)", ContextWindow: 128000, MaxOutput: 16384, Reasoning: false, PriceInput: 2.5, PriceOutput: 10, PriceCacheRead: 1.25, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-4o-2024-11-20", DisplayName: "OpenAI: GPT-4o (2024-11-20)", ContextWindow: 128000, MaxOutput: 16384, Reasoning: false, PriceInput: 2.5, PriceOutput: 10, PriceCacheRead: 1.25, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-4o-audio-preview", DisplayName: "OpenAI: GPT-4o Audio", ContextWindow: 128000, MaxOutput: 16384, Reasoning: false, PriceInput: 2.5, PriceOutput: 10, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-4o-mini", DisplayName: "OpenAI: GPT-4o-mini", ContextWindow: 128000, MaxOutput: 16384, Reasoning: false, PriceInput: 0.15, PriceOutput: 0.6, PriceCacheRead: 0.075, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-4o-mini-2024-07-18", DisplayName: "OpenAI: GPT-4o-mini (2024-07-18)", ContextWindow: 128000, MaxOutput: 16384, Reasoning: false, PriceInput: 0.15, PriceOutput: 0.6, PriceCacheRead: 0.075, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-5", DisplayName: "OpenAI: GPT-5", ContextWindow: 400000, MaxOutput: 128000, Reasoning: true, PriceInput: 1.25, PriceOutput: 10, PriceCacheRead: 0.125, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-5-codex", DisplayName: "OpenAI: GPT-5 Codex", ContextWindow: 400000, MaxOutput: 128000, Reasoning: true, PriceInput: 1.25, PriceOutput: 10, PriceCacheRead: 0.125, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-5-mini", DisplayName: "OpenAI: GPT-5 Mini", ContextWindow: 400000, MaxOutput: 128000, Reasoning: true, PriceInput: 0.25, PriceOutput: 2, PriceCacheRead: 0.025, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-5-nano", DisplayName: "OpenAI: GPT-5 Nano", ContextWindow: 400000, MaxOutput: 4096, Reasoning: true, PriceInput: 0.05, PriceOutput: 0.4, PriceCacheRead: 0.01, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-5-pro", DisplayName: "OpenAI: GPT-5 Pro", ContextWindow: 400000, MaxOutput: 128000, Reasoning: true, PriceInput: 15, PriceOutput: 120, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-5.1", DisplayName: "OpenAI: GPT-5.1", ContextWindow: 400000, MaxOutput: 128000, Reasoning: true, PriceInput: 1.25, PriceOutput: 10, PriceCacheRead: 0.13, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-5.1-chat", DisplayName: "OpenAI: GPT-5.1 Chat", ContextWindow: 128000, MaxOutput: 16384, Reasoning: false, PriceInput: 1.25, PriceOutput: 10, PriceCacheRead: 0.125, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-5.1-codex", DisplayName: "OpenAI: GPT-5.1-Codex", ContextWindow: 400000, MaxOutput: 128000, Reasoning: true, PriceInput: 1.25, PriceOutput: 10, PriceCacheRead: 0.125, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-5.1-codex-max", DisplayName: "OpenAI: GPT-5.1-Codex-Max", ContextWindow: 400000, MaxOutput: 128000, Reasoning: true, PriceInput: 1.25, PriceOutput: 10, PriceCacheRead: 0.125, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-5.1-codex-mini", DisplayName: "OpenAI: GPT-5.1-Codex-Mini", ContextWindow: 400000, MaxOutput: 128000, Reasoning: true, PriceInput: 0.25, PriceOutput: 2, PriceCacheRead: 0.03, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-5.2", DisplayName: "OpenAI: GPT-5.2", ContextWindow: 400000, MaxOutput: 128000, Reasoning: true, PriceInput: 1.75, PriceOutput: 14, PriceCacheRead: 0.175, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-5.2-chat", DisplayName: "OpenAI: GPT-5.2 Chat", ContextWindow: 128000, MaxOutput: 32000, Reasoning: false, PriceInput: 1.75, PriceOutput: 14, PriceCacheRead: 0.175, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-5.2-codex", DisplayName: "OpenAI: GPT-5.2-Codex", ContextWindow: 400000, MaxOutput: 128000, Reasoning: true, PriceInput: 1.75, PriceOutput: 14, PriceCacheRead: 0.175, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-5.2-pro", DisplayName: "OpenAI: GPT-5.2 Pro", ContextWindow: 400000, MaxOutput: 128000, Reasoning: true, PriceInput: 21, PriceOutput: 168, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-5.3-chat", DisplayName: "OpenAI: GPT-5.3 Chat", ContextWindow: 128000, MaxOutput: 16384, Reasoning: false, PriceInput: 1.75, PriceOutput: 14, PriceCacheRead: 0.175, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-5.3-codex", DisplayName: "OpenAI: GPT-5.3-Codex", ContextWindow: 400000, MaxOutput: 128000, Reasoning: true, PriceInput: 1.75, PriceOutput: 14, PriceCacheRead: 0.175, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-5.4", DisplayName: "OpenAI: GPT-5.4", ContextWindow: 1050000, MaxOutput: 128000, Reasoning: true, PriceInput: 2.5, PriceOutput: 15, PriceCacheRead: 0.25, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-5.4-mini", DisplayName: "OpenAI: GPT-5.4 Mini", ContextWindow: 400000, MaxOutput: 128000, Reasoning: true, PriceInput: 0.75, PriceOutput: 4.5, PriceCacheRead: 0.075, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-5.4-nano", DisplayName: "OpenAI: GPT-5.4 Nano", ContextWindow: 400000, MaxOutput: 128000, Reasoning: true, PriceInput: 0.2, PriceOutput: 1.25, PriceCacheRead: 0.02, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-5.4-pro", DisplayName: "OpenAI: GPT-5.4 Pro", ContextWindow: 1050000, MaxOutput: 128000, Reasoning: true, PriceInput: 30, PriceOutput: 180, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-5.5", DisplayName: "OpenAI: GPT-5.5", ContextWindow: 1050000, MaxOutput: 128000, Reasoning: true, PriceInput: 5, PriceOutput: 30, PriceCacheRead: 0.5, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-5.5-pro", DisplayName: "OpenAI: GPT-5.5 Pro", ContextWindow: 1050000, MaxOutput: 128000, Reasoning: true, PriceInput: 30, PriceOutput: 180, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-audio", DisplayName: "OpenAI: GPT Audio", ContextWindow: 128000, MaxOutput: 16384, Reasoning: false, PriceInput: 2.5, PriceOutput: 10, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-audio-mini", DisplayName: "OpenAI: GPT Audio Mini", ContextWindow: 128000, MaxOutput: 16384, Reasoning: false, PriceInput: 0.6, PriceOutput: 2.4, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-chat-latest", DisplayName: "OpenAI: GPT Chat Latest", ContextWindow: 400000, MaxOutput: 128000, Reasoning: false, PriceInput: 5, PriceOutput: 30, PriceCacheRead: 0.5, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-oss-120b", DisplayName: "OpenAI: gpt-oss-120b", ContextWindow: 131072, MaxOutput: 4096, Reasoning: true, PriceInput: 0.039, PriceOutput: 0.18, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-oss-120b:free", DisplayName: "OpenAI: gpt-oss-120b (free)", ContextWindow: 131072, MaxOutput: 131072, Reasoning: true, PriceInput: 0, PriceOutput: 0, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-oss-20b", DisplayName: "OpenAI: gpt-oss-20b", ContextWindow: 131072, MaxOutput: 131072, Reasoning: true, PriceInput: 0.03, PriceOutput: 0.14, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-oss-20b:free", DisplayName: "OpenAI: gpt-oss-20b (free)", ContextWindow: 131072, MaxOutput: 8192, Reasoning: true, PriceInput: 0, PriceOutput: 0, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/gpt-oss-safeguard-20b", DisplayName: "OpenAI: gpt-oss-safeguard-20b", ContextWindow: 131072, MaxOutput: 65536, Reasoning: true, PriceInput: 0.075, PriceOutput: 0.3, PriceCacheRead: 0.037, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/o1", DisplayName: "OpenAI: o1", ContextWindow: 200000, MaxOutput: 100000, Reasoning: true, PriceInput: 15, PriceOutput: 60, PriceCacheRead: 7.5, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/o3", DisplayName: "OpenAI: o3", ContextWindow: 200000, MaxOutput: 100000, Reasoning: true, PriceInput: 2, PriceOutput: 8, PriceCacheRead: 0.5, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/o3-deep-research", DisplayName: "OpenAI: o3 Deep Research", ContextWindow: 200000, MaxOutput: 100000, Reasoning: true, PriceInput: 10, PriceOutput: 40, PriceCacheRead: 2.5, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/o3-mini", DisplayName: "OpenAI: o3 Mini", ContextWindow: 200000, MaxOutput: 100000, Reasoning: true, PriceInput: 1.1, PriceOutput: 4.4, PriceCacheRead: 0.55, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/o3-mini-high", DisplayName: "OpenAI: o3 Mini High", ContextWindow: 200000, MaxOutput: 100000, Reasoning: true, PriceInput: 1.1, PriceOutput: 4.4, PriceCacheRead: 0.55, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/o3-pro", DisplayName: "OpenAI: o3 Pro", ContextWindow: 200000, MaxOutput: 100000, Reasoning: true, PriceInput: 20, PriceOutput: 80, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/o4-mini", DisplayName: "OpenAI: o4 Mini", ContextWindow: 200000, MaxOutput: 100000, Reasoning: true, PriceInput: 1.1, PriceOutput: 4.4, PriceCacheRead: 0.275, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/o4-mini-deep-research", DisplayName: "OpenAI: o4 Mini Deep Research", ContextWindow: 200000, MaxOutput: 100000, Reasoning: true, PriceInput: 2, PriceOutput: 8, PriceCacheRead: 0.5, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openai/o4-mini-high", DisplayName: "OpenAI: o4 Mini High", ContextWindow: 200000, MaxOutput: 100000, Reasoning: true, PriceInput: 1.1, PriceOutput: 4.4, PriceCacheRead: 0.275, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openrouter/auto", DisplayName: "Auto Router", ContextWindow: 2000000, MaxOutput: 4096, Reasoning: true, PriceInput: -1000000, PriceOutput: -1000000, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openrouter/free", DisplayName: "Free Models Router", ContextWindow: 200000, MaxOutput: 4096, Reasoning: true, PriceInput: 0, PriceOutput: 0, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "openrouter/owl-alpha", DisplayName: "Owl Alpha", ContextWindow: 1048756, MaxOutput: 262144, Reasoning: false, PriceInput: 0, PriceOutput: 0, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "poolside/laguna-m.1:free", DisplayName: "Poolside: Laguna M.1 (free)", ContextWindow: 131072, MaxOutput: 8192, Reasoning: true, PriceInput: 0, PriceOutput: 0, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "poolside/laguna-xs.2:free", DisplayName: "Poolside: Laguna XS.2 (free)", ContextWindow: 131072, MaxOutput: 8192, Reasoning: true, PriceInput: 0, PriceOutput: 0, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "prime-intellect/intellect-3", DisplayName: "Prime Intellect: INTELLECT-3", ContextWindow: 131072, MaxOutput: 131072, Reasoning: true, PriceInput: 0.2, PriceOutput: 1.1, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen-2.5-72b-instruct", DisplayName: "Qwen2.5 72B Instruct", ContextWindow: 131072, MaxOutput: 16384, Reasoning: false, PriceInput: 0.36, PriceOutput: 0.4, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen-2.5-7b-instruct", DisplayName: "Qwen: Qwen2.5 7B Instruct", ContextWindow: 131072, MaxOutput: 32768, Reasoning: false, PriceInput: 0.04, PriceOutput: 0.1, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen-plus", DisplayName: "Qwen: Qwen-Plus", ContextWindow: 1000000, MaxOutput: 32768, Reasoning: false, PriceInput: 0.26, PriceOutput: 0.78, PriceCacheRead: 0.052, PriceCacheWrite: 0.325, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen-plus-2025-07-28", DisplayName: "Qwen: Qwen Plus 0728", ContextWindow: 1000000, MaxOutput: 32768, Reasoning: false, PriceInput: 0.26, PriceOutput: 0.78, PriceCacheRead: 0, PriceCacheWrite: 0.325, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen-plus-2025-07-28:thinking", DisplayName: "Qwen: Qwen Plus 0728 (thinking)", ContextWindow: 1000000, MaxOutput: 32768, Reasoning: true, PriceInput: 0.26, PriceOutput: 0.78, PriceCacheRead: 0, PriceCacheWrite: 0.325, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3-14b", DisplayName: "Qwen: Qwen3 14B", ContextWindow: 131702, MaxOutput: 40960, Reasoning: true, PriceInput: 0.1, PriceOutput: 0.24, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3-235b-a22b", DisplayName: "Qwen: Qwen3 235B A22B", ContextWindow: 131072, MaxOutput: 8192, Reasoning: true, PriceInput: 0.455, PriceOutput: 1.82, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3-235b-a22b-2507", DisplayName: "Qwen: Qwen3 235B A22B Instruct 2507", ContextWindow: 262144, MaxOutput: 16384, Reasoning: false, PriceInput: 0.071, PriceOutput: 0.1, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3-235b-a22b-thinking-2507", DisplayName: "Qwen: Qwen3 235B A22B Thinking 2507", ContextWindow: 262144, MaxOutput: 4096, Reasoning: true, PriceInput: 0.1495, PriceOutput: 1.495, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3-30b-a3b", DisplayName: "Qwen: Qwen3 30B A3B", ContextWindow: 131072, MaxOutput: 20000, Reasoning: true, PriceInput: 0.09, PriceOutput: 0.45, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3-30b-a3b-instruct-2507", DisplayName: "Qwen: Qwen3 30B A3B Instruct 2507", ContextWindow: 262144, MaxOutput: 262144, Reasoning: false, PriceInput: 0.09, PriceOutput: 0.3, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3-30b-a3b-thinking-2507", DisplayName: "Qwen: Qwen3 30B A3B Thinking 2507", ContextWindow: 131072, MaxOutput: 131072, Reasoning: true, PriceInput: 0.08, PriceOutput: 0.4, PriceCacheRead: 0.08, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3-32b", DisplayName: "Qwen: Qwen3 32B", ContextWindow: 131072, MaxOutput: 16384, Reasoning: true, PriceInput: 0.08, PriceOutput: 0.28, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3-8b", DisplayName: "Qwen: Qwen3 8B", ContextWindow: 131072, MaxOutput: 8192, Reasoning: true, PriceInput: 0.05, PriceOutput: 0.4, PriceCacheRead: 0.05, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3-coder", DisplayName: "Qwen: Qwen3 Coder 480B A35B", ContextWindow: 1048576, MaxOutput: 65536, Reasoning: false, PriceInput: 0.22, PriceOutput: 1.8, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3-coder-30b-a3b-instruct", DisplayName: "Qwen: Qwen3 Coder 30B A3B Instruct", ContextWindow: 160000, MaxOutput: 32768, Reasoning: false, PriceInput: 0.07, PriceOutput: 0.27, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3-coder-flash", DisplayName: "Qwen: Qwen3 Coder Flash", ContextWindow: 1000000, MaxOutput: 65536, Reasoning: false, PriceInput: 0.195, PriceOutput: 0.975, PriceCacheRead: 0.039, PriceCacheWrite: 0.24375, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3-coder-next", DisplayName: "Qwen: Qwen3 Coder Next", ContextWindow: 262144, MaxOutput: 262144, Reasoning: false, PriceInput: 0.11, PriceOutput: 0.8, PriceCacheRead: 0.07, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3-coder-plus", DisplayName: "Qwen: Qwen3 Coder Plus", ContextWindow: 1000000, MaxOutput: 65536, Reasoning: false, PriceInput: 0.65, PriceOutput: 3.25, PriceCacheRead: 0.13, PriceCacheWrite: 0.8125, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3-coder:free", DisplayName: "Qwen: Qwen3 Coder 480B A35B (free)", ContextWindow: 1048576, MaxOutput: 262000, Reasoning: false, PriceInput: 0, PriceOutput: 0, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3-max", DisplayName: "Qwen: Qwen3 Max", ContextWindow: 262144, MaxOutput: 32768, Reasoning: false, PriceInput: 0.78, PriceOutput: 3.9, PriceCacheRead: 0.156, PriceCacheWrite: 0.975, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3-max-thinking", DisplayName: "Qwen: Qwen3 Max Thinking", ContextWindow: 262144, MaxOutput: 32768, Reasoning: true, PriceInput: 0.78, PriceOutput: 3.9, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3-next-80b-a3b-instruct", DisplayName: "Qwen: Qwen3 Next 80B A3B Instruct", ContextWindow: 262144, MaxOutput: 16384, Reasoning: false, PriceInput: 0.09, PriceOutput: 1.1, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3-next-80b-a3b-instruct:free", DisplayName: "Qwen: Qwen3 Next 80B A3B Instruct (free)", ContextWindow: 262144, MaxOutput: 4096, Reasoning: false, PriceInput: 0, PriceOutput: 0, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3-next-80b-a3b-thinking", DisplayName: "Qwen: Qwen3 Next 80B A3B Thinking", ContextWindow: 262144, MaxOutput: 32768, Reasoning: true, PriceInput: 0.0975, PriceOutput: 0.78, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3-vl-235b-a22b-instruct", DisplayName: "Qwen: Qwen3 VL 235B A22B Instruct", ContextWindow: 262144, MaxOutput: 16384, Reasoning: false, PriceInput: 0.2, PriceOutput: 0.88, PriceCacheRead: 0.11, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3-vl-235b-a22b-thinking", DisplayName: "Qwen: Qwen3 VL 235B A22B Thinking", ContextWindow: 131072, MaxOutput: 32768, Reasoning: true, PriceInput: 0.26, PriceOutput: 2.6, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3-vl-30b-a3b-instruct", DisplayName: "Qwen: Qwen3 VL 30B A3B Instruct", ContextWindow: 262144, MaxOutput: 32768, Reasoning: false, PriceInput: 0.13, PriceOutput: 0.52, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3-vl-30b-a3b-thinking", DisplayName: "Qwen: Qwen3 VL 30B A3B Thinking", ContextWindow: 131072, MaxOutput: 32768, Reasoning: true, PriceInput: 0.13, PriceOutput: 1.56, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3-vl-32b-instruct", DisplayName: "Qwen: Qwen3 VL 32B Instruct", ContextWindow: 262144, MaxOutput: 32768, Reasoning: false, PriceInput: 0.104, PriceOutput: 0.416, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3-vl-8b-instruct", DisplayName: "Qwen: Qwen3 VL 8B Instruct", ContextWindow: 256000, MaxOutput: 32768, Reasoning: false, PriceInput: 0.08, PriceOutput: 0.5, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3-vl-8b-thinking", DisplayName: "Qwen: Qwen3 VL 8B Thinking", ContextWindow: 256000, MaxOutput: 32768, Reasoning: true, PriceInput: 0.117, PriceOutput: 1.365, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3.5-122b-a10b", DisplayName: "Qwen: Qwen3.5-122B-A10B", ContextWindow: 262144, MaxOutput: 262144, Reasoning: true, PriceInput: 0.26, PriceOutput: 2.08, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3.5-27b", DisplayName: "Qwen: Qwen3.5-27B", ContextWindow: 262144, MaxOutput: 65536, Reasoning: true, PriceInput: 0.195, PriceOutput: 1.56, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3.5-35b-a3b", DisplayName: "Qwen: Qwen3.5-35B-A3B", ContextWindow: 262144, MaxOutput: 4096, Reasoning: true, PriceInput: 0.139, PriceOutput: 1, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3.5-397b-a17b", DisplayName: "Qwen: Qwen3.5 397B A17B", ContextWindow: 262144, MaxOutput: 65536, Reasoning: true, PriceInput: 0.39, PriceOutput: 2.34, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3.5-9b", DisplayName: "Qwen: Qwen3.5-9B", ContextWindow: 262144, MaxOutput: 81920, Reasoning: true, PriceInput: 0.04, PriceOutput: 0.15, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3.5-flash-02-23", DisplayName: "Qwen: Qwen3.5-Flash", ContextWindow: 1000000, MaxOutput: 65536, Reasoning: true, PriceInput: 0.065, PriceOutput: 0.26, PriceCacheRead: 0, PriceCacheWrite: 0.08125, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3.5-plus-02-15", DisplayName: "Qwen: Qwen3.5 Plus 2026-02-15", ContextWindow: 1000000, MaxOutput: 65536, Reasoning: true, PriceInput: 0.26, PriceOutput: 1.56, PriceCacheRead: 0, PriceCacheWrite: 0.325, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3.5-plus-20260420", DisplayName: "Qwen: Qwen3.5 Plus 2026-04-20", ContextWindow: 1000000, MaxOutput: 65536, Reasoning: true, PriceInput: 0.3, PriceOutput: 1.8, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3.6-27b", DisplayName: "Qwen: Qwen3.6 27B", ContextWindow: 262144, MaxOutput: 262144, Reasoning: true, PriceInput: 0.3, PriceOutput: 3.2, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3.6-35b-a3b", DisplayName: "Qwen: Qwen3.6 35B A3B", ContextWindow: 262144, MaxOutput: 262140, Reasoning: true, PriceInput: 0.15, PriceOutput: 1, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3.6-flash", DisplayName: "Qwen: Qwen3.6 Flash", ContextWindow: 1000000, MaxOutput: 65536, Reasoning: true, PriceInput: 0.1875, PriceOutput: 1.125, PriceCacheRead: 0, PriceCacheWrite: 0.234375, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3.6-max-preview", DisplayName: "Qwen: Qwen3.6 Max Preview", ContextWindow: 262144, MaxOutput: 65536, Reasoning: true, PriceInput: 1.04, PriceOutput: 6.24, PriceCacheRead: 0, PriceCacheWrite: 1.3, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3.6-plus", DisplayName: "Qwen: Qwen3.6 Plus", ContextWindow: 1000000, MaxOutput: 65536, Reasoning: true, PriceInput: 0.325, PriceOutput: 1.95, PriceCacheRead: 0, PriceCacheWrite: 0.40625, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "qwen/qwen3.7-max", DisplayName: "Qwen: Qwen3.7 Max", ContextWindow: 1000000, MaxOutput: 65536, Reasoning: true, PriceInput: 2.5, PriceOutput: 7.5, PriceCacheRead: 0, PriceCacheWrite: 3.125, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "rekaai/reka-edge", DisplayName: "Reka Edge", ContextWindow: 16384, MaxOutput: 16384, Reasoning: false, PriceInput: 0.1, PriceOutput: 0.1, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "relace/relace-search", DisplayName: "Relace: Relace Search", ContextWindow: 256000, MaxOutput: 128000, Reasoning: false, PriceInput: 1, PriceOutput: 3, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "sao10k/l3-euryale-70b", DisplayName: "Sao10k: Llama 3 Euryale 70B v2.1", ContextWindow: 8192, MaxOutput: 8192, Reasoning: false, PriceInput: 1.48, PriceOutput: 1.48, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "sao10k/l3.1-euryale-70b", DisplayName: "Sao10K: Llama 3.1 Euryale 70B v2.2", ContextWindow: 131072, MaxOutput: 16384, Reasoning: false, PriceInput: 0.85, PriceOutput: 0.85, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "stepfun/step-3.5-flash", DisplayName: "StepFun: Step 3.5 Flash", ContextWindow: 262144, MaxOutput: 16384, Reasoning: true, PriceInput: 0.09, PriceOutput: 0.3, PriceCacheRead: 0.02, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "tencent/hy3-preview", DisplayName: "Tencent: Hy3 preview", ContextWindow: 262144, MaxOutput: 262144, Reasoning: true, PriceInput: 0.066, PriceOutput: 0.26, PriceCacheRead: 0.029, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "thedrummer/rocinante-12b", DisplayName: "TheDrummer: Rocinante 12B", ContextWindow: 32768, MaxOutput: 32768, Reasoning: false, PriceInput: 0.17, PriceOutput: 0.43, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "thedrummer/unslopnemo-12b", DisplayName: "TheDrummer: UnslopNemo 12B", ContextWindow: 32768, MaxOutput: 32768, Reasoning: false, PriceInput: 0.4, PriceOutput: 0.4, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "upstage/solar-pro-3", DisplayName: "Upstage: Solar Pro 3", ContextWindow: 128000, MaxOutput: 4096, Reasoning: true, PriceInput: 0.15, PriceOutput: 0.6, PriceCacheRead: 0.015, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "x-ai/grok-4.20", DisplayName: "xAI: Grok 4.20", ContextWindow: 2000000, MaxOutput: 4096, Reasoning: true, PriceInput: 1.25, PriceOutput: 2.5, PriceCacheRead: 0.2, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "x-ai/grok-4.3", DisplayName: "xAI: Grok 4.3", ContextWindow: 1000000, MaxOutput: 4096, Reasoning: true, PriceInput: 1.25, PriceOutput: 2.5, PriceCacheRead: 0.2, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "x-ai/grok-build-0.1", DisplayName: "xAI: Grok Build 0.1", ContextWindow: 256000, MaxOutput: 4096, Reasoning: true, PriceInput: 1, PriceOutput: 2, PriceCacheRead: 0.2, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "xiaomi/mimo-v2-flash", DisplayName: "Xiaomi: MiMo-V2-Flash", ContextWindow: 262144, MaxOutput: 65536, Reasoning: true, PriceInput: 0.1, PriceOutput: 0.3, PriceCacheRead: 0.01, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "xiaomi/mimo-v2-omni", DisplayName: "Xiaomi: MiMo-V2-Omni", ContextWindow: 262144, MaxOutput: 65536, Reasoning: true, PriceInput: 0.4, PriceOutput: 2, PriceCacheRead: 0.08, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "xiaomi/mimo-v2-pro", DisplayName: "Xiaomi: MiMo-V2-Pro", ContextWindow: 1048576, MaxOutput: 131072, Reasoning: true, PriceInput: 1, PriceOutput: 3, PriceCacheRead: 0.2, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "xiaomi/mimo-v2.5", DisplayName: "Xiaomi: MiMo-V2.5", ContextWindow: 1048576, MaxOutput: 131072, Reasoning: true, PriceInput: 0.4, PriceOutput: 2, PriceCacheRead: 0.08, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "xiaomi/mimo-v2.5-pro", DisplayName: "Xiaomi: MiMo-V2.5-Pro", ContextWindow: 1048576, MaxOutput: 16384, Reasoning: true, PriceInput: 1, PriceOutput: 3, PriceCacheRead: 0.2, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "z-ai/glm-4-32b", DisplayName: "Z.ai: GLM 4 32B ", ContextWindow: 128000, MaxOutput: 4096, Reasoning: false, PriceInput: 0.1, PriceOutput: 0.1, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "z-ai/glm-4.5", DisplayName: "Z.ai: GLM 4.5", ContextWindow: 131072, MaxOutput: 98304, Reasoning: true, PriceInput: 0.6, PriceOutput: 2.2, PriceCacheRead: 0.11, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "z-ai/glm-4.5-air", DisplayName: "Z.ai: GLM 4.5 Air", ContextWindow: 131072, MaxOutput: 98304, Reasoning: true, PriceInput: 0.13, PriceOutput: 0.85, PriceCacheRead: 0.025, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "z-ai/glm-4.5-air:free", DisplayName: "Z.ai: GLM 4.5 Air (free)", ContextWindow: 131072, MaxOutput: 96000, Reasoning: true, PriceInput: 0, PriceOutput: 0, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "z-ai/glm-4.5v", DisplayName: "Z.ai: GLM 4.5V", ContextWindow: 65536, MaxOutput: 16384, Reasoning: true, PriceInput: 0.6, PriceOutput: 1.8, PriceCacheRead: 0.11, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "z-ai/glm-4.6", DisplayName: "Z.ai: GLM 4.6", ContextWindow: 202752, MaxOutput: 131072, Reasoning: true, PriceInput: 0.43, PriceOutput: 1.74, PriceCacheRead: 0.08, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "z-ai/glm-4.6v", DisplayName: "Z.ai: GLM 4.6V", ContextWindow: 131072, MaxOutput: 24000, Reasoning: true, PriceInput: 0.3, PriceOutput: 0.9, PriceCacheRead: 0.05, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "z-ai/glm-4.7", DisplayName: "Z.ai: GLM 4.7", ContextWindow: 202752, MaxOutput: 131072, Reasoning: true, PriceInput: 0.4, PriceOutput: 1.75, PriceCacheRead: 0.08, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "z-ai/glm-4.7-flash", DisplayName: "Z.ai: GLM 4.7 Flash", ContextWindow: 202752, MaxOutput: 16384, Reasoning: true, PriceInput: 0.06, PriceOutput: 0.4, PriceCacheRead: 0.01, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "z-ai/glm-5", DisplayName: "Z.ai: GLM 5", ContextWindow: 202752, MaxOutput: 4096, Reasoning: true, PriceInput: 0.6, PriceOutput: 1.9, PriceCacheRead: 0.119, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "z-ai/glm-5-turbo", DisplayName: "Z.ai: GLM 5 Turbo", ContextWindow: 202752, MaxOutput: 131072, Reasoning: true, PriceInput: 1.2, PriceOutput: 4, PriceCacheRead: 0.24, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "z-ai/glm-5.1", DisplayName: "Z.ai: GLM 5.1", ContextWindow: 202752, MaxOutput: 4096, Reasoning: true, PriceInput: 0.98, PriceOutput: 3.08, PriceCacheRead: 0.182, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "z-ai/glm-5v-turbo", DisplayName: "Z.ai: GLM 5V Turbo", ContextWindow: 202752, MaxOutput: 131072, Reasoning: true, PriceInput: 1.2, PriceOutput: 4, PriceCacheRead: 0.24, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "~anthropic/claude-haiku-latest", DisplayName: "Anthropic Claude Haiku Latest", ContextWindow: 200000, MaxOutput: 64000, Reasoning: true, PriceInput: 1, PriceOutput: 5, PriceCacheRead: 0.1, PriceCacheWrite: 1.25, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "~anthropic/claude-opus-latest", DisplayName: "Anthropic: Claude Opus Latest", ContextWindow: 1000000, MaxOutput: 128000, Reasoning: true, PriceInput: 5, PriceOutput: 25, PriceCacheRead: 0.5, PriceCacheWrite: 6.25, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "~anthropic/claude-sonnet-latest", DisplayName: "Anthropic Claude Sonnet Latest", ContextWindow: 1000000, MaxOutput: 128000, Reasoning: true, PriceInput: 3, PriceOutput: 15, PriceCacheRead: 0.3, PriceCacheWrite: 3.75, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "~google/gemini-flash-latest", DisplayName: "Google Gemini Flash Latest", ContextWindow: 1048576, MaxOutput: 65536, Reasoning: true, PriceInput: 1.5, PriceOutput: 9, PriceCacheRead: 0.15, PriceCacheWrite: 0.0833333333333, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "~google/gemini-pro-latest", DisplayName: "Google Gemini Pro Latest", ContextWindow: 1048576, MaxOutput: 65536, Reasoning: true, PriceInput: 2, PriceOutput: 12, PriceCacheRead: 0.2, PriceCacheWrite: 0.375, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "~moonshotai/kimi-latest", DisplayName: "MoonshotAI Kimi Latest", ContextWindow: 262144, MaxOutput: 262142, Reasoning: true, PriceInput: 0.73, PriceOutput: 3.49, PriceCacheRead: 0.25, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "~openai/gpt-latest", DisplayName: "OpenAI GPT Latest", ContextWindow: 1050000, MaxOutput: 128000, Reasoning: true, PriceInput: 5, PriceOutput: 30, PriceCacheRead: 0.5, BaseURL: "https://openrouter.ai/api/v1"}, - {Provider: "openrouter", ID: "~openai/gpt-mini-latest", DisplayName: "OpenAI GPT Mini Latest", ContextWindow: 400000, MaxOutput: 128000, Reasoning: true, PriceInput: 0.75, PriceOutput: 4.5, PriceCacheRead: 0.075, BaseURL: "https://openrouter.ai/api/v1"}, } diff --git a/packages/provider/discover.go b/packages/provider/discover.go index 130a00a..7d1798e 100644 --- a/packages/provider/discover.go +++ b/packages/provider/discover.go @@ -6,6 +6,7 @@ import ( "fmt" "io" "net/http" + "strconv" "strings" "time" ) @@ -225,3 +226,109 @@ func looksLikeChatModel(id string) bool { } return false } + +const openrouterDefaultBaseURL = "https://openrouter.ai/api/v1" + +// DiscoverOpenRouter lists models from OpenRouter's public /models +// endpoint (no auth). Per-token USD prices are converted to USD per 1M +// tokens to match the rest of the catalog. baseURL defaults to the +// public endpoint. +func DiscoverOpenRouter(ctx context.Context, baseURL string) ([]Model, error) { + if baseURL == "" { + baseURL = openrouterDefaultBaseURL + } + baseURL = strings.TrimRight(baseURL, "/") + client := &http.Client{Timeout: 15 * time.Second} + url := baseURL + "/models" + req, err := http.NewRequestWithContext(ctx, "GET", url, nil) + if err != nil { + return nil, err + } + resp, err := client.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + body, _ := io.ReadAll(resp.Body) + if resp.StatusCode != 200 { + return nil, fmt.Errorf("openrouter discover http %d: %s", resp.StatusCode, strings.TrimSpace(string(body))) + } + var page struct { + Data []struct { + ID string `json:"id"` + Name string `json:"name"` + ContextLength int `json:"context_length"` + Pricing struct { + Prompt string `json:"prompt"` + Completion string `json:"completion"` + InputCacheRead string `json:"input_cache_read"` + InputCacheWrite string `json:"input_cache_write"` + } `json:"pricing"` + TopProvider struct { + ContextLength int `json:"context_length"` + MaxCompletionTokens *int `json:"max_completion_tokens"` + } `json:"top_provider"` + SupportedParameters []string `json:"supported_parameters"` + } `json:"data"` + } + if err := json.Unmarshal(body, &page); err != nil { + return nil, fmt.Errorf("openrouter discover parse: %w", err) + } + var out []Model + for _, d := range page.Data { + if d.ID == "" { + continue + } + display := d.Name + if display == "" { + display = d.ID + } + ctxWin := d.ContextLength + if ctxWin == 0 { + ctxWin = d.TopProvider.ContextLength + } + maxOut := 0 + if d.TopProvider.MaxCompletionTokens != nil { + maxOut = *d.TopProvider.MaxCompletionTokens + } + out = append(out, Model{ + Provider: "openrouter", + ID: d.ID, + DisplayName: display, + ContextWindow: ctxWin, + MaxOutput: maxOut, + Reasoning: openrouterSupportsReasoning(d.SupportedParameters), + PriceInput: perMillionTokens(d.Pricing.Prompt), + PriceOutput: perMillionTokens(d.Pricing.Completion), + PriceCacheRead: perMillionTokens(d.Pricing.InputCacheRead), + PriceCacheWrite: perMillionTokens(d.Pricing.InputCacheWrite), + BaseURL: baseURL, + Source: "live", + }) + } + return out, nil +} + +// openrouterSupportsReasoning reports whether OpenRouter's +// supported_parameters list marks the model as reasoning-capable. +func openrouterSupportsReasoning(params []string) bool { + for _, p := range params { + if p == "reasoning" || p == "include_reasoning" { + return true + } + } + return false +} + +// perMillionTokens converts a per-token USD price string to USD per 1M +// tokens. Empty or unparseable values become 0. +func perMillionTokens(s string) float64 { + if s == "" { + return 0 + } + v, err := strconv.ParseFloat(s, 64) + if err != nil { + return 0 + } + return v * 1_000_000 +} diff --git a/packages/provider/extra_providers.go b/packages/provider/extra_providers.go index 20e7f68..df6f166 100644 --- a/packages/provider/extra_providers.go +++ b/packages/provider/extra_providers.go @@ -112,7 +112,7 @@ func NewXiaomiTokenPlan(region, apiKey, baseURL string) Client { // NewOpenRouter: OpenRouter aggregator. Unlocks dozens of upstream // models with one key. func NewOpenRouter(apiKey, baseURL string) Client { - return newOpenAICompat("openrouter", apiKey, baseURL, "https://openrouter.ai/api/v1") + return newOpenAICompat("openrouter", apiKey, baseURL, openrouterDefaultBaseURL) } // NewOpenCode is the opencode.ai Zen endpoint. Mixed APIs upstream; this diff --git a/packages/provider/models.go b/packages/provider/models.go index 4649dff..01acbf2 100644 --- a/packages/provider/models.go +++ b/packages/provider/models.go @@ -223,6 +223,17 @@ var Catalog = []Model{ PriceInput: 0.075, PriceOutput: 0.3, PriceCacheRead: 0, }, + // ---- OpenRouter ---- + // Seed entry only: the default model returned by defaultModelForProvider + // so it resolves offline. The full OpenRouter catalog is discovered live + // (DiscoverOpenRouter) and overlays this on refresh. + { + Provider: "openrouter", ID: "anthropic/claude-sonnet-4.5", DisplayName: "Claude Sonnet 4.5 (OpenRouter)", + ContextWindow: 1000000, MaxOutput: 64000, Reasoning: true, + PriceInput: 3, PriceOutput: 15, PriceCacheRead: 0.3, PriceCacheWrite: 3.75, + BaseURL: openrouterDefaultBaseURL, + }, + // ---- Speculative: Anthropic ---- { Provider: "anthropic", ID: "claude-opus-4-5", DisplayName: "Claude Opus 4.5 (latest)", diff --git a/packages/provider/openai.go b/packages/provider/openai.go index b66c610..9e69486 100644 --- a/packages/provider/openai.go +++ b/packages/provider/openai.go @@ -184,7 +184,9 @@ func (c *openaiClient) buildRequest(req Request) (*oaiRequest, error) { maxTok = m.MaxOutput } if m.Reasoning { - out.MaxCompletionTok = &maxTok + if maxTok > 0 { + out.MaxCompletionTok = &maxTok + } effort := OpenAIReasoningEffort(req.Reasoning) if usesAdaptiveThinking(m) { // Some gateways expose adaptive-thinking Anthropic models through @@ -196,7 +198,10 @@ func (c *openaiClient) buildRequest(req Request) (*oaiRequest, error) { if effort != "" { out.ReasoningEffort = effort } - } else { + } else if maxTok > 0 { + // Omit max_tokens when unknown (some discovered models don't + // advertise an output cap) so the server applies its own default + // instead of receiving an invalid max_tokens: 0. out.MaxTokens = &maxTok } diff --git a/packages/provider/provider_test.go b/packages/provider/provider_test.go index 5d49d74..c26bcf4 100644 --- a/packages/provider/provider_test.go +++ b/packages/provider/provider_test.go @@ -306,3 +306,70 @@ func TestOpenAIStreamHappyPath(t *testing.T) { t.Fatalf("stop=%v", done.Stop) } } + +func TestDiscoverOpenRouter(t *testing.T) { + const body = `{"data":[ + {"id":"x/full","pricing":{"prompt":"0.000003","completion":"0.000015"}, + "context_length":200000,"top_provider":{"max_completion_tokens":64000}, + "supported_parameters":["reasoning"]}, + {"id":"x/fallback","top_provider":{"context_length":128000}}, + {"id":""}]}` + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + _, _ = w.Write([]byte(body)) + })) + defer srv.Close() + + models, err := DiscoverOpenRouter(context.Background(), srv.URL) + if err != nil { + t.Fatal(err) + } + if len(models) != 2 { // empty id dropped + t.Fatalf("want 2 models, got %d", len(models)) + } + // per-token USD -> per-1M; reasoning from supported_parameters. + if m := models[0]; m.Provider != "openrouter" || m.ContextWindow != 200000 || + m.MaxOutput != 64000 || !m.Reasoning || m.PriceInput != 3 || m.PriceOutput != 15 { + t.Errorf("model[0]: %+v", m) + } + // context falls back to top_provider; no reasoning. + if m := models[1]; m.ContextWindow != 128000 || m.MaxOutput != 0 || m.Reasoning { + t.Errorf("model[1]: %+v", m) + } +} + +// TestOpenAIOmitsZeroMaxTokens guards against sending max_tokens: 0 for +// discovered models that don't advertise an output cap (MaxOutput == 0). +func TestOpenAIOmitsZeroMaxTokens(t *testing.T) { + SetLiveModels([]Model{ + {Provider: "openrouter", ID: "vendor/no-cap", DisplayName: "No Cap"}, + {Provider: "openrouter", ID: "vendor/reason-no-cap", DisplayName: "Reason No Cap", Reasoning: true}, + {Provider: "openrouter", ID: "vendor/capped", DisplayName: "Capped", MaxOutput: 4096}, + }) + defer SetLiveModels(nil) + + c := NewOpenAI("x", "").(*openaiClient) + + got, err := c.buildRequest(Request{Model: "vendor/no-cap"}) + if err != nil { + t.Fatal(err) + } + if got.MaxTokens != nil { + t.Errorf("expected max_tokens omitted, got %d", *got.MaxTokens) + } + + got, err = c.buildRequest(Request{Model: "vendor/reason-no-cap"}) + if err != nil { + t.Fatal(err) + } + if got.MaxCompletionTok != nil { + t.Errorf("expected max_completion_tokens omitted, got %d", *got.MaxCompletionTok) + } + + got, err = c.buildRequest(Request{Model: "vendor/capped"}) + if err != nil { + t.Fatal(err) + } + if got.MaxTokens == nil || *got.MaxTokens != 4096 { + t.Errorf("expected max_tokens 4096, got %v", got.MaxTokens) + } +} From 323df7f6d3c462a452754afabea4a14184e8d483 Mon Sep 17 00:00:00 2001 From: patriceckhart Date: Mon, 8 Jun 2026 15:17:22 +0200 Subject: [PATCH 3/4] Discover env-only bedrock in credential fallback scan --- packages/agent/build.go | 6 +++++- packages/agent/build_test.go | 31 +++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/packages/agent/build.go b/packages/agent/build.go index 4271333..6b07160 100644 --- a/packages/agent/build.go +++ b/packages/agent/build.go @@ -317,7 +317,11 @@ func Resolve(args Args, requireCred bool) (Resolved, error) { // never shows a "not logged in" banner. userPickedProvider := args.Provider != "" if credErr != nil && !userPickedProvider && provName != "ollama" { - for _, other := range []string{"anthropic", "openai", "openai-codex", "kimi", "deepseek", "google"} { + // amazon-bedrock is included so an env-only bedrock setup + // (AWS_BEARER_TOKEN_BEDROCK / AWS_PROFILE / IAM keys) is still + // discovered when no config.json pins the provider, e.g. after + // pointing ZOT_HOME at a fresh home dir. + for _, other := range []string{"anthropic", "openai", "openai-codex", "kimi", "deepseek", "google", "amazon-bedrock"} { if other == provName { continue } diff --git a/packages/agent/build_test.go b/packages/agent/build_test.go index eb8e37e..2b06a7a 100644 --- a/packages/agent/build_test.go +++ b/packages/agent/build_test.go @@ -111,6 +111,37 @@ func TestResolveExplicitFlagStaleDoesNotRepairConfig(t *testing.T) { } } +// TestResolveEnvOnlyBedrockDiscoveredWithoutConfig reproduces issue +// #15: pointing ZOT_HOME at a fresh dir drops the persisted +// config.json (which pinned provider=amazon-bedrock). Resolve must +// still discover bedrock from the AWS env vars instead of falling back +// to anthropic and reporting "not logged in". +func TestResolveEnvOnlyBedrockDiscoveredWithoutConfig(t *testing.T) { + t.Setenv("ZOT_HOME", t.TempDir()) // fresh home: no config.json + // Disable the Kimi CLI token fallback so a developer machine with a + // real Kimi CLI login doesn't pre-empt bedrock in the scan. + if err := SetKimiCLIFallbackDisabled(true); err != nil { + t.Fatal(err) + } + t.Setenv("AWS_BEARER_TOKEN_BEDROCK", "test-bedrock-token") + t.Setenv("AWS_REGION", "us-east-1") + // Make sure no other provider's env credential pre-empts bedrock. + for _, k := range []string{"ANTHROPIC_API_KEY", "ANTHROPIC_OAUTH_TOKEN", "OPENAI_API_KEY", "GEMINI_API_KEY", "GOOGLE_API_KEY", "DEEPSEEK_API_KEY", "KIMI_API_KEY", "MOONSHOT_API_KEY"} { + t.Setenv(k, "") + } + + r, err := Resolve(Args{}, true) + if err != nil { + t.Fatalf("Resolve errored with env-only bedrock: %v", err) + } + if r.Provider != "amazon-bedrock" { + t.Fatalf("provider = %q, want amazon-bedrock", r.Provider) + } + if !r.HasCredential() { + t.Fatalf("bedrock credential not resolved from env") + } +} + func TestResolveOllamaUsesModelBaseURLBeforeDefault(t *testing.T) { t.Setenv("ZOT_HOME", t.TempDir()) provider.SetLiveModels(nil) From eef2714dea49985409b37fe734df88f578fad066 Mon Sep 17 00:00:00 2001 From: patriceckhart Date: Mon, 8 Jun 2026 15:22:40 +0200 Subject: [PATCH 4/4] Scan all known providers in credential fallback (adopts #16) --- packages/agent/build.go | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/agent/build.go b/packages/agent/build.go index 6b07160..4d23a5e 100644 --- a/packages/agent/build.go +++ b/packages/agent/build.go @@ -317,12 +317,15 @@ func Resolve(args Args, requireCred bool) (Resolved, error) { // never shows a "not logged in" banner. userPickedProvider := args.Provider != "" if credErr != nil && !userPickedProvider && provName != "ollama" { - // amazon-bedrock is included so an env-only bedrock setup - // (AWS_BEARER_TOKEN_BEDROCK / AWS_PROFILE / IAM keys) is still - // discovered when no config.json pins the provider, e.g. after - // pointing ZOT_HOME at a fresh home dir. - for _, other := range []string{"anthropic", "openai", "openai-codex", "kimi", "deepseek", "google", "amazon-bedrock"} { - if other == provName { + // Scan every known provider (not a hardcoded subset) so any + // env-based credential is discovered, e.g. an env-only + // amazon-bedrock setup (AWS_BEARER_TOKEN_BEDROCK / AWS_PROFILE / + // IAM keys) when no config.json pins the provider, such as after + // pointing ZOT_HOME at a fresh home dir. Iteration order of + // knownProviders defines fallback priority. ollama is skipped: + // it has no credential and would always "match". + for _, other := range knownProviders { + if other == provName || other == "ollama" { continue } if c, m, a, err := ResolveCredentialFull(other, args.APIKey); err == nil {