From 1ac55a4f8cdd4f898c3ef439a89e6674f91bdcce Mon Sep 17 00:00:00 2001 From: Sutarto Jordan Chrisfivo Date: Sat, 18 Jul 2026 13:36:45 +0000 Subject: [PATCH] fix(capabilities): support bare Kimi K3 upstream id --- open-sse/providers/capabilities.js | 3 +++ tests/translator/thinking-unified.test.js | 4 ++++ tests/unit/capabilities.test.js | 15 +++++++++++++++ 3 files changed, 22 insertions(+) diff --git a/open-sse/providers/capabilities.js b/open-sse/providers/capabilities.js index 6e54a68392..1cee3b32cd 100644 --- a/open-sse/providers/capabilities.js +++ b/open-sse/providers/capabilities.js @@ -222,6 +222,9 @@ export const PATTERN_CAPABILITIES = [ { pattern: "*qwen*", caps: { reasoning: true, thinkingFormat: "qwen", contextWindow: 262144 } }, // ── Kimi (enabled→reasoning_effort; K2.7-code cannot disable) ───── + // K3 routes through bare upstream id `k3`; keep this before generic Kimi. + { pattern: "*kimi*k3*", caps: { vision: true, videoInput: true, reasoning: true, thinkingFormat: "kimi", contextWindow: 1048576, maxOutput: 131072 } }, + { pattern: "k3", caps: { vision: true, videoInput: true, reasoning: true, thinkingFormat: "kimi", contextWindow: 1048576, maxOutput: 131072 } }, { pattern: "*kimi*k2.7*code*", caps: { vision: true, reasoning: true, thinkingFormat: "kimi", thinkingCanDisable: false, contextWindow: 262144, maxOutput: 262144 } }, { pattern: "*kimi*k2*", caps: { vision: true, reasoning: true, thinkingFormat: "kimi", contextWindow: 262144, maxOutput: 262144 } }, { pattern: "*kimi*", caps: { reasoning: true, thinkingFormat: "kimi", contextWindow: 262144 } }, diff --git a/tests/translator/thinking-unified.test.js b/tests/translator/thinking-unified.test.js index 7f276d5c8d..6cb4959a02 100644 --- a/tests/translator/thinking-unified.test.js +++ b/tests/translator/thinking-unified.test.js @@ -126,6 +126,10 @@ describe("applyThinking per provider format", () => { const out = apply("openai", "kimi-k2.6", { reasoning_effort: "high" }, "kimi"); expect(out.reasoning_effort).toBe("high"); }); + it("Kimi K3 keeps reasoning_effort after its alias resolves to bare k3", () => { + const out = apply("openai", "k3", { reasoning_effort: "high" }, "kimi"); + expect(out.reasoning_effort).toBe("high"); + }); it("Kimi auto → supported reasoning_effort", () => { const out = apply("openai", "kimi-k2.7", { reasoning_effort: "auto" }, "kimchi"); expect(out.reasoning_effort).toBe("high"); diff --git a/tests/unit/capabilities.test.js b/tests/unit/capabilities.test.js index ccfddfa5c1..d97f355b84 100644 --- a/tests/unit/capabilities.test.js +++ b/tests/unit/capabilities.test.js @@ -43,4 +43,19 @@ describe("getCapabilitiesForModel", () => { expect(getCapabilitiesForModel("kiro", "gpt-5.6-luna-agentic")).toMatchObject(kiroGpt56Expected); expect(getCapabilitiesForModel("kiro", "gpt-5.6-sol-thinking-agentic")).toMatchObject(kiroGpt56Expected); }); + + it("keeps Kimi K3 capabilities after its alias resolves to bare k3", () => { + const expected = { + vision: true, + videoInput: true, + reasoning: true, + thinkingFormat: "kimi", + contextWindow: 1048576, + maxOutput: 131072, + }; + + expect(getCapabilitiesForModel("kimi", "kimi-k3")).toMatchObject(expected); + expect(getCapabilitiesForModel("kimi", "k3")).toMatchObject(expected); + expect(getCapabilitiesForModel("kimi", "k3.5").reasoning).toBe(false); + }); });