diff --git a/src/api/providers/__tests__/deepseek.spec.ts b/src/api/providers/__tests__/deepseek.spec.ts index ece03c068e..32bd3a029a 100644 --- a/src/api/providers/__tests__/deepseek.spec.ts +++ b/src/api/providers/__tests__/deepseek.spec.ts @@ -25,7 +25,7 @@ vi.mock("@ai-sdk/deepseek", () => ({ import type { Anthropic } from "@anthropic-ai/sdk" -import { deepSeekDefaultModelId, type ModelInfo } from "@roo-code/types" +import { deepSeekDefaultModelId, DEEP_SEEK_DEFAULT_TEMPERATURE, type ModelInfo } from "@roo-code/types" import type { ApiHandlerOptions } from "../../../shared/api" @@ -155,6 +155,20 @@ describe("DeepSeekHandler", () => { expect(model).toHaveProperty("temperature") expect(model).toHaveProperty("maxTokens") }) + + it("should use DEEP_SEEK_DEFAULT_TEMPERATURE as the default temperature", () => { + const model = handler.getModel() + expect(model.temperature).toBe(DEEP_SEEK_DEFAULT_TEMPERATURE) + }) + + it("should respect user-provided temperature over DEEP_SEEK_DEFAULT_TEMPERATURE", () => { + const handlerWithTemp = new DeepSeekHandler({ + ...mockOptions, + modelTemperature: 0.9, + }) + const model = handlerWithTemp.getModel() + expect(model.temperature).toBe(0.9) + }) }) describe("createMessage", () => { diff --git a/src/api/providers/anthropic-vertex.ts b/src/api/providers/anthropic-vertex.ts index 63daf8a3aa..3ed5dd45cc 100644 --- a/src/api/providers/anthropic-vertex.ts +++ b/src/api/providers/anthropic-vertex.ts @@ -231,7 +231,13 @@ export class AnthropicVertexHandler extends BaseProvider implements SingleComple } } - const params = getModelParams({ format: "anthropic", modelId: id, model: info, settings: this.options }) + const params = getModelParams({ + format: "anthropic", + modelId: id, + model: info, + settings: this.options, + defaultTemperature: 0, + }) // Build betas array for request headers const betas: string[] = [] diff --git a/src/api/providers/anthropic.ts b/src/api/providers/anthropic.ts index fc6cc048c7..b2b158f095 100644 --- a/src/api/providers/anthropic.ts +++ b/src/api/providers/anthropic.ts @@ -358,6 +358,7 @@ export class AnthropicHandler extends BaseProvider implements SingleCompletionHa modelId: id, model: info, settings: this.options, + defaultTemperature: 0, }) // The `:thinking` suffix indicates that the model is a "Hybrid" diff --git a/src/api/providers/cerebras.ts b/src/api/providers/cerebras.ts index 0ca8b20066..f6c516b7a2 100644 --- a/src/api/providers/cerebras.ts +++ b/src/api/providers/cerebras.ts @@ -49,7 +49,13 @@ export class CerebrasHandler extends BaseProvider implements SingleCompletionHan override getModel(): { id: string; info: ModelInfo; maxTokens?: number; temperature?: number } { const id = (this.options.apiModelId ?? cerebrasDefaultModelId) as CerebrasModelId const info = cerebrasModels[id as keyof typeof cerebrasModels] || cerebrasModels[cerebrasDefaultModelId] - const params = getModelParams({ format: "openai", modelId: id, model: info, settings: this.options }) + const params = getModelParams({ + format: "openai", + modelId: id, + model: info, + settings: this.options, + defaultTemperature: CEREBRAS_DEFAULT_TEMPERATURE, + }) return { id, info, ...params } } diff --git a/src/api/providers/deepinfra.ts b/src/api/providers/deepinfra.ts index e5b10e4e44..3dc2068372 100644 --- a/src/api/providers/deepinfra.ts +++ b/src/api/providers/deepinfra.ts @@ -47,6 +47,7 @@ export class DeepInfraHandler extends RouterProvider implements SingleCompletion modelId: id, model: info, settings: this.options, + defaultTemperature: 0, }) return { id, info, ...params } diff --git a/src/api/providers/deepseek.ts b/src/api/providers/deepseek.ts index 635759b519..aa1af804ea 100644 --- a/src/api/providers/deepseek.ts +++ b/src/api/providers/deepseek.ts @@ -43,7 +43,13 @@ export class DeepSeekHandler extends BaseProvider implements SingleCompletionHan override getModel(): { id: string; info: ModelInfo; maxTokens?: number; temperature?: number } { const id = this.options.apiModelId ?? deepSeekDefaultModelId const info = deepSeekModels[id as keyof typeof deepSeekModels] || deepSeekModels[deepSeekDefaultModelId] - const params = getModelParams({ format: "openai", modelId: id, model: info, settings: this.options }) + const params = getModelParams({ + format: "openai", + modelId: id, + model: info, + settings: this.options, + defaultTemperature: DEEP_SEEK_DEFAULT_TEMPERATURE, + }) return { id, info, ...params } } diff --git a/src/api/providers/doubao.ts b/src/api/providers/doubao.ts index a1337ed558..6490e42208 100644 --- a/src/api/providers/doubao.ts +++ b/src/api/providers/doubao.ts @@ -64,7 +64,13 @@ export class DoubaoHandler extends OpenAiHandler { override getModel() { const id = this.options.apiModelId ?? doubaoDefaultModelId const info = doubaoModels[id as keyof typeof doubaoModels] || doubaoModels[doubaoDefaultModelId] - const params = getModelParams({ format: "openai", modelId: id, model: info, settings: this.options }) + const params = getModelParams({ + format: "openai", + modelId: id, + model: info, + settings: this.options, + defaultTemperature: 0, + }) return { id, info, ...params } } diff --git a/src/api/providers/mistral.ts b/src/api/providers/mistral.ts index 77d2b9f572..be6665e324 100644 --- a/src/api/providers/mistral.ts +++ b/src/api/providers/mistral.ts @@ -55,7 +55,13 @@ export class MistralHandler extends BaseProvider implements SingleCompletionHand override getModel(): { id: string; info: ModelInfo; maxTokens?: number; temperature?: number } { const id = (this.options.apiModelId ?? mistralDefaultModelId) as MistralModelId const info = mistralModels[id as keyof typeof mistralModels] || mistralModels[mistralDefaultModelId] - const params = getModelParams({ format: "openai", modelId: id, model: info, settings: this.options }) + const params = getModelParams({ + format: "openai", + modelId: id, + model: info, + settings: this.options, + defaultTemperature: 0, + }) return { id, info, ...params } } diff --git a/src/api/providers/moonshot.ts b/src/api/providers/moonshot.ts index 3c73266272..3e90e48f7a 100644 --- a/src/api/providers/moonshot.ts +++ b/src/api/providers/moonshot.ts @@ -29,7 +29,13 @@ export class MoonshotHandler extends OpenAICompatibleHandler { override getModel() { const id = this.options.apiModelId ?? moonshotDefaultModelId const info = moonshotModels[id as keyof typeof moonshotModels] || moonshotModels[moonshotDefaultModelId] - const params = getModelParams({ format: "openai", modelId: id, model: info, settings: this.options }) + const params = getModelParams({ + format: "openai", + modelId: id, + model: info, + settings: this.options, + defaultTemperature: 0, + }) return { id, info, ...params } } diff --git a/src/api/providers/openai.ts b/src/api/providers/openai.ts index 611b391ce9..33b29abcaf 100644 --- a/src/api/providers/openai.ts +++ b/src/api/providers/openai.ts @@ -282,7 +282,13 @@ export class OpenAiHandler extends BaseProvider implements SingleCompletionHandl override getModel() { const id = this.options.openAiModelId ?? "" const info: ModelInfo = this.options.openAiCustomModelInfo ?? openAiModelInfoSaneDefaults - const params = getModelParams({ format: "openai", modelId: id, model: info, settings: this.options }) + const params = getModelParams({ + format: "openai", + modelId: id, + model: info, + settings: this.options, + defaultTemperature: 0, + }) return { id, info, ...params } } diff --git a/src/api/providers/requesty.ts b/src/api/providers/requesty.ts index c3b5accbc3..b241c347b0 100644 --- a/src/api/providers/requesty.ts +++ b/src/api/providers/requesty.ts @@ -89,6 +89,7 @@ export class RequestyHandler extends BaseProvider implements SingleCompletionHan modelId: id, model: info, settings: this.options, + defaultTemperature: 0, }) return { id, info, ...params } diff --git a/src/api/providers/unbound.ts b/src/api/providers/unbound.ts index 76dd60d976..ba144f6e1b 100644 --- a/src/api/providers/unbound.ts +++ b/src/api/providers/unbound.ts @@ -70,6 +70,7 @@ export class UnboundHandler extends RouterProvider implements SingleCompletionHa modelId: id, model: info, settings: this.options, + defaultTemperature: 0, }) return { id, info, ...params } diff --git a/src/api/transform/__tests__/model-params.spec.ts b/src/api/transform/__tests__/model-params.spec.ts index 75b5c50c59..a50f1291be 100644 --- a/src/api/transform/__tests__/model-params.spec.ts +++ b/src/api/transform/__tests__/model-params.spec.ts @@ -17,16 +17,19 @@ describe("getModelParams", () => { const anthropicParams = { modelId: "test", format: "anthropic" as const, + defaultTemperature: 0, } const openaiParams = { modelId: "test", format: "openai" as const, + defaultTemperature: 0, } const openrouterParams = { modelId: "test", format: "openrouter" as const, + defaultTemperature: 0, } describe("Basic functionality", () => { @@ -48,11 +51,12 @@ describe("getModelParams", () => { }) }) - it("should use default temperature of 0 when no defaultTemperature is provided", () => { + it("should use the provided defaultTemperature when no user or model temperature is set", () => { const result = getModelParams({ ...anthropicParams, settings: {}, model: baseModel, + defaultTemperature: 0, }) expect(result.temperature).toBe(0) @@ -193,6 +197,7 @@ describe("getModelParams", () => { format: "openrouter" as const, settings: {}, model: baseModel, + defaultTemperature: 0, }) expect(result.maxTokens).toBe(ANTHROPIC_DEFAULT_MAX_TOKENS) @@ -214,6 +219,7 @@ describe("getModelParams", () => { format: "openrouter" as const, settings: {}, model: baseModel, + defaultTemperature: 0, }) expect(result.maxTokens).toBeUndefined() @@ -374,6 +380,7 @@ describe("getModelParams", () => { format: "gemini" as const, settings: { modelMaxTokens: 2000, modelMaxThinkingTokens: 50 }, model, + defaultTemperature: 0, }), ).toEqual({ format: "gemini", @@ -400,6 +407,7 @@ describe("getModelParams", () => { format: "openrouter" as const, settings: { modelMaxTokens: 4000 }, model, + defaultTemperature: 0, }), ).toEqual({ format: "openrouter", diff --git a/src/api/transform/model-params.ts b/src/api/transform/model-params.ts index e862c5cf5e..ac04bce37d 100644 --- a/src/api/transform/model-params.ts +++ b/src/api/transform/model-params.ts @@ -33,7 +33,7 @@ type GetModelParamsOptions = { modelId: string model: ModelInfo settings: ProviderSettings - defaultTemperature?: number + defaultTemperature: number } type BaseModelParams = { @@ -77,7 +77,7 @@ export function getModelParams({ modelId, model, settings, - defaultTemperature = 0, + defaultTemperature, }: GetModelParamsOptions): ModelParams { const { modelMaxTokens: customMaxTokens,