detached 7eb8a65

Merge #17: bedrock prompt caching via cachePoint markers

Adds Converse API cachePoint blocks at the system prompt boundary and on
the last user message for Bedrock Claude models (PriceCacheWrite > 0),
mirroring the Anthropic provider's caching strategy. Nova models are
excluded (automatic caching).

Co-authored-by: Raymond Gasper <raymondgasper@fastmail.com>
commit
7eb8a65637264beda95f77491ec57b5377869360
author
patriceckhart · · 2026-06-08 13:39 UTC
committer
patriceckhart · · 2026-06-08 13:40 UTC
merge of
cc03a4c + f209a33 · diff against the first parent
signature
unsigned
refs
tag: v0.2.19
12 files · +362 -277
A .github/ISSUE_TEMPLATE/bug_report.yml +65 -0
@@ -0,0 +1,65 @@
1+name: Bug report
2+description: Report something that's broken
3+title: "[Bug]: "
4+labels: ["bug"]
5+body:
6+ - type: textarea
7+ id: description
8+ attributes:
9+ label: What happened?
10+ description: Be specific. Include error messages if any.
11+ validations:
12+ required: true
13+
14+ - type: textarea
15+ id: repro
16+ attributes:
17+ label: Steps to reproduce
18+ description: Minimal steps to trigger the bug.
19+ validations:
20+ required: true
21+
22+ - type: textarea
23+ id: expected
24+ attributes:
25+ label: Expected behavior
26+ description: What should have happened instead?
27+ placeholder: "I expected zot to..."
28+ validations:
29+ required: true
30+
31+ - type: input
32+ id: version
33+ attributes:
34+ label: Version
35+ description: "e.g. 0.0.1 — run `zot --version` to check"
36+ validations:
37+ required: true
38+
39+ - type: dropdown
40+ id: os
41+ attributes:
42+ label: Operating system
43+ options:
44+ - macOS
45+ - Linux
46+ - Windows
47+ - Other
48+ validations:
49+ required: true
50+
51+ - type: textarea
52+ id: logs
53+ attributes:
54+ label: Logs / screenshots
55+ description: |
56+ If applicable, paste relevant terminal output or attach screenshots.
57+ render: shell
58+
59+ - type: checkboxes
60+ id: checks
61+ attributes:
62+ label: Before submitting
63+ options:
64+ - label: I searched existing issues and didn't find a duplicate
65+ required: true
@@ -0,0 +1,65 @@
1+name: Bug report
2+description: Report something that's broken
3+title: "[Bug]: "
4+labels: ["bug"]
5+body:
6+ - type: textarea
7+ id: description
8+ attributes:
9+ label: What happened?
10+ description: Be specific. Include error messages if any.
11+ validations:
12+ required: true
13+
14+ - type: textarea
15+ id: repro
16+ attributes:
17+ label: Steps to reproduce
18+ description: Minimal steps to trigger the bug.
19+ validations:
20+ required: true
21+
22+ - type: textarea
23+ id: expected
24+ attributes:
25+ label: Expected behavior
26+ description: What should have happened instead?
27+ placeholder: "I expected zot to..."
28+ validations:
29+ required: true
30+
31+ - type: input
32+ id: version
33+ attributes:
34+ label: Version
35+ description: "e.g. 0.0.1 — run `zot --version` to check"
36+ validations:
37+ required: true
38+
39+ - type: dropdown
40+ id: os
41+ attributes:
42+ label: Operating system
43+ options:
44+ - macOS
45+ - Linux
46+ - Windows
47+ - Other
48+ validations:
49+ required: true
50+
51+ - type: textarea
52+ id: logs
53+ attributes:
54+ label: Logs / screenshots
55+ description: |
56+ If applicable, paste relevant terminal output or attach screenshots.
57+ render: shell
58+
59+ - type: checkboxes
60+ id: checks
61+ attributes:
62+ label: Before submitting
63+ options:
64+ - label: I searched existing issues and didn't find a duplicate
65+ required: true
A .github/ISSUE_TEMPLATE/config.yml +1 -0
@@ -0,0 +1,1 @@
1+blank_issues_enabled: false
@@ -0,0 +1,1 @@
1+blank_issues_enabled: false
A .github/ISSUE_TEMPLATE/feature_request.yml +55 -0
@@ -0,0 +1,55 @@
1+name: Feature request
2+description: Suggest a new feature or improvement
3+title: "[Feature]: "
4+labels: ["enhancement"]
5+body:
6+ - type: markdown
7+ attributes:
8+ value: |
9+ Thanks for the idea! A short conversation here saves everyone time before any code is written.
10+
11+ Zot is intentionally focused — not every idea will make it in. A "no" is not a judgment of the idea.
12+
13+ - type: textarea
14+ id: problem
15+ attributes:
16+ label: What problem does this solve?
17+ description: |
18+ The **why**, not the **what**. What were you trying to do when you wished this existed?
19+ placeholder: "When I'm working with multiple providers, I want to switch between them without restarting zot."
20+ validations:
21+ required: true
22+
23+ - type: textarea
24+ id: proposal
25+ attributes:
26+ label: Proposed solution
27+ description: How would you imagine using this? UX sketch, CLI flags, behavior, anything that helps us picture it.
28+ validations:
29+ required: true
30+
31+ - type: textarea
32+ id: alternatives
33+ attributes:
34+ label: Alternatives considered
35+ description: What workarounds have you tried? What other tools handle this well?
36+ placeholder: "I tried X, but it doesn't solve Y because..."
37+
38+ - type: dropdown
39+ id: contribution
40+ attributes:
41+ label: Are you willing to contribute the implementation?
42+ options:
43+ - "Yes, with guidance"
44+ - "Yes, I can do it"
45+ - "No, just suggesting"
46+ validations:
47+ required: true
48+
49+ - type: checkboxes
50+ id: checks
51+ attributes:
52+ label: Before submitting
53+ options:
54+ - label: I searched existing issues and didn't find a duplicate
55+ required: true
@@ -0,0 +1,55 @@
1+name: Feature request
2+description: Suggest a new feature or improvement
3+title: "[Feature]: "
4+labels: ["enhancement"]
5+body:
6+ - type: markdown
7+ attributes:
8+ value: |
9+ Thanks for the idea! A short conversation here saves everyone time before any code is written.
10+
11+ Zot is intentionally focused — not every idea will make it in. A "no" is not a judgment of the idea.
12+
13+ - type: textarea
14+ id: problem
15+ attributes:
16+ label: What problem does this solve?
17+ description: |
18+ The **why**, not the **what**. What were you trying to do when you wished this existed?
19+ placeholder: "When I'm working with multiple providers, I want to switch between them without restarting zot."
20+ validations:
21+ required: true
22+
23+ - type: textarea
24+ id: proposal
25+ attributes:
26+ label: Proposed solution
27+ description: How would you imagine using this? UX sketch, CLI flags, behavior, anything that helps us picture it.
28+ validations:
29+ required: true
30+
31+ - type: textarea
32+ id: alternatives
33+ attributes:
34+ label: Alternatives considered
35+ description: What workarounds have you tried? What other tools handle this well?
36+ placeholder: "I tried X, but it doesn't solve Y because..."
37+
38+ - type: dropdown
39+ id: contribution
40+ attributes:
41+ label: Are you willing to contribute the implementation?
42+ options:
43+ - "Yes, with guidance"
44+ - "Yes, I can do it"
45+ - "No, just suggesting"
46+ validations:
47+ required: true
48+
49+ - type: checkboxes
50+ id: checks
51+ attributes:
52+ label: Before submitting
53+ options:
54+ - label: I searched existing issues and didn't find a duplicate
55+ required: true
M packages/agent/build.go +9 -2
@@ -317,8 +317,15 @@ func Resolve(args Args, requireCred bool) (Resolved, error) {
317317 // never shows a "not logged in" banner.
318318 userPickedProvider := args.Provider != ""
319319 if credErr != nil && !userPickedProvider && provName != "ollama" {
320- for _, other := range []string{"anthropic", "openai", "openai-codex", "kimi", "deepseek", "google"} {
321- if other == provName {
320+ // Scan every known provider (not a hardcoded subset) so any
321+ // env-based credential is discovered, e.g. an env-only
322+ // amazon-bedrock setup (AWS_BEARER_TOKEN_BEDROCK / AWS_PROFILE /
323+ // IAM keys) when no config.json pins the provider, such as after
324+ // pointing ZOT_HOME at a fresh home dir. Iteration order of
325+ // knownProviders defines fallback priority. ollama is skipped:
326+ // it has no credential and would always "match".
327+ for _, other := range knownProviders {
328+ if other == provName || other == "ollama" {
322329 continue
323330 }
324331 if c, m, a, err := ResolveCredentialFull(other, args.APIKey); err == nil {
@@ -317,8 +317,15 @@ func Resolve(args Args, requireCred bool) (Resolved, error) {
317 // never shows a "not logged in" banner.317 // never shows a "not logged in" banner.
318 userPickedProvider := args.Provider != ""318 userPickedProvider := args.Provider != ""
319 if credErr != nil && !userPickedProvider && provName != "ollama" {319 if credErr != nil && !userPickedProvider && provName != "ollama" {
320- for _, other := range []string{"anthropic", "openai", "openai-codex", "kimi", "deepseek", "google"} {320+ // Scan every known provider (not a hardcoded subset) so any
321- if other == provName {321+ // env-based credential is discovered, e.g. an env-only
322+ // amazon-bedrock setup (AWS_BEARER_TOKEN_BEDROCK / AWS_PROFILE /
323+ // IAM keys) when no config.json pins the provider, such as after
324+ // pointing ZOT_HOME at a fresh home dir. Iteration order of
325+ // knownProviders defines fallback priority. ollama is skipped:
326+ // it has no credential and would always "match".
327+ for _, other := range knownProviders {
328+ if other == provName || other == "ollama" {
322 continue329 continue
323 }330 }
324 if c, m, a, err := ResolveCredentialFull(other, args.APIKey); err == nil {331 if c, m, a, err := ResolveCredentialFull(other, args.APIKey); err == nil {
M packages/agent/build_test.go +31 -0
@@ -111,6 +111,37 @@ func TestResolveExplicitFlagStaleDoesNotRepairConfig(t *testing.T) {
111111 }
112112 }
113113
114+// TestResolveEnvOnlyBedrockDiscoveredWithoutConfig reproduces issue
115+// #15: pointing ZOT_HOME at a fresh dir drops the persisted
116+// config.json (which pinned provider=amazon-bedrock). Resolve must
117+// still discover bedrock from the AWS env vars instead of falling back
118+// to anthropic and reporting "not logged in".
119+func TestResolveEnvOnlyBedrockDiscoveredWithoutConfig(t *testing.T) {
120+ t.Setenv("ZOT_HOME", t.TempDir()) // fresh home: no config.json
121+ // Disable the Kimi CLI token fallback so a developer machine with a
122+ // real Kimi CLI login doesn't pre-empt bedrock in the scan.
123+ if err := SetKimiCLIFallbackDisabled(true); err != nil {
124+ t.Fatal(err)
125+ }
126+ t.Setenv("AWS_BEARER_TOKEN_BEDROCK", "test-bedrock-token")
127+ t.Setenv("AWS_REGION", "us-east-1")
128+ // Make sure no other provider's env credential pre-empts bedrock.
129+ 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"} {
130+ t.Setenv(k, "")
131+ }
132+
133+ r, err := Resolve(Args{}, true)
134+ if err != nil {
135+ t.Fatalf("Resolve errored with env-only bedrock: %v", err)
136+ }
137+ if r.Provider != "amazon-bedrock" {
138+ t.Fatalf("provider = %q, want amazon-bedrock", r.Provider)
139+ }
140+ if !r.HasCredential() {
141+ t.Fatalf("bedrock credential not resolved from env")
142+ }
143+}
144+
114145 func TestResolveOllamaUsesModelBaseURLBeforeDefault(t *testing.T) {
115146 t.Setenv("ZOT_HOME", t.TempDir())
116147 provider.SetLiveModels(nil)
@@ -111,6 +111,37 @@ func TestResolveExplicitFlagStaleDoesNotRepairConfig(t *testing.T) {
111 }111 }
112 }112 }
113 113
114+// TestResolveEnvOnlyBedrockDiscoveredWithoutConfig reproduces issue
115+// #15: pointing ZOT_HOME at a fresh dir drops the persisted
116+// config.json (which pinned provider=amazon-bedrock). Resolve must
117+// still discover bedrock from the AWS env vars instead of falling back
118+// to anthropic and reporting "not logged in".
119+func TestResolveEnvOnlyBedrockDiscoveredWithoutConfig(t *testing.T) {
120+ t.Setenv("ZOT_HOME", t.TempDir()) // fresh home: no config.json
121+ // Disable the Kimi CLI token fallback so a developer machine with a
122+ // real Kimi CLI login doesn't pre-empt bedrock in the scan.
123+ if err := SetKimiCLIFallbackDisabled(true); err != nil {
124+ t.Fatal(err)
125+ }
126+ t.Setenv("AWS_BEARER_TOKEN_BEDROCK", "test-bedrock-token")
127+ t.Setenv("AWS_REGION", "us-east-1")
128+ // Make sure no other provider's env credential pre-empts bedrock.
129+ 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"} {
130+ t.Setenv(k, "")
131+ }
132+
133+ r, err := Resolve(Args{}, true)
134+ if err != nil {
135+ t.Fatalf("Resolve errored with env-only bedrock: %v", err)
136+ }
137+ if r.Provider != "amazon-bedrock" {
138+ t.Fatalf("provider = %q, want amazon-bedrock", r.Provider)
139+ }
140+ if !r.HasCredential() {
141+ t.Fatalf("bedrock credential not resolved from env")
142+ }
143+}
144+
114 func TestResolveOllamaUsesModelBaseURLBeforeDefault(t *testing.T) {145 func TestResolveOllamaUsesModelBaseURLBeforeDefault(t *testing.T) {
115 t.Setenv("ZOT_HOME", t.TempDir())146 t.Setenv("ZOT_HOME", t.TempDir())
116 provider.SetLiveModels(nil)147 provider.SetLiveModels(nil)
M packages/agent/modelsync.go +7 -0
@@ -150,6 +150,13 @@ func refreshModels() {
150150 all = append(all, live...)
151151 }
152152 }
153+ if _, _, err := ResolveCredential("openrouter", ""); err == nil {
154+ // /models is public; gate on a credential so the picker only
155+ // fills with OpenRouter's hundreds of routes for users who use it.
156+ if live, err := provider.DiscoverOpenRouter(ctx, ""); err == nil {
157+ all = append(all, live...)
158+ }
159+ }
153160
154161 if len(all) == 0 {
155162 return
@@ -150,6 +150,13 @@ func refreshModels() {
150 all = append(all, live...)150 all = append(all, live...)
151 }151 }
152 }152 }
153+ if _, _, err := ResolveCredential("openrouter", ""); err == nil {
154+ // /models is public; gate on a credential so the picker only
155+ // fills with OpenRouter's hundreds of routes for users who use it.
156+ if live, err := provider.DiscoverOpenRouter(ctx, ""); err == nil {
157+ all = append(all, live...)
158+ }
159+ }
153 160
154 if len(all) == 0 {161 if len(all) == 0 {
155 return162 return
M packages/provider/catalog_builtin.go +1 -272
@@ -307,39 +307,7 @@ var builtinCatalog = []Model{
307307 {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"},
308308 {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"},
309309 {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"},
310- // ----- openrouter -----
311- {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"},
312- {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"},
313- {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"},
314- {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"},
315- {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"},
316- {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"},
317- {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"},
318- {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"},
319- {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"},
320- {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"},
321- {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"},
322- {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"},
323- {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"},
324- {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"},
325- {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"},
326- {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"},
327- {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"},
328- {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"},
329- {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"},
330- {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"},
331- {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"},
332- {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"},
333- {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"},
334- {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"},
335- {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"},
336- {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"},
337- {Provider: "openrouter", ID: "auto", DisplayName: "Auto", ContextWindow: 2000000, MaxOutput: 30000, Reasoning: true, PriceInput: 0, PriceOutput: 0, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"},
338- {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"},
339- {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"},
340- {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"},
341- {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"},
342- {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"},
310+ // openrouter: discovered live via DiscoverOpenRouter, none baked in.
343311 // ----- together -----
344312 {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"},
345313 {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{
705673 {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"},
706674 {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"},
707675 {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"},
708- // ----- openrouter (additional synced entries) -----
709- {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"},
710- {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"},
711- {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"},
712- {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"},
713- {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"},
714- {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"},
715- {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"},
716- {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"},
717- {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"},
718- {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"},
719- {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"},
720- {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"},
721- {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"},
722- {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"},
723- {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"},
724- {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"},
725- {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"},
726- {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"},
727- {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"},
728- {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"},
729- {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"},
730- {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"},
731- {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"},
732- {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"},
733- {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"},
734- {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"},
735- {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"},
736- {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"},
737- {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"},
738- {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"},
739- {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"},
740- {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"},
741- {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"},
742- {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"},
743- {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"},
744- {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"},
745- {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"},
746- {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"},
747- {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"},
748- {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"},
749- {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"},
750- {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"},
751- {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"},
752- {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"},
753- {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"},
754- {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"},
755- {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"},
756- {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"},
757- {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"},
758- {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"},
759- {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"},
760- {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"},
761- {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"},
762- {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"},
763- {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"},
764- {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"},
765- {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"},
766- {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"},
767- {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"},
768- {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"},
769- {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"},
770- {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"},
771- {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"},
772- {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"},
773- {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"},
774- {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"},
775- {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"},
776- {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"},
777- {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"},
778- {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"},
779- {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"},
780- {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"},
781- {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"},
782- {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"},
783- {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"},
784- {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"},
785- {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"},
786- {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"},
787- {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"},
788- {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"},
789- {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"},
790- {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"},
791- {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"},
792- {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"},
793- {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"},
794- {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"},
795- {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"},
796- {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"},
797- {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"},
798- {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"},
799- {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"},
800- {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"},
801- {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"},
802- {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"},
803- {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"},
804- {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"},
805- {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"},
806- {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"},
807- {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"},
808- {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"},
809- {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"},
810- {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"},
811- {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"},
812- {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"},
813- {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"},
814- {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"},
815- {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"},
816- {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"},
817- {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"},
818- {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"},
819- {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"},
820- {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"},
821- {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"},
822- {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"},
823- {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"},
824- {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"},
825- {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"},
826- {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"},
827- {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"},
828- {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"},
829- {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"},
830- {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"},
831- {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"},
832- {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"},
833- {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"},
834- {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"},
835- {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"},
836- {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"},
837- {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"},
838- {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"},
839- {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"},
840- {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"},
841- {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"},
842- {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"},
843- {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"},
844- {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"},
845- {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"},
846- {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"},
847- {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"},
848- {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"},
849- {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"},
850- {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"},
851- {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"},
852- {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"},
853- {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"},
854- {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"},
855- {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"},
856- {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"},
857- {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"},
858- {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"},
859- {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"},
860- {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"},
861- {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"},
862- {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"},
863- {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"},
864- {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"},
865- {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"},
866- {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"},
867- {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"},
868- {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"},
869- {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"},
870- {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"},
871- {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"},
872- {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"},
873- {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"},
874- {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"},
875- {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"},
876- {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"},
877- {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"},
878- {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"},
879- {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"},
880- {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"},
881- {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"},
882- {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"},
883- {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"},
884- {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"},
885- {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"},
886- {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"},
887- {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"},
888- {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"},
889- {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"},
890- {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"},
891- {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"},
892- {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"},
893- {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"},
894- {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"},
895- {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"},
896- {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"},
897- {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"},
898- {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"},
899- {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"},
900- {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"},
901- {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"},
902- {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"},
903- {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"},
904- {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"},
905- {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"},
906- {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"},
907- {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"},
908- {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"},
909- {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"},
910- {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"},
911- {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"},
912- {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"},
913- {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"},
914- {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"},
915- {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"},
916- {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"},
917- {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"},
918- {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"},
919- {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"},
920- {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"},
921- {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"},
922- {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"},
923- {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"},
924- {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"},
925- {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"},
926- {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"},
927- {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"},
928- {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"},
929- {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"},
930- {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"},
931- {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"},
932- {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"},
933- {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"},
934- {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"},
935- {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"},
936- {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"},
937- {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"},
938- {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"},
939- {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"},
940- {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"},
941- {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"},
942- {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"},
943- {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"},
944- {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"},
945- {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"},
946- {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"},
947676 }
@@ -307,39 +307,7 @@ var builtinCatalog = []Model{
307 {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"},307 {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"},
308 {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"},308 {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"},
309 {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"},309 {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"},
310- // ----- openrouter -----310+ // openrouter: discovered live via DiscoverOpenRouter, none baked in.
311- {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"},
312- {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"},
313- {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"},
314- {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"},
315- {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"},
316- {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"},
317- {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"},
318- {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"},
319- {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"},
320- {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"},
321- {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"},
322- {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"},
323- {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"},
324- {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"},
325- {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"},
326- {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"},
327- {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"},
328- {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"},
329- {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"},
330- {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"},
331- {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"},
332- {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"},
333- {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"},
334- {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"},
335- {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"},
336- {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"},
337- {Provider: "openrouter", ID: "auto", DisplayName: "Auto", ContextWindow: 2000000, MaxOutput: 30000, Reasoning: true, PriceInput: 0, PriceOutput: 0, PriceCacheRead: 0, BaseURL: "https://openrouter.ai/api/v1"},
338- {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"},
339- {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"},
340- {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"},
341- {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"},
342- {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"},
343 // ----- together -----311 // ----- together -----
344 {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"},312 {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"},
345 {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"},313 {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{
705 {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"},673 {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"},
706 {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"},674 {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"},
707 {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"},675 {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"},
708- // ----- openrouter (additional synced entries) -----
709- {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"},
710- {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"},
711- {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"},
712- {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"},
713- {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"},
714- {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"},
715- {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"},
716- {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"},
717- {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"},
718- {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"},
719- {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"},
720- {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"},
721- {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"},
722- {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"},
723- {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"},
724- {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"},
725- {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"},
726- {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"},
727- {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"},
728- {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"},
729- {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"},
730- {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"},
731- {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"},
732- {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"},
733- {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"},
734- {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"},
735- {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"},
736- {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"},
737- {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"},
738- {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"},
739- {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"},
740- {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"},
741- {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"},
742- {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"},
743- {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"},
744- {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"},
745- {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"},
746- {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"},
747- {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"},
748- {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"},
749- {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"},
750- {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"},
751- {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"},
752- {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"},
753- {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"},
754- {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"},
755- {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"},
756- {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"},
757- {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"},
758- {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"},
759- {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"},
760- {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"},
761- {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"},
762- {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"},
763- {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"},
764- {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"},
765- {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"},
766- {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"},
767- {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"},
768- {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"},
769- {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"},
770- {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"},
771- {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"},
772- {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"},
773- {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"},
774- {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"},
775- {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"},
776- {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"},
777- {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"},
778- {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"},
779- {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"},
780- {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"},
781- {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"},
782- {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"},
783- {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"},
784- {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"},
785- {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"},
786- {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"},
787- {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"},
788- {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"},
789- {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"},
790- {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"},
791- {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"},
792- {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"},
793- {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"},
794- {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"},
795- {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"},
796- {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"},
797- {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"},
798- {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"},
799- {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"},
800- {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"},
801- {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"},
802- {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"},
803- {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"},
804- {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"},
805- {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"},
806- {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"},
807- {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"},
808- {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"},
809- {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"},
810- {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"},
811- {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"},
812- {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"},
813- {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"},
814- {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"},
815- {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"},
816- {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"},
817- {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"},
818- {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"},
819- {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"},
820- {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"},
821- {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"},
822- {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"},
823- {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"},
824- {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"},
825- {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"},
826- {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"},
827- {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"},
828- {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"},
829- {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"},
830- {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"},
831- {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"},
832- {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"},
833- {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"},
834- {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"},
835- {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"},
836- {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"},
837- {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"},
838- {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"},
839- {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"},
840- {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"},
841- {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"},
842- {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"},
843- {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"},
844- {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"},
845- {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"},
846- {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"},
847- {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"},
848- {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"},
849- {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"},
850- {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"},
851- {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"},
852- {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"},
853- {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"},
854- {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"},
855- {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"},
856- {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"},
857- {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"},
858- {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"},
859- {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"},
860- {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"},
861- {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"},
862- {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"},
863- {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"},
864- {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"},
865- {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"},
866- {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"},
867- {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"},
868- {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"},
869- {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"},
870- {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"},
871- {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"},
872- {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"},
873- {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"},
874- {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"},
875- {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"},
876- {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"},
877- {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"},
878- {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"},
879- {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"},
880- {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"},
881- {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"},
882- {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"},
883- {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"},
884- {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"},
885- {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"},
886- {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"},
887- {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"},
888- {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"},
889- {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"},
890- {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"},
891- {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"},
892- {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"},
893- {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"},
894- {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"},
895- {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"},
896- {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"},
897- {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"},
898- {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"},
899- {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"},
900- {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"},
901- {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"},
902- {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"},
903- {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"},
904- {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"},
905- {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"},
906- {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"},
907- {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"},
908- {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"},
909- {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"},
910- {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"},
911- {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"},
912- {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"},
913- {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"},
914- {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"},
915- {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"},
916- {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"},
917- {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"},
918- {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"},
919- {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"},
920- {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"},
921- {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"},
922- {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"},
923- {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"},
924- {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"},
925- {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"},
926- {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"},
927- {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"},
928- {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"},
929- {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"},
930- {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"},
931- {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"},
932- {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"},
933- {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"},
934- {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"},
935- {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"},
936- {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"},
937- {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"},
938- {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"},
939- {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"},
940- {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"},
941- {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"},
942- {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"},
943- {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"},
944- {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"},
945- {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"},
946- {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"},
947 }676 }
M packages/provider/discover.go +107 -0
@@ -6,6 +6,7 @@ import (
66 "fmt"
77 "io"
88 "net/http"
9+ "strconv"
910 "strings"
1011 "time"
1112 )
@@ -225,3 +226,109 @@ func looksLikeChatModel(id string) bool {
225226 }
226227 return false
227228 }
229+
230+const openrouterDefaultBaseURL = "https://openrouter.ai/api/v1"
231+
232+// DiscoverOpenRouter lists models from OpenRouter's public /models
233+// endpoint (no auth). Per-token USD prices are converted to USD per 1M
234+// tokens to match the rest of the catalog. baseURL defaults to the
235+// public endpoint.
236+func DiscoverOpenRouter(ctx context.Context, baseURL string) ([]Model, error) {
237+ if baseURL == "" {
238+ baseURL = openrouterDefaultBaseURL
239+ }
240+ baseURL = strings.TrimRight(baseURL, "/")
241+ client := &http.Client{Timeout: 15 * time.Second}
242+ url := baseURL + "/models"
243+ req, err := http.NewRequestWithContext(ctx, "GET", url, nil)
244+ if err != nil {
245+ return nil, err
246+ }
247+ resp, err := client.Do(req)
248+ if err != nil {
249+ return nil, err
250+ }
251+ defer resp.Body.Close()
252+ body, _ := io.ReadAll(resp.Body)
253+ if resp.StatusCode != 200 {
254+ return nil, fmt.Errorf("openrouter discover http %d: %s", resp.StatusCode, strings.TrimSpace(string(body)))
255+ }
256+ var page struct {
257+ Data []struct {
258+ ID string `json:"id"`
259+ Name string `json:"name"`
260+ ContextLength int `json:"context_length"`
261+ Pricing struct {
262+ Prompt string `json:"prompt"`
263+ Completion string `json:"completion"`
264+ InputCacheRead string `json:"input_cache_read"`
265+ InputCacheWrite string `json:"input_cache_write"`
266+ } `json:"pricing"`
267+ TopProvider struct {
268+ ContextLength int `json:"context_length"`
269+ MaxCompletionTokens *int `json:"max_completion_tokens"`
270+ } `json:"top_provider"`
271+ SupportedParameters []string `json:"supported_parameters"`
272+ } `json:"data"`
273+ }
274+ if err := json.Unmarshal(body, &page); err != nil {
275+ return nil, fmt.Errorf("openrouter discover parse: %w", err)
276+ }
277+ var out []Model
278+ for _, d := range page.Data {
279+ if d.ID == "" {
280+ continue
281+ }
282+ display := d.Name
283+ if display == "" {
284+ display = d.ID
285+ }
286+ ctxWin := d.ContextLength
287+ if ctxWin == 0 {
288+ ctxWin = d.TopProvider.ContextLength
289+ }
290+ maxOut := 0
291+ if d.TopProvider.MaxCompletionTokens != nil {
292+ maxOut = *d.TopProvider.MaxCompletionTokens
293+ }
294+ out = append(out, Model{
295+ Provider: "openrouter",
296+ ID: d.ID,
297+ DisplayName: display,
298+ ContextWindow: ctxWin,
299+ MaxOutput: maxOut,
300+ Reasoning: openrouterSupportsReasoning(d.SupportedParameters),
301+ PriceInput: perMillionTokens(d.Pricing.Prompt),
302+ PriceOutput: perMillionTokens(d.Pricing.Completion),
303+ PriceCacheRead: perMillionTokens(d.Pricing.InputCacheRead),
304+ PriceCacheWrite: perMillionTokens(d.Pricing.InputCacheWrite),
305+ BaseURL: baseURL,
306+ Source: "live",
307+ })
308+ }
309+ return out, nil
310+}
311+
312+// openrouterSupportsReasoning reports whether OpenRouter's
313+// supported_parameters list marks the model as reasoning-capable.
314+func openrouterSupportsReasoning(params []string) bool {
315+ for _, p := range params {
316+ if p == "reasoning" || p == "include_reasoning" {
317+ return true
318+ }
319+ }
320+ return false
321+}
322+
323+// perMillionTokens converts a per-token USD price string to USD per 1M
324+// tokens. Empty or unparseable values become 0.
325+func perMillionTokens(s string) float64 {
326+ if s == "" {
327+ return 0
328+ }
329+ v, err := strconv.ParseFloat(s, 64)
330+ if err != nil {
331+ return 0
332+ }
333+ return v * 1_000_000
334+}
@@ -6,6 +6,7 @@ import (
6 "fmt"6 "fmt"
7 "io"7 "io"
8 "net/http"8 "net/http"
9+ "strconv"
9 "strings"10 "strings"
10 "time"11 "time"
11 )12 )
@@ -225,3 +226,109 @@ func looksLikeChatModel(id string) bool {
225 }226 }
226 return false227 return false
227 }228 }
229+
230+const openrouterDefaultBaseURL = "https://openrouter.ai/api/v1"
231+
232+// DiscoverOpenRouter lists models from OpenRouter's public /models
233+// endpoint (no auth). Per-token USD prices are converted to USD per 1M
234+// tokens to match the rest of the catalog. baseURL defaults to the
235+// public endpoint.
236+func DiscoverOpenRouter(ctx context.Context, baseURL string) ([]Model, error) {
237+ if baseURL == "" {
238+ baseURL = openrouterDefaultBaseURL
239+ }
240+ baseURL = strings.TrimRight(baseURL, "/")
241+ client := &http.Client{Timeout: 15 * time.Second}
242+ url := baseURL + "/models"
243+ req, err := http.NewRequestWithContext(ctx, "GET", url, nil)
244+ if err != nil {
245+ return nil, err
246+ }
247+ resp, err := client.Do(req)
248+ if err != nil {
249+ return nil, err
250+ }
251+ defer resp.Body.Close()
252+ body, _ := io.ReadAll(resp.Body)
253+ if resp.StatusCode != 200 {
254+ return nil, fmt.Errorf("openrouter discover http %d: %s", resp.StatusCode, strings.TrimSpace(string(body)))
255+ }
256+ var page struct {
257+ Data []struct {
258+ ID string `json:"id"`
259+ Name string `json:"name"`
260+ ContextLength int `json:"context_length"`
261+ Pricing struct {
262+ Prompt string `json:"prompt"`
263+ Completion string `json:"completion"`
264+ InputCacheRead string `json:"input_cache_read"`
265+ InputCacheWrite string `json:"input_cache_write"`
266+ } `json:"pricing"`
267+ TopProvider struct {
268+ ContextLength int `json:"context_length"`
269+ MaxCompletionTokens *int `json:"max_completion_tokens"`
270+ } `json:"top_provider"`
271+ SupportedParameters []string `json:"supported_parameters"`
272+ } `json:"data"`
273+ }
274+ if err := json.Unmarshal(body, &page); err != nil {
275+ return nil, fmt.Errorf("openrouter discover parse: %w", err)
276+ }
277+ var out []Model
278+ for _, d := range page.Data {
279+ if d.ID == "" {
280+ continue
281+ }
282+ display := d.Name
283+ if display == "" {
284+ display = d.ID
285+ }
286+ ctxWin := d.ContextLength
287+ if ctxWin == 0 {
288+ ctxWin = d.TopProvider.ContextLength
289+ }
290+ maxOut := 0
291+ if d.TopProvider.MaxCompletionTokens != nil {
292+ maxOut = *d.TopProvider.MaxCompletionTokens
293+ }
294+ out = append(out, Model{
295+ Provider: "openrouter",
296+ ID: d.ID,
297+ DisplayName: display,
298+ ContextWindow: ctxWin,
299+ MaxOutput: maxOut,
300+ Reasoning: openrouterSupportsReasoning(d.SupportedParameters),
301+ PriceInput: perMillionTokens(d.Pricing.Prompt),
302+ PriceOutput: perMillionTokens(d.Pricing.Completion),
303+ PriceCacheRead: perMillionTokens(d.Pricing.InputCacheRead),
304+ PriceCacheWrite: perMillionTokens(d.Pricing.InputCacheWrite),
305+ BaseURL: baseURL,
306+ Source: "live",
307+ })
308+ }
309+ return out, nil
310+}
311+
312+// openrouterSupportsReasoning reports whether OpenRouter's
313+// supported_parameters list marks the model as reasoning-capable.
314+func openrouterSupportsReasoning(params []string) bool {
315+ for _, p := range params {
316+ if p == "reasoning" || p == "include_reasoning" {
317+ return true
318+ }
319+ }
320+ return false
321+}
322+
323+// perMillionTokens converts a per-token USD price string to USD per 1M
324+// tokens. Empty or unparseable values become 0.
325+func perMillionTokens(s string) float64 {
326+ if s == "" {
327+ return 0
328+ }
329+ v, err := strconv.ParseFloat(s, 64)
330+ if err != nil {
331+ return 0
332+ }
333+ return v * 1_000_000
334+}
M packages/provider/extra_providers.go +1 -1
@@ -112,7 +112,7 @@ func NewXiaomiTokenPlan(region, apiKey, baseURL string) Client {
112112 // NewOpenRouter: OpenRouter aggregator. Unlocks dozens of upstream
113113 // models with one key.
114114 func NewOpenRouter(apiKey, baseURL string) Client {
115- return newOpenAICompat("openrouter", apiKey, baseURL, "https://openrouter.ai/api/v1")
115+ return newOpenAICompat("openrouter", apiKey, baseURL, openrouterDefaultBaseURL)
116116 }
117117
118118 // NewOpenCode is the opencode.ai Zen endpoint. Mixed APIs upstream; this
@@ -112,7 +112,7 @@ func NewXiaomiTokenPlan(region, apiKey, baseURL string) Client {
112 // NewOpenRouter: OpenRouter aggregator. Unlocks dozens of upstream112 // NewOpenRouter: OpenRouter aggregator. Unlocks dozens of upstream
113 // models with one key.113 // models with one key.
114 func NewOpenRouter(apiKey, baseURL string) Client {114 func NewOpenRouter(apiKey, baseURL string) Client {
115- return newOpenAICompat("openrouter", apiKey, baseURL, "https://openrouter.ai/api/v1")115+ return newOpenAICompat("openrouter", apiKey, baseURL, openrouterDefaultBaseURL)
116 }116 }
117 117
118 // NewOpenCode is the opencode.ai Zen endpoint. Mixed APIs upstream; this118 // NewOpenCode is the opencode.ai Zen endpoint. Mixed APIs upstream; this
M packages/provider/models.go +11 -0
@@ -223,6 +223,17 @@ var Catalog = []Model{
223223 PriceInput: 0.075, PriceOutput: 0.3, PriceCacheRead: 0,
224224 },
225225
226+ // ---- OpenRouter ----
227+ // Seed entry only: the default model returned by defaultModelForProvider
228+ // so it resolves offline. The full OpenRouter catalog is discovered live
229+ // (DiscoverOpenRouter) and overlays this on refresh.
230+ {
231+ Provider: "openrouter", ID: "anthropic/claude-sonnet-4.5", DisplayName: "Claude Sonnet 4.5 (OpenRouter)",
232+ ContextWindow: 1000000, MaxOutput: 64000, Reasoning: true,
233+ PriceInput: 3, PriceOutput: 15, PriceCacheRead: 0.3, PriceCacheWrite: 3.75,
234+ BaseURL: openrouterDefaultBaseURL,
235+ },
236+
226237 // ---- Speculative: Anthropic ----
227238 {
228239 Provider: "anthropic", ID: "claude-opus-4-5", DisplayName: "Claude Opus 4.5 (latest)",
@@ -223,6 +223,17 @@ var Catalog = []Model{
223 PriceInput: 0.075, PriceOutput: 0.3, PriceCacheRead: 0,223 PriceInput: 0.075, PriceOutput: 0.3, PriceCacheRead: 0,
224 },224 },
225 225
226+ // ---- OpenRouter ----
227+ // Seed entry only: the default model returned by defaultModelForProvider
228+ // so it resolves offline. The full OpenRouter catalog is discovered live
229+ // (DiscoverOpenRouter) and overlays this on refresh.
230+ {
231+ Provider: "openrouter", ID: "anthropic/claude-sonnet-4.5", DisplayName: "Claude Sonnet 4.5 (OpenRouter)",
232+ ContextWindow: 1000000, MaxOutput: 64000, Reasoning: true,
233+ PriceInput: 3, PriceOutput: 15, PriceCacheRead: 0.3, PriceCacheWrite: 3.75,
234+ BaseURL: openrouterDefaultBaseURL,
235+ },
236+
226 // ---- Speculative: Anthropic ----237 // ---- Speculative: Anthropic ----
227 {238 {
228 Provider: "anthropic", ID: "claude-opus-4-5", DisplayName: "Claude Opus 4.5 (latest)",239 Provider: "anthropic", ID: "claude-opus-4-5", DisplayName: "Claude Opus 4.5 (latest)",
M packages/provider/openai.go +7 -2
@@ -184,7 +184,9 @@ func (c *openaiClient) buildRequest(req Request) (*oaiRequest, error) {
184184 maxTok = m.MaxOutput
185185 }
186186 if m.Reasoning {
187- out.MaxCompletionTok = &maxTok
187+ if maxTok > 0 {
188+ out.MaxCompletionTok = &maxTok
189+ }
188190 effort := OpenAIReasoningEffort(req.Reasoning)
189191 if usesAdaptiveThinking(m) {
190192 // Some gateways expose adaptive-thinking Anthropic models through
@@ -196,7 +198,10 @@ func (c *openaiClient) buildRequest(req Request) (*oaiRequest, error) {
196198 if effort != "" {
197199 out.ReasoningEffort = effort
198200 }
199- } else {
201+ } else if maxTok > 0 {
202+ // Omit max_tokens when unknown (some discovered models don't
203+ // advertise an output cap) so the server applies its own default
204+ // instead of receiving an invalid max_tokens: 0.
200205 out.MaxTokens = &maxTok
201206 }
202207
@@ -184,7 +184,9 @@ func (c *openaiClient) buildRequest(req Request) (*oaiRequest, error) {
184 maxTok = m.MaxOutput184 maxTok = m.MaxOutput
185 }185 }
186 if m.Reasoning {186 if m.Reasoning {
187- out.MaxCompletionTok = &maxTok187+ if maxTok > 0 {
188+ out.MaxCompletionTok = &maxTok
189+ }
188 effort := OpenAIReasoningEffort(req.Reasoning)190 effort := OpenAIReasoningEffort(req.Reasoning)
189 if usesAdaptiveThinking(m) {191 if usesAdaptiveThinking(m) {
190 // Some gateways expose adaptive-thinking Anthropic models through192 // Some gateways expose adaptive-thinking Anthropic models through
@@ -196,7 +198,10 @@ func (c *openaiClient) buildRequest(req Request) (*oaiRequest, error) {
196 if effort != "" {198 if effort != "" {
197 out.ReasoningEffort = effort199 out.ReasoningEffort = effort
198 }200 }
199- } else {201+ } else if maxTok > 0 {
202+ // Omit max_tokens when unknown (some discovered models don't
203+ // advertise an output cap) so the server applies its own default
204+ // instead of receiving an invalid max_tokens: 0.
200 out.MaxTokens = &maxTok205 out.MaxTokens = &maxTok
201 }206 }
202 207
M packages/provider/provider_test.go +67 -0
@@ -306,3 +306,70 @@ func TestOpenAIStreamHappyPath(t *testing.T) {
306306 t.Fatalf("stop=%v", done.Stop)
307307 }
308308 }
309+
310+func TestDiscoverOpenRouter(t *testing.T) {
311+ const body = `{"data":[
312+ {"id":"x/full","pricing":{"prompt":"0.000003","completion":"0.000015"},
313+ "context_length":200000,"top_provider":{"max_completion_tokens":64000},
314+ "supported_parameters":["reasoning"]},
315+ {"id":"x/fallback","top_provider":{"context_length":128000}},
316+ {"id":""}]}`
317+ srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
318+ _, _ = w.Write([]byte(body))
319+ }))
320+ defer srv.Close()
321+
322+ models, err := DiscoverOpenRouter(context.Background(), srv.URL)
323+ if err != nil {
324+ t.Fatal(err)
325+ }
326+ if len(models) != 2 { // empty id dropped
327+ t.Fatalf("want 2 models, got %d", len(models))
328+ }
329+ // per-token USD -> per-1M; reasoning from supported_parameters.
330+ if m := models[0]; m.Provider != "openrouter" || m.ContextWindow != 200000 ||
331+ m.MaxOutput != 64000 || !m.Reasoning || m.PriceInput != 3 || m.PriceOutput != 15 {
332+ t.Errorf("model[0]: %+v", m)
333+ }
334+ // context falls back to top_provider; no reasoning.
335+ if m := models[1]; m.ContextWindow != 128000 || m.MaxOutput != 0 || m.Reasoning {
336+ t.Errorf("model[1]: %+v", m)
337+ }
338+}
339+
340+// TestOpenAIOmitsZeroMaxTokens guards against sending max_tokens: 0 for
341+// discovered models that don't advertise an output cap (MaxOutput == 0).
342+func TestOpenAIOmitsZeroMaxTokens(t *testing.T) {
343+ SetLiveModels([]Model{
344+ {Provider: "openrouter", ID: "vendor/no-cap", DisplayName: "No Cap"},
345+ {Provider: "openrouter", ID: "vendor/reason-no-cap", DisplayName: "Reason No Cap", Reasoning: true},
346+ {Provider: "openrouter", ID: "vendor/capped", DisplayName: "Capped", MaxOutput: 4096},
347+ })
348+ defer SetLiveModels(nil)
349+
350+ c := NewOpenAI("x", "").(*openaiClient)
351+
352+ got, err := c.buildRequest(Request{Model: "vendor/no-cap"})
353+ if err != nil {
354+ t.Fatal(err)
355+ }
356+ if got.MaxTokens != nil {
357+ t.Errorf("expected max_tokens omitted, got %d", *got.MaxTokens)
358+ }
359+
360+ got, err = c.buildRequest(Request{Model: "vendor/reason-no-cap"})
361+ if err != nil {
362+ t.Fatal(err)
363+ }
364+ if got.MaxCompletionTok != nil {
365+ t.Errorf("expected max_completion_tokens omitted, got %d", *got.MaxCompletionTok)
366+ }
367+
368+ got, err = c.buildRequest(Request{Model: "vendor/capped"})
369+ if err != nil {
370+ t.Fatal(err)
371+ }
372+ if got.MaxTokens == nil || *got.MaxTokens != 4096 {
373+ t.Errorf("expected max_tokens 4096, got %v", got.MaxTokens)
374+ }
375+}
@@ -306,3 +306,70 @@ func TestOpenAIStreamHappyPath(t *testing.T) {
306 t.Fatalf("stop=%v", done.Stop)306 t.Fatalf("stop=%v", done.Stop)
307 }307 }
308 }308 }
309+
310+func TestDiscoverOpenRouter(t *testing.T) {
311+ const body = `{"data":[
312+ {"id":"x/full","pricing":{"prompt":"0.000003","completion":"0.000015"},
313+ "context_length":200000,"top_provider":{"max_completion_tokens":64000},
314+ "supported_parameters":["reasoning"]},
315+ {"id":"x/fallback","top_provider":{"context_length":128000}},
316+ {"id":""}]}`
317+ srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
318+ _, _ = w.Write([]byte(body))
319+ }))
320+ defer srv.Close()
321+
322+ models, err := DiscoverOpenRouter(context.Background(), srv.URL)
323+ if err != nil {
324+ t.Fatal(err)
325+ }
326+ if len(models) != 2 { // empty id dropped
327+ t.Fatalf("want 2 models, got %d", len(models))
328+ }
329+ // per-token USD -> per-1M; reasoning from supported_parameters.
330+ if m := models[0]; m.Provider != "openrouter" || m.ContextWindow != 200000 ||
331+ m.MaxOutput != 64000 || !m.Reasoning || m.PriceInput != 3 || m.PriceOutput != 15 {
332+ t.Errorf("model[0]: %+v", m)
333+ }
334+ // context falls back to top_provider; no reasoning.
335+ if m := models[1]; m.ContextWindow != 128000 || m.MaxOutput != 0 || m.Reasoning {
336+ t.Errorf("model[1]: %+v", m)
337+ }
338+}
339+
340+// TestOpenAIOmitsZeroMaxTokens guards against sending max_tokens: 0 for
341+// discovered models that don't advertise an output cap (MaxOutput == 0).
342+func TestOpenAIOmitsZeroMaxTokens(t *testing.T) {
343+ SetLiveModels([]Model{
344+ {Provider: "openrouter", ID: "vendor/no-cap", DisplayName: "No Cap"},
345+ {Provider: "openrouter", ID: "vendor/reason-no-cap", DisplayName: "Reason No Cap", Reasoning: true},
346+ {Provider: "openrouter", ID: "vendor/capped", DisplayName: "Capped", MaxOutput: 4096},
347+ })
348+ defer SetLiveModels(nil)
349+
350+ c := NewOpenAI("x", "").(*openaiClient)
351+
352+ got, err := c.buildRequest(Request{Model: "vendor/no-cap"})
353+ if err != nil {
354+ t.Fatal(err)
355+ }
356+ if got.MaxTokens != nil {
357+ t.Errorf("expected max_tokens omitted, got %d", *got.MaxTokens)
358+ }
359+
360+ got, err = c.buildRequest(Request{Model: "vendor/reason-no-cap"})
361+ if err != nil {
362+ t.Fatal(err)
363+ }
364+ if got.MaxCompletionTok != nil {
365+ t.Errorf("expected max_completion_tokens omitted, got %d", *got.MaxCompletionTok)
366+ }
367+
368+ got, err = c.buildRequest(Request{Model: "vendor/capped"})
369+ if err != nil {
370+ t.Fatal(err)
371+ }
372+ if got.MaxTokens == nil || *got.MaxTokens != 4096 {
373+ t.Errorf("expected max_tokens 4096, got %v", got.MaxTokens)
374+ }
375+}

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 1

Tags 476

↑↓ moveenter openesc close