From c2c32febb02c26076e7ef8c89aacfbf7a661d5c2 Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Thu, 16 Jul 2026 18:56:54 +0200 Subject: [PATCH] fix(ai): correct Kimi K3 gateway output limits --- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/scripts/generate-models.ts | 9 +++++++++ packages/ai/src/providers/openrouter.models.ts | 10 +++++----- packages/ai/src/providers/vercel-ai-gateway.models.ts | 2 +- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 5beb7f66..54c4d49f 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +### Fixed + +- Fixed Kimi K3 output limits for Vercel AI Gateway and OpenRouter models. + ## [0.80.8] - 2026-07-16 ### Breaking Changes diff --git a/packages/ai/scripts/generate-models.ts b/packages/ai/scripts/generate-models.ts index cd18e7f2..580ff04d 100644 --- a/packages/ai/scripts/generate-models.ts +++ b/packages/ai/scripts/generate-models.ts @@ -234,6 +234,8 @@ const KIMI_K3_THINKING_LEVEL_MAP = { xhigh: null, max: "max", } as const; +const KIMI_K3_MAX_TOKENS = 131072; +const OPENROUTER_KIMI_K3_MODEL_IDS = new Set(["moonshotai/kimi-k3", "~moonshotai/kimi-latest"]); const ANT_LING_RING_THINKING_LEVEL_MAP = { off: null, @@ -1825,6 +1827,13 @@ async function generateModels() { if (candidate.provider === "openai" && candidate.id === "gpt-5-pro") { candidate.maxTokens = 128000; } + // Keep Kimi K3's canonical output limit when gateway metadata is missing or incorrect. + if ( + (candidate.provider === "openrouter" && OPENROUTER_KIMI_K3_MODEL_IDS.has(candidate.id)) || + (candidate.provider === "vercel-ai-gateway" && candidate.id === "moonshotai/kimi-k3") + ) { + candidate.maxTokens = KIMI_K3_MAX_TOKENS; + } // Keep selected OpenRouter model metadata stable until upstream settles. if (candidate.provider === "openrouter" && candidate.id === "moonshotai/kimi-k2.5") { candidate.cost.input = 0.41; diff --git a/packages/ai/src/providers/openrouter.models.ts b/packages/ai/src/providers/openrouter.models.ts index 142c447b..03f2ada1 100644 --- a/packages/ai/src/providers/openrouter.models.ts +++ b/packages/ai/src/providers/openrouter.models.ts @@ -1939,7 +1939,7 @@ export const OPENROUTER_MODELS = { cacheWrite: 0, }, contextWindow: 1048576, - maxTokens: 4096, + maxTokens: 131072, } satisfies Model<"openai-completions">, "nex-agi/nex-n2-mini": { id: "nex-agi/nex-n2-mini", @@ -4706,9 +4706,9 @@ export const OPENROUTER_MODELS = { thinkingLevelMap: {"xhigh":"xhigh"}, input: ["text"], cost: { - input: 0.9338, - output: 2.9348, - cacheRead: 0.17342, + input: 0.9226, + output: 2.8996, + cacheRead: 0.17134, cacheWrite: 0, }, contextWindow: 1048576, @@ -4856,7 +4856,7 @@ export const OPENROUTER_MODELS = { cacheWrite: 0, }, contextWindow: 1048576, - maxTokens: 4096, + maxTokens: 131072, } satisfies Model<"openai-completions">, "~openai/gpt-latest": { id: "~openai/gpt-latest", diff --git a/packages/ai/src/providers/vercel-ai-gateway.models.ts b/packages/ai/src/providers/vercel-ai-gateway.models.ts index e5fc7f1c..dccf0695 100644 --- a/packages/ai/src/providers/vercel-ai-gateway.models.ts +++ b/packages/ai/src/providers/vercel-ai-gateway.models.ts @@ -1905,7 +1905,7 @@ export const VERCEL_AI_GATEWAY_MODELS = { cacheWrite: 0, }, contextWindow: 1000000, - maxTokens: 256000, + maxTokens: 131072, } satisfies Model<"anthropic-messages">, "nvidia/nemotron-3-nano-30b-a3b": { id: "nvidia/nemotron-3-nano-30b-a3b",