From 28fd59086880aa6622c0ca2dfdfca31e879dab99 Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Tue, 29 Sep 2026 08:11:56 +0200 Subject: [PATCH] fix(ai,coding-agent): replace removed Together Kimi K2.6 with Kimi K3 Together no longer lists Kimi K2.6, which broke type checks against the hydrated catalog. Tests use Kimi K3 and the Together default model now points at it. --- packages/ai/test/abort.test.ts | 2 +- packages/ai/test/context-overflow.test.ts | 4 ++-- packages/ai/test/cross-provider-handoff.test.ts | 2 +- packages/ai/test/empty.test.ts | 2 +- packages/ai/test/image-tool-result.test.ts | 4 ++-- packages/ai/test/stream.test.ts | 4 ++-- packages/ai/test/together-models.test.ts | 14 +++++++------- packages/ai/test/tokens.test.ts | 2 +- packages/ai/test/tool-call-without-result.test.ts | 2 +- packages/ai/test/total-tokens.test.ts | 2 +- packages/ai/test/unicode-surrogate.test.ts | 2 +- packages/coding-agent/CHANGELOG.md | 1 + packages/coding-agent/src/core/model-resolver.ts | 2 +- 13 files changed, 22 insertions(+), 21 deletions(-) diff --git a/packages/ai/test/abort.test.ts b/packages/ai/test/abort.test.ts index 767be7d04..7e2b9f97b 100644 --- a/packages/ai/test/abort.test.ts +++ b/packages/ai/test/abort.test.ts @@ -178,7 +178,7 @@ describe("AI Providers Abort Tests", () => { }); describe.skipIf(!process.env.TOGETHER_API_KEY)("Together AI Provider Abort", () => { - const llm = getModel("together", "moonshotai/Kimi-K2.6"); + const llm = getModel("together", "moonshotai/Kimi-K3"); it("should abort mid-stream", { retry: 3 }, async () => { await testAbortSignal(llm, { reasoningEffort: "high" }); diff --git a/packages/ai/test/context-overflow.test.ts b/packages/ai/test/context-overflow.test.ts index 564f3a10a..15d860435 100644 --- a/packages/ai/test/context-overflow.test.ts +++ b/packages/ai/test/context-overflow.test.ts @@ -338,8 +338,8 @@ describe("Context overflow error handling", () => { // ============================================================================= describe.skipIf(!process.env.TOGETHER_API_KEY)("Together AI", () => { - it("Kimi-K2.6 - should detect overflow via isContextOverflow", async () => { - const model = getModel("together", "moonshotai/Kimi-K2.6"); + it("Kimi-K3 - should detect overflow via isContextOverflow", async () => { + const model = getModel("together", "moonshotai/Kimi-K3"); const result = await testContextOverflow(model, process.env.TOGETHER_API_KEY!); logResult(result); diff --git a/packages/ai/test/cross-provider-handoff.test.ts b/packages/ai/test/cross-provider-handoff.test.ts index ab02b8248..93dc93f01 100644 --- a/packages/ai/test/cross-provider-handoff.test.ts +++ b/packages/ai/test/cross-provider-handoff.test.ts @@ -107,7 +107,7 @@ const PROVIDER_MODEL_PAIRS: ProviderModelPair[] = [ // Hugging Face { provider: "huggingface", model: "moonshotai/Kimi-K2.5", label: "huggingface-kimi-k2.5" }, // Together AI - { provider: "together", model: "moonshotai/Kimi-K2.6", label: "together-kimi-k2.6" }, + { provider: "together", model: "moonshotai/Kimi-K3", label: "together-kimi-k3" }, // Baseten { provider: "baseten", model: "zai-org/GLM-5.2", label: "baseten-glm-5.2" }, // Kimi For Coding diff --git a/packages/ai/test/empty.test.ts b/packages/ai/test/empty.test.ts index b45ceed68..a7a9c5f45 100644 --- a/packages/ai/test/empty.test.ts +++ b/packages/ai/test/empty.test.ts @@ -367,7 +367,7 @@ describe("AI Providers Empty Message Tests", () => { }); describe.skipIf(!process.env.TOGETHER_API_KEY)("Together AI Provider Empty Messages", () => { - const llm = getModel("together", "moonshotai/Kimi-K2.6"); + const llm = getModel("together", "moonshotai/Kimi-K3"); it("should handle empty content array", { retry: 3, timeout: 30000 }, async () => { await testEmptyMessage(llm); diff --git a/packages/ai/test/image-tool-result.test.ts b/packages/ai/test/image-tool-result.test.ts index a331f2a34..76ca2374b 100644 --- a/packages/ai/test/image-tool-result.test.ts +++ b/packages/ai/test/image-tool-result.test.ts @@ -298,8 +298,8 @@ describe("Tool Results with Images", () => { }); }); - describe.skipIf(!process.env.TOGETHER_API_KEY)("Together AI Provider (Kimi-K2.6)", () => { - const llm = getModel("together", "moonshotai/Kimi-K2.6"); + describe.skipIf(!process.env.TOGETHER_API_KEY)("Together AI Provider (Kimi-K3)", () => { + const llm = getModel("together", "moonshotai/Kimi-K3"); const options = { reasoningEffort: "high" } satisfies StreamOptionsWithExtras; it("should handle tool result with only image", { retry: 3, timeout: 30000 }, async () => { diff --git a/packages/ai/test/stream.test.ts b/packages/ai/test/stream.test.ts index eb9afa226..cf48452b2 100644 --- a/packages/ai/test/stream.test.ts +++ b/packages/ai/test/stream.test.ts @@ -756,8 +756,8 @@ describe("Generate E2E Tests", () => { }); }); - describe.skipIf(!process.env.TOGETHER_API_KEY)("Together AI Provider (Kimi-K2.6 via OpenAI Completions)", () => { - const llm = getModel("together", "moonshotai/Kimi-K2.6"); + describe.skipIf(!process.env.TOGETHER_API_KEY)("Together AI Provider (Kimi-K3 via OpenAI Completions)", () => { + const llm = getModel("together", "moonshotai/Kimi-K3"); it("should complete basic text generation", { retry: 3 }, async () => { await basicTextGeneration(llm); diff --git a/packages/ai/test/together-models.test.ts b/packages/ai/test/together-models.test.ts index 89c85525d..fb28555b9 100644 --- a/packages/ai/test/together-models.test.ts +++ b/packages/ai/test/together-models.test.ts @@ -13,8 +13,8 @@ afterEach(() => { }); describe("Together models", () => { - it("registers the default Kimi K2.6 model via OpenAI-compatible Chat Completions API", () => { - const model = getModel("together", "moonshotai/Kimi-K2.6"); + it("registers the default Kimi K3 model via OpenAI-compatible Chat Completions API", () => { + const model = getModel("together", "moonshotai/Kimi-K3"); expect(model).toBeDefined(); expect(model.api).toBe("openai-completions"); @@ -23,12 +23,12 @@ describe("Together models", () => { expect(model.reasoning).toBe(true); expect(model.thinkingLevelMap).toEqual({ minimal: null, low: null, medium: null }); expect(model.input).toEqual(["text", "image"]); - expect(model.contextWindow).toBe(262144); - expect(model.maxTokens).toBe(131000); + expect(model.contextWindow).toBe(1048576); + expect(model.maxTokens).toBe(131072); expect(model.cost).toEqual({ - input: 1.2, - output: 4.5, - cacheRead: 0.2, + input: 3, + output: 15, + cacheRead: 0.3, cacheWrite: 0, }); expect(model.compat).toEqual({ diff --git a/packages/ai/test/tokens.test.ts b/packages/ai/test/tokens.test.ts index f85535e9f..2355cd992 100644 --- a/packages/ai/test/tokens.test.ts +++ b/packages/ai/test/tokens.test.ts @@ -186,7 +186,7 @@ describe("Token Statistics on Abort", () => { }); describe.skipIf(!process.env.TOGETHER_API_KEY)("Together AI Provider", () => { - const llm = getModel("together", "moonshotai/Kimi-K2.6"); + const llm = getModel("together", "moonshotai/Kimi-K3"); it("should include token stats when aborted mid-stream", { retry: 3, timeout: 30000 }, async () => { await testTokensOnAbort(llm); diff --git a/packages/ai/test/tool-call-without-result.test.ts b/packages/ai/test/tool-call-without-result.test.ts index 57945ccad..2937ffdcb 100644 --- a/packages/ai/test/tool-call-without-result.test.ts +++ b/packages/ai/test/tool-call-without-result.test.ts @@ -191,7 +191,7 @@ describe("Tool Call Without Result Tests", () => { }); describe.skipIf(!process.env.TOGETHER_API_KEY)("Together AI Provider", () => { - const model = getModel("together", "moonshotai/Kimi-K2.6"); + const model = getModel("together", "moonshotai/Kimi-K3"); it("should filter out tool calls without corresponding tool results", { retry: 3, timeout: 30000 }, async () => { await testToolCallWithoutResult(model, { reasoningEffort: "high" }); diff --git a/packages/ai/test/total-tokens.test.ts b/packages/ai/test/total-tokens.test.ts index fabff7f69..1d558631a 100644 --- a/packages/ai/test/total-tokens.test.ts +++ b/packages/ai/test/total-tokens.test.ts @@ -379,7 +379,7 @@ describe("totalTokens field", () => { describe.skipIf(!process.env.TOGETHER_API_KEY)("Together AI", () => { it("Kimi-K2.6 - should return totalTokens equal to sum of components", { retry: 3, timeout: 60000 }, async () => { - const llm = getModel("together", "moonshotai/Kimi-K2.6"); + const llm = getModel("together", "moonshotai/Kimi-K3"); console.log(`\nTogether AI / ${llm.id}:`); const { first, second } = await testTotalTokensWithCache(llm, { diff --git a/packages/ai/test/unicode-surrogate.test.ts b/packages/ai/test/unicode-surrogate.test.ts index b9113c381..d9f825341 100644 --- a/packages/ai/test/unicode-surrogate.test.ts +++ b/packages/ai/test/unicode-surrogate.test.ts @@ -546,7 +546,7 @@ describe("AI Providers Unicode Surrogate Pair Tests", () => { }); describe.skipIf(!process.env.TOGETHER_API_KEY)("Together AI Provider Unicode Handling", () => { - const llm = getModel("together", "moonshotai/Kimi-K2.6"); + const llm = getModel("together", "moonshotai/Kimi-K3"); const options = { reasoningEffort: "high" } satisfies StreamOptionsWithExtras; it("should handle emoji in tool results", { retry: 3, timeout: 30000 }, async () => { diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index 5766db7a9..572b4e79f 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -27,6 +27,7 @@ - Fixed new sessions being lost when pi exits before the first assistant response. The session file is now created when the first user message is sent ([#10000](https://github.com/earendil-works/pi/issues/10000)). - Fixed the Fireworks default model pointing at the removed Kimi K2.6 model; it now defaults to Kimi K3. - Fixed the OpenCode Go default model pointing at the removed Kimi K2.6 model; it now defaults to Kimi K3. +- Fixed the Together default model pointing at the removed Kimi K2.6 model; it now defaults to Kimi K3. ## [0.87.1] - 2026-09-22 diff --git a/packages/coding-agent/src/core/model-resolver.ts b/packages/coding-agent/src/core/model-resolver.ts index f2c749bbe..5eef3690f 100644 --- a/packages/coding-agent/src/core/model-resolver.ts +++ b/packages/coding-agent/src/core/model-resolver.ts @@ -44,7 +44,7 @@ export const defaultModelPerProvider: Partial> = { "moonshotai-cn": "kimi-k2.6", huggingface: "moonshotai/Kimi-K2.6", fireworks: "accounts/fireworks/models/kimi-k3", - together: "moonshotai/Kimi-K2.6", + together: "moonshotai/Kimi-K3", baseten: "zai-org/GLM-5.2", opencode: "kimi-k2.6", "opencode-go": "kimi-k3",