跳转到内容

工具调用必假死:Codex 的 function_call 丢失 call_id

Quick fix

评论者确认:流式累积时仅用非空 id/name 更新状态可恢复工具调用;原帖另提供绕过 CC Switch Responses 翻译、直连官方 OpenAI 的临时方案。

报错原文
Codex 不再派发工具、不发第二轮请求、不报错,会话循环沉默。

报告中,CC Switch 将上游 Chat Completions 流式响应转换为 Responses 事件时,首个 delta 中的工具调用 id 正常,但后续空字符串覆盖了累积状态,导致 response.output_item.done 与 response.completed 中的 call_id 为空。Codex 依靠 call_id 配对工具调用与结果,因此工具派发停住。作者在 qwen3.7-max、qwen3.6-plus、deepseek-v4-flash、glm-5.2 上复现,开关 reasoning 均未消除问题。

评论补充了 unsupported call: 变体:cc-switch-cli 的 id/name 均可能被空值覆盖,GUI 的 name 已有保护,但 id 仍缺少保护。该评论称非流式调用不受影响,Kimi 自有服务未出现此问题。评论者随后确认增加非空判断后恢复正常;这是代码修改后的用户验证,原帖未说明补丁是否合并或哪个发布版本包含修复,不能仅凭 issue 已关闭认定已发布修复。

  1. 核对流式事件:若 response.output_item.added 中 call_id 非空,而 response.output_item.done 与 response.completed 中变为空,则符合原帖报告;评论中的另一种表现是 name 同时为空并报 unsupported call:。

  2. 如需修改源码,在 streaming_codex_chat.rs 的 push_tool_call_delta 中保留已有累积值:仅当 id_delta 中的 id 非空时更新 state.call_id,仅当 name_delta 中的 name 非空时更新 state.name。评论者按此修改后确认工具调用恢复正常,但没有提供已发布的修复版本。

  3. 无法修改源码时,可采用作者报告的临时绕过方案:切到不经过 CC Switch Responses 翻译的路径,例如 Codex 官方 OpenAI 直连。原帖称无配置可绕过此翻译缺陷,且 codex-cli 0.142.2 已不支持 wire_api = "chat"。

  4. 修改后用带工具调用的流式请求复核:最终事件中的 call_id 应与 response.output_item.added 保持一致,工具名不应被后续空值清除,并检查 Codex 是否继续派发工具和发起后续请求。

ToolCodex
Version受影响:cc-switch 3.16.3
PlatformsmacOS
找到这个原因了是否可以修复了呀?
评论者提供了对 id/name 增加非空判断的代码修改,并随后确认修改后恢复正常。原帖未提供补丁合并记录或包含修复的发布版本。

这是一个非官方社区 wiki,与 cc-switch 作者及项目本身无隶属关系。内容整理自项目公开的 GitHub issues。本站不分发任何软件。