遇到的这个reasoning_content错误,是 DeepSeek 思考模式(Thinking Mode)与 OpenAI 兼容客户端(如 Codex)集成时的一个经典“协议摩擦”。
🔍 错误原因:多轮工具调用中的“上下文丢失”
根本原因是:DeepSeek 要求在多轮工具调用(Tool Calls)对话中,必须原样回传上一轮 Assistant 消息中的reasoning_content字段,但 Codex 的 OpenAI 兼容层在构造下一轮请求时,会把这个 DeepSeek 特有的字段“过滤”掉。
具体流程如下:
DeepSeek V4 在思考模式下,如果决定调用工具(tool_calls),其返回的 assistant 消息会包含一个
reasoning_content字段,其中记录了模型的推理过程。DeepSeek 的 API 要求:在后续的每一轮请求中,这个带有
tool_calls的 assistant 消息必须完整保留reasoning_content字段一并回传。然而,Codex 作为一个为 OpenAI 模型设计的客户端,其内部的消息序列化逻辑只保留 OpenAI 标准的字段(如
content、tool_calls),会自动丢弃reasoning_content这类非标准字段。当 Codex 带着缺失
reasoning_content的历史记录再次请求 DeepSeek 时,DeepSeek 的服务器校验失败,返回 400 错误。
💡 解决方案
目前这个问题需要通过在 Codex 和 DeepSeek API 之间引入一个本地代理(Proxy)来解决。这个代理会缓存reasoning_content,并在后续请求中将其“补回”到消息历史里。
方案一:使用专为 Codex 设计的修复工具(推荐)
有开发者专门为 Codex 接入 DeepSeek 的场景开发了修复工具。
你可以尝试使用codex-bridge这个项目。根据社区信息,它专门用于中转 Codex 到 DeepSeek 的 API 请求,并处理reasoning_content的回传问题。
从 GitHub 获取项目:
https://github.com/wujfeng712-ui/codex-bridge根据项目文档,启动本地代理服务,然后将 Codex 的
base_url指向这个本地代理的地址(例如http://127.0.0.1:8787/v1)。
方案二:使用通用的 DeepSeek 兼容性代理
如果上述工具不适用,可以使用更通用的deepseek-compat-kit或deepseek-lane。
在终端运行:
npx deepseek-compat-kit proxy --port 8787将 Codex 配置中的
base_url修改为http://127.0.0.1:8787/v1。
这些代理的原理都是在本地维护一个推理内容缓存,当检测到后续请求缺失reasoning_content时,自动从缓存中取出并注入。
方案三:在 config.toml 中调整wire_api(值得一试)
在修改配置前,可以先检查一下 Codex 的~/.codex/config.toml文件中,DeepSeek provider 的wire_api设置。
如果当前是
wire_api = "chat",可以尝试将其改为wire_api = "responses"。有信息表明,保持 Codex 在 Responses 客户端表面(
wire_api = "responses")可能有助于绕过 Chat Completions 端点上的reasoning_content校验路径。
⚠️ 一个不太理想的备选方案
如果以上代理方案都难以配置,你可以考虑临时关闭 DeepSeek 的思考模式。但这会牺牲模型的推理能力,对于复杂编码任务可能不是最佳选择。
💎 总结
这个问题的本质是DeepSeek 的思考模式协议与 OpenAI 兼容客户端之间的不匹配。最彻底的解决方案是等待 Codex 官方修复其序列化逻辑,但在那之前,通过本地代理进行字段回填是目前最有效的变通方法。建议优先尝试codex-bridge,它的定位最契合你的场景。