CC Switch Version / 版本号: 3.19.2-5
Operating System / 操作系统: Windows
Related App / 涉及应用: Codex
Steps to Reproduce / 重现步骤
- MultiRouter(
New Codex MultiRouter)中 Hosted Tools 开关已开启:settings_config.hostedTools = {"webSearch": {"enabled": true}, "imageGeneration": {"enabled": true}}(当前现场两者均为 true)。
- Codex Desktop 路由到第三方模型(如 qwen3.8,Responses→Chat)。
- 提出需要实时信息的问题(例如“今天有什么最新新闻”)。
- 观察模型行为,并检查
~/.cc-switch/logs/codex-router.log。
Expected Behavior / 期望行为
第三方模型应能通过 hosted tool 桥接调用官方(OpenAI-hosted)Web 搜索:Codex 请求携带 hosted {"type":"web_search"} 工具,CCSwitchMulti 将其转换为普通 Chat function tool,用独立 OpenAI 凭据执行,并把结果回灌给第三方模型。
Actual Behavior / 实际行为
默认 Codex Desktop Agent 流程下,第三方模型完全无法调用官方搜索:
- 模型不会发出
web_search 工具调用,直接基于自身知识回答(或改用 MCP 搜索工具)。
- 2026-07-31 至 2026-08-17 的 194MB
codex-router.log 中 web_search 与 hosted 出现次数均为 0,即桥接从未实际执行过搜索。
- 官方路由(router-codex-official)不受影响:原生透传,官方搜索正常。
根因分析
官方 web search 是 OpenAI Responses API 的 hosted tool,执行点在 OpenAI-hosted 服务端;第三方 Chat Completions 上游无法原生执行(官方文档确认)。CCSwitchMulti 的 hosted tool 桥接(src-tauri/src/proxy/providers/hosted_tools/)正是为解决该问题而实现。
但自 v31 流式修复(c45d0dfa fix(proxy): preserve streaming for automatic hosted tools)起,forwarder.rs::should_enable_hosted_tool_loop() 对 tool_choice=auto(或缺省)的流式请求返回 false——而这正是 Codex Desktop 默认 Agent 流程的形态(stream=true、tool_choice="auto"、tools 数组含 hosted web_search)。loop 关闭时,apply_hosted_tool_switches(false, ...) 会把 web_search function tool 从 Chat 投影中移除,第三方模型根本看不到该工具。
桥接目前只在两种场景生效:
- 非流式请求;
- 显式
tool_choice 指向 web_search / image_generation。
这两种场景在 Codex Desktop 正常 Agent 流程中都不会出现,因此桥接被实际旁路。
背景
v31 之前,凡携带 hosted tools 的 Responses→Chat 请求一律强制 stream=false,长上下文场景表现为持续“正在思考”、无增量输出。v31 修复优先保证增量流式,在 streaming auto 路径从 Chat 投影中移除 hosted-only 工具。这是“流式体验”与“搜索能力”的权衡,目前后者被完全牺牲。
可能的方向(供讨论)
- 流式 + 按需缓冲:保留
web_search 工具在投影中,流式接收第三方响应;仅当模型实际发出 web_search 工具调用时,该 turn 转入 buffered loop(只在该 turn 接受失去增量输出)。
- 流中工具循环:收到 tool call 后暂停 SSE,执行桥接,再以后续请求继续(需要 Responses 协议支持多轮续接)。
- 按路由的搜索策略设置:让用户按 route 选择“流式优先”或“搜索优先”。
- 若短期均不可行,至少应在 UI/文档中明确“默认流式流程下第三方模型无法使用官方搜索”,且 catalog 的
supports_search_tool=true 不应暗示 OpenAI-hosted 搜索可用。
Additional Context / 补充信息
CC Switch Version / 版本号: 3.19.2-5
Operating System / 操作系统: Windows
Related App / 涉及应用: Codex
Steps to Reproduce / 重现步骤
New Codex MultiRouter)中 Hosted Tools 开关已开启:settings_config.hostedTools = {"webSearch": {"enabled": true}, "imageGeneration": {"enabled": true}}(当前现场两者均为 true)。~/.cc-switch/logs/codex-router.log。Expected Behavior / 期望行为
第三方模型应能通过 hosted tool 桥接调用官方(OpenAI-hosted)Web 搜索:Codex 请求携带 hosted
{"type":"web_search"}工具,CCSwitchMulti 将其转换为普通 Chat function tool,用独立 OpenAI 凭据执行,并把结果回灌给第三方模型。Actual Behavior / 实际行为
默认 Codex Desktop Agent 流程下,第三方模型完全无法调用官方搜索:
web_search工具调用,直接基于自身知识回答(或改用 MCP 搜索工具)。codex-router.log中web_search与hosted出现次数均为 0,即桥接从未实际执行过搜索。根因分析
官方 web search 是 OpenAI Responses API 的 hosted tool,执行点在 OpenAI-hosted 服务端;第三方 Chat Completions 上游无法原生执行(官方文档确认)。CCSwitchMulti 的 hosted tool 桥接(
src-tauri/src/proxy/providers/hosted_tools/)正是为解决该问题而实现。但自 v31 流式修复(
c45d0dfafix(proxy): preserve streaming for automatic hosted tools)起,forwarder.rs::should_enable_hosted_tool_loop()对tool_choice=auto(或缺省)的流式请求返回 false——而这正是 Codex Desktop 默认 Agent 流程的形态(stream=true、tool_choice="auto"、tools 数组含 hostedweb_search)。loop 关闭时,apply_hosted_tool_switches(false, ...)会把web_searchfunction tool 从 Chat 投影中移除,第三方模型根本看不到该工具。桥接目前只在两种场景生效:
tool_choice指向 web_search / image_generation。这两种场景在 Codex Desktop 正常 Agent 流程中都不会出现,因此桥接被实际旁路。
背景
v31 之前,凡携带 hosted tools 的 Responses→Chat 请求一律强制
stream=false,长上下文场景表现为持续“正在思考”、无增量输出。v31 修复优先保证增量流式,在 streaming auto 路径从 Chat 投影中移除 hosted-only 工具。这是“流式体验”与“搜索能力”的权衡,目前后者被完全牺牲。可能的方向(供讨论)
web_search工具在投影中,流式接收第三方响应;仅当模型实际发出web_search工具调用时,该 turn 转入 buffered loop(只在该 turn 接受失去增量输出)。supports_search_tool=true不应暗示 OpenAI-hosted 搜索可用。Additional Context / 补充信息
docs/codex-hosted-tool-bridge-design.md03afd497(桥接 MVP)、35e87971(复用 Codex OAuth 凭据)、c45d0dfa(v31 流式修复)