Skip to content

第三方模型无法调用官方 Web 搜索(默认流式流程中 hosted web_search 桥接被旁路) #17

Description

@BigStrongSun

CC Switch Version / 版本号: 3.19.2-5
Operating System / 操作系统: Windows
Related App / 涉及应用: Codex

Steps to Reproduce / 重现步骤

  1. MultiRouter(New Codex MultiRouter)中 Hosted Tools 开关已开启:settings_config.hostedTools = {"webSearch": {"enabled": true}, "imageGeneration": {"enabled": true}}(当前现场两者均为 true)。
  2. Codex Desktop 路由到第三方模型(如 qwen3.8,Responses→Chat)。
  3. 提出需要实时信息的问题(例如“今天有什么最新新闻”)。
  4. 观察模型行为,并检查 ~/.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.logweb_searchhosted 出现次数均为 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=truetool_choice="auto"、tools 数组含 hosted web_search)。loop 关闭时,apply_hosted_tool_switches(false, ...) 会把 web_search function tool 从 Chat 投影中移除,第三方模型根本看不到该工具。

桥接目前只在两种场景生效:

  1. 非流式请求;
  2. 显式 tool_choice 指向 web_search / image_generation。

这两种场景在 Codex Desktop 正常 Agent 流程中都不会出现,因此桥接被实际旁路。

背景

v31 之前,凡携带 hosted tools 的 Responses→Chat 请求一律强制 stream=false,长上下文场景表现为持续“正在思考”、无增量输出。v31 修复优先保证增量流式,在 streaming auto 路径从 Chat 投影中移除 hosted-only 工具。这是“流式体验”与“搜索能力”的权衡,目前后者被完全牺牲。

可能的方向(供讨论)

  1. 流式 + 按需缓冲:保留 web_search 工具在投影中,流式接收第三方响应;仅当模型实际发出 web_search 工具调用时,该 turn 转入 buffered loop(只在该 turn 接受失去增量输出)。
  2. 流中工具循环:收到 tool call 后暂停 SSE,执行桥接,再以后续请求继续(需要 Responses 协议支持多轮续接)。
  3. 按路由的搜索策略设置:让用户按 route 选择“流式优先”或“搜索优先”。
  4. 若短期均不可行,至少应在 UI/文档中明确“默认流式流程下第三方模型无法使用官方搜索”,且 catalog 的 supports_search_tool=true 不应暗示 OpenAI-hosted 搜索可用。

Additional Context / 补充信息

  • 官方文档(web_search 为 Responses API hosted tool;Chat Completions 仅支持专用搜索模型):https://developers.openai.com/api/docs/guides/tools-web-search
  • 设计文档:docs/codex-hosted-tool-bridge-design.md
  • 相关提交:03afd497(桥接 MVP)、35e87971(复用 Codex OAuth 凭据)、c45d0dfa(v31 流式修复)

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions