如果你在 ChatGPT 上或从 OpenAI API 看到 upstream connect error or disconnect/reset before headers,这属于 OpenAI 端的问题。该消息来自 Envoy,也就是 OpenAI 边缘的代理,它表示 Envoy 无法从 OpenAI 的后端获取到可用的响应。在 ChatGPT 网站上,这通常标记为 *Error Code 111*。reset reason: 后面的内容才是实际诊断结果,而 before headers 表示代理在收到任何响应头之前就放弃了——因此这个 503 后面并没有真正的响应,只有 Envoy 自身的返回。你无法修复 OpenAI 的基础设施,但接下来该怎么做取决于 reset reason,以及你是在浏览器中遇到它还是在代码中遇到它。
你走的是哪条路径:
- ChatGPT 网页/应用:查看 status.openai.com,然后重新加载或开始一个新会话。
- 代码中的 OpenAI API:读取重置原因,记录请求 ID,然后应用 重试策略。
该错误的真正含义
Envoy 位于您和 OpenAI 的后端之间。当您的请求到达时,Envoy 会连接到后端,转发请求,并等待响应头。如果在任何头返回之前,该连接失败、重置、超时,或触发容量限制,Envoy 就会返回此消息,并附带 HTTP 503(有时是 502)。它会出现在 ChatGPT 故障页面、openai.InternalServerError 堆栈跟踪以及代理日志中。
措辞各不相同:retried and the latest reset reason 这句话的意思是,Envoy 已经重试过,而这次是最后一次尝试失败。无论哪种情况,都是 OpenAI 的代理在报告其自身后端没有响应——这不是你的 prompt 或请求体的问题。
解码重置原因
重置原因会告诉你 OpenAI 的代理遇到了什么问题,因此也能判断是否值得重试。
| 重置原因 | OpenAI 的代理命中情况 | 你可以做什么 |
|---|---|---|
connection timeout | 后端响应太慢,未能及时接受连接 | 使用退避重试;检查状态 |
overflow | 已达到容量或速率限制(后端过载) | 降低并发,退避后重试 |
connection failure / remote connection failure | 后端不可达或拒绝了连接 | 重试;如果持续发生,请检查状态并报告 |
connection termination / connection reset | 后端在请求过程中途关闭了连接 | 重试;通常与某次事故时间一致 |
protocol error | OpenAI 端的协议问题 | 重试;如果持续存在,请附上你的请求 ID 报告 |
overflow 和 connection timeout 是 OpenAI 社区报告中最常出现的两个问题,这与后端在突发负载下达到容量上限的情况相符。你机器上的任何东西都无法修复这些问题——有用的应对方式是查看状态、退避重试和故障切换。
在 ChatGPT 网站或应用中(错误代码 111)
首先查看 status.openai.com。如果已发布故障公告,等待通常是主要解决办法,不过持续存在的账户特定故障值得向支持团队报告。如果状态显示正常,重新加载页面、打开新标签页,或退出后重新登录——过期的会话可能会维持一个失效连接。切换网络,或禁用 VPN 或公司代理,只在该层正在重置连接时才有帮助,所以在假定是 OpenAI 之前先尝试一下。
来自代码中的 OpenAI API
这里的错误是间歇性且与负载相关的。openai-python 问题追踪器上的一位开发者报告称,在每小时发起数百次请求时,大约有 5% 的调用失败,错误为 openai.InternalServerError: upstream connect error or disconnect/reset before headers——其余 95% 则成功。像这样的部分失败率表明后端已接近饱和,而批量任务较多的作业(大规模 embeddings、大型文档摄取)会更频繁地遇到它,因为它们会提高并发度。通常的修复方式是重试策略,而不是修改负载内容,不过在高负载下,控制并发和对批量作业进行排队同样重要。
在你升级处理之前,请先收集足够的信息来证明问题出在提供方一侧:时间戳、端点和模型、HTTP 状态和响应体、x-request-id、你的 SDK 版本、进行中的请求数,以及故障是否与已发布的事件时间相吻合。然后应用一个在生产环境中经得起考验的重试策略:
import random, time
from openai import OpenAI, APIStatusError, APIConnectionError
client = OpenAI()
def with_retry(fn, max_attempts=5, cap=30.0):
for attempt in range(max_attempts):
try:
return fn()
except (APIConnectionError, APIStatusError) as e:
status = getattr(e, "status_code", None)
# 重试连接中断和 5xx(包括这个 503);绝不盲目重试 4xx
if isinstance(e, APIStatusError) and status and status < 500 and status != 429:
raise
if attempt == max_attempts - 1:
raise
retry_after = float(getattr(e, "response", None).headers.get("retry-after", 0)) if getattr(e, "response", None) else 0
backoff = retry_after or min(cap, 0.5 * 2 ** attempt) * (0.5 + random.random())
time.sleep(backoff)
OpenAI SDK 已经会自动重试临时性错误(max_retries,默认 2),因此要有意识地进行设置——例如在包装调用之前设置 OpenAI(max_retries=0)——否则你的层和 SDK 自身的重试会叠加。限制总尝试次数(3–5 次)和整体并发量,以免重试放大导致 overflow 的突发流量。对 429 按其 Retry-After 处理;只有在操作可以安全重复时才重试 408/409。对于非幂等或流式调用要格外小心——盲目重试可能会重复工作,或重新播放一个已读取了一半的流。
从客户端看起来是什么样子
你通常甚至看不到 Envoy 的 503 响应体——连接会先断开。对一个已失效的端点执行 curl -v,在 Request completely sent off 之后会返回 curl: (52) Empty reply from server:请求已经发出,却没有任何响应。Envoy 自己对这个错误的版本是一个 503,并将 upstream connect error... 文本作为响应体。公开报告也与此一致:在 OpenAI subreddit 上,有用户发布了完全相同的 retried and the latest reset reason: connection timeout 字符串,并附带“Network connection lost,”;而 openai-python 跟踪器在高请求量下也将同样的消息记录为 InternalServerError。
何时绕过它
因为失败的跳点位于 OpenAI 的 gateway 与其后端之间,所以针对单一 endpoint,你能做的只有重试和退避。另一个手段是冗余:通过一层在上游超时或溢出时切换到不同后端的路由层。像 OpenRouter 和 AIReiter 这样的多提供商 gateway 位于多个 model provider 之前,并绕开变慢的 provider;这与 OpenRouter 所基于的同一种 multi-provider routing model 一致,因此单个上游变慢可能会变成重新路由,而不是直接暴露为 503。这样的取舍是真实存在的——增加了一跳、依赖路由器自身的 uptime,以及需要权衡定价、数据处理和可观测性的差异——但它降低了对任何单一 provider 不稳定性的暴露。
常见问题
什么是 ChatGPT 错误代码 111?
一些 ChatGPT 用户报告在看到“错误代码 111”标签时也会看到这条消息。这意味着 OpenAI 的代理无法从其后端获取响应——这是一个服务器端问题。请查看 status.openai.com 并重新加载。
为什么我只会在负载下或随机情况下看到它?
与负载相关的故障通常意味着 overflow(容量或速率限制)或后端饱和导致连接时间超过超时。两者都只会在并发上升时出现,这也是为什么同样的代码大多数时候都能正常工作。
VPN 或防火墙会导致它吗?
只有在该层是重置你和 OpenAI 之间连接的原因时才适用。值得通过切换网络来排除这种可能性,但这无法修复真正的 OpenAI 故障或 API 侧的 503 错误。
这和 429 限流错误是一样的吗?
不是。429 是你收到的明确速率限制响应。这个 503 表示根本没有返回可用的响应。对于 429,请遵守 Retry-After;对于 503,请退避后重试。
“retried and the latest reset reason” 是什么意思?
Envoy 已经重试了该请求,这就是最终一次尝试失败的原因。这表明问题源自 OpenAI 端持续存在的后端故障,而不是一次性的短暂异常。
