From c1209577d355d776b14bd322a6c8569a8cfdf3e8 Mon Sep 17 00:00:00 2001 From: qer Date: Sun, 14 Jun 2026 18:15:15 +0800 Subject: [PATCH] fix: set Kimi temperature to 0.6 when thinking is disabled The Kimi API requires temperature=0.6 when thinking is disabled; without it, toggling thinking off causes a 400 error with "invalid temperature: only 0.6 is allowed". This fix applies the default only when no explicit temperature has been configured, preserving user overrides (e.g., via ProviderConfig or env var). Fixes #686. --- .changeset/kimi-thinking-off-temperature.md | 14 ++++++++++++++ packages/kosong/src/providers/kimi.ts | 19 +++++++++++++++++++ packages/kosong/test/kimi.test.ts | 15 +++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 .changeset/kimi-thinking-off-temperature.md diff --git a/.changeset/kimi-thinking-off-temperature.md b/.changeset/kimi-thinking-off-temperature.md new file mode 100644 index 000000000..32a0b7705 --- /dev/null +++ b/.changeset/kimi-thinking-off-temperature.md @@ -0,0 +1,14 @@ +--- +"@moonshot-ai/kosong": patch +"@moonshot-ai/kimi-code": patch +--- + +fix: set Kimi temperature to 0.6 when thinking is disabled + +The Kimi API requires temperature=0.6 when thinking is disabled; without +it, toggling thinking off causes a 400 error with "invalid temperature: only +0.6 is allowed". This fix applies the default only when no explicit +temperature has been configured, preserving user overrides (e.g., via +ProviderConfig or env var). + +Fixes #686. diff --git a/packages/kosong/src/providers/kimi.ts b/packages/kosong/src/providers/kimi.ts index ef53eca7c..93f78297e 100644 --- a/packages/kosong/src/providers/kimi.ts +++ b/packages/kosong/src/providers/kimi.ts @@ -82,6 +82,24 @@ export interface ExtraBody { thinking?: ThinkingConfig; [key: string]: unknown; } + +function isRecord(value: unknown): value is Record { + return typeof value === 'object' && value !== null && !Array.isArray(value); +} + +/** + * Apply the default temperature=0.6 when thinking is disabled and no explicit + * temperature has been configured. This prevents 400 errors from the Kimi API + * while preserving user overrides (e.g., via ProviderConfig or env var). + */ +function applyDisabledThinkingTemperatureDefault(params: Record): void { + if (params['temperature'] !== undefined) return; + const thinking = params['thinking']; + if (isRecord(thinking) && thinking['type'] === 'disabled') { + params['temperature'] = 0.6; + } +} + const KIMI_TOOL_CALL_ID_POLICY: ToolCallIdPolicy = { normalize: (id) => sanitizeToolCallId(id, 64), maxLength: 64, @@ -475,6 +493,7 @@ export class KimiChatProvider implements ChatProvider { ...requestKwargs, ...(extraBody as Record | undefined), }; + applyDisabledThinkingTemperatureDefault(createParams); if (tools.length > 0) { createParams['tools'] = tools.map((t) => convertTool(t)); diff --git a/packages/kosong/test/kimi.test.ts b/packages/kosong/test/kimi.test.ts index f309b2030..f12647ee7 100644 --- a/packages/kosong/test/kimi.test.ts +++ b/packages/kosong/test/kimi.test.ts @@ -722,9 +722,24 @@ describe('KimiChatProvider', () => { expect(body['reasoning_effort']).toBeUndefined(); expect(body['thinking']).toEqual({ type: 'disabled' }); + expect(body['temperature']).toBe(0.6); expect(body['extra_body']).toBeUndefined(); }); + it('does not overwrite an explicit temperature when thinking is off', async () => { + const provider = createProvider() + .withGenerationKwargs({ temperature: 0.7 }) + .withThinking('off'); + const history: Message[] = [ + { role: 'user', content: [{ type: 'text', text: 'Think' }], toolCalls: [] }, + ]; + const body = await captureRequestBody(provider, '', [], history); + + expect(body['reasoning_effort']).toBeUndefined(); + expect(body['thinking']).toEqual({ type: 'disabled' }); + expect(body['temperature']).toBe(0.7); + }); + it('thinkingEffort property reflects current state', () => { const provider = createProvider(); expect(provider.thinkingEffort).toBeNull();