From a81c4757311accaf4ce26945661a8bdc88d65f77 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Thu, 23 Apr 2026 07:29:03 +0100 Subject: [PATCH] fix(openai): raise minimal reasoning for native web search --- extensions/openai/native-web-search.ts | 10 +++++++++ extensions/openai/openai-provider.test.ts | 27 +++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/extensions/openai/native-web-search.ts b/extensions/openai/native-web-search.ts index db57d700094..69a20abb4f4 100644 --- a/extensions/openai/native-web-search.ts +++ b/extensions/openai/native-web-search.ts @@ -57,6 +57,14 @@ function isManagedWebSearchTool(tool: unknown): boolean { return isRecord(tool) && tool.type === "function" && tool.name === OPENAI_WEB_SEARCH_TOOL.type; } +function raiseMinimalReasoningForOpenAINativeWebSearch(payload: Record): void { + const reasoning = payload.reasoning; + if (!isRecord(reasoning) || reasoning.effort !== "minimal") { + return; + } + reasoning.effort = "low"; +} + export function patchOpenAINativeWebSearchPayload( payload: unknown, ): OpenAINativeWebSearchPatchResult { @@ -70,10 +78,12 @@ export function patchOpenAINativeWebSearchPayload( if (filteredTools.length !== existingTools.length) { payload.tools = filteredTools; } + raiseMinimalReasoningForOpenAINativeWebSearch(payload); return "native_tool_already_present"; } payload.tools = [...filteredTools, OPENAI_WEB_SEARCH_TOOL]; + raiseMinimalReasoningForOpenAINativeWebSearch(payload); return "injected"; } diff --git a/extensions/openai/openai-provider.test.ts b/extensions/openai/openai-provider.test.ts index 67cfe50c004..bd25c3684f1 100644 --- a/extensions/openai/openai-provider.test.ts +++ b/extensions/openai/openai-provider.test.ts @@ -400,6 +400,33 @@ describe("buildOpenAIProvider", () => { ]); }); + it("raises minimal reasoning when native OpenAI web search is injected", () => { + const provider = buildOpenAIProvider(); + const wrap = provider.wrapStreamFn; + expect(wrap).toBeTypeOf("function"); + if (!wrap) { + throw new Error("expected OpenAI wrapper"); + } + + const result = runWrappedPayloadCase({ + wrap, + provider: "openai", + modelId: "gpt-5.4", + model: { + api: "openai-responses", + provider: "openai", + id: "gpt-5.4", + baseUrl: "https://api.openai.com/v1", + } as Model<"openai-responses">, + payload: { + reasoning: { effort: "minimal", summary: "auto" }, + }, + }); + + expect(result.payload.reasoning).toEqual({ effort: "low", summary: "auto" }); + expect(result.payload.tools).toEqual([{ type: "web_search" }]); + }); + it("does not inject native OpenAI web search when disabled or proxied", () => { const provider = buildOpenAIProvider(); const wrap = provider.wrapStreamFn;