From 8705fbee54a2d3ed3d4ddb1b48b97d0cbcfe7655 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=AE=80=E7=AE=80=E7=AE=80=E7=AE=80?= <1500256797@qq.com> Date: Fri, 20 Mar 2026 17:00:57 +0800 Subject: [PATCH] fix(models): align minimax and zai defaults (#2445) Update the coding-agent default model picks for ZAI, Cerebras, and MiniMax so new sessions prefer the current model lineup. Add the missing MiniMax-M2.1-highspeed direct provider entries and normalize MiniMax Anthropic-compatible context limits so the catalog matches the provider's supported model set. --- packages/ai/scripts/generate-models.ts | 40 ++++++++++++++++++ packages/ai/src/models.generated.ts | 42 +++++++++++++++++-- .../coding-agent/src/core/model-resolver.ts | 8 ++-- .../coding-agent/test/model-resolver.test.ts | 7 ++++ 4 files changed, 89 insertions(+), 8 deletions(-) diff --git a/packages/ai/scripts/generate-models.ts b/packages/ai/scripts/generate-models.ts index 781aa980..2f9fb501 100644 --- a/packages/ai/scripts/generate-models.ts +++ b/packages/ai/scripts/generate-models.ts @@ -914,6 +914,46 @@ async function generateModels() { }); } + const minimaxDirectProviders = ["minimax", "minimax-cn"] as const; + const minimaxAnthropicIds = new Set([ + "MiniMax-M2", + "MiniMax-M2.1", + "MiniMax-M2.1-highspeed", + "MiniMax-M2.5", + "MiniMax-M2.5-highspeed", + "MiniMax-M2.7", + "MiniMax-M2.7-highspeed", + ]); + + for (const candidate of allModels) { + if ( + (candidate.provider === "minimax" || candidate.provider === "minimax-cn") && + minimaxAnthropicIds.has(candidate.id) + ) { + candidate.contextWindow = 204800; + candidate.maxTokens = 131072; + } + } + + for (const provider of minimaxDirectProviders) { + const baseModel = allModels.find((m) => m.provider === provider && m.id === "MiniMax-M2.1"); + if (!baseModel) continue; + if (allModels.some((m) => m.provider === provider && m.id === "MiniMax-M2.1-highspeed")) continue; + + allModels.push({ + ...baseModel, + id: "MiniMax-M2.1-highspeed", + name: "MiniMax-M2.1-highspeed", + cost: { + ...baseModel.cost, + input: baseModel.cost.input * 2, + output: baseModel.cost.output * 2, + }, + contextWindow: 204800, + maxTokens: 131072, + }); + } + // OpenAI Codex (ChatGPT OAuth) models // NOTE: These are not fetched from models.dev; we keep a small, explicit list to avoid aliases. // Context window is based on observed server limits (400s above ~272k), not marketing numbers. diff --git a/packages/ai/src/models.generated.ts b/packages/ai/src/models.generated.ts index 2e35b816..b9234bc4 100644 --- a/packages/ai/src/models.generated.ts +++ b/packages/ai/src/models.generated.ts @@ -4512,8 +4512,8 @@ export const MODELS = { cacheRead: 0, cacheWrite: 0, }, - contextWindow: 196608, - maxTokens: 128000, + contextWindow: 204800, + maxTokens: 131072, } satisfies Model<"anthropic-messages">, "MiniMax-M2.1": { id: "MiniMax-M2.1", @@ -4532,6 +4532,23 @@ export const MODELS = { contextWindow: 204800, maxTokens: 131072, } satisfies Model<"anthropic-messages">, + "MiniMax-M2.1-highspeed": { + id: "MiniMax-M2.1-highspeed", + name: "MiniMax-M2.1-highspeed", + api: "anthropic-messages", + provider: "minimax", + baseUrl: "https://api.minimax.io/anthropic", + reasoning: true, + input: ["text"], + cost: { + input: 0.6, + output: 2.4, + cacheRead: 0, + cacheWrite: 0, + }, + contextWindow: 204800, + maxTokens: 131072, + } satisfies Model<"anthropic-messages">, "MiniMax-M2.5": { id: "MiniMax-M2.5", name: "MiniMax-M2.5", @@ -4616,8 +4633,8 @@ export const MODELS = { cacheRead: 0, cacheWrite: 0, }, - contextWindow: 196608, - maxTokens: 128000, + contextWindow: 204800, + maxTokens: 131072, } satisfies Model<"anthropic-messages">, "MiniMax-M2.1": { id: "MiniMax-M2.1", @@ -4636,6 +4653,23 @@ export const MODELS = { contextWindow: 204800, maxTokens: 131072, } satisfies Model<"anthropic-messages">, + "MiniMax-M2.1-highspeed": { + id: "MiniMax-M2.1-highspeed", + name: "MiniMax-M2.1-highspeed", + api: "anthropic-messages", + provider: "minimax-cn", + baseUrl: "https://api.minimaxi.com/anthropic", + reasoning: true, + input: ["text"], + cost: { + input: 0.6, + output: 2.4, + cacheRead: 0, + cacheWrite: 0, + }, + contextWindow: 204800, + maxTokens: 131072, + } satisfies Model<"anthropic-messages">, "MiniMax-M2.5": { id: "MiniMax-M2.5", name: "MiniMax-M2.5", diff --git a/packages/coding-agent/src/core/model-resolver.ts b/packages/coding-agent/src/core/model-resolver.ts index 34d16045..89938a8d 100644 --- a/packages/coding-agent/src/core/model-resolver.ts +++ b/packages/coding-agent/src/core/model-resolver.ts @@ -26,11 +26,11 @@ export const defaultModelPerProvider: Record = { "vercel-ai-gateway": "anthropic/claude-opus-4-6", xai: "grok-4-fast-non-reasoning", groq: "openai/gpt-oss-120b", - cerebras: "zai-glm-4.6", - zai: "glm-4.6", + cerebras: "zai-glm-4.7", + zai: "glm-5", mistral: "devstral-medium-latest", - minimax: "MiniMax-M2.1", - "minimax-cn": "MiniMax-M2.1", + minimax: "MiniMax-M2.7", + "minimax-cn": "MiniMax-M2.7", huggingface: "moonshotai/Kimi-K2.5", opencode: "claude-opus-4-6", "opencode-go": "kimi-k2.5", diff --git a/packages/coding-agent/test/model-resolver.test.ts b/packages/coding-agent/test/model-resolver.test.ts index 70eeb7bd..511e5408 100644 --- a/packages/coding-agent/test/model-resolver.test.ts +++ b/packages/coding-agent/test/model-resolver.test.ts @@ -378,6 +378,13 @@ describe("default model selection", () => { expect(defaultModelPerProvider["openai-codex"]).toBe("gpt-5.4"); }); + test("zai, minimax, and cerebras defaults track current models", () => { + expect(defaultModelPerProvider.zai).toBe("glm-5"); + expect(defaultModelPerProvider.minimax).toBe("MiniMax-M2.7"); + expect(defaultModelPerProvider["minimax-cn"]).toBe("MiniMax-M2.7"); + expect(defaultModelPerProvider.cerebras).toBe("zai-glm-4.7"); + }); + test("ai-gateway default is opus 4.6", () => { expect(defaultModelPerProvider["vercel-ai-gateway"]).toBe("anthropic/claude-opus-4-6"); });