





















@@ -9,6 +9,7 @@ import {
99resolveCodexNativeSearchActivation,
1010} from "../codex-native-web-search.js";
1111import { flattenCompletionMessagesToStringContent } from "../openai-completions-string-content.js";
12+import { resolveOpenAIReasoningEffortForModel } from "../openai-reasoning-effort.js";
1213import {
1314applyOpenAIResponsesPayloadPolicy,
1415resolveOpenAIResponsesPayloadPolicy,
@@ -85,6 +86,66 @@ function shouldFlattenOpenAICompletionMessages(model: {
8586return model.api === "openai-completions" && compat?.requiresStringContent === true;
8687}
878889+function isRecord(value: unknown): value is Record<string, unknown> {
90+return Boolean(value && typeof value === "object" && !Array.isArray(value));
91+}
92+93+function hasResponsesWebSearchTool(tools: unknown): boolean {
94+if (!Array.isArray(tools)) {
95+return false;
96+}
97+return tools.some((tool) => {
98+if (!isRecord(tool)) {
99+return false;
100+}
101+if (tool.type === "web_search") {
102+return true;
103+}
104+if (tool.type === "function" && tool.name === "web_search") {
105+return true;
106+}
107+const fn = tool.function;
108+return isRecord(fn) && fn.name === "web_search";
109+});
110+}
111+112+function resolveOpenAIThinkingPayloadEffort(params: {
113+model: { provider?: unknown; id?: unknown; baseUrl?: unknown; api?: unknown; compat?: unknown };
114+payloadObj: Record<string, unknown>;
115+thinkingLevel: ThinkLevel;
116+}) {
117+const mapped = mapThinkingLevelToReasoningEffort(params.thinkingLevel);
118+if (mapped !== "minimal" || !hasResponsesWebSearchTool(params.payloadObj.tools)) {
119+return mapped;
120+}
121+return (
122+resolveOpenAIReasoningEffortForModel({
123+model: params.model,
124+effort: "low",
125+}) ?? mapped
126+);
127+}
128+129+function raiseMinimalReasoningForResponsesWebSearchPayload(params: {
130+model: { provider?: unknown; id?: unknown; baseUrl?: unknown; api?: unknown; compat?: unknown };
131+payloadObj: Record<string, unknown>;
132+}): void {
133+const reasoning = params.payloadObj.reasoning;
134+if (!isRecord(reasoning) || reasoning.effort !== "minimal") {
135+return;
136+}
137+if (!hasResponsesWebSearchTool(params.payloadObj.tools)) {
138+return;
139+}
140+const nextEffort = resolveOpenAIReasoningEffortForModel({
141+model: params.model,
142+effort: "low",
143+});
144+if (nextEffort && nextEffort !== "minimal" && nextEffort !== "none") {
145+reasoning.effort = nextEffort;
146+}
147+}
148+88149function normalizeOpenAIServiceTier(value: unknown): OpenAIServiceTier | undefined {
89150if (typeof value !== "string") {
90151return undefined;
@@ -240,7 +301,12 @@ export function createOpenAIThinkingLevelWrapper(
240301}
241302return (model, context, options) => {
242303if (!shouldApplyOpenAIReasoningCompatibility(model)) {
243-return underlying(model, context, options);
304+if (thinkingLevel === "off") {
305+return underlying(model, context, options);
306+}
307+return streamWithPayloadPatch(underlying, model, context, options, (payloadObj) => {
308+raiseMinimalReasoningForResponsesWebSearchPayload({ model, payloadObj });
309+});
244310}
245311return streamWithPayloadPatch(underlying, model, context, options, (payloadObj) => {
246312const existingReasoning = payloadObj.reasoning;
@@ -251,17 +317,22 @@ export function createOpenAIThinkingLevelWrapper(
251317return;
252318}
253319320+const reasoningEffort = resolveOpenAIThinkingPayloadEffort({
321+ model,
322+ payloadObj,
323+ thinkingLevel,
324+});
254325if (existingReasoning === "none") {
255-payloadObj.reasoning = { effort: mapThinkingLevelToReasoningEffort(thinkingLevel) };
326+payloadObj.reasoning = { effort: reasoningEffort };
256327return;
257328}
258329if (
259330existingReasoning &&
260331typeof existingReasoning === "object" &&
261332!Array.isArray(existingReasoning)
262333) {
263-(existingReasoning as Record<string, unknown>).effort =
264- mapThinkingLevelToReasoningEffort(thinkingLevel);
334+(existingReasoning as Record<string, unknown>).effort = reasoningEffort;
335+raiseMinimalReasoningForResponsesWebSearchPayload({ model, payloadObj });
265336}
266337});
267338};
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。