diff --git a/packages/types/src/providers/fireworks.ts b/packages/types/src/providers/fireworks.ts index cfb20f0c37..c5796320c4 100644 --- a/packages/types/src/providers/fireworks.ts +++ b/packages/types/src/providers/fireworks.ts @@ -101,6 +101,8 @@ export const fireworksModels = { supportsImages: false, supportsPromptCache: false, supportsNativeTools: true, + supportsReasoningEffort: ["low", "medium", "high"], + reasoningEffort: "medium", inputPrice: 0.56, outputPrice: 1.68, description: @@ -112,7 +114,8 @@ export const fireworksModels = { supportsImages: false, supportsPromptCache: false, supportsNativeTools: true, - supportsReasoningBinary: true, + supportsReasoningEffort: ["low", "medium", "high"], + reasoningEffort: "medium", inputPrice: 0.56, outputPrice: 1.68, description: diff --git a/src/api/providers/__tests__/fireworks.spec.ts b/src/api/providers/__tests__/fireworks.spec.ts index 44985bc656..4b2a324351 100644 --- a/src/api/providers/__tests__/fireworks.spec.ts +++ b/src/api/providers/__tests__/fireworks.spec.ts @@ -214,6 +214,8 @@ describe("FireworksHandler", () => { contextWindow: 163840, supportsImages: false, supportsPromptCache: false, + supportsReasoningEffort: ["low", "medium", "high"], + reasoningEffort: "medium", inputPrice: 0.56, outputPrice: 1.68, description: expect.stringContaining("DeepSeek v3.1 is an improved version"), @@ -235,7 +237,8 @@ describe("FireworksHandler", () => { contextWindow: 163840, supportsImages: false, supportsPromptCache: false, - supportsReasoningBinary: true, + supportsReasoningEffort: ["low", "medium", "high"], + reasoningEffort: "medium", inputPrice: 0.56, outputPrice: 1.68, description: expect.stringContaining("DeepSeek v3.2 is the latest version"), @@ -243,6 +246,70 @@ describe("FireworksHandler", () => { ) }) + it("should include reasoning_effort parameter for DeepSeek V3.2 when reasoning is enabled", async () => { + const testModelId: FireworksModelId = "accounts/fireworks/models/deepseek-v3p2" + const handlerWithModel = new FireworksHandler({ + apiModelId: testModelId, + fireworksApiKey: "test-fireworks-api-key", + enableReasoningEffort: true, + reasoningEffort: "high", + }) + + mockCreate.mockImplementationOnce(() => { + return { + [Symbol.asyncIterator]: () => ({ + async next() { + return { done: true } + }, + }), + } + }) + + const systemPrompt = "Test system prompt" + const messages: Anthropic.Messages.MessageParam[] = [{ role: "user", content: "Test message" }] + + const messageGenerator = handlerWithModel.createMessage(systemPrompt, messages) + await messageGenerator.next() + + // Check that reasoning_effort was included in the request + expect(mockCreate).toHaveBeenCalledWith( + expect.objectContaining({ + model: testModelId, + reasoning_effort: "high", + }), + undefined, + ) + }) + + it("should not include reasoning_effort parameter when reasoning is disabled", async () => { + const testModelId: FireworksModelId = "accounts/fireworks/models/deepseek-v3p2" + const handlerWithModel = new FireworksHandler({ + apiModelId: testModelId, + fireworksApiKey: "test-fireworks-api-key", + enableReasoningEffort: false, + }) + + mockCreate.mockImplementationOnce(() => { + return { + [Symbol.asyncIterator]: () => ({ + async next() { + return { done: true } + }, + }), + } + }) + + const systemPrompt = "Test system prompt" + const messages: Anthropic.Messages.MessageParam[] = [{ role: "user", content: "Test message" }] + + const messageGenerator = handlerWithModel.createMessage(systemPrompt, messages) + await messageGenerator.next() + + // Check that reasoning_effort was NOT included in the request + const callArgs = mockCreate.mock.calls[0][0] + expect(callArgs.reasoning_effort).toBeUndefined() + }) + it("should return GLM-4.5 model with correct configuration", () => { const testModelId: FireworksModelId = "accounts/fireworks/models/glm-4p5" const handlerWithModel = new FireworksHandler({ diff --git a/src/api/providers/fireworks.ts b/src/api/providers/fireworks.ts index db29e7bf3f..cc5475c231 100644 --- a/src/api/providers/fireworks.ts +++ b/src/api/providers/fireworks.ts @@ -1,8 +1,16 @@ +import { Anthropic } from "@anthropic-ai/sdk" +import OpenAI from "openai" + import { type FireworksModelId, fireworksDefaultModelId, fireworksModels } from "@roo-code/types" import type { ApiHandlerOptions } from "../../shared/api" +import { getModelParams } from "../transform/model-params" +import { getModelMaxOutputTokens } from "../../shared/api" +import { convertToOpenAiMessages } from "../transform/openai-format" +import type { ApiHandlerCreateMessageMetadata } from "../index" import { BaseOpenAiCompatibleProvider } from "./base-openai-compatible-provider" +import { handleOpenAIError } from "./utils/openai-error-handler" export class FireworksHandler extends BaseOpenAiCompatibleProvider { constructor(options: ApiHandlerOptions) { @@ -16,4 +24,57 @@ export class FireworksHandler extends BaseOpenAiCompatibleProvider