LLM Fallback Routing: إزاي تنجو من سحب نماذج الـ AI عام (2026)
١٧ يونيو ٢٠٢٦
ملخص. في 12 يونيو 2026، أمرت وزارة التجارة الأمريكية شركة Anthropic بتعليق الوصول إلى Claude Fable 5 و Mythos 5، وقامت Anthropic بتعطيل كلا النموذجين لـ كل عميل للامتثال للقرار.12 التطبيقات المرتبطة بنموذج واحد بدأت في إرجاع أخطاء خلال دقائق؛ أما التطبيقات التي تستخدم توجيه احتياطي متعدد المزودين فقد استمرت في العمل. يوضح هذا الدليل كيفية بناء طبقة الاحتياط (fallback) هذه في TypeScript — واجهة مزود موحدة، وسلسلة احتياط تلقائية، وقاطع دائرة (circuit breaker)، وقاعدة لاختيار نموذج احتياطي متوافق حتى لا تنهار الجودة بصمت عند التحويل. الوقت الإجمالي: ~30 دقيقة.
إن سلسلة احتياط LLM هي طبقة توجيه تعيد محاولة الطلب مع المزود التالي في قائمة مرتبة كلما أرجع المزود الأساسي فشلاً قابلاً لإعادة المحاولة — مثل حد معدل الطلبات 429، أو خطأ 5xx، أو مهلة زمنية، أو خطأ model-not-found / إلغاء الوصول.3 حتى هذا الشهر، كانت معظم الفرق تتعامل مع حالة "اختفاء النموذج" كحالة مستحيلة. ولكن استدعاء Fable 5 جعلها أمراً واقعاً.
ما ستتعلمه
- لماذا أصبح دمج LLM من مزود واحد يمثل خطراً تنظيمياً على التوفر، وليس مجرد خطر تقني.
- كيفية تحديد واجهة طلب/استجابة موحدة عبر Anthropic و OpenAI و Google ونموذج مفتوح الأوزان.
- كيفية بناء سلسلة احتياط تلقائية تعمل عند حدود المعدل، وأخطاء الخادم، والمهلات الزمنية، وأخطاء إلغاء الوصول.
- كيفية إضافة قاطع دائرة (circuit breaker) حتى يتوقف المزود المتوقف عن استهلاك وقت الاستجابة في كل طلب.
- كيفية اختيار نموذج احتياطي متوافق حتى لا يؤدي التحويل إلى تدهور جودة المخرجات بصمت.
- متى تتوقف عن البرمجة اليدوية وتستخدم بوابة مثل LiteLLM بدلاً من ذلك.
ماذا حدث بالفعل لـ Fable 5
أطلقت Anthropic نموذج Claude Fable 5 — نموذجها العام من فئة Mythos — في 9 يونيو 2026.4 وبعد ثلاثة أيام، في 12 يونيو، أصدرت وزارة التجارة الأمريكية توجيهاً للرقابة على الصادرات مستشهدة بسلطات الأمن القومي. أمر القرار بتعليق الوصول إلى Fable 5 و Mythos 5 لـ أي مواطن أجنبي، سواء داخل الولايات المتحدة أو خارجها.2 وبدلاً من بناء نظام لفلترة المستخدمين حسب الجنسية بين عشية وضحاها، قامت Anthropic بتعطيل كلا النموذجين تماماً لجميع العملاء أثناء عملها على الامتثال.1 كان الدافع، حسب التوجيه، هو الوعي بطريقة لـ "كسر حماية" (jailbreaking) النماذج؛ وصفت Anthropic علناً التقنية بأنها محدودة، ومعروفة بالفعل، وموجودة في النماذج المنافسة أيضاً، ووصفت الموقف بأنه سوء فهم كانت "تعمل على استعادة الوصول" منه.56
الحقائق التشغيلية التي تهم معماريتك هي: لم يكن هناك إشعار مسبق، ولا تاريخ محدد للاستعادة، ولا احتياطي تلقائي يحافظ على الجودة من جانب Anthropic — الجلسات التي كانت تتوجه إلى Fable 5 بدأت في إرجاع أخطاء أو التحول بصمت إلى نماذج أقدم.7 ظل Claude Opus 4.8 وبقية تشكيلة Anthropic متاحة عبر الإنترنت،5 ولكن إذا كان الكود الخاص بك يحتوي على سلسلة نصية ثابتة لنموذج Fable 5، فإن عبارة "بقية التشكيلة بخير" لم تكن لتساعدك.
هذا هو الجزء الذي يستحق الاستيعاب: توفر النموذج لم يعد ثابتاً يمكنك افتراضه. إنه متغير خطر يمكن أن يتغير بتوجيه حكومي، وليس فقط من خلال لوحة معلومات الأعطال. كانت Anthropic قد أمضت الربيع بالفعل في نزاع قضائي مع البنتاغون، الذي صنفها كـ "خطر على سلسلة التوريد" في أوائل مارس 2026 — وهي أول شركة أمريكية تحصل على تصنيف كان مخصصاً تاريخياً للخصوم الأجانب — ورفعت Anthropic دعوى قضائية في محكمتين فيدراليتين في 9 مارس.89 إن المشهد التنظيمي حول النماذج الرائدة حي ومحتدم. خطط له بالطريقة التي تخطط بها لتعطل منطقة سحابية كاملة.
لماذا أصبح المزود الواحد الآن نقطة فشل واحدة
كانت الحجة الكلاسيكية لاختيار نموذج واحد والالتزام به هي البساطة: SDK واحد، مجموعة واحدة من أكواد الخطأ، وعلاقة فوترة واحدة. استدعاء Fable 5 يعيد تسعير تلك البساطة. دمج مزود واحد الآن يركز ثلاثة أنماط فشل مستقلة في تبعية واحدة:
الإخفاقات اليومية لم تذهب إلى أي مكان — حدود المعدل تحت الضغط، ومشاكل 5xx أثناء حادثة لدى المزود نفسه، والمهلات الزمنية في عمليات التوليد الطويلة.3 بالإضافة إلى ذلك، أنت تحمل الآن مخاطر السياسات: يمكن سحب نموذج بتوجيه دون إشعار. وتحمل مخاطر القدرات: حتى عندما يكون النموذج موجوداً، يمكن للمزود إعادة توجيهك بهدوء إلى نموذج أضعف، مما يغير جودة مخرجاتك دون تغيير الكود الخاص بك.7
تعالج سلسلة الاحتياط الثلاثة بنفس الآلية. الهدف ليس مطاردة توفر بنسبة 99.999% لأي نموذج واحد — بل جعل منتجك ينجو من فقدان أي نموذج واحد.
الخطوة 1: توحيد واجهة المزود
كل API لمزود لديه شكل طلب وشكل استجابة وتنسيق خطأ مختلف قليلاً، لذا فإن المهمة الأولى هي إخفاء هذه الاختلافات خلف واجهة واحدة.10 حدد عقداً أدنى: استقبال الرسائل بالإضافة إلى حد أقصى للرموز (tokens)، وإرجاع النص بالإضافة إلى النموذج الذي خدم الطلب فعلياً.
// llm/types.ts
export interface ChatMessage {
role: "system" | "user" | "assistant";
content: string;
}
export interface CompletionResult {
text: string;
servedBy: string; // which provider:model actually answered
}
// A provider knows how to call exactly one model and
// how to classify its own failures.
export interface LLMProvider {
id: string; // e.g. "anthropic:claude-opus-4-8"
complete(messages: ChatMessage[], maxTokens: number): Promise<CompletionResult>;
}
// Errors we are willing to fail OVER on. Anything else
// (e.g. a 400 for a malformed request) should NOT trigger
// fallback — it will fail identically on every provider.
export class RetryableProviderError extends Error {
constructor(public providerId: string, public cause: string) {
super(`${providerId} failed (retryable): ${cause}`);
}
}
التمييز في RetryableProviderError هو ما يتجاهله الناس ويندمون عليه. التحويل عند خطأ 400 Bad Request يستهلك المال فقط عبر الاتصال بأربعة مزودين على التوالي للحصول على نفس الرفض. قم بالتحويل فقط في حالات الأخطاء العابرة أو أخطاء التوفر؛ واترك أخطاء العميل الحقيقية تظهر فوراً.
الخطوة 2: كتابة مزودين ملموسين
إليك مزود Anthropic ومزود OpenAI مقابل واجهات HTTP API الخاصة بهما. العمل الأساسي يكمن في catch: ربط أكواد الحالة إما بـ RetryableProviderError (للتحويل) أو إعادة رمي الخطأ (للاستسلام). أكواد الحالة التي تستحق التحويل هي 429 (حد المعدل)، و 5xx (خطأ في الخادم)، و — الجديد في نموذج تهديد 2026 — 403/404 على نموذج كان موجوداً، وهو ما يبدو عليه إلغاء الوصول من جانب العميل.3
LLMProvider، فإن الموجه (router) الذي يستدعيهما لا يحتاج إلى معرفة أيهما يستخدم. يمتد نفس النمط إلى مزود Google Gemini أو — والأهم من ذلك — نموذج مفتوح الأوزان تستضيفه بنفسك، والذي لا يمكن لأي توجيه استدعاؤه.
الخطوة 3: سلسلة الاحتياط مع قاطع الدائرة (Circuit Breaker)
الآن الموجه. إنه يمر عبر قائمة مرتبة من المزودين، ويعيد أول نجاح، وينتقل فقط عند حدوث RetryableProviderError. لتجنب انتظار المهلة الكاملة لمزود متوقف بالفعل، يحصل كل مزود على قاطع دائرة: بعد حد تجاوز من الإخفاقات المتتالية، يتم تخطيه لفترة تهدئة، ثم يُمنح طلبًا تجريبيًا واحدًا لمعرفة ما إذا كان قد تعافى.11
// llm/router.ts
import { ChatMessage, CompletionResult, LLMProvider, RetryableProviderError } from "./types";
interface BreakerState {
failures: number;
openedAt: number | null; // timestamp when the breaker tripped
}
export class FallbackRouter {
private breakers = new Map<string, BreakerState>();
constructor(
private providers: LLMProvider[], // ordered: most-preferred first
private threshold = 3, // consecutive failures before opening
private cooldownMs = 30_000, // how long to skip an open provider
) {}
private isOpen(id: string): boolean {
const b = this.breakers.get(id);
if (!b || b.openedAt === null) return false;
if (Date.now() - b.openedAt >= this.cooldownMs) {
b.openedAt = null; // half-open: allow one trial request
return false;
}
return true;
}
private recordFailure(id: string) {
const b = this.breakers.get(id) ?? { failures: 0, openedAt: null };
b.failures += 1;
if (b.failures >= this.threshold) b.openedAt = Date.now();
this.breakers.set(id, b);
}
private recordSuccess(id: string) {
this.breakers.set(id, { failures: 0, openedAt: null });
}
async complete(messages: ChatMessage[], maxTokens: number): Promise<CompletionResult> {
const errors: string[] = [];
for (const provider of this.providers) {
if (this.isOpen(provider.id)) {
errors.push(`${provider.id}: circuit open`);
continue;
}
try {
const result = await provider.complete(messages, maxTokens);
this.recordSuccess(provider.id);
return result;
} catch (e) {
if (e instanceof RetryableProviderError) {
this.recordFailure(provider.id);
errors.push(e.message);
continue; // try the next provider
}
throw e; // hard error → don't waste the rest of the chain
}
}
throw new Error(`All providers exhausted:\n${errors.join("\n")}`);
}
}
ربط المكونات يبدو كقائمة أولويات — وأصبح model recall الآن مجرد إدخال آخر يقوم بتشغيل قاطع الدائرة وينتقل لما بعده:
// llm/index.ts
import { AnthropicProvider } from "./anthropic";
import { OpenAIProvider } from "./openai";
import { FallbackRouter } from "./router";
export const router = new FallbackRouter([
new AnthropicProvider("claude-opus-4-8"), // primary
new OpenAIProvider("gpt-5.5"), // cross-vendor backup
new AnthropicProvider("claude-sonnet-4-6"), // cheaper same-vendor backup
// new SelfHostedProvider("kimi-k2.7-code"), // un-recallable last resort
]);
const answer = await router.complete(
[{ role: "user", content: "Summarize this changelog in three bullets." }],
1024,
);
console.log(answer.servedBy, answer.text);
قم بتسجيل servedBy في كل استجابة. اليوم الذي يتم فيه سحب نموذجك الأساسي، سيكون هذا الحقل هو الفرق بين "لاحظنا ذلك في Grafana" و"لاحظ العميل ذلك بدلاً منا".
الخطوة 4: اختر نسخة احتياطية متوافقة، وليس أي نسخة احتياطية
سلسلة الاحتياط التي تستبدل نموذج استدلال متطور بآخر أضعف بكثير تبقيك متصلاً بينما تجعل أداءك أسوأ بهدوء — فخ الانحراف الصامت.12 الحل هو اختيار نسخ احتياطية تكون قدراتها وسلوكها قريبة بما يكفي بحيث يكون الفشل في الانتقال تدهورًا قبلته، وليس مفاجأة. إليك كيف تصطف الخيارات الواقعية لمنتصف عام 2026 لأعباء عمل البرمجة/الوكلاء.
| المزود:النموذج | التوفر | خطر الاستدعاء | ملاحظات للاحتياط |
|---|---|---|---|
| Claude Opus 4.8 | API، متوفر عام | نفس مزود Fable 5 | 5 دولار/25 دولار لكل مليون توكن قياسي؛ سياق 1 مليون، لا توجد رسوم إضافية للسياق الطويل13 |
| GPT-5.5 | API منذ 24 أبريل 2026 | مزود مختلف | عزل حقيقي بين المزودين؛ السلوك يختلف، لذا اختبر الأوامر (prompts) في كليهما14 |
| Gemini 3.1 Pro | API (نسخة تجريبية) | مزود مختلف | متعدد الوسائط قوي؛ تعرض لولاية قضائية منفصلة15 |
| Kimi K2.7 Code (استضافة ذاتية) | أوزان مفتوحة، MIT معدل | لا يوجد — أنت تملك الأوزان | MoE بـ 1 تريليون معلمة، سياق 256 ألف؛ يخدم عبر vLLM/SGLang؛ حوالي 600 جيجابايت حتى عند INT4، لذا يتطلب أجهزة حقيقية1617 |
هناك قاعدتان تظهران من هذا الجدول. أولاً، يجب أن تكون حلقة واحدة على الأقل في سلسلتك من مزود مختلف — النسخة الاحتياطية من نفس المزود تشترك في نفس السياسة والتعرض القانوني الذي أدى لتوقف نموذجك الأساسي. ثانياً، لأعباء العمل ذات المخاطر الأعلى، فإن الاحتياطي الوحيد الذي يتمتع بخطر استدعاء صفر هو نموذج تمتلك أوزانه: نموذج مفتوح الأوزان مثل Kimi K2.7 Code يمكن خدمته محلياً عبر vLLM أو SGLang ولا يمكن سحبه بتوجيه من أي شخص.16 هذا الاستقلال هو السبب في أن "تشغيل النماذج المحلية" تحول من مجرد نقطة نقاش حول سيادة البيانات إلى بند في قائمة المشتريات في الأسبوع الذي توقف فيه Fable 5.7 العائق صريح: نموذج MoE بـ 1 تريليون معلمة يحتاج إلى حوالي 600 جيجابايت حتى مع التكميم (quantization) إلى INT4، لذا بالنسبة لمعظم الفرق، فإن الطبقة مفتوحة الأوزان هي ملاذ أخير متعمد، وليست الخيار الافتراضي.17
متى تتوقف عن البرمجة اليدوية وتستخدم بوابة (Gateway)
الموجه أعلاه يتكون من بضع مئات من الأسطر ويستحق الفهم قبل الاستعانة بمصادر خارجية. ولكن بمجرد أن تحتاج إلى ميزانيات لكل فريق، وإدارة المفاتيح، وتتبع التكاليف، والاحتياطيات عبر عشرات النماذج، قم بتوحيد كل ذلك خلف بوابة بدلاً من تمريره عبر كل خدمة. LiteLLM Proxy هو الخيار الافتراضي مفتوح المصدر — بوابة مرخصة بـ MIT، تُستضاف ذاتياً وتواجه أكثر من 100 واجهة برمجة تطبيقات للمزودين خلف نقطة نهاية واحدة متوافقة مع OpenAI مع توجيه احتياطي مدمج، ومفاتيح افتراضية، وميزانيات.18 لدينا شرح كامل للإنتاج في دروس LiteLLM Proxy للإنتاج، ونفس قائمة الاحتياط التي رأيتها أعلاه تترجم مباشرة إلى تكوين model_list الخاص به. تمنحك البوابة أيضاً شيئاً إضافياً لا تستطيع النسخة المبرمجة يدوياً فعله: مكان واحد لتغيير ترتيب التوجيه أثناء وقوع حادث، دون إعادة نشر كل خدمة تتحدث إلى LLM.
الخلاصة
حوّل سحب Fable 5 الخطر المجرد إلى حادثة مؤرخة: في 12 يونيو 2026، اختفى نموذج رائد لكل العملاء دون سابق إنذار وبدون تاريخ استعادة.12 لا يمكنك منع ذلك. ولكن يمكنك جعل منتجك غير مبالٍ به. واجهة مزود موحدة، وسلسلة بديلة تعمل عند حدوث أخطاء في التوفر، وقاطع دائرة (circuit breaker) حتى تتوقف المزودات المتوقفة عن استهلاك وقت الاستجابة لديك، ونسخة احتياطية واحدة على الأقل عبر الموردين — ويفضل أن تكون قابلة للاستضافة الذاتية — تحول جملة "تم سحب نموذجنا" من انقطاع في الخدمة إلى مجرد سطر في سجل الأحداث (log line). ابنِ النسخة اليدوية لفهمها، ثم ضع بوابة (gateway) أمامها عندما تتوسع العمليات. التوفر الآن أصبح متغيراً. صمم معماريتك بناءً على ذلك.
Footnotes
-
CNBC, "Anthropic disables access to Fable 5 and Mythos 5 to comply with government directive" (June 12, 2026). https://www.cnbc.com/2026/06/12/anthropic-disables-access-to-fable-5-and-mythos-5-to-comply-with-government-directive.html ↩ ↩2 ↩3
-
Bloomberg, "Anthropic Says US Orders Halt to Foreign Access for Fable 5, Mythos 5 AI Models" (June 13, 2026). https://www.bloomberg.com/news/articles/2026-06-13/anthropic-says-us-limits-foreign-access-to-fable-5-mythos-5 ↩ ↩2 ↩3 ↩4
-
Portkey, "Failover routing strategies for LLMs in production." https://portkey.ai/blog/failover-routing-strategies-for-llms-in-production/ ↩ ↩2 ↩3 ↩4
-
Anthropic, "Claude Fable 5 and Claude Mythos 5." https://www.anthropic.com/news/claude-fable-5-mythos-5 ↩
-
Anthropic, "Statement on the US government directive to suspend access to Fable 5 and Mythos 5." https://www.anthropic.com/news/fable-mythos-access ↩ ↩2
-
VentureBeat, "Anthropic blocks all public access to Claude Fable 5, Mythos 5 following US government order — what enterprises should do" (June 13, 2026). https://venturebeat.com/technology/anthropic-blocks-all-public-access-to-claude-fable-5-mythos-5-following-us-government-order-what-enterprises-should-do ↩
-
Cosmic, "Fable 5 and Mythos 5 are gone: a developer action plan" (June 14, 2026). https://www.cosmicjs.com/blog/fable-5-mythos-5-suspended-developer-action-plan ↩ ↩2 ↩3 ↩4
-
NPR, "Anthropic sues the Trump administration over 'supply chain risk' label" (March 9, 2026). https://www.npr.org/2026/03/09/nx-s1-5742548 ↩ ↩2
-
Pearl Cohen, "Anthropic Sues Department of Defense Over Supply Chain Risk Designation." https://www.pearlcohen.com/anthropic-sues-department-of-defense-over-supply-chain-risk-designation/ ↩
-
Statsig, "Provider fallbacks: ensuring LLM availability." https://www.statsig.com/perspectives/providerfallbacksllmavailability ↩
-
Portkey، "عمليات إعادة المحاولة، والبدائل، وقواطع الدائرة في تطبيقات LLM: ماذا تستخدم ومتى." https://portkey.ai/blog/retries-fallbacks-and-circuit-breakers-in-llm-apps/ ↩
-
OpenDirective، "مرونة LLM متعددة المزودين: تجاوز الفشل، والكوتا، والانحراف." https://opendirective.net/multi-provider-llm-resilience-failover-quotas-and-drift ↩ ↩2
-
Finout، "تسعير Claude Opus 4.8 لعام 2026" (قياسي 5 دولار/25 دولار لكل مليون توكن مدخلات/مخرجات؛ سياق 1 مليون بدون رسوم إضافية للسياق الطويل). https://www.finout.io/blog/claude-opus-4.8-pricing-2026-everything-you-need-to-know ↩
-
TechCrunch، "OpenAI تطلق GPT-5.5، مما يقرب الشركة خطوة واحدة من 'تطبيق فائق' للذكاء الاصطناعي" (23 أبريل 2026؛ GPT-5.5 و GPT-5.5 Pro متاحان في API اعتباراً من 24 أبريل 2026). https://techcrunch.com/2026/04/23/openai-chatgpt-gpt-5-5-ai-model-superapp/ ↩
-
NxCode، "دليل Gemini 3.1 Pro الكامل لعام 2026: المعايير، التسعير، API" (تم إصداره في 19 فبراير 2026؛ متاح عبر Gemini API، لا يزال في مرحلة المعاينة، مع الإعلان عن Gemini 3.5 Pro الأحدث في Google I/O في 19 مايو 2026 والمستهدف للإطلاق العام في يونيو). https://www.nxcode.io/resources/news/gemini-3-1-pro-complete-guide-benchmarks-pricing-API-2026 ↩
-
Codersera، "Kimi K2.7 Code: الدليل الكامل — المعايير، التسعير وكيفية الاستخدام (2026)" (تم إصداره في 12 يونيو 2026 بواسطة Moonshot AI؛ أوزان مفتوحة، Modified MIT؛ إجمالي 1 تريليون بارامتر، 32 مليار نشط، سياق 256 ألف؛ يتم تقديمه عبر vLLM/SGLang). https://codersera.com/blog/kimi-k2-7-complete-guide-2026/ ↩ ↩2 ↩3
-
Spheron، "نشر Kimi K2.7 Code على سحابة GPU: استضافة ذاتية لنموذج البرمجة الوكيل من Moonshot بـ 1 تريليون بارامتر (2026)" (أوزان INT4 بحجم ~630 جيجابايت؛ مستودع Hugging Face بحجم ~595 جيجابايت على القرص). https://www.spheron.network/blog/deploy-kimi-k2-7-code-gpu-cloud/ ↩ ↩2 ↩3
-
LiteLLM، بوابة LLM مستضافة ذاتياً بترخيص MIT تعرض أكثر من 100 واجهة برمجة تطبيقات للمزودين خلف نقطة نهاية متوافقة مع OpenAI مع توجيه بديل، ومفاتيح افتراضية، وميزانيات. https://GitHub.com/BerriAI/litellm ↩