最近用 Codex CLI 写项目时,我碰到过一个很折磨人的问题:

明明同一个模型在网页里可以正常回答,放进 Codex 后却不是 401 Unauthorized,就是 404 Not Found;好不容易开始生成了,又突然出现 stream disconnected

很多人的第一反应是:

是不是模型不行?换一个更贵的模型会不会好一点?

实际排查下来,我发现这类问题大多数与“模型聪不聪明”没有直接关系,真正容易出错的是 API 协议、Base URL、模型 ID、Key 读取方式和流式连接

这篇不讨论模型排行榜,直接从一份能看懂、能排错的配置开始。

本文使用 Genvis 的 OpenAI 兼容接口作为示例。你已有其他兼容服务也可以照着检查,重点不是平台名称,而是每个字段必须对应得上。


一、先判断:你遇到的到底是哪种错误

别一看到红字就反复重装 Codex。不同状态码指向的问题完全不同。

报错表现 最常见原因 优先检查
401 Unauthorized Key 没有读取到、Key 无效 环境变量、Key 状态
404 Not Found Base URL 拼错、接口不支持 Responses /v1/responses
model not found 模型 ID 不存在或没有权限 控制台实际模型名
429 Too Many Requests 余额、额度或频率限制 账户余额、并发量
stream disconnected SSE 流被中断、代理超时、上游波动 网络、网关、超时配置
一直转圈无输出 请求已发出但迟迟收不到流式数据 接口协议、线路和日志

这张表很重要,因为它能阻止你做一件最浪费时间的事:明明是接口问题,却不停换模型。


二、Codex 配第三方 API,关键不是只改 base_url

不少教程只给出一行:

openai_base_url = "你的接口地址"

这种写法虽然简单,但当你需要同时管理模型名、独立 Key、重试策略时,很快就会混乱。

更清晰的方式是为接口单独定义一个 Provider。

打开用户级配置文件:

  • macOS / Linux:~/.codex/config.toml

  • Windows:%USERPROFILE%\.codex\config.toml

写入下面的配置:

model = "gpt-5.6-sol"
model_provider = "genvis"

[model_providers.genvis]
base_url = "https://genvis.xyz/v1"
env_key = "GENVIS_API_KEY"
wire_api = "responses"

这里的 genvis 只是自定义 Provider ID,可以自己命名,但不要使用 openaiollamalmstudio 这些保留名称。

模型名也不能凭感觉填写。上面的 gpt-5.6-sol 是本文示例,实际使用时应以平台控制台显示的模型 ID 为准。

每个字段分别做什么

  • model:准备调用的模型 ID。

  • model_provider:告诉 Codex 使用下面哪一组接口配置。

  • base_url:API 基础地址,通常应包含 /v1

  • env_key:保存 API Key 的环境变量名称,不是 Key 本身。

  • wire_api:Codex 与 Provider 通信使用的协议,目前填写 responses

最容易忽略的是最后一项。

有些中转接口只兼容 /chat/completions,普通聊天程序可以使用,但 Codex 走的是 Responses 协议。这种情况下,不管换多少个模型,依然可能报 404 或无法正常执行工具。


三、不要把 API Key 直接写进配置文件

推荐把 Key 放进环境变量。

macOS / Linux

临时设置:

export GENVIS_API_KEY="你的API Key"

如果希望每次打开终端都生效,可以把这行写进自己的 Shell 配置文件,然后重新打开终端。

Windows PowerShell

当前窗口临时生效:

$env:GENVIS_API_KEY="你的API Key"

写完后先检查变量是否存在。为了安全,不要截图或公开完整 Key。

macOS / Linux:

test -n "$GENVIS_API_KEY" && echo "Key 已加载" || echo "Key 未加载"

Windows PowerShell:

if ($env:GENVIS_API_KEY) { "Key 已加载" } else { "Key 未加载" }

如果这里显示“Key 未加载”,Codex 报 401 就一点也不奇怪。


四、先别启动 Codex,直接测试 Responses 接口

排错时最忌讳把所有问题混在一起。

先绕过 Codex,用一个最小请求验证接口是否真的支持 Responses:

curl https://genvis.xyz/v1/responses \
  -H "Authorization: Bearer $GENVIS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-5.6-sol",
    "input": "只回复 OK"
  }'

你需要关注的不是回答有多聪明,而是接口返回什么:

  • 返回正常 JSON:说明地址、Key、模型和 Responses 接口基本可用。

  • 返回 401:优先检查 Key,而不是模型。

  • 返回 404:检查 /v1/responses 是否存在,以及网关是否真正兼容 Responses。

  • 返回 model_not_found:模型名不对,去控制台复制准确 ID。

  • 返回 429:检查余额、限额或请求频率。

只有这一步通过后,再启动 Codex。这样可以把“接口问题”和“Codex 配置问题”彻底分开。

Windows PowerShell 的 curl 行为可能与 macOS、Linux 不同。如果命令解析失败,可以使用 curl.exe,或用 Postman 发出同样的请求。


五、Responses 测试通过,Codex 仍然断流怎么办

如果最小请求已经成功,但 Codex 执行长任务时仍出现 stream disconnected,问题通常集中在流式连接。

Coding Agent 与普通问答不同。一次任务可能持续数分钟,中间还要读取文件、调用终端、等待测试结果。只要反向代理、网络线路或上游服务提前断开 SSE 连接,Codex 就可能收到断流错误。

可以在 Provider 中补充重试和空闲超时配置:

[model_providers.genvis]
base_url = "https://genvis.xyz/v1"
env_key = "GENVIS_API_KEY"
wire_api = "responses"
request_max_retries = 6
stream_max_retries = 8
stream_idle_timeout_ms = 600000

这三个参数分别控制:

  • request_max_retries:普通 HTTP 请求失败后的重试次数。

  • stream_max_retries:流式连接中断后的重试次数。

  • stream_idle_timeout_ms:流式连接在没有新数据时允许等待多久。

需要注意:增加重试只能缓解偶发断流,不能修复错误的接口地址,也不能把一个只支持 Chat Completions 的网关变成 Responses 网关。

如果每次都在同一个位置中断,应继续检查:

  1. 反向代理是否设置了过短的读取超时。

  2. CDN 或代理软件是否会缓存、缓冲 SSE 数据。

  3. 上游模型是否真的支持长时间工具调用。

  4. 账户是否在任务中途触发余额或频率限制。

  5. 当前网络切换后,断流现象是否消失。


六、一个很隐蔽的坑:配置文件放错位置

Codex 支持用户级配置和项目级配置,但 Provider、认证和 model_provider 这类机器本地设置,应放在用户级 ~/.codex/config.toml 中。

如果你把整套 Provider 配置只放进项目里的 .codex/config.toml,Codex 可能不会按预期采用。

所以排查时不要只确认“文件写了”,还要确认“写在正确的位置”。

另外,修改环境变量或配置后,建议完全退出当前 Codex 会话并重新打开终端,避免旧进程继续使用原来的配置。

启动后可以先运行:

/status

确认当前模型和 Provider 是否与配置一致,再让它读取项目、修改代码或执行测试。


七、为什么这次我没有直接对接多个模型平台

理论上,每个模型都可以分别申请 Key、分别充值、分别维护配置。

但 Coding Agent 经常需要切换模型:一个模型适合复杂规划,另一个模型可能更适合快速修改或低成本执行。如果每换一次模型就重新注册平台、修改地址、检查余额,维护成本很快会超过调用成本。

所以我这次直接用 Genvis 做统一接口示例,把 Provider 固定下来,需要切换时主要调整模型 ID。

对我来说,它的价值不是“多一个聊天网站”,而是减少 Codex、脚本和其他开发工具之间重复维护 API 配置的工作。

如果你也在配置 Codex,可以直接复制本文的 Provider 结构。Genvis 的接口地址已经放在配置代码里,创建 Key 后写入 GENVIS_API_KEY 即可;具体可用模型仍以控制台列表为准。


八、最后给一份排查顺序

下次再遇到 401、404 或断流,不要先卸载重装,也不要马上换模型。按照下面的顺序检查:

  1. 确认 Codex 版本可以正常启动。

  2. 确认配置位于用户级 ~/.codex/config.toml

  3. 确认 Provider ID 没有使用保留名称。

  4. 确认 base_url 包含正确的 /v1

  5. 确认 env_key 写的是环境变量名称。

  6. 确认模型 ID 来自平台实际模型列表。

  7. 直接请求 /v1/responses 做最小测试。

  8. 最小测试通过后,再检查 SSE、代理超时和重试参数。

  9. 重启终端,通过 /status 核对最终配置。

一套完整的 Coding Agent,表面上看是模型在写代码,背后其实是一整条工程链路:认证、协议、路由、流式传输、工具调用和本地环境,任何一环不匹配都会失败。

因此,遇到报错时最有效的做法往往不是换一个更贵的模型,而是把链路一段一段拆开验证。

如果这篇能帮你跑通 Codex,可以先收藏。后面我会继续整理 Claude Code、Cursor 共用一个 Key,以及 Coding Agent 常见报错的完整排查清单。

更多推荐