diff --git a/.changeset/little-pianos-juggle.md b/.changeset/little-pianos-juggle.md new file mode 100644 index 0000000000..02457339e9 --- /dev/null +++ b/.changeset/little-pianos-juggle.md @@ -0,0 +1,5 @@ +--- +"claude-dev": minor +--- + +Adding reasoning_effort support for openrouter and openai-native diff --git a/package-lock.json b/package-lock.json index 25b4a9e508..d193735592 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "claude-dev", - "version": "3.2.12", + "version": "3.2.13", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "claude-dev", - "version": "3.2.12", + "version": "3.2.13", "license": "Apache-2.0", "dependencies": { "@anthropic-ai/bedrock-sdk": "^0.10.2", @@ -36,7 +36,7 @@ "isbinaryfile": "^5.0.2", "mammoth": "^1.8.0", "monaco-vscode-textmate-theme-converter": "^0.1.7", - "openai": "^4.82.0", + "openai": "^4.83.0", "os-name": "^6.0.0", "p-wait-for": "^5.0.2", "pdf-parse": "^1.1.1", @@ -10617,9 +10617,9 @@ } }, "node_modules/openai": { - "version": "4.82.0", - "resolved": "https://registry.npmjs.org/openai/-/openai-4.82.0.tgz", - "integrity": "sha512-1bTxOVGZuVGsKKUWbh3BEwX1QxIXUftJv+9COhhGGVDTFwiaOd4gWsMynF2ewj1mg6by3/O+U8+EEHpWRdPaJg==", + "version": "4.83.0", + "resolved": "https://registry.npmjs.org/openai/-/openai-4.83.0.tgz", + "integrity": "sha512-fmTsqud0uTtRKsPC7L8Lu55dkaTwYucqncDHzVvO64DKOpNTuiYwjbR/nVgpapXuYy8xSnhQQPUm+3jQaxICgw==", "license": "Apache-2.0", "dependencies": { "@types/node": "^18.11.18", diff --git a/package.json b/package.json index c2d4bfc4e4..3149914521 100644 --- a/package.json +++ b/package.json @@ -161,6 +161,16 @@ "type": "boolean", "default": true, "description": "Enables extension to save checkpoints of workspace throughout the task." + }, + "cline.modelSettings.o3Mini.reasoningEffort": { + "type": "string", + "enum": [ + "low", + "medium", + "high" + ], + "default": "medium", + "description": "Controls the reasoning effort when using the o3-mini model. Higher values may result in more thorough but slower responses." } } } @@ -239,7 +249,7 @@ "isbinaryfile": "^5.0.2", "mammoth": "^1.8.0", "monaco-vscode-textmate-theme-converter": "^0.1.7", - "openai": "^4.82.0", + "openai": "^4.83.0", "os-name": "^6.0.0", "p-wait-for": "^5.0.2", "pdf-parse": "^1.1.1", diff --git a/src/api/providers/openai-native.ts b/src/api/providers/openai-native.ts index 63f30bd61c..c90aa6f862 100644 --- a/src/api/providers/openai-native.ts +++ b/src/api/providers/openai-native.ts @@ -11,6 +11,7 @@ import { } from "../../shared/api" import { convertToOpenAiMessages } from "../transform/openai-format" import { ApiStream } from "../transform/stream" +import { ChatCompletionReasoningEffort } from "openai/resources/chat/completions.mjs" export class OpenAiNativeHandler implements ApiHandler { private options: ApiHandlerOptions @@ -51,6 +52,7 @@ export class OpenAiNativeHandler implements ApiHandler { messages: [{ role: "developer", content: systemPrompt }, ...convertToOpenAiMessages(messages)], stream: true, stream_options: { include_usage: true }, + reasoning_effort: (this.options.o3MiniReasoningEffort as ChatCompletionReasoningEffort) || "medium", }) for await (const chunk of stream) { const delta = chunk.choices[0]?.delta diff --git a/src/api/providers/openrouter.ts b/src/api/providers/openrouter.ts index 45cbd2c7ac..025c7eb1d3 100644 --- a/src/api/providers/openrouter.ts +++ b/src/api/providers/openrouter.ts @@ -130,6 +130,7 @@ export class OpenRouterHandler implements ApiHandler { stream: true, transforms: shouldApplyMiddleOutTransform ? ["middle-out"] : undefined, include_reasoning: true, + ...(model.id === "openai/o3-mini" ? { reasoning_effort: this.options.o3MiniReasoningEffort || "medium" } : {}), }) let genId: string | undefined diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index 142ff23a1b..0f4758ff92 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -1480,6 +1480,10 @@ export class ClineProvider implements vscode.WebviewViewProvider { } } + const o3MiniReasoningEffort = vscode.workspace + .getConfiguration("cline.modelSettings.o3Mini") + .get("reasoningEffort", "medium") + return { apiConfiguration: { apiProvider, @@ -1517,6 +1521,7 @@ export class ClineProvider implements vscode.WebviewViewProvider { openRouterModelId, openRouterModelInfo, vsCodeLmModelSelector, + o3MiniReasoningEffort, liteLlmBaseUrl, liteLlmModelId, }, diff --git a/src/shared/api.ts b/src/shared/api.ts index 169be3640a..748fb54e09 100644 --- a/src/shared/api.ts +++ b/src/shared/api.ts @@ -52,6 +52,7 @@ export interface ApiHandlerOptions { mistralApiKey?: string azureApiVersion?: string vsCodeLmModelSelector?: any + o3MiniReasoningEffort?: string qwenApiLine?: string }