From 34e334eabe2346059545a6e3e84322614977d94d Mon Sep 17 00:00:00 2001 From: Matan Kushner Date: Mon, 13 Apr 2026 13:44:50 +0900 Subject: [PATCH] feat(provider): add vercel to all gateway-supported fallback entries Adds vercel to every fallback entry where the model exists on the gateway (kimi-k2.5, glm-5, glm-4.6v, minimax-m2.7, grok-code-fast-1, gpt-5-nano). Adds inferSubProvider mappings for minimax, moonshotai, and zai. Updates librarian/explore special cases to prefer minimax via gateway over claude-haiku. --- .../__snapshots__/model-fallback.test.ts.snap | 190 +++++++++++++++++- src/cli/model-fallback.test.ts | 12 +- src/cli/model-fallback.ts | 6 +- src/cli/provider-model-id-transform.test.ts | 27 +++ src/shared/model-requirements.test.ts | 4 +- src/shared/model-requirements.ts | 64 +++--- src/shared/provider-model-id-transform.ts | 3 + 7 files changed, 260 insertions(+), 46 deletions(-) diff --git a/src/cli/__snapshots__/model-fallback.test.ts.snap b/src/cli/__snapshots__/model-fallback.test.ts.snap index 73c5bfdb8..88f86f97b 100644 --- a/src/cli/__snapshots__/model-fallback.test.ts.snap +++ b/src/cli/__snapshots__/model-fallback.test.ts.snap @@ -4144,22 +4144,53 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin "agents": { "atlas": { "fallback_models": [ + { + "model": "vercel/moonshotai/kimi-k2.5", + }, { "model": "vercel/openai/gpt-5.4", "variant": "medium", }, + { + "model": "vercel/minimax/minimax-m2.7", + }, ], "model": "vercel/anthropic/claude-sonnet-4.6", }, "explore": { - "model": "vercel/anthropic/claude-haiku-4.5", + "fallback_models": [ + { + "model": "vercel/xai/grok-code-fast-1", + }, + { + "model": "vercel/minimax/minimax-m2.7", + }, + { + "model": "vercel/anthropic/claude-haiku-4.5", + }, + { + "model": "vercel/openai/gpt-5-nano", + }, + ], + "model": "vercel/minimax/minimax-m2.7-highspeed", }, "hephaestus": { "model": "vercel/openai/gpt-5.4", "variant": "medium", }, "librarian": { - "model": "vercel/anthropic/claude-haiku-4.5", + "fallback_models": [ + { + "model": "vercel/minimax/minimax-m2.7-highspeed", + }, + { + "model": "vercel/anthropic/claude-haiku-4.5", + }, + { + "model": "vercel/openai/gpt-5-nano", + }, + ], + "model": "vercel/minimax/minimax-m2.7", }, "metis": { "fallback_models": [ @@ -4167,6 +4198,9 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin "model": "vercel/openai/gpt-5.4", "variant": "high", }, + { + "model": "vercel/zai/glm-5", + }, ], "model": "vercel/anthropic/claude-opus-4.6", "variant": "max", @@ -4181,12 +4215,21 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin "model": "vercel/google/gemini-3.1-pro-preview", "variant": "high", }, + { + "model": "vercel/zai/glm-5", + }, ], "model": "vercel/openai/gpt-5.4", "variant": "xhigh", }, "multimodal-looker": { "fallback_models": [ + { + "model": "vercel/moonshotai/kimi-k2.5", + }, + { + "model": "vercel/zai/glm-4.6v", + }, { "model": "vercel/openai/gpt-5-nano", }, @@ -4204,6 +4247,9 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin "model": "vercel/anthropic/claude-opus-4.6", "variant": "max", }, + { + "model": "vercel/zai/glm-5", + }, ], "model": "vercel/openai/gpt-5.4", "variant": "high", @@ -4214,6 +4260,9 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin "model": "vercel/openai/gpt-5.4", "variant": "high", }, + { + "model": "vercel/zai/glm-5", + }, { "model": "vercel/google/gemini-3.1-pro-preview", }, @@ -4223,20 +4272,32 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin }, "sisyphus": { "fallback_models": [ + { + "model": "vercel/moonshotai/kimi-k2.5", + }, { "model": "vercel/openai/gpt-5.4", "variant": "medium", }, + { + "model": "vercel/zai/glm-5", + }, ], "model": "vercel/anthropic/claude-opus-4.6", "variant": "max", }, "sisyphus-junior": { "fallback_models": [ + { + "model": "vercel/moonshotai/kimi-k2.5", + }, { "model": "vercel/openai/gpt-5.4", "variant": "medium", }, + { + "model": "vercel/minimax/minimax-m2.7", + }, ], "model": "vercel/anthropic/claude-sonnet-4.6", }, @@ -4277,6 +4338,12 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin { "model": "vercel/google/gemini-3-flash", }, + { + "model": "vercel/minimax/minimax-m2.7", + }, + { + "model": "vercel/openai/gpt-5-nano", + }, ], "model": "vercel/openai/gpt-5.4-mini", }, @@ -4290,6 +4357,9 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin "model": "vercel/anthropic/claude-opus-4.6", "variant": "max", }, + { + "model": "vercel/zai/glm-5", + }, ], "model": "vercel/openai/gpt-5.4", "variant": "xhigh", @@ -4300,9 +4370,15 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin "model": "vercel/openai/gpt-5.3-codex", "variant": "medium", }, + { + "model": "vercel/moonshotai/kimi-k2.5", + }, { "model": "vercel/google/gemini-3-flash", }, + { + "model": "vercel/minimax/minimax-m2.7", + }, ], "model": "vercel/anthropic/claude-sonnet-4.6", }, @@ -4312,14 +4388,23 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin "model": "vercel/openai/gpt-5.3-codex", "variant": "medium", }, + { + "model": "vercel/moonshotai/kimi-k2.5", + }, { "model": "vercel/google/gemini-3-flash", }, + { + "model": "vercel/minimax/minimax-m2.7", + }, ], "model": "vercel/anthropic/claude-sonnet-4.6", }, "visual-engineering": { "fallback_models": [ + { + "model": "vercel/zai/glm-5", + }, { "model": "vercel/anthropic/claude-opus-4.6", "variant": "max", @@ -4330,9 +4415,15 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin }, "writing": { "fallback_models": [ + { + "model": "vercel/moonshotai/kimi-k2.5", + }, { "model": "vercel/anthropic/claude-sonnet-4.6", }, + { + "model": "vercel/minimax/minimax-m2.7", + }, ], "model": "vercel/google/gemini-3-flash", }, @@ -4346,22 +4437,53 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin "agents": { "atlas": { "fallback_models": [ + { + "model": "vercel/moonshotai/kimi-k2.5", + }, { "model": "vercel/openai/gpt-5.4", "variant": "medium", }, + { + "model": "vercel/minimax/minimax-m2.7", + }, ], "model": "vercel/anthropic/claude-sonnet-4.6", }, "explore": { - "model": "vercel/anthropic/claude-haiku-4.5", + "fallback_models": [ + { + "model": "vercel/xai/grok-code-fast-1", + }, + { + "model": "vercel/minimax/minimax-m2.7", + }, + { + "model": "vercel/anthropic/claude-haiku-4.5", + }, + { + "model": "vercel/openai/gpt-5-nano", + }, + ], + "model": "vercel/minimax/minimax-m2.7-highspeed", }, "hephaestus": { "model": "vercel/openai/gpt-5.4", "variant": "medium", }, "librarian": { - "model": "vercel/anthropic/claude-haiku-4.5", + "fallback_models": [ + { + "model": "vercel/minimax/minimax-m2.7-highspeed", + }, + { + "model": "vercel/anthropic/claude-haiku-4.5", + }, + { + "model": "vercel/openai/gpt-5-nano", + }, + ], + "model": "vercel/minimax/minimax-m2.7", }, "metis": { "fallback_models": [ @@ -4369,6 +4491,9 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin "model": "vercel/openai/gpt-5.4", "variant": "high", }, + { + "model": "vercel/zai/glm-5", + }, ], "model": "vercel/anthropic/claude-opus-4.6", "variant": "max", @@ -4383,12 +4508,21 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin "model": "vercel/google/gemini-3.1-pro-preview", "variant": "high", }, + { + "model": "vercel/zai/glm-5", + }, ], "model": "vercel/openai/gpt-5.4", "variant": "xhigh", }, "multimodal-looker": { "fallback_models": [ + { + "model": "vercel/moonshotai/kimi-k2.5", + }, + { + "model": "vercel/zai/glm-4.6v", + }, { "model": "vercel/openai/gpt-5-nano", }, @@ -4406,6 +4540,9 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin "model": "vercel/anthropic/claude-opus-4.6", "variant": "max", }, + { + "model": "vercel/zai/glm-5", + }, ], "model": "vercel/openai/gpt-5.4", "variant": "high", @@ -4416,6 +4553,9 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin "model": "vercel/openai/gpt-5.4", "variant": "high", }, + { + "model": "vercel/zai/glm-5", + }, { "model": "vercel/google/gemini-3.1-pro-preview", }, @@ -4425,20 +4565,32 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin }, "sisyphus": { "fallback_models": [ + { + "model": "vercel/moonshotai/kimi-k2.5", + }, { "model": "vercel/openai/gpt-5.4", "variant": "medium", }, + { + "model": "vercel/zai/glm-5", + }, ], "model": "vercel/anthropic/claude-opus-4.6", "variant": "max", }, "sisyphus-junior": { "fallback_models": [ + { + "model": "vercel/moonshotai/kimi-k2.5", + }, { "model": "vercel/openai/gpt-5.4", "variant": "medium", }, + { + "model": "vercel/minimax/minimax-m2.7", + }, ], "model": "vercel/anthropic/claude-sonnet-4.6", }, @@ -4479,6 +4631,12 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin { "model": "vercel/google/gemini-3-flash", }, + { + "model": "vercel/minimax/minimax-m2.7", + }, + { + "model": "vercel/openai/gpt-5-nano", + }, ], "model": "vercel/openai/gpt-5.4-mini", }, @@ -4492,6 +4650,9 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin "model": "vercel/anthropic/claude-opus-4.6", "variant": "max", }, + { + "model": "vercel/zai/glm-5", + }, ], "model": "vercel/openai/gpt-5.4", "variant": "xhigh", @@ -4502,6 +4663,12 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin "model": "vercel/openai/gpt-5.4", "variant": "high", }, + { + "model": "vercel/zai/glm-5", + }, + { + "model": "vercel/moonshotai/kimi-k2.5", + }, ], "model": "vercel/anthropic/claude-opus-4.6", "variant": "max", @@ -4512,14 +4679,23 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin "model": "vercel/openai/gpt-5.3-codex", "variant": "medium", }, + { + "model": "vercel/moonshotai/kimi-k2.5", + }, { "model": "vercel/google/gemini-3-flash", }, + { + "model": "vercel/minimax/minimax-m2.7", + }, ], "model": "vercel/anthropic/claude-sonnet-4.6", }, "visual-engineering": { "fallback_models": [ + { + "model": "vercel/zai/glm-5", + }, { "model": "vercel/anthropic/claude-opus-4.6", "variant": "max", @@ -4530,9 +4706,15 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin }, "writing": { "fallback_models": [ + { + "model": "vercel/moonshotai/kimi-k2.5", + }, { "model": "vercel/anthropic/claude-sonnet-4.6", }, + { + "model": "vercel/minimax/minimax-m2.7", + }, ], "model": "vercel/google/gemini-3-flash", }, diff --git a/src/cli/model-fallback.test.ts b/src/cli/model-fallback.test.ts index 1a6a6c797..f1df3cc0a 100644 --- a/src/cli/model-fallback.test.ts +++ b/src/cli/model-fallback.test.ts @@ -631,26 +631,26 @@ describe("generateModelConfig", () => { expect(result).toMatchSnapshot() }) - test("explore uses vercel/anthropic/claude-haiku-4.5 when only gateway available", () => { + test("explore uses vercel/minimax/minimax-m2.7-highspeed when only gateway available", () => { // #given only Vercel AI Gateway is available const config = createConfig({ hasVercelAiGateway: true }) // #when generateModelConfig is called const result = generateModelConfig(config) - // #then explore should use gateway-routed claude-haiku - expect(result.agents?.explore?.model).toBe("vercel/anthropic/claude-haiku-4.5") + // #then explore should use gateway-routed minimax (preferred over claude-haiku) + expect(result.agents?.explore?.model).toBe("vercel/minimax/minimax-m2.7-highspeed") }) - test("librarian uses vercel/anthropic/claude-haiku-4.5 when only gateway available", () => { + test("librarian uses vercel/minimax/minimax-m2.7 when only gateway available", () => { // #given only Vercel AI Gateway is available const config = createConfig({ hasVercelAiGateway: true }) // #when generateModelConfig is called const result = generateModelConfig(config) - // #then librarian should use gateway-routed claude-haiku - expect(result.agents?.librarian?.model).toBe("vercel/anthropic/claude-haiku-4.5") + // #then librarian should use gateway-routed minimax (preferred over claude-haiku) + expect(result.agents?.librarian?.model).toBe("vercel/minimax/minimax-m2.7") }) test("Hephaestus is created when only Vercel AI Gateway is available", () => { diff --git a/src/cli/model-fallback.ts b/src/cli/model-fallback.ts index ab67960e9..217420c46 100644 --- a/src/cli/model-fallback.ts +++ b/src/cli/model-fallback.ts @@ -129,10 +129,10 @@ export function generateModelConfig(config: InstallConfig): GeneratedOmoConfig { let agentConfig: AgentConfig | undefined if (avail.opencodeGo) { agentConfig = { model: "opencode-go/minimax-m2.7" } + } else if (avail.vercelAiGateway) { + agentConfig = { model: "vercel/minimax/minimax-m2.7" } } else if (avail.zai) { agentConfig = { model: ZAI_MODEL } - } else if (avail.vercelAiGateway) { - agentConfig = { model: "vercel/anthropic/claude-haiku-4.5" } } if (agentConfig) { agents[role] = attachAllFallbackModels(agentConfig, req.fallbackChain, avail) @@ -149,7 +149,7 @@ export function generateModelConfig(config: InstallConfig): GeneratedOmoConfig { } else if (avail.opencodeGo) { agentConfig = { model: "opencode-go/minimax-m2.7" } } else if (avail.vercelAiGateway) { - agentConfig = { model: "vercel/anthropic/claude-haiku-4.5" } + agentConfig = { model: "vercel/minimax/minimax-m2.7-highspeed" } } else if (avail.copilot) { agentConfig = { model: "github-copilot/gpt-5-mini" } } else { diff --git a/src/cli/provider-model-id-transform.test.ts b/src/cli/provider-model-id-transform.test.ts index a898b7c2b..e87fc12ff 100644 --- a/src/cli/provider-model-id-transform.test.ts +++ b/src/cli/provider-model-id-transform.test.ts @@ -274,6 +274,33 @@ describe("transformModelForProvider", () => { expect(result).toBe("anthropic/claude-opus-4.6") }) + test("prepends minimax/ for minimax models", () => { + // #given vercel provider and minimax-m2.7 model + // #when transformModelForProvider is called + const result = transformModelForProvider("vercel", "minimax-m2.7") + + // #then should produce minimax/minimax-m2.7 + expect(result).toBe("minimax/minimax-m2.7") + }) + + test("prepends moonshotai/ for kimi models", () => { + // #given vercel provider and kimi-k2.5 model + // #when transformModelForProvider is called + const result = transformModelForProvider("vercel", "kimi-k2.5") + + // #then should produce moonshotai/kimi-k2.5 + expect(result).toBe("moonshotai/kimi-k2.5") + }) + + test("prepends zai/ for glm models", () => { + // #given vercel provider and glm-5 model + // #when transformModelForProvider is called + const result = transformModelForProvider("vercel", "glm-5") + + // #then should produce zai/glm-5 + expect(result).toBe("zai/glm-5") + }) + test("passes through unknown models without sub-provider prefix", () => { // #given vercel provider and an unknown model name // #when transformModelForProvider is called diff --git a/src/shared/model-requirements.test.ts b/src/shared/model-requirements.test.ts index 253d4e78a..324176b57 100644 --- a/src/shared/model-requirements.test.ts +++ b/src/shared/model-requirements.test.ts @@ -40,7 +40,7 @@ describe("AGENT_MODEL_REQUIREMENTS", () => { expect(primary.variant).toBe("max") const second = sisyphus.fallbackChain[1] - expect(second.providers).toEqual(["opencode-go"]) + expect(second.providers).toEqual(["opencode-go", "vercel"]) expect(second.model).toBe("kimi-k2.5") const third = sisyphus.fallbackChain[2] @@ -137,7 +137,7 @@ describe("AGENT_MODEL_REQUIREMENTS", () => { expect(primary.variant).toBe("medium") const secondary = multimodalLooker.fallbackChain[1] - expect(secondary.providers).toEqual(["opencode-go"]) + expect(secondary.providers).toEqual(["opencode-go", "vercel"]) expect(secondary.model).toBe("kimi-k2.5") const tertiary = multimodalLooker.fallbackChain[2] diff --git a/src/shared/model-requirements.ts b/src/shared/model-requirements.ts index 4a0ce6071..b9ac989ab 100644 --- a/src/shared/model-requirements.ts +++ b/src/shared/model-requirements.ts @@ -25,7 +25,7 @@ export const AGENT_MODEL_REQUIREMENTS: Record = { model: "claude-opus-4-6", variant: "max", }, - { providers: ["opencode-go"], model: "kimi-k2.5" }, + { providers: ["opencode-go", "vercel"], model: "kimi-k2.5" }, { providers: ["kimi-for-coding"], model: "k2p5" }, { providers: [ @@ -35,11 +35,12 @@ export const AGENT_MODEL_REQUIREMENTS: Record = { "firmware", "ollama-cloud", "aihubmix", + "vercel", ], model: "kimi-k2.5", }, { providers: ["openai", "github-copilot", "opencode", "vercel"], model: "gpt-5.4", variant: "medium" }, - { providers: ["zai-coding-plan", "opencode"], model: "glm-5" }, + { providers: ["zai-coding-plan", "opencode", "vercel"], model: "glm-5" }, { providers: ["opencode"], model: "big-pickle" }, ], requiresAnyModel: true, @@ -71,31 +72,31 @@ export const AGENT_MODEL_REQUIREMENTS: Record = { model: "claude-opus-4-6", variant: "max", }, - { providers: ["opencode-go"], model: "glm-5" }, + { providers: ["opencode-go", "vercel"], model: "glm-5" }, ], }, librarian: { fallbackChain: [ - { providers: ["opencode-go"], model: "minimax-m2.7" }, - { providers: ["opencode"], model: "minimax-m2.7-highspeed" }, + { providers: ["opencode-go", "vercel"], model: "minimax-m2.7" }, + { providers: ["opencode", "vercel"], model: "minimax-m2.7-highspeed" }, { providers: ["anthropic", "opencode", "vercel"], model: "claude-haiku-4-5" }, - { providers: ["opencode"], model: "gpt-5-nano" }, + { providers: ["opencode", "vercel"], model: "gpt-5-nano" }, ], }, explore: { fallbackChain: [ - { providers: ["github-copilot", "xai"], model: "grok-code-fast-1" }, - { providers: ["opencode-go"], model: "minimax-m2.7-highspeed" }, - { providers: ["opencode"], model: "minimax-m2.7" }, + { providers: ["github-copilot", "xai", "vercel"], model: "grok-code-fast-1" }, + { providers: ["opencode-go", "vercel"], model: "minimax-m2.7-highspeed" }, + { providers: ["opencode", "vercel"], model: "minimax-m2.7" }, { providers: ["anthropic", "opencode", "vercel"], model: "claude-haiku-4-5" }, - { providers: ["opencode"], model: "gpt-5-nano" }, + { providers: ["opencode", "vercel"], model: "gpt-5-nano" }, ], }, "multimodal-looker": { fallbackChain: [ { providers: ["openai", "opencode", "vercel"], model: "gpt-5.4", variant: "medium" }, - { providers: ["opencode-go"], model: "kimi-k2.5" }, - { providers: ["zai-coding-plan"], model: "glm-4.6v" }, + { providers: ["opencode-go", "vercel"], model: "kimi-k2.5" }, + { providers: ["zai-coding-plan", "vercel"], model: "glm-4.6v" }, { providers: ["openai", "github-copilot", "opencode", "vercel"], model: "gpt-5-nano" }, ], }, @@ -111,7 +112,7 @@ export const AGENT_MODEL_REQUIREMENTS: Record = { model: "gpt-5.4", variant: "high", }, - { providers: ["opencode-go"], model: "glm-5" }, + { providers: ["opencode-go", "vercel"], model: "glm-5" }, { providers: ["google", "github-copilot", "opencode", "vercel"], model: "gemini-3.1-pro", @@ -130,7 +131,7 @@ export const AGENT_MODEL_REQUIREMENTS: Record = { model: "gpt-5.4", variant: "high", }, - { providers: ["opencode-go"], model: "glm-5" }, + { providers: ["opencode-go", "vercel"], model: "glm-5" }, { providers: ["kimi-for-coding"], model: "k2p5" }, ], }, @@ -151,31 +152,31 @@ export const AGENT_MODEL_REQUIREMENTS: Record = { model: "gemini-3.1-pro", variant: "high", }, - { providers: ["opencode-go"], model: "glm-5" }, + { providers: ["opencode-go", "vercel"], model: "glm-5" }, ], }, atlas: { fallbackChain: [ { providers: ["anthropic", "github-copilot", "opencode", "vercel"], model: "claude-sonnet-4-6" }, - { providers: ["opencode-go"], model: "kimi-k2.5" }, + { providers: ["opencode-go", "vercel"], model: "kimi-k2.5" }, { providers: ["openai", "github-copilot", "opencode", "vercel"], model: "gpt-5.4", variant: "medium", }, - { providers: ["opencode-go"], model: "minimax-m2.7" }, + { providers: ["opencode-go", "vercel"], model: "minimax-m2.7" }, ], }, "sisyphus-junior": { fallbackChain: [ { providers: ["anthropic", "github-copilot", "opencode", "vercel"], model: "claude-sonnet-4-6" }, - { providers: ["opencode-go"], model: "kimi-k2.5" }, + { providers: ["opencode-go", "vercel"], model: "kimi-k2.5" }, { providers: ["openai", "github-copilot", "opencode", "vercel"], model: "gpt-5.4", variant: "medium", }, - { providers: ["opencode-go"], model: "minimax-m2.7" }, + { providers: ["opencode-go", "vercel"], model: "minimax-m2.7" }, { providers: ["opencode"], model: "big-pickle" }, ], }, @@ -189,13 +190,13 @@ export const CATEGORY_MODEL_REQUIREMENTS: Record = { model: "gemini-3.1-pro", variant: "high", }, - { providers: ["zai-coding-plan", "opencode"], model: "glm-5" }, + { providers: ["zai-coding-plan", "opencode", "vercel"], model: "glm-5" }, { providers: ["anthropic", "github-copilot", "opencode", "vercel"], model: "claude-opus-4-6", variant: "max", }, - { providers: ["opencode-go"], model: "glm-5" }, + { providers: ["opencode-go", "vercel"], model: "glm-5" }, { providers: ["kimi-for-coding"], model: "k2p5" }, ], }, @@ -216,7 +217,7 @@ export const CATEGORY_MODEL_REQUIREMENTS: Record = { model: "claude-opus-4-6", variant: "max", }, - { providers: ["opencode-go"], model: "glm-5" }, + { providers: ["opencode-go", "vercel"], model: "glm-5" }, ], }, deep: { @@ -268,8 +269,8 @@ export const CATEGORY_MODEL_REQUIREMENTS: Record = { providers: ["google", "github-copilot", "opencode", "vercel"], model: "gemini-3-flash", }, - { providers: ["opencode-go"], model: "minimax-m2.7" }, - { providers: ["opencode"], model: "gpt-5-nano" }, + { providers: ["opencode-go", "vercel"], model: "minimax-m2.7" }, + { providers: ["opencode", "vercel"], model: "gpt-5-nano" }, ], }, "unspecified-low": { @@ -283,12 +284,12 @@ export const CATEGORY_MODEL_REQUIREMENTS: Record = { model: "gpt-5.3-codex", variant: "medium", }, - { providers: ["opencode-go"], model: "kimi-k2.5" }, + { providers: ["opencode-go", "vercel"], model: "kimi-k2.5" }, { providers: ["google", "github-copilot", "opencode", "vercel"], model: "gemini-3-flash", }, - { providers: ["opencode-go"], model: "minimax-m2.7" }, + { providers: ["opencode-go", "vercel"], model: "minimax-m2.7" }, ], }, "unspecified-high": { @@ -303,10 +304,10 @@ export const CATEGORY_MODEL_REQUIREMENTS: Record = { model: "gpt-5.4", variant: "high", }, - { providers: ["zai-coding-plan", "opencode"], model: "glm-5" }, + { providers: ["zai-coding-plan", "opencode", "vercel"], model: "glm-5" }, { providers: ["kimi-for-coding"], model: "k2p5" }, - { providers: ["opencode-go"], model: "glm-5" }, - { providers: ["opencode"], model: "kimi-k2.5" }, + { providers: ["opencode-go", "vercel"], model: "glm-5" }, + { providers: ["opencode", "vercel"], model: "kimi-k2.5" }, { providers: [ "opencode", @@ -315,6 +316,7 @@ export const CATEGORY_MODEL_REQUIREMENTS: Record = { "firmware", "ollama-cloud", "aihubmix", + "vercel", ], model: "kimi-k2.5", }, @@ -326,12 +328,12 @@ export const CATEGORY_MODEL_REQUIREMENTS: Record = { providers: ["google", "github-copilot", "opencode", "vercel"], model: "gemini-3-flash", }, - { providers: ["opencode-go"], model: "kimi-k2.5" }, + { providers: ["opencode-go", "vercel"], model: "kimi-k2.5" }, { providers: ["anthropic", "github-copilot", "opencode", "vercel"], model: "claude-sonnet-4-6", }, - { providers: ["opencode-go"], model: "minimax-m2.7" }, + { providers: ["opencode-go", "vercel"], model: "minimax-m2.7" }, ], }, }; diff --git a/src/shared/provider-model-id-transform.ts b/src/shared/provider-model-id-transform.ts index 9e304c9d8..2d5fd656d 100644 --- a/src/shared/provider-model-id-transform.ts +++ b/src/shared/provider-model-id-transform.ts @@ -3,6 +3,9 @@ function inferSubProvider(model: string): string | undefined { if (model.startsWith("gpt-")) return "openai" if (model.startsWith("gemini-")) return "google" if (model.startsWith("grok-")) return "xai" + if (model.startsWith("minimax-")) return "minimax" + if (model.startsWith("kimi-")) return "moonshotai" + if (model.startsWith("glm-")) return "zai" return undefined }