fix(openai): raise minimal reasoning for native web search

This commit is contained in:
Peter Steinberger
2026-04-23 07:29:03 +01:00
parent 21a16349f2
commit a81c475731
2 changed files with 37 additions and 0 deletions

View File

@@ -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<string, unknown>): 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";
}

View File

@@ -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;