From 35788c2783cd8dc0f04de461cf9f42b3ee1793b7 Mon Sep 17 00:00:00 2001 From: KimiSwitch Dev Date: Sat, 10 Oct 2026 19:50:03 +0800 Subject: [PATCH] =?UTF-8?q?fix(config):=20=E4=BE=9B=E5=BA=94=E5=95=86?= =?UTF-8?q?=E6=94=B9=E5=90=8D=E5=90=8C=E6=AD=A5=E9=87=8D=E9=94=AE=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E5=88=AB=E5=90=8D=20+=20=E5=88=A0=E9=99=A4=E6=97=B6?= =?UTF-8?q?=E6=B8=85=E7=90=86=E5=85=B3=E8=81=94=E9=85=8D=E7=BD=AE=EF=BC=88?= =?UTF-8?q?v0.8.3-rc1=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复「改名后模型别名保留旧前缀,僵尸条目删了又出现」这一类配置不一致。 - 改名时同步重键模型别名、全局默认模型、供应商记住的默认模型、子代理池条目 - 改名冲突(撞已存在供应商名 / 遗留裸别名)加 -2/-3 后缀,不再静默吞模型 - 修复复制供应商复用移动语义 rekey 导致源供应商模型被清空 - 加载时不再合并「供应商已不存在」的 SQLite 僵尸模型 - 删除供应商/模型时清理子代理池条目、池默认回落、default_model 置空、 SQLite 用量查询配置(不误删另一 agent,读取失败即跳过) - 防呆:复制供应商改为 dirty-only,放弃修改不再落盘 - 测试基建:统一 crate 级 test_state 锁,消除环境变量并发竞争 测试:前端 146(新增 16)、Rust 197(新增 4) --- CHANGELOG.md | 14 + docs/LOCAL-VERIFY-fixes.md | 81 + .../release-notes/release-notes-v0.8.3-rc1.md | 43 + package.json | 2 +- public/models-dev.json | 2305 +++++++-------- src-tauri/Cargo.lock | 2 +- src-tauri/Cargo.toml | 2 +- src-tauri/src/commands.rs | 297 +- src-tauri/src/dashboard.rs | 3 +- src-tauri/src/db.rs | 27 + src-tauri/src/lib.rs | 14 + src-tauri/src/oauth.rs | 3 +- src-tauri/tauri.conf.json | 2 +- src/App.tsx | 100 +- src/lib/models-dev-full.json | 2470 ++++++++--------- src/lib/models-dev.json | 2305 +++++++-------- src/lib/providerRename.test.ts | 120 + src/lib/providerRename.ts | 79 + src/lib/referenceCleanup.test.ts | 124 + src/lib/referenceCleanup.ts | 117 + 20 files changed, 4217 insertions(+), 3893 deletions(-) create mode 100644 docs/LOCAL-VERIFY-fixes.md create mode 100644 docs/release-notes/release-notes-v0.8.3-rc1.md create mode 100644 src/lib/providerRename.test.ts create mode 100644 src/lib/providerRename.ts create mode 100644 src/lib/referenceCleanup.test.ts create mode 100644 src/lib/referenceCleanup.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f0514d..ae21e17 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,20 @@ --- +## v0.8.3-rc1 (2026-10-10) + +配置一致性修复预发布版(RC,请先本地验证)。 + +- **供应商改名时模型别名同步重键**:此前只改模型的 `provider` 字段,别名键保留旧前缀(如 `opencode-go-copy/...`)形成僵尸条目;现在模型别名、全局默认模型、供应商记住的默认模型、子代理池条目全部同步更新 +- **僵尸模型不再复活**:加载时 SQLite 镜像会把 config.toml 中缺失的模型合并回来,导致已删模型保存后重现;现在供应商已不存在的模型不再合并 +- **改名冲突不再静默吞模型**:改名撞已存在的供应商名或遗留裸别名时,目标别名自动加 `-2`/`-3` 后缀 +- **复制供应商不再清空源供应商**:修复复制复用改名逻辑(移动语义)导致源供应商模型被搬走;副本独立、源完整 +- **删除供应商/模型的关联清理**:子代理模型池中引用被删模型的条目一并移除;池默认模型自动回落到剩余条目(池清空则移除整节);`default_model` 置空;SQLite 中该供应商的用量查询配置随之清理,且不误删另一 agent(Pi)的设置 +- **防呆:放弃修改不落盘**:复制供应商不再立即静默保存,与其他编辑一致,放弃后配置保持原样 +- 修复测试基建中 `KIMI_CODE_HOME` / `KIMI_SWITCH_DB_PATH` 的并发竞争(统一 crate 级共享锁) +- models.dev 快照同步至 2026-10-10(8,456 模型 / 226 供应商) +- 测试:前端 146 项(新增 16 项)、Rust 197 项(新增 4 项) + ## v0.8.2 (2026-10-09) 性能专项,功能与数据口径不变(用量数字、字段、IPC 接口、导出格式均与 v0.8.1 一致)。 diff --git a/docs/LOCAL-VERIFY-fixes.md b/docs/LOCAL-VERIFY-fixes.md new file mode 100644 index 0000000..5d97031 --- /dev/null +++ b/docs/LOCAL-VERIFY-fixes.md @@ -0,0 +1,81 @@ +# 本地验证清单 — 配置一致性修复(待发 v0.8.3) + +构建版本:0.8.2(含未提交改动)。自动化测试已全绿(前端 146 / Rust 197), +以下是**必须人工验证**的场景,重点是引擎侧对配置结构的实际反应。 + +验证前备份:`~/.kimi-code/config.toml`、`~/.kimi-switch/kimi-switch.db` + +--- + +## 0. 前置:确认基线干净 + +- [ ] 打开 `~/.kimi-code/config.toml`,搜索 `opencode-go-copy` / `opencode-go-1` → 应为 0 命中 +- [ ] KimiSwitch 供应商列表中 `opencode-go` 正常显示,模型 3 条(longcat / mimo / step-5) +- [ ] 高级设置 → 子代理模型池中 3 条 opencode-go 条目都在 +- [ ] kimi-code 会话能正常启动(`kimi` 命令),确认 `default_model` 生效 + +--- + +## 1. 复制供应商(本次修复的严重回归点) + +- [ ] 供应商列表 → `opencode-go` 点「复制」 +- [ ] **源供应商 `opencode-go` 的 3 个模型仍在**(这是关键:旧实现会清空) +- [ ] 副本 `opencode-go-copy` 也有 3 个模型,别名带 `-copy` 前缀 +- [ ] 副本默认状态为「未启用 / 未使用中」 +- [ ] 点返回 → 弹出未保存确认 → 选「放弃」→ **列表里副本消失**(验证防呆:放弃不落盘) +- [ ] 重新复制 → Ctrl+S 保存 → 重启应用 → 副本仍在(验证保存生效) +- [ ] 删除副本 → Ctrl+S → 重启 → 副本消失,`opencode-go` 完好 + +## 2. 供应商改名(僵尸别名根源) + +- [ ] 编辑 `opencode-go-copy` → 名称改为 `opencode-renamed` → 保存 → 返回 +- [ ] `config.toml` 中该供应商的模型别名变为 `opencode-renamed/*`,**无 `opencode-go-copy/*` 残留** +- [ ] 全局默认模型、该供应商记住的默认模型都指向新别名 +- [ ] 子代理池中若有副本的条目,键同步变为新别名(描述保留) +- [ ] kimi-code 会话能启动,默认模型正确 + +## 3. 删除供应商(关联清理) + +- [ ] 先把某个模型加入子代理池,并设为池默认 +- [ ] 删除该供应商 → Ctrl+S → 打开 `config.toml` 检查: + - [ ] 该供应商的 `[models.*]` 段落全部消失 + - [ ] `[secondary_model.models]` 中引用它的条目已消失 + - [ ] 池 `default_model` / `model` 已回落到剩余条目(不是悬空) + - [ ] 池被清空时整个 `[secondary_model]` 节消失 + - [ ] `default_model` 若指向被删模型则为 `""` 或不再指向它 + - [ ] **kimi-code 会话能正常启动**(重点:验证引擎对 `default_model = ""` 的容忍度) +- [ ] SQLite 检查:`~/.kimi-switch/kimi-switch.db` 的 `settings` 表中 + `usage_kinds:<该供应商名>` / `usage_config:<该供应商名>` 行已删除 +- [ ] 无关的 settings 行(如 `app.language`)未受影响 + +## 4. 删除单个模型 + +- [ ] 把某模型加入子代理池 → 编辑该供应商 → 删除该模型 → 保存 +- [ ] `config.toml` 中 `[secondary_model.models]` 对应条目消失 +- [ ] 池默认为被删模型时已回落到其他条目 + +## 5. 防呆:放弃修改不落盘 + +- [ ] 编辑供应商改名 → 点返回 → 选「放弃」→ 重新打开:名称为旧名,**config.toml 未变** +- [ ] 删除模型 → 点返回 → 放弃 → 重新打开:模型仍在 +- [ ] 复制供应商 → 放弃 → 副本消失 +- [ ] 任何改动后不点保存就关闭应用 → 重启后配置不变 + +## 6. Pi agent 不受牵连 + +- [ ] 切到 Pi agent 面板,确认其供应商与用量查询配置正常 +- [ ] 切回 KimiCode 保存一次 → 再看 Pi 的用量查询设置,应仍在 +- [ ] 检查 SQLite `settings` 表:Pi 供应商的 `usage_*` 行未被误删 + +## 7. 防呆:改名冲突 + +- [ ] 存在 `opencode-go` 和 `opencode-go-copy` 时,把后者改名为 `opencode-go` 并保存 +- [ ] 结果:两个供应商条目与各自模型都保留,冲突方别名带 `-2` 后缀,**无静默丢模型** + +--- + +## 已知遗留(不属于本次范围) + +- config.toml 中若存在 provider 已删除的僵尸 `[models.*]` 段落,应用不会自动删除 + (用户权威文件,只防复发),需手动清理一次 +- `default_model = ""` 时 kimi-code CLI 的确切回退行为,建议实测确认 \ No newline at end of file diff --git a/docs/release-notes/release-notes-v0.8.3-rc1.md b/docs/release-notes/release-notes-v0.8.3-rc1.md new file mode 100644 index 0000000..58fd354 --- /dev/null +++ b/docs/release-notes/release-notes-v0.8.3-rc1.md @@ -0,0 +1,43 @@ +# KimiSwitch v0.8.3-rc1 + +配置一致性修复版:解决「供应商改名后模型别名没跟着改,产生的僵尸条目删了又出现」这一类问题,并补齐删除供应商时的关联清理与防呆。 + +## 修复 + +- **供应商改名时模型别名同步重键**:此前改名只更新模型的 `provider` 字段,模型别名键仍保留旧前缀(如 `opencode-go-copy/...`),形成永远指向新供应商的僵尸条目;现在别名、全局默认模型、该供应商记住的默认模型、子代理池条目全部同步更新 +- **僵尸模型不再复活**:应用加载时会把 SQLite 镜像中缺失于 config.toml 的模型合并回来(迁移保护),导致已删除的模型在保存后重新出现;现在供应商已不存在的模型不再被合并 +- **改名冲突不再静默吞模型**:改名为已存在的供应商名、或遗留裸别名与新名冲突时,目标别名自动加 `-2`/`-3` 后缀,与「应用 JSON」路径的既有规则一致 +- **复制供应商不再清空源供应商**:修复复制时复用改名逻辑导致源供应商模型被整体搬走的问题;副本为独立副本,源供应商模型完整保留 + +## 删除供应商 / 模型时的关联清理 + +- 子代理模型池(`[secondary_model]`)中引用被删模型的条目一并移除 +- 池默认模型指向被删模型时自动回落到池中剩余条目;池被清空时整个 `[secondary_model]` 节移除 +- 全局 `default_model` 指向被删模型时置空 +- SQLite 中该供应商的用量查询配置(`usage_kinds:` / `usage_config:`)随之清理;保留另一 agent(Pi)的设置,读取失败时跳过清理而非误删 +- 模型占位符自动改名为真实模型 id 时,池条目同步跟随 + +## 防呆 + +- **放弃修改不落盘**:复制供应商不再立即静默保存,与其他编辑一致——点「返回」并放弃后配置保持原样 +- 改名/删除/JSON 应用等所有编辑路径统一遵守「必须保存才写盘」 + +## 其他 + +- 修复测试基建中进程级环境变量(`KIMI_CODE_HOME` / `KIMI_SWITCH_DB_PATH`)的并发竞争:dashboard 与 oauth 测试此前各自持锁,改为统一的 crate 级共享锁 +- models.dev 快照同步至 2026-10-10(8,456 模型 / 226 供应商) + +## 测试 + +- 前端 146 项(新增 16 项:改名重键、复制保留源、冲突去重、子代理池清理与空表防护) +- Rust 197 项(新增 4 项:删除后双存储持久化与不复活、孤儿配置修剪、跨 agent 修剪保护) + +## 已知限制 + +- config.toml 中若已存在「供应商已删除」的僵尸 `[models.*]` 段落,升级后不会自动删除(config.toml 是用户权威文件,本版只防复发),需在界面中手动删除一次 +- 删除供应商后 `default_model` 置空时的 kimi-code CLI 回退行为,建议实测确认 + +## 下载 + +- **Windows**:`.exe`(NSIS 安装包,本版仅提供) +- **macOS / Linux**:见 [Releases](https://github.com/billowliu2/KimiSwitch/releases)(由 CI 构建) \ No newline at end of file diff --git a/package.json b/package.json index 4a13299..cde2cbd 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "kimiswitch", "private": true, - "version": "0.8.2", + "version": "0.8.3-rc1", "type": "module", "scripts": { "dev": "vite", diff --git a/public/models-dev.json b/public/models-dev.json index 5d632ae..ab64d4c 100644 --- a/public/models-dev.json +++ b/public/models-dev.json @@ -1,5 +1,5 @@ { - "last_updated": "2026-10-09", + "last_updated": "2026-10-10", "deepinfra/tencent/Hy3": { "name": "Hy3", "context": 262144, @@ -273,6 +273,18 @@ "cache_read": 0.5 } }, + "deepinfra/Qwen/Qwen3-VL-30B-A3B-Instruct": { + "name": "Qwen3 VL 30B A3B Instruct", + "context": 262144, + "output": 32768, + "tool_call": true, + "structured_output": true, + "image": true, + "cost": { + "input": 0.15, + "output": 0.6 + } + }, "deepinfra/Qwen/Qwen3.8-Max": { "name": "Qwen3.8 Max", "context": 256000, @@ -3289,19 +3301,6 @@ "cache_read": 2 } }, - "empiriolabs/deepseek-v3-2": { - "name": "DeepSeek V3.2", - "context": 128000, - "output": 32768, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.57, - "output": 1.71, - "cache_read": 0.57 - } - }, "empiriolabs/minimax-m2-7-highspeed": { "name": "MiniMax M2.7 Highspeed", "context": 200000, @@ -3328,19 +3327,6 @@ "cache_read": 0.018 } }, - "empiriolabs/qwen3-max": { - "name": "Qwen3 Max", - "context": 256000, - "output": 65536, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 1.08, - "output": 5.52, - "cache_read": 1.08 - } - }, "empiriolabs/seed-2-0-pro": { "name": "Seed 2.0 Pro", "context": 256000, @@ -3914,19 +3900,6 @@ "cache_read": 1 } }, - "empiriolabs/qwen3-6-max-preview": { - "name": "Qwen3.6 Max Preview", - "context": 256000, - "output": 65536, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 1.31, - "output": 7.88, - "cache_read": 1.31 - } - }, "empiriolabs/step-3-7-flash": { "name": "Step 3.7 Flash", "context": 256000, @@ -3984,19 +3957,6 @@ "cache_read": 0.025 } }, - "empiriolabs/deepseek-v4-flash": { - "name": "DeepSeek V4 Flash", - "context": 1000000, - "output": 393216, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.14, - "output": 0.28, - "cache_read": 0.14 - } - }, "sensenova/kimi-k3": { "name": "Kimi K3", "context": 1048576, @@ -4655,6 +4615,17 @@ "cache_read": 0.26 } }, + "cloudflare-workers-ai/@cf/cloudflare/clef-omni": { + "name": "Clef Omni", + "context": 65536, + "output": 65536, + "structured_output": true, + "image": true, + "cost": { + "input": 0.15, + "output": 0 + } + }, "cloudflare-workers-ai/@cf/nvidia/nemotron-3-120b-a12b": { "name": "Nemotron 3 Super 120B", "context": 256000, @@ -5386,9 +5357,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.7, + "input": 0.6, "output": 2.2, - "cache_read": 0.13 + "cache_read": 0.2 } }, "nano-gpt/gemma-4-26b-a4b-it-shadowsiren": { @@ -5423,9 +5394,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.7, + "input": 0.6, "output": 2.2, - "cache_read": 0.13 + "cache_read": 0.2 } }, "nano-gpt/deepseek-chat": { @@ -5461,9 +5432,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.7, + "input": 0.6, "output": 2.2, - "cache_read": 0.13, + "cache_read": 0.2, "cache_write": 0.08333 } }, @@ -5495,9 +5466,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.7, + "input": 0.6, "output": 2.2, - "cache_read": 0.13, + "cache_read": 0.2, "cache_write": 0.08333 } }, @@ -5561,9 +5532,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.7, + "input": 0.6, "output": 2.2, - "cache_read": 0.13 + "cache_read": 0.2 } }, "nano-gpt/gemini-2.5-flash-preview-05-20": { @@ -6152,9 +6123,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.7, + "input": 0.6, "output": 2.2, - "cache_read": 0.13 + "cache_read": 0.2 } }, "nano-gpt/Gemma-4-31B-DarkIdol": { @@ -7031,9 +7002,9 @@ "structured_output": true, "image": true, "cost": { - "input": 0.44, - "output": 1.32, - "cache_read": 0.014 + "input": 0.22, + "output": 0.66, + "cache_read": 0.007 } }, "nano-gpt/deepseek/deepseek-v3.2:thinking": { @@ -7635,9 +7606,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.7, + "input": 0.6, "output": 2.2, - "cache_read": 0.13 + "cache_read": 0.2 } }, "nano-gpt/z-ai/glm-5": { @@ -7948,9 +7919,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.7, + "input": 0.6, "output": 2.2, - "cache_read": 0.13 + "cache_read": 0.2 } }, "nano-gpt/z-ai/glm-5.3-flash-cybersecurity": { @@ -7974,9 +7945,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.7, + "input": 0.6, "output": 2.2, - "cache_read": 0.13 + "cache_read": 0.2 } }, "nano-gpt/inference-net/schematron-v2-small": { @@ -10874,9 +10845,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.2, - "output": 1.5, - "cache_read": 0.1 + "input": 0.250251, + "output": 0.80293, + "cache_read": 0.079764 } }, "nano-gpt/qwen/qwen3-coder": { @@ -11106,8 +11077,8 @@ "structured_output": true, "image": true, "cost": { - "input": 0.15, - "output": 1.2, + "input": 0.75, + "output": 2.5, "cache_read": 0.125 } }, @@ -11157,8 +11128,8 @@ "structured_output": true, "image": true, "cost": { - "input": 0.15, - "output": 1.2, + "input": 0.75, + "output": 2.5, "cache_read": 0.125 } }, @@ -13161,21 +13132,6 @@ "output": 0.6 } }, - "tinfoil/glm-5-3-flash": { - "name": "GLM-5.3-Flash", - "context": 1048576, - "output": 131072, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "image": true, - "video": true, - "cost": { - "input": 0.4, - "output": 1.25, - "cache_read": 0.1 - } - }, "tinfoil/kimi-k3": { "name": "Kimi K3", "context": 262144, @@ -19836,16 +19792,6 @@ "cache_write": 3.125 } }, - "llmgateway-providers/alibaba/qwen-coder-plus": { - "name": "Qwen Coder Plus (Alibaba Cloud)", - "context": 131072, - "output": 8192, - "tool_call": true, - "cost": { - "input": 0.502, - "output": 1.004 - } - }, "llmgateway-providers/alibaba/qwen3-vl-plus": { "name": "Qwen3 VL Plus (Alibaba Cloud)", "context": 262144, @@ -19962,31 +19908,6 @@ "cache_write": 0.0375 } }, - "llmgateway-providers/alibaba/qwen3-max": { - "name": "Qwen3 Max (Alibaba Cloud)", - "context": 256000, - "output": 32800, - "reasoning": true, - "tool_call": true, - "cost": { - "input": 1.2, - "output": 6, - "cache_read": 0.24, - "cache_write": 1.5 - } - }, - "llmgateway-providers/alibaba/qwen3-vl-flash": { - "name": "Qwen3 VL Flash (Alibaba Cloud)", - "context": 262144, - "output": 32768, - "tool_call": true, - "image": true, - "cost": { - "input": 0.05, - "output": 0.4, - "cache_read": 0.01 - } - }, "llmgateway-providers/alibaba/qwen3.5-122b-a10b": { "name": "Qwen3.5 122B A10B (Alibaba Cloud)", "context": 262144, @@ -20053,18 +19974,6 @@ "cache_write": 0.375 } }, - "llmgateway-providers/alibaba/qwen3-coder-plus": { - "name": "Qwen3 Coder Plus (Alibaba Cloud)", - "context": 1000000, - "output": 66000, - "tool_call": true, - "cost": { - "input": 1, - "output": 5, - "cache_read": 0.2, - "cache_write": 1.25 - } - }, "llmgateway-providers/alibaba/qwen3.8-flash": { "name": "Qwen3.8 Flash (Alibaba Cloud)", "context": 983616, @@ -20106,18 +20015,6 @@ "output": 2 } }, - "llmgateway-providers/alibaba/qwen3.6-max-preview": { - "name": "Qwen3.6 Max Preview (Alibaba Cloud)", - "context": 262144, - "output": 65536, - "reasoning": true, - "tool_call": true, - "cost": { - "input": 1.3, - "output": 7.8, - "cache_read": 0.13 - } - }, "llmgateway-providers/alibaba/glm-5.2": { "name": "GLM-5.2 (Alibaba Cloud)", "context": 1000000, @@ -20130,17 +20027,6 @@ "cache_read": 0.28 } }, - "llmgateway-providers/alibaba/qwen-omni-turbo": { - "name": "Qwen Omni Turbo (Alibaba Cloud)", - "context": 32768, - "output": 8192, - "image": true, - "video": true, - "cost": { - "input": 0.2, - "output": 0.8 - } - }, "llmgateway-providers/alibaba/deepseek-v4-pro": { "name": "DeepSeek V4 Pro (Alibaba Cloud)", "context": 1000000, @@ -20356,6 +20242,87 @@ "cache_read": 0.012 } }, + "llmgateway-providers/reka-ai/reka-edge-2603": { + "name": "Reka Edge 2603 (reka-ai)", + "context": 16384, + "output": 16384, + "tool_call": true, + "structured_output": true, + "image": true, + "cost": { + "input": 0.1, + "output": 0.1 + } + }, + "llmgateway-providers/reka-ai/qwen3.8-27b": { + "name": "Qwen3.8 27B (reka-ai)", + "context": 262144, + "output": 262144, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true, + "video": true, + "cost": { + "input": 0.2, + "output": 2.5, + "cache_read": 0.05 + } + }, + "llmgateway-providers/reka-ai/glm-5.3-flash": { + "name": "GLM-5.3 Flash (reka-ai)", + "context": 262144, + "output": 262144, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true, + "video": true, + "cost": { + "input": 0.15, + "output": 0.5, + "cache_read": 0.015 + } + }, + "llmgateway-providers/reka-ai/deepseek-v4-pro": { + "name": "DeepSeek V4 Pro (reka-ai)", + "context": 1048576, + "output": 393216, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "cost": { + "input": 1.2, + "output": 3.3, + "cache_read": 0.13 + } + }, + "llmgateway-providers/reka-ai/glm-5.3": { + "name": "GLM-5.3 (reka-ai)", + "context": 1048576, + "output": 262144, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "cost": { + "input": 1.17, + "output": 3.96, + "cache_read": 0.234 + } + }, + "llmgateway-providers/reka-ai/deepseek-v4-flash": { + "name": "DeepSeek V4 Flash (reka-ai)", + "context": 262144, + "output": 131072, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "cost": { + "input": 0.11, + "output": 0.66, + "cache_read": 0.007 + } + }, "llmgateway-providers/bytedance/seed-1-6-flash-250715": { "name": "Seed 1.6 Flash (250715) (ByteDance)", "context": 256000, @@ -21557,7 +21524,8 @@ "cost": { "input": 1, "output": 5, - "cache_read": 0.1 + "cache_read": 0.1, + "cache_write": 1.25 } }, "llmgateway-providers/vertex-anthropic/claude-sonnet-4-5": { @@ -21571,7 +21539,8 @@ "cost": { "input": 3, "output": 15, - "cache_read": 0.3 + "cache_read": 0.3, + "cache_write": 3.75 } }, "llmgateway-providers/vertex-anthropic/claude-opus-4-5-20251101": { @@ -21585,7 +21554,8 @@ "cost": { "input": 5, "output": 25, - "cache_read": 0.5 + "cache_read": 0.5, + "cache_write": 6.25 } }, "llmgateway-providers/vertex-anthropic/claude-sonnet-5": { @@ -21614,7 +21584,8 @@ "cost": { "input": 5, "output": 25, - "cache_read": 0.5 + "cache_read": 0.5, + "cache_write": 6.25 } }, "llmgateway-providers/vertex-anthropic/claude-sonnet-4-6": { @@ -21628,7 +21599,8 @@ "cost": { "input": 3, "output": 15, - "cache_read": 0.3 + "cache_read": 0.3, + "cache_write": 3.75 } }, "llmgateway-providers/vertex-anthropic/claude-opus-4-7": { @@ -21642,7 +21614,8 @@ "cost": { "input": 5, "output": 25, - "cache_read": 0.5 + "cache_read": 0.5, + "cache_write": 6.25 } }, "llmgateway-providers/vertex-openai/qwen3-235b-a22b-instruct-2507": { @@ -22870,8 +22843,8 @@ "image": true, "video": true, "cost": { - "input": 0.49, - "output": 13, + "input": 0.33, + "output": 14.89, "cache_read": 0.3 } }, @@ -23406,7 +23379,7 @@ } }, "kilo/deepseek/deepseek-r1-0528": { - "name": "DeepSeek: R1 0528", + "name": "DeepSeek R1 0528", "context": 163840, "output": 32768, "reasoning": true, @@ -23427,8 +23400,8 @@ "structured_output": true, "cost": { "input": 0.259, - "output": 0.42, - "cache_read": 0.135 + "output": 0.8, + "cache_read": 0.14 } }, "kilo/deepseek/deepseek-v4-flash": { @@ -23439,9 +23412,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.14, - "output": 0.28, - "cache_read": 0.028 + "input": 0.0182, + "output": 1.28, + "cache_read": 0.0182 } }, "kilo/unbiased/pareto-26.10-preview": { @@ -23614,7 +23587,7 @@ } }, "kilo/meta-llama/llama-3.2-1b-instruct": { - "name": "Meta: Llama 3.2 1B Instruct", + "name": "Llama 3.2 1B Instruct", "context": 60000, "output": 54000, "cost": { @@ -23771,15 +23744,15 @@ }, "kilo/z-ai/glm-4.6": { "name": "GLM-4.6", - "context": 198000, - "output": 16384, + "context": 202752, + "output": 131072, "reasoning": true, "tool_call": true, "structured_output": true, "cost": { - "input": 0.43, - "output": 1.75, - "cache_read": 0.08 + "input": 0.5, + "output": 2, + "cache_read": 0.1 } }, "kilo/z-ai/glm-5": { @@ -24201,29 +24174,29 @@ "kilo/~z-ai/glm-flash-latest": { "name": "Z.ai: GLM Flash Latest", "context": 1048576, - "output": 943718, + "output": 131072, "reasoning": true, "tool_call": true, "structured_output": true, "image": true, "video": true, "cost": { - "input": 0.032, - "output": 1.428579, - "cache_read": 0.02 + "input": 0.04, + "output": 0.5, + "cache_read": 0.0125 } }, "kilo/~z-ai/glm-latest": { "name": "Z.ai: GLM Latest", "context": 1048576, - "output": 131072, + "output": 943718, "reasoning": true, "tool_call": true, "structured_output": true, "cost": { - "input": 0.0312, - "output": 4.4, - "cache_read": 0.029 + "input": 0.039, + "output": 4.8, + "cache_read": 0.038 } }, "kilo/arcee-ai/trinity-large-thinking": { @@ -24558,22 +24531,22 @@ "structured_output": true, "image": true, "cost": { - "input": 0.016, - "output": 1.2, - "cache_read": 0.01 + "input": 0.0001, + "output": 0.6, + "cache_read": 0.005 } }, "kilo/~deepseek/deepseek-pro-latest": { "name": "DeepSeek: DeepSeek Pro Latest", "context": 1048576, - "output": 393216, + "output": 943718, "reasoning": true, "tool_call": true, "structured_output": true, "cost": { - "input": 0.198, - "output": 8, - "cache_read": 0.2 + "input": 0.3, + "output": 5, + "cache_read": 0.219 } }, "kilo/~deepseek/deepseek-v4-flash-latest": { @@ -24584,9 +24557,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.00368, - "output": 0.134075, - "cache_read": 0.00368 + "input": 0.0099, + "output": 1.28, + "cache_read": 0.0099 } }, "kilo/~x-ai/grok-latest": { @@ -25399,7 +25372,7 @@ } }, "kilo/inclusionai/ling-3.1-flash": { - "name": "inclusionAI: Ling 3.1 Flash (new)", + "name": "inclusionAI: Ling 3.1 Flash", "context": 262144, "output": 32768, "reasoning": true, @@ -25442,7 +25415,6 @@ "output": 32768, "reasoning": true, "tool_call": true, - "structured_output": true, "cost": { "input": 0.075, "output": 0.22, @@ -25476,19 +25448,20 @@ "cost": { "input": 0.465, "output": 2.45, - "cache_read": 0.0975 + "cache_read": 0.0875 } }, "kilo/moonshotai/kimi-k2-thinking": { "name": "Kimi K2 Thinking", "context": 262144, - "output": 235929, + "output": 98304, "reasoning": true, "tool_call": true, "structured_output": true, "cost": { "input": 0.6, - "output": 2.5 + "output": 2.5, + "cache_read": 0.15 } }, "kilo/moonshotai/kimi-k2.5": { @@ -25505,7 +25478,7 @@ } }, "kilo/moonshotai/kimi-k2-0905": { - "name": "MoonshotAI: Kimi K2 0905", + "name": "Kimi K2 Instruct 0905", "context": 262144, "output": 98304, "tool_call": true, @@ -25657,7 +25630,7 @@ "kilo/nvidia/nemotron-3.5-lightning": { "name": "Nemotron 3.5 Lightning 30B A3B", "context": 262144, - "output": 131072, + "output": 235929, "reasoning": true, "tool_call": true, "structured_output": true, @@ -26192,8 +26165,8 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.1495, - "output": 0.598 + "input": 0.09, + "output": 0.55 } }, "kilo/qwen/qwen3-vl-235b-a22b-instruct": { @@ -26204,8 +26177,9 @@ "structured_output": true, "image": true, "cost": { - "input": 0.26, - "output": 1.04 + "input": 0.21, + "output": 1.9, + "cache_read": 0.1 } }, "kilo/qwen/qwen3.7-max": { @@ -26238,19 +26212,6 @@ "cache_write": 0.53125 } }, - "kilo/qwen/qwen3-vl-235b-a22b-thinking": { - "name": "Qwen3 VL 235B A22B Thinking", - "context": 131072, - "output": 32768, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "image": true, - "cost": { - "input": 0.4, - "output": 4 - } - }, "kilo/qwen/qwen3.8-2.4t-a95b": { "name": "Qwen3.8 2.4T A95B", "context": 1048576, @@ -26281,8 +26242,8 @@ }, "kilo/qwen/qwen3-next-80b-a3b-thinking": { "name": "Qwen3-Next 80B-A3B (Thinking)", - "context": 131072, - "output": 32768, + "context": 262144, + "output": 235929, "reasoning": true, "tool_call": true, "structured_output": true, @@ -26298,8 +26259,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.3, - "output": 1.5 + "input": 0.12, + "output": 0.8, + "cache_read": 0.07 } }, "kilo/qwen/qwen3-coder": { @@ -26309,8 +26271,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.975, - "output": 4.875 + "input": 0.3, + "output": 1, + "cache_read": 0.1 } }, "kilo/qwen/qwen3-32b": { @@ -26353,19 +26316,6 @@ "cache_write": 0.038 } }, - "kilo/qwen/qwen3-max": { - "name": "Qwen3 Max", - "context": 262144, - "output": 65536, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.78, - "output": 3.9, - "cache_read": 0.156, - "cache_write": 0.975 - } - }, "kilo/qwen/qwen3-coder-30b-a3b-instruct": { "name": "Qwen3-Coder 30B-A3B Instruct", "context": 262144, @@ -26373,8 +26323,8 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.2925, - "output": 1.4625 + "input": 0.07, + "output": 0.28 } }, "kilo/qwen/qwen3.8-omni-flash": { @@ -26393,37 +26343,26 @@ } }, "kilo/qwen/qwen3-vl-30b-a3b-instruct": { - "name": "Qwen: Qwen3 VL 30B A3B Instruct", + "name": "Qwen3 VL 30B A3B Instruct", "context": 262144, "output": 16384, "tool_call": true, "structured_output": true, "image": true, "cost": { - "input": 0.13, - "output": 0.52 + "input": 0.15, + "output": 0.6 } }, "kilo/qwen/qwen3-235b-a22b-thinking-2507": { - "name": "Qwen: Qwen3 235B A22B Thinking 2507 (retires Oct 9)", - "context": 131072, - "output": 117964, + "name": "Qwen: Qwen3 235B A22B Thinking 2507", + "context": 128000, + "output": 16384, "reasoning": true, "tool_call": true, "cost": { - "input": 0.23, - "output": 2.3 - } - }, - "kilo/qwen/qwen3-235b-a22b": { - "name": "Qwen3 235B-A22B", - "context": 131072, - "output": 8192, - "reasoning": true, - "tool_call": true, - "cost": { - "input": 0.455, - "output": 1.82 + "input": 0.45, + "output": 3.5 } }, "kilo/qwen/qwen3.5-122b-a10b": { @@ -26440,17 +26379,6 @@ "output": 2.08 } }, - "kilo/qwen/qwen-plus-2025-07-28": { - "name": "Qwen: Qwen Plus 0728 (retires Oct 9)", - "context": 1000000, - "output": 32768, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.26, - "output": 0.78 - } - }, "kilo/qwen/qwen3.6-35b-a3b": { "name": "Qwen3.6 35B-A3B", "context": 262144, @@ -26473,21 +26401,22 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.0975, - "output": 0.78 + "input": 0.1, + "output": 1.1, + "cache_read": 0.07 } }, "kilo/qwen/qwen3-vl-30b-a3b-thinking": { - "name": "Qwen: Qwen3 VL 30B A3B Thinking (retires Oct 9)", - "context": 131072, - "output": 32768, + "name": "Qwen: Qwen3 VL 30B A3B Thinking", + "context": 262144, + "output": 235929, "reasoning": true, "tool_call": true, "structured_output": true, "image": true, "cost": { - "input": 0.2, - "output": 2.4 + "input": 0.29, + "output": 1 } }, "kilo/qwen/qwen3.6-flash": { @@ -26540,31 +26469,6 @@ "output": 0.26 } }, - "kilo/qwen/qwen3-max-thinking": { - "name": "Qwen: Qwen3 Max Thinking (retires Oct 9)", - "context": 262144, - "output": 65536, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.78, - "output": 3.9 - } - }, - "kilo/qwen/qwen3-coder-plus": { - "name": "Qwen3 Coder Plus", - "context": 1000000, - "output": 65536, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.65, - "output": 3.25, - "cache_read": 0.13, - "cache_write": 0.8125 - } - }, "kilo/qwen/qwen3.5-9b": { "name": "Qwen3.5 9B", "context": 256000, @@ -26639,19 +26543,6 @@ "output": 1.3 } }, - "kilo/qwen/qwen3.6-max-preview": { - "name": "Qwen3.6 Max Preview", - "context": 262144, - "output": 65536, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 1.027, - "output": 6.162, - "cache_write": 1.28375 - } - }, "kilo/qwen/qwen3-30b-a3b": { "name": "Qwen3 30B A3B", "context": 40960, @@ -26660,8 +26551,8 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.13, - "output": 0.52 + "input": 0.12, + "output": 0.5 } }, "kilo/qwen/qwen3.5-397b-a17b": { @@ -26678,39 +26569,17 @@ "output": 2.34 } }, - "kilo/qwen/qwen3-8b": { - "name": "Qwen: Qwen3 8B (retires Oct 9)", - "context": 131072, - "output": 8192, - "reasoning": true, - "tool_call": true, - "cost": { - "input": 0.117, - "output": 0.455 - } - }, - "kilo/qwen/qwen3-vl-32b-instruct": { - "name": "Qwen: Qwen3 VL 32B Instruct (retires Oct 9)", - "context": 131072, - "output": 32768, - "tool_call": true, - "structured_output": true, - "image": true, - "cost": { - "input": 0.104, - "output": 0.416 - } - }, "kilo/qwen/qwen3-vl-8b-instruct": { - "name": "Qwen: Qwen3 VL 8B Instruct (retires Oct 9)", - "context": 131072, - "output": 32768, + "name": "Qwen: Qwen3 VL 8B Instruct", + "context": 262144, + "output": 235929, "tool_call": true, "structured_output": true, "image": true, "cost": { - "input": 0.117, - "output": 0.455 + "input": 0.25, + "output": 0.75, + "cache_read": 0.12 } }, "kilo/qwen/qwen3-30b-a3b-instruct-2507": { @@ -26720,8 +26589,8 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.13, - "output": 0.52 + "input": 0.1, + "output": 0.3 } }, "kilo/qwen/qwen2.5-vl-72b-instruct": { @@ -26772,21 +26641,10 @@ "output": 0.4 } }, - "kilo/qwen/qwen3-30b-a3b-thinking-2507": { - "name": "Qwen: Qwen3 30B A3B Thinking 2507 (retires Oct 9)", - "context": 81920, - "output": 32768, - "reasoning": true, - "tool_call": true, - "cost": { - "input": 0.2, - "output": 2.4 - } - }, "kilo/qwen/qwen3.6-27b": { "name": "Qwen3.6 27B", "context": 262144, - "output": 65536, + "output": 81920, "reasoning": true, "tool_call": true, "structured_output": true, @@ -26820,21 +26678,8 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.2275, - "output": 0.91 - } - }, - "kilo/qwen/qwen3-vl-8b-thinking": { - "name": "Qwen: Qwen3 VL 8B Thinking (retires Oct 9)", - "context": 131072, - "output": 32768, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "image": true, - "cost": { - "input": 0.18, - "output": 2.1 + "input": 0.12, + "output": 0.24 } }, "kilo/qwen/qwen3.7-plus": { @@ -27672,7 +27517,7 @@ "structured_output": true, "cost": { "input": 0.03, - "output": 0.17, + "output": 0.15, "cache_read": 0.03 } }, @@ -28387,6 +28232,21 @@ "cache_read": 0.01 } }, + "venice/openai-gpt-61-sol-ultrafast": { + "name": "GPT-6.1 Sol Ultrafast", + "context": 1050000, + "output": 128000, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true, + "cost": { + "input": 15, + "output": 75, + "cache_read": 0.75, + "cache_write": 18.75 + } + }, "venice/claude-opus-5": { "name": "Claude Opus 5", "context": 1000000, @@ -29778,6 +29638,110 @@ "output": 0.4 } }, + "lowrouter/auto/mistralai/ministral-8b-2512": { + "name": "Ministral 3 8B", + "context": 262144, + "output": 262144, + "tool_call": true, + "structured_output": true, + "image": true, + "cost": { + "input": 0.1569, + "output": 0.1569, + "cache_read": 0.0157 + } + }, + "lowrouter/auto/mistralai/mistral-large-4": { + "name": "Mistral Large 4", + "context": 524288, + "output": 262144, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true, + "cost": { + "input": 0.7112, + "output": 2.1859, + "cache_read": 0.0732 + } + }, + "lowrouter/auto/mistralai/mistral-medium-3.5": { + "name": "Mistral Medium 3.5", + "context": 262144, + "output": 262144, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true, + "cost": { + "input": 1.5688, + "output": 7.8442, + "cache_read": 0.1569 + } + }, + "lowrouter/auto/mistralai/mistral-small-2603": { + "name": "Mistral Small 4", + "context": 256000, + "output": 256000, + "reasoning": true, + "tool_call": true, + "image": true, + "cost": { + "input": 0.1569, + "output": 0.6275, + "cache_read": 0.0157 + } + }, + "lowrouter/auto/mistralai/mistral-large-2512": { + "name": "Mistral Large 3", + "context": 262144, + "output": 262144, + "tool_call": true, + "image": true, + "cost": { + "input": 0.5229, + "output": 1.5688, + "cache_read": 0.0523 + } + }, + "lowrouter/auto/mistralai/ministral-14b-2512": { + "name": "Ministral 3 14B", + "context": 262144, + "output": 262144, + "tool_call": true, + "structured_output": true, + "image": true, + "cost": { + "input": 0.2092, + "output": 0.2092, + "cache_read": 0.0209 + } + }, + "lowrouter/auto/mistralai/ministral-3b-2512": { + "name": "Ministral 3 3B", + "context": 262144, + "output": 262144, + "tool_call": true, + "structured_output": true, + "image": true, + "cost": { + "input": 0.1046, + "output": 0.1046, + "cache_read": 0.0105 + } + }, + "lowrouter/auto/mistralai/codestral-2508": { + "name": "Codestral 25.08", + "context": 128000, + "output": 8192, + "tool_call": true, + "structured_output": true, + "cost": { + "input": 0.3138, + "output": 0.9413, + "cache_read": 0.0314 + } + }, "inference/meta/llama-3.1-8b-instruct": { "name": "Llama 3.1 8B Instruct", "context": 16000, @@ -32029,67 +31993,47 @@ "output": 0.44 } }, - "novita-ai/kwaipilot/kat-coder-pro": { - "name": "Kat Coder Pro", - "context": 256000, - "output": 128000, + "novita-ai/baai/bge-m3": { + "name": "BGE M3", + "context": 8192, + "cost": { + "input": 0.01, + "output": 0 + } + }, + "novita-ai/baai/bge-reranker-v2-m3": { + "name": "BGE Reranker V2 M3", + "context": 8000, + "cost": { + "input": 0.01, + "output": 0 + } + }, + "novita-ai/deepseek/deepseek-v4-flash-0731": { + "name": "DeepSeek V4 Flash 0731", + "context": 1048576, + "output": 393216, + "reasoning": true, "tool_call": true, "structured_output": true, + "cost": { + "input": 0.44, + "output": 1.32, + "cache_read": 0.028 + } + }, + "novita-ai/deepseek/deepseek-v4.1-flash": { + "name": "DeepSeek V4.1 Flash", + "context": 1048576, + "output": 393216, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true, "cost": { "input": 0.3, "output": 1.2, - "cache_read": 0.06 - } - }, - "novita-ai/deepseek/deepseek-prover-v2-671b": { - "name": "Deepseek Prover V2 671B", - "context": 160000, - "output": 160000, - "cost": { - "input": 0.7, - "output": 2.5 - } - }, - "novita-ai/deepseek/deepseek-r1-distill-qwen-14b": { - "name": "DeepSeek R1 Distill Qwen 14B", - "context": 32768, - "output": 16384, - "cost": { - "input": 0.15, - "output": 0.15 - } - }, - "novita-ai/deepseek/deepseek-v3-0324": { - "name": "DeepSeek V3 0324", - "context": 163840, - "output": 163840, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.27, - "output": 1.12, - "cache_read": 0.135 - } - }, - "novita-ai/deepseek/deepseek-r1-distill-llama-70b": { - "name": "DeepSeek R1 Distill LLama 70B", - "context": 8192, - "output": 8192, - "reasoning": true, - "structured_output": true, - "cost": { - "input": 0.8, - "output": 0.8 - } - }, - "novita-ai/deepseek/deepseek-v3-turbo": { - "name": "DeepSeek V3 (Turbo)\t", - "context": 64000, - "output": 16000, - "tool_call": true, - "cost": { - "input": 0.4, - "output": 1.3 + "cache_read": 0.006 } }, "novita-ai/deepseek/deepseek-r1-0528-qwen3-8b": { @@ -32102,21 +32046,8 @@ "output": 0.09 } }, - "novita-ai/deepseek/deepseek-v3.1-terminus": { - "name": "Deepseek V3.1 Terminus", - "context": 131072, - "output": 32768, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.27, - "output": 1, - "cache_read": 0.135 - } - }, "novita-ai/deepseek/deepseek-ocr-2": { - "name": "deepseek/deepseek-ocr-2", + "name": "DeepSeek OCR 2", "context": 8192, "output": 8192, "image": true, @@ -32125,60 +32056,39 @@ "output": 0.03 } }, - "novita-ai/deepseek/deepseek-ocr": { - "name": "DeepSeek-OCR", - "context": 8192, - "output": 8192, - "structured_output": true, - "image": true, - "cost": { - "input": 0.03, - "output": 0.03 - } - }, "novita-ai/deepseek/deepseek-r1-turbo": { - "name": "DeepSeek R1 (Turbo)\t", + "name": "DeepSeek R1 (Turbo)", "context": 64000, "output": 16000, "reasoning": true, "tool_call": true, + "structured_output": true, "cost": { "input": 0.7, "output": 2.5 } }, - "novita-ai/deepseek/deepseek-v3.2-exp": { - "name": "Deepseek V3.2 Exp", - "context": 163840, - "output": 65536, + "novita-ai/deepseek/deepseek-v4-pro-0813": { + "name": "DeepSeek V4 Pro 0813", + "context": 1048576, + "output": 393216, "reasoning": true, "tool_call": true, "structured_output": true, "cost": { - "input": 0.27, - "output": 0.41 + "input": 1.32, + "output": 3.96, + "cache_read": 0.044 } }, - "novita-ai/deepseek/deepseek-r1-distill-qwen-32b": { - "name": "DeepSeek R1 Distill Qwen 32B", + "novita-ai/deepseek/deepseek_v3": { + "name": "DeepSeek-V3", "context": 64000, - "output": 32000, - "cost": { - "input": 0.3, - "output": 0.3 - } - }, - "novita-ai/deepseek/deepseek-v3.1": { - "name": "DeepSeek V3.1", - "context": 131072, - "output": 32768, - "reasoning": true, + "output": 16000, "tool_call": true, - "structured_output": true, "cost": { - "input": 0.27, - "output": 1, - "cache_read": 0.135 + "input": 0.89, + "output": 0.89 } }, "novita-ai/deepseek/deepseek-v4-pro": { @@ -32207,133 +32117,127 @@ "cache_read": 0.35 } }, - "novita-ai/deepseek/deepseek-v3.2": { - "name": "Deepseek V3.2", - "context": 163840, - "output": 65536, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.269, - "output": 0.4, - "cache_read": 0.1345 - } - }, - "novita-ai/deepseek/deepseek-v4-flash": { - "name": "DeepSeek V4 Flash", - "context": 1048576, - "output": 393216, + "novita-ai/tencent/hy3": { + "name": "Hy3", + "context": 262144, + "output": 262144, "reasoning": true, "tool_call": true, "structured_output": true, "cost": { "input": 0.14, - "output": 0.28, - "cache_read": 0.028 + "output": 0.58, + "cache_read": 0.035 + } + }, + "novita-ai/tencent/hy4-preview": { + "name": "Hy4 preview", + "context": 1000000, + "output": 64000, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "cost": { + "input": 0.834, + "output": 2.501, + "cache_read": 0.042 } }, "novita-ai/meta-llama/llama-4-maverick-17b-128e-instruct-fp8": { - "name": "Llama 4 Maverick Instruct", + "name": "Llama 4 Maverick 17B Instruct", "context": 1048576, "output": 8192, + "tool_call": true, + "structured_output": true, "image": true, "cost": { "input": 0.27, "output": 0.85 } }, - "novita-ai/meta-llama/llama-3-70b-instruct": { - "name": "Llama3 70B Instruct", - "context": 8192, - "output": 8000, - "structured_output": true, - "cost": { - "input": 0.51, - "output": 0.74 - } - }, "novita-ai/meta-llama/llama-3.3-70b-instruct": { - "name": "Llama 3.3 70B Instruct", - "context": 131072, - "output": 120000, + "name": "Llama-3.3-70B-Instruct", + "context": 12288, + "output": 12288, "tool_call": true, + "structured_output": true, "cost": { "input": 0.135, "output": 0.4 } }, "novita-ai/meta-llama/llama-3.1-8b-instruct": { - "name": "Llama 3.1 8B Instruct", + "name": "Llama-3.1-8B-Instruct", "context": 16384, "output": 16384, + "tool_call": true, + "structured_output": true, "cost": { "input": 0.02, "output": 0.05 } }, + "novita-ai/meta-llama/llama-3.2-1b-instruct": { + "name": "Llama 3.2 1B Instruct", + "context": 131000, + "output": 32000, + "tool_call": true, + "structured_output": true, + "cost": { + "input": 0.02, + "output": 0.02 + } + }, "novita-ai/meta-llama/llama-4-scout-17b-16e-instruct": { - "name": "Llama 4 Scout Instruct", + "name": "Llama 4 Scout 17B Instruct", "context": 131072, "output": 131072, + "tool_call": true, "image": true, "cost": { "input": 0.18, "output": 0.59 } }, - "novita-ai/meta-llama/llama-3.2-3b-instruct": { - "name": "Llama 3.2 3B Instruct", - "context": 32768, - "output": 32000, - "cost": { - "input": 0.03, - "output": 0.05 - } - }, - "novita-ai/meta-llama/llama-3-8b-instruct": { - "name": "Llama 3 8B Instruct", - "context": 8192, - "output": 8192, - "cost": { - "input": 0.04, - "output": 0.04 - } - }, "novita-ai/nousresearch/hermes-2-pro-llama-3-8b": { "name": "Hermes 2 Pro Llama 3 8B", "context": 8192, "output": 8192, + "tool_call": true, "structured_output": true, "cost": { "input": 0.14, "output": 0.14 } }, - "novita-ai/xiaomimimo/mimo-v2-flash": { - "name": "XiaomiMiMo/MiMo-V2-Flash", - "context": 262144, - "output": 32000, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.1, - "output": 0.3, - "cache_read": 0.3 - } - }, - "novita-ai/xiaomimimo/mimo-v2-pro": { - "name": "MiMo-V2-Pro", + "novita-ai/xiaomimimo/mimo-v2.6-pro": { + "name": "MiMo-V2.6-Pro", "context": 1048576, "output": 131072, "reasoning": true, "tool_call": true, "structured_output": true, + "image": true, + "video": true, "cost": { - "input": 2, - "output": 6, - "cache_read": 0.4 + "input": 0.435, + "output": 0.87, + "cache_read": 0.0036 + } + }, + "novita-ai/xiaomimimo/mimo-v2.5": { + "name": "MiMo-V2.5", + "context": 1048576, + "output": 131072, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true, + "video": true, + "cost": { + "input": 0.168, + "output": 0.336, + "cache_read": 0.0034 } }, "novita-ai/xiaomimimo/mimo-v2.5-pro": { @@ -32349,40 +32253,19 @@ "cache_read": 0.0043 } }, - "novita-ai/baidu/ernie-4.5-vl-28b-a3b": { - "name": "ERNIE 4.5 VL 28B A3B", - "context": 30000, - "output": 8000, - "reasoning": true, - "tool_call": true, - "image": true, - "cost": { - "input": 0.14, - "output": 0.56 - } - }, - "novita-ai/baidu/ernie-4.5-vl-28b-a3b-thinking": { - "name": "ERNIE-4.5-VL-28B-A3B-Thinking", - "context": 131072, - "output": 65536, + "novita-ai/xiaomimimo/mimo-v2.6-flash": { + "name": "MiMo-V2.6-Flash", + "context": 1048576, + "output": 131072, "reasoning": true, "tool_call": true, "structured_output": true, "image": true, "video": true, "cost": { - "input": 0.39, - "output": 0.39 - } - }, - "novita-ai/baidu/ernie-4.5-21B-a3b-thinking": { - "name": "ERNIE-4.5-21B-A3B-Thinking", - "context": 131072, - "output": 65536, - "reasoning": true, - "cost": { - "input": 0.07, - "output": 0.28 + "input": 0.14, + "output": 0.28, + "cache_read": 0.0028 } }, "novita-ai/baidu/ernie-4.5-21B-a3b": { @@ -32395,29 +32278,20 @@ "output": 0.28 } }, - "novita-ai/baidu/ernie-4.5-vl-424b-a47b": { - "name": "ERNIE 4.5 VL 424B A47B", - "context": 123000, - "output": 16000, + "novita-ai/baidu/cobuddy": { + "name": "CoBuddy", + "context": 131072, + "output": 65536, "reasoning": true, - "image": true, - "cost": { - "input": 0.42, - "output": 1.25 - } - }, - "novita-ai/baidu/ernie-4.5-300b-a47b-paddle": { - "name": "ERNIE 4.5 300B A47B", - "context": 123000, - "output": 12000, - "structured_output": true, + "tool_call": true, "cost": { "input": 0.28, - "output": 1.1 + "output": 1.13, + "cache_read": 0.07 } }, "novita-ai/google/gemma-4-31b-it": { - "name": "Gemma 4 31B", + "name": "Gemma 4 31B IT", "context": 262144, "output": 131072, "reasoning": true, @@ -32430,9 +32304,10 @@ } }, "novita-ai/google/gemma-3-27b-it": { - "name": "Gemma 3 27B", + "name": "Gemma 3 27B IT", "context": 98304, "output": 16384, + "tool_call": true, "image": true, "cost": { "input": 0.119, @@ -32440,7 +32315,7 @@ } }, "novita-ai/google/gemma-4-26b-a4b-it": { - "name": "Gemma 4 26B A4B", + "name": "Gemma 4 26B A4B IT", "context": 262144, "output": 131072, "reasoning": true, @@ -32453,9 +32328,10 @@ } }, "novita-ai/google/gemma-3-12b-it": { - "name": "Gemma 3 12B", + "name": "Gemma 3 12B IT", "context": 131072, "output": 8192, + "tool_call": true, "image": true, "cost": { "input": 0.05, @@ -32463,61 +32339,76 @@ } }, "novita-ai/minimaxai/minimax-m1-80k": { - "name": "MiniMax M1", + "name": "MiniMax M1 80K", "context": 1000000, "output": 40000, "reasoning": true, "tool_call": true, + "structured_output": true, "cost": { "input": 0.55, "output": 2.2 } }, - "novita-ai/mistralai/mistral-nemo": { - "name": "Mistral Nemo", - "context": 60288, - "output": 16000, - "structured_output": true, - "cost": { - "input": 0.04, - "output": 0.17 - } - }, - "novita-ai/inclusionai/ring-2.6-1t": { - "name": "Ring-2.6-1T", + "novita-ai/inclusionai/ling-3.0-flash": { + "name": "Ling 3.0 Flash", "context": 262144, - "output": 65536, + "output": 32768, "reasoning": true, "tool_call": true, - "structured_output": true, "cost": { - "input": 0.3, - "output": 2.5, - "cache_read": 0.06 + "input": 0.06, + "output": 0.18, + "cache_read": 0.012 } }, - "novita-ai/inclusionai/ling-2.6-1t": { - "name": "Ling-2.6-1T", + "novita-ai/inclusionai/ling-3.1-flash": { + "name": "Ling 3.1 Flash", "context": 262144, "output": 32768, + "reasoning": true, "tool_call": true, - "structured_output": true, "cost": { - "input": 0.3, - "output": 2.5, - "cache_read": 0.06 + "input": 0, + "output": 0 } }, - "novita-ai/inclusionai/ling-2.6-flash": { - "name": "Ling-2.6-flash", + "novita-ai/inclusionai/ling-3.0-flash-sante": { + "name": "Ling 3.0 Flash Sante", "context": 262144, "output": 32768, + "reasoning": true, "tool_call": true, - "structured_output": true, "cost": { - "input": 0.1, - "output": 0.3, - "cache_read": 0.02 + "input": 0.075, + "output": 0.22, + "cache_read": 0.015 + } + }, + "novita-ai/inclusionai/ling-3.0-flash-vl": { + "name": "Ling 3.0 Flash VL", + "context": 262144, + "output": 32768, + "reasoning": true, + "tool_call": true, + "image": true, + "video": true, + "cost": { + "input": 0.075, + "output": 0.22, + "cache_read": 0.015 + } + }, + "novita-ai/inclusionai/ling-3.0-flash-fin": { + "name": "Ling 3.0 Flash Fin", + "context": 262144, + "output": 32768, + "reasoning": true, + "tool_call": true, + "cost": { + "input": 0.075, + "output": 0.22, + "cache_read": 0.015 } }, "novita-ai/moonshotai/kimi-k3": { @@ -32581,7 +32472,7 @@ "novita-ai/moonshotai/kimi-k2-instruct": { "name": "Kimi K2 Instruct", "context": 131072, - "output": 32768, + "output": 98304, "tool_call": true, "cost": { "input": 0.57, @@ -32589,7 +32480,7 @@ } }, "novita-ai/moonshotai/kimi-k2-0905": { - "name": "Kimi K2 0905", + "name": "Kimi K2 Instruct 0905", "context": 262144, "output": 98304, "tool_call": true, @@ -32615,7 +32506,7 @@ } }, "novita-ai/zai-org/glm-4.6v": { - "name": "GLM 4.6V", + "name": "GLM-4.6V", "context": 131072, "output": 32768, "reasoning": true, @@ -32629,20 +32520,23 @@ "cache_read": 0.055 } }, - "novita-ai/zai-org/glm-4.5": { - "name": "GLM-4.5", - "context": 131072, - "output": 98304, + "novita-ai/zai-org/glm-5.3-flash": { + "name": "GLM-5.3-Flash", + "context": 1048576, + "output": 131072, "reasoning": true, "tool_call": true, + "structured_output": true, + "image": true, + "video": true, "cost": { - "input": 0.6, - "output": 2.2, - "cache_read": 0.11 + "input": 0.15, + "output": 0.5, + "cache_read": 0.03 } }, "novita-ai/zai-org/glm-4.6": { - "name": "GLM 4.6", + "name": "GLM-4.6", "context": 204800, "output": 131072, "reasoning": true, @@ -32668,7 +32562,7 @@ } }, "novita-ai/zai-org/glm-4.5v": { - "name": "GLM 4.5V", + "name": "GLM-4.5V", "context": 65536, "output": 16384, "reasoning": true, @@ -32735,7 +32629,7 @@ } }, "novita-ai/zai-org/autoglm-phone-9b-multilingual": { - "name": "AutoGLM-Phone-9B-Multilingual", + "name": "AutoGLM Phone 9B Multilingual", "context": 65536, "output": 65536, "image": true, @@ -32745,7 +32639,7 @@ } }, "novita-ai/zai-org/glm-4.5-air": { - "name": "GLM 4.5 Air", + "name": "GLM-4.5-Air", "context": 131072, "output": 98304, "reasoning": true, @@ -32756,8 +32650,45 @@ "cache_read": 0.025 } }, + "novita-ai/zai-org/glm-5.3": { + "name": "GLM-5.3", + "context": 1048576, + "output": 131072, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "cost": { + "input": 1.4, + "output": 4.4, + "cache_read": 0.26 + } + }, + "novita-ai/apodex/apodex-1.1-mini": { + "name": "Apodex 1.1 Mini", + "context": 262144, + "output": 262144, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "cost": { + "input": 0, + "output": 0 + } + }, + "novita-ai/nvidia/nemotron-3-nano-30b-a3b": { + "name": "Nemotron 3 Nano 30B A3B", + "context": 262144, + "output": 32768, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "cost": { + "input": 0.05, + "output": 0.2 + } + }, "novita-ai/gryphe/mythomax-l2-13b": { - "name": "Mythomax L2 13B", + "name": "MythoMax L2 13B", "context": 4096, "output": 3200, "cost": { @@ -32766,9 +32697,9 @@ } }, "novita-ai/minimax/minimax-m2.5": { - "name": "MiniMax M2.5", + "name": "MiniMax-M2.5", "context": 204800, - "output": 131072, + "output": 131100, "reasoning": true, "tool_call": true, "structured_output": true, @@ -32779,7 +32710,7 @@ } }, "novita-ai/minimax/minimax-m2.7": { - "name": "MiniMax M2.7", + "name": "MiniMax-M2.7", "context": 204800, "output": 131072, "reasoning": true, @@ -32791,6 +32722,21 @@ "cache_read": 0.06 } }, + "novita-ai/minimax/minimax-m3": { + "name": "MiniMax-M3", + "context": 1000000, + "output": 131072, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true, + "video": true, + "cost": { + "input": 0.3, + "output": 1.2, + "cache_read": 0.06 + } + }, "novita-ai/minimax/minimax-m2.7-highspeed": { "name": "MiniMax-M2.7-highspeed", "context": 204800, @@ -32805,45 +32751,8 @@ "cache_write": 0.375 } }, - "novita-ai/minimax/minimax-m2.5-highspeed": { - "name": "MiniMax M2.5 Highspeed", - "context": 204800, - "output": 131072, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.6, - "output": 2.4, - "cache_read": 0.03 - } - }, - "novita-ai/minimax/minimax-m2.1": { - "name": "Minimax M2.1", - "context": 204800, - "output": 131072, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.3, - "output": 1.2, - "cache_read": 0.03 - } - }, - "novita-ai/minimax/minimax-m2": { - "name": "MiniMax-M2", - "context": 204800, - "output": 131072, - "reasoning": true, - "tool_call": true, - "cost": { - "input": 0.3, - "output": 1.2, - "cache_read": 0.03 - } - }, "novita-ai/paddlepaddle/paddleocr-vl": { - "name": "PaddleOCR-VL", + "name": "PaddleOCR VL", "context": 16384, "output": 16384, "image": true, @@ -32852,21 +32761,47 @@ "output": 0.02 } }, - "novita-ai/qwen/qwen3-vl-235b-a22b-instruct": { - "name": "Qwen3 VL 235B A22B Instruct", - "context": 131072, - "output": 32768, + "novita-ai/stepfun/step-3.7-flash": { + "name": "Step 3.7 Flash", + "context": 262144, + "output": 256000, + "reasoning": true, "tool_call": true, "structured_output": true, "image": true, "video": true, "cost": { - "input": 0.3, - "output": 1.5 + "input": 0.2, + "output": 1.15, + "cache_read": 0.04 + } + }, + "novita-ai/mindai/macaron-v1-tall": { + "name": "Macaron V1 Tall", + "context": 262144, + "output": 32768, + "reasoning": true, + "tool_call": true, + "cost": { + "input": 0.2475, + "output": 1.43, + "cache_read": 0.044 + } + }, + "novita-ai/mindai/macaron-v1-venti": { + "name": "Macaron V1 Venti", + "context": 1048576, + "output": 131072, + "reasoning": true, + "tool_call": true, + "cost": { + "input": 0.825, + "output": 2.475, + "cache_read": 0.165 } }, "novita-ai/qwen/qwen3.7-max": { - "name": "Qwen3.7-Max", + "name": "Qwen3.7 Max", "context": 1000000, "output": 65536, "reasoning": true, @@ -32875,24 +32810,39 @@ "cost": { "input": 1.25, "output": 3.75, - "cache_read": 0.25, - "cache_write": 1.5625 + "cache_read": 0.25 } }, - "novita-ai/qwen/qwen3-vl-235b-a22b-thinking": { - "name": "Qwen3 VL 235B A22B Thinking", - "context": 131072, - "output": 32768, + "novita-ai/qwen/qwen3.8-27b": { + "name": "Qwen3.8 27B", + "context": 1000000, + "output": 131072, "reasoning": true, + "tool_call": true, + "structured_output": true, "image": true, "video": true, "cost": { - "input": 0.98, - "output": 3.95 + "input": 0.42, + "output": 3, + "cache_read": 0.085 + } + }, + "novita-ai/qwen/qwen3.8-2.4t-a95b": { + "name": "Qwen3.8 2.4T A95B", + "context": 1000000, + "output": 131072, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "cost": { + "input": 2, + "output": 6, + "cache_read": 0.25 } }, "novita-ai/qwen/qwen3.5-27b": { - "name": "Qwen3.5-27B", + "name": "Qwen3.5 27B", "context": 262144, "output": 65536, "reasoning": true, @@ -32905,51 +32855,19 @@ "output": 2.4 } }, - "novita-ai/qwen/qwen3-235b-a22b-instruct-2507": { - "name": "Qwen3 235B A22B Instruct 2507", - "context": 131072, - "output": 16384, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.09, - "output": 0.58 - } - }, - "novita-ai/qwen/qwen3-next-80b-a3b-thinking": { - "name": "Qwen3 Next 80B A3B Thinking", - "context": 131072, - "output": 32768, + "novita-ai/qwen/qwen3.8-max": { + "name": "Qwen3.8 Max", + "context": 1000000, + "output": 131072, "reasoning": true, "tool_call": true, "structured_output": true, - "cost": { - "input": 0.15, - "output": 1.5 - } - }, - "novita-ai/qwen/qwen3-coder-next": { - "name": "Qwen3 Coder Next", - "context": 262144, - "output": 65536, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.2, - "output": 1.5 - } - }, - "novita-ai/qwen/qwen3-omni-30b-a3b-instruct": { - "name": "Qwen3 Omni 30B A3B Instruct", - "context": 65536, - "output": 16384, - "tool_call": true, - "structured_output": true, "image": true, "video": true, "cost": { - "input": 0.25, - "output": 0.97 + "input": 2, + "output": 6, + "cache_read": 0.25 } }, "novita-ai/qwen/qwen3-omni-30b-a3b-thinking": { @@ -32966,51 +32884,16 @@ "output": 0.97 } }, - "novita-ai/qwen/qwen3-max": { - "name": "Qwen3 Max", - "context": 262144, - "output": 65536, - "tool_call": true, - "structured_output": true, + "novita-ai/qwen/qwen3-reranker-8b": { + "name": "Qwen3 Reranker 8B", + "context": 32768, "cost": { - "input": 2.11, - "output": 8.45 - } - }, - "novita-ai/qwen/qwen3-235b-a22b-fp8": { - "name": "Qwen3 235B A22B", - "context": 40960, - "output": 20000, - "reasoning": true, - "cost": { - "input": 0.2, - "output": 0.8 - } - }, - "novita-ai/qwen/qwen3-coder-480b-a35b-instruct": { - "name": "Qwen3 Coder 480B A35B Instruct", - "context": 262144, - "output": 65536, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.38, - "output": 1.55 - } - }, - "novita-ai/qwen/qwen3-coder-30b-a3b-instruct": { - "name": "Qwen3 Coder 30b A3B Instruct", - "context": 160000, - "output": 32768, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.07, - "output": 0.27 + "input": 0.05, + "output": 0 } }, "novita-ai/qwen/qwen3-vl-30b-a3b-instruct": { - "name": "qwen/qwen3-vl-30b-a3b-instruct", + "name": "Qwen3 VL 30B A3B Instruct", "context": 131072, "output": 32768, "tool_call": true, @@ -33022,30 +32905,8 @@ "output": 0.7 } }, - "novita-ai/qwen/qwen3-235b-a22b-thinking-2507": { - "name": "Qwen3 235B A22b Thinking 2507", - "context": 131072, - "output": 32768, - "reasoning": true, - "tool_call": true, - "cost": { - "input": 0.3, - "output": 3 - } - }, - "novita-ai/qwen/qwen2.5-7b-instruct": { - "name": "Qwen2.5 7B Instruct", - "context": 32000, - "output": 32000, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.07, - "output": 0.07 - } - }, "novita-ai/qwen/qwen3.5-122b-a10b": { - "name": "Qwen3.5-122B-A10B", + "name": "Qwen3.5 122B-A10B", "context": 262144, "output": 65536, "reasoning": true, @@ -33058,38 +32919,18 @@ "output": 3.2 } }, - "novita-ai/qwen/qwen3-30b-a3b-fp8": { - "name": "Qwen3 30B A3B", - "context": 40960, - "output": 20000, + "novita-ai/qwen/qwen3.6-35b-a3b": { + "name": "Qwen3.6 35B-A3B", + "context": 262144, + "output": 65536, "reasoning": true, - "cost": { - "input": 0.09, - "output": 0.45 - } - }, - "novita-ai/qwen/qwen3-next-80b-a3b-instruct": { - "name": "Qwen3 Next 80B A3B Instruct", - "context": 131072, - "output": 32768, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.15, - "output": 1.5 - } - }, - "novita-ai/qwen/qwen3-vl-30b-a3b-thinking": { - "name": "qwen/qwen3-vl-30b-a3b-thinking", - "context": 131072, - "output": 32768, "tool_call": true, "structured_output": true, "image": true, "video": true, "cost": { - "input": 0.2, - "output": 1 + "input": 0.248, + "output": 1.485 } }, "novita-ai/qwen/qwen-mt-plus": { @@ -33101,28 +32942,31 @@ "output": 0.75 } }, - "novita-ai/qwen/qwen3-32b-fp8": { - "name": "Qwen3 32B", - "context": 40960, - "output": 20000, + "novita-ai/qwen/qwen3.8-flash": { + "name": "Qwen3.8 Flash", + "context": 1000000, + "output": 131072, "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true, + "video": true, "cost": { - "input": 0.1, - "output": 0.45 + "input": 0.15, + "output": 0.47, + "cache_read": 0.016 } }, - "novita-ai/qwen/qwen3-8b-fp8": { - "name": "Qwen3 8B", - "context": 128000, - "output": 20000, - "reasoning": true, + "novita-ai/qwen/qwen3-embedding-8b": { + "name": "Qwen3 Embedding 8B", + "context": 32768, "cost": { - "input": 0.035, - "output": 0.138 + "input": 0.07, + "output": 0 } }, "novita-ai/qwen/qwen3.5-35b-a3b": { - "name": "Qwen3.5-35B-A3B", + "name": "Qwen3.5 35B-A3B", "context": 262144, "output": 65536, "reasoning": true, @@ -33136,9 +32980,9 @@ } }, "novita-ai/qwen/qwen3.5-397b-a17b": { - "name": "Qwen3.5-397B-A17B", + "name": "Qwen3.5 397B-A17B", "context": 262144, - "output": 64000, + "output": 65536, "reasoning": true, "tool_call": true, "structured_output": true, @@ -33149,134 +32993,52 @@ "output": 3.6 } }, - "novita-ai/qwen/qwen3-vl-8b-instruct": { - "name": "qwen/qwen3-vl-8b-instruct", - "context": 131072, - "output": 32768, - "tool_call": true, - "structured_output": true, - "image": true, - "video": true, - "cost": { - "input": 0.08, - "output": 0.5 - } - }, - "novita-ai/qwen/qwen2.5-vl-72b-instruct": { - "name": "Qwen2.5 VL 72B Instruct", - "context": 32768, - "output": 32768, - "image": true, - "video": true, - "cost": { - "input": 0.8, - "output": 0.8 - } - }, - "novita-ai/qwen/qwen-2.5-72b-instruct": { - "name": "Qwen 2.5 72B Instruct", - "context": 32000, - "output": 8192, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.38, - "output": 0.4 - } - }, - "novita-ai/qwen/qwen3-4b-fp8": { - "name": "Qwen3 4B", - "context": 128000, - "output": 20000, + "novita-ai/qwen/qwen3.6-27b": { + "name": "Qwen3.6 27B", + "context": 262144, + "output": 65536, "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true, + "video": true, "cost": { - "input": 0.03, - "output": 0.03 + "input": 0.6, + "output": 3.6 } }, "novita-ai/baichuan/baichuan-m2-32b": { - "name": "baichuan-m2-32b", + "name": "Baichuan M2 32B", "context": 131072, "output": 131072, + "reasoning": true, "cost": { "input": 0.07, "output": 0.07 } }, - "novita-ai/openai/gpt-oss-20b": { - "name": "OpenAI: GPT OSS 20B", - "context": 131072, - "output": 32768, - "reasoning": true, - "structured_output": true, - "image": true, - "cost": { - "input": 0.04, - "output": 0.15 - } - }, "novita-ai/openai/gpt-oss-120b": { - "name": "OpenAI GPT OSS 120B", + "name": "GPT OSS 120B", "context": 131072, "output": 32768, "reasoning": true, "tool_call": true, "structured_output": true, - "image": true, "cost": { "input": 0.05, "output": 0.25 } }, "novita-ai/microsoft/wizardlm-2-8x22b": { - "name": "Wizardlm 2 8x22B", + "name": "WizardLM 2 8x22B", "context": 65535, "output": 8000, + "structured_output": true, "cost": { "input": 0.62, "output": 0.62 } }, - "novita-ai/sao10K/l3-70b-euryale-v2.1": { - "name": "L3 70B Euryale V2.1\t", - "context": 8192, - "output": 8192, - "tool_call": true, - "cost": { - "input": 1.48, - "output": 1.48 - } - }, - "novita-ai/sao10K/L3-8B-stheno-v3.2": { - "name": "L3 8B Stheno V3.2", - "context": 8192, - "output": 32000, - "tool_call": true, - "cost": { - "input": 0.05, - "output": 0.05 - } - }, - "novita-ai/sao10K/l3-8b-lunaris": { - "name": "Sao10k L3 8B Lunaris\t", - "context": 8192, - "output": 8192, - "structured_output": true, - "cost": { - "input": 0.05, - "output": 0.05 - } - }, - "novita-ai/sao10K/l31-70b-euryale-v2.2": { - "name": "L31 70B Euryale V2.2", - "context": 8192, - "output": 8192, - "tool_call": true, - "cost": { - "input": 1.48, - "output": 1.48 - } - }, "302ai/grok-4-1-fast-reasoning": { "name": "grok-4-1-fast-reasoning", "context": 2000000, @@ -34900,8 +34662,8 @@ "image": true, "video": true, "cost": { - "input": 0.49, - "output": 13, + "input": 0.33, + "output": 14.89, "cache_read": 0.3 } }, @@ -35318,9 +35080,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.0079, + "input": 0.0099, "output": 1.28, - "cache_read": 0.0079 + "cache_read": 0.0099 } }, "openrouter/deepseek/deepseek-v4.1-flash": { @@ -35382,9 +35144,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 1.32, - "output": 3.96, - "cache_read": 0.044 + "input": 0.66, + "output": 1.98, + "cache_read": 0.022 } }, "openrouter/deepseek/deepseek-v3.2-exp": { @@ -35430,13 +35192,13 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.95526, - "output": 1.91052, - "cache_read": 0.079605 + "input": 0.9483, + "output": 1.8966, + "cache_read": 0.079025 } }, "openrouter/deepseek/deepseek-r1-0528": { - "name": "R1 0528", + "name": "DeepSeek R1 0528", "context": 163840, "output": 32768, "reasoning": true, @@ -35457,8 +35219,8 @@ "structured_output": true, "cost": { "input": 0.259, - "output": 0.42, - "cache_read": 0.135 + "output": 0.8, + "cache_read": 0.14 } }, "openrouter/deepseek/deepseek-v4-flash": { @@ -35469,9 +35231,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.0075, + "input": 0.0182, "output": 1.28, - "cache_read": 0.0075 + "cache_read": 0.0182 } }, "openrouter/unbiased/pareto-26.10-preview": { @@ -35804,14 +35566,14 @@ "openrouter/z-ai/glm-4.6": { "name": "GLM-4.6", "context": 204800, - "output": 16384, + "output": 131072, "reasoning": true, "tool_call": true, "structured_output": true, "cost": { - "input": 0.43, - "output": 1.75, - "cache_read": 0.08 + "input": 0.5, + "output": 2, + "cache_read": 0.1 } }, "openrouter/z-ai/glm-5": { @@ -35888,7 +35650,7 @@ "structured_output": true, "cost": { "input": 0.06, - "output": 4.2, + "output": 7, "cache_read": 0.059 } }, @@ -36239,29 +36001,29 @@ "openrouter/~z-ai/glm-flash-latest": { "name": "GLM Flash Latest", "context": 1048576, - "output": 943718, + "output": 131072, "reasoning": true, "tool_call": true, "structured_output": true, "image": true, "video": true, "cost": { - "input": 0.032, - "output": 1.041434, - "cache_read": 0.02 + "input": 0.04, + "output": 0.5, + "cache_read": 0.0125 } }, "openrouter/~z-ai/glm-latest": { "name": "GLM Latest", "context": 1048576, - "output": 131072, + "output": 943718, "reasoning": true, "tool_call": true, "structured_output": true, "cost": { - "input": 0.0312, - "output": 4.4, - "cache_read": 0.029 + "input": 0.039, + "output": 4.8, + "cache_read": 0.038 } }, "openrouter/arcee-ai/trinity-large-thinking": { @@ -36596,22 +36358,22 @@ "structured_output": true, "image": true, "cost": { - "input": 0.016, - "output": 1.2, - "cache_read": 0.01 + "input": 0.0001, + "output": 0.6, + "cache_read": 0.005 } }, "openrouter/~deepseek/deepseek-pro-latest": { "name": "DeepSeek Pro Latest", "context": 1048576, - "output": 393216, + "output": 943718, "reasoning": true, "tool_call": true, "structured_output": true, "cost": { - "input": 0.198, - "output": 8, - "cache_read": 0.2 + "input": 0.3, + "output": 5, + "cache_read": 0.219 } }, "openrouter/~deepseek/deepseek-v4-flash-latest": { @@ -36622,9 +36384,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.00632, - "output": 0.1086, - "cache_read": 0.00632 + "input": 0.0099, + "output": 1.28, + "cache_read": 0.0099 } }, "openrouter/~x-ai/grok-latest": { @@ -36790,9 +36552,9 @@ "image": true, "video": true, "cost": { - "input": 0.09, - "output": 0.3, - "cache_read": 0.05 + "input": 0.0675, + "output": 0.225, + "cache_read": 0.0375 } }, "openrouter/google/gemini-3-pro-image-preview": { @@ -37505,7 +37267,6 @@ "output": 32768, "reasoning": true, "tool_call": true, - "structured_output": true, "cost": { "input": 0.042, "output": 0.1232, @@ -37522,9 +37283,9 @@ "image": true, "video": true, "cost": { - "input": 0.5, - "output": 12, - "cache_read": 0.3 + "input": 0.64, + "output": 13.5, + "cache_read": 0.28 } }, "openrouter/moonshotai/kimi-k2.6": { @@ -37538,19 +37299,20 @@ "cost": { "input": 0.465, "output": 2.45, - "cache_read": 0.0975 + "cache_read": 0.0875 } }, "openrouter/moonshotai/kimi-k2-thinking": { "name": "Kimi K2 Thinking", "context": 262144, - "output": 235929, + "output": 98304, "reasoning": true, "tool_call": true, "structured_output": true, "cost": { "input": 0.6, - "output": 2.5 + "output": 2.5, + "cache_read": 0.15 } }, "openrouter/moonshotai/kimi-k2.5": { @@ -37562,13 +37324,13 @@ "structured_output": true, "image": true, "cost": { - "input": 0.45, - "output": 2.25, - "cache_read": 0.07 + "input": 0.5, + "output": 2.5, + "cache_read": 0.15 } }, "openrouter/moonshotai/kimi-k2-0905": { - "name": "Kimi K2 0905", + "name": "Kimi K2 Instruct 0905", "context": 262144, "output": 98304, "tool_call": true, @@ -37664,14 +37426,14 @@ "openrouter/nvidia/nemotron-3.5-lightning": { "name": "Nemotron 3.5 Lightning 30B A3B", "context": 262144, - "output": 131072, + "output": 235929, "reasoning": true, "tool_call": true, "structured_output": true, "cost": { - "input": 0.0469, - "output": 0.134, - "cache_read": 0.02345 + "input": 0.07, + "output": 0.2, + "cache_read": 0.04 } }, "openrouter/nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free": { @@ -38233,19 +37995,6 @@ "cache_write": 0.53125 } }, - "openrouter/qwen/qwen3-vl-235b-a22b-thinking": { - "name": "Qwen3 VL 235B A22B Thinking", - "context": 131072, - "output": 32768, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "image": true, - "cost": { - "input": 0.4, - "output": 4 - } - }, "openrouter/qwen/qwen3.8-2.4t-a95b": { "name": "Qwen3.8 2.4T A95B", "context": 1048576, @@ -38276,7 +38025,7 @@ "openrouter/qwen/qwen3-next-80b-a3b-thinking": { "name": "Qwen3-Next 80B-A3B (Thinking)", "context": 262144, - "output": 32768, + "output": 235929, "reasoning": true, "tool_call": true, "structured_output": true, @@ -38349,19 +38098,6 @@ "cache_write": 0.038 } }, - "openrouter/qwen/qwen3-max": { - "name": "Qwen3 Max", - "context": 262144, - "output": 65536, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.78, - "output": 3.9, - "cache_read": 0.156, - "cache_write": 0.975 - } - }, "openrouter/qwen/qwen3-coder-30b-a3b-instruct": { "name": "Qwen3-Coder 30B-A3B Instruct", "context": 262144, @@ -38402,24 +38138,13 @@ }, "openrouter/qwen/qwen3-235b-a22b-thinking-2507": { "name": "Qwen3 235B A22B Thinking 2507", - "context": 131072, - "output": 117964, + "context": 128000, + "output": 16384, "reasoning": true, "tool_call": true, "cost": { - "input": 0.23, - "output": 2.3 - } - }, - "openrouter/qwen/qwen3-235b-a22b": { - "name": "Qwen3 235B-A22B", - "context": 131072, - "output": 8192, - "reasoning": true, - "tool_call": true, - "cost": { - "input": 0.455, - "output": 1.82 + "input": 0.45, + "output": 3.5 } }, "openrouter/qwen/qwen3.5-122b-a10b": { @@ -38436,17 +38161,6 @@ "output": 2.08 } }, - "openrouter/qwen/qwen-plus-2025-07-28": { - "name": "Qwen Plus 0728", - "context": 1000000, - "output": 32768, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.26, - "output": 0.78 - } - }, "openrouter/qwen/qwen3.6-35b-a3b": { "name": "Qwen3.6 35B-A3B", "context": 262144, @@ -38477,14 +38191,14 @@ "openrouter/qwen/qwen3-vl-30b-a3b-thinking": { "name": "Qwen3 VL 30B A3B Thinking", "context": 262144, - "output": 32768, + "output": 235929, "reasoning": true, "tool_call": true, "structured_output": true, "image": true, "cost": { - "input": 0.2, - "output": 2.4 + "input": 0.29, + "output": 1 } }, "openrouter/qwen/qwen3.6-flash": { @@ -38537,31 +38251,6 @@ "output": 0.26 } }, - "openrouter/qwen/qwen3-max-thinking": { - "name": "Qwen3 Max Thinking", - "context": 262144, - "output": 65536, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.78, - "output": 3.9 - } - }, - "openrouter/qwen/qwen3-coder-plus": { - "name": "Qwen3 Coder Plus", - "context": 1000000, - "output": 65536, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.65, - "output": 3.25, - "cache_read": 0.13, - "cache_write": 0.8125 - } - }, "openrouter/qwen/qwen3.5-9b": { "name": "Qwen3.5 9B", "context": 262144, @@ -38618,8 +38307,7 @@ "cost": { "input": 0.15, "output": 0.47, - "cache_read": 0.016, - "cache_write": 0.2 + "cache_read": 0.016 } }, "openrouter/qwen/qwen3.5-35b-a3b": { @@ -38637,22 +38325,9 @@ "cache_read": 0.04 } }, - "openrouter/qwen/qwen3.6-max-preview": { - "name": "Qwen3.6 Max Preview", - "context": 262144, - "output": 65536, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 1.027, - "output": 6.162, - "cache_write": 1.28375 - } - }, "openrouter/qwen/qwen3-30b-a3b": { "name": "Qwen3 30B A3B", - "context": 131072, + "context": 40960, "output": 16384, "reasoning": true, "tool_call": true, @@ -38677,39 +38352,17 @@ "cache_read": 0.225 } }, - "openrouter/qwen/qwen3-8b": { - "name": "Qwen3 8B", - "context": 131072, - "output": 8192, - "reasoning": true, - "tool_call": true, - "cost": { - "input": 0.117, - "output": 0.455 - } - }, - "openrouter/qwen/qwen3-vl-32b-instruct": { - "name": "Qwen3 VL 32B Instruct", - "context": 131072, - "output": 32768, - "tool_call": true, - "structured_output": true, - "image": true, - "cost": { - "input": 0.104, - "output": 0.416 - } - }, "openrouter/qwen/qwen3-vl-8b-instruct": { "name": "Qwen3 VL 8B Instruct", "context": 262144, - "output": 32768, + "output": 235929, "tool_call": true, "structured_output": true, "image": true, "cost": { - "input": 0.117, - "output": 0.455 + "input": 0.25, + "output": 0.75, + "cache_read": 0.12 } }, "openrouter/qwen/qwen3-30b-a3b-instruct-2507": { @@ -38771,29 +38424,18 @@ "output": 0.4 } }, - "openrouter/qwen/qwen3-30b-a3b-thinking-2507": { - "name": "Qwen3 30B A3B Thinking 2507", - "context": 81920, - "output": 32768, - "reasoning": true, - "tool_call": true, - "cost": { - "input": 0.2, - "output": 2.4 - } - }, "openrouter/qwen/qwen3.6-27b": { "name": "Qwen3.6 27B", "context": 262144, - "output": 65536, + "output": 81920, "reasoning": true, "tool_call": true, "structured_output": true, "image": true, "video": true, "cost": { - "input": 0.45, - "output": 2.7 + "input": 0.32, + "output": 3.2 } }, "openrouter/qwen/qwen3.6-plus": { @@ -38813,7 +38455,7 @@ }, "openrouter/qwen/qwen3-14b": { "name": "Qwen3 14B", - "context": 131072, + "context": 40960, "output": 16384, "reasoning": true, "tool_call": true, @@ -38823,19 +38465,6 @@ "output": 0.24 } }, - "openrouter/qwen/qwen3-vl-8b-thinking": { - "name": "Qwen3 VL 8B Thinking", - "context": 131072, - "output": 32768, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "image": true, - "cost": { - "input": 0.18, - "output": 2.1 - } - }, "openrouter/qwen/qwen3.7-plus": { "name": "Qwen3.7 Plus", "context": 1000000, @@ -38863,8 +38492,7 @@ "cost": { "input": 2, "output": 6, - "cache_read": 0.25, - "cache_write": 2.5 + "cache_read": 0.25 } }, "openrouter/morph/morph-v3-large": { @@ -48924,6 +48552,18 @@ "output": 1.5 } }, + "huggingface/Qwen/Qwen3-VL-30B-A3B-Instruct": { + "name": "Qwen3 VL 30B A3B Instruct", + "context": 131072, + "output": 32768, + "tool_call": true, + "structured_output": true, + "image": true, + "cost": { + "input": 0.2, + "output": 0.7 + } + }, "huggingface/Qwen/Qwen3-VL-235B-A22B-Thinking": { "name": "Qwen3 VL 235B A22B Thinking", "context": 131072, @@ -49326,6 +48966,17 @@ "output": 1.2 } }, + "huggingface/MiniMaxAI/MiniMax-M1-80k": { + "name": "MiniMax M1 80K", + "context": 1000000, + "output": 80000, + "reasoning": true, + "tool_call": true, + "cost": { + "input": 0.55, + "output": 2.2 + } + }, "huggingface/MiniMaxAI/MiniMax-M2.1": { "name": "MiniMax-M2.1", "context": 204800, @@ -49566,6 +49217,16 @@ "output": 2.2 } }, + "huggingface/zai-org/AutoGLM-Phone-9B-Multilingual": { + "name": "AutoGLM Phone 9B Multilingual", + "context": 65536, + "output": 65536, + "image": true, + "cost": { + "input": 0.035, + "output": 0.138 + } + }, "huggingface/zai-org/GLM-4.7-Flash": { "name": "GLM-4.7-Flash", "context": 200000, @@ -56171,6 +55832,33 @@ "cache_write": 0 } }, + "ambient/qwen/qwen3.6-35b-a3b": { + "name": "Qwen3.6 35B-A3B", + "context": 262144, + "output": 262144, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "cost": { + "input": 0.15, + "output": 1, + "cache_read": 0.15, + "cache_write": 0 + } + }, + "ambient/qwen/qwen3-30b-a3b-instruct-2507": { + "name": "Qwen3 30B A3B Instruct 2507", + "context": 131072, + "output": 32768, + "tool_call": true, + "structured_output": true, + "cost": { + "input": 0.09, + "output": 0.3, + "cache_read": 0.09, + "cache_write": 0 + } + }, "ambient/qwen/qwen3.6-27b": { "name": "Qwen3.6 27B", "context": 32768, @@ -56178,7 +55866,6 @@ "reasoning": true, "tool_call": true, "structured_output": true, - "image": true, "cost": { "input": 0.32, "output": 3.2, @@ -58114,6 +57801,10 @@ "cache_read": 0.042 } }, + "vercel/heygen/heygen-video-1": { + "name": "HeyGen Video", + "image": true + }, "vercel/inference-net/schematron-v2-small": { "name": "Schematron V2 Small", "context": 128000, @@ -59858,7 +59549,7 @@ "output": 131072, "tool_call": true, "cost": { - "input": 0.019, + "input": 0.029, "output": 0.03 } }, @@ -66203,6 +65894,21 @@ "cache_write": 6.25 } }, + "ofox/anthropic/claude-haiku-5.5": { + "name": "Claude Haiku 5.5", + "context": 1000000, + "output": 128000, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true, + "cost": { + "input": 0.1, + "output": 0.5, + "cache_read": 0.01, + "cache_write": 0.125 + } + }, "ofox/anthropic/claude-opus-4.8": { "name": "Claude Opus 4.8", "context": 1000000, @@ -69232,6 +68938,18 @@ "cache_write": 5 } }, + "aihubmix/coding-glm-5.3-free": { + "name": "GLM-5.3 (Coding, free)", + "context": 1000000, + "output": 131072, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "cost": { + "input": 0, + "output": 0 + } + }, "aihubmix/gpt-image-2.5-flare": { "name": "GPT Image 2.5 Flare", "image": true, @@ -69652,6 +69370,20 @@ "cache_read": 0.0308 } }, + "aihubmix/coding-glm-5.3-flash-free": { + "name": "GLM-5.3-Flash (Coding, free)", + "context": 1000000, + "output": 131072, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true, + "video": true, + "cost": { + "input": 0, + "output": 0 + } + }, "aihubmix/qwen3.6-flash": { "name": "Qwen3.6 Flash", "context": 991000, @@ -71088,6 +70820,18 @@ "cache_read": 0.145 } }, + "merge-gateway/deepseek/deepseek-r1-0528": { + "name": "DeepSeek R1 (0528)", + "context": 65536, + "output": 32768, + "reasoning": true, + "structured_output": true, + "cost": { + "input": 1.35, + "output": 5.4, + "cache_read": 0.945 + } + }, "merge-gateway/deepseek/deepseek-v3.2": { "name": "DeepSeek V3.2", "context": 128000, @@ -72216,6 +71960,19 @@ "output": 1.8 } }, + "merge-gateway/qwen/qwen3-vl-30b-a3b-instruct": { + "name": "Qwen3-VL 30B-A3B Instruct", + "context": 131072, + "output": 32768, + "tool_call": true, + "structured_output": true, + "image": true, + "cost": { + "input": 0.108, + "output": 0.43, + "cache_read": 0.0216 + } + }, "merge-gateway/qwen/qwen3-235b-a22b": { "name": "Qwen3 235B A22B", "context": 131072, @@ -78843,6 +78600,17 @@ "output": 0.1 } }, + "edenai/deepinfra/Gryphe/MythoMax-L2-13b": { + "name": "MythoMax L2 13B (Deep Infra)", + "context": 4096, + "output": 3200, + "tool_call": true, + "structured_output": true, + "cost": { + "input": 0.4, + "output": 0.4 + } + }, "edenai/deepinfra/deepseek-ai/DeepSeek-V4-Flash-0731": { "name": "DeepSeek V4 Flash 0731 (Deep Infra)", "context": 1048576, @@ -78894,6 +78662,19 @@ "cache_read": 0.006 } }, + "edenai/deepinfra/deepseek-ai/DeepSeek-R1-0528": { + "name": "DeepSeek R1 0528 (Deep Infra)", + "context": 163840, + "output": 32768, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "cost": { + "input": 0.5, + "output": 2.15, + "cache_read": 0.35 + } + }, "edenai/deepinfra/deepseek-ai/DeepSeek-V3": { "name": "DeepSeek-V3 (Deep Infra)", "context": 163840, @@ -78943,6 +78724,16 @@ "cache_read": 0.02 } }, + "edenai/deepinfra/moonshotai/Kimi-K2-Instruct": { + "name": "Kimi K2 Instruct (Deep Infra)", + "context": 131072, + "output": 32768, + "tool_call": true, + "cost": { + "input": 0.5, + "output": 2 + } + }, "edenai/deepinfra/moonshotai/Kimi-K2.5": { "name": "Kimi K2.5 (Deep Infra)", "context": 262144, @@ -79045,6 +78836,15 @@ "output": 0.17 } }, + "edenai/deepinfra/microsoft/WizardLM-2-8x22B": { + "name": "WizardLM 2 8x22B (Deep Infra)", + "context": 65536, + "output": 8000, + "cost": { + "input": 0.48, + "output": 0.48 + } + }, "edenai/cerebras/gpt-oss-120b": { "name": "GPT OSS 120B (Cerebras)", "context": 131072, @@ -79668,17 +79468,6 @@ "cache_write": 0.07 } }, - "edenai/tencent/step-5-preview": { - "name": "Step 5 Preview (Tencent)", - "context": 1000000, - "output": 1000000, - "reasoning": true, - "cost": { - "input": 1, - "output": 2.7, - "cache_read": 0.05 - } - }, "edenai/tencent/deepseek-v4-pro-0813": { "name": "DeepSeek V4 Pro 0813 (Tencent)", "context": 1000000, @@ -80440,9 +80229,9 @@ "reasoning": true, "tool_call": true, "cost": { - "input": 0.44744, - "output": 0.89488, - "cache_read": 0.089488 + "input": 0.44824, + "output": 0.89648, + "cache_read": 0.089648 } }, "edenai/scaleway/llama-3.3-70b-instruct": { @@ -80451,8 +80240,8 @@ "output": 4096, "tool_call": true, "cost": { - "input": 1.00674, - "output": 1.00674 + "input": 1.00854, + "output": 1.00854 } }, "edenai/scaleway/gpt-oss-120b": { @@ -80462,8 +80251,8 @@ "reasoning": true, "tool_call": true, "cost": { - "input": 0.16779, - "output": 0.67116 + "input": 0.16809, + "output": 0.67236 } }, "edenai/ionos/meta-llama/Llama-3.3-70B-Instruct": { @@ -80471,8 +80260,8 @@ "context": 128000, "output": 4096, "cost": { - "input": 0.72709, - "output": 0.72709 + "input": 0.72839, + "output": 0.72839 } }, "edenai/ionos/openai/gpt-oss-120b": { @@ -80481,8 +80270,8 @@ "output": 32768, "reasoning": true, "cost": { - "input": 0.16779, - "output": 0.72709 + "input": 0.16809, + "output": 0.72839 } }, "edenai/vertex/gemini-flash-latest": { @@ -80974,6 +80763,15 @@ "output": 0.03 } }, + "edenai/cloudflare/@cf/meta/llama-3.2-1b-instruct": { + "name": "Llama 3.2 1B Instruct (Cloudflare)", + "context": 60000, + "output": 32000, + "cost": { + "input": 0.027, + "output": 0.201 + } + }, "edenai/cloudflare/@cf/aisingapore/gemma-sea-lion-v4-27b-it": { "name": "Gemma-SEA-LION-v4-27B-IT (Cloudflare)", "context": 128000, @@ -81155,6 +80953,19 @@ "cache_read": 0.5 } }, + "edenai/tensorx/deepseek/deepseek-r1-0528": { + "name": "DeepSeek R1 0528 (TensorX)", + "context": 164000, + "output": 32768, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "cost": { + "input": 0.66, + "output": 2.6, + "cache_read": 0.165 + } + }, "edenai/tensorx/moonshotai/kimi-k2.5": { "name": "Kimi K2.5 (TensorX)", "context": 262144, @@ -81884,6 +81695,19 @@ "output": 0.47 } }, + "edenai/qwen/qwen3-vl-30b-a3b-instruct": { + "name": "Qwen3 VL 30B A3B Instruct", + "context": 131072, + "output": 32768, + "tool_call": true, + "structured_output": true, + "image": true, + "video": true, + "cost": { + "input": 0.2, + "output": 0.8 + } + }, "edenai/qwen/qwen-vl-max": { "name": "Qwen-VL Max", "context": 131072, @@ -81946,6 +81770,15 @@ "cache_write": 0.375 } }, + "edenai/qwen/qwen-mt-plus": { + "name": "Qwen MT Plus", + "context": 4096, + "output": 8192, + "cost": { + "input": 2.46, + "output": 7.37 + } + }, "edenai/qwen/deepseek-v4-pro-0813": { "name": "DeepSeek V4 Pro 0813 (Alibaba)", "context": 1000000, @@ -82554,8 +82387,8 @@ "context": 100000, "output": 262144, "cost": { - "input": 0.33558, - "output": 0.44744 + "input": 0.33618, + "output": 0.44824 } }, "edenai/moonshot/kimi-k3": { @@ -93142,6 +92975,18 @@ "cache_read": 0.01 } }, + "llmgateway/reka-edge-2603": { + "name": "Reka Edge 2603", + "context": 16384, + "output": 16384, + "tool_call": true, + "structured_output": true, + "image": true, + "cost": { + "input": 0.1, + "output": 0.1 + } + }, "llmgateway/grok-4-5": { "name": "Grok 4.5", "context": 500000, @@ -93263,9 +93108,9 @@ "image": true, "video": true, "cost": { - "input": 0.14, - "output": 0.28, - "cache_read": 0.0028 + "input": 0.168, + "output": 0.336, + "cache_read": 0.0034 } }, "llmgateway/gpt-5.5-pro": { @@ -93373,17 +93218,6 @@ "cache_read": 0.125 } }, - "llmgateway/qwen-coder-plus": { - "name": "Qwen Coder Plus", - "context": 131072, - "output": 8192, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.502, - "output": 1.004 - } - }, "llmgateway/glm-5v-turbo": { "name": "GLM-5V-Turbo", "context": 200000, @@ -94277,19 +94111,6 @@ "output": 0.74 } }, - "llmgateway/qwen3-vl-flash": { - "name": "Qwen3 VL Flash", - "context": 262144, - "output": 32000, - "tool_call": true, - "structured_output": true, - "image": true, - "cost": { - "input": 0.05, - "output": 0.4, - "cache_read": 0.01 - } - }, "llmgateway/seed-2-0-pro-260328": { "name": "Seed 2.0 Pro (260328)", "context": 262144, @@ -94674,18 +94495,6 @@ "cache_read": 0.0036 } }, - "llmgateway/qwen3-coder-plus": { - "name": "Qwen3 Coder Plus", - "context": 1000000, - "output": 65536, - "tool_call": true, - "cost": { - "input": 1, - "output": 5, - "cache_read": 0.2, - "cache_write": 1.25 - } - }, "llmgateway/glm-4.7-flash": { "name": "GLM-4.7-Flash", "context": 200000, @@ -94978,19 +94787,6 @@ "output": 2 } }, - "llmgateway/qwen3.6-max-preview": { - "name": "Qwen3.6 Max Preview", - "context": 262144, - "output": 65536, - "reasoning": true, - "tool_call": true, - "cost": { - "input": 1.3, - "output": 7.8, - "cache_read": 0.13, - "cache_write": 1.625 - } - }, "llmgateway/claude-opus-4-6": { "name": "Claude Opus 4.6", "context": 1000000, @@ -95084,18 +94880,6 @@ "cache_read": 0.5 } }, - "llmgateway/qwen-omni-turbo": { - "name": "Qwen-Omni Turbo", - "context": 32768, - "output": 2048, - "tool_call": true, - "image": true, - "video": true, - "cost": { - "input": 0.2, - "output": 0.8 - } - }, "llmgateway/hy-mt2-plus": { "name": "Hy-MT2 Plus", "context": 8192, @@ -100147,8 +99931,8 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.067, - "output": 0.245, + "input": 0.179, + "output": 0.697, "cache_read": 0.014 } }, @@ -104364,6 +104148,21 @@ "output": 32768, "tool_call": true }, + "digitalocean/anthropic-claude-5.5-haiku": { + "name": "Anthropic Claude 5.5 Haiku", + "context": 1000000, + "output": 128000, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true, + "cost": { + "input": 0.1, + "output": 0.5, + "cache_read": 0.01, + "cache_write": 0.125 + } + }, "digitalocean/qwen-2.5-14b-instruct": { "name": "Qwen 2.5 14B Instruct", "context": 131072, diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 6ade8d6..b29fff3 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -1978,7 +1978,7 @@ dependencies = [ [[package]] name = "kimiswitch" -version = "0.8.2" +version = "0.8.3-rc1" dependencies = [ "anyhow", "chrono", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 101d405..70cd778 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "kimiswitch" -version = "0.8.2" +version = "0.8.3-rc1" description = "Kimi Switch - model config manager" authors = ["codingplan.site"] edition = "2021" diff --git a/src-tauri/src/commands.rs b/src-tauri/src/commands.rs index 0530d91..18fcc8c 100644 --- a/src-tauri/src/commands.rs +++ b/src-tauri/src/commands.rs @@ -175,11 +175,18 @@ fn load_agent_config_uncached(agent: Agent) -> Result { } // Migration safety: include providers/models that exist in // SQLite but not in config.toml (e.g. after upgrading from the - // old single-provider-write behaviour). + // old single-provider-write behaviour). Models whose provider + // no longer exists anywhere are skipped — they can never be + // shown or selected in the UI, and merging them back would + // resurrect zombie `[models."old-name/..."]` entries into + // config.toml on the next save. for (name, p) in &db.providers { config.providers.entry(name.clone()).or_insert_with(|| p.clone()); } for (alias, m) in &db.models { + if !config.providers.contains_key(&m.provider) { + continue; + } config.models.entry(alias.clone()).or_insert_with(|| m.clone()); } } @@ -230,6 +237,25 @@ pub fn save_agent_config_command(agent: Agent, config: Config) -> Result<(), Str None => db::delete_setting_pub(&cfg_key).map_err(fmt_anyhow)?, } } + // Prune usage settings of providers that no longer exist (deleted in the + // UI). The keys are agent-agnostic, so the live set includes the other + // agent's providers too. If the other agent's config cannot be read we + // skip this round entirely — pruning against an incomplete live set + // could delete the other agent's still-live settings. + { + let other_agent = match agent { + Agent::KimiCode => Agent::Pi, + Agent::Pi => Agent::KimiCode, + }; + let other_cfg = match db::load_config(&other_agent) { + Ok(cfg) => cfg, + Err(_) => return Ok(()), + }; + let mut live: std::collections::HashSet = + config.providers.keys().cloned().collect(); + live.extend(other_cfg.providers.keys().cloned()); + db::prune_orphan_usage_settings(&live).map_err(fmt_anyhow)?; + } Ok(()) } @@ -2367,3 +2393,272 @@ mod usage_key_tests { assert_eq!(resolve_usage_api_key(&p).unwrap(), None); } } + +/// End-to-end persistence tests for the Kimi Code agent: a UI edit followed +/// by save_agent_config_command must land in BOTH stores (config.toml and +/// SQLite) and must not resurrect deleted models on the next load. +#[cfg(test)] +mod config_persistence_tests { + use super::*; + + /// Serialize env mutation with every other env-mutating test in the + /// binary (shared crate-level lock; see lib.rs `test_state`). + fn with_env_homes(f: impl FnOnce(&std::path::Path) -> T) -> T { + let _guard = crate::test_state::lock(); + let home = tempfile::tempdir().unwrap(); + let db_dir = tempfile::tempdir().unwrap(); + std::env::set_var("KIMI_CODE_HOME", home.path()); + std::env::set_var("KIMI_SWITCH_DB_PATH", db_dir.path().join("test.db")); + db::close_cached_conn_for_tests(); + let out = f(home.path()); + db::close_cached_conn_for_tests(); + std::env::remove_var("KIMI_CODE_HOME"); + std::env::remove_var("KIMI_SWITCH_DB_PATH"); + out + } + + const TOML_WITH_STALE_MODELS: &str = r#" +default_model = "opencode-go/longcat-2.5-preview-free" + +[providers.opencode-go] +type = "openai" +base_url = "https://opencode.ai/zen/go/v1" +api_key = "sk-test" + +[models."opencode-go-copy/deepseek-v4-flash"] +provider = "opencode-go" +model = "deepseek-v4-flash" +max_context_size = 512000 + +[models."opencode-go-1/space-bunny-free"] +provider = "opencode-go" +model = "space-bunny-free" +max_context_size = 512000 + +[models."opencode-go/longcat-2.5-preview-free"] +provider = "opencode-go" +model = "longcat-2.5-preview-free" +max_context_size = 1000000 +"#; + + #[test] + fn ui_delete_then_save_persists_to_both_stores_and_never_resurrects() { + with_env_homes(|home| { + std::fs::write(home.join("config.toml"), TOML_WITH_STALE_MODELS).unwrap(); + + // Load from the seeded config.toml, then mirror it into SQLite to + // reproduce the user's real state: stale aliases in BOTH stores. + let mut config = load_agent_config_uncached(Agent::KimiCode).unwrap(); + assert!(config.models.contains_key("opencode-go-copy/deepseek-v4-flash")); + assert!(config.models.contains_key("opencode-go-1/space-bunny-free")); + db::save_config(&Agent::KimiCode, &config).unwrap(); + + // Simulate the UI's model delete (onModelDelete): drop the stale + // aliases from the in-memory config, then save. + config.models.retain(|alias, _| { + !alias.starts_with("opencode-go-copy/") && !alias.starts_with("opencode-go-1/") + }); + save_agent_config_command(Agent::KimiCode, config).unwrap(); + + // config.toml: stale sections gone, live model kept. + let toml_text = std::fs::read_to_string(home.join("config.toml")).unwrap(); + assert!(!toml_text.contains("opencode-go-copy")); + assert!(!toml_text.contains("opencode-go-1")); + assert!(toml_text.contains("opencode-go/longcat-2.5-preview-free")); + + // SQLite mirror: stale rows gone. + let db_config = db::load_config(&Agent::KimiCode).unwrap(); + assert!(!db_config.models.contains_key("opencode-go-copy/deepseek-v4-flash")); + assert!(!db_config.models.contains_key("opencode-go-1/space-bunny-free")); + + // Reload through the real load path: no resurrection from SQLite. + let reloaded = load_agent_config_uncached(Agent::KimiCode).unwrap(); + assert!(!reloaded.models.contains_key("opencode-go-copy/deepseek-v4-flash")); + assert!(!reloaded.models.contains_key("opencode-go-1/space-bunny-free")); + assert!(reloaded.models.contains_key("opencode-go/longcat-2.5-preview-free")); + }); + } + + #[test] + fn sqlite_models_whose_provider_was_deleted_do_not_resurrect() { + with_env_homes(|home| { + // config.toml already clean: only the live provider + model. + let toml = r#" +default_model = "opencode-go/longcat-2.5-preview-free" + +[providers.opencode-go] +type = "openai" +base_url = "https://opencode.ai/zen/go/v1" +api_key = "sk-test" + +[models."opencode-go/longcat-2.5-preview-free"] +provider = "opencode-go" +model = "longcat-2.5-preview-free" +max_context_size = 1000000 +"#; + std::fs::write(home.join("config.toml"), toml).unwrap(); + + // Seed SQLite with a zombie model whose provider no longer exists + // (left behind by an old rename-then-delete). + let mut providers = IndexMap::new(); + providers.insert( + "opencode-go".to_string(), + Provider { + name: "opencode-go".to_string(), + provider_type: ProviderType::Openai, + base_url: Some("https://opencode.ai/zen/go/v1".to_string()), + api_key: Some("sk-test".to_string()), + api_key_env: None, + env: IndexMap::new(), + note: None, + official_url: None, + managed: false, + enabled: true, + active: true, + icon: None, + icon_color: None, + raw_other: serde_json::Value::Null, + usage_kinds: None, + usage_config: None, + }, + ); + let mut models = IndexMap::new(); + models.insert( + "opencode-go-copy/deepseek-v4-flash".to_string(), + Model { + alias: "opencode-go-copy/deepseek-v4-flash".to_string(), + provider: "opencode-go-copy".to_string(), + model: "deepseek-v4-flash".to_string(), + max_context_size: 512_000, + display_name: None, + supports_1m: false, + capabilities: vec![], + raw_other: serde_json::Value::Null, + }, + ); + let seeded = Config { + default_model: Some("opencode-go/longcat-2.5-preview-free".to_string()), + providers, + models, + raw_other: serde_json::Value::Null, + imported_section_keys: vec![], + }; + db::save_config(&Agent::KimiCode, &seeded).unwrap(); + + // Loading must NOT merge the zombie back: its provider is gone, + // so it can never be shown or selected, and merging it would + // rewrite it into config.toml on the next save. + let loaded = load_agent_config_uncached(Agent::KimiCode).unwrap(); + assert!(!loaded.models.contains_key("opencode-go-copy/deepseek-v4-flash")); + assert!(loaded.models.contains_key("opencode-go/longcat-2.5-preview-free")); + + // And a save after that load must keep config.toml clean. + save_agent_config_command(Agent::KimiCode, loaded).unwrap(); + let toml_text = std::fs::read_to_string(home.join("config.toml")).unwrap(); + assert!(!toml_text.contains("opencode-go-copy")); + }); + } + + fn plain_provider(name: &str) -> Provider { + Provider { + name: name.to_string(), + provider_type: ProviderType::Openai, + base_url: Some("https://opencode.ai/zen/go/v1".to_string()), + api_key: Some("sk-test".to_string()), + api_key_env: None, + env: IndexMap::new(), + note: None, + official_url: None, + managed: false, + enabled: true, + active: true, + icon: None, + icon_color: None, + raw_other: serde_json::Value::Null, + usage_kinds: None, + usage_config: None, + } + } + + #[test] + fn deleting_a_provider_prunes_its_orphan_usage_settings() { + with_env_homes(|home| { + std::fs::write(home.join("config.toml"), TOML_WITH_STALE_MODELS).unwrap(); + let mut config = load_agent_config_uncached(Agent::KimiCode).unwrap(); + + // Provider present: its usage settings survive the save. + config.providers.get_mut("opencode-go").unwrap().usage_kinds = + Some(vec!["plan:opencode_go".to_string()]); + save_agent_config_command(Agent::KimiCode, config.clone()).unwrap(); + assert_eq!( + db::get_setting_pub("usage_kinds:opencode-go").unwrap().as_deref(), + Some(r#"["plan:opencode_go"]"#) + ); + + // Seed orphans the way history did (renamed/deleted providers). + db::set_setting_pub("usage_kinds:opencode-go-copy", r#"["plan:opencode_go"]"#) + .unwrap(); + db::set_setting_pub("usage_config:opencode-go-1", "{}").unwrap(); + // Non-usage settings must never be touched by the prune. + db::set_setting_pub("app.language", "zh").unwrap(); + + // Delete the provider (UI semantics) and save. + config.providers.shift_remove("opencode-go"); + config.models.retain(|_, m| m.provider != "opencode-go"); + config.default_model = None; + save_agent_config_command(Agent::KimiCode, config).unwrap(); + + // The provider's own settings and the historical orphans are gone. + assert_eq!(db::get_setting_pub("usage_kinds:opencode-go").unwrap(), None); + assert_eq!(db::get_setting_pub("usage_kinds:opencode-go-copy").unwrap(), None); + assert_eq!(db::get_setting_pub("usage_config:opencode-go-1").unwrap(), None); + assert_eq!(db::get_setting_pub("app.language").unwrap().as_deref(), Some("zh")); + + // Re-adding a provider with the same name starts clean (no + // resurrection of the pruned rows). + let mut config = load_agent_config_uncached(Agent::KimiCode).unwrap(); + config + .providers + .insert("opencode-go".to_string(), plain_provider("opencode-go")); + save_agent_config_command(Agent::KimiCode, config).unwrap(); + assert_eq!(db::get_setting_pub("usage_kinds:opencode-go").unwrap(), None); + assert_eq!(db::get_setting_pub("app.language").unwrap().as_deref(), Some("zh")); + }); + } + + #[test] + fn pruning_never_touches_the_other_agents_usage_settings() { + with_env_homes(|home| { + std::fs::write(home.join("config.toml"), TOML_WITH_STALE_MODELS).unwrap(); + + // Pi (the other agent) has its own provider with usage settings. + let mut pi_providers = IndexMap::new(); + pi_providers.insert("pi-provider".to_string(), plain_provider("pi-provider")); + db::save_config( + &Agent::Pi, + &Config { + default_model: None, + providers: pi_providers, + models: IndexMap::new(), + raw_other: serde_json::Value::Null, + imported_section_keys: vec![], + }, + ) + .unwrap(); + db::set_setting_pub("usage_kinds:pi-provider", r#"["balance:deepseek"]"#) + .unwrap(); + db::set_setting_pub("usage_config:pi-provider", "{}").unwrap(); + + // Save the Kimi Code config (which has no `pi-provider`). + let config = load_agent_config_uncached(Agent::KimiCode).unwrap(); + save_agent_config_command(Agent::KimiCode, config).unwrap(); + + // The other agent's settings survive the prune. + assert_eq!( + db::get_setting_pub("usage_kinds:pi-provider").unwrap().as_deref(), + Some(r#"["balance:deepseek"]"#) + ); + assert_eq!(db::get_setting_pub("usage_config:pi-provider").unwrap().as_deref(), Some("{}")); + }); + } +} diff --git a/src-tauri/src/dashboard.rs b/src-tauri/src/dashboard.rs index 523d0ff..5f9ea39 100644 --- a/src-tauri/src/dashboard.rs +++ b/src-tauri/src/dashboard.rs @@ -1670,8 +1670,7 @@ fn scan_usage_cached2(home: &Path, refresh: bool) -> (Arc>, Sca /// home, redirected database or purged cache. #[cfg(test)] fn test_state_lock() -> std::sync::MutexGuard<'static, ()> { - static LOCK: std::sync::Mutex<()> = std::sync::Mutex::new(()); - LOCK.lock().unwrap_or_else(|e| e.into_inner()) + crate::test_state::lock() } /// The record table is shared behind an `Arc` so the unchanged path hands out diff --git a/src-tauri/src/db.rs b/src-tauri/src/db.rs index 8c726af..a3c9989 100644 --- a/src-tauri/src/db.rs +++ b/src-tauri/src/db.rs @@ -428,6 +428,33 @@ pub fn delete_setting_pub(key: &str) -> DbResult<()> { Ok(()) } +/// Delete `usage_kinds:` / `usage_config:` settings rows whose +/// provider no longer exists in any agent's config, so deleting a provider in +/// the UI also clears its usage-query settings instead of leaving orphan rows +/// that outlive every rename of that provider. +pub fn prune_orphan_usage_settings( + live_providers: &std::collections::HashSet, +) -> DbResult<()> { + with_conn(|conn| { + let keys: Vec = { + let mut stmt = conn.prepare( + "SELECT key FROM settings WHERE key LIKE 'usage_kinds:%' OR key LIKE 'usage_config:%'", + )?; + let rows = stmt.query_map([], |row| row.get::<_, String>(0))?; + rows.collect::, _>>()? + }; + for key in keys { + let name = key.split_once(':').map(|(_, n)| n).unwrap_or(""); + if !live_providers.contains(name) { + conn.execute("DELETE FROM settings WHERE key = ?1", params![key])?; + } + } + Ok(()) + })?; + bump_generation(); + Ok(()) +} + // --------------------------------------------------------------------------- // Archived-session usage snapshots // --------------------------------------------------------------------------- diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 6e218bb..c6c5fb3 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -10,6 +10,20 @@ pub mod pi_io; pub mod plugins; pub mod services; +/// Process-global state guard for tests that redirect shared environment +/// (`KIMI_CODE_HOME`, `KIMI_SWITCH_DB_PATH`) or in-memory caches (scan cache, +/// cached DB connection). Every env-mutating test must hold this lock so a +/// parallel test can never observe another one's temp home or redirected +/// database. +#[cfg(test)] +pub(crate) mod test_state { + static STATE_LOCK: std::sync::Mutex<()> = std::sync::Mutex::new(()); + + pub(crate) fn lock() -> std::sync::MutexGuard<'static, ()> { + STATE_LOCK.lock().unwrap_or_else(|e| e.into_inner()) + } +} + use tauri::menu::{Menu, MenuItem, PredefinedMenuItem}; use tauri::tray::{MouseButton, MouseButtonState, TrayIconBuilder}; use tauri::Manager; diff --git a/src-tauri/src/oauth.rs b/src-tauri/src/oauth.rs index fde9736..14d9442 100644 --- a/src-tauri/src/oauth.rs +++ b/src-tauri/src/oauth.rs @@ -925,8 +925,7 @@ mod tests { /// dir). A process-wide mutex serializes env mutation so parallel tests in /// this binary can't observe a stale override. fn with_kimi_code_home(f: impl FnOnce(&std::path::Path) -> T) -> T { - static LOCK: std::sync::OnceLock> = std::sync::OnceLock::new(); - let _guard = LOCK.get_or_init(|| std::sync::Mutex::new(())).lock().unwrap(); + let _guard = crate::test_state::lock(); let home = tempfile::tempdir().unwrap(); std::env::set_var("KIMI_CODE_HOME", home.path()); let out = f(home.path()); diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 4b85f45..cda31b3 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,6 +1,6 @@ { "productName": "Kimi Switch", - "version": "0.8.2", + "version": "0.8.3-rc1", "identifier": "com.kimiswitch.app", "build": { "beforeDevCommand": "npm run dev", diff --git a/src/App.tsx b/src/App.tsx index 823b112..6216624 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -20,6 +20,14 @@ import { type ProviderPreset, } from "./config/providerPresets"; import { validateProviders } from "./lib/validation"; +import { + copyModelsOnProviderDuplicate, + rekeyModelsOnProviderRename, +} from "./lib/providerRename"; +import { + purgeSubagentPoolAliases, + rekeySubagentPoolAliases, +} from "./lib/referenceCleanup"; import type { Agent, Model, Provider, UsageConfig } from "./types"; const AGENT_STORAGE_KEY = "kimi-switch-agent"; @@ -153,9 +161,6 @@ export default function App() { // provider being switched to — only that one needs to be // complete; sibling providers being merely listed in the config // must not block the switch. - // 3. Programmatic auto-saves (duplicate) call `save` directly with - // no validation — duplicates inherit completeness from their - // source. // Returns `true` when the config was actually persisted, `false` when // the user cancelled the validation confirm (callers can react to this // to roll back in-memory mutations made before the save). @@ -287,15 +292,30 @@ export default function App() { ); if (oldEntry && oldEntry[0] !== provider.name) { delete providers[oldEntry[0]]; - const models = { ...cfg.models }; - for (const key of Object.keys(models)) { - if (models[key].provider === editingProvider) { - models[key] = { ...models[key], provider: provider.name }; - } + // Re-key this provider's model aliases so the `/` + // prefix tracks the new name (see rekeyModelsOnProviderRename). + const { models, aliasMap } = rekeyModelsOnProviderRename( + cfg.models, + editingProvider, + provider.name + ); + // The provider's remembered default model and the global default + // model are stored as aliases and must follow the re-key. + const remembered = getProviderDefaultModel(provider); + providers[provider.name] = + remembered && aliasMap[remembered] + ? setProviderDefaultModel(provider, aliasMap[remembered]) + : provider; + let default_model = cfg.default_model; + if (default_model && aliasMap[default_model]) { + default_model = aliasMap[default_model]; } - providers[provider.name] = provider; + // The subagent pool references model aliases as its keys and + // defaults; they must follow the re-key or they turn into zombie + // pool entries. + const raw_other = rekeySubagentPoolAliases(cfg.raw_other, aliasMap); setEditingProvider(provider.name); - return { ...cfg, providers, models }; + return { ...cfg, providers, models, default_model, raw_other }; } providers[provider.name] = provider; return { ...cfg, providers }; @@ -308,12 +328,21 @@ export default function App() { const providers = { ...cfg.providers }; delete providers[name]; const models = { ...cfg.models }; + const removedAliases: string[] = []; for (const key of Object.keys(models)) { if (models[key].provider === name) { + removedAliases.push(key); delete models[key]; } } - return { ...cfg, providers, models }; + // Everything keyed on the deleted aliases must go with them: the + // global default model and the subagent pool entries / pool default. + const default_model = + cfg.default_model && removedAliases.includes(cfg.default_model) + ? null + : cfg.default_model; + const raw_other = purgeSubagentPoolAliases(cfg.raw_other, removedAliases); + return { ...cfg, providers, models, default_model, raw_other }; }); if (editingProvider === name) { setEditingProvider(""); @@ -356,29 +385,14 @@ export default function App() { null ); const providers = { ...cfg.providers, [newName]: copied }; - // Re-key this provider's models to the new provider name so the copy - // has its own independent model set. - const models = { ...cfg.models }; - for (const [alias, m] of Object.entries(cfg.models)) { - if (m.provider === name) { - // The model belongs to this provider by `m.provider === name`. To - // re-key it under the new provider, we want a `newName/...` - // alias. The original code assumed `alias` is exactly - // `${name}/${modelId}` and used `alias.slice(name.length)`; that - // breaks for legacy / non-standard aliases (e.g. `kimi-k3` from - // pre-v0.6 data) which would produce `newName-k3` — missing the - // `/` separator and pointing at the wrong model. Use an explicit - // prefix check and fall back to a full re-prefix. - const prefix = `${name}/`; - const newAlias = alias.startsWith(prefix) - ? newName + alias.slice(name.length) - : `${newName}/${alias}`; - models[newAlias] = { ...m, alias: newAlias, provider: newName }; - } - } + // Clone the provider's models under the duplicate's name — COPY + // semantics: the source keeps its models (a rekey would move them). + const models = copyModelsOnProviderDuplicate(cfg.models, name, newName); return { ...cfg, providers, models }; }); - await save(); + // No immediate save: the copy lives in memory only, like every other + // edit. Abandoning (back → discard) must leave the config unchanged; + // the copy persists when the user saves (Ctrl+S / footer / switch). setSwitchMessage(t("copiedProvider", { name: `${name}-copy` })); setTimeout(() => setSwitchMessage(null), 3000); }; @@ -529,6 +543,14 @@ export default function App() { default_model = null; } + // Pool entries pointing at aliases that disappeared in this apply + // (provider renamed, models dropped) must not survive as zombies. + const removedAliases = Object.keys(cfg.models).filter( + (key) => + cfg.models[key].provider === oldName && !(key in updatedModels) + ); + const raw_other = purgeSubagentPoolAliases(cfg.raw_other, removedAliases); + // Remember this provider's default model preference so it survives // provider switches. const updatedProvider = providers[provider.name]; @@ -536,7 +558,7 @@ export default function App() { providers[provider.name] = setProviderDefaultModel(updatedProvider, default_model); } - return { ...cfg, providers, models: updatedModels, default_model }; + return { ...cfg, providers, models: updatedModels, default_model, raw_other }; }); if (provider.name !== editingProvider) { setEditingProvider(provider.name); @@ -744,16 +766,26 @@ export default function App() { if (default_model === oldKey) default_model = effective.alias; else if (effective !== model && default_model === model.alias) default_model = effective.alias; - return { ...cfg, models, default_model }; + // Pool entries keyed on the discarded alias (placeholder or + // replaced old key) must follow the rename or they dangle. + const poolAliasMap: Record = {}; + if (effective !== model) poolAliasMap[model.alias] = effective.alias; + if (oldKey && oldKey !== effective.alias) + poolAliasMap[oldKey] = effective.alias; + const raw_other = rekeySubagentPoolAliases(cfg.raw_other, poolAliasMap); + return { ...cfg, models, default_model, raw_other }; }); }} onModelDelete={(alias) => { updateConfig((cfg) => { const models = { ...cfg.models }; delete models[alias]; + // Pool entries keyed on the deleted alias must not survive. + const raw_other = purgeSubagentPoolAliases(cfg.raw_other, [alias]); return { ...cfg, models, + raw_other, default_model: cfg.default_model === alias ? null : cfg.default_model, }; diff --git a/src/lib/models-dev-full.json b/src/lib/models-dev-full.json index 641bc3f..da43cf4 100644 --- a/src/lib/models-dev-full.json +++ b/src/lib/models-dev-full.json @@ -1,5 +1,5 @@ { - "last_updated": "2026-10-09", + "last_updated": "2026-10-10", "providers": { "deepinfra": { "id": "deepinfra", @@ -300,6 +300,19 @@ "tool_call": true, "structured_output": true }, + { + "id": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "name": "Qwen3 VL 30B A3B Instruct", + "cost": { + "input": 0.15, + "output": 0.6 + }, + "context": 262144, + "output_limit": 32768, + "tool_call": true, + "structured_output": true, + "image": true + }, { "id": "Qwen/Qwen3.8-Max", "name": "Qwen3.8 Max", @@ -3643,20 +3656,6 @@ "image": true, "video": true }, - { - "id": "deepseek-v3-2", - "name": "DeepSeek V3.2", - "cost": { - "input": 0.57, - "output": 1.71, - "cache_read": 0.57 - }, - "context": 128000, - "output_limit": 32768, - "reasoning": true, - "tool_call": true, - "structured_output": true - }, { "id": "minimax-m2-7-highspeed", "name": "MiniMax M2.7 Highspeed", @@ -3685,20 +3684,6 @@ "tool_call": true, "structured_output": true }, - { - "id": "qwen3-max", - "name": "Qwen3 Max", - "cost": { - "input": 1.08, - "output": 5.52, - "cache_read": 1.08 - }, - "context": 256000, - "output_limit": 65536, - "reasoning": true, - "tool_call": true, - "structured_output": true - }, { "id": "seed-2-0-pro", "name": "Seed 2.0 Pro", @@ -4314,20 +4299,6 @@ "image": true, "video": true }, - { - "id": "qwen3-6-max-preview", - "name": "Qwen3.6 Max Preview", - "cost": { - "input": 1.31, - "output": 7.88, - "cache_read": 1.31 - }, - "context": 256000, - "output_limit": 65536, - "reasoning": true, - "tool_call": true, - "structured_output": true - }, { "id": "step-3-7-flash", "name": "Step 3.7 Flash", @@ -4389,20 +4360,6 @@ "structured_output": true, "image": true, "video": true - }, - { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "cost": { - "input": 0.14, - "output": 0.28, - "cache_read": 0.14 - }, - "context": 1000000, - "output_limit": 393216, - "reasoning": true, - "tool_call": true, - "structured_output": true } ] }, @@ -5134,6 +5091,18 @@ "tool_call": true, "structured_output": true }, + { + "id": "@cf/cloudflare/clef-omni", + "name": "Clef Omni", + "cost": { + "input": 0.15, + "output": 0 + }, + "context": 65536, + "output_limit": 65536, + "structured_output": true, + "image": true + }, { "id": "@cf/nvidia/nemotron-3-120b-a12b", "name": "Nemotron 3 Super 120B", @@ -5991,9 +5960,9 @@ "id": "claw-medium", "name": "Claw Medium", "cost": { - "input": 0.7, + "input": 0.6, "output": 2.2, - "cache_read": 0.13 + "cache_read": 0.2 }, "context": 1048576, "input_limit": 1048576, @@ -6034,9 +6003,9 @@ "id": "claw-high", "name": "Claw High", "cost": { - "input": 0.7, + "input": 0.6, "output": 2.2, - "cache_read": 0.13 + "cache_read": 0.2 }, "context": 1048576, "input_limit": 1048576, @@ -6078,9 +6047,9 @@ "id": "claw-low", "name": "Claw Low", "cost": { - "input": 0.7, + "input": 0.6, "output": 2.2, - "cache_read": 0.13, + "cache_read": 0.2, "cache_write": 0.08333 }, "context": 1048576, @@ -6118,9 +6087,9 @@ "id": "hermes-low", "name": "Hermes Low", "cost": { - "input": 0.7, + "input": 0.6, "output": 2.2, - "cache_read": 0.13, + "cache_read": 0.2, "cache_write": 0.08333 }, "context": 1048576, @@ -6194,9 +6163,9 @@ "id": "hermes-high", "name": "Hermes High", "cost": { - "input": 0.7, + "input": 0.6, "output": 2.2, - "cache_read": 0.13 + "cache_read": 0.2 }, "context": 1048576, "input_limit": 1048576, @@ -6883,9 +6852,9 @@ "id": "hermes-medium", "name": "Hermes Medium", "cost": { - "input": 0.7, + "input": 0.6, "output": 2.2, - "cache_read": 0.13 + "cache_read": 0.2 }, "context": 1048576, "input_limit": 1048576, @@ -7891,9 +7860,9 @@ "id": "deepseek/deepseek-v4-flash-vision-exp", "name": "DeepSeek V4 Flash Vision Exp", "cost": { - "input": 0.44, - "output": 1.32, - "cache_read": 0.014 + "input": 0.22, + "output": 0.66, + "cache_read": 0.007 }, "context": 1048576, "input_limit": 1048576, @@ -8598,9 +8567,9 @@ "id": "z-ai/glm-5.3:thinking", "name": "GLM 5.3 Thinking", "cost": { - "input": 0.7, + "input": 0.6, "output": 2.2, - "cache_read": 0.13 + "cache_read": 0.2 }, "context": 1048576, "input_limit": 1048576, @@ -8961,9 +8930,9 @@ "id": "z-ai/glm-5.3", "name": "GLM 5.3", "cost": { - "input": 0.7, + "input": 0.6, "output": 2.2, - "cache_read": 0.13 + "cache_read": 0.2 }, "context": 1048576, "input_limit": 1048576, @@ -8991,9 +8960,9 @@ "id": "z-ai/glm-latest", "name": "GLM Latest", "cost": { - "input": 0.7, + "input": 0.6, "output": 2.2, - "cache_read": 0.13 + "cache_read": 0.2 }, "context": 1048576, "input_limit": 1048576, @@ -12365,9 +12334,9 @@ "id": "qwen/qwen3-coder-next", "name": "Qwen3 Coder Next", "cost": { - "input": 0.2, - "output": 1.5, - "cache_read": 0.1 + "input": 0.250251, + "output": 0.80293, + "cache_read": 0.079764 }, "context": 262144, "input_limit": 262144, @@ -12631,8 +12600,8 @@ "id": "qwen/qwen3.8-27b-uncensored", "name": "Qwen 3.8 27B Uncensored", "cost": { - "input": 0.15, - "output": 1.2, + "input": 0.75, + "output": 2.5, "cache_read": 0.125 }, "context": 1010000, @@ -12690,8 +12659,8 @@ "id": "qwen/qwen3.8-27b-uncensored:thinking", "name": "Qwen 3.8 27B Uncensored Thinking", "cost": { - "input": 0.15, - "output": 1.2, + "input": 0.75, + "output": 2.5, "cache_read": 0.125 }, "context": 1010000, @@ -14996,22 +14965,6 @@ "tool_call": true, "structured_output": true }, - { - "id": "glm-5-3-flash", - "name": "GLM-5.3-Flash", - "cost": { - "input": 0.4, - "output": 1.25, - "cache_read": 0.1 - }, - "context": 1048576, - "output_limit": 131072, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "image": true, - "video": true - }, { "id": "kimi-k3", "name": "Kimi K3", @@ -22381,17 +22334,6 @@ "reasoning": true, "tool_call": true }, - { - "id": "alibaba/qwen-coder-plus", - "name": "Qwen Coder Plus (Alibaba Cloud)", - "cost": { - "input": 0.502, - "output": 1.004 - }, - "context": 131072, - "output_limit": 8192, - "tool_call": true - }, { "id": "alibaba/qwen3-vl-plus", "name": "Qwen3 VL Plus (Alibaba Cloud)", @@ -22518,33 +22460,6 @@ "image": true, "video": true }, - { - "id": "alibaba/qwen3-max", - "name": "Qwen3 Max (Alibaba Cloud)", - "cost": { - "input": 1.2, - "output": 6, - "cache_read": 0.24, - "cache_write": 1.5 - }, - "context": 256000, - "output_limit": 32800, - "reasoning": true, - "tool_call": true - }, - { - "id": "alibaba/qwen3-vl-flash", - "name": "Qwen3 VL Flash (Alibaba Cloud)", - "cost": { - "input": 0.05, - "output": 0.4, - "cache_read": 0.01 - }, - "context": 262144, - "output_limit": 32768, - "tool_call": true, - "image": true - }, { "id": "alibaba/qwen3.5-122b-a10b", "name": "Qwen3.5 122B A10B (Alibaba Cloud)", @@ -22616,19 +22531,6 @@ "output_limit": 65536, "tool_call": true }, - { - "id": "alibaba/qwen3-coder-plus", - "name": "Qwen3 Coder Plus (Alibaba Cloud)", - "cost": { - "input": 1, - "output": 5, - "cache_read": 0.2, - "cache_write": 1.25 - }, - "context": 1000000, - "output_limit": 66000, - "tool_call": true - }, { "id": "alibaba/qwen3.8-flash", "name": "Qwen3.8 Flash (Alibaba Cloud)", @@ -22673,19 +22575,6 @@ "image": true, "video": true }, - { - "id": "alibaba/qwen3.6-max-preview", - "name": "Qwen3.6 Max Preview (Alibaba Cloud)", - "cost": { - "input": 1.3, - "output": 7.8, - "cache_read": 0.13 - }, - "context": 262144, - "output_limit": 65536, - "reasoning": true, - "tool_call": true - }, { "id": "alibaba/glm-5.2", "name": "GLM-5.2 (Alibaba Cloud)", @@ -22699,18 +22588,6 @@ "reasoning": true, "tool_call": true }, - { - "id": "alibaba/qwen-omni-turbo", - "name": "Qwen Omni Turbo (Alibaba Cloud)", - "cost": { - "input": 0.2, - "output": 0.8 - }, - "context": 32768, - "output_limit": 8192, - "image": true, - "video": true - }, { "id": "alibaba/deepseek-v4-pro", "name": "DeepSeek V4 Pro (Alibaba Cloud)", @@ -22943,6 +22820,93 @@ "reasoning": true, "tool_call": true }, + { + "id": "reka-ai/reka-edge-2603", + "name": "Reka Edge 2603 (reka-ai)", + "cost": { + "input": 0.1, + "output": 0.1 + }, + "context": 16384, + "output_limit": 16384, + "tool_call": true, + "structured_output": true, + "image": true + }, + { + "id": "reka-ai/qwen3.8-27b", + "name": "Qwen3.8 27B (reka-ai)", + "cost": { + "input": 0.2, + "output": 2.5, + "cache_read": 0.05 + }, + "context": 262144, + "output_limit": 262144, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true, + "video": true + }, + { + "id": "reka-ai/glm-5.3-flash", + "name": "GLM-5.3 Flash (reka-ai)", + "cost": { + "input": 0.15, + "output": 0.5, + "cache_read": 0.015 + }, + "context": 262144, + "output_limit": 262144, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true, + "video": true + }, + { + "id": "reka-ai/deepseek-v4-pro", + "name": "DeepSeek V4 Pro (reka-ai)", + "cost": { + "input": 1.2, + "output": 3.3, + "cache_read": 0.13 + }, + "context": 1048576, + "output_limit": 393216, + "reasoning": true, + "tool_call": true, + "structured_output": true + }, + { + "id": "reka-ai/glm-5.3", + "name": "GLM-5.3 (reka-ai)", + "cost": { + "input": 1.17, + "output": 3.96, + "cache_read": 0.234 + }, + "context": 1048576, + "output_limit": 262144, + "reasoning": true, + "tool_call": true, + "structured_output": true + }, + { + "id": "reka-ai/deepseek-v4-flash", + "name": "DeepSeek V4 Flash (reka-ai)", + "cost": { + "input": 0.11, + "output": 0.66, + "cache_read": 0.007 + }, + "context": 262144, + "output_limit": 131072, + "reasoning": true, + "tool_call": true, + "structured_output": true + }, { "id": "bytedance/seed-1-6-flash-250715", "name": "Seed 1.6 Flash (250715) (ByteDance)", @@ -24233,7 +24197,8 @@ "cost": { "input": 1, "output": 5, - "cache_read": 0.1 + "cache_read": 0.1, + "cache_write": 1.25 }, "context": 200000, "output_limit": 64000, @@ -24248,7 +24213,8 @@ "cost": { "input": 3, "output": 15, - "cache_read": 0.3 + "cache_read": 0.3, + "cache_write": 3.75 }, "context": 200000, "output_limit": 64000, @@ -24263,7 +24229,8 @@ "cost": { "input": 5, "output": 25, - "cache_read": 0.5 + "cache_read": 0.5, + "cache_write": 6.25 }, "context": 200000, "output_limit": 32000, @@ -24294,7 +24261,8 @@ "cost": { "input": 5, "output": 25, - "cache_read": 0.5 + "cache_read": 0.5, + "cache_write": 6.25 }, "context": 1000000, "output_limit": 128000, @@ -24309,7 +24277,8 @@ "cost": { "input": 3, "output": 15, - "cache_read": 0.3 + "cache_read": 0.3, + "cache_write": 3.75 }, "context": 1000000, "output_limit": 64000, @@ -24324,7 +24293,8 @@ "cost": { "input": 5, "output": 25, - "cache_read": 0.5 + "cache_read": 0.5, + "cache_write": 6.25 }, "context": 1000000, "output_limit": 128000, @@ -25676,8 +25646,8 @@ "id": "~moonshotai/kimi-latest", "name": "MoonshotAI: Kimi Latest", "cost": { - "input": 0.49, - "output": 13, + "input": 0.33, + "output": 14.89, "cache_read": 0.3 }, "context": 1048576, @@ -26260,7 +26230,7 @@ }, { "id": "deepseek/deepseek-r1-0528", - "name": "DeepSeek: R1 0528", + "name": "DeepSeek R1 0528", "cost": { "input": 0.7, "output": 2.5, @@ -26277,8 +26247,8 @@ "name": "DeepSeek V3.2", "cost": { "input": 0.259, - "output": 0.42, - "cache_read": 0.135 + "output": 0.8, + "cache_read": 0.14 }, "context": 163840, "output_limit": 147456, @@ -26290,9 +26260,9 @@ "id": "deepseek/deepseek-v4-flash", "name": "DeepSeek V4 Flash", "cost": { - "input": 0.14, - "output": 0.28, - "cache_read": 0.028 + "input": 0.0182, + "output": 1.28, + "cache_read": 0.0182 }, "context": 1048576, "output_limit": 943718, @@ -26487,7 +26457,7 @@ }, { "id": "meta-llama/llama-3.2-1b-instruct", - "name": "Meta: Llama 3.2 1B Instruct", + "name": "Llama 3.2 1B Instruct", "cost": { "input": 0.027, "output": 0.201 @@ -26657,12 +26627,12 @@ "id": "z-ai/glm-4.6", "name": "GLM-4.6", "cost": { - "input": 0.43, - "output": 1.75, - "cache_read": 0.08 + "input": 0.5, + "output": 2, + "cache_read": 0.1 }, - "context": 198000, - "output_limit": 16384, + "context": 202752, + "output_limit": 131072, "reasoning": true, "tool_call": true, "structured_output": true @@ -27121,12 +27091,12 @@ "id": "~z-ai/glm-flash-latest", "name": "Z.ai: GLM Flash Latest", "cost": { - "input": 0.032, - "output": 1.428579, - "cache_read": 0.02 + "input": 0.04, + "output": 0.5, + "cache_read": 0.0125 }, "context": 1048576, - "output_limit": 943718, + "output_limit": 131072, "reasoning": true, "tool_call": true, "structured_output": true, @@ -27137,12 +27107,12 @@ "id": "~z-ai/glm-latest", "name": "Z.ai: GLM Latest", "cost": { - "input": 0.0312, - "output": 4.4, - "cache_read": 0.029 + "input": 0.039, + "output": 4.8, + "cache_read": 0.038 }, "context": 1048576, - "output_limit": 131072, + "output_limit": 943718, "reasoning": true, "tool_call": true, "structured_output": true @@ -27498,9 +27468,9 @@ "id": "~deepseek/deepseek-flash-latest", "name": "DeepSeek: DeepSeek Flash Latest", "cost": { - "input": 0.016, - "output": 1.2, - "cache_read": 0.01 + "input": 0.0001, + "output": 0.6, + "cache_read": 0.005 }, "context": 1048576, "output_limit": 943718, @@ -27513,12 +27483,12 @@ "id": "~deepseek/deepseek-pro-latest", "name": "DeepSeek: DeepSeek Pro Latest", "cost": { - "input": 0.198, - "output": 8, - "cache_read": 0.2 + "input": 0.3, + "output": 5, + "cache_read": 0.219 }, "context": 1048576, - "output_limit": 393216, + "output_limit": 943718, "reasoning": true, "tool_call": true, "structured_output": true @@ -27527,9 +27497,9 @@ "id": "~deepseek/deepseek-v4-flash-latest", "name": "DeepSeek: DeepSeek V4 Flash Latest", "cost": { - "input": 0.00368, - "output": 0.134075, - "cache_read": 0.00368 + "input": 0.0099, + "output": 1.28, + "cache_read": 0.0099 }, "context": 1048576, "output_limit": 943718, @@ -28409,7 +28379,7 @@ }, { "id": "inclusionai/ling-3.1-flash", - "name": "inclusionAI: Ling 3.1 Flash (new)", + "name": "inclusionAI: Ling 3.1 Flash", "cost": { "input": 0, "output": 0 @@ -28459,8 +28429,7 @@ "context": 262144, "output_limit": 32768, "reasoning": true, - "tool_call": true, - "structured_output": true + "tool_call": true }, { "id": "moonshotai/kimi-k3", @@ -28485,7 +28454,7 @@ "cost": { "input": 0.465, "output": 2.45, - "cache_read": 0.0975 + "cache_read": 0.0875 }, "context": 262144, "output_limit": 235929, @@ -28499,10 +28468,11 @@ "name": "Kimi K2 Thinking", "cost": { "input": 0.6, - "output": 2.5 + "output": 2.5, + "cache_read": 0.15 }, "context": 262144, - "output_limit": 235929, + "output_limit": 98304, "reasoning": true, "tool_call": true, "structured_output": true @@ -28523,7 +28493,7 @@ }, { "id": "moonshotai/kimi-k2-0905", - "name": "MoonshotAI: Kimi K2 0905", + "name": "Kimi K2 Instruct 0905", "cost": { "input": 0.6, "output": 2.5 @@ -28692,7 +28662,7 @@ "cache_read": 0.0125 }, "context": 262144, - "output_limit": 131072, + "output_limit": 235929, "reasoning": true, "tool_call": true, "structured_output": true @@ -29264,8 +29234,8 @@ "id": "qwen/qwen3-235b-a22b-2507", "name": "Qwen: Qwen3 235B A22B Instruct 2507", "cost": { - "input": 0.1495, - "output": 0.598 + "input": 0.09, + "output": 0.55 }, "context": 262144, "output_limit": 16384, @@ -29276,8 +29246,9 @@ "id": "qwen/qwen3-vl-235b-a22b-instruct", "name": "Qwen3 VL 235B A22B Instruct", "cost": { - "input": 0.26, - "output": 1.04 + "input": 0.21, + "output": 1.9, + "cache_read": 0.1 }, "context": 131072, "output_limit": 32768, @@ -29317,20 +29288,6 @@ "image": true, "video": true }, - { - "id": "qwen/qwen3-vl-235b-a22b-thinking", - "name": "Qwen3 VL 235B A22B Thinking", - "cost": { - "input": 0.4, - "output": 4 - }, - "context": 131072, - "output_limit": 32768, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "image": true - }, { "id": "qwen/qwen3.8-2.4t-a95b", "name": "Qwen3.8 2.4T A95B", @@ -29368,8 +29325,8 @@ "input": 0.15, "output": 1.2 }, - "context": 131072, - "output_limit": 32768, + "context": 262144, + "output_limit": 235929, "reasoning": true, "tool_call": true, "structured_output": true @@ -29378,8 +29335,9 @@ "id": "qwen/qwen3-coder-next", "name": "Qwen3 Coder Next", "cost": { - "input": 0.3, - "output": 1.5 + "input": 0.12, + "output": 0.8, + "cache_read": 0.07 }, "context": 262144, "output_limit": 235929, @@ -29390,8 +29348,9 @@ "id": "qwen/qwen3-coder", "name": "Qwen: Qwen3 Coder 480B A35B", "cost": { - "input": 0.975, - "output": 4.875 + "input": 0.3, + "output": 1, + "cache_read": 0.1 }, "context": 262144, "output_limit": 65536, @@ -29442,26 +29401,12 @@ "image": true, "video": true }, - { - "id": "qwen/qwen3-max", - "name": "Qwen3 Max", - "cost": { - "input": 0.78, - "output": 3.9, - "cache_read": 0.156, - "cache_write": 0.975 - }, - "context": 262144, - "output_limit": 65536, - "tool_call": true, - "structured_output": true - }, { "id": "qwen/qwen3-coder-30b-a3b-instruct", "name": "Qwen3-Coder 30B-A3B Instruct", "cost": { - "input": 0.2925, - "output": 1.4625 + "input": 0.07, + "output": 0.28 }, "context": 262144, "output_limit": 235929, @@ -29486,10 +29431,10 @@ }, { "id": "qwen/qwen3-vl-30b-a3b-instruct", - "name": "Qwen: Qwen3 VL 30B A3B Instruct", + "name": "Qwen3 VL 30B A3B Instruct", "cost": { - "input": 0.13, - "output": 0.52 + "input": 0.15, + "output": 0.6 }, "context": 262144, "output_limit": 16384, @@ -29499,25 +29444,13 @@ }, { "id": "qwen/qwen3-235b-a22b-thinking-2507", - "name": "Qwen: Qwen3 235B A22B Thinking 2507 (retires Oct 9)", + "name": "Qwen: Qwen3 235B A22B Thinking 2507", "cost": { - "input": 0.23, - "output": 2.3 + "input": 0.45, + "output": 3.5 }, - "context": 131072, - "output_limit": 117964, - "reasoning": true, - "tool_call": true - }, - { - "id": "qwen/qwen3-235b-a22b", - "name": "Qwen3 235B-A22B", - "cost": { - "input": 0.455, - "output": 1.82 - }, - "context": 131072, - "output_limit": 8192, + "context": 128000, + "output_limit": 16384, "reasoning": true, "tool_call": true }, @@ -29536,18 +29469,6 @@ "image": true, "video": true }, - { - "id": "qwen/qwen-plus-2025-07-28", - "name": "Qwen: Qwen Plus 0728 (retires Oct 9)", - "cost": { - "input": 0.26, - "output": 0.78 - }, - "context": 1000000, - "output_limit": 32768, - "tool_call": true, - "structured_output": true - }, { "id": "qwen/qwen3.6-35b-a3b", "name": "Qwen3.6 35B-A3B", @@ -29568,8 +29489,9 @@ "id": "qwen/qwen3-next-80b-a3b-instruct", "name": "Qwen3-Next 80B-A3B Instruct", "cost": { - "input": 0.0975, - "output": 0.78 + "input": 0.1, + "output": 1.1, + "cache_read": 0.07 }, "context": 262144, "output_limit": 235929, @@ -29578,13 +29500,13 @@ }, { "id": "qwen/qwen3-vl-30b-a3b-thinking", - "name": "Qwen: Qwen3 VL 30B A3B Thinking (retires Oct 9)", + "name": "Qwen: Qwen3 VL 30B A3B Thinking", "cost": { - "input": 0.2, - "output": 2.4 + "input": 0.29, + "output": 1 }, - "context": 131072, - "output_limit": 32768, + "context": 262144, + "output_limit": 235929, "reasoning": true, "tool_call": true, "structured_output": true, @@ -29644,33 +29566,6 @@ "image": true, "video": true }, - { - "id": "qwen/qwen3-max-thinking", - "name": "Qwen: Qwen3 Max Thinking (retires Oct 9)", - "cost": { - "input": 0.78, - "output": 3.9 - }, - "context": 262144, - "output_limit": 65536, - "reasoning": true, - "tool_call": true, - "structured_output": true - }, - { - "id": "qwen/qwen3-coder-plus", - "name": "Qwen3 Coder Plus", - "cost": { - "input": 0.65, - "output": 3.25, - "cache_read": 0.13, - "cache_write": 0.8125 - }, - "context": 1000000, - "output_limit": 65536, - "tool_call": true, - "structured_output": true - }, { "id": "qwen/qwen3.5-9b", "name": "Qwen3.5 9B", @@ -29750,26 +29645,12 @@ "image": true, "video": true }, - { - "id": "qwen/qwen3.6-max-preview", - "name": "Qwen3.6 Max Preview", - "cost": { - "input": 1.027, - "output": 6.162, - "cache_write": 1.28375 - }, - "context": 262144, - "output_limit": 65536, - "reasoning": true, - "tool_call": true, - "structured_output": true - }, { "id": "qwen/qwen3-30b-a3b", "name": "Qwen3 30B A3B", "cost": { - "input": 0.13, - "output": 0.52 + "input": 0.12, + "output": 0.5 }, "context": 40960, "output_limit": 16384, @@ -29792,40 +29673,16 @@ "image": true, "video": true }, - { - "id": "qwen/qwen3-8b", - "name": "Qwen: Qwen3 8B (retires Oct 9)", - "cost": { - "input": 0.117, - "output": 0.455 - }, - "context": 131072, - "output_limit": 8192, - "reasoning": true, - "tool_call": true - }, - { - "id": "qwen/qwen3-vl-32b-instruct", - "name": "Qwen: Qwen3 VL 32B Instruct (retires Oct 9)", - "cost": { - "input": 0.104, - "output": 0.416 - }, - "context": 131072, - "output_limit": 32768, - "tool_call": true, - "structured_output": true, - "image": true - }, { "id": "qwen/qwen3-vl-8b-instruct", - "name": "Qwen: Qwen3 VL 8B Instruct (retires Oct 9)", + "name": "Qwen: Qwen3 VL 8B Instruct", "cost": { - "input": 0.117, - "output": 0.455 + "input": 0.25, + "output": 0.75, + "cache_read": 0.12 }, - "context": 131072, - "output_limit": 32768, + "context": 262144, + "output_limit": 235929, "tool_call": true, "structured_output": true, "image": true @@ -29834,8 +29691,8 @@ "id": "qwen/qwen3-30b-a3b-instruct-2507", "name": "Qwen: Qwen3 30B A3B Instruct 2507", "cost": { - "input": 0.13, - "output": 0.52 + "input": 0.1, + "output": 0.3 }, "context": 262144, "output_limit": 235929, @@ -29894,18 +29751,6 @@ "tool_call": true, "structured_output": true }, - { - "id": "qwen/qwen3-30b-a3b-thinking-2507", - "name": "Qwen: Qwen3 30B A3B Thinking 2507 (retires Oct 9)", - "cost": { - "input": 0.2, - "output": 2.4 - }, - "context": 81920, - "output_limit": 32768, - "reasoning": true, - "tool_call": true - }, { "id": "qwen/qwen3.6-27b", "name": "Qwen3.6 27B", @@ -29914,7 +29759,7 @@ "output": 2.7 }, "context": 262144, - "output_limit": 65536, + "output_limit": 81920, "reasoning": true, "tool_call": true, "structured_output": true, @@ -29941,8 +29786,8 @@ "id": "qwen/qwen3-14b", "name": "Qwen: Qwen3 14B", "cost": { - "input": 0.2275, - "output": 0.91 + "input": 0.12, + "output": 0.24 }, "context": 40960, "output_limit": 16384, @@ -29950,20 +29795,6 @@ "tool_call": true, "structured_output": true }, - { - "id": "qwen/qwen3-vl-8b-thinking", - "name": "Qwen: Qwen3 VL 8B Thinking (retires Oct 9)", - "cost": { - "input": 0.18, - "output": 2.1 - }, - "context": 131072, - "output_limit": 32768, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "image": true - }, { "id": "qwen/qwen3.7-plus", "name": "Qwen3.7 Plus", @@ -30881,7 +30712,7 @@ "name": "GPT OSS 120B", "cost": { "input": 0.03, - "output": 0.17, + "output": 0.15, "cache_read": 0.03 }, "context": 131072, @@ -31668,6 +31499,22 @@ "tool_call": true, "structured_output": true }, + { + "id": "openai-gpt-61-sol-ultrafast", + "name": "GPT-6.1 Sol Ultrafast", + "cost": { + "input": 15, + "output": 75, + "cache_read": 0.75, + "cache_write": 18.75 + }, + "context": 1050000, + "output_limit": 128000, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true + }, { "id": "claude-opus-5", "name": "Claude Opus 5", @@ -33183,6 +33030,124 @@ } ] }, + "lowrouter": { + "id": "lowrouter", + "name": "LowRouter", + "models": [ + { + "id": "auto/mistralai/ministral-8b-2512", + "name": "Ministral 3 8B", + "cost": { + "input": 0.1569, + "output": 0.1569, + "cache_read": 0.0157 + }, + "context": 262144, + "output_limit": 262144, + "tool_call": true, + "structured_output": true, + "image": true + }, + { + "id": "auto/mistralai/mistral-large-4", + "name": "Mistral Large 4", + "cost": { + "input": 0.7112, + "output": 2.1859, + "cache_read": 0.0732 + }, + "context": 524288, + "output_limit": 262144, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true + }, + { + "id": "auto/mistralai/mistral-medium-3.5", + "name": "Mistral Medium 3.5", + "cost": { + "input": 1.5688, + "output": 7.8442, + "cache_read": 0.1569 + }, + "context": 262144, + "output_limit": 262144, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true + }, + { + "id": "auto/mistralai/mistral-small-2603", + "name": "Mistral Small 4", + "cost": { + "input": 0.1569, + "output": 0.6275, + "cache_read": 0.0157 + }, + "context": 256000, + "output_limit": 256000, + "reasoning": true, + "tool_call": true, + "image": true + }, + { + "id": "auto/mistralai/mistral-large-2512", + "name": "Mistral Large 3", + "cost": { + "input": 0.5229, + "output": 1.5688, + "cache_read": 0.0523 + }, + "context": 262144, + "output_limit": 262144, + "tool_call": true, + "image": true + }, + { + "id": "auto/mistralai/ministral-14b-2512", + "name": "Ministral 3 14B", + "cost": { + "input": 0.2092, + "output": 0.2092, + "cache_read": 0.0209 + }, + "context": 262144, + "output_limit": 262144, + "tool_call": true, + "structured_output": true, + "image": true + }, + { + "id": "auto/mistralai/ministral-3b-2512", + "name": "Ministral 3 3B", + "cost": { + "input": 0.1046, + "output": 0.1046, + "cache_read": 0.0105 + }, + "context": 262144, + "output_limit": 262144, + "tool_call": true, + "structured_output": true, + "image": true + }, + { + "id": "auto/mistralai/codestral-2508", + "name": "Codestral 25.08", + "cost": { + "input": 0.3138, + "output": 0.9413, + "cache_read": 0.0314 + }, + "context": 128000, + "output_limit": 8192, + "tool_call": true, + "structured_output": true + } + ] + }, "inference": { "id": "inference", "name": "Inference", @@ -35723,76 +35688,54 @@ }, "novita-ai": { "id": "novita-ai", - "name": "NovitaAI", + "name": "Novita AI", "models": [ { - "id": "kwaipilot/kat-coder-pro", - "name": "Kat Coder Pro", + "id": "baai/bge-m3", + "name": "BGE M3", + "cost": { + "input": 0.01, + "output": 0 + }, + "context": 8192 + }, + { + "id": "baai/bge-reranker-v2-m3", + "name": "BGE Reranker V2 M3", + "cost": { + "input": 0.01, + "output": 0 + }, + "context": 8000 + }, + { + "id": "deepseek/deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "cost": { + "input": 0.44, + "output": 1.32, + "cache_read": 0.028 + }, + "context": 1048576, + "output_limit": 393216, + "reasoning": true, + "tool_call": true, + "structured_output": true + }, + { + "id": "deepseek/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", "cost": { "input": 0.3, "output": 1.2, - "cache_read": 0.06 + "cache_read": 0.006 }, - "context": 256000, - "output_limit": 128000, - "tool_call": true, - "structured_output": true - }, - { - "id": "deepseek/deepseek-prover-v2-671b", - "name": "Deepseek Prover V2 671B", - "cost": { - "input": 0.7, - "output": 2.5 - }, - "context": 160000, - "output_limit": 160000 - }, - { - "id": "deepseek/deepseek-r1-distill-qwen-14b", - "name": "DeepSeek R1 Distill Qwen 14B", - "cost": { - "input": 0.15, - "output": 0.15 - }, - "context": 32768, - "output_limit": 16384 - }, - { - "id": "deepseek/deepseek-v3-0324", - "name": "DeepSeek V3 0324", - "cost": { - "input": 0.27, - "output": 1.12, - "cache_read": 0.135 - }, - "context": 163840, - "output_limit": 163840, - "tool_call": true, - "structured_output": true - }, - { - "id": "deepseek/deepseek-r1-distill-llama-70b", - "name": "DeepSeek R1 Distill LLama 70B", - "cost": { - "input": 0.8, - "output": 0.8 - }, - "context": 8192, - "output_limit": 8192, + "context": 1048576, + "output_limit": 393216, "reasoning": true, - "structured_output": true - }, - { - "id": "deepseek/deepseek-v3-turbo", - "name": "DeepSeek V3 (Turbo)\t", - "cost": { - "input": 0.4, - "output": 1.3 - }, - "context": 64000, - "output_limit": 16000, - "tool_call": true + "tool_call": true, + "structured_output": true, + "image": true }, { "id": "deepseek/deepseek-r1-0528-qwen3-8b", @@ -35805,23 +35748,9 @@ "output_limit": 32000, "reasoning": true }, - { - "id": "deepseek/deepseek-v3.1-terminus", - "name": "Deepseek V3.1 Terminus", - "cost": { - "input": 0.27, - "output": 1, - "cache_read": 0.135 - }, - "context": 131072, - "output_limit": 32768, - "reasoning": true, - "tool_call": true, - "structured_output": true - }, { "id": "deepseek/deepseek-ocr-2", - "name": "deepseek/deepseek-ocr-2", + "name": "DeepSeek OCR 2", "cost": { "input": 0.03, "output": 0.03 @@ -35830,21 +35759,9 @@ "output_limit": 8192, "image": true }, - { - "id": "deepseek/deepseek-ocr", - "name": "DeepSeek-OCR", - "cost": { - "input": 0.03, - "output": 0.03 - }, - "context": 8192, - "output_limit": 8192, - "structured_output": true, - "image": true - }, { "id": "deepseek/deepseek-r1-turbo", - "name": "DeepSeek R1 (Turbo)\t", + "name": "DeepSeek R1 (Turbo)", "cost": { "input": 0.7, "output": 2.5 @@ -35852,44 +35769,33 @@ "context": 64000, "output_limit": 16000, "reasoning": true, - "tool_call": true + "tool_call": true, + "structured_output": true }, { - "id": "deepseek/deepseek-v3.2-exp", - "name": "Deepseek V3.2 Exp", + "id": "deepseek/deepseek-v4-pro-0813", + "name": "DeepSeek V4 Pro 0813", "cost": { - "input": 0.27, - "output": 0.41 + "input": 1.32, + "output": 3.96, + "cache_read": 0.044 }, - "context": 163840, - "output_limit": 65536, + "context": 1048576, + "output_limit": 393216, "reasoning": true, "tool_call": true, "structured_output": true }, { - "id": "deepseek/deepseek-r1-distill-qwen-32b", - "name": "DeepSeek R1 Distill Qwen 32B", + "id": "deepseek/deepseek_v3", + "name": "DeepSeek-V3", "cost": { - "input": 0.3, - "output": 0.3 + "input": 0.89, + "output": 0.89 }, "context": 64000, - "output_limit": 32000 - }, - { - "id": "deepseek/deepseek-v3.1", - "name": "DeepSeek V3.1", - "cost": { - "input": 0.27, - "output": 1, - "cache_read": 0.135 - }, - "context": 131072, - "output_limit": 32768, - "reasoning": true, - "tool_call": true, - "structured_output": true + "output_limit": 16000, + "tool_call": true }, { "id": "deepseek/deepseek-v4-pro", @@ -35920,107 +35826,95 @@ "structured_output": true }, { - "id": "deepseek/deepseek-v3.2", - "name": "Deepseek V3.2", + "id": "tencent/hy3", + "name": "Hy3", "cost": { - "input": 0.269, - "output": 0.4, - "cache_read": 0.1345 + "input": 0.14, + "output": 0.58, + "cache_read": 0.035 }, - "context": 163840, - "output_limit": 65536, + "context": 262144, + "input_limit": 192000, + "output_limit": 262144, "reasoning": true, "tool_call": true, "structured_output": true }, { - "id": "deepseek/deepseek-v4-flash", - "name": "DeepSeek V4 Flash", + "id": "tencent/hy4-preview", + "name": "Hy4 preview", "cost": { - "input": 0.14, - "output": 0.28, - "cache_read": 0.028 + "input": 0.834, + "output": 2.501, + "cache_read": 0.042 }, - "context": 1048576, - "output_limit": 393216, + "context": 1000000, + "output_limit": 64000, "reasoning": true, "tool_call": true, "structured_output": true }, { "id": "meta-llama/llama-4-maverick-17b-128e-instruct-fp8", - "name": "Llama 4 Maverick Instruct", + "name": "Llama 4 Maverick 17B Instruct", "cost": { "input": 0.27, "output": 0.85 }, "context": 1048576, "output_limit": 8192, + "tool_call": true, + "structured_output": true, "image": true }, - { - "id": "meta-llama/llama-3-70b-instruct", - "name": "Llama3 70B Instruct", - "cost": { - "input": 0.51, - "output": 0.74 - }, - "context": 8192, - "output_limit": 8000, - "structured_output": true - }, { "id": "meta-llama/llama-3.3-70b-instruct", - "name": "Llama 3.3 70B Instruct", + "name": "Llama-3.3-70B-Instruct", "cost": { "input": 0.135, "output": 0.4 }, - "context": 131072, - "output_limit": 120000, - "tool_call": true + "context": 12288, + "output_limit": 12288, + "tool_call": true, + "structured_output": true }, { "id": "meta-llama/llama-3.1-8b-instruct", - "name": "Llama 3.1 8B Instruct", + "name": "Llama-3.1-8B-Instruct", "cost": { "input": 0.02, "output": 0.05 }, "context": 16384, - "output_limit": 16384 + "output_limit": 16384, + "tool_call": true, + "structured_output": true + }, + { + "id": "meta-llama/llama-3.2-1b-instruct", + "name": "Llama 3.2 1B Instruct", + "cost": { + "input": 0.02, + "output": 0.02 + }, + "context": 131000, + "output_limit": 32000, + "tool_call": true, + "structured_output": true }, { "id": "meta-llama/llama-4-scout-17b-16e-instruct", - "name": "Llama 4 Scout Instruct", + "name": "Llama 4 Scout 17B Instruct", "cost": { "input": 0.18, "output": 0.59 }, "context": 131072, "output_limit": 131072, + "tool_call": true, "image": true }, - { - "id": "meta-llama/llama-3.2-3b-instruct", - "name": "Llama 3.2 3B Instruct", - "cost": { - "input": 0.03, - "output": 0.05 - }, - "context": 32768, - "output_limit": 32000 - }, - { - "id": "meta-llama/llama-3-8b-instruct", - "name": "Llama 3 8B Instruct", - "cost": { - "input": 0.04, - "output": 0.04 - }, - "context": 8192, - "output_limit": 8192 - }, { "id": "nousresearch/hermes-2-pro-llama-3-8b", "name": "Hermes 2 Pro Llama 3 8B", @@ -36030,35 +35924,40 @@ }, "context": 8192, "output_limit": 8192, - "structured_output": true - }, - { - "id": "xiaomimimo/mimo-v2-flash", - "name": "XiaomiMiMo/MiMo-V2-Flash", - "cost": { - "input": 0.1, - "output": 0.3, - "cache_read": 0.3 - }, - "context": 262144, - "output_limit": 32000, - "reasoning": true, "tool_call": true, "structured_output": true }, { - "id": "xiaomimimo/mimo-v2-pro", - "name": "MiMo-V2-Pro", + "id": "xiaomimimo/mimo-v2.6-pro", + "name": "MiMo-V2.6-Pro", "cost": { - "input": 2, - "output": 6, - "cache_read": 0.4 + "input": 0.435, + "output": 0.87, + "cache_read": 0.0036 }, "context": 1048576, "output_limit": 131072, "reasoning": true, "tool_call": true, - "structured_output": true + "structured_output": true, + "image": true, + "video": true + }, + { + "id": "xiaomimimo/mimo-v2.5", + "name": "MiMo-V2.5", + "cost": { + "input": 0.168, + "output": 0.336, + "cache_read": 0.0034 + }, + "context": 1048576, + "output_limit": 131072, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true, + "video": true }, { "id": "xiaomimimo/mimo-v2.5-pro", @@ -36075,44 +35974,21 @@ "structured_output": true }, { - "id": "baidu/ernie-4.5-vl-28b-a3b", - "name": "ERNIE 4.5 VL 28B A3B", + "id": "xiaomimimo/mimo-v2.6-flash", + "name": "MiMo-V2.6-Flash", "cost": { "input": 0.14, - "output": 0.56 + "output": 0.28, + "cache_read": 0.0028 }, - "context": 30000, - "output_limit": 8000, - "reasoning": true, - "tool_call": true, - "image": true - }, - { - "id": "baidu/ernie-4.5-vl-28b-a3b-thinking", - "name": "ERNIE-4.5-VL-28B-A3B-Thinking", - "cost": { - "input": 0.39, - "output": 0.39 - }, - "context": 131072, - "output_limit": 65536, + "context": 1048576, + "output_limit": 131072, "reasoning": true, "tool_call": true, "structured_output": true, "image": true, "video": true }, - { - "id": "baidu/ernie-4.5-21B-a3b-thinking", - "name": "ERNIE-4.5-21B-A3B-Thinking", - "cost": { - "input": 0.07, - "output": 0.28 - }, - "context": 131072, - "output_limit": 65536, - "reasoning": true - }, { "id": "baidu/ernie-4.5-21B-a3b", "name": "ERNIE 4.5 21B A3B", @@ -36125,31 +36001,21 @@ "tool_call": true }, { - "id": "baidu/ernie-4.5-vl-424b-a47b", - "name": "ERNIE 4.5 VL 424B A47B", - "cost": { - "input": 0.42, - "output": 1.25 - }, - "context": 123000, - "output_limit": 16000, - "reasoning": true, - "image": true - }, - { - "id": "baidu/ernie-4.5-300b-a47b-paddle", - "name": "ERNIE 4.5 300B A47B", + "id": "baidu/cobuddy", + "name": "CoBuddy", "cost": { "input": 0.28, - "output": 1.1 + "output": 1.13, + "cache_read": 0.07 }, - "context": 123000, - "output_limit": 12000, - "structured_output": true + "context": 131072, + "output_limit": 65536, + "reasoning": true, + "tool_call": true }, { "id": "google/gemma-4-31b-it", - "name": "Gemma 4 31B", + "name": "Gemma 4 31B IT", "cost": { "input": 0.14, "output": 0.4 @@ -36163,18 +36029,19 @@ }, { "id": "google/gemma-3-27b-it", - "name": "Gemma 3 27B", + "name": "Gemma 3 27B IT", "cost": { "input": 0.119, "output": 0.2 }, "context": 98304, "output_limit": 16384, + "tool_call": true, "image": true }, { "id": "google/gemma-4-26b-a4b-it", - "name": "Gemma 4 26B A4B", + "name": "Gemma 4 26B A4B IT", "cost": { "input": 0.13, "output": 0.4 @@ -36188,18 +36055,19 @@ }, { "id": "google/gemma-3-12b-it", - "name": "Gemma 3 12B", + "name": "Gemma 3 12B IT", "cost": { "input": 0.05, "output": 0.1 }, "context": 131072, "output_limit": 8192, + "tool_call": true, "image": true }, { "id": "minimaxai/minimax-m1-80k", - "name": "MiniMax M1", + "name": "MiniMax M1 80K", "cost": { "input": 0.55, "output": 2.2 @@ -36207,58 +36075,74 @@ "context": 1000000, "output_limit": 40000, "reasoning": true, + "tool_call": true, + "structured_output": true + }, + { + "id": "inclusionai/ling-3.0-flash", + "name": "Ling 3.0 Flash", + "cost": { + "input": 0.06, + "output": 0.18, + "cache_read": 0.012 + }, + "context": 262144, + "output_limit": 32768, + "reasoning": true, "tool_call": true }, { - "id": "mistralai/mistral-nemo", - "name": "Mistral Nemo", + "id": "inclusionai/ling-3.1-flash", + "name": "Ling 3.1 Flash", "cost": { - "input": 0.04, - "output": 0.17 - }, - "context": 60288, - "output_limit": 16000, - "structured_output": true - }, - { - "id": "inclusionai/ring-2.6-1t", - "name": "Ring-2.6-1T", - "cost": { - "input": 0.3, - "output": 2.5, - "cache_read": 0.06 + "input": 0, + "output": 0 }, "context": 262144, - "output_limit": 65536, + "output_limit": 32768, + "reasoning": true, + "tool_call": true + }, + { + "id": "inclusionai/ling-3.0-flash-sante", + "name": "Ling 3.0 Flash Sante", + "cost": { + "input": 0.075, + "output": 0.22, + "cache_read": 0.015 + }, + "context": 262144, + "output_limit": 32768, + "reasoning": true, + "tool_call": true + }, + { + "id": "inclusionai/ling-3.0-flash-vl", + "name": "Ling 3.0 Flash VL", + "cost": { + "input": 0.075, + "output": 0.22, + "cache_read": 0.015 + }, + "context": 262144, + "output_limit": 32768, "reasoning": true, "tool_call": true, - "structured_output": true + "image": true, + "video": true }, { - "id": "inclusionai/ling-2.6-1t", - "name": "Ling-2.6-1T", + "id": "inclusionai/ling-3.0-flash-fin", + "name": "Ling 3.0 Flash Fin", "cost": { - "input": 0.3, - "output": 2.5, - "cache_read": 0.06 + "input": 0.075, + "output": 0.22, + "cache_read": 0.015 }, "context": 262144, "output_limit": 32768, - "tool_call": true, - "structured_output": true - }, - { - "id": "inclusionai/ling-2.6-flash", - "name": "Ling-2.6-flash", - "cost": { - "input": 0.1, - "output": 0.3, - "cache_read": 0.02 - }, - "context": 262144, - "output_limit": 32768, - "tool_call": true, - "structured_output": true + "reasoning": true, + "tool_call": true }, { "id": "moonshotai/kimi-k3", @@ -36330,12 +36214,12 @@ "output": 2.3 }, "context": 131072, - "output_limit": 32768, + "output_limit": 98304, "tool_call": true }, { "id": "moonshotai/kimi-k2-0905", - "name": "Kimi K2 0905", + "name": "Kimi K2 Instruct 0905", "cost": { "input": 0.6, "output": 2.5 @@ -36363,7 +36247,7 @@ }, { "id": "zai-org/glm-4.6v", - "name": "GLM 4.6V", + "name": "GLM-4.6V", "cost": { "input": 0.3, "output": 0.9, @@ -36378,21 +36262,24 @@ "video": true }, { - "id": "zai-org/glm-4.5", - "name": "GLM-4.5", + "id": "zai-org/glm-5.3-flash", + "name": "GLM-5.3-Flash", "cost": { - "input": 0.6, - "output": 2.2, - "cache_read": 0.11 + "input": 0.15, + "output": 0.5, + "cache_read": 0.03 }, - "context": 131072, - "output_limit": 98304, + "context": 1048576, + "output_limit": 131072, "reasoning": true, - "tool_call": true + "tool_call": true, + "structured_output": true, + "image": true, + "video": true }, { "id": "zai-org/glm-4.6", - "name": "GLM 4.6", + "name": "GLM-4.6", "cost": { "input": 0.55, "output": 2.2, @@ -36420,7 +36307,7 @@ }, { "id": "zai-org/glm-4.5v", - "name": "GLM 4.5V", + "name": "GLM-4.5V", "cost": { "input": 0.6, "output": 1.8, @@ -36492,7 +36379,7 @@ }, { "id": "zai-org/autoglm-phone-9b-multilingual", - "name": "AutoGLM-Phone-9B-Multilingual", + "name": "AutoGLM Phone 9B Multilingual", "cost": { "input": 0.035, "output": 0.138 @@ -36503,7 +36390,7 @@ }, { "id": "zai-org/glm-4.5-air", - "name": "GLM 4.5 Air", + "name": "GLM-4.5-Air", "cost": { "input": 0.13, "output": 0.85, @@ -36514,9 +36401,49 @@ "reasoning": true, "tool_call": true }, + { + "id": "zai-org/glm-5.3", + "name": "GLM-5.3", + "cost": { + "input": 1.4, + "output": 4.4, + "cache_read": 0.26 + }, + "context": 1048576, + "output_limit": 131072, + "reasoning": true, + "tool_call": true, + "structured_output": true + }, + { + "id": "apodex/apodex-1.1-mini", + "name": "Apodex 1.1 Mini", + "cost": { + "input": 0, + "output": 0 + }, + "context": 262144, + "output_limit": 262144, + "reasoning": true, + "tool_call": true, + "structured_output": true + }, + { + "id": "nvidia/nemotron-3-nano-30b-a3b", + "name": "Nemotron 3 Nano 30B A3B", + "cost": { + "input": 0.05, + "output": 0.2 + }, + "context": 262144, + "output_limit": 32768, + "reasoning": true, + "tool_call": true, + "structured_output": true + }, { "id": "gryphe/mythomax-l2-13b", - "name": "Mythomax L2 13B", + "name": "MythoMax L2 13B", "cost": { "input": 0.09, "output": 0.09 @@ -36526,21 +36453,21 @@ }, { "id": "minimax/minimax-m2.5", - "name": "MiniMax M2.5", + "name": "MiniMax-M2.5", "cost": { "input": 0.3, "output": 1.2, "cache_read": 0.03 }, "context": 204800, - "output_limit": 131072, + "output_limit": 131100, "reasoning": true, "tool_call": true, "structured_output": true }, { "id": "minimax/minimax-m2.7", - "name": "MiniMax M2.7", + "name": "MiniMax-M2.7", "cost": { "input": 0.3, "output": 1.2, @@ -36552,6 +36479,22 @@ "tool_call": true, "structured_output": true }, + { + "id": "minimax/minimax-m3", + "name": "MiniMax-M3", + "cost": { + "input": 0.3, + "output": 1.2, + "cache_read": 0.06 + }, + "context": 1000000, + "output_limit": 131072, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true, + "video": true + }, { "id": "minimax/minimax-m2.7-highspeed", "name": "MiniMax-M2.7-highspeed", @@ -36567,49 +36510,9 @@ "tool_call": true, "structured_output": true }, - { - "id": "minimax/minimax-m2.5-highspeed", - "name": "MiniMax M2.5 Highspeed", - "cost": { - "input": 0.6, - "output": 2.4, - "cache_read": 0.03 - }, - "context": 204800, - "output_limit": 131072, - "reasoning": true, - "tool_call": true, - "structured_output": true - }, - { - "id": "minimax/minimax-m2.1", - "name": "Minimax M2.1", - "cost": { - "input": 0.3, - "output": 1.2, - "cache_read": 0.03 - }, - "context": 204800, - "output_limit": 131072, - "tool_call": true, - "structured_output": true - }, - { - "id": "minimax/minimax-m2", - "name": "MiniMax-M2", - "cost": { - "input": 0.3, - "output": 1.2, - "cache_read": 0.03 - }, - "context": 204800, - "output_limit": 131072, - "reasoning": true, - "tool_call": true - }, { "id": "paddlepaddle/paddleocr-vl", - "name": "PaddleOCR-VL", + "name": "PaddleOCR VL", "cost": { "input": 0.02, "output": 0.02 @@ -36619,27 +36522,55 @@ "image": true }, { - "id": "qwen/qwen3-vl-235b-a22b-instruct", - "name": "Qwen3 VL 235B A22B Instruct", + "id": "stepfun/step-3.7-flash", + "name": "Step 3.7 Flash", "cost": { - "input": 0.3, - "output": 1.5 + "input": 0.2, + "output": 1.15, + "cache_read": 0.04 }, - "context": 131072, - "output_limit": 32768, + "context": 262144, + "input_limit": 256000, + "output_limit": 256000, + "reasoning": true, "tool_call": true, "structured_output": true, "image": true, "video": true }, + { + "id": "mindai/macaron-v1-tall", + "name": "Macaron V1 Tall", + "cost": { + "input": 0.2475, + "output": 1.43, + "cache_read": 0.044 + }, + "context": 262144, + "output_limit": 32768, + "reasoning": true, + "tool_call": true + }, + { + "id": "mindai/macaron-v1-venti", + "name": "Macaron V1 Venti", + "cost": { + "input": 0.825, + "output": 2.475, + "cache_read": 0.165 + }, + "context": 1048576, + "output_limit": 131072, + "reasoning": true, + "tool_call": true + }, { "id": "qwen/qwen3.7-max", - "name": "Qwen3.7-Max", + "name": "Qwen3.7 Max", "cost": { "input": 1.25, "output": 3.75, - "cache_read": 0.25, - "cache_write": 1.5625 + "cache_read": 0.25 }, "context": 1000000, "output_limit": 65536, @@ -36648,21 +36579,38 @@ "structured_output": true }, { - "id": "qwen/qwen3-vl-235b-a22b-thinking", - "name": "Qwen3 VL 235B A22B Thinking", + "id": "qwen/qwen3.8-27b", + "name": "Qwen3.8 27B", "cost": { - "input": 0.98, - "output": 3.95 + "input": 0.42, + "output": 3, + "cache_read": 0.085 }, - "context": 131072, - "output_limit": 32768, + "context": 1000000, + "output_limit": 131072, "reasoning": true, + "tool_call": true, + "structured_output": true, "image": true, "video": true }, + { + "id": "qwen/qwen3.8-2.4t-a95b", + "name": "Qwen3.8 2.4T A95B", + "cost": { + "input": 2, + "output": 6, + "cache_read": 0.25 + }, + "context": 1000000, + "output_limit": 131072, + "reasoning": true, + "tool_call": true, + "structured_output": true + }, { "id": "qwen/qwen3.5-27b", - "name": "Qwen3.5-27B", + "name": "Qwen3.5 27B", "cost": { "input": 0.3, "output": 2.4 @@ -36676,52 +36624,17 @@ "video": true }, { - "id": "qwen/qwen3-235b-a22b-instruct-2507", - "name": "Qwen3 235B A22B Instruct 2507", + "id": "qwen/qwen3.8-max", + "name": "Qwen3.8 Max", "cost": { - "input": 0.09, - "output": 0.58 + "input": 2, + "output": 6, + "cache_read": 0.25 }, - "context": 131072, - "output_limit": 16384, - "tool_call": true, - "structured_output": true - }, - { - "id": "qwen/qwen3-next-80b-a3b-thinking", - "name": "Qwen3 Next 80B A3B Thinking", - "cost": { - "input": 0.15, - "output": 1.5 - }, - "context": 131072, - "output_limit": 32768, + "context": 1000000, + "output_limit": 131072, "reasoning": true, "tool_call": true, - "structured_output": true - }, - { - "id": "qwen/qwen3-coder-next", - "name": "Qwen3 Coder Next", - "cost": { - "input": 0.2, - "output": 1.5 - }, - "context": 262144, - "output_limit": 65536, - "tool_call": true, - "structured_output": true - }, - { - "id": "qwen/qwen3-omni-30b-a3b-instruct", - "name": "Qwen3 Omni 30B A3B Instruct", - "cost": { - "input": 0.25, - "output": 0.97 - }, - "context": 65536, - "output_limit": 16384, - "tool_call": true, "structured_output": true, "image": true, "video": true @@ -36742,55 +36655,17 @@ "video": true }, { - "id": "qwen/qwen3-max", - "name": "Qwen3 Max", + "id": "qwen/qwen3-reranker-8b", + "name": "Qwen3 Reranker 8B", "cost": { - "input": 2.11, - "output": 8.45 + "input": 0.05, + "output": 0 }, - "context": 262144, - "output_limit": 65536, - "tool_call": true, - "structured_output": true - }, - { - "id": "qwen/qwen3-235b-a22b-fp8", - "name": "Qwen3 235B A22B", - "cost": { - "input": 0.2, - "output": 0.8 - }, - "context": 40960, - "output_limit": 20000, - "reasoning": true - }, - { - "id": "qwen/qwen3-coder-480b-a35b-instruct", - "name": "Qwen3 Coder 480B A35B Instruct", - "cost": { - "input": 0.38, - "output": 1.55 - }, - "context": 262144, - "output_limit": 65536, - "tool_call": true, - "structured_output": true - }, - { - "id": "qwen/qwen3-coder-30b-a3b-instruct", - "name": "Qwen3 Coder 30b A3B Instruct", - "cost": { - "input": 0.07, - "output": 0.27 - }, - "context": 160000, - "output_limit": 32768, - "tool_call": true, - "structured_output": true + "context": 32768 }, { "id": "qwen/qwen3-vl-30b-a3b-instruct", - "name": "qwen/qwen3-vl-30b-a3b-instruct", + "name": "Qwen3 VL 30B A3B Instruct", "cost": { "input": 0.2, "output": 0.7 @@ -36802,33 +36677,9 @@ "image": true, "video": true }, - { - "id": "qwen/qwen3-235b-a22b-thinking-2507", - "name": "Qwen3 235B A22b Thinking 2507", - "cost": { - "input": 0.3, - "output": 3 - }, - "context": 131072, - "output_limit": 32768, - "reasoning": true, - "tool_call": true - }, - { - "id": "qwen/qwen2.5-7b-instruct", - "name": "Qwen2.5 7B Instruct", - "cost": { - "input": 0.07, - "output": 0.07 - }, - "context": 32000, - "output_limit": 32000, - "tool_call": true, - "structured_output": true - }, { "id": "qwen/qwen3.5-122b-a10b", - "name": "Qwen3.5-122B-A10B", + "name": "Qwen3.5 122B-A10B", "cost": { "input": 0.4, "output": 3.2 @@ -36842,37 +36693,15 @@ "video": true }, { - "id": "qwen/qwen3-30b-a3b-fp8", - "name": "Qwen3 30B A3B", + "id": "qwen/qwen3.6-35b-a3b", + "name": "Qwen3.6 35B-A3B", "cost": { - "input": 0.09, - "output": 0.45 + "input": 0.248, + "output": 1.485 }, - "context": 40960, - "output_limit": 20000, - "reasoning": true - }, - { - "id": "qwen/qwen3-next-80b-a3b-instruct", - "name": "Qwen3 Next 80B A3B Instruct", - "cost": { - "input": 0.15, - "output": 1.5 - }, - "context": 131072, - "output_limit": 32768, - "tool_call": true, - "structured_output": true - }, - { - "id": "qwen/qwen3-vl-30b-a3b-thinking", - "name": "qwen/qwen3-vl-30b-a3b-thinking", - "cost": { - "input": 0.2, - "output": 1 - }, - "context": 131072, - "output_limit": 32768, + "context": 262144, + "output_limit": 65536, + "reasoning": true, "tool_call": true, "structured_output": true, "image": true, @@ -36889,30 +36718,33 @@ "output_limit": 8192 }, { - "id": "qwen/qwen3-32b-fp8", - "name": "Qwen3 32B", + "id": "qwen/qwen3.8-flash", + "name": "Qwen3.8 Flash", "cost": { - "input": 0.1, - "output": 0.45 + "input": 0.15, + "output": 0.47, + "cache_read": 0.016 }, - "context": 40960, - "output_limit": 20000, - "reasoning": true + "context": 1000000, + "output_limit": 131072, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true, + "video": true }, { - "id": "qwen/qwen3-8b-fp8", - "name": "Qwen3 8B", + "id": "qwen/qwen3-embedding-8b", + "name": "Qwen3 Embedding 8B", "cost": { - "input": 0.035, - "output": 0.138 + "input": 0.07, + "output": 0 }, - "context": 128000, - "output_limit": 20000, - "reasoning": true + "context": 32768 }, { "id": "qwen/qwen3.5-35b-a3b", - "name": "Qwen3.5-35B-A3B", + "name": "Qwen3.5 35B-A3B", "cost": { "input": 0.25, "output": 2 @@ -36927,13 +36759,13 @@ }, { "id": "qwen/qwen3.5-397b-a17b", - "name": "Qwen3.5-397B-A17B", + "name": "Qwen3.5 397B-A17B", "cost": { "input": 0.6, "output": 3.6 }, "context": 262144, - "output_limit": 64000, + "output_limit": 65536, "reasoning": true, "tool_call": true, "structured_output": true, @@ -36941,80 +36773,34 @@ "video": true }, { - "id": "qwen/qwen3-vl-8b-instruct", - "name": "qwen/qwen3-vl-8b-instruct", + "id": "qwen/qwen3.6-27b", + "name": "Qwen3.6 27B", "cost": { - "input": 0.08, - "output": 0.5 + "input": 0.6, + "output": 3.6 }, - "context": 131072, - "output_limit": 32768, + "context": 262144, + "output_limit": 65536, + "reasoning": true, "tool_call": true, "structured_output": true, "image": true, "video": true }, - { - "id": "qwen/qwen2.5-vl-72b-instruct", - "name": "Qwen2.5 VL 72B Instruct", - "cost": { - "input": 0.8, - "output": 0.8 - }, - "context": 32768, - "output_limit": 32768, - "image": true, - "video": true - }, - { - "id": "qwen/qwen-2.5-72b-instruct", - "name": "Qwen 2.5 72B Instruct", - "cost": { - "input": 0.38, - "output": 0.4 - }, - "context": 32000, - "output_limit": 8192, - "tool_call": true, - "structured_output": true - }, - { - "id": "qwen/qwen3-4b-fp8", - "name": "Qwen3 4B", - "cost": { - "input": 0.03, - "output": 0.03 - }, - "context": 128000, - "output_limit": 20000, - "reasoning": true - }, { "id": "baichuan/baichuan-m2-32b", - "name": "baichuan-m2-32b", + "name": "Baichuan M2 32B", "cost": { "input": 0.07, "output": 0.07 }, "context": 131072, - "output_limit": 131072 - }, - { - "id": "openai/gpt-oss-20b", - "name": "OpenAI: GPT OSS 20B", - "cost": { - "input": 0.04, - "output": 0.15 - }, - "context": 131072, - "output_limit": 32768, - "reasoning": true, - "structured_output": true, - "image": true + "output_limit": 131072, + "reasoning": true }, { "id": "openai/gpt-oss-120b", - "name": "OpenAI GPT OSS 120B", + "name": "GPT OSS 120B", "cost": { "input": 0.05, "output": 0.25 @@ -37023,62 +36809,18 @@ "output_limit": 32768, "reasoning": true, "tool_call": true, - "structured_output": true, - "image": true + "structured_output": true }, { "id": "microsoft/wizardlm-2-8x22b", - "name": "Wizardlm 2 8x22B", + "name": "WizardLM 2 8x22B", "cost": { "input": 0.62, "output": 0.62 }, "context": 65535, - "output_limit": 8000 - }, - { - "id": "sao10K/l3-70b-euryale-v2.1", - "name": "L3 70B Euryale V2.1\t", - "cost": { - "input": 1.48, - "output": 1.48 - }, - "context": 8192, - "output_limit": 8192, - "tool_call": true - }, - { - "id": "sao10K/L3-8B-stheno-v3.2", - "name": "L3 8B Stheno V3.2", - "cost": { - "input": 0.05, - "output": 0.05 - }, - "context": 8192, - "output_limit": 32000, - "tool_call": true - }, - { - "id": "sao10K/l3-8b-lunaris", - "name": "Sao10k L3 8B Lunaris\t", - "cost": { - "input": 0.05, - "output": 0.05 - }, - "context": 8192, - "output_limit": 8192, + "output_limit": 8000, "structured_output": true - }, - { - "id": "sao10K/l31-70b-euryale-v2.2", - "name": "L31 70B Euryale V2.2", - "cost": { - "input": 1.48, - "output": 1.48 - }, - "context": 8192, - "output_limit": 8192, - "tool_call": true } ] }, @@ -38858,8 +38600,8 @@ "id": "~moonshotai/kimi-latest", "name": "Kimi Latest", "cost": { - "input": 0.49, - "output": 13, + "input": 0.33, + "output": 14.89, "cache_read": 0.3 }, "context": 1048576, @@ -39309,9 +39051,9 @@ "id": "deepseek/deepseek-v4-flash-0731", "name": "DeepSeek V4 Flash 0731", "cost": { - "input": 0.0079, + "input": 0.0099, "output": 1.28, - "cache_read": 0.0079 + "cache_read": 0.0099 }, "context": 1048576, "output_limit": 943718, @@ -39378,9 +39120,9 @@ "id": "deepseek/deepseek-v4-pro-0813", "name": "DeepSeek V4 Pro 0813", "cost": { - "input": 1.32, - "output": 3.96, - "cache_read": 0.044 + "input": 0.66, + "output": 1.98, + "cache_read": 0.022 }, "context": 1048576, "output_limit": 393216, @@ -39430,9 +39172,9 @@ "id": "deepseek/deepseek-v4-pro", "name": "DeepSeek V4 Pro", "cost": { - "input": 0.95526, - "output": 1.91052, - "cache_read": 0.079605 + "input": 0.9483, + "output": 1.8966, + "cache_read": 0.079025 }, "context": 1048576, "output_limit": 384000, @@ -39442,7 +39184,7 @@ }, { "id": "deepseek/deepseek-r1-0528", - "name": "R1 0528", + "name": "DeepSeek R1 0528", "cost": { "input": 0.5, "output": 2.15, @@ -39459,8 +39201,8 @@ "name": "DeepSeek V3.2", "cost": { "input": 0.259, - "output": 0.42, - "cache_read": 0.135 + "output": 0.8, + "cache_read": 0.14 }, "context": 163840, "output_limit": 147456, @@ -39472,9 +39214,9 @@ "id": "deepseek/deepseek-v4-flash", "name": "DeepSeek V4 Flash", "cost": { - "input": 0.0075, + "input": 0.0182, "output": 1.28, - "cache_read": 0.0075 + "cache_read": 0.0182 }, "context": 1048576, "output_limit": 943718, @@ -39841,12 +39583,12 @@ "id": "z-ai/glm-4.6", "name": "GLM-4.6", "cost": { - "input": 0.43, - "output": 1.75, - "cache_read": 0.08 + "input": 0.5, + "output": 2, + "cache_read": 0.1 }, "context": 204800, - "output_limit": 16384, + "output_limit": 131072, "reasoning": true, "tool_call": true, "structured_output": true @@ -39926,7 +39668,7 @@ "name": "GLM-5.2", "cost": { "input": 0.06, - "output": 4.2, + "output": 7, "cache_read": 0.059 }, "context": 1048576, @@ -40314,12 +40056,12 @@ "id": "~z-ai/glm-flash-latest", "name": "GLM Flash Latest", "cost": { - "input": 0.032, - "output": 1.041434, - "cache_read": 0.02 + "input": 0.04, + "output": 0.5, + "cache_read": 0.0125 }, "context": 1048576, - "output_limit": 943718, + "output_limit": 131072, "reasoning": true, "tool_call": true, "structured_output": true, @@ -40330,12 +40072,12 @@ "id": "~z-ai/glm-latest", "name": "GLM Latest", "cost": { - "input": 0.0312, - "output": 4.4, - "cache_read": 0.029 + "input": 0.039, + "output": 4.8, + "cache_read": 0.038 }, "context": 1048576, - "output_limit": 131072, + "output_limit": 943718, "reasoning": true, "tool_call": true, "structured_output": true @@ -40691,9 +40433,9 @@ "id": "~deepseek/deepseek-flash-latest", "name": "DeepSeek Flash Latest", "cost": { - "input": 0.016, - "output": 1.2, - "cache_read": 0.01 + "input": 0.0001, + "output": 0.6, + "cache_read": 0.005 }, "context": 1048576, "output_limit": 943718, @@ -40706,12 +40448,12 @@ "id": "~deepseek/deepseek-pro-latest", "name": "DeepSeek Pro Latest", "cost": { - "input": 0.198, - "output": 8, - "cache_read": 0.2 + "input": 0.3, + "output": 5, + "cache_read": 0.219 }, "context": 1048576, - "output_limit": 393216, + "output_limit": 943718, "reasoning": true, "tool_call": true, "structured_output": true @@ -40720,9 +40462,9 @@ "id": "~deepseek/deepseek-v4-flash-latest", "name": "DeepSeek V4 Flash Latest", "cost": { - "input": 0.00632, - "output": 0.1086, - "cache_read": 0.00632 + "input": 0.0099, + "output": 1.28, + "cache_read": 0.0099 }, "context": 1048576, "output_limit": 943718, @@ -40899,9 +40641,9 @@ "id": "google/gemma-4-26b-a4b-it", "name": "Gemma 4 26B A4B IT", "cost": { - "input": 0.09, - "output": 0.3, - "cache_read": 0.05 + "input": 0.0675, + "output": 0.225, + "cache_read": 0.0375 }, "context": 262144, "output_limit": 235929, @@ -41679,16 +41421,15 @@ "context": 262144, "output_limit": 32768, "reasoning": true, - "tool_call": true, - "structured_output": true + "tool_call": true }, { "id": "moonshotai/kimi-k3", "name": "Kimi K3", "cost": { - "input": 0.5, - "output": 12, - "cache_read": 0.3 + "input": 0.64, + "output": 13.5, + "cache_read": 0.28 }, "context": 1048576, "output_limit": 943718, @@ -41704,7 +41445,7 @@ "cost": { "input": 0.465, "output": 2.45, - "cache_read": 0.0975 + "cache_read": 0.0875 }, "context": 262144, "output_limit": 235929, @@ -41718,10 +41459,11 @@ "name": "Kimi K2 Thinking", "cost": { "input": 0.6, - "output": 2.5 + "output": 2.5, + "cache_read": 0.15 }, "context": 262144, - "output_limit": 235929, + "output_limit": 98304, "reasoning": true, "tool_call": true, "structured_output": true @@ -41730,9 +41472,9 @@ "id": "moonshotai/kimi-k2.5", "name": "Kimi K2.5", "cost": { - "input": 0.45, - "output": 2.25, - "cache_read": 0.07 + "input": 0.5, + "output": 2.5, + "cache_read": 0.15 }, "context": 262144, "output_limit": 235929, @@ -41743,7 +41485,7 @@ }, { "id": "moonshotai/kimi-k2-0905", - "name": "Kimi K2 0905", + "name": "Kimi K2 Instruct 0905", "cost": { "input": 0.6, "output": 2.5 @@ -41847,12 +41589,12 @@ "id": "nvidia/nemotron-3.5-lightning", "name": "Nemotron 3.5 Lightning 30B A3B", "cost": { - "input": 0.0469, - "output": 0.134, - "cache_read": 0.02345 + "input": 0.07, + "output": 0.2, + "cache_read": 0.04 }, "context": 262144, - "output_limit": 131072, + "output_limit": 235929, "reasoning": true, "tool_call": true, "structured_output": true @@ -42464,20 +42206,6 @@ "image": true, "video": true }, - { - "id": "qwen/qwen3-vl-235b-a22b-thinking", - "name": "Qwen3 VL 235B A22B Thinking", - "cost": { - "input": 0.4, - "output": 4 - }, - "context": 131072, - "output_limit": 32768, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "image": true - }, { "id": "qwen/qwen3.8-2.4t-a95b", "name": "Qwen3.8 2.4T A95B", @@ -42515,7 +42243,7 @@ "output": 1.2 }, "context": 262144, - "output_limit": 32768, + "output_limit": 235929, "reasoning": true, "tool_call": true, "structured_output": true @@ -42590,20 +42318,6 @@ "image": true, "video": true }, - { - "id": "qwen/qwen3-max", - "name": "Qwen3 Max", - "cost": { - "input": 0.78, - "output": 3.9, - "cache_read": 0.156, - "cache_write": 0.975 - }, - "context": 262144, - "output_limit": 65536, - "tool_call": true, - "structured_output": true - }, { "id": "qwen/qwen3-coder-30b-a3b-instruct", "name": "Qwen3-Coder 30B-A3B Instruct", @@ -42649,23 +42363,11 @@ "id": "qwen/qwen3-235b-a22b-thinking-2507", "name": "Qwen3 235B A22B Thinking 2507", "cost": { - "input": 0.23, - "output": 2.3 + "input": 0.45, + "output": 3.5 }, - "context": 131072, - "output_limit": 117964, - "reasoning": true, - "tool_call": true - }, - { - "id": "qwen/qwen3-235b-a22b", - "name": "Qwen3 235B-A22B", - "cost": { - "input": 0.455, - "output": 1.82 - }, - "context": 131072, - "output_limit": 8192, + "context": 128000, + "output_limit": 16384, "reasoning": true, "tool_call": true }, @@ -42684,18 +42386,6 @@ "image": true, "video": true }, - { - "id": "qwen/qwen-plus-2025-07-28", - "name": "Qwen Plus 0728", - "cost": { - "input": 0.26, - "output": 0.78 - }, - "context": 1000000, - "output_limit": 32768, - "tool_call": true, - "structured_output": true - }, { "id": "qwen/qwen3.6-35b-a3b", "name": "Qwen3.6 35B-A3B", @@ -42729,11 +42419,11 @@ "id": "qwen/qwen3-vl-30b-a3b-thinking", "name": "Qwen3 VL 30B A3B Thinking", "cost": { - "input": 0.2, - "output": 2.4 + "input": 0.29, + "output": 1 }, "context": 262144, - "output_limit": 32768, + "output_limit": 235929, "reasoning": true, "tool_call": true, "structured_output": true, @@ -42793,33 +42483,6 @@ "image": true, "video": true }, - { - "id": "qwen/qwen3-max-thinking", - "name": "Qwen3 Max Thinking", - "cost": { - "input": 0.78, - "output": 3.9 - }, - "context": 262144, - "output_limit": 65536, - "reasoning": true, - "tool_call": true, - "structured_output": true - }, - { - "id": "qwen/qwen3-coder-plus", - "name": "Qwen3 Coder Plus", - "cost": { - "input": 0.65, - "output": 3.25, - "cache_read": 0.13, - "cache_write": 0.8125 - }, - "context": 1000000, - "output_limit": 65536, - "tool_call": true, - "structured_output": true - }, { "id": "qwen/qwen3.5-9b", "name": "Qwen3.5 9B", @@ -42873,8 +42536,7 @@ "cost": { "input": 0.15, "output": 0.47, - "cache_read": 0.016, - "cache_write": 0.2 + "cache_read": 0.016 }, "context": 1000000, "output_limit": 131072, @@ -42900,20 +42562,6 @@ "image": true, "video": true }, - { - "id": "qwen/qwen3.6-max-preview", - "name": "Qwen3.6 Max Preview", - "cost": { - "input": 1.027, - "output": 6.162, - "cache_write": 1.28375 - }, - "context": 262144, - "output_limit": 65536, - "reasoning": true, - "tool_call": true, - "structured_output": true - }, { "id": "qwen/qwen3-30b-a3b", "name": "Qwen3 30B A3B", @@ -42921,7 +42569,7 @@ "input": 0.12, "output": 0.5 }, - "context": 131072, + "context": 40960, "output_limit": 16384, "reasoning": true, "tool_call": true, @@ -42943,40 +42591,16 @@ "image": true, "video": true }, - { - "id": "qwen/qwen3-8b", - "name": "Qwen3 8B", - "cost": { - "input": 0.117, - "output": 0.455 - }, - "context": 131072, - "output_limit": 8192, - "reasoning": true, - "tool_call": true - }, - { - "id": "qwen/qwen3-vl-32b-instruct", - "name": "Qwen3 VL 32B Instruct", - "cost": { - "input": 0.104, - "output": 0.416 - }, - "context": 131072, - "output_limit": 32768, - "tool_call": true, - "structured_output": true, - "image": true - }, { "id": "qwen/qwen3-vl-8b-instruct", "name": "Qwen3 VL 8B Instruct", "cost": { - "input": 0.117, - "output": 0.455 + "input": 0.25, + "output": 0.75, + "cache_read": 0.12 }, "context": 262144, - "output_limit": 32768, + "output_limit": 235929, "tool_call": true, "structured_output": true, "image": true @@ -43045,27 +42669,15 @@ "tool_call": true, "structured_output": true }, - { - "id": "qwen/qwen3-30b-a3b-thinking-2507", - "name": "Qwen3 30B A3B Thinking 2507", - "cost": { - "input": 0.2, - "output": 2.4 - }, - "context": 81920, - "output_limit": 32768, - "reasoning": true, - "tool_call": true - }, { "id": "qwen/qwen3.6-27b", "name": "Qwen3.6 27B", "cost": { - "input": 0.45, - "output": 2.7 + "input": 0.32, + "output": 3.2 }, "context": 262144, - "output_limit": 65536, + "output_limit": 81920, "reasoning": true, "tool_call": true, "structured_output": true, @@ -43095,26 +42707,12 @@ "input": 0.12, "output": 0.24 }, - "context": 131072, + "context": 40960, "output_limit": 16384, "reasoning": true, "tool_call": true, "structured_output": true }, - { - "id": "qwen/qwen3-vl-8b-thinking", - "name": "Qwen3 VL 8B Thinking", - "cost": { - "input": 0.18, - "output": 2.1 - }, - "context": 131072, - "output_limit": 32768, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "image": true - }, { "id": "qwen/qwen3.7-plus", "name": "Qwen3.7 Plus", @@ -43137,8 +42735,7 @@ "cost": { "input": 2, "output": 6, - "cache_read": 0.25, - "cache_write": 2.5 + "cache_read": 0.25 }, "context": 1000000, "output_limit": 131072, @@ -54361,6 +53958,19 @@ "output_limit": 65536, "tool_call": true }, + { + "id": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "name": "Qwen3 VL 30B A3B Instruct", + "cost": { + "input": 0.2, + "output": 0.7 + }, + "context": 131072, + "output_limit": 32768, + "tool_call": true, + "structured_output": true, + "image": true + }, { "id": "Qwen/Qwen3-VL-235B-A22B-Thinking", "name": "Qwen3 VL 235B A22B Thinking", @@ -54797,6 +54407,18 @@ "structured_output": true, "image": true }, + { + "id": "MiniMaxAI/MiniMax-M1-80k", + "name": "MiniMax M1 80K", + "cost": { + "input": 0.55, + "output": 2.2 + }, + "context": 1000000, + "output_limit": 80000, + "reasoning": true, + "tool_call": true + }, { "id": "MiniMaxAI/MiniMax-M2.1", "name": "MiniMax-M2.1", @@ -55057,6 +54679,17 @@ "reasoning": true, "tool_call": true }, + { + "id": "zai-org/AutoGLM-Phone-9B-Multilingual", + "name": "AutoGLM Phone 9B Multilingual", + "cost": { + "input": 0.035, + "output": 0.138 + }, + "context": 65536, + "output_limit": 65536, + "image": true + }, { "id": "zai-org/GLM-4.7-Flash", "name": "GLM-4.7-Flash", @@ -62418,6 +62051,35 @@ "structured_output": true, "image": true }, + { + "id": "qwen/qwen3.6-35b-a3b", + "name": "Qwen3.6 35B-A3B", + "cost": { + "input": 0.15, + "output": 1, + "cache_read": 0.15, + "cache_write": 0 + }, + "context": 262144, + "output_limit": 262144, + "reasoning": true, + "tool_call": true, + "structured_output": true + }, + { + "id": "qwen/qwen3-30b-a3b-instruct-2507", + "name": "Qwen3 30B A3B Instruct 2507", + "cost": { + "input": 0.09, + "output": 0.3, + "cache_read": 0.09, + "cache_write": 0 + }, + "context": 131072, + "output_limit": 32768, + "tool_call": true, + "structured_output": true + }, { "id": "qwen/qwen3.6-27b", "name": "Qwen3.6 27B", @@ -62431,8 +62093,7 @@ "output_limit": 8192, "reasoning": true, "tool_call": true, - "structured_output": true, - "image": true + "structured_output": true } ] }, @@ -64606,6 +64267,11 @@ "reasoning": true, "tool_call": true }, + { + "id": "heygen/heygen-video-1", + "name": "HeyGen Video", + "image": true + }, { "id": "inference-net/schematron-v2-small", "name": "Schematron V2 Small", @@ -66528,7 +66194,7 @@ "id": "mistral/mistral-nemo", "name": "Mistral Nemo", "cost": { - "input": 0.019, + "input": 0.029, "output": 0.03 }, "context": 131072, @@ -73635,6 +73301,22 @@ "tool_call": true, "image": true }, + { + "id": "anthropic/claude-haiku-5.5", + "name": "Claude Haiku 5.5", + "cost": { + "input": 0.1, + "output": 0.5, + "cache_read": 0.01, + "cache_write": 0.125 + }, + "context": 1000000, + "output_limit": 128000, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true + }, { "id": "anthropic/claude-opus-4.8", "name": "Claude Opus 4.8", @@ -76933,6 +76615,19 @@ "tool_call": true, "image": true }, + { + "id": "coding-glm-5.3-free", + "name": "GLM-5.3 (Coding, free)", + "cost": { + "input": 0, + "output": 0 + }, + "context": 1000000, + "output_limit": 131072, + "reasoning": true, + "tool_call": true, + "structured_output": true + }, { "id": "gpt-image-2.5-flare", "name": "GPT Image 2.5 Flare", @@ -77386,6 +77081,21 @@ "tool_call": true, "structured_output": true }, + { + "id": "coding-glm-5.3-flash-free", + "name": "GLM-5.3-Flash (Coding, free)", + "cost": { + "input": 0, + "output": 0 + }, + "context": 1000000, + "output_limit": 131072, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true, + "video": true + }, { "id": "qwen3.6-flash", "name": "Qwen3.6 Flash", @@ -78945,6 +78655,19 @@ "tool_call": true, "structured_output": true }, + { + "id": "deepseek/deepseek-r1-0528", + "name": "DeepSeek R1 (0528)", + "cost": { + "input": 1.35, + "output": 5.4, + "cache_read": 0.945 + }, + "context": 65536, + "output_limit": 32768, + "reasoning": true, + "structured_output": true + }, { "id": "deepseek/deepseek-v3.2", "name": "DeepSeek V3.2", @@ -80164,6 +79887,20 @@ "context": 131072, "output_limit": 32768 }, + { + "id": "qwen/qwen3-vl-30b-a3b-instruct", + "name": "Qwen3-VL 30B-A3B Instruct", + "cost": { + "input": 0.108, + "output": 0.43, + "cache_read": 0.0216 + }, + "context": 131072, + "output_limit": 32768, + "tool_call": true, + "structured_output": true, + "image": true + }, { "id": "qwen/qwen3-235b-a22b", "name": "Qwen3 235B A22B", @@ -87479,6 +87216,18 @@ "structured_output": true, "image": true }, + { + "id": "deepinfra/Gryphe/MythoMax-L2-13b", + "name": "MythoMax L2 13B (Deep Infra)", + "cost": { + "input": 0.4, + "output": 0.4 + }, + "context": 4096, + "output_limit": 3200, + "tool_call": true, + "structured_output": true + }, { "id": "deepinfra/deepseek-ai/DeepSeek-V4-Flash-0731", "name": "DeepSeek V4 Flash 0731 (Deep Infra)", @@ -87534,6 +87283,20 @@ "structured_output": true, "image": true }, + { + "id": "deepinfra/deepseek-ai/DeepSeek-R1-0528", + "name": "DeepSeek R1 0528 (Deep Infra)", + "cost": { + "input": 0.5, + "output": 2.15, + "cache_read": 0.35 + }, + "context": 163840, + "output_limit": 32768, + "reasoning": true, + "tool_call": true, + "structured_output": true + }, { "id": "deepinfra/deepseek-ai/DeepSeek-V3", "name": "DeepSeek-V3 (Deep Infra)", @@ -87587,6 +87350,17 @@ "tool_call": true, "structured_output": true }, + { + "id": "deepinfra/moonshotai/Kimi-K2-Instruct", + "name": "Kimi K2 Instruct (Deep Infra)", + "cost": { + "input": 0.5, + "output": 2 + }, + "context": 131072, + "output_limit": 32768, + "tool_call": true + }, { "id": "deepinfra/moonshotai/Kimi-K2.5", "name": "Kimi K2.5 (Deep Infra)", @@ -87697,6 +87471,16 @@ "tool_call": true, "structured_output": true }, + { + "id": "deepinfra/microsoft/WizardLM-2-8x22B", + "name": "WizardLM 2 8x22B (Deep Infra)", + "cost": { + "input": 0.48, + "output": 0.48 + }, + "context": 65536, + "output_limit": 8000 + }, { "id": "cerebras/gpt-oss-120b", "name": "GPT OSS 120B (Cerebras)", @@ -88366,19 +88150,6 @@ "reasoning": true, "tool_call": true }, - { - "id": "tencent/step-5-preview", - "name": "Step 5 Preview (Tencent)", - "cost": { - "input": 1, - "output": 2.7, - "cache_read": 0.05 - }, - "context": 1000000, - "input_limit": 1000000, - "output_limit": 1000000, - "reasoning": true - }, { "id": "tencent/deepseek-v4-pro-0813", "name": "DeepSeek V4 Pro 0813 (Tencent)", @@ -89193,9 +88964,9 @@ "id": "scaleway/deepseek-v4-flash-0731", "name": "DeepSeek V4 Flash 0731 (Scaleway)", "cost": { - "input": 0.44744, - "output": 0.89488, - "cache_read": 0.089488 + "input": 0.44824, + "output": 0.89648, + "cache_read": 0.089648 }, "context": 256000, "output_limit": 384000, @@ -89206,8 +88977,8 @@ "id": "scaleway/llama-3.3-70b-instruct", "name": "Llama-3.3-70B-Instruct (Scaleway)", "cost": { - "input": 1.00674, - "output": 1.00674 + "input": 1.00854, + "output": 1.00854 }, "context": 128000, "output_limit": 4096, @@ -89217,8 +88988,8 @@ "id": "scaleway/gpt-oss-120b", "name": "GPT OSS 120B (Scaleway)", "cost": { - "input": 0.16779, - "output": 0.67116 + "input": 0.16809, + "output": 0.67236 }, "context": 128000, "output_limit": 32768, @@ -89229,8 +89000,8 @@ "id": "ionos/meta-llama/Llama-3.3-70B-Instruct", "name": "Llama-3.3-70B-Instruct (IONOS)", "cost": { - "input": 0.72709, - "output": 0.72709 + "input": 0.72839, + "output": 0.72839 }, "context": 128000, "output_limit": 4096 @@ -89239,8 +89010,8 @@ "id": "ionos/openai/gpt-oss-120b", "name": "GPT OSS 120B (IONOS)", "cost": { - "input": 0.16779, - "output": 0.72709 + "input": 0.16809, + "output": 0.72839 }, "context": 131072, "output_limit": 32768, @@ -89769,6 +89540,16 @@ "context": 131072, "output_limit": 4096 }, + { + "id": "cloudflare/@cf/meta/llama-3.2-1b-instruct", + "name": "Llama 3.2 1B Instruct (Cloudflare)", + "cost": { + "input": 0.027, + "output": 0.201 + }, + "context": 60000, + "output_limit": 32000 + }, { "id": "cloudflare/@cf/aisingapore/gemma-sea-lion-v4-27b-it", "name": "Gemma-SEA-LION-v4-27B-IT (Cloudflare)", @@ -89965,6 +89746,20 @@ "reasoning": true, "tool_call": true }, + { + "id": "tensorx/deepseek/deepseek-r1-0528", + "name": "DeepSeek R1 0528 (TensorX)", + "cost": { + "input": 0.66, + "output": 2.6, + "cache_read": 0.165 + }, + "context": 164000, + "output_limit": 32768, + "reasoning": true, + "tool_call": true, + "structured_output": true + }, { "id": "tensorx/moonshotai/kimi-k2.5", "name": "Kimi K2.5 (TensorX)", @@ -90754,6 +90549,20 @@ "image": true, "video": true }, + { + "id": "qwen/qwen3-vl-30b-a3b-instruct", + "name": "Qwen3 VL 30B A3B Instruct", + "cost": { + "input": 0.2, + "output": 0.8 + }, + "context": 131072, + "output_limit": 32768, + "tool_call": true, + "structured_output": true, + "image": true, + "video": true + }, { "id": "qwen/qwen-vl-max", "name": "Qwen-VL Max", @@ -90821,6 +90630,16 @@ "tool_call": true, "structured_output": true }, + { + "id": "qwen/qwen-mt-plus", + "name": "Qwen MT Plus", + "cost": { + "input": 2.46, + "output": 7.37 + }, + "context": 4096, + "output_limit": 8192 + }, { "id": "qwen/deepseek-v4-pro-0813", "name": "DeepSeek V4 Pro 0813 (Alibaba)", @@ -91496,8 +91315,8 @@ "id": "infomaniak/mistralai/Ministral-3-14B-Instruct-2512", "name": "Ministral 3 14B (Infomaniak)", "cost": { - "input": 0.33558, - "output": 0.44744 + "input": 0.33618, + "output": 0.44824 }, "context": 100000, "output_limit": 262144 @@ -103100,6 +102919,19 @@ "structured_output": true, "image": true }, + { + "id": "reka-edge-2603", + "name": "Reka Edge 2603", + "cost": { + "input": 0.1, + "output": 0.1 + }, + "context": 16384, + "output_limit": 16384, + "tool_call": true, + "structured_output": true, + "image": true + }, { "id": "grok-4-5", "name": "Grok 4.5", @@ -103225,9 +103057,9 @@ "id": "mimo-v2.5", "name": "MiMo-V2.5", "cost": { - "input": 0.14, - "output": 0.28, - "cache_read": 0.0028 + "input": 0.168, + "output": 0.336, + "cache_read": 0.0034 }, "context": 1048576, "output_limit": 131072, @@ -103353,18 +103185,6 @@ "structured_output": true, "image": true }, - { - "id": "qwen-coder-plus", - "name": "Qwen Coder Plus", - "cost": { - "input": 0.502, - "output": 1.004 - }, - "context": 131072, - "output_limit": 8192, - "tool_call": true, - "structured_output": true - }, { "id": "glm-5v-turbo", "name": "GLM-5V-Turbo", @@ -104333,20 +104153,6 @@ "output_limit": 8000, "structured_output": true }, - { - "id": "qwen3-vl-flash", - "name": "Qwen3 VL Flash", - "cost": { - "input": 0.05, - "output": 0.4, - "cache_read": 0.01 - }, - "context": 262144, - "output_limit": 32000, - "tool_call": true, - "structured_output": true, - "image": true - }, { "id": "seed-2-0-pro-260328", "name": "Seed 2.0 Pro (260328)", @@ -104761,19 +104567,6 @@ "reasoning": true, "tool_call": true }, - { - "id": "qwen3-coder-plus", - "name": "Qwen3 Coder Plus", - "cost": { - "input": 1, - "output": 5, - "cache_read": 0.2, - "cache_write": 1.25 - }, - "context": 1000000, - "output_limit": 65536, - "tool_call": true - }, { "id": "glm-4.7-flash", "name": "GLM-4.7-Flash", @@ -105091,20 +104884,6 @@ "image": true, "video": true }, - { - "id": "qwen3.6-max-preview", - "name": "Qwen3.6 Max Preview", - "cost": { - "input": 1.3, - "output": 7.8, - "cache_read": 0.13, - "cache_write": 1.625 - }, - "context": 262144, - "output_limit": 65536, - "reasoning": true, - "tool_call": true - }, { "id": "claude-opus-4-6", "name": "Claude Opus 4.6", @@ -105206,19 +104985,6 @@ "tool_call": true, "structured_output": true }, - { - "id": "qwen-omni-turbo", - "name": "Qwen-Omni Turbo", - "cost": { - "input": 0.2, - "output": 0.8 - }, - "context": 32768, - "output_limit": 2048, - "tool_call": true, - "image": true, - "video": true - }, { "id": "hy-mt2-plus", "name": "Hy-MT2 Plus", @@ -110773,8 +110539,8 @@ "id": "qwen3-coder-30b-a3b-instruct", "name": "Qwen3-Coder 30B-A3B Instruct", "cost": { - "input": 0.067, - "output": 0.245, + "input": 0.179, + "output": 0.697, "cache_read": 0.014 }, "context": 262144, @@ -115476,6 +115242,22 @@ "output_limit": 32768, "tool_call": true }, + { + "id": "anthropic-claude-5.5-haiku", + "name": "Anthropic Claude 5.5 Haiku", + "cost": { + "input": 0.1, + "output": 0.5, + "cache_read": 0.01, + "cache_write": 0.125 + }, + "context": 1000000, + "output_limit": 128000, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true + }, { "id": "qwen-2.5-14b-instruct", "name": "Qwen 2.5 14B Instruct", diff --git a/src/lib/models-dev.json b/src/lib/models-dev.json index 5d632ae..ab64d4c 100644 --- a/src/lib/models-dev.json +++ b/src/lib/models-dev.json @@ -1,5 +1,5 @@ { - "last_updated": "2026-10-09", + "last_updated": "2026-10-10", "deepinfra/tencent/Hy3": { "name": "Hy3", "context": 262144, @@ -273,6 +273,18 @@ "cache_read": 0.5 } }, + "deepinfra/Qwen/Qwen3-VL-30B-A3B-Instruct": { + "name": "Qwen3 VL 30B A3B Instruct", + "context": 262144, + "output": 32768, + "tool_call": true, + "structured_output": true, + "image": true, + "cost": { + "input": 0.15, + "output": 0.6 + } + }, "deepinfra/Qwen/Qwen3.8-Max": { "name": "Qwen3.8 Max", "context": 256000, @@ -3289,19 +3301,6 @@ "cache_read": 2 } }, - "empiriolabs/deepseek-v3-2": { - "name": "DeepSeek V3.2", - "context": 128000, - "output": 32768, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.57, - "output": 1.71, - "cache_read": 0.57 - } - }, "empiriolabs/minimax-m2-7-highspeed": { "name": "MiniMax M2.7 Highspeed", "context": 200000, @@ -3328,19 +3327,6 @@ "cache_read": 0.018 } }, - "empiriolabs/qwen3-max": { - "name": "Qwen3 Max", - "context": 256000, - "output": 65536, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 1.08, - "output": 5.52, - "cache_read": 1.08 - } - }, "empiriolabs/seed-2-0-pro": { "name": "Seed 2.0 Pro", "context": 256000, @@ -3914,19 +3900,6 @@ "cache_read": 1 } }, - "empiriolabs/qwen3-6-max-preview": { - "name": "Qwen3.6 Max Preview", - "context": 256000, - "output": 65536, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 1.31, - "output": 7.88, - "cache_read": 1.31 - } - }, "empiriolabs/step-3-7-flash": { "name": "Step 3.7 Flash", "context": 256000, @@ -3984,19 +3957,6 @@ "cache_read": 0.025 } }, - "empiriolabs/deepseek-v4-flash": { - "name": "DeepSeek V4 Flash", - "context": 1000000, - "output": 393216, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.14, - "output": 0.28, - "cache_read": 0.14 - } - }, "sensenova/kimi-k3": { "name": "Kimi K3", "context": 1048576, @@ -4655,6 +4615,17 @@ "cache_read": 0.26 } }, + "cloudflare-workers-ai/@cf/cloudflare/clef-omni": { + "name": "Clef Omni", + "context": 65536, + "output": 65536, + "structured_output": true, + "image": true, + "cost": { + "input": 0.15, + "output": 0 + } + }, "cloudflare-workers-ai/@cf/nvidia/nemotron-3-120b-a12b": { "name": "Nemotron 3 Super 120B", "context": 256000, @@ -5386,9 +5357,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.7, + "input": 0.6, "output": 2.2, - "cache_read": 0.13 + "cache_read": 0.2 } }, "nano-gpt/gemma-4-26b-a4b-it-shadowsiren": { @@ -5423,9 +5394,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.7, + "input": 0.6, "output": 2.2, - "cache_read": 0.13 + "cache_read": 0.2 } }, "nano-gpt/deepseek-chat": { @@ -5461,9 +5432,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.7, + "input": 0.6, "output": 2.2, - "cache_read": 0.13, + "cache_read": 0.2, "cache_write": 0.08333 } }, @@ -5495,9 +5466,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.7, + "input": 0.6, "output": 2.2, - "cache_read": 0.13, + "cache_read": 0.2, "cache_write": 0.08333 } }, @@ -5561,9 +5532,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.7, + "input": 0.6, "output": 2.2, - "cache_read": 0.13 + "cache_read": 0.2 } }, "nano-gpt/gemini-2.5-flash-preview-05-20": { @@ -6152,9 +6123,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.7, + "input": 0.6, "output": 2.2, - "cache_read": 0.13 + "cache_read": 0.2 } }, "nano-gpt/Gemma-4-31B-DarkIdol": { @@ -7031,9 +7002,9 @@ "structured_output": true, "image": true, "cost": { - "input": 0.44, - "output": 1.32, - "cache_read": 0.014 + "input": 0.22, + "output": 0.66, + "cache_read": 0.007 } }, "nano-gpt/deepseek/deepseek-v3.2:thinking": { @@ -7635,9 +7606,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.7, + "input": 0.6, "output": 2.2, - "cache_read": 0.13 + "cache_read": 0.2 } }, "nano-gpt/z-ai/glm-5": { @@ -7948,9 +7919,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.7, + "input": 0.6, "output": 2.2, - "cache_read": 0.13 + "cache_read": 0.2 } }, "nano-gpt/z-ai/glm-5.3-flash-cybersecurity": { @@ -7974,9 +7945,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.7, + "input": 0.6, "output": 2.2, - "cache_read": 0.13 + "cache_read": 0.2 } }, "nano-gpt/inference-net/schematron-v2-small": { @@ -10874,9 +10845,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.2, - "output": 1.5, - "cache_read": 0.1 + "input": 0.250251, + "output": 0.80293, + "cache_read": 0.079764 } }, "nano-gpt/qwen/qwen3-coder": { @@ -11106,8 +11077,8 @@ "structured_output": true, "image": true, "cost": { - "input": 0.15, - "output": 1.2, + "input": 0.75, + "output": 2.5, "cache_read": 0.125 } }, @@ -11157,8 +11128,8 @@ "structured_output": true, "image": true, "cost": { - "input": 0.15, - "output": 1.2, + "input": 0.75, + "output": 2.5, "cache_read": 0.125 } }, @@ -13161,21 +13132,6 @@ "output": 0.6 } }, - "tinfoil/glm-5-3-flash": { - "name": "GLM-5.3-Flash", - "context": 1048576, - "output": 131072, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "image": true, - "video": true, - "cost": { - "input": 0.4, - "output": 1.25, - "cache_read": 0.1 - } - }, "tinfoil/kimi-k3": { "name": "Kimi K3", "context": 262144, @@ -19836,16 +19792,6 @@ "cache_write": 3.125 } }, - "llmgateway-providers/alibaba/qwen-coder-plus": { - "name": "Qwen Coder Plus (Alibaba Cloud)", - "context": 131072, - "output": 8192, - "tool_call": true, - "cost": { - "input": 0.502, - "output": 1.004 - } - }, "llmgateway-providers/alibaba/qwen3-vl-plus": { "name": "Qwen3 VL Plus (Alibaba Cloud)", "context": 262144, @@ -19962,31 +19908,6 @@ "cache_write": 0.0375 } }, - "llmgateway-providers/alibaba/qwen3-max": { - "name": "Qwen3 Max (Alibaba Cloud)", - "context": 256000, - "output": 32800, - "reasoning": true, - "tool_call": true, - "cost": { - "input": 1.2, - "output": 6, - "cache_read": 0.24, - "cache_write": 1.5 - } - }, - "llmgateway-providers/alibaba/qwen3-vl-flash": { - "name": "Qwen3 VL Flash (Alibaba Cloud)", - "context": 262144, - "output": 32768, - "tool_call": true, - "image": true, - "cost": { - "input": 0.05, - "output": 0.4, - "cache_read": 0.01 - } - }, "llmgateway-providers/alibaba/qwen3.5-122b-a10b": { "name": "Qwen3.5 122B A10B (Alibaba Cloud)", "context": 262144, @@ -20053,18 +19974,6 @@ "cache_write": 0.375 } }, - "llmgateway-providers/alibaba/qwen3-coder-plus": { - "name": "Qwen3 Coder Plus (Alibaba Cloud)", - "context": 1000000, - "output": 66000, - "tool_call": true, - "cost": { - "input": 1, - "output": 5, - "cache_read": 0.2, - "cache_write": 1.25 - } - }, "llmgateway-providers/alibaba/qwen3.8-flash": { "name": "Qwen3.8 Flash (Alibaba Cloud)", "context": 983616, @@ -20106,18 +20015,6 @@ "output": 2 } }, - "llmgateway-providers/alibaba/qwen3.6-max-preview": { - "name": "Qwen3.6 Max Preview (Alibaba Cloud)", - "context": 262144, - "output": 65536, - "reasoning": true, - "tool_call": true, - "cost": { - "input": 1.3, - "output": 7.8, - "cache_read": 0.13 - } - }, "llmgateway-providers/alibaba/glm-5.2": { "name": "GLM-5.2 (Alibaba Cloud)", "context": 1000000, @@ -20130,17 +20027,6 @@ "cache_read": 0.28 } }, - "llmgateway-providers/alibaba/qwen-omni-turbo": { - "name": "Qwen Omni Turbo (Alibaba Cloud)", - "context": 32768, - "output": 8192, - "image": true, - "video": true, - "cost": { - "input": 0.2, - "output": 0.8 - } - }, "llmgateway-providers/alibaba/deepseek-v4-pro": { "name": "DeepSeek V4 Pro (Alibaba Cloud)", "context": 1000000, @@ -20356,6 +20242,87 @@ "cache_read": 0.012 } }, + "llmgateway-providers/reka-ai/reka-edge-2603": { + "name": "Reka Edge 2603 (reka-ai)", + "context": 16384, + "output": 16384, + "tool_call": true, + "structured_output": true, + "image": true, + "cost": { + "input": 0.1, + "output": 0.1 + } + }, + "llmgateway-providers/reka-ai/qwen3.8-27b": { + "name": "Qwen3.8 27B (reka-ai)", + "context": 262144, + "output": 262144, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true, + "video": true, + "cost": { + "input": 0.2, + "output": 2.5, + "cache_read": 0.05 + } + }, + "llmgateway-providers/reka-ai/glm-5.3-flash": { + "name": "GLM-5.3 Flash (reka-ai)", + "context": 262144, + "output": 262144, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true, + "video": true, + "cost": { + "input": 0.15, + "output": 0.5, + "cache_read": 0.015 + } + }, + "llmgateway-providers/reka-ai/deepseek-v4-pro": { + "name": "DeepSeek V4 Pro (reka-ai)", + "context": 1048576, + "output": 393216, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "cost": { + "input": 1.2, + "output": 3.3, + "cache_read": 0.13 + } + }, + "llmgateway-providers/reka-ai/glm-5.3": { + "name": "GLM-5.3 (reka-ai)", + "context": 1048576, + "output": 262144, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "cost": { + "input": 1.17, + "output": 3.96, + "cache_read": 0.234 + } + }, + "llmgateway-providers/reka-ai/deepseek-v4-flash": { + "name": "DeepSeek V4 Flash (reka-ai)", + "context": 262144, + "output": 131072, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "cost": { + "input": 0.11, + "output": 0.66, + "cache_read": 0.007 + } + }, "llmgateway-providers/bytedance/seed-1-6-flash-250715": { "name": "Seed 1.6 Flash (250715) (ByteDance)", "context": 256000, @@ -21557,7 +21524,8 @@ "cost": { "input": 1, "output": 5, - "cache_read": 0.1 + "cache_read": 0.1, + "cache_write": 1.25 } }, "llmgateway-providers/vertex-anthropic/claude-sonnet-4-5": { @@ -21571,7 +21539,8 @@ "cost": { "input": 3, "output": 15, - "cache_read": 0.3 + "cache_read": 0.3, + "cache_write": 3.75 } }, "llmgateway-providers/vertex-anthropic/claude-opus-4-5-20251101": { @@ -21585,7 +21554,8 @@ "cost": { "input": 5, "output": 25, - "cache_read": 0.5 + "cache_read": 0.5, + "cache_write": 6.25 } }, "llmgateway-providers/vertex-anthropic/claude-sonnet-5": { @@ -21614,7 +21584,8 @@ "cost": { "input": 5, "output": 25, - "cache_read": 0.5 + "cache_read": 0.5, + "cache_write": 6.25 } }, "llmgateway-providers/vertex-anthropic/claude-sonnet-4-6": { @@ -21628,7 +21599,8 @@ "cost": { "input": 3, "output": 15, - "cache_read": 0.3 + "cache_read": 0.3, + "cache_write": 3.75 } }, "llmgateway-providers/vertex-anthropic/claude-opus-4-7": { @@ -21642,7 +21614,8 @@ "cost": { "input": 5, "output": 25, - "cache_read": 0.5 + "cache_read": 0.5, + "cache_write": 6.25 } }, "llmgateway-providers/vertex-openai/qwen3-235b-a22b-instruct-2507": { @@ -22870,8 +22843,8 @@ "image": true, "video": true, "cost": { - "input": 0.49, - "output": 13, + "input": 0.33, + "output": 14.89, "cache_read": 0.3 } }, @@ -23406,7 +23379,7 @@ } }, "kilo/deepseek/deepseek-r1-0528": { - "name": "DeepSeek: R1 0528", + "name": "DeepSeek R1 0528", "context": 163840, "output": 32768, "reasoning": true, @@ -23427,8 +23400,8 @@ "structured_output": true, "cost": { "input": 0.259, - "output": 0.42, - "cache_read": 0.135 + "output": 0.8, + "cache_read": 0.14 } }, "kilo/deepseek/deepseek-v4-flash": { @@ -23439,9 +23412,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.14, - "output": 0.28, - "cache_read": 0.028 + "input": 0.0182, + "output": 1.28, + "cache_read": 0.0182 } }, "kilo/unbiased/pareto-26.10-preview": { @@ -23614,7 +23587,7 @@ } }, "kilo/meta-llama/llama-3.2-1b-instruct": { - "name": "Meta: Llama 3.2 1B Instruct", + "name": "Llama 3.2 1B Instruct", "context": 60000, "output": 54000, "cost": { @@ -23771,15 +23744,15 @@ }, "kilo/z-ai/glm-4.6": { "name": "GLM-4.6", - "context": 198000, - "output": 16384, + "context": 202752, + "output": 131072, "reasoning": true, "tool_call": true, "structured_output": true, "cost": { - "input": 0.43, - "output": 1.75, - "cache_read": 0.08 + "input": 0.5, + "output": 2, + "cache_read": 0.1 } }, "kilo/z-ai/glm-5": { @@ -24201,29 +24174,29 @@ "kilo/~z-ai/glm-flash-latest": { "name": "Z.ai: GLM Flash Latest", "context": 1048576, - "output": 943718, + "output": 131072, "reasoning": true, "tool_call": true, "structured_output": true, "image": true, "video": true, "cost": { - "input": 0.032, - "output": 1.428579, - "cache_read": 0.02 + "input": 0.04, + "output": 0.5, + "cache_read": 0.0125 } }, "kilo/~z-ai/glm-latest": { "name": "Z.ai: GLM Latest", "context": 1048576, - "output": 131072, + "output": 943718, "reasoning": true, "tool_call": true, "structured_output": true, "cost": { - "input": 0.0312, - "output": 4.4, - "cache_read": 0.029 + "input": 0.039, + "output": 4.8, + "cache_read": 0.038 } }, "kilo/arcee-ai/trinity-large-thinking": { @@ -24558,22 +24531,22 @@ "structured_output": true, "image": true, "cost": { - "input": 0.016, - "output": 1.2, - "cache_read": 0.01 + "input": 0.0001, + "output": 0.6, + "cache_read": 0.005 } }, "kilo/~deepseek/deepseek-pro-latest": { "name": "DeepSeek: DeepSeek Pro Latest", "context": 1048576, - "output": 393216, + "output": 943718, "reasoning": true, "tool_call": true, "structured_output": true, "cost": { - "input": 0.198, - "output": 8, - "cache_read": 0.2 + "input": 0.3, + "output": 5, + "cache_read": 0.219 } }, "kilo/~deepseek/deepseek-v4-flash-latest": { @@ -24584,9 +24557,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.00368, - "output": 0.134075, - "cache_read": 0.00368 + "input": 0.0099, + "output": 1.28, + "cache_read": 0.0099 } }, "kilo/~x-ai/grok-latest": { @@ -25399,7 +25372,7 @@ } }, "kilo/inclusionai/ling-3.1-flash": { - "name": "inclusionAI: Ling 3.1 Flash (new)", + "name": "inclusionAI: Ling 3.1 Flash", "context": 262144, "output": 32768, "reasoning": true, @@ -25442,7 +25415,6 @@ "output": 32768, "reasoning": true, "tool_call": true, - "structured_output": true, "cost": { "input": 0.075, "output": 0.22, @@ -25476,19 +25448,20 @@ "cost": { "input": 0.465, "output": 2.45, - "cache_read": 0.0975 + "cache_read": 0.0875 } }, "kilo/moonshotai/kimi-k2-thinking": { "name": "Kimi K2 Thinking", "context": 262144, - "output": 235929, + "output": 98304, "reasoning": true, "tool_call": true, "structured_output": true, "cost": { "input": 0.6, - "output": 2.5 + "output": 2.5, + "cache_read": 0.15 } }, "kilo/moonshotai/kimi-k2.5": { @@ -25505,7 +25478,7 @@ } }, "kilo/moonshotai/kimi-k2-0905": { - "name": "MoonshotAI: Kimi K2 0905", + "name": "Kimi K2 Instruct 0905", "context": 262144, "output": 98304, "tool_call": true, @@ -25657,7 +25630,7 @@ "kilo/nvidia/nemotron-3.5-lightning": { "name": "Nemotron 3.5 Lightning 30B A3B", "context": 262144, - "output": 131072, + "output": 235929, "reasoning": true, "tool_call": true, "structured_output": true, @@ -26192,8 +26165,8 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.1495, - "output": 0.598 + "input": 0.09, + "output": 0.55 } }, "kilo/qwen/qwen3-vl-235b-a22b-instruct": { @@ -26204,8 +26177,9 @@ "structured_output": true, "image": true, "cost": { - "input": 0.26, - "output": 1.04 + "input": 0.21, + "output": 1.9, + "cache_read": 0.1 } }, "kilo/qwen/qwen3.7-max": { @@ -26238,19 +26212,6 @@ "cache_write": 0.53125 } }, - "kilo/qwen/qwen3-vl-235b-a22b-thinking": { - "name": "Qwen3 VL 235B A22B Thinking", - "context": 131072, - "output": 32768, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "image": true, - "cost": { - "input": 0.4, - "output": 4 - } - }, "kilo/qwen/qwen3.8-2.4t-a95b": { "name": "Qwen3.8 2.4T A95B", "context": 1048576, @@ -26281,8 +26242,8 @@ }, "kilo/qwen/qwen3-next-80b-a3b-thinking": { "name": "Qwen3-Next 80B-A3B (Thinking)", - "context": 131072, - "output": 32768, + "context": 262144, + "output": 235929, "reasoning": true, "tool_call": true, "structured_output": true, @@ -26298,8 +26259,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.3, - "output": 1.5 + "input": 0.12, + "output": 0.8, + "cache_read": 0.07 } }, "kilo/qwen/qwen3-coder": { @@ -26309,8 +26271,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.975, - "output": 4.875 + "input": 0.3, + "output": 1, + "cache_read": 0.1 } }, "kilo/qwen/qwen3-32b": { @@ -26353,19 +26316,6 @@ "cache_write": 0.038 } }, - "kilo/qwen/qwen3-max": { - "name": "Qwen3 Max", - "context": 262144, - "output": 65536, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.78, - "output": 3.9, - "cache_read": 0.156, - "cache_write": 0.975 - } - }, "kilo/qwen/qwen3-coder-30b-a3b-instruct": { "name": "Qwen3-Coder 30B-A3B Instruct", "context": 262144, @@ -26373,8 +26323,8 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.2925, - "output": 1.4625 + "input": 0.07, + "output": 0.28 } }, "kilo/qwen/qwen3.8-omni-flash": { @@ -26393,37 +26343,26 @@ } }, "kilo/qwen/qwen3-vl-30b-a3b-instruct": { - "name": "Qwen: Qwen3 VL 30B A3B Instruct", + "name": "Qwen3 VL 30B A3B Instruct", "context": 262144, "output": 16384, "tool_call": true, "structured_output": true, "image": true, "cost": { - "input": 0.13, - "output": 0.52 + "input": 0.15, + "output": 0.6 } }, "kilo/qwen/qwen3-235b-a22b-thinking-2507": { - "name": "Qwen: Qwen3 235B A22B Thinking 2507 (retires Oct 9)", - "context": 131072, - "output": 117964, + "name": "Qwen: Qwen3 235B A22B Thinking 2507", + "context": 128000, + "output": 16384, "reasoning": true, "tool_call": true, "cost": { - "input": 0.23, - "output": 2.3 - } - }, - "kilo/qwen/qwen3-235b-a22b": { - "name": "Qwen3 235B-A22B", - "context": 131072, - "output": 8192, - "reasoning": true, - "tool_call": true, - "cost": { - "input": 0.455, - "output": 1.82 + "input": 0.45, + "output": 3.5 } }, "kilo/qwen/qwen3.5-122b-a10b": { @@ -26440,17 +26379,6 @@ "output": 2.08 } }, - "kilo/qwen/qwen-plus-2025-07-28": { - "name": "Qwen: Qwen Plus 0728 (retires Oct 9)", - "context": 1000000, - "output": 32768, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.26, - "output": 0.78 - } - }, "kilo/qwen/qwen3.6-35b-a3b": { "name": "Qwen3.6 35B-A3B", "context": 262144, @@ -26473,21 +26401,22 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.0975, - "output": 0.78 + "input": 0.1, + "output": 1.1, + "cache_read": 0.07 } }, "kilo/qwen/qwen3-vl-30b-a3b-thinking": { - "name": "Qwen: Qwen3 VL 30B A3B Thinking (retires Oct 9)", - "context": 131072, - "output": 32768, + "name": "Qwen: Qwen3 VL 30B A3B Thinking", + "context": 262144, + "output": 235929, "reasoning": true, "tool_call": true, "structured_output": true, "image": true, "cost": { - "input": 0.2, - "output": 2.4 + "input": 0.29, + "output": 1 } }, "kilo/qwen/qwen3.6-flash": { @@ -26540,31 +26469,6 @@ "output": 0.26 } }, - "kilo/qwen/qwen3-max-thinking": { - "name": "Qwen: Qwen3 Max Thinking (retires Oct 9)", - "context": 262144, - "output": 65536, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.78, - "output": 3.9 - } - }, - "kilo/qwen/qwen3-coder-plus": { - "name": "Qwen3 Coder Plus", - "context": 1000000, - "output": 65536, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.65, - "output": 3.25, - "cache_read": 0.13, - "cache_write": 0.8125 - } - }, "kilo/qwen/qwen3.5-9b": { "name": "Qwen3.5 9B", "context": 256000, @@ -26639,19 +26543,6 @@ "output": 1.3 } }, - "kilo/qwen/qwen3.6-max-preview": { - "name": "Qwen3.6 Max Preview", - "context": 262144, - "output": 65536, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 1.027, - "output": 6.162, - "cache_write": 1.28375 - } - }, "kilo/qwen/qwen3-30b-a3b": { "name": "Qwen3 30B A3B", "context": 40960, @@ -26660,8 +26551,8 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.13, - "output": 0.52 + "input": 0.12, + "output": 0.5 } }, "kilo/qwen/qwen3.5-397b-a17b": { @@ -26678,39 +26569,17 @@ "output": 2.34 } }, - "kilo/qwen/qwen3-8b": { - "name": "Qwen: Qwen3 8B (retires Oct 9)", - "context": 131072, - "output": 8192, - "reasoning": true, - "tool_call": true, - "cost": { - "input": 0.117, - "output": 0.455 - } - }, - "kilo/qwen/qwen3-vl-32b-instruct": { - "name": "Qwen: Qwen3 VL 32B Instruct (retires Oct 9)", - "context": 131072, - "output": 32768, - "tool_call": true, - "structured_output": true, - "image": true, - "cost": { - "input": 0.104, - "output": 0.416 - } - }, "kilo/qwen/qwen3-vl-8b-instruct": { - "name": "Qwen: Qwen3 VL 8B Instruct (retires Oct 9)", - "context": 131072, - "output": 32768, + "name": "Qwen: Qwen3 VL 8B Instruct", + "context": 262144, + "output": 235929, "tool_call": true, "structured_output": true, "image": true, "cost": { - "input": 0.117, - "output": 0.455 + "input": 0.25, + "output": 0.75, + "cache_read": 0.12 } }, "kilo/qwen/qwen3-30b-a3b-instruct-2507": { @@ -26720,8 +26589,8 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.13, - "output": 0.52 + "input": 0.1, + "output": 0.3 } }, "kilo/qwen/qwen2.5-vl-72b-instruct": { @@ -26772,21 +26641,10 @@ "output": 0.4 } }, - "kilo/qwen/qwen3-30b-a3b-thinking-2507": { - "name": "Qwen: Qwen3 30B A3B Thinking 2507 (retires Oct 9)", - "context": 81920, - "output": 32768, - "reasoning": true, - "tool_call": true, - "cost": { - "input": 0.2, - "output": 2.4 - } - }, "kilo/qwen/qwen3.6-27b": { "name": "Qwen3.6 27B", "context": 262144, - "output": 65536, + "output": 81920, "reasoning": true, "tool_call": true, "structured_output": true, @@ -26820,21 +26678,8 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.2275, - "output": 0.91 - } - }, - "kilo/qwen/qwen3-vl-8b-thinking": { - "name": "Qwen: Qwen3 VL 8B Thinking (retires Oct 9)", - "context": 131072, - "output": 32768, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "image": true, - "cost": { - "input": 0.18, - "output": 2.1 + "input": 0.12, + "output": 0.24 } }, "kilo/qwen/qwen3.7-plus": { @@ -27672,7 +27517,7 @@ "structured_output": true, "cost": { "input": 0.03, - "output": 0.17, + "output": 0.15, "cache_read": 0.03 } }, @@ -28387,6 +28232,21 @@ "cache_read": 0.01 } }, + "venice/openai-gpt-61-sol-ultrafast": { + "name": "GPT-6.1 Sol Ultrafast", + "context": 1050000, + "output": 128000, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true, + "cost": { + "input": 15, + "output": 75, + "cache_read": 0.75, + "cache_write": 18.75 + } + }, "venice/claude-opus-5": { "name": "Claude Opus 5", "context": 1000000, @@ -29778,6 +29638,110 @@ "output": 0.4 } }, + "lowrouter/auto/mistralai/ministral-8b-2512": { + "name": "Ministral 3 8B", + "context": 262144, + "output": 262144, + "tool_call": true, + "structured_output": true, + "image": true, + "cost": { + "input": 0.1569, + "output": 0.1569, + "cache_read": 0.0157 + } + }, + "lowrouter/auto/mistralai/mistral-large-4": { + "name": "Mistral Large 4", + "context": 524288, + "output": 262144, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true, + "cost": { + "input": 0.7112, + "output": 2.1859, + "cache_read": 0.0732 + } + }, + "lowrouter/auto/mistralai/mistral-medium-3.5": { + "name": "Mistral Medium 3.5", + "context": 262144, + "output": 262144, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true, + "cost": { + "input": 1.5688, + "output": 7.8442, + "cache_read": 0.1569 + } + }, + "lowrouter/auto/mistralai/mistral-small-2603": { + "name": "Mistral Small 4", + "context": 256000, + "output": 256000, + "reasoning": true, + "tool_call": true, + "image": true, + "cost": { + "input": 0.1569, + "output": 0.6275, + "cache_read": 0.0157 + } + }, + "lowrouter/auto/mistralai/mistral-large-2512": { + "name": "Mistral Large 3", + "context": 262144, + "output": 262144, + "tool_call": true, + "image": true, + "cost": { + "input": 0.5229, + "output": 1.5688, + "cache_read": 0.0523 + } + }, + "lowrouter/auto/mistralai/ministral-14b-2512": { + "name": "Ministral 3 14B", + "context": 262144, + "output": 262144, + "tool_call": true, + "structured_output": true, + "image": true, + "cost": { + "input": 0.2092, + "output": 0.2092, + "cache_read": 0.0209 + } + }, + "lowrouter/auto/mistralai/ministral-3b-2512": { + "name": "Ministral 3 3B", + "context": 262144, + "output": 262144, + "tool_call": true, + "structured_output": true, + "image": true, + "cost": { + "input": 0.1046, + "output": 0.1046, + "cache_read": 0.0105 + } + }, + "lowrouter/auto/mistralai/codestral-2508": { + "name": "Codestral 25.08", + "context": 128000, + "output": 8192, + "tool_call": true, + "structured_output": true, + "cost": { + "input": 0.3138, + "output": 0.9413, + "cache_read": 0.0314 + } + }, "inference/meta/llama-3.1-8b-instruct": { "name": "Llama 3.1 8B Instruct", "context": 16000, @@ -32029,67 +31993,47 @@ "output": 0.44 } }, - "novita-ai/kwaipilot/kat-coder-pro": { - "name": "Kat Coder Pro", - "context": 256000, - "output": 128000, + "novita-ai/baai/bge-m3": { + "name": "BGE M3", + "context": 8192, + "cost": { + "input": 0.01, + "output": 0 + } + }, + "novita-ai/baai/bge-reranker-v2-m3": { + "name": "BGE Reranker V2 M3", + "context": 8000, + "cost": { + "input": 0.01, + "output": 0 + } + }, + "novita-ai/deepseek/deepseek-v4-flash-0731": { + "name": "DeepSeek V4 Flash 0731", + "context": 1048576, + "output": 393216, + "reasoning": true, "tool_call": true, "structured_output": true, + "cost": { + "input": 0.44, + "output": 1.32, + "cache_read": 0.028 + } + }, + "novita-ai/deepseek/deepseek-v4.1-flash": { + "name": "DeepSeek V4.1 Flash", + "context": 1048576, + "output": 393216, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true, "cost": { "input": 0.3, "output": 1.2, - "cache_read": 0.06 - } - }, - "novita-ai/deepseek/deepseek-prover-v2-671b": { - "name": "Deepseek Prover V2 671B", - "context": 160000, - "output": 160000, - "cost": { - "input": 0.7, - "output": 2.5 - } - }, - "novita-ai/deepseek/deepseek-r1-distill-qwen-14b": { - "name": "DeepSeek R1 Distill Qwen 14B", - "context": 32768, - "output": 16384, - "cost": { - "input": 0.15, - "output": 0.15 - } - }, - "novita-ai/deepseek/deepseek-v3-0324": { - "name": "DeepSeek V3 0324", - "context": 163840, - "output": 163840, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.27, - "output": 1.12, - "cache_read": 0.135 - } - }, - "novita-ai/deepseek/deepseek-r1-distill-llama-70b": { - "name": "DeepSeek R1 Distill LLama 70B", - "context": 8192, - "output": 8192, - "reasoning": true, - "structured_output": true, - "cost": { - "input": 0.8, - "output": 0.8 - } - }, - "novita-ai/deepseek/deepseek-v3-turbo": { - "name": "DeepSeek V3 (Turbo)\t", - "context": 64000, - "output": 16000, - "tool_call": true, - "cost": { - "input": 0.4, - "output": 1.3 + "cache_read": 0.006 } }, "novita-ai/deepseek/deepseek-r1-0528-qwen3-8b": { @@ -32102,21 +32046,8 @@ "output": 0.09 } }, - "novita-ai/deepseek/deepseek-v3.1-terminus": { - "name": "Deepseek V3.1 Terminus", - "context": 131072, - "output": 32768, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.27, - "output": 1, - "cache_read": 0.135 - } - }, "novita-ai/deepseek/deepseek-ocr-2": { - "name": "deepseek/deepseek-ocr-2", + "name": "DeepSeek OCR 2", "context": 8192, "output": 8192, "image": true, @@ -32125,60 +32056,39 @@ "output": 0.03 } }, - "novita-ai/deepseek/deepseek-ocr": { - "name": "DeepSeek-OCR", - "context": 8192, - "output": 8192, - "structured_output": true, - "image": true, - "cost": { - "input": 0.03, - "output": 0.03 - } - }, "novita-ai/deepseek/deepseek-r1-turbo": { - "name": "DeepSeek R1 (Turbo)\t", + "name": "DeepSeek R1 (Turbo)", "context": 64000, "output": 16000, "reasoning": true, "tool_call": true, + "structured_output": true, "cost": { "input": 0.7, "output": 2.5 } }, - "novita-ai/deepseek/deepseek-v3.2-exp": { - "name": "Deepseek V3.2 Exp", - "context": 163840, - "output": 65536, + "novita-ai/deepseek/deepseek-v4-pro-0813": { + "name": "DeepSeek V4 Pro 0813", + "context": 1048576, + "output": 393216, "reasoning": true, "tool_call": true, "structured_output": true, "cost": { - "input": 0.27, - "output": 0.41 + "input": 1.32, + "output": 3.96, + "cache_read": 0.044 } }, - "novita-ai/deepseek/deepseek-r1-distill-qwen-32b": { - "name": "DeepSeek R1 Distill Qwen 32B", + "novita-ai/deepseek/deepseek_v3": { + "name": "DeepSeek-V3", "context": 64000, - "output": 32000, - "cost": { - "input": 0.3, - "output": 0.3 - } - }, - "novita-ai/deepseek/deepseek-v3.1": { - "name": "DeepSeek V3.1", - "context": 131072, - "output": 32768, - "reasoning": true, + "output": 16000, "tool_call": true, - "structured_output": true, "cost": { - "input": 0.27, - "output": 1, - "cache_read": 0.135 + "input": 0.89, + "output": 0.89 } }, "novita-ai/deepseek/deepseek-v4-pro": { @@ -32207,133 +32117,127 @@ "cache_read": 0.35 } }, - "novita-ai/deepseek/deepseek-v3.2": { - "name": "Deepseek V3.2", - "context": 163840, - "output": 65536, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.269, - "output": 0.4, - "cache_read": 0.1345 - } - }, - "novita-ai/deepseek/deepseek-v4-flash": { - "name": "DeepSeek V4 Flash", - "context": 1048576, - "output": 393216, + "novita-ai/tencent/hy3": { + "name": "Hy3", + "context": 262144, + "output": 262144, "reasoning": true, "tool_call": true, "structured_output": true, "cost": { "input": 0.14, - "output": 0.28, - "cache_read": 0.028 + "output": 0.58, + "cache_read": 0.035 + } + }, + "novita-ai/tencent/hy4-preview": { + "name": "Hy4 preview", + "context": 1000000, + "output": 64000, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "cost": { + "input": 0.834, + "output": 2.501, + "cache_read": 0.042 } }, "novita-ai/meta-llama/llama-4-maverick-17b-128e-instruct-fp8": { - "name": "Llama 4 Maverick Instruct", + "name": "Llama 4 Maverick 17B Instruct", "context": 1048576, "output": 8192, + "tool_call": true, + "structured_output": true, "image": true, "cost": { "input": 0.27, "output": 0.85 } }, - "novita-ai/meta-llama/llama-3-70b-instruct": { - "name": "Llama3 70B Instruct", - "context": 8192, - "output": 8000, - "structured_output": true, - "cost": { - "input": 0.51, - "output": 0.74 - } - }, "novita-ai/meta-llama/llama-3.3-70b-instruct": { - "name": "Llama 3.3 70B Instruct", - "context": 131072, - "output": 120000, + "name": "Llama-3.3-70B-Instruct", + "context": 12288, + "output": 12288, "tool_call": true, + "structured_output": true, "cost": { "input": 0.135, "output": 0.4 } }, "novita-ai/meta-llama/llama-3.1-8b-instruct": { - "name": "Llama 3.1 8B Instruct", + "name": "Llama-3.1-8B-Instruct", "context": 16384, "output": 16384, + "tool_call": true, + "structured_output": true, "cost": { "input": 0.02, "output": 0.05 } }, + "novita-ai/meta-llama/llama-3.2-1b-instruct": { + "name": "Llama 3.2 1B Instruct", + "context": 131000, + "output": 32000, + "tool_call": true, + "structured_output": true, + "cost": { + "input": 0.02, + "output": 0.02 + } + }, "novita-ai/meta-llama/llama-4-scout-17b-16e-instruct": { - "name": "Llama 4 Scout Instruct", + "name": "Llama 4 Scout 17B Instruct", "context": 131072, "output": 131072, + "tool_call": true, "image": true, "cost": { "input": 0.18, "output": 0.59 } }, - "novita-ai/meta-llama/llama-3.2-3b-instruct": { - "name": "Llama 3.2 3B Instruct", - "context": 32768, - "output": 32000, - "cost": { - "input": 0.03, - "output": 0.05 - } - }, - "novita-ai/meta-llama/llama-3-8b-instruct": { - "name": "Llama 3 8B Instruct", - "context": 8192, - "output": 8192, - "cost": { - "input": 0.04, - "output": 0.04 - } - }, "novita-ai/nousresearch/hermes-2-pro-llama-3-8b": { "name": "Hermes 2 Pro Llama 3 8B", "context": 8192, "output": 8192, + "tool_call": true, "structured_output": true, "cost": { "input": 0.14, "output": 0.14 } }, - "novita-ai/xiaomimimo/mimo-v2-flash": { - "name": "XiaomiMiMo/MiMo-V2-Flash", - "context": 262144, - "output": 32000, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.1, - "output": 0.3, - "cache_read": 0.3 - } - }, - "novita-ai/xiaomimimo/mimo-v2-pro": { - "name": "MiMo-V2-Pro", + "novita-ai/xiaomimimo/mimo-v2.6-pro": { + "name": "MiMo-V2.6-Pro", "context": 1048576, "output": 131072, "reasoning": true, "tool_call": true, "structured_output": true, + "image": true, + "video": true, "cost": { - "input": 2, - "output": 6, - "cache_read": 0.4 + "input": 0.435, + "output": 0.87, + "cache_read": 0.0036 + } + }, + "novita-ai/xiaomimimo/mimo-v2.5": { + "name": "MiMo-V2.5", + "context": 1048576, + "output": 131072, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true, + "video": true, + "cost": { + "input": 0.168, + "output": 0.336, + "cache_read": 0.0034 } }, "novita-ai/xiaomimimo/mimo-v2.5-pro": { @@ -32349,40 +32253,19 @@ "cache_read": 0.0043 } }, - "novita-ai/baidu/ernie-4.5-vl-28b-a3b": { - "name": "ERNIE 4.5 VL 28B A3B", - "context": 30000, - "output": 8000, - "reasoning": true, - "tool_call": true, - "image": true, - "cost": { - "input": 0.14, - "output": 0.56 - } - }, - "novita-ai/baidu/ernie-4.5-vl-28b-a3b-thinking": { - "name": "ERNIE-4.5-VL-28B-A3B-Thinking", - "context": 131072, - "output": 65536, + "novita-ai/xiaomimimo/mimo-v2.6-flash": { + "name": "MiMo-V2.6-Flash", + "context": 1048576, + "output": 131072, "reasoning": true, "tool_call": true, "structured_output": true, "image": true, "video": true, "cost": { - "input": 0.39, - "output": 0.39 - } - }, - "novita-ai/baidu/ernie-4.5-21B-a3b-thinking": { - "name": "ERNIE-4.5-21B-A3B-Thinking", - "context": 131072, - "output": 65536, - "reasoning": true, - "cost": { - "input": 0.07, - "output": 0.28 + "input": 0.14, + "output": 0.28, + "cache_read": 0.0028 } }, "novita-ai/baidu/ernie-4.5-21B-a3b": { @@ -32395,29 +32278,20 @@ "output": 0.28 } }, - "novita-ai/baidu/ernie-4.5-vl-424b-a47b": { - "name": "ERNIE 4.5 VL 424B A47B", - "context": 123000, - "output": 16000, + "novita-ai/baidu/cobuddy": { + "name": "CoBuddy", + "context": 131072, + "output": 65536, "reasoning": true, - "image": true, - "cost": { - "input": 0.42, - "output": 1.25 - } - }, - "novita-ai/baidu/ernie-4.5-300b-a47b-paddle": { - "name": "ERNIE 4.5 300B A47B", - "context": 123000, - "output": 12000, - "structured_output": true, + "tool_call": true, "cost": { "input": 0.28, - "output": 1.1 + "output": 1.13, + "cache_read": 0.07 } }, "novita-ai/google/gemma-4-31b-it": { - "name": "Gemma 4 31B", + "name": "Gemma 4 31B IT", "context": 262144, "output": 131072, "reasoning": true, @@ -32430,9 +32304,10 @@ } }, "novita-ai/google/gemma-3-27b-it": { - "name": "Gemma 3 27B", + "name": "Gemma 3 27B IT", "context": 98304, "output": 16384, + "tool_call": true, "image": true, "cost": { "input": 0.119, @@ -32440,7 +32315,7 @@ } }, "novita-ai/google/gemma-4-26b-a4b-it": { - "name": "Gemma 4 26B A4B", + "name": "Gemma 4 26B A4B IT", "context": 262144, "output": 131072, "reasoning": true, @@ -32453,9 +32328,10 @@ } }, "novita-ai/google/gemma-3-12b-it": { - "name": "Gemma 3 12B", + "name": "Gemma 3 12B IT", "context": 131072, "output": 8192, + "tool_call": true, "image": true, "cost": { "input": 0.05, @@ -32463,61 +32339,76 @@ } }, "novita-ai/minimaxai/minimax-m1-80k": { - "name": "MiniMax M1", + "name": "MiniMax M1 80K", "context": 1000000, "output": 40000, "reasoning": true, "tool_call": true, + "structured_output": true, "cost": { "input": 0.55, "output": 2.2 } }, - "novita-ai/mistralai/mistral-nemo": { - "name": "Mistral Nemo", - "context": 60288, - "output": 16000, - "structured_output": true, - "cost": { - "input": 0.04, - "output": 0.17 - } - }, - "novita-ai/inclusionai/ring-2.6-1t": { - "name": "Ring-2.6-1T", + "novita-ai/inclusionai/ling-3.0-flash": { + "name": "Ling 3.0 Flash", "context": 262144, - "output": 65536, + "output": 32768, "reasoning": true, "tool_call": true, - "structured_output": true, "cost": { - "input": 0.3, - "output": 2.5, - "cache_read": 0.06 + "input": 0.06, + "output": 0.18, + "cache_read": 0.012 } }, - "novita-ai/inclusionai/ling-2.6-1t": { - "name": "Ling-2.6-1T", + "novita-ai/inclusionai/ling-3.1-flash": { + "name": "Ling 3.1 Flash", "context": 262144, "output": 32768, + "reasoning": true, "tool_call": true, - "structured_output": true, "cost": { - "input": 0.3, - "output": 2.5, - "cache_read": 0.06 + "input": 0, + "output": 0 } }, - "novita-ai/inclusionai/ling-2.6-flash": { - "name": "Ling-2.6-flash", + "novita-ai/inclusionai/ling-3.0-flash-sante": { + "name": "Ling 3.0 Flash Sante", "context": 262144, "output": 32768, + "reasoning": true, "tool_call": true, - "structured_output": true, "cost": { - "input": 0.1, - "output": 0.3, - "cache_read": 0.02 + "input": 0.075, + "output": 0.22, + "cache_read": 0.015 + } + }, + "novita-ai/inclusionai/ling-3.0-flash-vl": { + "name": "Ling 3.0 Flash VL", + "context": 262144, + "output": 32768, + "reasoning": true, + "tool_call": true, + "image": true, + "video": true, + "cost": { + "input": 0.075, + "output": 0.22, + "cache_read": 0.015 + } + }, + "novita-ai/inclusionai/ling-3.0-flash-fin": { + "name": "Ling 3.0 Flash Fin", + "context": 262144, + "output": 32768, + "reasoning": true, + "tool_call": true, + "cost": { + "input": 0.075, + "output": 0.22, + "cache_read": 0.015 } }, "novita-ai/moonshotai/kimi-k3": { @@ -32581,7 +32472,7 @@ "novita-ai/moonshotai/kimi-k2-instruct": { "name": "Kimi K2 Instruct", "context": 131072, - "output": 32768, + "output": 98304, "tool_call": true, "cost": { "input": 0.57, @@ -32589,7 +32480,7 @@ } }, "novita-ai/moonshotai/kimi-k2-0905": { - "name": "Kimi K2 0905", + "name": "Kimi K2 Instruct 0905", "context": 262144, "output": 98304, "tool_call": true, @@ -32615,7 +32506,7 @@ } }, "novita-ai/zai-org/glm-4.6v": { - "name": "GLM 4.6V", + "name": "GLM-4.6V", "context": 131072, "output": 32768, "reasoning": true, @@ -32629,20 +32520,23 @@ "cache_read": 0.055 } }, - "novita-ai/zai-org/glm-4.5": { - "name": "GLM-4.5", - "context": 131072, - "output": 98304, + "novita-ai/zai-org/glm-5.3-flash": { + "name": "GLM-5.3-Flash", + "context": 1048576, + "output": 131072, "reasoning": true, "tool_call": true, + "structured_output": true, + "image": true, + "video": true, "cost": { - "input": 0.6, - "output": 2.2, - "cache_read": 0.11 + "input": 0.15, + "output": 0.5, + "cache_read": 0.03 } }, "novita-ai/zai-org/glm-4.6": { - "name": "GLM 4.6", + "name": "GLM-4.6", "context": 204800, "output": 131072, "reasoning": true, @@ -32668,7 +32562,7 @@ } }, "novita-ai/zai-org/glm-4.5v": { - "name": "GLM 4.5V", + "name": "GLM-4.5V", "context": 65536, "output": 16384, "reasoning": true, @@ -32735,7 +32629,7 @@ } }, "novita-ai/zai-org/autoglm-phone-9b-multilingual": { - "name": "AutoGLM-Phone-9B-Multilingual", + "name": "AutoGLM Phone 9B Multilingual", "context": 65536, "output": 65536, "image": true, @@ -32745,7 +32639,7 @@ } }, "novita-ai/zai-org/glm-4.5-air": { - "name": "GLM 4.5 Air", + "name": "GLM-4.5-Air", "context": 131072, "output": 98304, "reasoning": true, @@ -32756,8 +32650,45 @@ "cache_read": 0.025 } }, + "novita-ai/zai-org/glm-5.3": { + "name": "GLM-5.3", + "context": 1048576, + "output": 131072, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "cost": { + "input": 1.4, + "output": 4.4, + "cache_read": 0.26 + } + }, + "novita-ai/apodex/apodex-1.1-mini": { + "name": "Apodex 1.1 Mini", + "context": 262144, + "output": 262144, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "cost": { + "input": 0, + "output": 0 + } + }, + "novita-ai/nvidia/nemotron-3-nano-30b-a3b": { + "name": "Nemotron 3 Nano 30B A3B", + "context": 262144, + "output": 32768, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "cost": { + "input": 0.05, + "output": 0.2 + } + }, "novita-ai/gryphe/mythomax-l2-13b": { - "name": "Mythomax L2 13B", + "name": "MythoMax L2 13B", "context": 4096, "output": 3200, "cost": { @@ -32766,9 +32697,9 @@ } }, "novita-ai/minimax/minimax-m2.5": { - "name": "MiniMax M2.5", + "name": "MiniMax-M2.5", "context": 204800, - "output": 131072, + "output": 131100, "reasoning": true, "tool_call": true, "structured_output": true, @@ -32779,7 +32710,7 @@ } }, "novita-ai/minimax/minimax-m2.7": { - "name": "MiniMax M2.7", + "name": "MiniMax-M2.7", "context": 204800, "output": 131072, "reasoning": true, @@ -32791,6 +32722,21 @@ "cache_read": 0.06 } }, + "novita-ai/minimax/minimax-m3": { + "name": "MiniMax-M3", + "context": 1000000, + "output": 131072, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true, + "video": true, + "cost": { + "input": 0.3, + "output": 1.2, + "cache_read": 0.06 + } + }, "novita-ai/minimax/minimax-m2.7-highspeed": { "name": "MiniMax-M2.7-highspeed", "context": 204800, @@ -32805,45 +32751,8 @@ "cache_write": 0.375 } }, - "novita-ai/minimax/minimax-m2.5-highspeed": { - "name": "MiniMax M2.5 Highspeed", - "context": 204800, - "output": 131072, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.6, - "output": 2.4, - "cache_read": 0.03 - } - }, - "novita-ai/minimax/minimax-m2.1": { - "name": "Minimax M2.1", - "context": 204800, - "output": 131072, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.3, - "output": 1.2, - "cache_read": 0.03 - } - }, - "novita-ai/minimax/minimax-m2": { - "name": "MiniMax-M2", - "context": 204800, - "output": 131072, - "reasoning": true, - "tool_call": true, - "cost": { - "input": 0.3, - "output": 1.2, - "cache_read": 0.03 - } - }, "novita-ai/paddlepaddle/paddleocr-vl": { - "name": "PaddleOCR-VL", + "name": "PaddleOCR VL", "context": 16384, "output": 16384, "image": true, @@ -32852,21 +32761,47 @@ "output": 0.02 } }, - "novita-ai/qwen/qwen3-vl-235b-a22b-instruct": { - "name": "Qwen3 VL 235B A22B Instruct", - "context": 131072, - "output": 32768, + "novita-ai/stepfun/step-3.7-flash": { + "name": "Step 3.7 Flash", + "context": 262144, + "output": 256000, + "reasoning": true, "tool_call": true, "structured_output": true, "image": true, "video": true, "cost": { - "input": 0.3, - "output": 1.5 + "input": 0.2, + "output": 1.15, + "cache_read": 0.04 + } + }, + "novita-ai/mindai/macaron-v1-tall": { + "name": "Macaron V1 Tall", + "context": 262144, + "output": 32768, + "reasoning": true, + "tool_call": true, + "cost": { + "input": 0.2475, + "output": 1.43, + "cache_read": 0.044 + } + }, + "novita-ai/mindai/macaron-v1-venti": { + "name": "Macaron V1 Venti", + "context": 1048576, + "output": 131072, + "reasoning": true, + "tool_call": true, + "cost": { + "input": 0.825, + "output": 2.475, + "cache_read": 0.165 } }, "novita-ai/qwen/qwen3.7-max": { - "name": "Qwen3.7-Max", + "name": "Qwen3.7 Max", "context": 1000000, "output": 65536, "reasoning": true, @@ -32875,24 +32810,39 @@ "cost": { "input": 1.25, "output": 3.75, - "cache_read": 0.25, - "cache_write": 1.5625 + "cache_read": 0.25 } }, - "novita-ai/qwen/qwen3-vl-235b-a22b-thinking": { - "name": "Qwen3 VL 235B A22B Thinking", - "context": 131072, - "output": 32768, + "novita-ai/qwen/qwen3.8-27b": { + "name": "Qwen3.8 27B", + "context": 1000000, + "output": 131072, "reasoning": true, + "tool_call": true, + "structured_output": true, "image": true, "video": true, "cost": { - "input": 0.98, - "output": 3.95 + "input": 0.42, + "output": 3, + "cache_read": 0.085 + } + }, + "novita-ai/qwen/qwen3.8-2.4t-a95b": { + "name": "Qwen3.8 2.4T A95B", + "context": 1000000, + "output": 131072, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "cost": { + "input": 2, + "output": 6, + "cache_read": 0.25 } }, "novita-ai/qwen/qwen3.5-27b": { - "name": "Qwen3.5-27B", + "name": "Qwen3.5 27B", "context": 262144, "output": 65536, "reasoning": true, @@ -32905,51 +32855,19 @@ "output": 2.4 } }, - "novita-ai/qwen/qwen3-235b-a22b-instruct-2507": { - "name": "Qwen3 235B A22B Instruct 2507", - "context": 131072, - "output": 16384, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.09, - "output": 0.58 - } - }, - "novita-ai/qwen/qwen3-next-80b-a3b-thinking": { - "name": "Qwen3 Next 80B A3B Thinking", - "context": 131072, - "output": 32768, + "novita-ai/qwen/qwen3.8-max": { + "name": "Qwen3.8 Max", + "context": 1000000, + "output": 131072, "reasoning": true, "tool_call": true, "structured_output": true, - "cost": { - "input": 0.15, - "output": 1.5 - } - }, - "novita-ai/qwen/qwen3-coder-next": { - "name": "Qwen3 Coder Next", - "context": 262144, - "output": 65536, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.2, - "output": 1.5 - } - }, - "novita-ai/qwen/qwen3-omni-30b-a3b-instruct": { - "name": "Qwen3 Omni 30B A3B Instruct", - "context": 65536, - "output": 16384, - "tool_call": true, - "structured_output": true, "image": true, "video": true, "cost": { - "input": 0.25, - "output": 0.97 + "input": 2, + "output": 6, + "cache_read": 0.25 } }, "novita-ai/qwen/qwen3-omni-30b-a3b-thinking": { @@ -32966,51 +32884,16 @@ "output": 0.97 } }, - "novita-ai/qwen/qwen3-max": { - "name": "Qwen3 Max", - "context": 262144, - "output": 65536, - "tool_call": true, - "structured_output": true, + "novita-ai/qwen/qwen3-reranker-8b": { + "name": "Qwen3 Reranker 8B", + "context": 32768, "cost": { - "input": 2.11, - "output": 8.45 - } - }, - "novita-ai/qwen/qwen3-235b-a22b-fp8": { - "name": "Qwen3 235B A22B", - "context": 40960, - "output": 20000, - "reasoning": true, - "cost": { - "input": 0.2, - "output": 0.8 - } - }, - "novita-ai/qwen/qwen3-coder-480b-a35b-instruct": { - "name": "Qwen3 Coder 480B A35B Instruct", - "context": 262144, - "output": 65536, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.38, - "output": 1.55 - } - }, - "novita-ai/qwen/qwen3-coder-30b-a3b-instruct": { - "name": "Qwen3 Coder 30b A3B Instruct", - "context": 160000, - "output": 32768, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.07, - "output": 0.27 + "input": 0.05, + "output": 0 } }, "novita-ai/qwen/qwen3-vl-30b-a3b-instruct": { - "name": "qwen/qwen3-vl-30b-a3b-instruct", + "name": "Qwen3 VL 30B A3B Instruct", "context": 131072, "output": 32768, "tool_call": true, @@ -33022,30 +32905,8 @@ "output": 0.7 } }, - "novita-ai/qwen/qwen3-235b-a22b-thinking-2507": { - "name": "Qwen3 235B A22b Thinking 2507", - "context": 131072, - "output": 32768, - "reasoning": true, - "tool_call": true, - "cost": { - "input": 0.3, - "output": 3 - } - }, - "novita-ai/qwen/qwen2.5-7b-instruct": { - "name": "Qwen2.5 7B Instruct", - "context": 32000, - "output": 32000, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.07, - "output": 0.07 - } - }, "novita-ai/qwen/qwen3.5-122b-a10b": { - "name": "Qwen3.5-122B-A10B", + "name": "Qwen3.5 122B-A10B", "context": 262144, "output": 65536, "reasoning": true, @@ -33058,38 +32919,18 @@ "output": 3.2 } }, - "novita-ai/qwen/qwen3-30b-a3b-fp8": { - "name": "Qwen3 30B A3B", - "context": 40960, - "output": 20000, + "novita-ai/qwen/qwen3.6-35b-a3b": { + "name": "Qwen3.6 35B-A3B", + "context": 262144, + "output": 65536, "reasoning": true, - "cost": { - "input": 0.09, - "output": 0.45 - } - }, - "novita-ai/qwen/qwen3-next-80b-a3b-instruct": { - "name": "Qwen3 Next 80B A3B Instruct", - "context": 131072, - "output": 32768, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.15, - "output": 1.5 - } - }, - "novita-ai/qwen/qwen3-vl-30b-a3b-thinking": { - "name": "qwen/qwen3-vl-30b-a3b-thinking", - "context": 131072, - "output": 32768, "tool_call": true, "structured_output": true, "image": true, "video": true, "cost": { - "input": 0.2, - "output": 1 + "input": 0.248, + "output": 1.485 } }, "novita-ai/qwen/qwen-mt-plus": { @@ -33101,28 +32942,31 @@ "output": 0.75 } }, - "novita-ai/qwen/qwen3-32b-fp8": { - "name": "Qwen3 32B", - "context": 40960, - "output": 20000, + "novita-ai/qwen/qwen3.8-flash": { + "name": "Qwen3.8 Flash", + "context": 1000000, + "output": 131072, "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true, + "video": true, "cost": { - "input": 0.1, - "output": 0.45 + "input": 0.15, + "output": 0.47, + "cache_read": 0.016 } }, - "novita-ai/qwen/qwen3-8b-fp8": { - "name": "Qwen3 8B", - "context": 128000, - "output": 20000, - "reasoning": true, + "novita-ai/qwen/qwen3-embedding-8b": { + "name": "Qwen3 Embedding 8B", + "context": 32768, "cost": { - "input": 0.035, - "output": 0.138 + "input": 0.07, + "output": 0 } }, "novita-ai/qwen/qwen3.5-35b-a3b": { - "name": "Qwen3.5-35B-A3B", + "name": "Qwen3.5 35B-A3B", "context": 262144, "output": 65536, "reasoning": true, @@ -33136,9 +32980,9 @@ } }, "novita-ai/qwen/qwen3.5-397b-a17b": { - "name": "Qwen3.5-397B-A17B", + "name": "Qwen3.5 397B-A17B", "context": 262144, - "output": 64000, + "output": 65536, "reasoning": true, "tool_call": true, "structured_output": true, @@ -33149,134 +32993,52 @@ "output": 3.6 } }, - "novita-ai/qwen/qwen3-vl-8b-instruct": { - "name": "qwen/qwen3-vl-8b-instruct", - "context": 131072, - "output": 32768, - "tool_call": true, - "structured_output": true, - "image": true, - "video": true, - "cost": { - "input": 0.08, - "output": 0.5 - } - }, - "novita-ai/qwen/qwen2.5-vl-72b-instruct": { - "name": "Qwen2.5 VL 72B Instruct", - "context": 32768, - "output": 32768, - "image": true, - "video": true, - "cost": { - "input": 0.8, - "output": 0.8 - } - }, - "novita-ai/qwen/qwen-2.5-72b-instruct": { - "name": "Qwen 2.5 72B Instruct", - "context": 32000, - "output": 8192, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.38, - "output": 0.4 - } - }, - "novita-ai/qwen/qwen3-4b-fp8": { - "name": "Qwen3 4B", - "context": 128000, - "output": 20000, + "novita-ai/qwen/qwen3.6-27b": { + "name": "Qwen3.6 27B", + "context": 262144, + "output": 65536, "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true, + "video": true, "cost": { - "input": 0.03, - "output": 0.03 + "input": 0.6, + "output": 3.6 } }, "novita-ai/baichuan/baichuan-m2-32b": { - "name": "baichuan-m2-32b", + "name": "Baichuan M2 32B", "context": 131072, "output": 131072, + "reasoning": true, "cost": { "input": 0.07, "output": 0.07 } }, - "novita-ai/openai/gpt-oss-20b": { - "name": "OpenAI: GPT OSS 20B", - "context": 131072, - "output": 32768, - "reasoning": true, - "structured_output": true, - "image": true, - "cost": { - "input": 0.04, - "output": 0.15 - } - }, "novita-ai/openai/gpt-oss-120b": { - "name": "OpenAI GPT OSS 120B", + "name": "GPT OSS 120B", "context": 131072, "output": 32768, "reasoning": true, "tool_call": true, "structured_output": true, - "image": true, "cost": { "input": 0.05, "output": 0.25 } }, "novita-ai/microsoft/wizardlm-2-8x22b": { - "name": "Wizardlm 2 8x22B", + "name": "WizardLM 2 8x22B", "context": 65535, "output": 8000, + "structured_output": true, "cost": { "input": 0.62, "output": 0.62 } }, - "novita-ai/sao10K/l3-70b-euryale-v2.1": { - "name": "L3 70B Euryale V2.1\t", - "context": 8192, - "output": 8192, - "tool_call": true, - "cost": { - "input": 1.48, - "output": 1.48 - } - }, - "novita-ai/sao10K/L3-8B-stheno-v3.2": { - "name": "L3 8B Stheno V3.2", - "context": 8192, - "output": 32000, - "tool_call": true, - "cost": { - "input": 0.05, - "output": 0.05 - } - }, - "novita-ai/sao10K/l3-8b-lunaris": { - "name": "Sao10k L3 8B Lunaris\t", - "context": 8192, - "output": 8192, - "structured_output": true, - "cost": { - "input": 0.05, - "output": 0.05 - } - }, - "novita-ai/sao10K/l31-70b-euryale-v2.2": { - "name": "L31 70B Euryale V2.2", - "context": 8192, - "output": 8192, - "tool_call": true, - "cost": { - "input": 1.48, - "output": 1.48 - } - }, "302ai/grok-4-1-fast-reasoning": { "name": "grok-4-1-fast-reasoning", "context": 2000000, @@ -34900,8 +34662,8 @@ "image": true, "video": true, "cost": { - "input": 0.49, - "output": 13, + "input": 0.33, + "output": 14.89, "cache_read": 0.3 } }, @@ -35318,9 +35080,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.0079, + "input": 0.0099, "output": 1.28, - "cache_read": 0.0079 + "cache_read": 0.0099 } }, "openrouter/deepseek/deepseek-v4.1-flash": { @@ -35382,9 +35144,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 1.32, - "output": 3.96, - "cache_read": 0.044 + "input": 0.66, + "output": 1.98, + "cache_read": 0.022 } }, "openrouter/deepseek/deepseek-v3.2-exp": { @@ -35430,13 +35192,13 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.95526, - "output": 1.91052, - "cache_read": 0.079605 + "input": 0.9483, + "output": 1.8966, + "cache_read": 0.079025 } }, "openrouter/deepseek/deepseek-r1-0528": { - "name": "R1 0528", + "name": "DeepSeek R1 0528", "context": 163840, "output": 32768, "reasoning": true, @@ -35457,8 +35219,8 @@ "structured_output": true, "cost": { "input": 0.259, - "output": 0.42, - "cache_read": 0.135 + "output": 0.8, + "cache_read": 0.14 } }, "openrouter/deepseek/deepseek-v4-flash": { @@ -35469,9 +35231,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.0075, + "input": 0.0182, "output": 1.28, - "cache_read": 0.0075 + "cache_read": 0.0182 } }, "openrouter/unbiased/pareto-26.10-preview": { @@ -35804,14 +35566,14 @@ "openrouter/z-ai/glm-4.6": { "name": "GLM-4.6", "context": 204800, - "output": 16384, + "output": 131072, "reasoning": true, "tool_call": true, "structured_output": true, "cost": { - "input": 0.43, - "output": 1.75, - "cache_read": 0.08 + "input": 0.5, + "output": 2, + "cache_read": 0.1 } }, "openrouter/z-ai/glm-5": { @@ -35888,7 +35650,7 @@ "structured_output": true, "cost": { "input": 0.06, - "output": 4.2, + "output": 7, "cache_read": 0.059 } }, @@ -36239,29 +36001,29 @@ "openrouter/~z-ai/glm-flash-latest": { "name": "GLM Flash Latest", "context": 1048576, - "output": 943718, + "output": 131072, "reasoning": true, "tool_call": true, "structured_output": true, "image": true, "video": true, "cost": { - "input": 0.032, - "output": 1.041434, - "cache_read": 0.02 + "input": 0.04, + "output": 0.5, + "cache_read": 0.0125 } }, "openrouter/~z-ai/glm-latest": { "name": "GLM Latest", "context": 1048576, - "output": 131072, + "output": 943718, "reasoning": true, "tool_call": true, "structured_output": true, "cost": { - "input": 0.0312, - "output": 4.4, - "cache_read": 0.029 + "input": 0.039, + "output": 4.8, + "cache_read": 0.038 } }, "openrouter/arcee-ai/trinity-large-thinking": { @@ -36596,22 +36358,22 @@ "structured_output": true, "image": true, "cost": { - "input": 0.016, - "output": 1.2, - "cache_read": 0.01 + "input": 0.0001, + "output": 0.6, + "cache_read": 0.005 } }, "openrouter/~deepseek/deepseek-pro-latest": { "name": "DeepSeek Pro Latest", "context": 1048576, - "output": 393216, + "output": 943718, "reasoning": true, "tool_call": true, "structured_output": true, "cost": { - "input": 0.198, - "output": 8, - "cache_read": 0.2 + "input": 0.3, + "output": 5, + "cache_read": 0.219 } }, "openrouter/~deepseek/deepseek-v4-flash-latest": { @@ -36622,9 +36384,9 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.00632, - "output": 0.1086, - "cache_read": 0.00632 + "input": 0.0099, + "output": 1.28, + "cache_read": 0.0099 } }, "openrouter/~x-ai/grok-latest": { @@ -36790,9 +36552,9 @@ "image": true, "video": true, "cost": { - "input": 0.09, - "output": 0.3, - "cache_read": 0.05 + "input": 0.0675, + "output": 0.225, + "cache_read": 0.0375 } }, "openrouter/google/gemini-3-pro-image-preview": { @@ -37505,7 +37267,6 @@ "output": 32768, "reasoning": true, "tool_call": true, - "structured_output": true, "cost": { "input": 0.042, "output": 0.1232, @@ -37522,9 +37283,9 @@ "image": true, "video": true, "cost": { - "input": 0.5, - "output": 12, - "cache_read": 0.3 + "input": 0.64, + "output": 13.5, + "cache_read": 0.28 } }, "openrouter/moonshotai/kimi-k2.6": { @@ -37538,19 +37299,20 @@ "cost": { "input": 0.465, "output": 2.45, - "cache_read": 0.0975 + "cache_read": 0.0875 } }, "openrouter/moonshotai/kimi-k2-thinking": { "name": "Kimi K2 Thinking", "context": 262144, - "output": 235929, + "output": 98304, "reasoning": true, "tool_call": true, "structured_output": true, "cost": { "input": 0.6, - "output": 2.5 + "output": 2.5, + "cache_read": 0.15 } }, "openrouter/moonshotai/kimi-k2.5": { @@ -37562,13 +37324,13 @@ "structured_output": true, "image": true, "cost": { - "input": 0.45, - "output": 2.25, - "cache_read": 0.07 + "input": 0.5, + "output": 2.5, + "cache_read": 0.15 } }, "openrouter/moonshotai/kimi-k2-0905": { - "name": "Kimi K2 0905", + "name": "Kimi K2 Instruct 0905", "context": 262144, "output": 98304, "tool_call": true, @@ -37664,14 +37426,14 @@ "openrouter/nvidia/nemotron-3.5-lightning": { "name": "Nemotron 3.5 Lightning 30B A3B", "context": 262144, - "output": 131072, + "output": 235929, "reasoning": true, "tool_call": true, "structured_output": true, "cost": { - "input": 0.0469, - "output": 0.134, - "cache_read": 0.02345 + "input": 0.07, + "output": 0.2, + "cache_read": 0.04 } }, "openrouter/nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free": { @@ -38233,19 +37995,6 @@ "cache_write": 0.53125 } }, - "openrouter/qwen/qwen3-vl-235b-a22b-thinking": { - "name": "Qwen3 VL 235B A22B Thinking", - "context": 131072, - "output": 32768, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "image": true, - "cost": { - "input": 0.4, - "output": 4 - } - }, "openrouter/qwen/qwen3.8-2.4t-a95b": { "name": "Qwen3.8 2.4T A95B", "context": 1048576, @@ -38276,7 +38025,7 @@ "openrouter/qwen/qwen3-next-80b-a3b-thinking": { "name": "Qwen3-Next 80B-A3B (Thinking)", "context": 262144, - "output": 32768, + "output": 235929, "reasoning": true, "tool_call": true, "structured_output": true, @@ -38349,19 +38098,6 @@ "cache_write": 0.038 } }, - "openrouter/qwen/qwen3-max": { - "name": "Qwen3 Max", - "context": 262144, - "output": 65536, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.78, - "output": 3.9, - "cache_read": 0.156, - "cache_write": 0.975 - } - }, "openrouter/qwen/qwen3-coder-30b-a3b-instruct": { "name": "Qwen3-Coder 30B-A3B Instruct", "context": 262144, @@ -38402,24 +38138,13 @@ }, "openrouter/qwen/qwen3-235b-a22b-thinking-2507": { "name": "Qwen3 235B A22B Thinking 2507", - "context": 131072, - "output": 117964, + "context": 128000, + "output": 16384, "reasoning": true, "tool_call": true, "cost": { - "input": 0.23, - "output": 2.3 - } - }, - "openrouter/qwen/qwen3-235b-a22b": { - "name": "Qwen3 235B-A22B", - "context": 131072, - "output": 8192, - "reasoning": true, - "tool_call": true, - "cost": { - "input": 0.455, - "output": 1.82 + "input": 0.45, + "output": 3.5 } }, "openrouter/qwen/qwen3.5-122b-a10b": { @@ -38436,17 +38161,6 @@ "output": 2.08 } }, - "openrouter/qwen/qwen-plus-2025-07-28": { - "name": "Qwen Plus 0728", - "context": 1000000, - "output": 32768, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.26, - "output": 0.78 - } - }, "openrouter/qwen/qwen3.6-35b-a3b": { "name": "Qwen3.6 35B-A3B", "context": 262144, @@ -38477,14 +38191,14 @@ "openrouter/qwen/qwen3-vl-30b-a3b-thinking": { "name": "Qwen3 VL 30B A3B Thinking", "context": 262144, - "output": 32768, + "output": 235929, "reasoning": true, "tool_call": true, "structured_output": true, "image": true, "cost": { - "input": 0.2, - "output": 2.4 + "input": 0.29, + "output": 1 } }, "openrouter/qwen/qwen3.6-flash": { @@ -38537,31 +38251,6 @@ "output": 0.26 } }, - "openrouter/qwen/qwen3-max-thinking": { - "name": "Qwen3 Max Thinking", - "context": 262144, - "output": 65536, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.78, - "output": 3.9 - } - }, - "openrouter/qwen/qwen3-coder-plus": { - "name": "Qwen3 Coder Plus", - "context": 1000000, - "output": 65536, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.65, - "output": 3.25, - "cache_read": 0.13, - "cache_write": 0.8125 - } - }, "openrouter/qwen/qwen3.5-9b": { "name": "Qwen3.5 9B", "context": 262144, @@ -38618,8 +38307,7 @@ "cost": { "input": 0.15, "output": 0.47, - "cache_read": 0.016, - "cache_write": 0.2 + "cache_read": 0.016 } }, "openrouter/qwen/qwen3.5-35b-a3b": { @@ -38637,22 +38325,9 @@ "cache_read": 0.04 } }, - "openrouter/qwen/qwen3.6-max-preview": { - "name": "Qwen3.6 Max Preview", - "context": 262144, - "output": 65536, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 1.027, - "output": 6.162, - "cache_write": 1.28375 - } - }, "openrouter/qwen/qwen3-30b-a3b": { "name": "Qwen3 30B A3B", - "context": 131072, + "context": 40960, "output": 16384, "reasoning": true, "tool_call": true, @@ -38677,39 +38352,17 @@ "cache_read": 0.225 } }, - "openrouter/qwen/qwen3-8b": { - "name": "Qwen3 8B", - "context": 131072, - "output": 8192, - "reasoning": true, - "tool_call": true, - "cost": { - "input": 0.117, - "output": 0.455 - } - }, - "openrouter/qwen/qwen3-vl-32b-instruct": { - "name": "Qwen3 VL 32B Instruct", - "context": 131072, - "output": 32768, - "tool_call": true, - "structured_output": true, - "image": true, - "cost": { - "input": 0.104, - "output": 0.416 - } - }, "openrouter/qwen/qwen3-vl-8b-instruct": { "name": "Qwen3 VL 8B Instruct", "context": 262144, - "output": 32768, + "output": 235929, "tool_call": true, "structured_output": true, "image": true, "cost": { - "input": 0.117, - "output": 0.455 + "input": 0.25, + "output": 0.75, + "cache_read": 0.12 } }, "openrouter/qwen/qwen3-30b-a3b-instruct-2507": { @@ -38771,29 +38424,18 @@ "output": 0.4 } }, - "openrouter/qwen/qwen3-30b-a3b-thinking-2507": { - "name": "Qwen3 30B A3B Thinking 2507", - "context": 81920, - "output": 32768, - "reasoning": true, - "tool_call": true, - "cost": { - "input": 0.2, - "output": 2.4 - } - }, "openrouter/qwen/qwen3.6-27b": { "name": "Qwen3.6 27B", "context": 262144, - "output": 65536, + "output": 81920, "reasoning": true, "tool_call": true, "structured_output": true, "image": true, "video": true, "cost": { - "input": 0.45, - "output": 2.7 + "input": 0.32, + "output": 3.2 } }, "openrouter/qwen/qwen3.6-plus": { @@ -38813,7 +38455,7 @@ }, "openrouter/qwen/qwen3-14b": { "name": "Qwen3 14B", - "context": 131072, + "context": 40960, "output": 16384, "reasoning": true, "tool_call": true, @@ -38823,19 +38465,6 @@ "output": 0.24 } }, - "openrouter/qwen/qwen3-vl-8b-thinking": { - "name": "Qwen3 VL 8B Thinking", - "context": 131072, - "output": 32768, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "image": true, - "cost": { - "input": 0.18, - "output": 2.1 - } - }, "openrouter/qwen/qwen3.7-plus": { "name": "Qwen3.7 Plus", "context": 1000000, @@ -38863,8 +38492,7 @@ "cost": { "input": 2, "output": 6, - "cache_read": 0.25, - "cache_write": 2.5 + "cache_read": 0.25 } }, "openrouter/morph/morph-v3-large": { @@ -48924,6 +48552,18 @@ "output": 1.5 } }, + "huggingface/Qwen/Qwen3-VL-30B-A3B-Instruct": { + "name": "Qwen3 VL 30B A3B Instruct", + "context": 131072, + "output": 32768, + "tool_call": true, + "structured_output": true, + "image": true, + "cost": { + "input": 0.2, + "output": 0.7 + } + }, "huggingface/Qwen/Qwen3-VL-235B-A22B-Thinking": { "name": "Qwen3 VL 235B A22B Thinking", "context": 131072, @@ -49326,6 +48966,17 @@ "output": 1.2 } }, + "huggingface/MiniMaxAI/MiniMax-M1-80k": { + "name": "MiniMax M1 80K", + "context": 1000000, + "output": 80000, + "reasoning": true, + "tool_call": true, + "cost": { + "input": 0.55, + "output": 2.2 + } + }, "huggingface/MiniMaxAI/MiniMax-M2.1": { "name": "MiniMax-M2.1", "context": 204800, @@ -49566,6 +49217,16 @@ "output": 2.2 } }, + "huggingface/zai-org/AutoGLM-Phone-9B-Multilingual": { + "name": "AutoGLM Phone 9B Multilingual", + "context": 65536, + "output": 65536, + "image": true, + "cost": { + "input": 0.035, + "output": 0.138 + } + }, "huggingface/zai-org/GLM-4.7-Flash": { "name": "GLM-4.7-Flash", "context": 200000, @@ -56171,6 +55832,33 @@ "cache_write": 0 } }, + "ambient/qwen/qwen3.6-35b-a3b": { + "name": "Qwen3.6 35B-A3B", + "context": 262144, + "output": 262144, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "cost": { + "input": 0.15, + "output": 1, + "cache_read": 0.15, + "cache_write": 0 + } + }, + "ambient/qwen/qwen3-30b-a3b-instruct-2507": { + "name": "Qwen3 30B A3B Instruct 2507", + "context": 131072, + "output": 32768, + "tool_call": true, + "structured_output": true, + "cost": { + "input": 0.09, + "output": 0.3, + "cache_read": 0.09, + "cache_write": 0 + } + }, "ambient/qwen/qwen3.6-27b": { "name": "Qwen3.6 27B", "context": 32768, @@ -56178,7 +55866,6 @@ "reasoning": true, "tool_call": true, "structured_output": true, - "image": true, "cost": { "input": 0.32, "output": 3.2, @@ -58114,6 +57801,10 @@ "cache_read": 0.042 } }, + "vercel/heygen/heygen-video-1": { + "name": "HeyGen Video", + "image": true + }, "vercel/inference-net/schematron-v2-small": { "name": "Schematron V2 Small", "context": 128000, @@ -59858,7 +59549,7 @@ "output": 131072, "tool_call": true, "cost": { - "input": 0.019, + "input": 0.029, "output": 0.03 } }, @@ -66203,6 +65894,21 @@ "cache_write": 6.25 } }, + "ofox/anthropic/claude-haiku-5.5": { + "name": "Claude Haiku 5.5", + "context": 1000000, + "output": 128000, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true, + "cost": { + "input": 0.1, + "output": 0.5, + "cache_read": 0.01, + "cache_write": 0.125 + } + }, "ofox/anthropic/claude-opus-4.8": { "name": "Claude Opus 4.8", "context": 1000000, @@ -69232,6 +68938,18 @@ "cache_write": 5 } }, + "aihubmix/coding-glm-5.3-free": { + "name": "GLM-5.3 (Coding, free)", + "context": 1000000, + "output": 131072, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "cost": { + "input": 0, + "output": 0 + } + }, "aihubmix/gpt-image-2.5-flare": { "name": "GPT Image 2.5 Flare", "image": true, @@ -69652,6 +69370,20 @@ "cache_read": 0.0308 } }, + "aihubmix/coding-glm-5.3-flash-free": { + "name": "GLM-5.3-Flash (Coding, free)", + "context": 1000000, + "output": 131072, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true, + "video": true, + "cost": { + "input": 0, + "output": 0 + } + }, "aihubmix/qwen3.6-flash": { "name": "Qwen3.6 Flash", "context": 991000, @@ -71088,6 +70820,18 @@ "cache_read": 0.145 } }, + "merge-gateway/deepseek/deepseek-r1-0528": { + "name": "DeepSeek R1 (0528)", + "context": 65536, + "output": 32768, + "reasoning": true, + "structured_output": true, + "cost": { + "input": 1.35, + "output": 5.4, + "cache_read": 0.945 + } + }, "merge-gateway/deepseek/deepseek-v3.2": { "name": "DeepSeek V3.2", "context": 128000, @@ -72216,6 +71960,19 @@ "output": 1.8 } }, + "merge-gateway/qwen/qwen3-vl-30b-a3b-instruct": { + "name": "Qwen3-VL 30B-A3B Instruct", + "context": 131072, + "output": 32768, + "tool_call": true, + "structured_output": true, + "image": true, + "cost": { + "input": 0.108, + "output": 0.43, + "cache_read": 0.0216 + } + }, "merge-gateway/qwen/qwen3-235b-a22b": { "name": "Qwen3 235B A22B", "context": 131072, @@ -78843,6 +78600,17 @@ "output": 0.1 } }, + "edenai/deepinfra/Gryphe/MythoMax-L2-13b": { + "name": "MythoMax L2 13B (Deep Infra)", + "context": 4096, + "output": 3200, + "tool_call": true, + "structured_output": true, + "cost": { + "input": 0.4, + "output": 0.4 + } + }, "edenai/deepinfra/deepseek-ai/DeepSeek-V4-Flash-0731": { "name": "DeepSeek V4 Flash 0731 (Deep Infra)", "context": 1048576, @@ -78894,6 +78662,19 @@ "cache_read": 0.006 } }, + "edenai/deepinfra/deepseek-ai/DeepSeek-R1-0528": { + "name": "DeepSeek R1 0528 (Deep Infra)", + "context": 163840, + "output": 32768, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "cost": { + "input": 0.5, + "output": 2.15, + "cache_read": 0.35 + } + }, "edenai/deepinfra/deepseek-ai/DeepSeek-V3": { "name": "DeepSeek-V3 (Deep Infra)", "context": 163840, @@ -78943,6 +78724,16 @@ "cache_read": 0.02 } }, + "edenai/deepinfra/moonshotai/Kimi-K2-Instruct": { + "name": "Kimi K2 Instruct (Deep Infra)", + "context": 131072, + "output": 32768, + "tool_call": true, + "cost": { + "input": 0.5, + "output": 2 + } + }, "edenai/deepinfra/moonshotai/Kimi-K2.5": { "name": "Kimi K2.5 (Deep Infra)", "context": 262144, @@ -79045,6 +78836,15 @@ "output": 0.17 } }, + "edenai/deepinfra/microsoft/WizardLM-2-8x22B": { + "name": "WizardLM 2 8x22B (Deep Infra)", + "context": 65536, + "output": 8000, + "cost": { + "input": 0.48, + "output": 0.48 + } + }, "edenai/cerebras/gpt-oss-120b": { "name": "GPT OSS 120B (Cerebras)", "context": 131072, @@ -79668,17 +79468,6 @@ "cache_write": 0.07 } }, - "edenai/tencent/step-5-preview": { - "name": "Step 5 Preview (Tencent)", - "context": 1000000, - "output": 1000000, - "reasoning": true, - "cost": { - "input": 1, - "output": 2.7, - "cache_read": 0.05 - } - }, "edenai/tencent/deepseek-v4-pro-0813": { "name": "DeepSeek V4 Pro 0813 (Tencent)", "context": 1000000, @@ -80440,9 +80229,9 @@ "reasoning": true, "tool_call": true, "cost": { - "input": 0.44744, - "output": 0.89488, - "cache_read": 0.089488 + "input": 0.44824, + "output": 0.89648, + "cache_read": 0.089648 } }, "edenai/scaleway/llama-3.3-70b-instruct": { @@ -80451,8 +80240,8 @@ "output": 4096, "tool_call": true, "cost": { - "input": 1.00674, - "output": 1.00674 + "input": 1.00854, + "output": 1.00854 } }, "edenai/scaleway/gpt-oss-120b": { @@ -80462,8 +80251,8 @@ "reasoning": true, "tool_call": true, "cost": { - "input": 0.16779, - "output": 0.67116 + "input": 0.16809, + "output": 0.67236 } }, "edenai/ionos/meta-llama/Llama-3.3-70B-Instruct": { @@ -80471,8 +80260,8 @@ "context": 128000, "output": 4096, "cost": { - "input": 0.72709, - "output": 0.72709 + "input": 0.72839, + "output": 0.72839 } }, "edenai/ionos/openai/gpt-oss-120b": { @@ -80481,8 +80270,8 @@ "output": 32768, "reasoning": true, "cost": { - "input": 0.16779, - "output": 0.72709 + "input": 0.16809, + "output": 0.72839 } }, "edenai/vertex/gemini-flash-latest": { @@ -80974,6 +80763,15 @@ "output": 0.03 } }, + "edenai/cloudflare/@cf/meta/llama-3.2-1b-instruct": { + "name": "Llama 3.2 1B Instruct (Cloudflare)", + "context": 60000, + "output": 32000, + "cost": { + "input": 0.027, + "output": 0.201 + } + }, "edenai/cloudflare/@cf/aisingapore/gemma-sea-lion-v4-27b-it": { "name": "Gemma-SEA-LION-v4-27B-IT (Cloudflare)", "context": 128000, @@ -81155,6 +80953,19 @@ "cache_read": 0.5 } }, + "edenai/tensorx/deepseek/deepseek-r1-0528": { + "name": "DeepSeek R1 0528 (TensorX)", + "context": 164000, + "output": 32768, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "cost": { + "input": 0.66, + "output": 2.6, + "cache_read": 0.165 + } + }, "edenai/tensorx/moonshotai/kimi-k2.5": { "name": "Kimi K2.5 (TensorX)", "context": 262144, @@ -81884,6 +81695,19 @@ "output": 0.47 } }, + "edenai/qwen/qwen3-vl-30b-a3b-instruct": { + "name": "Qwen3 VL 30B A3B Instruct", + "context": 131072, + "output": 32768, + "tool_call": true, + "structured_output": true, + "image": true, + "video": true, + "cost": { + "input": 0.2, + "output": 0.8 + } + }, "edenai/qwen/qwen-vl-max": { "name": "Qwen-VL Max", "context": 131072, @@ -81946,6 +81770,15 @@ "cache_write": 0.375 } }, + "edenai/qwen/qwen-mt-plus": { + "name": "Qwen MT Plus", + "context": 4096, + "output": 8192, + "cost": { + "input": 2.46, + "output": 7.37 + } + }, "edenai/qwen/deepseek-v4-pro-0813": { "name": "DeepSeek V4 Pro 0813 (Alibaba)", "context": 1000000, @@ -82554,8 +82387,8 @@ "context": 100000, "output": 262144, "cost": { - "input": 0.33558, - "output": 0.44744 + "input": 0.33618, + "output": 0.44824 } }, "edenai/moonshot/kimi-k3": { @@ -93142,6 +92975,18 @@ "cache_read": 0.01 } }, + "llmgateway/reka-edge-2603": { + "name": "Reka Edge 2603", + "context": 16384, + "output": 16384, + "tool_call": true, + "structured_output": true, + "image": true, + "cost": { + "input": 0.1, + "output": 0.1 + } + }, "llmgateway/grok-4-5": { "name": "Grok 4.5", "context": 500000, @@ -93263,9 +93108,9 @@ "image": true, "video": true, "cost": { - "input": 0.14, - "output": 0.28, - "cache_read": 0.0028 + "input": 0.168, + "output": 0.336, + "cache_read": 0.0034 } }, "llmgateway/gpt-5.5-pro": { @@ -93373,17 +93218,6 @@ "cache_read": 0.125 } }, - "llmgateway/qwen-coder-plus": { - "name": "Qwen Coder Plus", - "context": 131072, - "output": 8192, - "tool_call": true, - "structured_output": true, - "cost": { - "input": 0.502, - "output": 1.004 - } - }, "llmgateway/glm-5v-turbo": { "name": "GLM-5V-Turbo", "context": 200000, @@ -94277,19 +94111,6 @@ "output": 0.74 } }, - "llmgateway/qwen3-vl-flash": { - "name": "Qwen3 VL Flash", - "context": 262144, - "output": 32000, - "tool_call": true, - "structured_output": true, - "image": true, - "cost": { - "input": 0.05, - "output": 0.4, - "cache_read": 0.01 - } - }, "llmgateway/seed-2-0-pro-260328": { "name": "Seed 2.0 Pro (260328)", "context": 262144, @@ -94674,18 +94495,6 @@ "cache_read": 0.0036 } }, - "llmgateway/qwen3-coder-plus": { - "name": "Qwen3 Coder Plus", - "context": 1000000, - "output": 65536, - "tool_call": true, - "cost": { - "input": 1, - "output": 5, - "cache_read": 0.2, - "cache_write": 1.25 - } - }, "llmgateway/glm-4.7-flash": { "name": "GLM-4.7-Flash", "context": 200000, @@ -94978,19 +94787,6 @@ "output": 2 } }, - "llmgateway/qwen3.6-max-preview": { - "name": "Qwen3.6 Max Preview", - "context": 262144, - "output": 65536, - "reasoning": true, - "tool_call": true, - "cost": { - "input": 1.3, - "output": 7.8, - "cache_read": 0.13, - "cache_write": 1.625 - } - }, "llmgateway/claude-opus-4-6": { "name": "Claude Opus 4.6", "context": 1000000, @@ -95084,18 +94880,6 @@ "cache_read": 0.5 } }, - "llmgateway/qwen-omni-turbo": { - "name": "Qwen-Omni Turbo", - "context": 32768, - "output": 2048, - "tool_call": true, - "image": true, - "video": true, - "cost": { - "input": 0.2, - "output": 0.8 - } - }, "llmgateway/hy-mt2-plus": { "name": "Hy-MT2 Plus", "context": 8192, @@ -100147,8 +99931,8 @@ "tool_call": true, "structured_output": true, "cost": { - "input": 0.067, - "output": 0.245, + "input": 0.179, + "output": 0.697, "cache_read": 0.014 } }, @@ -104364,6 +104148,21 @@ "output": 32768, "tool_call": true }, + "digitalocean/anthropic-claude-5.5-haiku": { + "name": "Anthropic Claude 5.5 Haiku", + "context": 1000000, + "output": 128000, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "image": true, + "cost": { + "input": 0.1, + "output": 0.5, + "cache_read": 0.01, + "cache_write": 0.125 + } + }, "digitalocean/qwen-2.5-14b-instruct": { "name": "Qwen 2.5 14B Instruct", "context": 131072, diff --git a/src/lib/providerRename.test.ts b/src/lib/providerRename.test.ts new file mode 100644 index 0000000..d93af37 --- /dev/null +++ b/src/lib/providerRename.test.ts @@ -0,0 +1,120 @@ +import { describe, expect, it } from "vitest"; +import { + copyModelsOnProviderDuplicate, + rekeyModelsOnProviderRename, +} from "./providerRename"; +import type { Model } from "../types"; + +function model(alias: string, provider: string): Model { + return { + alias, + provider, + model: alias.slice(provider.length + 1), + max_context_size: 512000, + display_name: null, + }; +} + +describe("rekeyModelsOnProviderRename", () => { + it("re-keys aliases and provider when a provider is renamed (opencode-go-copy scenario)", () => { + const models = { + "opencode-go-copy/deepseek-v4-flash": model("opencode-go-copy/deepseek-v4-flash", "opencode-go-copy"), + "opencode-go-copy/deepseek-v4.1-flash": model("opencode-go-copy/deepseek-v4.1-flash", "opencode-go-copy"), + "opencode-go/longcat-2.5-preview-free": model("opencode-go/longcat-2.5-preview-free", "opencode-go"), + "other/m1": model("other/m1", "other"), + }; + + const { models: next, aliasMap } = rekeyModelsOnProviderRename(models, "opencode-go-copy", "opencode-go"); + + expect(Object.keys(next).sort()).toEqual([ + "opencode-go/deepseek-v4-flash", + "opencode-go/deepseek-v4.1-flash", + "opencode-go/longcat-2.5-preview-free", + "other/m1", + ]); + expect(next["opencode-go/deepseek-v4-flash"].provider).toBe("opencode-go"); + expect(next["opencode-go/deepseek-v4-flash"].model).toBe("deepseek-v4-flash"); + expect(aliasMap).toEqual({ + "opencode-go-copy/deepseek-v4-flash": "opencode-go/deepseek-v4-flash", + "opencode-go-copy/deepseek-v4.1-flash": "opencode-go/deepseek-v4.1-flash", + }); + // Untouched providers stay identical. + expect(next["opencode-go/longcat-2.5-preview-free"]).toBe(models["opencode-go/longcat-2.5-preview-free"]); + expect(next["other/m1"]).toBe(models["other/m1"]); + }); + + it("fully re-prefixes non-standard aliases missing the old `/` prefix", () => { + const models = { "legacy-k3": model("legacy-k3", "kimi-code") }; + const { models: next } = rekeyModelsOnProviderRename(models, "kimi-code", "renamed"); + expect(Object.keys(next)).toEqual(["renamed/legacy-k3"]); + expect(next["renamed/legacy-k3"].provider).toBe("renamed"); + }); + + it("leaves other providers' models alone when renaming", () => { + const models = { "a/m1": model("a/m1", "a"), "b/m1": model("b/m1", "b") }; + const { models: next, aliasMap } = rekeyModelsOnProviderRename(models, "a", "c"); + expect(Object.keys(next).sort()).toEqual(["b/m1", "c/m1"]); + expect(aliasMap).toEqual({ "a/m1": "c/m1" }); + }); + + it("suffixes instead of overwriting when the renamed alias collides (rename into an occupied name)", () => { + // Renaming provider `a` to `b` while `b` already has b/m1 — the re-keyed + // entry must not silently swallow b's model. + const models = { + "a/m1": model("a/m1", "a"), + "b/m1": model("b/m1", "b"), + }; + const { models: next, aliasMap } = rekeyModelsOnProviderRename(models, "a", "b"); + expect(next["b/m1"].model).toBe("m1"); // b's original survives + expect(next["b/m1-2"].provider).toBe("b"); // a's model re-keyed with suffix + expect(aliasMap).toEqual({ "a/m1": "b/m1-2" }); + expect(Object.keys(next).sort()).toEqual(["b/m1", "b/m1-2"]); + }); + + it("suffixes when a legacy bare alias collides with the standard alias after rename", () => { + // Pre-v0.6 data: bare alias `k3` (no provider prefix) and `kimi/k3` both + // belong to `kimi`; both re-key to `x/k3`. + const models = { + k3: { ...model("k3", "kimi"), model: "k3" }, + "kimi/k3": model("kimi/k3", "kimi"), + }; + const { models: next, aliasMap } = rekeyModelsOnProviderRename(models, "kimi", "x"); + expect(Object.keys(next).sort()).toEqual(["x/k3", "x/k3-2"]); + expect(next["x/k3"]).toBeDefined(); + expect(next["x/k3-2"]).toBeDefined(); + // Both old keys are mapped; the pool re-key consumes the map, so every + // entry lands on a distinct target. + expect(Object.values(aliasMap).sort()).toEqual(["x/k3", "x/k3-2"]); + }); +}); + +describe("copyModelsOnProviderDuplicate", () => { + it("clones the provider's models and KEEPS the source (copy, not move)", () => { + const models = { + "opencode-go/longcat": model("opencode-go/longcat", "opencode-go"), + "other/m1": model("other/m1", "other"), + }; + const next = copyModelsOnProviderDuplicate(models, "opencode-go", "opencode-go-copy"); + expect(Object.keys(next).sort()).toEqual([ + "opencode-go-copy/longcat", + "opencode-go/longcat", + "other/m1", + ]); + expect(next["opencode-go/longcat"].provider).toBe("opencode-go"); + expect(next["opencode-go-copy/longcat"].provider).toBe("opencode-go-copy"); + }); + + it("fully re-prefixes non-standard aliases and suffixes collisions", () => { + const models = { + "legacy-k3": { ...model("legacy-k3", "kimi"), model: "k3" }, + "dupe/legacy-k3": model("dupe/legacy-k3", "other"), + }; + const next = copyModelsOnProviderDuplicate(models, "kimi", "dupe"); + // `dupe/legacy-k3` is taken → the clone gets a suffix. + expect(Object.keys(next).sort()).toEqual([ + "dupe/legacy-k3", + "dupe/legacy-k3-2", + "legacy-k3", + ]); + }); +}); diff --git a/src/lib/providerRename.ts b/src/lib/providerRename.ts new file mode 100644 index 0000000..973f290 --- /dev/null +++ b/src/lib/providerRename.ts @@ -0,0 +1,79 @@ +import type { Model } from "../types"; + +export interface ProviderRenameResult { + models: Record; + /** old alias → new alias (collision-deduped), for callers fixing alias references. */ + aliasMap: Record; +} + +function rekeyedAlias(alias: string, oldName: string, newName: string): string { + const prefix = `${oldName}/`; + return alias.startsWith(prefix) + ? newName + alias.slice(oldName.length) + : `${newName}/${alias}`; +} + +/** + * Re-key a provider's model aliases after the provider is renamed so the + * `/` prefix tracks the new name. Only patching + * `m.provider` (the old behaviour) left stale prefixes like + * `opencode-go-copy/...` pointing at the renamed provider — zombie aliases + * that the UI then re-saved to config.toml and SQLite forever. + * + * Collision-safe: a target alias that is already taken (renaming into an + * existing provider's name, or a legacy bare alias colliding with a standard + * `/` one — both map to the same new key) gets a `-2`/`-3` + * suffix instead of silently overwriting the other entry. Non-standard + * aliases without the `/` prefix fall back to a full re-prefix. + */ +export function rekeyModelsOnProviderRename( + models: Record, + oldName: string, + newName: string +): ProviderRenameResult { + const next: Record = {}; + const toRename: Array<[string, Model]> = []; + for (const [key, m] of Object.entries(models)) { + if (m.provider === oldName) toRename.push([key, m]); + else next[key] = m; + } + const aliasMap: Record = {}; + for (const [key, m] of toRename) { + const base = rekeyedAlias(key, oldName, newName); + let target = base; + let n = 2; + while (target in next) { + target = `${base}-${n}`; + n++; + } + next[target] = { ...m, alias: target, provider: newName }; + aliasMap[key] = target; + } + return { models: next, aliasMap }; +} + +/** + * Clone a provider's models under the duplicate's name — COPY semantics: + * the source provider keeps its models (unlike rekeyModelsOnProviderRename, + * which moves them). Collisions with any existing alias get a `-2`/`-3` + * suffix. + */ +export function copyModelsOnProviderDuplicate( + models: Record, + oldName: string, + newName: string +): Record { + const next = { ...models }; + for (const [key, m] of Object.entries(models)) { + if (m.provider !== oldName) continue; + const base = rekeyedAlias(key, oldName, newName); + let target = base; + let n = 2; + while (target in next) { + target = `${base}-${n}`; + n++; + } + next[target] = { ...m, alias: target, provider: newName }; + } + return next; +} diff --git a/src/lib/referenceCleanup.test.ts b/src/lib/referenceCleanup.test.ts new file mode 100644 index 0000000..bcad264 --- /dev/null +++ b/src/lib/referenceCleanup.test.ts @@ -0,0 +1,124 @@ +import { describe, expect, it } from "vitest"; +import { purgeSubagentPoolAliases, rekeySubagentPoolAliases } from "./referenceCleanup"; + +const rawWithPool = { + thinking: { enabled: true }, + secondary_model: { + default_model: "opencode-go/longcat-2.5-preview-free", + model: "opencode-go/longcat-2.5-preview-free", + models: { + "TokenHub/deepseek-v4.1-flash": "", + "opencode-go/longcat-2.5-preview-free": "", + "opencode-go/mimo-v2.6-flash": "", + "opencode-go-copy/deepseek-v4-flash": "route to deepseek", + }, + force: false, + }, + services: { moonshot_fetch: { api_key: "" } }, +}; + +describe("rekeySubagentPoolAliases", () => { + it("re-keys pool keys and defaults when the provider is renamed", () => { + const next = rekeySubagentPoolAliases(rawWithPool, { + "opencode-go-copy/deepseek-v4-flash": "opencode-go/deepseek-v4-flash", + }) as typeof rawWithPool; + + const section = next.secondary_model as Record; + expect(Object.keys(section.models).sort()).toEqual([ + "TokenHub/deepseek-v4.1-flash", + "opencode-go/deepseek-v4-flash", + "opencode-go/longcat-2.5-preview-free", + "opencode-go/mimo-v2.6-flash", + ]); + // Descriptions survive the re-key. + expect(section.models["opencode-go/deepseek-v4-flash"]).toBe("route to deepseek"); + // Untouched defaults stay put. + expect(section.default_model).toBe("opencode-go/longcat-2.5-preview-free"); + // Unrelated sections are preserved. + expect(next.thinking).toEqual({ enabled: true }); + }); + + it("follows the default when it referenced a renamed alias", () => { + const raw = { + secondary_model: { + default_model: "old/m1", + model: "old/m1", + models: { "old/m1": "" }, + }, + }; + const next = rekeySubagentPoolAliases(raw, { "old/m1": "new/m1" }) as any; + expect(next.secondary_model.default_model).toBe("new/m1"); + expect(next.secondary_model.model).toBe("new/m1"); + expect(Object.keys(next.secondary_model.models)).toEqual(["new/m1"]); + }); + + it("returns the same reference when nothing matches", () => { + expect(rekeySubagentPoolAliases(rawWithPool, { "a/b": "c/d" })).toBe(rawWithPool); + }); + + it("never injects an empty models table into the implicit single-model form", () => { + // `{ model: "old/m1" }` with no pool table: re-keying the default must + // not add `[secondary_model.models]` — an empty table is invalid for the + // engine (its default has to be a key of the table). + const raw = { secondary_model: { model: "old/m1" } }; + const next = rekeySubagentPoolAliases(raw, { "old/m1": "new/m1" }) as any; + expect(next.secondary_model).toEqual({ model: "new/m1" }); + expect(next.secondary_model.models).toBeUndefined(); + }); + + it("never injects a models table into the force form", () => { + const raw = { secondary_model: { force: true, default_model: "old/m1", model: "old/m1" } }; + const next = rekeySubagentPoolAliases(raw, { "old/m1": "new/m1" }) as any; + expect(next.secondary_model).toEqual({ + force: true, + default_model: "new/m1", + model: "new/m1", + }); + expect(next.secondary_model.models).toBeUndefined(); + }); +}); + +describe("purgeSubagentPoolAliases", () => { + it("removes deleted aliases and keeps the rest of the section intact", () => { + const next = purgeSubagentPoolAliases(rawWithPool, [ + "opencode-go-copy/deepseek-v4-flash", + ]) as typeof rawWithPool; + const section = next.secondary_model as Record; + expect(Object.keys(section.models).sort()).toEqual([ + "TokenHub/deepseek-v4.1-flash", + "opencode-go/longcat-2.5-preview-free", + "opencode-go/mimo-v2.6-flash", + ]); + expect(section.default_model).toBe("opencode-go/longcat-2.5-preview-free"); + expect(section.force).toBe(false); + expect(next.thinking).toEqual({ enabled: true }); + }); + + it("falls back to the first remaining key when the default was purged", () => { + const next = purgeSubagentPoolAliases(rawWithPool, [ + "opencode-go/longcat-2.5-preview-free", + ]) as any; + const section = next.secondary_model; + expect(section.models).not.toHaveProperty("opencode-go/longcat-2.5-preview-free"); + expect(section.default_model).toBe("TokenHub/deepseek-v4.1-flash"); + expect(section.model).toBe("TokenHub/deepseek-v4.1-flash"); + }); + + it("drops the whole section when the pool becomes empty", () => { + const raw = { + thinking: { enabled: true }, + secondary_model: { + default_model: "p/m", + model: "p/m", + models: { "p/m": "" }, + }, + }; + const next = purgeSubagentPoolAliases(raw, ["p/m"]) as any; + expect(next).not.toHaveProperty("secondary_model"); + expect(next.thinking).toEqual({ enabled: true }); + }); + + it("returns the same reference when no pool entry is affected", () => { + expect(purgeSubagentPoolAliases(rawWithPool, ["other/m9"])).toBe(rawWithPool); + }); +}); diff --git a/src/lib/referenceCleanup.ts b/src/lib/referenceCleanup.ts new file mode 100644 index 0000000..53e6378 --- /dev/null +++ b/src/lib/referenceCleanup.ts @@ -0,0 +1,117 @@ +/** + * Keep `[secondary_model]` (the subagent model pool in `raw_other`) free of + * dangling model-alias references. + * + * Model aliases are deleted or re-keyed in several places (provider delete, + * single-model delete, provider rename). The pool stores aliases as its + * `models` table keys and as the `default_model` / `model` values — none of + * those may outlive the alias they point at, or the engine resolves the pool + * entry to nothing and the zombie key lingers in config.toml forever. + */ + +function asRecord(value: unknown): Record { + return value && typeof value === "object" && !Array.isArray(value) + ? (value as Record) + : {}; +} + +/** + * Re-key pool aliases after a provider rename: `aliasMap` maps old alias → + * new alias. Pool keys keep their descriptions; `default_model` / `model` + * follow when they referenced a renamed alias. Returns the input reference + * when nothing changed. + */ +export function rekeySubagentPoolAliases( + rawOther: unknown, + aliasMap: Record +): unknown { + if (Object.keys(aliasMap).length === 0) return rawOther; + const root = asRecord(rawOther); + const section = asRecord(root.secondary_model); + if (Object.keys(section).length === 0) return rawOther; + + const models = asRecord(section.models); + let changed = false; + const nextModels: Record = {}; + for (const [k, v] of Object.entries(models)) { + const mapped = aliasMap[k]; + if (mapped && mapped !== k) { + nextModels[mapped] = v; + changed = true; + } else { + nextModels[k] = v; + } + } + + let nextDefault = section.default_model; + let nextModel = section.model; + if (typeof nextDefault === "string" && aliasMap[nextDefault]) { + nextDefault = aliasMap[nextDefault]; + changed = true; + } + if (typeof nextModel === "string" && aliasMap[nextModel]) { + nextModel = aliasMap[nextModel]; + changed = true; + } + if (!changed) return rawOther; + + // Only write a `models` table when the section had one — the implicit + // single-model form (`{ model: "..." }`) and the force form must not gain + // an empty `[secondary_model.models]` table, which the engine can never + // validate (its default must be a key of the table). + const hadModelsTable = section.models !== undefined; + const nextSection: Record = { ...section }; + if (hadModelsTable || Object.keys(nextModels).length > 0) { + nextSection.models = nextModels; + } + if (nextDefault !== section.default_model) nextSection.default_model = nextDefault; + if (nextModel !== section.model) nextSection.model = nextModel; + return { ...root, secondary_model: nextSection }; +} + +/** + * Remove pool entries pointing at deleted aliases. When the pool's default + * referenced a deleted alias it falls back to the first remaining key; when + * the pool becomes empty the whole `[secondary_model]` section is dropped + * (an empty pool is invalid for the engine — subagents then inherit the + * primary model). Returns the input reference when nothing changed. + */ +export function purgeSubagentPoolAliases( + rawOther: unknown, + removedAliases: Iterable +): unknown { + const removed = new Set(removedAliases); + if (removed.size === 0) return rawOther; + const root = asRecord(rawOther); + const section = asRecord(root.secondary_model); + if (Object.keys(section).length === 0) return rawOther; + + const models = asRecord(section.models); + const kept: Record = {}; + let removedAny = false; + for (const [k, v] of Object.entries(models)) { + if (removed.has(k)) { + removedAny = true; + } else { + kept[k] = v; + } + } + const defaultGone = + (typeof section.default_model === "string" && removed.has(section.default_model)) || + (typeof section.model === "string" && removed.has(section.model)); + if (!removedAny && !defaultGone) return rawOther; + + if (Object.keys(kept).length === 0) { + const nextRoot: Record = { ...root }; + delete nextRoot.secondary_model; + return nextRoot; + } + + const nextSection: Record = { ...section, models: kept }; + if (defaultGone) { + const fallback = Object.keys(kept)[0]; + nextSection.default_model = fallback; + nextSection.model = fallback; + } + return { ...root, secondary_model: nextSection }; +}