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>
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) { | |||
| 317 | 317 | // never shows a "not logged in" banner. | |
| 318 | 318 | userPickedProvider := args.Provider != "" | |
| 319 | 319 | 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" { | |
| 322 | 329 | continue | |
| 323 | 330 | } | |
| 324 | 331 | 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 | continue | 329 | 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) { | |||
| 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 | 145 | func TestResolveOllamaUsesModelBaseURLBeforeDefault(t *testing.T) { | |
| 115 | 146 | t.Setenv("ZOT_HOME", t.TempDir()) | |
| 116 | 147 | 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() { | |||
| 150 | 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 | 161 | if len(all) == 0 { | |
| 155 | 162 | 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 | return | 162 | return | ||
M packages/provider/catalog_builtin.go +1 -272
| @@ -307,39 +307,7 @@ var builtinCatalog = []Model{ | |||
| 307 | 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 | 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 | 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 ----- | |
| 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. | |
| 343 | 311 | // ----- together ----- | |
| 344 | 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 | 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 | 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 | 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 | 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 | } | |
| @@ -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 ( | |||
| 6 | 6 | "fmt" | |
| 7 | 7 | "io" | |
| 8 | 8 | "net/http" | |
| 9 | + | "strconv" | |
| 9 | 10 | "strings" | |
| 10 | 11 | "time" | |
| 11 | 12 | ) | |
| @@ -225,3 +226,109 @@ func looksLikeChatModel(id string) bool { | |||
| 225 | 226 | } | |
| 226 | 227 | 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 | + | } | |
| @@ -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 false | 227 | 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 { | |||
| 112 | 112 | // NewOpenRouter: OpenRouter aggregator. Unlocks dozens of upstream | |
| 113 | 113 | // models with one key. | |
| 114 | 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 | 118 | // 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 upstream | 112 | // 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; this | 118 | // 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{ | |||
| 223 | 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 | 237 | // ---- Speculative: Anthropic ---- | |
| 227 | 238 | { | |
| 228 | 239 | 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) { | |||
| 184 | 184 | maxTok = m.MaxOutput | |
| 185 | 185 | } | |
| 186 | 186 | if m.Reasoning { | |
| 187 | - | out.MaxCompletionTok = &maxTok | |
| 187 | + | if maxTok > 0 { | |
| 188 | + | out.MaxCompletionTok = &maxTok | |
| 189 | + | } | |
| 188 | 190 | effort := OpenAIReasoningEffort(req.Reasoning) | |
| 189 | 191 | if usesAdaptiveThinking(m) { | |
| 190 | 192 | // Some gateways expose adaptive-thinking Anthropic models through | |
| @@ -196,7 +198,10 @@ func (c *openaiClient) buildRequest(req Request) (*oaiRequest, error) { | |||
| 196 | 198 | if effort != "" { | |
| 197 | 199 | 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 | 205 | out.MaxTokens = &maxTok | |
| 201 | 206 | } | |
| 202 | 207 | ||
| @@ -184,7 +184,9 @@ func (c *openaiClient) buildRequest(req Request) (*oaiRequest, error) { | |||||
| 184 | maxTok = m.MaxOutput | 184 | maxTok = m.MaxOutput | ||
| 185 | } | 185 | } | ||
| 186 | if m.Reasoning { | 186 | if m.Reasoning { | ||
| 187 | - | out.MaxCompletionTok = &maxTok | 187 | + | 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 through | 192 | // 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 = effort | 199 | 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 = &maxTok | 205 | out.MaxTokens = &maxTok | ||
| 201 | } | 206 | } | ||
| 202 | 207 | ||||
M packages/provider/provider_test.go +67 -0
| @@ -306,3 +306,70 @@ func TestOpenAIStreamHappyPath(t *testing.T) { | |||
| 306 | 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 | + | } | |
| @@ -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 | + | } | |||