5.6 KiB
5.6 KiB
Codex App Web Search 接入发现
已确认
- 用户观察正确:Codex App/app-server 本身会做原生自动上下文压缩。
- 旧的“检测上下文超限 →
/compact→ 重放”属于 detached Claude/旧 Codex CLI 的客户端兜底,不等于 Codex App 没有自动压缩。 lib/codex-app-runtime.js已识别webSearchitem,并映射为web_search/WebSearch展示事件。- 当前 Codex 配置把
enableSearch与supportsSearch硬编码为false,保存开启请求时也会忽略;该限制来自旧codex exec路径,需要收敛到 Codex App 原生能力。 - OpenAI 官方页面在当前网络环境不可访问:developers 域返回 Forbidden,platform 域被 Cloudflare 拦截。
- 按用户提示补用
proxyd.picpi.top/{原始 URL}后,官方搜索页与 app-server 文档页仍返回上游Forbidden;代理链路可达,但无法绕过官方站点的访问限制。 - TODO CSV 计划审查已通过;审查员建议在确认 schema 后记录字段名、关闭语义与证据来源。
待确认
- hapi 是否使用相同字段;主线程全文检索暂未命中,等待只读研究子代理复核。
Codex 0.147.0 协议证据
- 本机
codex app-server generate-json-schema --experimental生成的 v2 schema 中,Config.web_search引用WebSearchMode。 WebSearchMode的枚举值为disabled、cached、indexed、live。ThreadStartParams.config和ThreadResumeParams.config都允许线程级 config;TurnStartParams没有 Web Search 专用字段。- cc-web 的
codexAppThreadParams()已把codexAppThreadConfig()同时用于thread/start与thread/resume,因此正确接入点是codexAppThreadConfig()写入web_search。 - 生成的 resolved
Config同时存在两层:顶层web_search: WebSearchMode,以及tools.web_search: WebSearchToolConfig。前者选择disabled/cached/indexed/live模式,后者承载context_size/allowed_domains/location等工具配置;不能把二者混成同一字段。 - CLI 解析实测:
web_search="live"、tools.web_search=true、tools.web_search=false都能加载;tools.web_search="live"或"disabled"不合法。 - app-server
config/read实测:顶层配置会解析为web_search: "live";tools.web_search=true/false都归一到tools.web_search: null,仅凭读取结果无法证明布尔输入的最终启停语义。 codex --help明确--search是“Enable live web search”,但该开关只属于 Codex CLI 根命令,codex app-server --search会被拒绝;app-server 应使用线程 config。- 官方 OpenAI 文档通过
proxyd-accelerator成功获取:web-search.md明确 live 用web_search = "live"、关闭用web_search = "disabled";config-reference.md明确tools.web_search只是可选的上下文大小、域名和位置配置。 - 最终协议决策:cc-web 开关只传顶层
web_search: enableSearch ? 'live' : 'disabled';当前产品没有域名/位置细节 UI,因此不传tools.web_search。 - app-server 的
webSearchthread item 已由lib/codex-app-runtime.js映射为前端web_search工具事件,展示链路已有基础。
实现与回归落点
- 服务端配置需把
load/save/masked/handleSave的enableSearch改为真实布尔值,并将supportsSearch对 Codex App 暴露为true;旧 Codex CLI 路径仍不读取该开关。 codexAppThreadConfig()应无条件写入web_search: enableSearch ? 'live' : 'disabled',让thread/start与thread/resume都明确覆盖用户全局搜索默认值。- 设置面板已有
.settings-toggle-row/.settings-switch组件,可新增“Web Search”开关,无需新增 CSS。 - mock app-server 当前可在
thread/start/thread/resume捕获params.config.web_search;回归应分别覆盖开启后的live与保存关闭后的disabled。 - 现有配置回归仍断言“unsupported/ignore”,必须改为
supportsSearch === true、enableSearch === true,并在后续关闭保存中断言enableSearch === false。 - Web Search 事件映射已有实现,但目前回归未直接断言
webSearchitem →web_search工具事件,需要补 mock 事件或静态契约断言。
最终实现结果
server.js的 Codex 配置现在真实保存/读取enableSearch,对 Codex App 暴露supportsSearch: true,保存提示不再声称“Codex exec 暂未接入”。codexAppThreadConfig()每次组装线程参数时写入web_search: 'live' | 'disabled';同一配置同时覆盖thread/start和thread/resume。public/app.js设置面板新增可读写的 Web Search switch,说明文案限定为当前 Codex App 会话。- mock app-server 暴露首次线程搜索模式与当前线程搜索模式,回归分别证明开启态
live、关闭后的 resumedisabled,并证明未使用tools.web_search代替模式开关。 scripts/regression.js新增webSearchitem 的WebSearch/web_searchtool_start/tool_end/persistence 断言。- 两次回归均通过:
timeout 60s node scripts/regression.js、timeout 60s npm run regression。
旧 Codex 模式盘点结论
- 普通 UI 已默认 Codex App,Codex App 的
/compact、/goal、协作模式、MCP、附件、标题、自动容量重试已有实现。 - 仍需后续单独处理的遗留:后端可新建
agent='codex',旧codex exec运行链路完整存在,rollout 导入与 regression 仍覆盖旧 CLI。它们属于迁移/封口任务,不在本轮 Web Search 范围内。 - 未知 app-server request 的“不支持”兜底应保留;运行中已知 slash 的策略需要产品决定,不应与本轮 Web Search 混改。