ماذا يقول لك الخطأ 529
كل رمز حالة آخر في جدول Anthropic يشير إلى شيء تتحكم فيه أنت: 401 يعني مفتاحاً خاطئاً، و400 يعني جسم طلب مشوّهاً، و429 يعني أن حسابك بلغ حداً. أما 529 فمختلف: يُطلَق حين ترتفع الحركة على كل المستخدمين في وقت واحد، وهذا ما يجعله خطأ Claude الوحيد الذي يخص الجميع لا أنت. والرسالة حرفية: "The API is temporarily overloaded." صباحات الإطلاق هي المشهد الكلاسيكي. ينزل نموذج جديد، فيجرّبه نصف القطاع قبل الغداء، فتتخلص المنصة من الحمل لتبقى واقفة.
وثمة تمييز واحد يوفّر وقت تصحيح حقيقياً. تحذّر وثائق Anthropic، في موضع منفصل، من أن الزيادات الحادة في استخدامك أنت قد تُطلق أخطاء 429 من حدود التسارع، حتى والمنصة هادئة وسقف فئتك بعيد عن الأنظار. فطوفان الأخطاء أثناء إطلاقك الكبير ليس بالضرورة قصة 529. تحقق من حقل النوع: إن كان rate_limit_error، فالمشكلة في تصاعدك أنت، والحل في صفحة الخطأ 429 بدلاً من هنا: انمُ تدريجياً، وأبقِ أنماط الاستخدام ثابتة.
جسم الرد
{
"type": "error",
"error": {
"type": "overloaded_error",
"message": "The API is temporarily overloaded."
},
"request_id": "req_011CSHoEeqs5C35K2UUqR7Fy"
}
ثلاث عادات تستحق أن تربطها في كودك وأنت هنا. فرّع بناءً على حقل type، وفي كود الـ SDK التقط أصناف الاستثناء المعنونة (بايثون يرفع أشياء مثل anthropic.RateLimitError) بدل مطابقة نص الرسائل. احفظ request_id، وهو يصل أيضاً في كل رد كترويسة مسبوقة بـ req_؛ وتذاكر الدعم التي تتضمنه تُحَل أسرع. وإن كنت تستخدم البث، فتذكّر أنه مع الأحداث المُرسَلة من الخادم قد يصل خطأ بعد وصول رمز 200، فسطر حالة نظيف ليس نهاية القصة.
أعد المحاولة كمواطن صالح
الخطأ 529 هو المنصة تطلب مساحة لتلتقط أنفاسها، وينبغي لحلقة إعادة المحاولة أن تمنحها ذلك بالتصميم: تشتيت عشوائي حتى لا يسير أسطولك في صف واحد، ومهلة بساعة الحائط بدل عدّاد محاولات مجرّد، ودائرة تنفتح بمجرد انقضاء المهلة.
# Python: إعادة محاولة متشتتة تحت مهلة، ثم قطع الدائرة
import random, time
import anthropic
client = anthropic.Anthropic()
def create_with_deadline(deadline_s=120, **kwargs):
start = time.monotonic()
attempt = 0
while time.monotonic() - start < deadline_s:
try:
return client.messages.create(**kwargs)
except anthropic.APIStatusError as e:
if e.status_code not in (429, 529):
raise
attempt += 1
time.sleep(min(30, 2 ** attempt) * random.random())
raise RuntimeError("circuit open: still overloaded at deadline")
حين تنفتح الدائرة، توقف عن الاستدعاء. اركن العمل الجديد في طابور، وقدّم النتائج المخزّنة حيث توجد، ولا تجسّ النبض مجدداً إلا بعد فترة تهدئة. عواصف إعادة المحاولة هي الطريقة الوحيدة التي تستطيع بها أن تجعل 529 أسوأ: آلاف العملاء يعيدون تشغيل الطلبات على مؤقّتات متزامنة يحوّلون موجة حركة إلى ظهيرة طويلة.
صمّم للساعة السيئة
الفرق تصنعه الفرق التي لا تكترث لأخطاء 529 قبل الساعة السيئة، لا أثناءها. ثلاث خطوات تغطي معظم الأمر. ضع طابوراً بسقف تزامن بين منتجك وبين API، حتى يتراكم الضغط في بنيتك أنت لا في بنيتهم. وجّه كل ما يحتمل الانتظار إلى Batch API، الذي يعمل بخصم 50% على تسعير Claude القياسي ويحوّل موجة المنصة إلى لا حدث للمهام بالدفعات. وإن كان زمن التشغيل تعاقدياً، أبقِ مزوّداً ثانياً دافئاً: اختر البديل من التصنيفات مسبقاً، وسعّر التبديل بـالحاسبة، وضعه خلف مفتاح تقلبه دون غرفة طوارئ.