diff --git a/packages/ai/test/anthropic-adaptive-thinking-models.test.ts b/packages/ai/test/anthropic-adaptive-thinking-models.test.ts index 57badd3a1..1b1be72dc 100644 --- a/packages/ai/test/anthropic-adaptive-thinking-models.test.ts +++ b/packages/ai/test/anthropic-adaptive-thinking-models.test.ts @@ -8,7 +8,7 @@ const EXPECTED_CURRENT_ADAPTIVE_THINKING_MODELS = [ "anthropic/claude-opus-5", "anthropic/claude-sonnet-5", "cloudflare-ai-gateway/claude-fable-5", - "fireworks/accounts/fireworks/models/deepseek-v4-flash-0731", + "fireworks/accounts/fireworks/models/deepseek-v4p1-flash", "fireworks/accounts/fireworks/models/gpt-oss-120b", "fireworks/accounts/fireworks/models/qwen3p8-max", "kimi-coding/kimi-for-coding", diff --git a/packages/ai/test/anthropic-empty-thinking-signature-compat.test.ts b/packages/ai/test/anthropic-empty-thinking-signature-compat.test.ts index 4811e895d..b15cdf4bc 100644 --- a/packages/ai/test/anthropic-empty-thinking-signature-compat.test.ts +++ b/packages/ai/test/anthropic-empty-thinking-signature-compat.test.ts @@ -106,12 +106,10 @@ describe("Anthropic empty thinking signature compat", () => { // Regression for #9323: Fireworks emits unsigned thinking that must survive replay. it.each([ - "accounts/fireworks/models/deepseek-v4-flash-0731", - "accounts/fireworks/models/deepseek-v4-flash-vision-exp", - "accounts/fireworks/models/deepseek-v4-pro-0813", + "accounts/fireworks/models/deepseek-v4p1-flash", "accounts/fireworks/models/qwen3p8-max", "accounts/fireworks/models/qwen3p8-2p4t-a95b", - "accounts/fireworks/models/kimi-k2p6", + "accounts/fireworks/models/nemotron-3-ultra-nvfp4", ] as const)("preserves unsigned thinking for Fireworks %s", async (modelId) => { const model = getModel("fireworks", modelId); expect(model.compat?.allowEmptySignature).toBe(true); @@ -127,10 +125,10 @@ describe("Anthropic empty thinking signature compat", () => { // Regression for #9323: opting into unsigned replay must not change cross-model conversion. it("still converts cross-model Fireworks thinking to text", async () => { - const model = getModel("fireworks", "accounts/fireworks/models/deepseek-v4-flash-0731"); + const model = getModel("fireworks", "accounts/fireworks/models/deepseek-v4p1-flash"); const payload = await capturePayload( model, - makeContext("", "internal reasoning", "fireworks", "accounts/fireworks/models/kimi-k2p6"), + makeContext("", "internal reasoning", "fireworks", "accounts/fireworks/models/nemotron-3-ultra-nvfp4"), ); expect(payload.messages?.find((message) => message.role === "assistant")?.content).toEqual([ { type: "text", text: "internal reasoning" }, diff --git a/packages/ai/test/fireworks-models.test.ts b/packages/ai/test/fireworks-models.test.ts index f7661fa13..e3d4a3c8d 100644 --- a/packages/ai/test/fireworks-models.test.ts +++ b/packages/ai/test/fireworks-models.test.ts @@ -19,8 +19,8 @@ afterEach(() => { }); describe("Fireworks models", () => { - it("registers the default Kimi K2.6 model via Anthropic-compatible Messages API", () => { - const model = getModel("fireworks", "accounts/fireworks/models/kimi-k2p6"); + it("registers non-GLM, non-Kimi-K3 models via Anthropic-compatible Messages API", () => { + const model = getModel("fireworks", "accounts/fireworks/models/deepseek-v4p1-flash"); expect(model).toBeDefined(); expect(model.api).toBe("anthropic-messages"); @@ -28,19 +28,11 @@ describe("Fireworks models", () => { expect(model.baseUrl).toBe("https://api.fireworks.ai/inference"); expect(model.reasoning).toBe(true); expect(model.input).toEqual(["text", "image"]); - expect(model.contextWindow).toBe(262000); - expect(model.maxTokens).toBe(262000); - expect(model.cost).toEqual({ - input: 0.95, - output: 4, - cacheRead: 0.16, - cacheWrite: 0, - }); }); - it("aligns GLM 5.2 Fast with GLM 5.2's OpenAI-compatible config", () => { - const base = getModel("fireworks", "accounts/fireworks/models/glm-5p2"); - const fast = getModel("fireworks", "accounts/fireworks/routers/glm-5p2-fast"); + it("aligns GLM 5.3 Fast with GLM 5.3's OpenAI-compatible config", () => { + const base = getModel("fireworks", "accounts/fireworks/models/glm-5p3"); + const fast = getModel("fireworks", "accounts/fireworks/routers/glm-5p3-fast"); expect(fast.api).toBe(base.api); expect(fast.baseUrl).toBe(base.baseUrl); @@ -48,7 +40,7 @@ describe("Fireworks models", () => { expect(fast.thinkingLevelMap).toEqual(base.thinkingLevelMap); }); - it.each(["accounts/fireworks/models/glm-5p2", "accounts/fireworks/routers/glm-5p2-fast"] as const)( + it.each(["accounts/fireworks/models/glm-5p3", "accounts/fireworks/routers/glm-5p3-fast"] as const)( "omits unsupported long cache retention for %s", async (modelId) => { const model = getModel("fireworks", modelId); @@ -126,9 +118,7 @@ describe("Fireworks models", () => { // Regression for #9323: native effort must reach Messages without budget-based fallback. it.each([ - ["accounts/fireworks/models/deepseek-v4-flash-0731", ["off", "low", "high", "max"]], - ["accounts/fireworks/models/deepseek-v4-flash-vision-exp", ["off", "low", "high", "max"]], - ["accounts/fireworks/models/deepseek-v4-pro-0813", ["off", "low", "high", "max"]], + ["accounts/fireworks/models/deepseek-v4p1-flash", ["off", "low", "high", "max"]], ["accounts/fireworks/models/qwen3p8-max", ["off", "low", "medium", "xhigh"]], ["accounts/fireworks/models/qwen3p8-2p4t-a95b", ["off", "low", "medium", "xhigh"]], ] as const)("sends native Messages effort levels for %s", async (modelId, levels) => { @@ -161,8 +151,8 @@ describe("Fireworks models", () => { // Regression for #9323: accepted aliases are not distinct native effort levels. it.each([ - ["accounts/fireworks/models/glm-5p2", ["off", "high", "max"]], - ["accounts/fireworks/routers/glm-5p2-fast", ["off", "high", "max"]], + ["accounts/fireworks/models/glm-5p3", ["low", "high", "max"]], + ["accounts/fireworks/routers/glm-5p3-fast", ["low", "high", "max"]], ["accounts/fireworks/models/kimi-k3", ["low", "high", "max"]], ["accounts/fireworks/routers/kimi-k3-fast", ["low", "high", "max"]], ] as const)("exposes distinct native effort levels for %s", (modelId, levels) => { @@ -170,7 +160,7 @@ describe("Fireworks models", () => { }); it("keeps toggle-only Messages models without a verified fallback on budget-based thinking", async () => { - const model = getModel("fireworks", "accounts/fireworks/models/kimi-k2p6"); + const model = getModel("fireworks", "accounts/fireworks/models/nemotron-3-ultra-nvfp4"); expect(model.compat?.forceAdaptiveThinking).toBeUndefined(); let payload: Record | undefined; await streamSimple( @@ -197,7 +187,7 @@ describe("Fireworks models", () => { }); it("sets Fireworks-specific compat for session affinity and unsupported tool fields", () => { - const model = getModel("fireworks", "accounts/fireworks/models/kimi-k2p6"); + const model = getModel("fireworks", "accounts/fireworks/models/nemotron-3-ultra-nvfp4"); expect(model.compat).toBeDefined(); expect(model.compat?.sendSessionAffinityHeaders).toBe(true); diff --git a/packages/ai/test/openai-completions-prompt-cache.test.ts b/packages/ai/test/openai-completions-prompt-cache.test.ts index 0beda273e..45f3df5fa 100644 --- a/packages/ai/test/openai-completions-prompt-cache.test.ts +++ b/packages/ai/test/openai-completions-prompt-cache.test.ts @@ -171,7 +171,7 @@ describe("openai-completions prompt caching", () => { expect(headers["x-session-affinity"]).toBe("session-affinity"); }); - it.each(["accounts/fireworks/models/glm-5p2", "accounts/fireworks/routers/glm-5p2-fast"] as const)( + it.each(["accounts/fireworks/models/glm-5p3", "accounts/fireworks/routers/glm-5p3-fast"] as const)( "sends Fireworks session affinity for %s", async (modelId) => { const model = getModel("fireworks", modelId); diff --git a/packages/ai/test/providers.test.ts b/packages/ai/test/providers.test.ts index 54a8c7490..41309b28c 100644 --- a/packages/ai/test/providers.test.ts +++ b/packages/ai/test/providers.test.ts @@ -192,7 +192,7 @@ describe("builtin providers", () => { ["openrouter", "openai/gpt-5.6-terra"], ] as const; const unsupported = [ - ["fireworks", "accounts/fireworks/models/kimi-k2p6"], + ["fireworks", "accounts/fireworks/models/nemotron-3-ultra-nvfp4"], ["openai", "gpt-4.1"], ["openai", "gpt-5.2"], ["anthropic", "claude-sonnet-4-5"], diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index d90632a72..488bb8fa1 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -24,6 +24,7 @@ - Fixed `RpcClient` skipping the next event listener when a listener unsubscribes while handling an event, which could make `waitForIdle()` time out after `collectEvents()` ([#9990](https://github.com/earendil-works/pi/issues/9990)). - Fixed full-file `read` calls rendering as `:1` when models send `null` for omitted `offset` and `limit` ([#9996](https://github.com/earendil-works/pi/issues/9996)). - 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. ## [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 d4a4805fb..678527310 100644 --- a/packages/coding-agent/src/core/model-resolver.ts +++ b/packages/coding-agent/src/core/model-resolver.ts @@ -43,7 +43,7 @@ export const defaultModelPerProvider: Partial> = { moonshotai: "kimi-k2.6", "moonshotai-cn": "kimi-k2.6", huggingface: "moonshotai/Kimi-K2.6", - fireworks: "accounts/fireworks/models/kimi-k2p6", + fireworks: "accounts/fireworks/models/kimi-k3", together: "moonshotai/Kimi-K2.6", baseten: "zai-org/GLM-5.2", opencode: "kimi-k2.6",