From 844d175eafe3febca774bcdc6590d4e1d91b204c Mon Sep 17 00:00:00 2001 From: Vegard Stikbakke Date: Wed, 1 Jul 2026 10:34:46 +0200 Subject: [PATCH] fix(ai): align Fireworks GLM 5.2 Fast with GLM 5.2 Broaden the Fireworks GLM 5.2 special-case in generate-models.ts from an exact id match to a glm-5p2 substring match, so the router variant accounts/fireworks/routers/glm-5p2-fast also uses the OpenAI-compatible endpoint and thinkingLevelMap instead of falling back to the default Anthropic Messages config. closes #6195 --- packages/ai/CHANGELOG.md | 1 + packages/ai/scripts/generate-models.ts | 4 ++-- packages/ai/src/providers/fireworks.models.ts | 9 +++++---- packages/ai/test/fireworks-models.test.ts | 10 ++++++++++ 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 9a7bac751..03c92e6da 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -5,6 +5,7 @@ ### Fixed - Fixed OpenAI Codex user-agent construction to synchronously load Node OS metadata, avoiding a startup race that could report `pi (browser)` in Node/Bun. +- Fixed Fireworks GLM 5.2 Fast to use the OpenAI-compatible endpoint and `thinkingLevelMap`, aligning it with GLM 5.2 ([#6195](https://github.com/earendil-works/pi/issues/6195)). ### Added diff --git a/packages/ai/scripts/generate-models.ts b/packages/ai/scripts/generate-models.ts index c4bcab9ca..fcb52690d 100644 --- a/packages/ai/scripts/generate-models.ts +++ b/packages/ai/scripts/generate-models.ts @@ -526,7 +526,7 @@ function applyThinkingLevelMetadata(model: Model): void { if (model.provider === "openrouter" && model.id === "z-ai/glm-5.2") { mergeThinkingLevelMap(model, { xhigh: "xhigh" }); } - if (model.provider === "fireworks" && model.id === "accounts/fireworks/models/glm-5p2") { + if (model.provider === "fireworks" && model.id.includes("glm-5p2")) { mergeThinkingLevelMap(model, { off: "none", minimal: null, low: "high", medium: "high", xhigh: "max" }); } if (model.provider === "opencode-go" && model.id === "glm-5.2") { @@ -1670,7 +1670,7 @@ async function generateModels() { candidate.cost.output = 1.9; candidate.cost.cacheRead = 0.119; } - if (candidate.provider === "fireworks" && candidate.id === "accounts/fireworks/models/glm-5p2") { + if (candidate.provider === "fireworks" && candidate.id.includes("glm-5p2")) { candidate.api = "openai-completions"; candidate.baseUrl = "https://api.fireworks.ai/inference/v1"; candidate.compat = { supportsStore: false, supportsDeveloperRole: false }; diff --git a/packages/ai/src/providers/fireworks.models.ts b/packages/ai/src/providers/fireworks.models.ts index 91d1115c1..93336dab7 100644 --- a/packages/ai/src/providers/fireworks.models.ts +++ b/packages/ai/src/providers/fireworks.models.ts @@ -224,11 +224,12 @@ export const FIREWORKS_MODELS = { "accounts/fireworks/routers/glm-5p2-fast": { id: "accounts/fireworks/routers/glm-5p2-fast", name: "GLM 5.2 Fast", - api: "anthropic-messages", + api: "openai-completions", provider: "fireworks", - baseUrl: "https://api.fireworks.ai/inference", - compat: {"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false}, + baseUrl: "https://api.fireworks.ai/inference/v1", + compat: {"supportsStore":false,"supportsDeveloperRole":false}, reasoning: true, + thinkingLevelMap: {"off":"none","minimal":null,"low":"high","medium":"high","xhigh":"max"}, input: ["text"], cost: { input: 2.1, @@ -238,7 +239,7 @@ export const FIREWORKS_MODELS = { }, contextWindow: 1048575, maxTokens: 131072, - } satisfies Model<"anthropic-messages">, + } satisfies Model<"openai-completions">, "accounts/fireworks/routers/kimi-k2p6-fast": { id: "accounts/fireworks/routers/kimi-k2p6-fast", name: "Kimi K2.6 Fast", diff --git a/packages/ai/test/fireworks-models.test.ts b/packages/ai/test/fireworks-models.test.ts index a0c9c9157..36afbeedd 100644 --- a/packages/ai/test/fireworks-models.test.ts +++ b/packages/ai/test/fireworks-models.test.ts @@ -48,6 +48,16 @@ describe("Fireworks models", () => { expect(model?.input).toEqual(["text", "image"]); }); + 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"); + + expect(fast.api).toBe(base.api); + expect(fast.baseUrl).toBe(base.baseUrl); + expect(fast.compat).toEqual(base.compat); + expect(fast.thinkingLevelMap).toEqual(base.thinkingLevelMap); + }); + it("resolves FIREWORKS_API_KEY from the environment", () => { process.env.FIREWORKS_API_KEY = "test-fireworks-key";