UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

65 lines (64 loc) 3.19 kB
import { c as isRecord } from "./utils-CCC-BEJH.js"; import { i as streamSimple } from "./stream-4H1GSjKe.js"; import "./llm-B2byLsni.js"; import "./provider-stream-shared-BIV_zuwB.js"; import { i as streamWithPayloadPatch } from "./moonshot-thinking-RT-IFIsx.js"; import "./string-coerce-runtime-CEGJWkQ_.js"; import { l as normalizeProviderId } from "./provider-model-shared-D-lyTLvb.js"; import { i as isOpenAIApiBaseUrl } from "./base-url-Cy9EayYQ.js"; //#region extensions/openai/native-web-search.ts const OPENAI_WEB_SEARCH_TOOL = { type: "web_search" }; function isOpenAINativeWebSearchEligibleModel(model) { const provider = typeof model.provider === "string" ? model.provider : void 0; if (model.api !== "openai-responses" || !provider || normalizeProviderId(provider) !== "openai") return false; const baseUrl = typeof model.baseUrl === "string" ? model.baseUrl : void 0; return !baseUrl || isOpenAIApiBaseUrl(baseUrl); } function shouldUseOpenAINativeWebSearchProvider(config) { const provider = config?.tools?.web?.search?.provider; if (typeof provider !== "string") return true; const normalized = provider.trim().toLowerCase(); return normalized === "" || normalized === "auto" || normalized === "openai"; } function shouldEnableOpenAINativeWebSearch(params) { return params.config?.tools?.web?.search?.enabled !== false && shouldUseOpenAINativeWebSearchProvider(params.config) && isOpenAINativeWebSearchEligibleModel(params.model); } function isNativeWebSearchTool(tool) { return isRecord(tool) && tool.type === OPENAI_WEB_SEARCH_TOOL.type; } function isManagedWebSearchTool(tool) { return isRecord(tool) && tool.type === "function" && tool.name === OPENAI_WEB_SEARCH_TOOL.type; } function raiseMinimalReasoningForOpenAINativeWebSearch(payload) { const reasoning = payload.reasoning; if (!isRecord(reasoning) || reasoning.effort !== "minimal") return; reasoning.effort = "low"; } function patchOpenAINativeWebSearchPayload(payload) { if (!isRecord(payload)) return "payload_not_object"; const existingTools = Array.isArray(payload.tools) ? payload.tools : []; const filteredTools = existingTools.filter((tool) => !isManagedWebSearchTool(tool)); if (filteredTools.some(isNativeWebSearchTool)) { 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"; } function createOpenAINativeWebSearchWrapper(baseStreamFn, params) { const underlying = baseStreamFn ?? streamSimple; return (model, context, options) => { if (!shouldEnableOpenAINativeWebSearch({ config: params.config, model })) return underlying(model, context, options); if (params.nativeWebSearchAllowedByToolPolicy === false) return underlying(model, context, options); return streamWithPayloadPatch(underlying, model, context, options, (payload) => { patchOpenAINativeWebSearchPayload(payload); }); }; } //#endregion export { patchOpenAINativeWebSearchPayload as n, createOpenAINativeWebSearchWrapper as t };