From 9e3b31946edcaf0feac6e652d33131fe29fef103 Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Tue, 23 Jun 2026 22:25:09 -0700 Subject: [PATCH] fix(vscode): forward OCA reasoning effort to SDK sessions (#11739) --- .../src/sdk/cline-session-factory.test.ts | 34 +++++++++++++++++++ apps/vscode/src/sdk/cline-session-factory.ts | 19 ++++++++++- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/apps/vscode/src/sdk/cline-session-factory.test.ts b/apps/vscode/src/sdk/cline-session-factory.test.ts index fb3d26c41d..0d50849eda 100644 --- a/apps/vscode/src/sdk/cline-session-factory.test.ts +++ b/apps/vscode/src/sdk/cline-session-factory.test.ts @@ -438,6 +438,40 @@ describe("buildSessionConfig", () => { expect((config as any).maxTokensPerTurn).toBe(4_096) }) + it("passes OCA reasoning effort from legacy mode settings to SDK sessions", async () => { + mocks.stateManager.getApiConfiguration.mockReturnValue({ + actModeApiProvider: "oca", + actModeOcaModelId: "oca-reasoner", + ocaApiKey: "oca-key", + actModeOcaReasoningEffort: " HIGH ", + } as any) + + const config = await buildSessionConfig({ cwd: "/tmp/workspace" }) + + expect(config.providerId).toBe("oca") + expect(config.modelId).toBe("oca-reasoner") + expect(config.thinking).toBe(true) + expect(config.reasoningEffort).toBe("high") + }) + + it("lets legacy OCA none override stale provider reasoning settings", async () => { + mocks.providerSettingsManager.getProviderSettings.mockReturnValue({ + provider: "oca", + reasoning: { enabled: true, effort: "medium" }, + } as any) + mocks.stateManager.getApiConfiguration.mockReturnValue({ + actModeApiProvider: "oca", + actModeOcaModelId: "oca-reasoner", + ocaApiKey: "oca-key", + actModeOcaReasoningEffort: "none", + } as any) + + const config = await buildSessionConfig({ cwd: "/tmp/workspace" }) + + expect(config.thinking).toBe(false) + expect(config.reasoningEffort).toBeUndefined() + }) + it("builds structured SAP AI Core config from legacy ApiConfiguration fields", async () => { mocks.stateManager.getApiConfiguration.mockReturnValue({ actModeApiProvider: "sapaicore", diff --git a/apps/vscode/src/sdk/cline-session-factory.ts b/apps/vscode/src/sdk/cline-session-factory.ts index f67d3b7f0e..c3b4b196d6 100644 --- a/apps/vscode/src/sdk/cline-session-factory.ts +++ b/apps/vscode/src/sdk/cline-session-factory.ts @@ -182,6 +182,20 @@ function resolveProviderReasoningConfig(providerId: string): SessionReasoningCon } } +function resolveOcaReasoningConfig(mode: Mode, apiConfig: ApiConfiguration | undefined): SessionReasoningConfig | undefined { + const rawEffort = mode === "plan" ? apiConfig?.planModeOcaReasoningEffort : apiConfig?.actModeOcaReasoningEffort + const effort = rawEffort?.trim().toLowerCase() + if (!effort) { + return undefined + } + + if (effort === "none") { + return { thinking: false } + } + + return isReasoningEffort(effort) ? { thinking: true, reasoningEffort: effort } : undefined +} + function resolveOpenAiCompatibleMaxTokens(config: ApiConfiguration | undefined, mode: Mode): number | undefined { const modelInfo = mode === "plan" ? config?.planModeOpenAiModelInfo : config?.actModeOpenAiModelInfo const maxTokens = modelInfo?.maxTokens @@ -587,7 +601,10 @@ export async function buildSessionConfig(input: SessionConfigInput): Promise