diff --git a/CHANGELOG.md b/CHANGELOG.md index d0b395c540b..bdf3f41ea70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,7 @@ Docs: https://docs.openclaw.ai - Microsoft Teams/member info: add a Graph-backed member info action so Teams automations and tools can resolve channel member details directly from Microsoft Graph. (#57528) Thanks @sudie-codes. - Nostr/inbound DMs: verify inbound event signatures before pairing or sender-authorization side effects, so forged DM events no longer create pairing requests or trigger reply attempts. Thanks @smaeljaish771 and @vincentkoc. - OpenAI/Responses: forward configured `text.verbosity` across Responses HTTP and WebSocket transports, surface it in `/status`, and keep per-agent verbosity precedence aligned with runtime behavior. (#47106) Thanks @merc1305 and @vincentkoc. +- Pi/Codex: add native Codex web search support for embedded Pi runs, including config/docs/wizard coverage and managed-tool suppression when native Codex search is active. (#46579) Thanks @Evizero. - Slack/exec approvals: add native Slack approval routing and approver authorization so exec approval prompts can stay in Slack instead of falling back to the Web UI or terminal. Thanks @vincentkoc. - TTS: Add structured provider diagnostics and fallback attempt analytics. (#57954) Thanks @joshavant. - WhatsApp/reactions: agents can now react with emoji on incoming WhatsApp messages, enabling more natural conversational interactions like acknowledging a photo with ❤️ instead of typing a reply. Thanks @mcaxtr. diff --git a/docs/.generated/config-baseline.json b/docs/.generated/config-baseline.json index dcc09128d92..55f7b04d240 100644 --- a/docs/.generated/config-baseline.json +++ b/docs/.generated/config-baseline.json @@ -2228,6 +2228,74 @@ "help": "Selects the embedding backend used to build/query memory vectors: \"openai\", \"gemini\", \"voyage\", \"mistral\", \"ollama\", or \"local\". Keep your most reliable provider here and configure fallback for resilience.", "hasChildren": false }, + { + "path": "agents.defaults.memorySearch.qmd", + "kind": "core", + "type": "object", + "required": false, + "deprecated": false, + "sensitive": false, + "tags": [ + "advanced" + ], + "label": "Memory Search QMD Collections", + "help": "Use this when one agent should query another agent's transcript collections; QMD-specific extra collections let you opt into cross-agent memory search without flattening everything into one shared namespace.", + "hasChildren": true + }, + { + "path": "agents.defaults.memorySearch.qmd.extraCollections", + "kind": "core", + "type": "array", + "required": false, + "deprecated": false, + "sensitive": false, + "tags": [ + "advanced" + ], + "label": "QMD Extra Collections", + "help": "Use this when you need directional transcript search across agents; add collections here to scope QMD recalls without creating a shared global transcript namespace.", + "hasChildren": true + }, + { + "path": "agents.defaults.memorySearch.qmd.extraCollections.*", + "kind": "core", + "type": "object", + "required": false, + "deprecated": false, + "sensitive": false, + "tags": [], + "hasChildren": true + }, + { + "path": "agents.defaults.memorySearch.qmd.extraCollections.*.name", + "kind": "core", + "type": "string", + "required": false, + "deprecated": false, + "sensitive": false, + "tags": [], + "hasChildren": false + }, + { + "path": "agents.defaults.memorySearch.qmd.extraCollections.*.path", + "kind": "core", + "type": "string", + "required": true, + "deprecated": false, + "sensitive": false, + "tags": [], + "hasChildren": false + }, + { + "path": "agents.defaults.memorySearch.qmd.extraCollections.*.pattern", + "kind": "core", + "type": "string", + "required": false, + "deprecated": false, + "sensitive": false, + "tags": [], + "hasChildren": false + }, { "path": "agents.defaults.memorySearch.query", "kind": "core", @@ -4753,6 +4821,66 @@ "tags": [], "hasChildren": false }, + { + "path": "agents.list.*.memorySearch.qmd", + "kind": "core", + "type": "object", + "required": false, + "deprecated": false, + "sensitive": false, + "tags": [], + "hasChildren": true + }, + { + "path": "agents.list.*.memorySearch.qmd.extraCollections", + "kind": "core", + "type": "array", + "required": false, + "deprecated": false, + "sensitive": false, + "tags": [], + "hasChildren": true + }, + { + "path": "agents.list.*.memorySearch.qmd.extraCollections.*", + "kind": "core", + "type": "object", + "required": false, + "deprecated": false, + "sensitive": false, + "tags": [], + "hasChildren": true + }, + { + "path": "agents.list.*.memorySearch.qmd.extraCollections.*.name", + "kind": "core", + "type": "string", + "required": false, + "deprecated": false, + "sensitive": false, + "tags": [], + "hasChildren": false + }, + { + "path": "agents.list.*.memorySearch.qmd.extraCollections.*.path", + "kind": "core", + "type": "string", + "required": true, + "deprecated": false, + "sensitive": false, + "tags": [], + "hasChildren": false + }, + { + "path": "agents.list.*.memorySearch.qmd.extraCollections.*.pattern", + "kind": "core", + "type": "string", + "required": false, + "deprecated": false, + "sensitive": false, + "tags": [], + "hasChildren": false + }, { "path": "agents.list.*.memorySearch.query", "kind": "core", @@ -26436,9 +26564,46 @@ { "path": "channels.nostr.privateKey", "kind": "channel", - "type": "string", + "type": [ + "object", + "string" + ], "required": false, "deprecated": false, + "sensitive": true, + "tags": [ + "channels", + "network", + "security" + ], + "hasChildren": true + }, + { + "path": "channels.nostr.privateKey.id", + "kind": "channel", + "type": "string", + "required": true, + "deprecated": false, + "sensitive": false, + "tags": [], + "hasChildren": false + }, + { + "path": "channels.nostr.privateKey.provider", + "kind": "channel", + "type": "string", + "required": true, + "deprecated": false, + "sensitive": false, + "tags": [], + "hasChildren": false + }, + { + "path": "channels.nostr.privateKey.source", + "kind": "channel", + "type": "string", + "required": true, + "deprecated": false, "sensitive": false, "tags": [], "hasChildren": false @@ -54718,6 +54883,16 @@ ], "hasChildren": false }, + { + "path": "plugins.entries.qqbot.config.defaultAccount", + "kind": "plugin", + "type": "string", + "required": false, + "deprecated": false, + "sensitive": false, + "tags": [], + "hasChildren": false + }, { "path": "plugins.entries.qqbot.config.enabled", "kind": "plugin", @@ -54748,6 +54923,15 @@ "tags": [], "hasChildren": false }, + { + "path": "plugins.entries.qqbot.config.stt", + "kind": "plugin", + "required": false, + "deprecated": false, + "sensitive": false, + "tags": [], + "hasChildren": false + }, { "path": "plugins.entries.qqbot.config.systemPrompt", "kind": "plugin", @@ -54758,6 +54942,15 @@ "tags": [], "hasChildren": false }, + { + "path": "plugins.entries.qqbot.config.tts", + "kind": "plugin", + "required": false, + "deprecated": false, + "sensitive": false, + "tags": [], + "hasChildren": false + }, { "path": "plugins.entries.qqbot.config.upgradeMode", "kind": "plugin", @@ -65797,7 +65990,11 @@ "required": false, "deprecated": false, "sensitive": false, - "tags": [], + "tags": [ + "tools" + ], + "label": "Brave Search Mode", + "help": "Brave Search mode: \"web\" (URL results) or \"llm-context\" (pre-extracted page content for LLM grounding).", "hasChildren": false }, { @@ -65837,7 +66034,7 @@ "tools" ], "label": "Enable Web Search Tool", - "help": "Enable the web_search tool (requires a provider API key).", + "help": "Enable managed web_search and optional Codex-native search for eligible models.", "hasChildren": false }, { @@ -65945,6 +66142,8 @@ "security", "tools" ], + "label": "Gemini Search API Key", + "help": "Gemini API key for Google Search grounding (fallback: GEMINI_API_KEY env var).", "hasChildren": true }, { @@ -65997,7 +66196,12 @@ "required": false, "deprecated": false, "sensitive": false, - "tags": [], + "tags": [ + "models", + "tools" + ], + "label": "Gemini Search Model", + "help": "Gemini model override (default: \"gemini-2.5-flash\").", "hasChildren": false }, { @@ -66025,6 +66229,8 @@ "security", "tools" ], + "label": "Grok Search API Key", + "help": "Grok (xAI) API key (fallback: XAI_API_KEY env var).", "hasChildren": true }, { @@ -66087,7 +66293,12 @@ "required": false, "deprecated": false, "sensitive": false, - "tags": [], + "tags": [ + "models", + "tools" + ], + "label": "Grok Search Model", + "help": "Grok model override (default: \"grok-4-1-fast\").", "hasChildren": false }, { @@ -66115,6 +66326,8 @@ "security", "tools" ], + "label": "Kimi Search API Key", + "help": "Moonshot/Kimi API key (fallback: KIMI_API_KEY or MOONSHOT_API_KEY env var).", "hasChildren": true }, { @@ -66158,6 +66371,8 @@ "tools", "url-secret" ], + "label": "Kimi Search Base URL", + "help": "Kimi base URL override (default: \"https://api.moonshot.ai/v1\").", "hasChildren": false }, { @@ -66167,7 +66382,12 @@ "required": false, "deprecated": false, "sensitive": false, - "tags": [], + "tags": [ + "models", + "tools" + ], + "label": "Kimi Search Model", + "help": "Kimi model override (default: \"moonshot-v1-128k\").", "hasChildren": false }, { @@ -66185,6 +66405,81 @@ "help": "Number of results to return (1-10).", "hasChildren": false }, + { + "path": "tools.web.search.openaiCodex", + "kind": "core", + "type": "object", + "required": false, + "deprecated": false, + "sensitive": false, + "tags": [], + "hasChildren": true + }, + { + "path": "tools.web.search.openaiCodex.allowedDomains", + "kind": "core", + "required": false, + "deprecated": false, + "sensitive": false, + "tags": [ + "access", + "tools" + ], + "label": "Codex Allowed Domains", + "help": "Optional domain allowlist passed to the native Codex web_search tool.", + "hasChildren": false + }, + { + "path": "tools.web.search.openaiCodex.contextSize", + "kind": "core", + "type": "string", + "required": false, + "deprecated": false, + "sensitive": false, + "tags": [ + "tools" + ], + "label": "Codex Search Context Size", + "help": "Native Codex search context size hint: \"low\", \"medium\", or \"high\".", + "hasChildren": false + }, + { + "path": "tools.web.search.openaiCodex.enabled", + "kind": "core", + "type": "boolean", + "required": false, + "deprecated": false, + "sensitive": false, + "tags": [ + "tools" + ], + "label": "Enable Native Codex Web Search", + "help": "Enable native Codex web search for Codex-capable models.", + "hasChildren": false + }, + { + "path": "tools.web.search.openaiCodex.mode", + "kind": "core", + "type": "string", + "required": false, + "deprecated": false, + "sensitive": false, + "tags": [ + "tools" + ], + "label": "Codex Web Search Mode", + "help": "Native Codex web search mode: \"cached\" (default) or \"live\".", + "hasChildren": false + }, + { + "path": "tools.web.search.openaiCodex.userLocation", + "kind": "core", + "required": false, + "deprecated": false, + "sensitive": false, + "tags": [], + "hasChildren": false + }, { "path": "tools.web.search.perplexity", "kind": "core", @@ -66210,6 +66505,8 @@ "security", "tools" ], + "label": "Perplexity API Key", + "help": "Perplexity or OpenRouter API key (fallback: PERPLEXITY_API_KEY or OPENROUTER_API_KEY env var). Direct Perplexity keys default to the Search API; OpenRouter keys use Sonar chat completions.", "hasChildren": true }, { @@ -66253,6 +66550,8 @@ "tools", "url-secret" ], + "label": "Perplexity Base URL", + "help": "Optional Perplexity/OpenRouter chat-completions base URL override. Setting this opts Perplexity into the legacy Sonar/OpenRouter compatibility path.", "hasChildren": false }, { @@ -66262,7 +66561,12 @@ "required": false, "deprecated": false, "sensitive": false, - "tags": [], + "tags": [ + "models", + "tools" + ], + "label": "Perplexity Model", + "help": "Optional Sonar/OpenRouter model override (default: \"perplexity/sonar-pro\"). Setting this opts Perplexity into the legacy chat-completions compatibility path.", "hasChildren": false }, { diff --git a/docs/.generated/config-baseline.jsonl b/docs/.generated/config-baseline.jsonl index cb3a1f2b9ac..36b7e514d0a 100644 --- a/docs/.generated/config-baseline.jsonl +++ b/docs/.generated/config-baseline.jsonl @@ -1,4 +1,4 @@ -{"generatedBy":"scripts/generate-config-doc-baseline.ts","recordType":"meta","totalPaths":5701} +{"generatedBy":"scripts/generate-config-doc-baseline.ts","recordType":"meta","totalPaths":5725} {"recordType":"path","path":"acp","kind":"core","type":"object","required":false,"deprecated":false,"sensitive":false,"tags":["advanced"],"label":"ACP","help":"ACP runtime controls for enabling dispatch, selecting backends, constraining allowed agent targets, and tuning streamed turn projection behavior.","hasChildren":true} {"recordType":"path","path":"acp.allowedAgents","kind":"core","type":"array","required":false,"deprecated":false,"sensitive":false,"tags":["access"],"label":"ACP Allowed Agents","help":"Allowlist of ACP target agent ids permitted for ACP runtime sessions. Empty means no additional allowlist restriction.","hasChildren":true} {"recordType":"path","path":"acp.allowedAgents.*","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} @@ -187,6 +187,12 @@ {"recordType":"path","path":"agents.defaults.memorySearch.multimodal.modalities.*","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} {"recordType":"path","path":"agents.defaults.memorySearch.outputDimensionality","kind":"core","type":"integer","required":false,"deprecated":false,"sensitive":false,"tags":["advanced"],"label":"Memory Search Output Dimensionality","help":"Gemini embedding-2 only: chooses the output vector size for memory embeddings. Use 768, 1536, or 3072 (default), and expect a full reindex when you change it because stored vector dimensions must stay consistent.","hasChildren":false} {"recordType":"path","path":"agents.defaults.memorySearch.provider","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":["advanced"],"label":"Memory Search Provider","help":"Selects the embedding backend used to build/query memory vectors: \"openai\", \"gemini\", \"voyage\", \"mistral\", \"ollama\", or \"local\". Keep your most reliable provider here and configure fallback for resilience.","hasChildren":false} +{"recordType":"path","path":"agents.defaults.memorySearch.qmd","kind":"core","type":"object","required":false,"deprecated":false,"sensitive":false,"tags":["advanced"],"label":"Memory Search QMD Collections","help":"Use this when one agent should query another agent's transcript collections; QMD-specific extra collections let you opt into cross-agent memory search without flattening everything into one shared namespace.","hasChildren":true} +{"recordType":"path","path":"agents.defaults.memorySearch.qmd.extraCollections","kind":"core","type":"array","required":false,"deprecated":false,"sensitive":false,"tags":["advanced"],"label":"QMD Extra Collections","help":"Use this when you need directional transcript search across agents; add collections here to scope QMD recalls without creating a shared global transcript namespace.","hasChildren":true} +{"recordType":"path","path":"agents.defaults.memorySearch.qmd.extraCollections.*","kind":"core","type":"object","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":true} +{"recordType":"path","path":"agents.defaults.memorySearch.qmd.extraCollections.*.name","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} +{"recordType":"path","path":"agents.defaults.memorySearch.qmd.extraCollections.*.path","kind":"core","type":"string","required":true,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} +{"recordType":"path","path":"agents.defaults.memorySearch.qmd.extraCollections.*.pattern","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} {"recordType":"path","path":"agents.defaults.memorySearch.query","kind":"core","type":"object","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":true} {"recordType":"path","path":"agents.defaults.memorySearch.query.hybrid","kind":"core","type":"object","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":true} {"recordType":"path","path":"agents.defaults.memorySearch.query.hybrid.candidateMultiplier","kind":"core","type":"integer","required":false,"deprecated":false,"sensitive":false,"tags":["advanced"],"label":"Memory Search Hybrid Candidate Multiplier","help":"Expands the candidate pool before reranking (default: 4). Raise this for better recall on noisy corpora, but expect more compute and slightly slower searches.","hasChildren":false} @@ -416,6 +422,12 @@ {"recordType":"path","path":"agents.list.*.memorySearch.multimodal.modalities.*","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} {"recordType":"path","path":"agents.list.*.memorySearch.outputDimensionality","kind":"core","type":"integer","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} {"recordType":"path","path":"agents.list.*.memorySearch.provider","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} +{"recordType":"path","path":"agents.list.*.memorySearch.qmd","kind":"core","type":"object","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":true} +{"recordType":"path","path":"agents.list.*.memorySearch.qmd.extraCollections","kind":"core","type":"array","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":true} +{"recordType":"path","path":"agents.list.*.memorySearch.qmd.extraCollections.*","kind":"core","type":"object","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":true} +{"recordType":"path","path":"agents.list.*.memorySearch.qmd.extraCollections.*.name","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} +{"recordType":"path","path":"agents.list.*.memorySearch.qmd.extraCollections.*.path","kind":"core","type":"string","required":true,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} +{"recordType":"path","path":"agents.list.*.memorySearch.qmd.extraCollections.*.pattern","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} {"recordType":"path","path":"agents.list.*.memorySearch.query","kind":"core","type":"object","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":true} {"recordType":"path","path":"agents.list.*.memorySearch.query.hybrid","kind":"core","type":"object","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":true} {"recordType":"path","path":"agents.list.*.memorySearch.query.hybrid.candidateMultiplier","kind":"core","type":"integer","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} @@ -2367,7 +2379,10 @@ {"recordType":"path","path":"channels.nostr.markdown","kind":"channel","type":"object","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":true} {"recordType":"path","path":"channels.nostr.markdown.tables","kind":"channel","type":"string","required":false,"enumValues":["off","bullets","code"],"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} {"recordType":"path","path":"channels.nostr.name","kind":"channel","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} -{"recordType":"path","path":"channels.nostr.privateKey","kind":"channel","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} +{"recordType":"path","path":"channels.nostr.privateKey","kind":"channel","type":["object","string"],"required":false,"deprecated":false,"sensitive":true,"tags":["channels","network","security"],"hasChildren":true} +{"recordType":"path","path":"channels.nostr.privateKey.id","kind":"channel","type":"string","required":true,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} +{"recordType":"path","path":"channels.nostr.privateKey.provider","kind":"channel","type":"string","required":true,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} +{"recordType":"path","path":"channels.nostr.privateKey.source","kind":"channel","type":"string","required":true,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} {"recordType":"path","path":"channels.nostr.profile","kind":"channel","type":"object","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":true} {"recordType":"path","path":"channels.nostr.profile.about","kind":"channel","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} {"recordType":"path","path":"channels.nostr.profile.banner","kind":"channel","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} @@ -4707,10 +4722,13 @@ {"recordType":"path","path":"plugins.entries.qqbot.config.audioFormatPolicy","kind":"plugin","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} {"recordType":"path","path":"plugins.entries.qqbot.config.clientSecret","kind":"plugin","required":false,"deprecated":false,"sensitive":true,"tags":["auth","security"],"hasChildren":false} {"recordType":"path","path":"plugins.entries.qqbot.config.clientSecretFile","kind":"plugin","type":"string","required":false,"deprecated":false,"sensitive":true,"tags":["auth","security","storage"],"hasChildren":false} +{"recordType":"path","path":"plugins.entries.qqbot.config.defaultAccount","kind":"plugin","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} {"recordType":"path","path":"plugins.entries.qqbot.config.enabled","kind":"plugin","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} {"recordType":"path","path":"plugins.entries.qqbot.config.markdownSupport","kind":"plugin","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} {"recordType":"path","path":"plugins.entries.qqbot.config.name","kind":"plugin","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} +{"recordType":"path","path":"plugins.entries.qqbot.config.stt","kind":"plugin","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} {"recordType":"path","path":"plugins.entries.qqbot.config.systemPrompt","kind":"plugin","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} +{"recordType":"path","path":"plugins.entries.qqbot.config.tts","kind":"plugin","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} {"recordType":"path","path":"plugins.entries.qqbot.config.upgradeMode","kind":"plugin","type":"string","required":false,"enumValues":["doc","hot-reload"],"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} {"recordType":"path","path":"plugins.entries.qqbot.config.upgradeUrl","kind":"plugin","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} {"recordType":"path","path":"plugins.entries.qqbot.config.urlDirectUpload","kind":"plugin","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} @@ -5618,10 +5636,10 @@ {"recordType":"path","path":"tools.web.search.brave.apiKey.provider","kind":"core","type":"string","required":true,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} {"recordType":"path","path":"tools.web.search.brave.apiKey.source","kind":"core","type":"string","required":true,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} {"recordType":"path","path":"tools.web.search.brave.baseUrl","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":["tools","url-secret"],"hasChildren":false} -{"recordType":"path","path":"tools.web.search.brave.mode","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} +{"recordType":"path","path":"tools.web.search.brave.mode","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":["tools"],"label":"Brave Search Mode","help":"Brave Search mode: \"web\" (URL results) or \"llm-context\" (pre-extracted page content for LLM grounding).","hasChildren":false} {"recordType":"path","path":"tools.web.search.brave.model","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} {"recordType":"path","path":"tools.web.search.cacheTtlMinutes","kind":"core","type":"number","required":false,"deprecated":false,"sensitive":false,"tags":["performance","storage","tools"],"label":"Web Search Cache TTL (min)","help":"Cache TTL in minutes for web_search results.","hasChildren":false} -{"recordType":"path","path":"tools.web.search.enabled","kind":"core","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":["tools"],"label":"Enable Web Search Tool","help":"Enable the web_search tool (requires a provider API key).","hasChildren":false} +{"recordType":"path","path":"tools.web.search.enabled","kind":"core","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":["tools"],"label":"Enable Web Search Tool","help":"Enable managed web_search and optional Codex-native search for eligible models.","hasChildren":false} {"recordType":"path","path":"tools.web.search.firecrawl","kind":"core","type":"object","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":true} {"recordType":"path","path":"tools.web.search.firecrawl.apiKey","kind":"core","type":["object","string"],"required":false,"deprecated":false,"sensitive":true,"tags":["auth","security","tools"],"hasChildren":true} {"recordType":"path","path":"tools.web.search.firecrawl.apiKey.id","kind":"core","type":"string","required":true,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} @@ -5630,35 +5648,41 @@ {"recordType":"path","path":"tools.web.search.firecrawl.baseUrl","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":["tools","url-secret"],"hasChildren":false} {"recordType":"path","path":"tools.web.search.firecrawl.model","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} {"recordType":"path","path":"tools.web.search.gemini","kind":"core","type":"object","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":true} -{"recordType":"path","path":"tools.web.search.gemini.apiKey","kind":"core","type":["object","string"],"required":false,"deprecated":false,"sensitive":true,"tags":["auth","security","tools"],"hasChildren":true} +{"recordType":"path","path":"tools.web.search.gemini.apiKey","kind":"core","type":["object","string"],"required":false,"deprecated":false,"sensitive":true,"tags":["auth","security","tools"],"label":"Gemini Search API Key","help":"Gemini API key for Google Search grounding (fallback: GEMINI_API_KEY env var).","hasChildren":true} {"recordType":"path","path":"tools.web.search.gemini.apiKey.id","kind":"core","type":"string","required":true,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} {"recordType":"path","path":"tools.web.search.gemini.apiKey.provider","kind":"core","type":"string","required":true,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} {"recordType":"path","path":"tools.web.search.gemini.apiKey.source","kind":"core","type":"string","required":true,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} {"recordType":"path","path":"tools.web.search.gemini.baseUrl","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":["tools","url-secret"],"hasChildren":false} -{"recordType":"path","path":"tools.web.search.gemini.model","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} +{"recordType":"path","path":"tools.web.search.gemini.model","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":["models","tools"],"label":"Gemini Search Model","help":"Gemini model override (default: \"gemini-2.5-flash\").","hasChildren":false} {"recordType":"path","path":"tools.web.search.grok","kind":"core","type":"object","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":true} -{"recordType":"path","path":"tools.web.search.grok.apiKey","kind":"core","type":["object","string"],"required":false,"deprecated":false,"sensitive":true,"tags":["auth","security","tools"],"hasChildren":true} +{"recordType":"path","path":"tools.web.search.grok.apiKey","kind":"core","type":["object","string"],"required":false,"deprecated":false,"sensitive":true,"tags":["auth","security","tools"],"label":"Grok Search API Key","help":"Grok (xAI) API key (fallback: XAI_API_KEY env var).","hasChildren":true} {"recordType":"path","path":"tools.web.search.grok.apiKey.id","kind":"core","type":"string","required":true,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} {"recordType":"path","path":"tools.web.search.grok.apiKey.provider","kind":"core","type":"string","required":true,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} {"recordType":"path","path":"tools.web.search.grok.apiKey.source","kind":"core","type":"string","required":true,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} {"recordType":"path","path":"tools.web.search.grok.baseUrl","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":["tools","url-secret"],"hasChildren":false} {"recordType":"path","path":"tools.web.search.grok.inlineCitations","kind":"core","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} -{"recordType":"path","path":"tools.web.search.grok.model","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} +{"recordType":"path","path":"tools.web.search.grok.model","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":["models","tools"],"label":"Grok Search Model","help":"Grok model override (default: \"grok-4-1-fast\").","hasChildren":false} {"recordType":"path","path":"tools.web.search.kimi","kind":"core","type":"object","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":true} -{"recordType":"path","path":"tools.web.search.kimi.apiKey","kind":"core","type":["object","string"],"required":false,"deprecated":false,"sensitive":true,"tags":["auth","security","tools"],"hasChildren":true} +{"recordType":"path","path":"tools.web.search.kimi.apiKey","kind":"core","type":["object","string"],"required":false,"deprecated":false,"sensitive":true,"tags":["auth","security","tools"],"label":"Kimi Search API Key","help":"Moonshot/Kimi API key (fallback: KIMI_API_KEY or MOONSHOT_API_KEY env var).","hasChildren":true} {"recordType":"path","path":"tools.web.search.kimi.apiKey.id","kind":"core","type":"string","required":true,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} {"recordType":"path","path":"tools.web.search.kimi.apiKey.provider","kind":"core","type":"string","required":true,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} {"recordType":"path","path":"tools.web.search.kimi.apiKey.source","kind":"core","type":"string","required":true,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} -{"recordType":"path","path":"tools.web.search.kimi.baseUrl","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":["tools","url-secret"],"hasChildren":false} -{"recordType":"path","path":"tools.web.search.kimi.model","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} +{"recordType":"path","path":"tools.web.search.kimi.baseUrl","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":["tools","url-secret"],"label":"Kimi Search Base URL","help":"Kimi base URL override (default: \"https://api.moonshot.ai/v1\").","hasChildren":false} +{"recordType":"path","path":"tools.web.search.kimi.model","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":["models","tools"],"label":"Kimi Search Model","help":"Kimi model override (default: \"moonshot-v1-128k\").","hasChildren":false} {"recordType":"path","path":"tools.web.search.maxResults","kind":"core","type":"integer","required":false,"deprecated":false,"sensitive":false,"tags":["performance","tools"],"label":"Web Search Max Results","help":"Number of results to return (1-10).","hasChildren":false} +{"recordType":"path","path":"tools.web.search.openaiCodex","kind":"core","type":"object","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":true} +{"recordType":"path","path":"tools.web.search.openaiCodex.allowedDomains","kind":"core","required":false,"deprecated":false,"sensitive":false,"tags":["access","tools"],"label":"Codex Allowed Domains","help":"Optional domain allowlist passed to the native Codex web_search tool.","hasChildren":false} +{"recordType":"path","path":"tools.web.search.openaiCodex.contextSize","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":["tools"],"label":"Codex Search Context Size","help":"Native Codex search context size hint: \"low\", \"medium\", or \"high\".","hasChildren":false} +{"recordType":"path","path":"tools.web.search.openaiCodex.enabled","kind":"core","type":"boolean","required":false,"deprecated":false,"sensitive":false,"tags":["tools"],"label":"Enable Native Codex Web Search","help":"Enable native Codex web search for Codex-capable models.","hasChildren":false} +{"recordType":"path","path":"tools.web.search.openaiCodex.mode","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":["tools"],"label":"Codex Web Search Mode","help":"Native Codex web search mode: \"cached\" (default) or \"live\".","hasChildren":false} +{"recordType":"path","path":"tools.web.search.openaiCodex.userLocation","kind":"core","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} {"recordType":"path","path":"tools.web.search.perplexity","kind":"core","type":"object","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":true} -{"recordType":"path","path":"tools.web.search.perplexity.apiKey","kind":"core","type":["object","string"],"required":false,"deprecated":false,"sensitive":true,"tags":["auth","security","tools"],"hasChildren":true} +{"recordType":"path","path":"tools.web.search.perplexity.apiKey","kind":"core","type":["object","string"],"required":false,"deprecated":false,"sensitive":true,"tags":["auth","security","tools"],"label":"Perplexity API Key","help":"Perplexity or OpenRouter API key (fallback: PERPLEXITY_API_KEY or OPENROUTER_API_KEY env var). Direct Perplexity keys default to the Search API; OpenRouter keys use Sonar chat completions.","hasChildren":true} {"recordType":"path","path":"tools.web.search.perplexity.apiKey.id","kind":"core","type":"string","required":true,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} {"recordType":"path","path":"tools.web.search.perplexity.apiKey.provider","kind":"core","type":"string","required":true,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} {"recordType":"path","path":"tools.web.search.perplexity.apiKey.source","kind":"core","type":"string","required":true,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} -{"recordType":"path","path":"tools.web.search.perplexity.baseUrl","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":["tools","url-secret"],"hasChildren":false} -{"recordType":"path","path":"tools.web.search.perplexity.model","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":false} +{"recordType":"path","path":"tools.web.search.perplexity.baseUrl","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":["tools","url-secret"],"label":"Perplexity Base URL","help":"Optional Perplexity/OpenRouter chat-completions base URL override. Setting this opts Perplexity into the legacy Sonar/OpenRouter compatibility path.","hasChildren":false} +{"recordType":"path","path":"tools.web.search.perplexity.model","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":["models","tools"],"label":"Perplexity Model","help":"Optional Sonar/OpenRouter model override (default: \"perplexity/sonar-pro\"). Setting this opts Perplexity into the legacy chat-completions compatibility path.","hasChildren":false} {"recordType":"path","path":"tools.web.search.provider","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":["tools"],"label":"Web Search Provider","help":"Search provider id. Auto-detected from available API keys if omitted.","hasChildren":false} {"recordType":"path","path":"tools.web.search.timeoutSeconds","kind":"core","type":"integer","required":false,"deprecated":false,"sensitive":false,"tags":["performance","tools"],"label":"Web Search Timeout (sec)","help":"Timeout in seconds for web_search requests.","hasChildren":false} {"recordType":"path","path":"tools.web.x_search","kind":"core","type":"object","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":true} diff --git a/src/agents/pi-embedded-runner/compact.ts b/src/agents/pi-embedded-runner/compact.ts index 4db1965dabc..0a7590e0bbe 100644 --- a/src/agents/pi-embedded-runner/compact.ts +++ b/src/agents/pi-embedded-runner/compact.ts @@ -481,7 +481,6 @@ export async function compactEmbeddedPiSessionDirect( modelId, modelCompat: effectiveModel.compat, modelApi: model.api, - modelCompat: effectiveModel.compat, modelContextWindowTokens: ctxInfo.tokens, modelAuthMode: resolveModelAuthMode(model.provider, params.config), }); diff --git a/src/agents/pi-embedded-runner/extra-params.ts b/src/agents/pi-embedded-runner/extra-params.ts index ff58a8080b6..f96aeed30cd 100644 --- a/src/agents/pi-embedded-runner/extra-params.ts +++ b/src/agents/pi-embedded-runner/extra-params.ts @@ -32,7 +32,6 @@ import { } from "./moonshot-stream-wrappers.js"; import { createOpenAIAttributionHeadersWrapper, - createCodexDefaultTransportWrapper, createCodexNativeWebSearchWrapper, createOpenAIDefaultTransportWrapper, createOpenAIFastModeWrapper, diff --git a/src/agents/pi-embedded-runner/run/attempt.ts b/src/agents/pi-embedded-runner/run/attempt.ts index e947b54b467..caf04049391 100644 --- a/src/agents/pi-embedded-runner/run/attempt.ts +++ b/src/agents/pi-embedded-runner/run/attempt.ts @@ -457,7 +457,6 @@ export async function runEmbeddedAttempt( modelId: params.modelId, modelCompat: params.model.compat, modelApi: params.model.api, - modelCompat: params.model.compat, modelContextWindowTokens: params.model.contextWindow, modelAuthMode: resolveModelAuthMode(params.model.provider, params.config), currentChannelId: params.currentChannelId, @@ -921,9 +920,6 @@ export async function runEmbeddedAttempt( effectiveWorkspace, params.model, agentDir, - effectiveWorkspace, - params.model, - agentDir, ); const agentTransportOverride = resolveAgentTransportOverride({ settingsManager, diff --git a/src/commands/configure.wizard.ts b/src/commands/configure.wizard.ts index 5836e637761..a0cddb0cca1 100644 --- a/src/commands/configure.wizard.ts +++ b/src/commands/configure.wizard.ts @@ -160,12 +160,12 @@ async function promptWebToolsConfig( runtime: RuntimeEnv, prompter: ReturnType, ): Promise { + type WebSearchConfig = NonNullable["web"]>["search"]; const existingSearch = nextConfig.tools?.web?.search; const existingFetch = nextConfig.tools?.web?.fetch; const { resolveSearchProviderOptions, setupSearch } = await import("./onboard-search.js"); - const { describeCodexNativeWebSearch, isCodexNativeWebSearchRelevant } = await import( - "../agents/codex-native-web-search.js" - ); + const { describeCodexNativeWebSearch, isCodexNativeWebSearchRelevant } = + await import("../agents/codex-native-web-search.js"); const searchProviderOptions = resolveSearchProviderOptions(nextConfig); note( @@ -185,7 +185,7 @@ async function promptWebToolsConfig( runtime, ); - let nextSearch: Record = { + let nextSearch: WebSearchConfig = { ...existingSearch, enabled: enableSearch, }; diff --git a/src/commands/models/auth.ts b/src/commands/models/auth.ts index 9ed413fad36..d4f0ee31405 100644 --- a/src/commands/models/auth.ts +++ b/src/commands/models/auth.ts @@ -536,54 +536,6 @@ function credentialMode(credential: AuthProfileCredential): "api_key" | "oauth" return "oauth"; } -async function runBuiltInOpenAICodexLogin(params: { - opts: LoginOptions; - runtime: RuntimeEnv; - prompter: ReturnType; - agentDir: string; -}) { - const creds = await loginOpenAICodexOAuth({ - prompter: params.prompter, - runtime: params.runtime, - isRemote: isRemoteEnvironment(), - openUrl: async (url) => { - await openUrl(url); - }, - localBrowserMessage: "Complete sign-in in browser…", - }); - if (!creds) { - throw new Error("OpenAI Codex OAuth did not return credentials."); - } - - const profileId = await writeOAuthCredentials("openai-codex", creds, params.agentDir, { - syncSiblingAgents: true, - }); - await updateConfig((cfg) => { - let next = applyAuthProfileConfig(cfg, { - profileId, - provider: "openai-codex", - mode: "oauth", - }); - if (params.opts.setDefault) { - next = applyOpenAICodexModelDefault(next).next; - } - return next; - }); - - logConfigUpdated(params.runtime); - params.runtime.log(`Auth profile: ${profileId} (openai-codex/oauth)`); - if (params.opts.setDefault) { - params.runtime.log(`Default model set to ${OPENAI_CODEX_DEFAULT_MODEL}`); - } else { - params.runtime.log( - `Default model available: ${OPENAI_CODEX_DEFAULT_MODEL} (use --set-default to apply)`, - ); - } - params.runtime.log( - "Tip: Codex-capable models can use native Codex web search. Enable it with openclaw configure --section web (recommended mode: cached). Docs: https://docs.openclaw.ai/tools/web", - ); -} - function maybeLogOpenAICodexNativeSearchTip(runtime: RuntimeEnv, providerId: string) { if (providerId !== "openai-codex") { return; diff --git a/src/config/legacy-web-search.ts b/src/config/legacy-web-search.ts index eaa1a900948..5bd62e90370 100644 --- a/src/config/legacy-web-search.ts +++ b/src/config/legacy-web-search.ts @@ -4,13 +4,7 @@ import { mergeMissing } from "./legacy.shared.js"; type JsonRecord = Record; -const GENERIC_WEB_SEARCH_KEYS = new Set([ - "enabled", - "provider", - "maxResults", - "timeoutSeconds", - "cacheTtlMinutes", -]); +const MODERN_SCOPED_WEB_SEARCH_KEYS = new Set(["openaiCodex"]); // Tavily only ever used the plugin-owned config path, so there is no legacy // `tools.web.search.tavily.*` shape to migrate. @@ -213,9 +207,9 @@ function normalizeLegacyWebSearchConfigRecord( if (LEGACY_WEB_SEARCH_PROVIDER_ID_SET.has(key) && isRecord(value)) { continue; } - // Preserve modern non-legacy search config blocks so the active schema can - // validate them instead of silently dropping nested objects during migration. - nextSearch[key] = value; + if (MODERN_SCOPED_WEB_SEARCH_KEYS.has(key) || !isRecord(value)) { + nextSearch[key] = value; + } } web.search = nextSearch; diff --git a/src/config/schema.base.generated.ts b/src/config/schema.base.generated.ts index 546ca4d47a1..ce8ce9236a4 100644 --- a/src/config/schema.base.generated.ts +++ b/src/config/schema.base.generated.ts @@ -5131,6 +5131,45 @@ export const GENERATED_BASE_CONFIG_SCHEMA = { }, ], }, + openaiCodex: { + type: "object", + properties: { + enabled: { + type: "boolean", + }, + mode: { + anyOf: [ + { + type: "string", + const: "cached", + }, + { + type: "string", + const: "live", + }, + ], + }, + allowedDomains: {}, + contextSize: { + anyOf: [ + { + type: "string", + const: "low", + }, + { + type: "string", + const: "medium", + }, + { + type: "string", + const: "high", + }, + ], + }, + userLocation: {}, + }, + additionalProperties: false, + }, brave: { type: "object", properties: { @@ -12934,7 +12973,7 @@ export const GENERATED_BASE_CONFIG_SCHEMA = { }, "tools.web.search.enabled": { label: "Enable Web Search Tool", - help: "Enable the web_search tool (requires a provider API key).", + help: "Enable managed web_search and optional Codex-native search for eligible models.", tags: ["tools"], }, "tools.web.search.provider": { @@ -12957,6 +12996,105 @@ export const GENERATED_BASE_CONFIG_SCHEMA = { help: "Cache TTL in minutes for web_search results.", tags: ["performance", "storage", "tools"], }, + "tools.web.search.openaiCodex.enabled": { + label: "Enable Native Codex Web Search", + help: "Enable native Codex web search for Codex-capable models.", + tags: ["tools"], + }, + "tools.web.search.openaiCodex.mode": { + label: "Codex Web Search Mode", + help: 'Native Codex web search mode: "cached" (default) or "live".', + tags: ["tools"], + }, + "tools.web.search.openaiCodex.allowedDomains": { + label: "Codex Allowed Domains", + help: "Optional domain allowlist passed to the native Codex web_search tool.", + tags: ["access", "tools"], + }, + "tools.web.search.openaiCodex.contextSize": { + label: "Codex Search Context Size", + help: 'Native Codex search context size hint: "low", "medium", or "high".', + tags: ["tools"], + }, + "tools.web.search.openaiCodex.userLocation.country": { + label: "Codex User Country", + help: "Approximate country sent to native Codex web search.", + tags: ["tools"], + }, + "tools.web.search.openaiCodex.userLocation.region": { + label: "Codex User Region", + help: "Approximate region/state sent to native Codex web search.", + tags: ["tools"], + }, + "tools.web.search.openaiCodex.userLocation.city": { + label: "Codex User City", + help: "Approximate city sent to native Codex web search.", + tags: ["tools"], + }, + "tools.web.search.openaiCodex.userLocation.timezone": { + label: "Codex User Timezone", + help: "Approximate timezone sent to native Codex web search.", + tags: ["tools"], + }, + "tools.web.search.brave.mode": { + label: "Brave Search Mode", + help: 'Brave Search mode: "web" (URL results) or "llm-context" (pre-extracted page content for LLM grounding).', + tags: ["tools"], + }, + "tools.web.search.gemini.apiKey": { + label: "Gemini Search API Key", + help: "Gemini API key for Google Search grounding (fallback: GEMINI_API_KEY env var).", + tags: ["security", "auth", "tools"], + sensitive: true, + }, + "tools.web.search.gemini.model": { + label: "Gemini Search Model", + help: 'Gemini model override (default: "gemini-2.5-flash").', + tags: ["models", "tools"], + }, + "tools.web.search.grok.apiKey": { + label: "Grok Search API Key", + help: "Grok (xAI) API key (fallback: XAI_API_KEY env var).", + tags: ["security", "auth", "tools"], + sensitive: true, + }, + "tools.web.search.grok.model": { + label: "Grok Search Model", + help: 'Grok model override (default: "grok-4-1-fast").', + tags: ["models", "tools"], + }, + "tools.web.search.kimi.apiKey": { + label: "Kimi Search API Key", + help: "Moonshot/Kimi API key (fallback: KIMI_API_KEY or MOONSHOT_API_KEY env var).", + tags: ["security", "auth", "tools"], + sensitive: true, + }, + "tools.web.search.kimi.baseUrl": { + label: "Kimi Search Base URL", + help: 'Kimi base URL override (default: "https://api.moonshot.ai/v1").', + tags: ["tools", "url-secret"], + }, + "tools.web.search.kimi.model": { + label: "Kimi Search Model", + help: 'Kimi model override (default: "moonshot-v1-128k").', + tags: ["models", "tools"], + }, + "tools.web.search.perplexity.apiKey": { + label: "Perplexity API Key", + help: "Perplexity or OpenRouter API key (fallback: PERPLEXITY_API_KEY or OPENROUTER_API_KEY env var). Direct Perplexity keys default to the Search API; OpenRouter keys use Sonar chat completions.", + tags: ["security", "auth", "tools"], + sensitive: true, + }, + "tools.web.search.perplexity.baseUrl": { + label: "Perplexity Base URL", + help: "Optional Perplexity/OpenRouter chat-completions base URL override. Setting this opts Perplexity into the legacy Sonar/OpenRouter compatibility path.", + tags: ["tools", "url-secret"], + }, + "tools.web.search.perplexity.model": { + label: "Perplexity Model", + help: 'Optional Sonar/OpenRouter model override (default: "perplexity/sonar-pro"). Setting this opts Perplexity into the legacy chat-completions compatibility path.', + tags: ["models", "tools"], + }, "tools.web.fetch.enabled": { label: "Enable Web Fetch Tool", help: "Enable the web_fetch tool (lightweight HTTP fetch).", @@ -15613,22 +15751,6 @@ export const GENERATED_BASE_CONFIG_SCHEMA = { sensitive: true, tags: ["security", "auth", "tools"], }, - "tools.web.search.gemini.apiKey": { - sensitive: true, - tags: ["security", "auth", "tools"], - }, - "tools.web.search.grok.apiKey": { - sensitive: true, - tags: ["security", "auth", "tools"], - }, - "tools.web.search.kimi.apiKey": { - sensitive: true, - tags: ["security", "auth", "tools"], - }, - "tools.web.search.perplexity.apiKey": { - sensitive: true, - tags: ["security", "auth", "tools"], - }, "mcp.servers.*.headers.*": { sensitive: true, tags: ["security"], @@ -15652,12 +15774,6 @@ export const GENERATED_BASE_CONFIG_SCHEMA = { "tools.web.search.grok.baseUrl": { tags: ["tools", "url-secret"], }, - "tools.web.search.kimi.baseUrl": { - tags: ["tools", "url-secret"], - }, - "tools.web.search.perplexity.baseUrl": { - tags: ["tools", "url-secret"], - }, "tools.media.models[].baseUrl": { tags: ["media", "tools", "url-secret"], },