跳转到内容

Messages with role 'tool' must be a response to a preceding message with 'tool_calls'(Codex)

Quick fix

在 cc-switch 中把“本地路由”开关关掉再重新打开即可临时恢复;这是代理内部状态问题,会复发,属于待修复的 bug。

报错原文
CC Switch local proxy failed while handling Codex endpoint /responses. Provider: DeepSeek; model: gpt-5.5; upstream_status: HTTP 400; cause: Messages with role 'tool' must be a response to a preceding message with 'tool_calls'

该错误出现在 cc-switch 本地代理转发 Codex 的 /responses 请求时(issue 中为 cc-switch 3.16.4 + Windows + DeepSeek 上游)。代理在把 Codex 的会话历史转换为上游格式时,产生了 role 为 'tool' 的消息,但它前面并没有对应的带 'tool_calls' 的 assistant 消息,于是上游(如 DeepSeek)校验失败返回 HTTP 400。

根据 issue 中的分析,疑似根因是流式返回的 tool_calls 增量被截断或被空增量覆盖,导致上游收到的 assistant(tool_calls) 消息与后续 tool 消息对不上;另一个可能是 thinking 模式下 reasoning_content 没有完整带回下一轮,被 DeepSeek 拒绝。同一问题还有更隐蔽的表现:模型完全不发起工具调用,只回复一句很短的话就以 end_turn 结束,日志里没有任何报错,两种症状会交替出现。另外,本 issue 的评论中还混入了其他不同原因的错误变体(如 401 Unauthorized、502 Bad Gateway、function schema 校验失败的 400),那些是上游或配置问题,与本页的 tool 消息顺序错误不是同一原因。

  1. 打开 cc-switch,找到“本地路由”(local routing)开关。

  2. 将该开关关闭,然后再重新打开(即关闭→开启一次)。

  3. 不用重启终端或 Codex,直接在 Codex 中重试请求,多人验证可立即恢复正常。

  4. 注意这只是临时 workaround,问题过一段时间会复发;复发时重复一次开关切换即可,根治需等 cc-switch 修复代理内部状态问题。

ToolCodex
Versioncc-switch 3.16.4
PlatformsWindows
关掉再打开本地路由后还是不能用怎么办?
issue 中有人反馈第一次切换后仍不行,再次切换后成功;也有人发现自己的情况其实是上游网关的问题(参见 QuantumNous/new-api#6038),并非本 bug。请确认你的错误文本是否与本页的 'tool' must be a response to a preceding message with 'tool_calls' 完全一致。
为什么有时不报 400,而是模型直接不调用工具、回复一句就结束了?
这是同一问题的隐蔽变体:流式 tool_calls 增量被截断后,模型表现为不发工具调用、以 end_turn 结束,且日志无报错。同样可以用关闭再打开本地路由的方式临时恢复。
需要开启路由或切换原生 responses 格式吗?
有用户指出出现此类错误时可能是没开路由、或选了原生 responses 格式却开了路由,可先检查这两项配置是否与你的上游匹配。
401、502 或 'Invalid schema for function' 也是这个问题吗?
不是。401 Unauthorized 多为上游鉴权问题,502 是网关错误,schema 相关 400 是函数定义问题,它们的 cause 文本不同,需要分别排查上游配置。

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