Browse Source

Allow models to contain default temperature (#9734)

Matt Rubens 1 month ago
parent
commit
d2b274a9af

+ 1 - 0
packages/types/src/providers/roo.ts

@@ -38,6 +38,7 @@ export const RooModelSchema = z.object({
 	tags: z.array(z.string()).optional(),
 	pricing: RooPricingSchema,
 	deprecated: z.boolean().optional(),
+	default_temperature: z.number().optional(),
 })
 
 export const RooModelsResponseSchema = z.object({

+ 65 - 0
src/api/providers/fetchers/__tests__/roo.spec.ts

@@ -478,4 +478,69 @@ describe("getRooModels", () => {
 			"Failed to fetch Roo Code Cloud models: No response from server",
 		)
 	})
+
+	it("should parse default_temperature from API response", async () => {
+		const mockResponse = {
+			object: "list",
+			data: [
+				{
+					id: "test/model-with-temp",
+					object: "model",
+					created: 1234567890,
+					owned_by: "test",
+					name: "Model with Default Temperature",
+					description: "Model with custom default temperature",
+					context_window: 128000,
+					max_tokens: 8192,
+					type: "language",
+					pricing: {
+						input: "0.0001",
+						output: "0.0002",
+					},
+					default_temperature: 0.6,
+				},
+			],
+		}
+
+		mockFetch.mockResolvedValueOnce({
+			ok: true,
+			json: async () => mockResponse,
+		})
+
+		const models = await getRooModels(baseUrl, apiKey)
+
+		expect(models["test/model-with-temp"].defaultTemperature).toBe(0.6)
+	})
+
+	it("should handle models without default_temperature", async () => {
+		const mockResponse = {
+			object: "list",
+			data: [
+				{
+					id: "test/model-no-temp",
+					object: "model",
+					created: 1234567890,
+					owned_by: "test",
+					name: "Model without Default Temperature",
+					description: "Model without custom default temperature",
+					context_window: 128000,
+					max_tokens: 8192,
+					type: "language",
+					pricing: {
+						input: "0.0001",
+						output: "0.0002",
+					},
+				},
+			],
+		}
+
+		mockFetch.mockResolvedValueOnce({
+			ok: true,
+			json: async () => mockResponse,
+		})
+
+		const models = await getRooModels(baseUrl, apiKey)
+
+		expect(models["test/model-no-temp"].defaultTemperature).toBeUndefined()
+	})
 })

+ 1 - 0
src/api/providers/fetchers/roo.ts

@@ -132,6 +132,7 @@ export async function getRooModels(baseUrl: string, apiKey?: string): Promise<Mo
 					description: model.description || model.name,
 					deprecated: model.deprecated || false,
 					isFree: tags.includes("free"),
+					defaultTemperature: model.default_temperature,
 				}
 
 				// Apply model-specific defaults (e.g., defaultToolProtocol)

+ 32 - 0
src/api/transform/__tests__/model-params.spec.ts

@@ -87,6 +87,38 @@ describe("getModelParams", () => {
 			expect(result.temperature).toBe(0.5)
 		})
 
+		it("should use model defaultTemperature over provider defaultTemperature", () => {
+			const modelWithDefaultTemp: ModelInfo = {
+				...baseModel,
+				defaultTemperature: 0.8,
+			}
+
+			const result = getModelParams({
+				...anthropicParams,
+				settings: {},
+				model: modelWithDefaultTemp,
+				defaultTemperature: 0.5,
+			})
+
+			expect(result.temperature).toBe(0.8)
+		})
+
+		it("should prefer settings temperature over model defaultTemperature", () => {
+			const modelWithDefaultTemp: ModelInfo = {
+				...baseModel,
+				defaultTemperature: 0.8,
+			}
+
+			const result = getModelParams({
+				...anthropicParams,
+				settings: { modelTemperature: 0.3 },
+				model: modelWithDefaultTemp,
+				defaultTemperature: 0.5,
+			})
+
+			expect(result.temperature).toBe(0.3)
+		})
+
 		it("should use model maxTokens when available", () => {
 			const model: ModelInfo = {
 				...baseModel,

+ 1 - 1
src/api/transform/model-params.ts

@@ -95,7 +95,7 @@ export function getModelParams({
 		format,
 	})
 
-	let temperature = customTemperature ?? defaultTemperature
+	let temperature = customTemperature ?? model.defaultTemperature ?? defaultTemperature
 	let reasoningBudget: ModelParams["reasoningBudget"] = undefined
 	let reasoningEffort: ModelParams["reasoningEffort"] = undefined
 	let verbosity: VerbosityLevel | undefined = customVerbosity