diff --git a/packages/actions/src/prepare-request-body.spec.ts b/packages/actions/src/prepare-request-body.spec.ts index f0acbdb36b..9acab2fb54 100644 --- a/packages/actions/src/prepare-request-body.spec.ts +++ b/packages/actions/src/prepare-request-body.spec.ts @@ -662,6 +662,62 @@ describe("prepareRequestBody - Google AI Studio", () => { }); }); +describe("prepareRequestBody - Alibaba", () => { + test("should enable thinking for Alibaba DeepSeek v3.2 when reasoning is requested", async () => { + const requestBody = (await prepareRequestBody( + "alibaba", + "deepseek-v3.2", + [{ role: "user", content: "Solve this carefully" }], + false, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + "medium", + true, + false, + )) as unknown as { + enable_thinking?: boolean; + thinking_budget?: number; + reasoning_effort?: string; + }; + + expect(requestBody.enable_thinking).toBe(true); + expect(requestBody.thinking_budget).toBe(8192); + expect(requestBody).not.toHaveProperty("reasoning_effort"); + }); + + test("should preserve reasoning_effort for non-DeepSeek Alibaba models", async () => { + const requestBody = (await prepareRequestBody( + "alibaba", + "qwen3-vl-235b-a22b-thinking", + [{ role: "user", content: "Solve this carefully" }], + false, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + "high", + true, + false, + )) as unknown as { + enable_thinking?: boolean; + reasoning_effort?: string; + }; + + expect(requestBody.reasoning_effort).toBe("high"); + expect(requestBody).not.toHaveProperty("enable_thinking"); + }); +}); + describe("prepareRequestBody - AWS Bedrock", () => { test("should sanitize complex tool schemas for Bedrock Converse", async () => { const requestBody = (await prepareRequestBody( diff --git a/packages/actions/src/prepare-request-body.ts b/packages/actions/src/prepare-request-body.ts index 08ee36e262..aa6e3234fd 100644 --- a/packages/actions/src/prepare-request-body.ts +++ b/packages/actions/src/prepare-request-body.ts @@ -1878,6 +1878,65 @@ export async function prepareRequestBody( } break; } + case "alibaba": { + if (stream) { + requestBody.stream_options = { + include_usage: true, + }; + } + if (response_format) { + requestBody.response_format = response_format; + } + + if (temperature !== undefined) { + requestBody.temperature = temperature; + } + if (max_tokens !== undefined) { + requestBody.max_tokens = max_tokens; + } + if (top_p !== undefined) { + requestBody.top_p = top_p; + } + if (frequency_penalty !== undefined) { + requestBody.frequency_penalty = frequency_penalty; + } + if (presence_penalty !== undefined) { + requestBody.presence_penalty = presence_penalty; + } + + if ( + usedModel === "deepseek-v3.2" && + supportsReasoning && + (reasoning_effort !== undefined || reasoning_max_tokens !== undefined) + ) { + requestBody.enable_thinking = true; + + if (reasoning_max_tokens !== undefined) { + requestBody.thinking_budget = Math.min(reasoning_max_tokens, 32768); + } else if (reasoning_effort !== undefined) { + const getThinkingBudget = (effort: string) => { + switch (effort) { + case "minimal": + return 512; + case "low": + return 2048; + case "high": + return 24576; + case "xhigh": + return 32768; + case "medium": + default: + return 8192; + } + }; + + requestBody.thinking_budget = getThinkingBudget(reasoning_effort); + } + } else if (reasoning_effort !== undefined) { + requestBody.reasoning_effort = reasoning_effort; + } + break; + } default: { if (stream) { requestBody.stream_options = { diff --git a/packages/models/src/models/deepseek.ts b/packages/models/src/models/deepseek.ts index 0a7078b7d4..8302c5d450 100644 --- a/packages/models/src/models/deepseek.ts +++ b/packages/models/src/models/deepseek.ts @@ -186,7 +186,7 @@ export const deepseekModels = [ requestPrice: 0, contextSize: 131072, maxOutput: 65536, - reasoning: false, + reasoning: true, streaming: true, vision: false, tools: true,