【已解决】Codex 接第三方 API 报错 401/403/404/503、stream disconnected 逐条排查(附 gpt-6-astra 配置)
我这几个月一直在跑一个 OpenAI 兼容网关自己也天天用 Codex 接它干活。客户端的报错和网关的日志两头都看得到最大的感受是Codex 的报错信息很会误导人——模型名写错它报 503base_url 少写一个/v1它报「网络断流」让你去查一晚上梯子。下面的报错原文要么是我用 Codex 0.153.4 故意配错、一条条触发出来的2026 年 9 月实测要么是我自己日志里真实出现过的。先学会看报错一条报错有三段信息ERROR: unexpected status 401 Unauthorized: Invalid token (request id: 202609230412082972769328268d9d6PTw1Vafb), url: https://api.wanapis.com/v1/responses, cf-ray: a3f6b593ea83fd35-SIN状态码401 Unauthorized冒号后面那句是谁说的、说了什么。带request id的是中转站回的截图发给站点客服能直接定位到那条请求url请求实际发到了哪。先看这个——如果不是你填的中转地址说明配置根本没生效后面都不用查了报错速查表你看到的真正原因怎么办401 Unauthorized: Invalid token (request id: …)key 不对复制不全、被删、过期或拿 A 站的 key 配了 B 站的地址重新codex login --with-api-key404 Not Found: Invalid URL (POST /v1/responses/responses)base_url 写成了完整路径base_url 只写到/v1stream disconnected before completion每次都断base_url 漏了/v1网关回了个网页补上/v1stream disconnected before completion时好时坏网络链路代理、QUIC、IPv6见第 3 节503 … 无可用渠道前面还有一条Model metadata … not found模型名写错了对照中转站的模型列表503 Service Unavailable: system cpu overloaded中转站自己的过载保护等一两分钟再试403 Forbidden: insufficient balance余额不足——你的或者中转站上游的先查余额够就新开会话Error loading config.toml: wire_api chat is no longer supported新版 Codex 只走 Responses API改成wire_api responses1. 401 Invalid tokenkey 多半是改错了地方Codex 读 key 有两个地方看你 provider 里怎么写requires_openai_auth true读~/.codex/auth.json里的OPENAI_API_KEYenv_key 某个变量名读这个环境变量最常见的情况是你改了环境变量Codex 读的却是 auth.json或者反过来。我的建议是统一用 auth.json一次写进去CLI 和桌面版都能读到export OPENAI_API_KEYsk-你的中转站key printenv OPENAI_API_KEY | codex login --with-api-key codex login status用环境变量还有一个坑macOS 上从 Dock 打开的应用一般读不到你在~/.zshrc里 export 的变量——表现就是「终端里 codex 能用桌面版报 401」。2. base_url只写到 /v1多一截少一截都不行我把四种写法都试了一遍base_url结果https://api.wanapis.com/v1✅ 正常https://api.wanapis.com/v1/✅ 正常末尾斜杠没关系https://api.wanapis.com/v1/responses❌404 Not Found: Invalid URL (POST /v1/responses/responses)https://api.wanapis.com❌stream disconnected before completion: stream closed before response.completed第三种好理解Codex 会自己在后面拼/responses你再写一遍就重复了。注意这和 WorkBuddy 这类工具正好相反——它们要你填到/chat/completions的完整路径Codex 只要/v1。第四种是最坑的。少了/v1请求打到了网关的网页前端网关回了一个状态码 200 的 HTML 页面。Codex 等不到它要的流式事件就报「断流」。这条报错网上的文章几乎都让你查梯子、换节点——查一晚上也查不出来因为它根本不是网络问题。不同中转站少写/v1的表现不一定一样有的会直接回 404。但只要是「每次都断、一个字都没回」先查 base_url。3. stream disconnected先分清是配置还是网络每次都断一个字都没回→ 先查上一节的 base_url时好时坏或者只有一台电脑断→ 网络问题我有一台电脑就是后一种屏幕上是这样的Reconnecting... 1/5 Reconnecting... 2/5 Reconnecting... 3/5 Reconnecting... 4/5 Reconnecting... 5/5 stream disconnected before completion: stream closed before response.completedCodex 断流后默认重连 5 次就是这里的 1/5 到 5/5全失败才报错。按这个顺序排查关掉代理或者把中转站的域名加进直连规则换手机热点试一次能用就说明是本地网络的问题对中转站地址分别跑curl -Iv --http1.1和curl -Iv --http2前者正常、后者异常就是 HTTP/2 链路的问题临时关掉 IPv6或者把 DNS 换成223.5.5.5只有推理强度开到 xhigh 的时候断先降到 high 试试。长推理时连接上可能很久没有数据有些代理会把这种「空闲」连接掐掉4. 503 不一定是服务器挂了我遇到过两种完全不同的 503。模型名写错。我故意把gpt-6-astra少写一个短横线warning: Model metadata for gpt-6astra not found. Defaulting to fallback metadata; this can degrade performance and cause issues. ERROR: unexpected status 503 Service Unavailable: 分组 gpt专用 下模型 gpt-6astra 无可用渠道distributor (request id: …)中转站找不到这个模型回的是 503「无可用渠道」而不是 400 或 404。看到前面那条Model metadata … not found的 warning就先查模型名大小写、短横线都要和中转站的模型列表一字不差。中转站过载。这条是我自己的网关报的unexpected status 503 Service Unavailable: system cpu overloaded (current: 98.8%, threshold: 90%)这是网关的过载保护机器 CPU 超过阈值就直接拒绝新请求保护已经在跑的请求。这种情况跟你的配置没关系改什么都没用过一两分钟再试。如果一天出现好几次说明这家站点扛不住现在的量。5. 403 insufficient balance不一定是你没钱unexpected status 403 Forbidden: insufficient balance两种可能你自己的账户余额不足或者中转站的某条上游渠道没钱了它把上游的报错原样转给了你。我遇到的是后者而且有个很反直觉的现象我在后台把另一条渠道调到最高优先级之后已经开着的 Codex 会话还是一直报这个错新开一个会话马上就好了。所以余额明明够的话先新开一个会话再试还不行就把报错的时间和 request id 发给站点。6. 模型选择器里没有 gpt-6-astra只显示「自定义」这个靠一个模型目录文件解决。先把 Codex 自带的模型目录导出来codex debug models --bundled ~/.codex/models.json打开models.json把你的中转站没有的模型整条删掉我这版 0.153.4 导出来 11 个删完剩 8 个然后在config.toml顶部加一行model_catalog_json /Users/你的用户名/.codex/models.json完全退出 Codex 桌面版再打开不是关掉窗口模型选择器里就能看到 gpt-6-astra 了。目录里有了这个模型第 4 节那条Model metadata … not found的 warning 也不会再出现。网上有说法是要先登录一次官方 ChatGPT 账号才能看到自定义模型。我这台机器是用 API key 登录的auth.json 里只有OPENAI_API_KEY没登过 ChatGPT 账号靠的就是这个目录文件。顺带一条用 API key 登录时Codex 日志里会一直刷remote control requires ChatGPT authentication; API key auth is not supported我这 9 天刷了将近 1.6 万行。这只是说桌面版的远程控制功能用不了不影响正常对话不用管。我现在在用的完整配置model_provider custom model gpt-6-astra model_catalog_json /Users/你的用户名/.codex/models.json model_reasoning_effort xhigh # 日常 high 就够更快也更便宜 disable_response_storage true [model_providers.custom] name custom wire_api responses requires_openai_auth true base_url https://api.wanapis.com/v1 # 换成你的中转站地址只写到 /v1配 Codex 之前先用一条 curl 确认中转站这一侧没问题curl https://api.wanapis.com/v1/responses \ -H Authorization: Bearer $OPENAI_API_KEY \ -H Content-Type: application/json \ -d {model:gpt-6-astra,input:hi}返回里有status: completed就说明这家支持 Responses APIkey 和模型名也都对。这一步通了后面再出问题就只可能在 Codex 这一侧排查范围直接砍半。注意 gpt-6-astra 是推理模型回一个 hi 也可能要等上一分钟别以为卡住了。顺带Codex 比你想的费 token我让 Codex 只回一个「ok」它显示tokens used 9,886——系统提示和工具定义每一轮都要带上。我日志里一轮普通对话输入 142,677 token其中 142,080 是缓存命中输出只有 39。按 gpt-6-astra 目前公开的标价输入每百万 $10缓存命中的输入每百万 $1输出每百万 $50算这一轮全按未缓存算约 $1.43按缓存价算约 $0.15差将近 10 倍。所以用 Codex 接中转站比「打几折」更该问清楚的是缓存命中有没有按缓存价计费。