DEV Community

Cover image for اختفاء نموذج الذكاء الاصطناعي المفاجئ: تصميم تجاوز الفشل لواجهات API AI
Yusuf Khalidd
Yusuf Khalidd

Posted on • Originally published at apidog.com

اختفاء نموذج الذكاء الاصطناعي المفاجئ: تصميم تجاوز الفشل لواجهات API AI

في 12 يونيو 2026، أجبرت ضوابط التصدير الأمريكية شركة أنثروبيك على إيقاف Claude Fable 5 عن العمل دون سابق إنذار تقريبًا، وبقي النموذج معطلاً حتى عاد في 1 يوليو. الفرق التي كانت تعتمد على معرف نموذج واحد قضت تسعة عشر يومًا في الإصلاح؛ أما الفرق التي امتلكت سلسلة تجاوز أعطال فغيّرت قيمة في التكوين وعادت للعمل.

جرّب Apidog اليوم

الدرس ليس متعلقًا بانقطاع واحد فقط. معظم تطبيقات LLM تتعامل مع توفر النموذج كأنه ثابت، وهذا افتراض معماري خاطئ. النموذج منتج له تعرض قانوني، وحدود سعة، وجدول إهمال، وفريق سلامة يمكنه سحبه. الهدف من هذا الدليل: بناء تجاوز أعطال عملي لواجهات برمجة تطبيقات الذكاء الاصطناعي بحيث يكون الانقطاع التالي تغيير تكوين، لا جسر حوادث.

لماذا تختفي النماذج

النماذج قد تختفي أو تصبح غير صالحة للاستخدام لأسباب متعددة:

  • التنظيم. تعليق Fable 5 جاء من ضوابط تصدير، لا من عطل تقني. هذه الأحداث لا تتبع جداول إهمال ولا تمنحك إشعارًا مبكرًا. هذا مثال على كيف بدا الانقطاع من الخارج.
  • حوادث المزودين. كل مزود كبير معرض لانقطاعات متعددة الساعات. اتفاقية مستوى الخدمة مع عملائك لا تنتظر تعافي المزود.
  • الإهمال. المزودون يسحبون النماذج وفق جداول منشورة. OpenAI تحتفظ بـصفحة إهمال، وAnthropic أوقفت إصدارات Claude الأقدم بالطريقة نفسها.
  • السعة. أثناء الإطلاقات أو ذروة الاستخدام، قد ترى أخطاء 429 أو 529 حتى لو كان النموذج “متاحًا”.
  • التراجعات الأمنية. قد يحظر المزود نموذجًا أو يسحبه بعد اكتشاف مشكلة سلامة، أحيانًا لحسابات أو مناطق محددة فقط.

مهما اختلف السبب، العرض واحد: معرف النموذج الذي يعتمد عليه تطبيقك يتوقف عن الاستجابة كما تتوقع. لذلك يجب أن يكون تجاوز الأعطال جزءًا من التصميم، لا رد فعل أثناء الحادث.

هرم تجاوز الأعطال

تجاوز الأعطال ليس مسارًا واحدًا. صممه على ثلاثة مستويات.

المستوى الأول: نموذج بديل من نفس المزود

مثال:

Fable 5 → Opus 4.8 → Sonnet 4.6
Enter fullscreen mode Exit fullscreen mode

هذا أرخص مسار لأنك تستخدم نفس SDK، ونفس المصادقة، وشكل استجابة قريب. Anthropic تدعم هذا جزئيًا من جهة الخادم عبر معامل الاسترجاع، حيث يعاد تنفيذ الطلب المرفوض على نموذج بديل داخل نفس استدعاء API.

قبل الاعتماد على هذا المسار، اختبر الفروقات بين النماذج. مثلًا: مقارنة Fable 5 بـ Opus 4.8.

المستوى الثاني: مزود مختلف

هذا يحميك من انقطاع كامل للمزود، أو تعليق حساب، أو قيود إقليمية. لكنه يضيف:

  • SDK أو عميل HTTP جديد
  • مفاتيح وفوترة منفصلة
  • اختلافات في التنسيق والسلوك
  • اختلافات في الرفض، الأدوات، والـ tokenization

المستوى الثالث: وضع متدهور

قدّم قيمة محدودة بدون نموذج رائد:

  • إجابات مخزنة للاستعلامات المتكررة
  • نموذج محلي صغير للتصنيف
  • محرك قواعد للمهام البسيطة
  • تعطيل الميزة برسالة واضحة

تدهور الميزة مقبول. توقف التطبيق بالكامل ليس كذلك.

المستوى وقت التبديل انخفاض الجودة تكلفة الهندسة
نفس المزود ثوانٍ إلى دقائق؛ تغيير تكوين أو إعادة محاولة تلقائية صغير إلى معتدل منخفضة
مزود مختلف دقائق إلى ساعات؛ يحتاج توجيهًا ومطالبات مختبرة معتدل متوسطة إلى عالية
وضع متدهور فوري بعد بنائه كبير لكن قابل للتوقع متوسطة

ابدأ بالمستوى الأول، وابنِ المستوى الثالث كحد أدنى. أضف المستوى الثاني عندما تبرر الإيرادات المعرضة للخطر تكلفة التكامل الثاني.

حدد قواعد التبديل

لا يكفي أن تعرف إلى أين ستنتقل. يجب أن تحدد متى تنتقل.

قواعد عملية كبداية:

  • 404 model_not_found: تجاوز أعطال فوري.
  • refusal: أعد المحاولة مرة واحدة على النموذج التالي.
  • 429: طبّق backoff قبل التبديل.
  • ثلاث مهلات متتالية: افتح circuit breaker لهذا النموذج.
  • أخطاء 5xx متكررة: حوّل نسبة من الحركة إلى النموذج التالي.

ضع هذه القواعد في طبقة توجيه واحدة، حتى لا يتخذ المطورون قرارات مختلفة في أجزاء مختلفة من الكود.

خطوات تصميم تجعل تجاوز الأعطال رخيصًا

1. ضع معرفات النماذج في التكوين

إذا كان معرف النموذج موجودًا داخل كود التطبيق، فأنت تحتاج إلى نشر جديد لتجاوز الأعطال. اجعله في ملف تكوين واحد:

# config/model-routes.yaml
routes:
  chat-assist:
    primary: claude-fable-5
    fallbacks:
      - claude-opus-4-8
      - claude-sonnet-4-6
    degraded_mode: cached_answers
    max_output_tokens: 8192
    timeout_seconds: 120

  ticket-classifier:
    primary: claude-sonnet-4-6
    fallbacks:
      - claude-haiku-4-5
    degraded_mode: rules_engine
Enter fullscreen mode Exit fullscreen mode

2. اجعل التوجيه في طبقة واحدة

كل جزء من التطبيق يجب أن يطلب “إكمالًا” أو “تصنيفًا”، لا أن يختار النموذج بنفسه.

مثال مبسط:

MODEL_CHAIN = [
    "claude-fable-5",
    "claude-opus-4-8",
    "claude-sonnet-4-6",
]

def complete(prompt: str) -> str:
    last_error = None

    for model in MODEL_CHAIN:
        try:
            response = client.messages.create(
                model=model,
                max_tokens=8192,
                messages=[
                    {"role": "user", "content": prompt}
                ],
            )

            if response.stop_reason == "refusal":
                last_error = RefusalError(model)
                continue

            return response.content[0].text

        except (
            anthropic.NotFoundError,
            anthropic.RateLimitError,
            anthropic.APIStatusError,
        ) as err:
            last_error = err
            continue

    raise AllModelsUnavailable(MODEL_CHAIN) from last_error
Enter fullscreen mode Exit fullscreen mode

في الإنتاج، أضف:

  • مهلات لكل نموذج
  • circuit breakers
  • logging لكل محاولة
  • metrics حسب النموذج
  • سبب التبديل
  • حد أقصى لعدد المحاولات

3. اكتب مطالبات قابلة للنقل

لا تجعل المطالبة تعتمد على خصوصيات نموذج واحد.

استخدم طبقتين:

  1. مطالبة أساسية تعمل عبر كل النماذج في السلسلة.
  2. تراكبات خاصة بالنموذج يمكن حذفها بدون كسر المهمة.

مثال:

prompts:
  ticket-summary:
    base: |
      لخّص تذكرة الدعم التالية في 3 نقاط:
      - المشكلة
      - التأثير
      - الخطوة التالية

      أعد النتيجة بصيغة JSON صالحة فقط.

    overlays:
      claude-fable-5: |
        استخدم تفكيرًا موجزًا داخليًا قبل الإجابة.
      claude-sonnet-4-6: |
        التزم بالمخطط حرفيًا ولا تضف نصًا خارج JSON.
Enter fullscreen mode Exit fullscreen mode

اختبر المطالبة الأساسية على أضعف نموذج بديل، لا على أقوى نموذج أساسي فقط.

4. خزّن معلمات الطلب لكل نموذج

ليست كل النماذج تقبل المعلمات نفسها. معامل صالح على النموذج الأساسي قد يسبب خطأ 400 على البديل.

ضع المعلمات بجانب معرفات النماذج:

models:
  claude-fable-5:
    max_output_tokens: 8192
    temperature: 0.2
    timeout_seconds: 120

  claude-opus-4-8:
    max_output_tokens: 8192
    temperature: 0.2
    timeout_seconds: 120

  claude-sonnet-4-6:
    max_output_tokens: 4096
    temperature: 0.1
    timeout_seconds: 90
Enter fullscreen mode Exit fullscreen mode

طبقة التوجيه يجب أن تختار المعلمات المناسبة وقت الإرسال.

5. طبّع الاستجابات داخليًا

لا تدع كود التطبيق يعتمد على كائنات استجابة خاصة بالمزود. حوّل كل استجابة إلى شكل داخلي.

مثال:

@dataclass
class ModelResult:
    text: str
    model: str
    provider: str
    stop_reason: str
    usage_input_tokens: int
    usage_output_tokens: int
Enter fullscreen mode Exit fullscreen mode

ثم اجعل التطبيق يتعامل مع ModelResult فقط.

6. راقب التكلفة والحدود

النموذج البديل قد يختلف في:

  • السعر لكل token
  • نافذة السياق
  • حد الإخراج
  • معدل الطلبات
  • latency

راجع دائمًا نظرة عامة على النماذج الحالية بدل الاعتماد على أرقام محفوظة. اجعل max_output_tokens وسلوك الاقتطاع جزءًا من التكوين حتى لا تحصل على إجابات مبتورة أو فاتورة مفاجئة.

اختبار العقود عبر سلسلة التجاوز

مسار التجاوز الذي لا تختبره هو المسار الذي سيفشل أثناء الانقطاع.

تعامل مع سلسلة النماذج كعقد API. النمط العملي: احتفظ بسيناريو اختبار واحد في Apidog يشغّل المطالبات الحيوية على كل نموذج في السلسلة، في CI وبجدول زمني.

لكل نموذج، تحقق من:

1. المخطط

تأكد أن الاستجابة:

  • قابلة للتحليل
  • تحتوي على الحقول المطلوبة
  • تطابق JSON Schema
  • لا تضيف نصًا خارج التنسيق المتوقع

مثال JSON Schema مختصر:

{
  "type": "object",
  "required": ["summary", "impact", "next_action"],
  "properties": {
    "summary": { "type": "string" },
    "impact": { "type": "string" },
    "next_action": { "type": "string" }
  }
}
Enter fullscreen mode Exit fullscreen mode

2. وقت الاستجابة

راقب p95 لكل نموذج. نموذج بديل يعمل لكنه يستغرق 40 ثانية قد يكون انقطاعًا عمليًا للمستخدم.

3. إشارات الجودة

استخدم فحوصات آلية رخيصة:

  • الإخراج غير فارغ
  • اللغة صحيحة
  • العناصر المطلوبة موجودة
  • معدل الرفض قريب من خط الأساس
  • JSON صالح
  • عدد الرموز ضمن الحدود

أنت لا تقيّم البلاغة في CI. أنت تلتقط الانحرافات التي تكسر المنتج.

إعداد Apidog لاختبار النماذج

استخدم بيئة Apidog لكل نموذج أو مزود. كل بيئة تحتوي على:

  • عنوان endpoint
  • مفتاح API
  • معرف النموذج
  • حدود الإخراج
  • أي headers خاصة بالمزود

ثم شغّل السيناريو نفسه ضد:

claude-fable-5
claude-opus-4-8
claude-sonnet-4-6
Enter fullscreen mode Exit fullscreen mode

إضافة نموذج رابع تعني إضافة بيئة جديدة، لا كتابة اختبارات جديدة.

اختر 10 إلى 20 مطالبة تمثل الإنتاج:

  • أطول سياق ترسله
  • أدق JSON تحلله
  • حالة edge كسرت parser سابقًا
  • مطالبة قريبة من حدود السلامة في مجالك
  • أمثلة من أعلى 5 مسارات استخدام

وعندما يفاجئك الإنتاج، أضف الحالة الجديدة إلى مجموعة الاختبار.

أثناء انقطاع المزود، يمكنك أيضًا توجيه بيئة إلى mock server يعيد استجابات مسجلة. بهذه الطريقة يستمر CI في اختبار كل شيء أسفل طبقة النموذج. يمكن لـ Apidog توليد هذا mock من نفس API spec التي تستخدمها اختباراتك.

الاستعداد التشغيلي

الهندسة تمنحك القدرة على التبديل. العمليات تمنحك القدرة على اتخاذ القرار بسرعة.

اختبر كل نموذج، لا الأساسي فقط

شغّل synthetic prompt مجدولة ضد كل نموذج في السلسلة. صفحات الحالة مثل status.anthropic.com مفيدة، لكنها تصف عالم المزود، لا حسابك أو منطقتك أو حدودك.

نبّه على أخطاء النموذج لا HTTP فقط

راقب:

  • ارتفاع الرفض
  • model_not_found
  • 429
  • 529
  • timeout
  • زيادة latency
  • انخفاض جودة JSON
  • زيادة retries

اكتب runbook قبل الانقطاع

يجب أن يجيب الدليل عن:

  • من يقرر التبديل؟
  • أي قيمة تكوين تتغير؟
  • كيف نرجع؟
  • من يبلغ الدعم والعملاء؟
  • أي dashboards نراقب؟
  • ما مدة المراقبة بعد التبديل؟

نظّم العودة

عندما يعود النموذج الأساسي، لا تعِد 100% من الحركة فورًا.

نفّذ Canary:

  1. شغّل مجموعة اختبارات العقود.
  2. أرسل 1% من الحركة.
  3. قارن الرفض والجودة وال latency.
  4. ارفع إلى 10%.
  5. ثم 25%، 50%، 100%.

نمط العودة نفسه موضح في كيفية العودة إلى واجهة برمجة تطبيقات Fable 5، ويمكن تطبيقه على أي نموذج أساسي.

تدرب ربع سنويًا

مرة كل ربع سنة، نفّذ تجاوز أعطال مقصودًا في staging، أو على شريحة صغيرة من production إذا كان ذلك مقبولًا.

هذا يكشف:

  • API key منتهي الصلاحية
  • بيئة غير مهيأة
  • لوحة مراقبة مفقودة
  • قيمة تكوين تغير اسمها
  • مطالبة لا تعمل على النموذج البديل

اكتشاف هذه المشاكل في يوم هادئ أرخص بكثير من اكتشافها أثناء انقطاع.

ما الذي تعلمه حلقة Fable 5 تحديدًا

عودة Fable 5 في 1 يوليو تضمنت تفصيلًا مهمًا: أنثروبيك أعادت نشر Fable 5 مع مصنف أمان أعيد تدريبه.

نفس معرف النموذج. نفس سطح API. لكن ليس بالضرورة السلوك نفسه.

هذا يعني أن:

  • حدود الرفض قد تتحرك
  • مطالبات كانت تمر قد تفشل
  • رفض سابق قد لا يحدث
  • توزيع النتائج قد يتغير

القاعدة العملية:

أعد الاختبار عند العودة. لا تعِد التمكين مباشرة.

عامل أي نموذج عائد من تعليق أو تراجع أو إهمال طويل كإصدار جديد. شغّل مجموعة العقود الكاملة، وقارن بالخط الأساسي قبل الانقطاع، ثم استخدم Canary.

هناك درس آخر: تسعة عشر يومًا كافية ليصبح النموذج البديل هو خط الأساس الفعلي. المستخدمون يتكيفون، والفرق تضبط المطالبات، والعودة تصبح تغييرًا في المنتج، لا مجرد تبديل تقني.

الأسئلة الشائعة

هل تكفي سلسلة تجاوز أعطال من نفس المزود؟

ابدأ بها. تغطي الإهمال، حوادث السعة، التراجعات الأمنية، وتعليق نموذج محدد بتكلفة هندسية منخفضة. أضف مزودًا ثانيًا عندما يكون انقطاع المزود الكامل أو حدث على مستوى الحساب أغلى من تكلفة الحفاظ على تكامل ثانٍ. ابنِ الوضع المتدهور في كل الأحوال.

هل سيلاحظ المستخدمون الانتقال إلى نموذج أصغر؟

يعتمد على المهمة. في الاستخراج والتصنيف، قد يكون النموذج الأصغر جيدًا إذا كانت المطالبة واضحة. في الاستدلال الطويل، ستظهر الفجوات. استخدم قياساتك، وابدأ بمقارنات مثل Fable 5 مقابل Opus 4.8.

كم مرة يجب اختبار مسار التجاوز؟

  • يوميًا بجدول زمني
  • في CI عند تغيير المطالبات
  • في CI عند تغيير التوجيه
  • بعد أي إعلان من المزود يؤثر على السلسلة

تكلفة تشغيل أهم 20 مطالبة ضد ثلاثة نماذج أقل بكثير من اكتشاف أن مسار التجاوز معطل أثناء الانقطاع.


توفر النماذج سيصبح أقل قابلية للتوقع: تنظيم أشد، إهمال أسرع، وسعة تتأرجح مع كل إطلاق. الفرق التي ستنجو من لحظة Fable 5 التالية هي التي تتعامل مع النموذج كمكوّن قابل للاستبدال، لا كجزء دائم.

ابدأ بملف تكوين، وغلاف توجيه، ومجموعة اختبارات عقود تعمل كل ليلة. قم بتنزيل Apidog واربط سلسلة تجاوز الأعطال الخاصة بك باختبار مجدول اليوم؛ الانقطاع التالي مسألة وقت.

Top comments (0)