博客

Codex 提示「stream disconnected before completion」:原因和解决办法

一句话答案

stream disconnected before completion 的意思是:Codex 这一轮的响应流,在请求已经被接受之后、模型回复完成之前中断或出错了。它不是某一个具体错误。Codex 会把真正的原因写在冒号后面,看那一段就知道该怎么办:

冒号后面的文字 指向的问题
error sending request for url (...)、os error 10053、os error 10061 你的网络、VPN、代理或防火墙
stream closed before response.completed 回复到一半连接被关了,可能是你和服务器之间的任何一环
idle timeout waiting for SSE 超过空闲超时(默认 5 分钟)没有收到数据
An error occurred while processing your request. ... request ID ... 服务端出错
Rate limit reached for ... / Request too large for ... 每分钟 token 数或每分钟请求数的限制

Codex 会先自己重试,也就是报错前看到的 Reconnecting... 1/5。偶尔出现一次,重新发这一轮就行;每次都出现的话,按冒号后面的文字找原因。

报错长什么样

这条消息定义在 Codex 源码 codex-rs/protocol/src/error.rs 里,格式是 stream disconnected before completion: {原因},用于 HTTP 握手成功之后、response.completed 之前流断开或出错的情况。Codex 把它当作临时错误,会自动重试这一轮。

重试时会显示计数,比如 openai/codex#47538:

text
Reconnecting... 1/5 (stream disconnected before completion: stream closed before response.completed)

重试次数用完后,Codex 可能从 WebSocket 切换到 HTTPS 再试一次(#38366,有删节):

text
⚠ Falling back from WebSockets to HTTPS transport. stream disconnected before completion: Request too large for gpt-5.6-luna in organization org-... on tokens per min (TPM): Limit 200000, Requested 208334. The input or output tokens must be reduced in order to run successfully.

Codex issue 里报告过的其他原因:

text
stream disconnected before completion: error sending request for url (https://chatgpt.com/backend-api/codex/responses)
stream disconnected before completion: IO error: An established connection was aborted by the software in your host machine. (os error 10053)
stream disconnected before completion: No connection could be made because the target machine actively refused it. (os error 10061)
stream disconnected before completion: idle timeout waiting for SSE
stream disconnected before completion: An error occurred while processing your request. You can retry your request, or contact us through our help center at help.openai.com if the error persists. Please include the request ID <id> in your message.

出处:#38212、#54459、#49466、#53578、#53557。

消息里的 URL 也能看出 Codex 用的是哪个接口:ChatGPT 账号登录时是 chatgpt.com/backend-api/codex/...,用 OpenAI API Key 时是 api.openai.com/v1/...,用自定义 provider 时是它的 base_url。

按原因逐个解决

网络:error sending request、os error 10053、os error 10061

Codex 没能把请求发出去,或者连接被你本机关掉了。

  • Windows 上的 os error 10061(连接被拒绝)。 Codex 尝试的地址上没有程序应答。如果 Codex 走的是本地代理,确认代理在运行、监听的端口和 Codex 用的一致,或者删掉让 Codex 走这个代理的设置。
  • Windows 上的 os error 10053。 本机上的某个软件中止了连接:防火墙、杀毒软件、VPN 客户端或代理。暂停它们测一下,再给 Codex 加例外。
  • error sending request for url。 请求发出前就失败了:DNS、代理或网络问题。在同一个终端里确认 URL 里的主机能解析、能连上。

运行 codex doctor 查看 Codex 的运行环境。然后在同一个终端里测一下消息 URL 里的主机,比如 curl -I https://chatgpt.com 或 curl -I https://api.openai.com/v1/models。拿到任何 HTTP 状态码都说明主机能连上;报连接错误说明是网络链路的问题,不是 Codex 的问题。

中途断开:stream closed before response.completed

回复已经开始了,但在最后一个事件到达之前连接被关掉。你和服务器之间的任何一环都可能造成:不稳定的 Wi-Fi、VPN 切换节点、会掐断长连接的代理,或者服务器本身。

  • 偶尔出现:让 Codex 自己重试,或者重新发这一轮。
  • 在某个网络下经常出现:换个网络,或者关掉 VPN、代理测一下。
  • 用了自定义 provider 或网关:去它的日志里查这条请求。中间的网关也可能关掉流。

空闲超时:idle timeout waiting for SSE

流上超过空闲超时没有收到任何事件。长时间推理或连接卡住都可能导致。自定义 provider 的超时是 ~/.codex/config.toml 里该 provider 配置块中的 stream_idle_timeout_ms(默认 300000,即 5 分钟),见 配置参考。

服务端错误:An error occurred while processing your request

流开始之后服务端返回了错误。重试这一轮。如果一直出现,用 /feedback 反馈,并附上消息里的 request ID。

这类报告经常扎堆出现:#45949、#45965、#46161、#46248 都是 2026 年 9 月 16–17 日提交的。在 #45925 里,一位用户在同一台机器、同一个网络下测出,失败率会随登录的 ChatGPT 账号变化。如果你什么都没改、错误突然开始出现,先去 issue 里看看,再决定要不要动本地配置。

限流或请求太大:Rate limit reached / Request too large

这类文字会写明是每分钟 token 数(TPM)还是每分钟请求数(RPM)的限制。

  • Rate limit reached for ... Please try again in 13.694s(#10060)是临时的,等提示的时间就行。
  • Request too large for ... The input or output tokens must be reduced in order to run successfully. 的意思是单个请求就超过了整个每分钟限额,等多久都没用。在 #38366 里,Codex 一直在重发一个 20.8 万 token 的请求,而 TPM 限额是 20 万。开一个新会话,或者运行 /compact 把对话压缩一下。

给自定义 provider 调整重试和超时

Codex 用的是你在 [model_providers.<id>] 下定义的 provider 时,可以在它的配置块里设置下面这些键。默认值来自 配置参考,高级配置 页面有示例:

键 默认值 作用
request_max_retries 4 向 provider 发 HTTP 请求的重试次数
stream_max_retries 5 流中断后的重试次数
stream_idle_timeout_ms 300000 流可以沉默多久,超过就当作连接已断

网络偶尔断连时,多重试几次有帮助;如果原因是请求太大或配置写错了,加重试没有用。

用 TeamoRouter 的 Key 跑 Codex

TeamoRouter 是一个 API 网关,一个 Key 可以调 GPT、Claude、Gemini、DeepSeek。它支持 OpenAI Responses API(/v1/responses),Codex 可以把它当作自定义 provider 接入。没有订阅,按用量付费。

  1. 在 TeamoRouter 控制台 创建 API Key,Key 以 sk-teamo- 开头。
  2. 充值,最低 $5。 充值弹窗支持银行卡;也可以点 「USDT支付」,用 USDT、USDC 或 ETH,从任意交易所 App 转账——收银台会按金额显示可用网络(BEP20 从 $5 起就能用)。步骤见 用 USDT 充值。
  3. 在 ~/.codex/config.toml 里加上 provider,最后两行可选:
toml
model_provider = "teamorouter"
model = "gpt-6-sol"

[model_providers.teamorouter]
name = "TeamoRouter"
base_url = "https://api.teamorouter.com/v1"
env_key = "OPENAI_API_KEY"
wire_api = "responses"
stream_max_retries = 10
stream_idle_timeout_ms = 300000
  1. 在准备运行 Codex 的终端里设置 Key,并测一下链路:
bash
export OPENAI_API_KEY="sk-teamo-..."
curl https://api.teamorouter.com/v1/models \
  -H "Authorization: Bearer $OPENAI_API_KEY"

返回模型列表,说明链路和 Key 都没问题。然后在同一个终端里启动 codex。Windows 的命令见 安装与配置 Codex。

常见问题

「stream disconnected」是网络问题吗? 有时候是。它包着很多种原因,看冒号后面的文字:os error 错误码和 error sending request 是网络问题,Rate limit reached 和 An error occurred while processing your request 就不是。

Codex 会自动重试吗? 会。Reconnecting... N/5 就是 Codex 在重试。重试用完后,它还可能从 WebSocket 退回 HTTPS,再显示错误。

退出登录再登录能解决吗? 网络或限流原因的话不能。只有问题跟着账号走时(像 #45925 报告的那样)才有关系。

为什么在「remote compact task」时也会出现? 压缩也是一次请求,会因为同样的原因失败。像 Error running remote compact task: stream disconnected before completion: ... 这样的消息,原因在第二个冒号后面。

延伸阅读

准备好接入了吗?登录控制台 · 购买额度 · 创建 API Key,三步即可开始。