Codex CLI 挂在中转上?根因是 Responses API
OpenAI 的 Codex CLI 调用的不是经典的 Chat Completions API,而是更新的 Responses API 协议。多数 OpenAI 兼容中转只实现了 Chat Completions,于是同一个 key 在 curl 里正常、放进 Codex 就 404 或报格式错误。Router One 原生实现了 Responses 协议(wire_api = "responses"),改两分钟配置即可跑通。
一句话根因
Codex 把请求发往 /responses 风格的路径,请求 schema 也是 Chat Completions 服务端不认识的。只会说 Chat Completions 的中转只能回 404(路径不存在)或 400(字段不识别)。换 key、换模型都救不了协议不匹配——必须网关本身支持。
可用的配置
在 ~/.codex/config.toml 里把 Codex 指向 Router One,并在运行 codex 的同一个 shell 里导出密钥:
# ~/.codex/config.toml model_provider = "router" [model_providers.router] name = "router" base_url = "https://api.router.one/v1" env_key = "ROUTER_ONE_API_KEY" wire_api = "responses" # 在 shell 里: # export ROUTER_ONE_API_KEY=sk-your-router-one-key
报错排查表
改完配置仍然失败时:
| 症状 | 原因 | 修复 |
|---|---|---|
| 所有请求都 404 | base_url 指向了不支持 Responses API 的中转,或有拼写错误 | base_url 精确设为 https://api.router.one/v1,并保留 wire_api = "responses"。 |
| 401 未授权 | 运行 codex 的 shell 里看不到 ROUTER_ONE_API_KEY | 在同一会话(或 shell profile)里导出密钥,重启终端后再运行 codex。 |
| 模型不存在 | 模型 ID 与目录不一致 | 从 /models 页复制精确 ID——区分大小写。 |
| 402 余额不足 | 钱包或 Key 消费上限用尽 | 充值,或在 Dashboard → API Keys 调高 maxSpend。 |
| 配置像是没生效 | Codex 读的配置文件不是你改的那个 | 确认文件位于 ~/.codex/config.toml(Windows:%USERPROFILE%\.codex\config.toml)。 |
| 400 里提到 background 或 image_generation | Codex 请求了后台执行或 image_generation 工具——这是网关不提供的两项 Responses 特性 | 关掉 background 模式;图片生成改走 POST /v1/images/generations。hosted 工具与 previous_response_id 在原生走 Responses 的模型上照常可用。 |
| 400 提示模型必须走 /v1/messages | 你在 Codex 里填了 Claude 家族的模型 ID;Claude 在 Anthropic 兼容端点和 /v1/chat/completions 上服务,不在 /v1/responses 上 | 换成详情页列出 POST /v1/responses 的模型(GPT 系列或 DeepSeek V4)。要用 Claude 请改用 Claude Code。 |
| codex-auto-review 报模型不存在 | Codex CLI 的 review 线(/review 与自动审查)会以模型 ID codex-auto-review 发请求,除非 config.toml 里的 review_model 改了它;只认自家模型清单、或只实现 Chat Completions 的中转会拒绝这个 ID | Router One 侧无需改动——codex-auto-review 就在目录里,走 /v1/responses 与 /v1/chat/completions,价格见 /models/codex-auto-review。想用别的模型审查,在 ~/.codex/config.toml 里设置 review_model。 |
Responses 端点接受什么、拒绝哪两样
Router One 自己实现了 Responses 协议,服务对象是模型详情页列出 POST /v1/responses 的模型(GPT 系列与 DeepSeek V4)。下表按请求特性列出当前行为;凡是接受的,都按原样转发、按该模型标准费率计费。
| 请求特性 | 状态 | 说明 |
|---|---|---|
| function 工具(Codex 默认的工具形态) | 接受 | 结构化工具调用作为一等 Responses 输出项返回。 |
| custom 工具(Codex 的 freeform apply_patch 等) | 原生走 Responses 的模型上接受 | 请用详情页列出 POST /v1/responses 的模型;其他模型返回 400 invalid_request。 |
| previous_response_id / conversation / prompt(服务端上下文引用) | 原生走 Responses 的模型上接受 | 模型限制与 custom 工具相同;引用在原生路径上解析。 |
| hosted 工具:file_search、code_interpreter、computer_use、mcp、web_search | 原生走 Responses 的模型上接受 | 按原样转发、按该模型标准费率计费——Router One 自身不执行其中任何一项。 |
| 带 file_id 或 file_url 的 input_file 块 | 原生走 Responses 的模型上接受 | 模型限制相同;文件引用随请求一起转发。 |
| service_tier(任意取值) | 接受 | 按原样转发;无论哪个档位都按该模型标准费率计费。 |
| stream / instructions / temperature / max_output_tokens | 接受 | 按原样转发;见 Responses 接口参考。 |
| image_generation 工具与 image_generation_call 输入项 | 拒绝——400 invalid_request | 图片生成不经 Responses 端点开放;请改走 POST /v1/images/generations(见 /image-generation-api)。 |
| background: true | 拒绝——400 invalid_request | 不提供后台执行,也没有 GET /v1/responses/{id} 可事后取回结果;每个请求必须在自己的 HTTP 连接内完成。 |
用 trace 验证
请求一旦到达网关,每次 Codex 调用都会出现在 Dashboard → Logs 里,带模型、tokens、花费和状态。如果 Codex 在报错而日志是空的,问题仍在本地——配置路径或环境变量;如果日志里有 4xx 记录,trace 会直接指出撞上的限制。
常见问题
为什么我的 key 在 curl 里能用,在 Codex 里不行?
curl 测的是 Chat Completions 面;Codex 用的是 Responses API 协议。一个中转完全可以通过 curl 测试、却对 Codex 返回 404。网关必须原生实现 Responses 协议——Router One 支持。
wire_api = "responses" 到底是干什么的?
它告诉 Codex 用哪种协议形态与该 provider 块通信。设为 "responses" 时,Codex 发送 Responses API 格式的请求;对面的端点必须原生理解它。
base URL 要不要带 /v1?
要——Codex 用的 OpenAI 兼容 base URL 是 https://api.router.one/v1,包含 /v1。这和 Claude Code 正好相反:Anthropic 兼容 base URL 不带 /v1。
通过网关 Codex 能用哪些模型?
原生走 Responses 协议的模型:GPT 系列与 DeepSeek V4(deepseek-v4-pro、deepseek-v4-flash)。用 /models 页的精确模型 ID——每个模型页都会列出是否提供 POST /v1/responses。Claude 模型不在这个端点上:发过来会在调用任何模型之前就拿到 400。
Codex 里指定 Claude 模型报 400,怎么办?
网关在调用任何模型之前就拒绝了这个请求,消息里直接写明该模型在哪条路径上:model 'anthropic/claude-opus-5' must be called via /v1/messages or /v1/chat/completions。Claude 在 Anthropic 兼容端点(Claude Code 走的那条)和 /v1/chat/completions 上服务,不在 /v1/responses 上。把 Codex 换成 GPT 系列模型或 DeepSeek V4;要用 Claude 就改用 Claude Code——见 /claude-code-china。
Codex 一直在请求的 codex-auto-review 是什么模型?
这是 Codex CLI 的 review 线(/review 与自动审查)发出的模型 ID,除非 ~/.codex/config.toml 里的 review_model 指向了别的模型。只按自家清单校验模型名、或只实现 Chat Completions 的中转会回 model not found。Router One 的目录里就有 codex-auto-review,请求会像其他模型一样被路由和计费——在 /v1/responses 与 /v1/chat/completions 上可用,当前价格见 /models/codex-auto-review。
previous_response_id、hosted 工具和 service_tier 经网关能用吗?
能,在原生走 Responses 协议的模型上可用——模型页的端点列表会标明。请求按原样转发、按该模型标准费率计费;只有 background: true 和 image_generation 工具会被 400 拒绝。
Codex 里调图片生成为什么 400?
图片生成不经 Responses 端点开放,所以 image_generation 工具或 image_generation_call 输入项会在调用任何模型之前被 400 invalid_request 拒掉。图片生成请改走 POST /v1/images/generations——见 /image-generation-api。
能后台跑 response 吗?
不能。background 必须省略或为 false;background: true 会返回 400 invalid_request。网关不提供后台执行,也没有 GET /v1/responses/{id},连接断开后结果无法再取回。
中国大陆能用吗?
能。网关在大陆可直连、无需 VPN;上面的 config.toml 在任何地区都完全一致。