| 1 | # Offline Models.dev seed spec (#6396). |
| 2 | # |
| 3 | # This file says WHICH upstream rows the offline seed carries and how they map |
| 4 | # onto Codewhale provider ids. It never states a value that contradicts |
| 5 | # upstream: policy (a withheld price, a clamped limit) belongs in |
| 6 | # crates/config/assets/catalog_corrections.json, which applies online too. |
| 7 | # |
| 8 | # python3 scripts/catalog_models_dev.py seed lock --dry-run # review report |
| 9 | # python3 scripts/catalog_models_dev.py seed lock # pin upstream |
| 10 | # python3 scripts/catalog_models_dev.py seed render # write the seed |
| 11 | # |
| 12 | # Model entries: a bare id, or a table with |
| 13 | # id Codewhale wire id (the seed key, sent on the wire) |
| 14 | # upstream_id upstream id when it differs by more than letter case |
| 15 | # from a sibling upstream provider to take the row from |
| 16 | # base_model Codewhale's canonical join (upstream provider rows have none) |
| 17 | # curated true for a row upstream does not list; data in [[curated]] |
| 18 | # Exactly one model per provider is its `default`, matching the provider's |
| 19 | # built-in DEFAULT_*_MODEL. |
| 20 | |
| 21 | [source] |
| 22 | url = "https://models.dev/catalog.json" |
| 23 | |
| 24 | [meta] |
| 25 | about = "Offline fallback Models.dev-shaped catalog snapshot for Codewhale (#3385, demoted by #4188, generated since #6396)." |
| 26 | schema = "Matches crates/config/src/models_dev.rs ModelsDevCatalog ({ models, providers })." |
| 27 | role = "NOT a competing source of truth. Preferred metadata is the live Models.dev catalog published into ProviderLake (#4187). This asset is used only when live/cache rows are unavailable (offline startup, failed refresh, or empty cache)." |
| 28 | source = "Rows are projected unedited from Models.dev onto the fields models_dev.rs reads; provider headers, id mapping, defaults and canonical joins come from scripts/catalog/models_dev_seed.toml." |
| 29 | corrections = "Deliberate holds (withheld prices, clamped limits) are not in this file. They live in crates/config/assets/catalog_corrections.json and apply to this seed and to live refresh alike." |
| 30 | default_rows = "Each provider's `default: true` wire id equals that provider's built-in DEFAULT_*_MODEL so RouteResolver::new() and the descriptor stay in agreement when offline." |
| 31 | pending_release_metadata = "GLM-5.3 is live on the Z.ai Coding Plan (docs.z.ai/devpack/overview and docs.z.ai/devpack/latest-model, recorded 2026-08-13) and is the default direct Z.ai model (DEFAULT_ZAI_MODEL); explicit GLM-5.2 selections keep their own id. First-party wire id is GLM-5.3; OpenRouter mirror is z-ai/glm-5.3. Capability/limit/dialect values still inherit from GLM-5.2 until Z.ai publishes distinct 5.3 numbers. Pricing stays absent: Coding Plan publishes credit multipliers, not a USD PAYG row we can stand behind. Z.ai may auto-route GLM-5.2/GLM-5.1 requests to GLM-5.3 on their side; Codewhale still sends the selected picker id. Do not send a [1m] suffix. Scope stays first-party Z.ai plus the OpenRouter mirror; add third-party gateway rows only against that gateway's own published roster." |
| 32 | |
| 33 | # Canonical `models` entries. The two bare DeepSeek keys are the canonical ids |
| 34 | # every hosted DeepSeek `base_model`, the route layer and pricing name; |
| 35 | # renaming them is a canonical-identity migration, not a seed refresh. |
| 36 | |
| 37 | [[canonical]] |
| 38 | key = "deepseek-v4-pro" |
| 39 | upstream = "deepseek/deepseek-v4-pro" |
| 40 | |
| 41 | [[canonical]] |
| 42 | key = "deepseek-v4-flash" |
| 43 | upstream = "deepseek/deepseek-v4-flash" |
| 44 | |
| 45 | [[canonical]] |
| 46 | key = "xiaomi/mimo-v2.6-pro" |
| 47 | |
| 48 | [[canonical]] |
| 49 | key = "xiaomi/mimo-v2.6-flash" |
| 50 | |
| 51 | [[providers]] |
| 52 | id = "deepseek" |
| 53 | name = "DeepSeek" |
| 54 | api = "https://api.deepseek.com" |
| 55 | npm = "@ai-sdk/openai-compatible" |
| 56 | env = ["DEEPSEEK_API_KEY"] |
| 57 | default = "deepseek-flash" |
| 58 | models = [ |
| 59 | { id = "deepseek-v4-pro", base_model = "deepseek-v4-pro" }, |
| 60 | { id = "deepseek-v4-flash", base_model = "deepseek-v4-flash" }, |
| 61 | { id = "deepseek-v4-flash-vision-exp", base_model = "deepseek-v4-flash" }, |
| 62 | { id = "deepseek-flash", base_model = "deepseek-flash" }, |
| 63 | ] |
| 64 | |
| 65 | [[providers]] |
| 66 | id = "zai" |
| 67 | name = "Zhipu AI / Z.ai" |
| 68 | api = "https://api.z.ai/api/paas/v4" |
| 69 | npm = "@ai-sdk/openai-compatible" |
| 70 | env = ["ZAI_API_KEY", "ZHIPU_API_KEY", "GLM_API_KEY"] |
| 71 | default = "GLM-5.3" |
| 72 | models = [ |
| 73 | "GLM-5.2", |
| 74 | "GLM-5.3", |
| 75 | "GLM-5.3-Flash", |
| 76 | "glm-5.1", |
| 77 | "GLM-5-Turbo", |
| 78 | ] |
| 79 | |
| 80 | [[providers]] |
| 81 | id = "moonshot" |
| 82 | upstream = "moonshotai" |
| 83 | name = "Moonshot / Kimi" |
| 84 | api = "https://api.moonshot.ai/v1" |
| 85 | npm = "@ai-sdk/openai-compatible" |
| 86 | env = ["MOONSHOT_API_KEY", "KIMI_API_KEY"] |
| 87 | default = "kimi-k2.7-code" |
| 88 | models = [ |
| 89 | "kimi-k3", |
| 90 | "kimi-k2.7-code", |
| 91 | "kimi-k2.7-code-highspeed", |
| 92 | "kimi-k2.6", |
| 93 | ] |
| 94 | |
| 95 | [[providers]] |
| 96 | id = "minimax" |
| 97 | name = "MiniMax" |
| 98 | api = "https://api.minimax.io/v1" |
| 99 | npm = "@ai-sdk/openai-compatible" |
| 100 | env = ["MINIMAX_API_KEY"] |
| 101 | default = "MiniMax-M3" |
| 102 | models = [ |
| 103 | "MiniMax-M3", |
| 104 | "MiniMax-M2.7", |
| 105 | "MiniMax-M2.7-highspeed", |
| 106 | ] |
| 107 | |
| 108 | [[providers]] |
| 109 | id = "minimax-anthropic" |
| 110 | upstream = "minimax" |
| 111 | name = "MiniMax (Anthropic-compatible)" |
| 112 | api = "https://api.minimax.io/anthropic" |
| 113 | npm = "@ai-sdk/anthropic" |
| 114 | env = ["MINIMAX_API_KEY"] |
| 115 | default = "MiniMax-M3" |
| 116 | models = [ |
| 117 | "MiniMax-M3", |
| 118 | "MiniMax-M2.7", |
| 119 | "MiniMax-M2.7-highspeed", |
| 120 | ] |
| 121 | |
| 122 | [[providers]] |
| 123 | id = "modelstudio-token-plan" |
| 124 | upstream = "alibaba-token-plan" |
| 125 | name = "Alibaba Cloud Model Studio (Token Plan)" |
| 126 | api = "https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1" |
| 127 | npm = "@ai-sdk/openai-compatible" |
| 128 | env = ["MODELSTUDIO_API_KEY", "DASHSCOPE_API_KEY"] |
| 129 | default = "qwen3.8-max" |
| 130 | models = [ |
| 131 | "qwen3.8-max", |
| 132 | "qwen3.8-max-preview", |
| 133 | "qwen3.7-plus", |
| 134 | "qwen3.7-max", |
| 135 | "qwen3.6-flash", |
| 136 | "deepseek-v4-pro", |
| 137 | "deepseek-v4-flash-0731", |
| 138 | "glm-5.2", |
| 139 | ] |
| 140 | |
| 141 | [[providers]] |
| 142 | id = "modelstudio-token-plan-anthropic" |
| 143 | upstream = "alibaba-token-plan" |
| 144 | name = "Alibaba Cloud Model Studio (Token Plan, Anthropic-compatible)" |
| 145 | api = "https://token-plan.ap-southeast-1.maas.aliyuncs.com/apps/anthropic" |
| 146 | npm = "@ai-sdk/anthropic" |
| 147 | env = ["MODELSTUDIO_API_KEY", "DASHSCOPE_API_KEY"] |
| 148 | default = "qwen3.8-max" |
| 149 | models = [ |
| 150 | "qwen3.8-max", |
| 151 | "qwen3.8-max-preview", |
| 152 | "qwen3.7-plus", |
| 153 | "qwen3.7-max", |
| 154 | "qwen3.6-flash", |
| 155 | "deepseek-v4-pro", |
| 156 | "deepseek-v4-flash-0731", |
| 157 | "glm-5.2", |
| 158 | ] |
| 159 | |
| 160 | [[providers]] |
| 161 | id = "modelstudio-coding-plan" |
| 162 | upstream = "alibaba-coding-plan" |
| 163 | name = "Alibaba Cloud Model Studio (Coding Plan)" |
| 164 | api = "https://coding-intl.dashscope.aliyuncs.com/v1" |
| 165 | npm = "@ai-sdk/openai-compatible" |
| 166 | env = ["MODELSTUDIO_API_KEY", "DASHSCOPE_API_KEY"] |
| 167 | default = "qwen3.8-max" |
| 168 | models = [ |
| 169 | { id = "qwen3.8-max", from = "alibaba-token-plan" }, |
| 170 | { id = "qwen3.8-max-preview", from = "alibaba-token-plan" }, |
| 171 | "qwen3.7-plus", |
| 172 | "qwen3.7-max", |
| 173 | "qwen3.6-flash", |
| 174 | { id = "deepseek-v4-pro", from = "alibaba-token-plan" }, |
| 175 | { id = "deepseek-v4-flash-0731", from = "alibaba-token-plan" }, |
| 176 | { id = "glm-5.2", from = "alibaba-token-plan" }, |
| 177 | ] |
| 178 | |
| 179 | [[providers]] |
| 180 | id = "modelstudio-coding-plan-anthropic" |
| 181 | upstream = "alibaba-coding-plan" |
| 182 | name = "Alibaba Cloud Model Studio (Coding Plan, Anthropic-compatible)" |
| 183 | api = "https://coding-intl.dashscope.aliyuncs.com/apps/anthropic" |
| 184 | npm = "@ai-sdk/anthropic" |
| 185 | env = ["MODELSTUDIO_API_KEY", "DASHSCOPE_API_KEY"] |
| 186 | default = "qwen3.8-max" |
| 187 | models = [ |
| 188 | { id = "qwen3.8-max", from = "alibaba-token-plan" }, |
| 189 | { id = "qwen3.8-max-preview", from = "alibaba-token-plan" }, |
| 190 | "qwen3.7-plus", |
| 191 | "qwen3.7-max", |
| 192 | "qwen3.6-flash", |
| 193 | { id = "deepseek-v4-pro", from = "alibaba-token-plan" }, |
| 194 | { id = "deepseek-v4-flash-0731", from = "alibaba-token-plan" }, |
| 195 | { id = "glm-5.2", from = "alibaba-token-plan" }, |
| 196 | ] |
| 197 | |
| 198 | [[providers]] |
| 199 | id = "meta" |
| 200 | name = "Meta Model API" |
| 201 | api = "https://api.meta.ai/v1" |
| 202 | npm = "@ai-sdk/openai" |
| 203 | env = ["META_MODEL_API_KEY", "MODEL_API_KEY"] |
| 204 | default = "muse-spark-1.2" |
| 205 | models = [ |
| 206 | "muse-spark-1.1", |
| 207 | "muse-spark-1.2", |
| 208 | "muse-spark-1.2-contributor", |
| 209 | ] |
| 210 | |
| 211 | [[providers]] |
| 212 | id = "openai" |
| 213 | name = "OpenAI-compatible" |
| 214 | api = "https://api.openai.com/v1" |
| 215 | npm = "@ai-sdk/openai" |
| 216 | env = ["OPENAI_API_KEY"] |
| 217 | default = "gpt-5.6" |
| 218 | models = [ |
| 219 | "gpt-5.5", |
| 220 | "gpt-5.5-pro", |
| 221 | "gpt-5.6", |
| 222 | "gpt-5.6-sol", |
| 223 | "gpt-5.6-terra", |
| 224 | "gpt-5.6-luna", |
| 225 | "gpt-5.3-codex", |
| 226 | ] |
| 227 | |
| 228 | [[providers]] |
| 229 | id = "anthropic" |
| 230 | name = "Anthropic" |
| 231 | api = "https://api.anthropic.com" |
| 232 | npm = "@ai-sdk/anthropic" |
| 233 | env = ["ANTHROPIC_API_KEY"] |
| 234 | default = "claude-sonnet-4-6" |
| 235 | models = [ |
| 236 | "claude-sonnet-4-6", |
| 237 | "claude-opus-4-8", |
| 238 | "claude-haiku-4-5", |
| 239 | "claude-opus-5", |
| 240 | "claude-sonnet-5", |
| 241 | "claude-fable-5", |
| 242 | ] |
| 243 | |
| 244 | [[providers]] |
| 245 | id = "openrouter" |
| 246 | name = "OpenRouter" |
| 247 | api = "https://openrouter.ai/api/v1" |
| 248 | npm = "@openrouter/ai-sdk-provider" |
| 249 | env = ["OPENROUTER_API_KEY"] |
| 250 | default = "deepseek/deepseek-v4-pro" |
| 251 | models = [ |
| 252 | { id = "deepseek/deepseek-v4-pro", base_model = "deepseek-v4-pro" }, |
| 253 | { id = "deepseek/deepseek-v4-flash", base_model = "deepseek-v4-flash" }, |
| 254 | "qwen/qwen3.8-flash", |
| 255 | "qwen/qwen3.6-flash", |
| 256 | "qwen/qwen3.6-plus", |
| 257 | "qwen/qwen3.6-35b-a3b", |
| 258 | "qwen/qwen3.7-plus", |
| 259 | "minimax/minimax-m3", |
| 260 | "z-ai/glm-5.2", |
| 261 | "z-ai/glm-5.3", |
| 262 | "z-ai/glm-5.3-flash", |
| 263 | "dots-studio/dots-3-note-preview:free", |
| 264 | ] |
| 265 | |
| 266 | [[providers]] |
| 267 | id = "together" |
| 268 | upstream = "togetherai" |
| 269 | name = "Together AI" |
| 270 | api = "https://api.together.xyz/v1" |
| 271 | npm = "@ai-sdk/openai-compatible" |
| 272 | env = ["TOGETHER_API_KEY"] |
| 273 | default = "deepseek-ai/DeepSeek-V4-Pro" |
| 274 | models = [ |
| 275 | { id = "deepseek-ai/DeepSeek-V4-Pro", base_model = "deepseek-v4-pro" }, |
| 276 | { id = "deepseek-ai/DeepSeek-V4-Flash", base_model = "deepseek-v4-flash", curated = true }, |
| 277 | ] |
| 278 | |
| 279 | [[providers]] |
| 280 | id = "fireworks" |
| 281 | upstream = "fireworks-ai" |
| 282 | name = "Fireworks AI" |
| 283 | api = "https://api.fireworks.ai/inference/v1" |
| 284 | npm = "@ai-sdk/openai-compatible" |
| 285 | env = ["FIREWORKS_API_KEY"] |
| 286 | default = "accounts/fireworks/models/deepseek-v4-pro" |
| 287 | models = [ |
| 288 | { id = "accounts/fireworks/models/deepseek-v4-pro", base_model = "deepseek-v4-pro" }, |
| 289 | ] |
| 290 | |
| 291 | [[providers]] |
| 292 | id = "novita" |
| 293 | upstream = "novita-ai" |
| 294 | name = "Novita AI" |
| 295 | api = "https://api.novita.ai/openai/v1" |
| 296 | npm = "@ai-sdk/openai-compatible" |
| 297 | env = ["NOVITA_API_KEY"] |
| 298 | default = "deepseek/deepseek-v4-pro" |
| 299 | models = [ |
| 300 | { id = "deepseek/deepseek-v4-pro", base_model = "deepseek-v4-pro" }, |
| 301 | { id = "deepseek/deepseek-v4-flash", base_model = "deepseek-v4-flash" }, |
| 302 | ] |
| 303 | |
| 304 | [[providers]] |
| 305 | id = "siliconflow" |
| 306 | name = "SiliconFlow" |
| 307 | api = "https://api.siliconflow.com/v1" |
| 308 | npm = "@ai-sdk/openai-compatible" |
| 309 | env = ["SILICONFLOW_API_KEY"] |
| 310 | default = "deepseek-ai/DeepSeek-V4-Pro" |
| 311 | models = [ |
| 312 | { id = "deepseek-ai/DeepSeek-V4-Pro", base_model = "deepseek-v4-pro" }, |
| 313 | { id = "deepseek-ai/DeepSeek-V4-Flash", base_model = "deepseek-v4-flash" }, |
| 314 | ] |
| 315 | |
| 316 | [[providers]] |
| 317 | id = "arcee" |
| 318 | name = "Arcee AI" |
| 319 | api = "https://api.arcee.ai/v1" |
| 320 | npm = "@ai-sdk/openai-compatible" |
| 321 | env = ["ARCEE_API_KEY"] |
| 322 | default = "trinity-large-thinking" |
| 323 | models = [ |
| 324 | "trinity-large-thinking", |
| 325 | { id = "trinity-mini", curated = true }, |
| 326 | ] |
| 327 | |
| 328 | [[providers]] |
| 329 | id = "xai" |
| 330 | name = "xAI" |
| 331 | api = "https://api.x.ai/v1" |
| 332 | npm = "@ai-sdk/xai" |
| 333 | env = ["XAI_API_KEY"] |
| 334 | default = "grok-4.6" |
| 335 | models = [ |
| 336 | "grok-4.7", |
| 337 | "grok-4.6", |
| 338 | "grok-4.5", |
| 339 | "grok-4.3", |
| 340 | ] |
| 341 | |
| 342 | [[providers]] |
| 343 | id = "xiaomi-mimo" |
| 344 | upstream = "xiaomi" |
| 345 | name = "Xiaomi MiMo" |
| 346 | api = "https://api-mimo.xiaomi.com/v1" |
| 347 | npm = "@ai-sdk/openai-compatible" |
| 348 | env = ["XIAOMI_MIMO_API_KEY", "MIMO_API_KEY"] |
| 349 | default = "mimo-v2.5-pro" |
| 350 | models = [ |
| 351 | "mimo-v2.5-pro", |
| 352 | "mimo-v2.5", |
| 353 | "mimo-v2.6-pro", |
| 354 | "mimo-v2.6-flash", |
| 355 | ] |
| 356 | |
| 357 | [[providers]] |
| 358 | id = "stepfun" |
| 359 | name = "StepFun / StepFlash" |
| 360 | api = "https://api.stepfun.ai/v1" |
| 361 | npm = "@ai-sdk/openai-compatible" |
| 362 | env = ["STEPFUN_API_KEY", "STEP_API_KEY"] |
| 363 | default = "step-3.7-flash" |
| 364 | models = [ |
| 365 | "step-3.5-flash", |
| 366 | "step-3.5-flash-2603", |
| 367 | "step-3.7-flash", |
| 368 | "step-5-preview", |
| 369 | ] |
| 370 | |
| 371 | [[curated]] |
| 372 | provider = "together" |
| 373 | id = "deepseek-ai/DeepSeek-V4-Flash" |
| 374 | reason = "Carried since #3385. Models.dev togetherai lists DeepSeek-V4-Flash-0731 and DeepSeek-V4.1-Flash but not this id (checked 2026-09-26); confirm Together still serves it or remove the row." |
| 375 | |
| 376 | [curated.row] |
| 377 | name = "DeepSeek V4 Flash (Together)" |
| 378 | family = "deepseek" |
| 379 | reasoning = true |
| 380 | tool_call = true |
| 381 | modalities = { input = ["text"], output = ["text"] } |
| 382 | limit = { context = 1000000, output = 384000 } |
| 383 | |
| 384 | [[curated]] |
| 385 | provider = "arcee" |
| 386 | id = "trinity-mini" |
| 387 | reason = "Carried since 0.8.68. Models.dev arcee lists only trinity-large-thinking among Arcee's own models (checked 2026-09-26); confirm Arcee still serves it or remove the row." |
| 388 | |
| 389 | [curated.row] |
| 390 | name = "Trinity Mini" |
| 391 | family = "trinity" |
| 392 | reasoning = true |
| 393 | tool_call = true |
| 394 | modalities = { input = ["text"], output = ["text"] } |
| 395 | limit = { context = 128000 } |
| 396 |