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.
This commit is contained in:
Armin Ronacher
2026-09-29 08:11:56 +02:00
parent cb7969d212
commit 28fd590868
13 changed files with 22 additions and 21 deletions
+1 -1
View File
@@ -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" });
+2 -2
View File
@@ -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);
@@ -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
+1 -1
View File
@@ -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);
+2 -2
View File
@@ -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 () => {
+2 -2
View File
@@ -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);
+7 -7
View File
@@ -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({
+1 -1
View File
@@ -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);
@@ -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" });
+1 -1
View File
@@ -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, {
+1 -1
View File
@@ -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 () => {
+1
View File
@@ -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
@@ -44,7 +44,7 @@ export const defaultModelPerProvider: Partial<Record<KnownProvider, string>> = {
"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",