From 70c57632975c989f80a3a49c79ff43213f1f1dad Mon Sep 17 00:00:00 2001 From: David Brailovsky Date: Thu, 16 Jul 2026 15:39:22 +0000 Subject: [PATCH] add deferred tool loading for kimi-k3 --- packages/ai/scripts/generate-models.ts | 9 +++-- .../ai/src/providers/moonshotai-cn.models.ts | 2 +- .../ai/src/providers/moonshotai.models.ts | 2 +- .../ai/src/providers/openrouter.models.ts | 34 ++++++++++++++----- .../src/providers/vercel-ai-gateway.models.ts | 17 ++++++++++ 5 files changed, 51 insertions(+), 13 deletions(-) diff --git a/packages/ai/scripts/generate-models.ts b/packages/ai/scripts/generate-models.ts index 1ed563e6..cd18e7f2 100644 --- a/packages/ai/scripts/generate-models.ts +++ b/packages/ai/scripts/generate-models.ts @@ -1675,6 +1675,11 @@ async function loadModelsDevData(): Promise[]> { if (m.tool_call !== true) continue; const isKimiK3 = modelId === "kimi-k3"; + const compat = isKimiK3 ? { ...moonshotCompat } : moonshotCompat; + if (isKimiK3) { + compat.requiresReasoningContentOnAssistantMessages = true; + compat.deferredToolsMode = "kimi"; + } models.push({ id: modelId, name: m.name || modelId, @@ -1692,9 +1697,7 @@ async function loadModelsDevData(): Promise[]> { }, contextWindow: m.limit?.context || 4096, maxTokens: m.limit?.output || 4096, - compat: isKimiK3 - ? { ...moonshotCompat, requiresReasoningContentOnAssistantMessages: true } - : moonshotCompat, + compat, }); } } diff --git a/packages/ai/src/providers/moonshotai-cn.models.ts b/packages/ai/src/providers/moonshotai-cn.models.ts index b5e20355..5e85f080 100644 --- a/packages/ai/src/providers/moonshotai-cn.models.ts +++ b/packages/ai/src/providers/moonshotai-cn.models.ts @@ -174,7 +174,7 @@ export const MOONSHOTAI_CN_MODELS = { api: "openai-completions", provider: "moonshotai-cn", baseUrl: "https://api.moonshot.cn/v1", - compat: {"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","supportsStrictMode":false,"thinkingFormat":"deepseek","requiresReasoningContentOnAssistantMessages":true}, + compat: {"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","supportsStrictMode":false,"thinkingFormat":"deepseek","requiresReasoningContentOnAssistantMessages":true,"deferredToolsMode":"kimi"}, reasoning: true, thinkingLevelMap: {"off":null,"minimal":null,"low":null,"medium":null,"high":null,"xhigh":null,"max":"max"}, input: ["text", "image"], diff --git a/packages/ai/src/providers/moonshotai.models.ts b/packages/ai/src/providers/moonshotai.models.ts index 9931870d..510ae17e 100644 --- a/packages/ai/src/providers/moonshotai.models.ts +++ b/packages/ai/src/providers/moonshotai.models.ts @@ -174,7 +174,7 @@ export const MOONSHOTAI_MODELS = { api: "openai-completions", provider: "moonshotai", baseUrl: "https://api.moonshot.ai/v1", - compat: {"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","supportsStrictMode":false,"thinkingFormat":"deepseek","requiresReasoningContentOnAssistantMessages":true}, + compat: {"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","supportsStrictMode":false,"thinkingFormat":"deepseek","requiresReasoningContentOnAssistantMessages":true,"deferredToolsMode":"kimi"}, reasoning: true, thinkingLevelMap: {"off":null,"minimal":null,"low":null,"medium":null,"high":null,"xhigh":null,"max":"max"}, input: ["text", "image"], diff --git a/packages/ai/src/providers/openrouter.models.ts b/packages/ai/src/providers/openrouter.models.ts index b000c871..142c447b 100644 --- a/packages/ai/src/providers/openrouter.models.ts +++ b/packages/ai/src/providers/openrouter.models.ts @@ -1923,6 +1923,24 @@ export const OPENROUTER_MODELS = { contextWindow: 262144, maxTokens: 262144, } satisfies Model<"openai-completions">, + "moonshotai/kimi-k3": { + id: "moonshotai/kimi-k3", + name: "MoonshotAI: Kimi K3", + api: "openai-completions", + provider: "openrouter", + baseUrl: "https://openrouter.ai/api/v1", + compat: {"supportsDeveloperRole":false,"thinkingFormat":"openrouter"}, + reasoning: true, + input: ["text", "image"], + cost: { + input: 3, + output: 15, + cacheRead: 0.3, + cacheWrite: 0, + }, + contextWindow: 1048576, + maxTokens: 4096, + } satisfies Model<"openai-completions">, "nex-agi/nex-n2-mini": { id: "nex-agi/nex-n2-mini", name: "Nex AGI: Nex-N2-Mini", @@ -4688,9 +4706,9 @@ export const OPENROUTER_MODELS = { thinkingLevelMap: {"xhigh":"xhigh"}, input: ["text"], cost: { - input: 0.9366, - output: 2.9436, - cacheRead: 0.17394, + input: 0.9338, + output: 2.9348, + cacheRead: 0.17342, cacheWrite: 0, }, contextWindow: 1048576, @@ -4832,13 +4850,13 @@ export const OPENROUTER_MODELS = { reasoning: true, input: ["text", "image"], cost: { - input: 0.66, - output: 3.41, - cacheRead: 0.15, + input: 3, + output: 15, + cacheRead: 0.3, cacheWrite: 0, }, - contextWindow: 262144, - maxTokens: 262144, + contextWindow: 1048576, + maxTokens: 4096, } 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 c9d8aa7f..e5fc7f1c 100644 --- a/packages/ai/src/providers/vercel-ai-gateway.models.ts +++ b/packages/ai/src/providers/vercel-ai-gateway.models.ts @@ -1890,6 +1890,23 @@ export const VERCEL_AI_GATEWAY_MODELS = { contextWindow: 262144, maxTokens: 32768, } satisfies Model<"anthropic-messages">, + "moonshotai/kimi-k3": { + id: "moonshotai/kimi-k3", + name: "Kimi K3", + api: "anthropic-messages", + provider: "vercel-ai-gateway", + baseUrl: "https://ai-gateway.vercel.sh", + reasoning: true, + input: ["text", "image"], + cost: { + input: 3, + output: 15, + cacheRead: 0.3, + cacheWrite: 0, + }, + contextWindow: 1000000, + maxTokens: 256000, + } satisfies Model<"anthropic-messages">, "nvidia/nemotron-3-nano-30b-a3b": { id: "nvidia/nemotron-3-nano-30b-a3b", name: "Nemotron 3 Nano 30B A3B",