Codex 一直报 stream disconnected?别急着换模型,这份配置把 401、404 和断流一起查清楚
最近用 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,可以自己命名,但不要使用 openai、ollama、lmstudio 这些保留名称。
模型名也不能凭感觉填写。上面的 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 网关。
如果每次都在同一个位置中断,应继续检查:
-
反向代理是否设置了过短的读取超时。
-
CDN 或代理软件是否会缓存、缓冲 SSE 数据。
-
上游模型是否真的支持长时间工具调用。
-
账户是否在任务中途触发余额或频率限制。
-
当前网络切换后,断流现象是否消失。
六、一个很隐蔽的坑:配置文件放错位置
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 或断流,不要先卸载重装,也不要马上换模型。按照下面的顺序检查:
-
确认 Codex 版本可以正常启动。
-
确认配置位于用户级
~/.codex/config.toml。 -
确认 Provider ID 没有使用保留名称。
-
确认
base_url包含正确的/v1。 -
确认
env_key写的是环境变量名称。 -
确认模型 ID 来自平台实际模型列表。
-
直接请求
/v1/responses做最小测试。 -
最小测试通过后,再检查 SSE、代理超时和重试参数。
-
重启终端,通过
/status核对最终配置。
一套完整的 Coding Agent,表面上看是模型在写代码,背后其实是一整条工程链路:认证、协议、路由、流式传输、工具调用和本地环境,任何一环不匹配都会失败。
因此,遇到报错时最有效的做法往往不是换一个更贵的模型,而是把链路一段一段拆开验证。
如果这篇能帮你跑通 Codex,可以先收藏。后面我会继续整理 Claude Code、Cursor 共用一个 Key,以及 Coding Agent 常见报错的完整排查清单。
更多推荐



所有评论(0)