上游连接错误?真正的问题其实是这个

最后更新: 2026-07-20 07:03:00

如果你在 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,然后应用 重试策略
Diagram showing the client, Envoy proxy, and upstream service, with the error emitted at the Envoy hop about the upstream connection

该错误的真正含义

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 errorOpenAI 端的协议问题重试;如果持续存在,请附上你的请求 ID 报告

overflowconnection 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,你能做的只有重试和退避。另一个手段是冗余:通过一层在上游超时或溢出时切换到不同后端的路由层。像 OpenRouterAIReiter 这样的多提供商 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 端持续存在的后端故障,而不是一次性的短暂异常。