529 是 Claude 中唯一不是由你的程式造成的錯誤:Anthropic 本身過載了。你無法修正它,但可以妥善吸收。這表示要耐心重試、準備備援模型,絕不能用立即重試放大事件。
錯誤
{
"type": "error",
"error": { "type": "overloaded_error",
"message": "Overloaded" }
}原因與解決方法一覽
| 原因 | 解決方法 |
|---|---|
| 供應商飽和(發布日、區域性事件) | 使用帶抖動的指數退避。請查看供應商的狀態頁面,不要重新部署。 |
| 你的流量高峰在部分事件期間下降了 | 將工作分批分散;等待十分鐘通常就能解決。 |
| 立即在迴圈中重試 | 立刻再次嘗試會增加負載,讓事件對所有人(包括你)持續更久。 |
像個好公民一樣重試
將 529 視為沒有 retry-after 標頭的 429:從約 2 秒開始使用帶抖動的指數退避,上限為 30–60 秒,約重試 5 次後放棄並將工作排入佇列。處理 429 的同一段程式碼也適用於 529。
import time, random
from openai import APIStatusError
def com_retry(fn, tentativas=5):
for i in range(tentativas):
try:
return fn()
except APIStatusError as e:
if e.status_code not in (429, 500, 529):
raise
espera = min(2 ** i + random.random(), 60)
time.sleep(espera)
raise RuntimeError("esgotou as tentativas")切換模型,而不是直接失敗
對延遲敏感的路徑,請設定備援:在同一系列內(Sonnet → Haiku)行為會較為相近;跨供應商(Claude → GPT)則能讓你撐過完整事件。在相容 OpenAI 的端點上,這只需更換一個字串。
PREFERIDOS = ["claude-sonnet-5", "claude-haiku-4-5", "gpt-5-6-terra"]
def completar(mensagens):
ultimo = None
for modelo in PREFERIDOS:
try:
return client.chat.completions.create(
model=modelo, messages=mensagens, max_tokens=800)
except APIStatusError as e:
if e.status_code not in (429, 500, 529):
raise
ultimo = e # saturado — tenta o próximo
raise ultimo不要混淆 529、429 與 402
429 表示你超過了自身限制(伺服器運作正常)。529 表示伺服器過載(你的配額正常)。402 表示餘額不足。三者在日誌中看起來相似,但修正方式完全不同:只有 429 和 529 應該重試。
如果你透過 Kunavo 呼叫
在 Kunavo 中,同一個多模型目錄位於單一金鑰和單一錢包之後,因此上述範例中的跨供應商故障轉移只需更換模型名稱——不需要第二個帳戶或第二次註冊。失敗的請求不會收費。 容量與價格是兩個不同的問題;關於後者,token 費率位於 我們的 Claude API 價格指南.
常見問題
529 錯誤是我的責任嗎?
不是。這是供應商端的容量問題。你唯一的責任是不放大問題(使用帶抖動的退避),並在事件持續時間超過你的延遲預算時,準備好可切換的去處。
529 與 429 有什麼差異?
429 表示你超過了自身限制;529 表示伺服器過載。兩者都可以重試,但通常只有 429 會附帶 retry-after 提示。
發生 529 的請求會收費嗎?
不應該——該請求沒有產生 token。在 Kunavo 中,失敗的請求不會從餘額中扣除。