mirror of
https://github.com/badlogic/pi-mono.git
synced 2026-11-05 23:37:25 +00:00
fix(ai,coding-agent): update Fireworks tests and default for removed models
models.dev dropped Kimi K2.6, GLM 5.2, and the dated DeepSeek V4 Fireworks models, which broke type checks against the regenerated catalog.
This commit is contained in:
parent
2b0a123de9
commit
6f7551516b
7 changed files with 20 additions and 31 deletions
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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" },
|
||||
|
|
|
|||
|
|
@ -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<string, unknown> | 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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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"],
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ export const defaultModelPerProvider: Partial<Record<KnownProvider, string>> = {
|
|||
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",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue