feat: Add GLM-5 model support to Fireworks provider

"accounts/fireworks/models/glm-5" to FireworksModelId type union
- Add GLM-5 model configuration with 202k context window, reasoning support, and appropriate pricing
- Add test case to verify GLM-5 model configuration is correctly returned

Resolves #11830
This commit is contained in:
GeekQiaQia 2026-03-03 12:14:27 +08:00
parent 459f27015d
commit a511ac0eb5
2 changed files with 110 additions and 0 deletions

View file

@ -17,6 +17,7 @@ export type FireworksModelId =
| "accounts/fireworks/models/glm-4p5-air" | "accounts/fireworks/models/glm-4p5-air"
| "accounts/fireworks/models/glm-4p6" | "accounts/fireworks/models/glm-4p6"
| "accounts/fireworks/models/glm-4p7" | "accounts/fireworks/models/glm-4p7"
| "accounts/fireworks/models/glm-5"
| "accounts/fireworks/models/gpt-oss-20b" | "accounts/fireworks/models/gpt-oss-20b"
| "accounts/fireworks/models/gpt-oss-120b" | "accounts/fireworks/models/gpt-oss-120b"
| "accounts/fireworks/models/llama-v3p3-70b-instruct" | "accounts/fireworks/models/llama-v3p3-70b-instruct"
@ -210,6 +211,19 @@ export const fireworksModels = {
description: description:
"Z.ai GLM-4.7 is the latest coding model with exceptional performance on complex programming tasks. Features improved reasoning capabilities and enhanced code generation quality.", "Z.ai GLM-4.7 is the latest coding model with exceptional performance on complex programming tasks. Features improved reasoning capabilities and enhanced code generation quality.",
}, },
"accounts/fireworks/models/glm-5": {
maxTokens: 16384,
contextWindow: 202752,
supportsImages: false,
supportsPromptCache: true,
supportsReasoningEffort: ["disable", "medium"],
reasoningEffort: "medium",
preserveReasoning: true,
inputPrice: 0.55,
outputPrice: 2.19,
description:
"Z.ai GLM-5 is Zhipu's next-generation model with a 202k context window and built-in thinking capabilities. It delivers state-of-the-art reasoning, coding, and agentic performance.",
},
"accounts/fireworks/models/llama-v3p3-70b-instruct": { "accounts/fireworks/models/llama-v3p3-70b-instruct": {
maxTokens: 16384, maxTokens: 16384,
contextWindow: 131072, contextWindow: 131072,

View file

@ -308,6 +308,30 @@ describe("FireworksHandler", () => {
) )
}) })
it("should return GLM-5 model with correct configuration", () => {
const testModelId: FireworksModelId = "accounts/fireworks/models/glm-5"
const handlerWithModel = new FireworksHandler({
apiModelId: testModelId,
fireworksApiKey: "test-fireworks-api-key",
})
const model = handlerWithModel.getModel()
expect(model.id).toBe(testModelId)
expect(model.info).toEqual(
expect.objectContaining({
maxTokens: 16384,
contextWindow: 202752,
supportsImages: false,
supportsPromptCache: true,
supportsReasoningEffort: ["disable", "medium"],
reasoningEffort: "medium",
preserveReasoning: true,
inputPrice: 0.55,
outputPrice: 2.19,
description: expect.stringContaining("Z.ai GLM-5 is Zhipu's next-generation model"),
}),
)
})
it("should return gpt-oss-20b model with correct configuration", () => { it("should return gpt-oss-20b model with correct configuration", () => {
const testModelId: FireworksModelId = "accounts/fireworks/models/gpt-oss-20b" const testModelId: FireworksModelId = "accounts/fireworks/models/gpt-oss-20b"
const handlerWithModel = new FireworksHandler({ const handlerWithModel = new FireworksHandler({
@ -587,6 +611,78 @@ describe("FireworksHandler", () => {
chunks.push(chunk) chunks.push(chunk)
} }
expect(chunks[0]).toEqual({ type: "text", text: "Hello" })
expect(chunks[1]).toEqual({ type: "text", text: " world" })
expect(chunks[2]).toMatchObject({ type: "usage", inputTokens: 5, outputTokens: 10 })
})
})
],
usage: {
prompt_tokens: 5,
completion_tokens: 10,
total_tokens: 15,
},
}
},
}))
const systemPrompt = "You are a helpful assistant."
const messages: Anthropic.Messages.MessageParam[] = [{ role: "user", content: "Hi" }]
const stream = handler.createMessage(systemPrompt, messages)
const chunks = []
for await (const chunk of stream) {
chunks.push(chunk)
}
expect(chunks[0]).toEqual({ type: "text", text: "Hello" })
expect(chunks[1]).toEqual({ type: "text", text: " world" })
expect(chunks[2]).toMatchObject({ type: "usage", inputTokens: 5, outputTokens: 10 })
})
})
],
usage: {
prompt_tokens: 5,
completion_tokens: 10,
total_tokens: 15,
},
}
},
}))
const systemPrompt = "You are a helpful assistant."
const messages: Anthropic.Messages.MessageParam[] = [{ role: "user", content: "Hi" }]
const stream = handler.createMessage(systemPrompt, messages)
const chunks = []
for await (const chunk of stream) {
chunks.push(chunk)
}
expect(chunks[0]).toEqual({ type: "text", text: "Hello" })
expect(chunks[1]).toEqual({ type: "text", text: " world" })
expect(chunks[2]).toMatchObject({ type: "usage", inputTokens: 5, outputTokens: 10 })
})
})
],
usage: {
prompt_tokens: 5,
completion_tokens: 10,
total_tokens: 15,
},
}
},
}))
const systemPrompt = "You are a helpful assistant."
const messages: Anthropic.Messages.MessageParam[] = [{ role: "user", content: "Hi" }]
const stream = handler.createMessage(systemPrompt, messages)
const chunks = []
for await (const chunk of stream) {
chunks.push(chunk)
}
expect(chunks[0]).toEqual({ type: "text", text: "Hello" }) expect(chunks[0]).toEqual({ type: "text", text: "Hello" })
expect(chunks[1]).toEqual({ type: "text", text: " world" }) expect(chunks[1]).toEqual({ type: "text", text: " world" })
expect(chunks[2]).toMatchObject({ type: "usage", inputTokens: 5, outputTokens: 10 }) expect(chunks[2]).toMatchObject({ type: "usage", inputTokens: 5, outputTokens: 10 })