在 ChatGPT 或 OpenAI API 遇到 upstream connect error or disconnect/reset before headers,問題通常不在你的 prompt,也不是請求內容寫錯,而是 OpenAI 端出了狀況。這段訊息來自 OpenAI 邊緣層使用的 Envoy Proxy,意思是 Envoy 無法從 OpenAI 後端取得可用回應。ChatGPT 網頁版有時會將它標示為 Error Code 111。真正值得看的,是 reset reason: 後面的原因;而 before headers 則表示 Proxy 在收到任何一個回應標頭前就放棄了。因此,這個 503 背後沒有實際的後端回應,只有 Envoy 自己回傳的錯誤訊息。你無法修復 OpenAI 的基礎設施,但接下來該怎麼做,會取決於 reset reason,以及你是在瀏覽器還是程式碼中碰到它。
先確認你是在哪裡遇到錯誤:
- ChatGPT 網頁版/App:先查看 status.openai.com,接著重新載入頁面或開啟新工作階段。
- 程式碼中的 OpenAI API:查看 reset reason、保留 request ID,然後套用重試策略。
這個錯誤到底在說什麼
Envoy 位在你與 OpenAI 後端之間。請求送達後,Envoy 會先與後端建立連線、轉送請求,再等待回應標頭。如果連線建立失敗、被重設、逾時,或在任何標頭返回前碰上容量限制,Envoy 就會回傳這段訊息,HTTP 狀態通常是 503,有時也會是 502。你可能在 ChatGPT 的服務異常畫面、openai.InternalServerError 堆疊追蹤,或 Agent 日誌中看到它。
錯誤字樣可能略有不同。例如 retried and the latest reset reason 代表 Envoy 已經重試過,而這是最後一次嘗試失敗的原因。無論措辭如何,核心訊息都一樣:OpenAI 的 Proxy 無法從自己的後端取得回應,不是你的 prompt 或 request body 有問題。
如何判讀 reset reason
reset reason 能告訴你 OpenAI Proxy 碰到了什麼狀況,也能幫你判斷重試是否有意義。
| reset reason | OpenAI Proxy 遇到的狀況 | 你可以怎麼做 |
|---|---|---|
connection timeout | 後端未能及時接受連線,回應過慢 | 採用退避重試,並查看狀態頁 |
overflow | 碰到容量或速率限制,後端負載過高 | 降低並發量、退避等待後再重試 |
connection failure / remote connection failure | 後端無法連線,或拒絕接受連線 | 重試;若持續發生,查看狀態頁並回報 |
connection termination / connection reset | 後端在請求進行中關閉連線 | 重試;通常與服務事件同時發生 |
protocol error | OpenAI 端的通訊協定問題 | 重試;若持續發生,附上 request ID 回報 |
從 OpenAI 社群回報來看,最常見的是 overflow 與 connection timeout,這也符合後端在突發負載下碰到容量瓶頸的情況。這些問題都不是調整本機設定就能解決;真正有效的做法是查看服務狀態、採取退避策略,以及準備容錯路徑。
ChatGPT 網頁版或 App 出現 Error Code 111 時
第一步先看 status.openai.com。若已有公告中的服務事件,主要解法就是等待服務恢復;不過,若只有你的帳號持續出錯,仍值得聯絡客服回報。若狀態頁一切正常,可以重新整理頁面、開啟新分頁,或登出後再登入,因為過期的工作階段可能仍握著已失效的連線。切換網路、停用 VPN 或公司 Proxy,只有在這一層確實重設連線時才有幫助;可以先排除,但別因此直接認定問題不在 OpenAI。
程式碼呼叫 OpenAI API 時怎麼處理
這類錯誤通常是間歇性、且與負載有關。openai-python issue tracker 上有開發者回報,在每小時發出數百個請求時,約有 5% 的呼叫出現 openai.InternalServerError: upstream connect error or disconnect/reset before headers,其餘 95% 則成功。這種部分失敗率往往指向後端飽和;大量批次工作,例如批量 embeddings 或大型文件匯入,因為會拉高並發量,更容易觸發。多數情況下,解法是重試策略而非修改 payload;但在高負載下,控制並發與將批次工作排隊同樣重要。
升級回報前,先蒐集足以證明問題在供應商端的資訊:時間戳記、endpoint 與 model、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)
# retry connection drops and 5xx (incl. this 503); never blindly retry 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 回應內容,因為連線會先中斷。對失效 endpoint 執行 curl -v,可能在顯示 Request completely sent off 後收到 curl: (52) Empty reply from server:請求確實送出了,但沒有任何內容返回。若由 Envoy 回傳完整錯誤,則會得到 503,body 中包含 upstream connect error... 文字。公開回報也與此一致:OpenAI subreddit 有使用者貼出完全相同的 retried and the latest reset reason: connection timeout 字串,並同時顯示 "Network connection lost";而 openai-python tracker 在高請求量情境下,也記錄了同樣訊息作為 InternalServerError。
什麼時候該改走其他路徑
由於失敗的環節發生在 OpenAI gateway 與後端之間,針對單一 endpoint,你能做的基本上就是重試與退避。另一個選項是加入冗餘機制:透過能在某個上游逾時或 overflow 時切換至其他後端的服務層進行路由。多供應商 gateway,例如 OpenRouter 與 AIReiter,會整合多家模型供應商,並繞開回應緩慢的服務商;這正是 OpenRouter 所採用的多供應商路由模式。如此一來,單一上游變慢時,系統可能改為重新路由,而非直接將 503 回傳給你。代價也很明確:多了一層轉送、需要依賴路由服務本身的可用性,還要評估價格、資料處理方式與可觀測性差異。不過,它確實能降低單一供應商不穩定所帶來的風險。
常見問題
ChatGPT Error Code 111 是什麼?
部分 ChatGPT 使用者會看到這段訊息,旁邊帶有「Error Code 111」標示。它表示 OpenAI Proxy 無法從後端取得回應,屬於伺服器端問題。請先查看 status.openai.com,再重新載入頁面。
為什麼只有高負載或隨機情況下才會發生?
與負載相關的失敗,通常代表 overflow,也就是容量或速率限制,或者後端飽和導致建立連線時間超過逾時門檻。這些情況通常只會在並發量升高時出現,因此同一套程式碼大部分時間仍能正常運作。
VPN 或防火牆會造成這個錯誤嗎?
只有在 VPN 或防火牆這一層重設了你與 OpenAI 之間的連線時才可能是原因。切換網路值得用來排除問題,但它無法修復真正的 OpenAI 服務故障或 API 端 503。
這和 429 速率限制錯誤一樣嗎?
不一樣。429 是你已經收到的明確速率限制回應;這個 503 則表示根本沒有取得可用回應。遇到 429 請遵守 Retry-After;遇到 503 則採取退避並重試。
「retried and the latest reset reason」代表什麼?
這表示 Envoy 已經重試過該請求,而後面的原因說明最後一次嘗試為何失敗。它指向的是 OpenAI 端持續存在的後端問題,而不是一次性的短暫波動。