التراجع الاحتياطي للنموذج
يتعامل OpenClaw مع حالات الفشل على مرحلتين:- تدوير ملف تعريف المصادقة داخل الموفّر الحالي.
- التراجع الاحتياطي للنموذج إلى النموذج التالي في
agents.defaults.model.fallbacks.
تدفق وقت التشغيل
بالنسبة إلى تشغيل نصي عادي، يقيّم OpenClaw المرشحين بهذا الترتيب:- نموذج الجلسة المحدد حاليًا.
- عناصر
agents.defaults.model.fallbacksالمهيأة بالترتيب. - النموذج الأساسي المهيأ في النهاية عندما يكون التشغيل قد بدأ من تجاوز.
- حل نموذج الجلسة النشط وتفضيل ملف تعريف المصادقة.
- بناء سلسلة مرشحي النماذج.
- تجربة الموفّر الحالي باستخدام قواعد تدوير/تهدئة ملفات تعريف المصادقة.
- إذا استُنفد هذا الموفّر مع خطأ يستحق التراجع الاحتياطي، فانتقل إلى مرشح النموذج التالي.
- حفظ تجاوز التراجع الاحتياطي المحدد قبل بدء إعادة المحاولة حتى يرى قراء الجلسة الآخرون الموفّر/النموذج نفسيهما اللذين يوشك المشغّل على استخدامهما.
- إذا فشل مرشح التراجع الاحتياطي، فارجع فقط حقول تجاوز الجلسة المملوكة للتراجع الاحتياطي عندما لا تزال تطابق ذلك المرشح الفاشل.
- إذا فشل كل المرشحين، فارفع
FallbackSummaryErrorمع تفاصيل لكل محاولة وأقرب وقت لانتهاء التهدئة عندما يكون معروفًا.
providerOverridemodelOverrideauthProfileOverrideauthProfileOverrideSourceauthProfileOverrideCompactionCount
/model اليدوية أو تحديثات تدوير الجلسة التي
حدثت أثناء تشغيل المحاولة.
تخزين المصادقة (المفاتيح + OAuth)
يستخدم OpenClaw ملفات تعريف المصادقة لكل من مفاتيح API ورموز OAuth المميزة.- تُخزَّن الأسرار في
~/.openclaw/agents/<agentId>/agent/auth-profiles.json(القديم:~/.openclaw/agent/auth-profiles.json). - الإعداد
auth.profiles/auth.orderهو للبيانات الوصفية + التوجيه فقط (من دون أسرار). - ملف OAuth القديم المخصص للاستيراد فقط:
~/.openclaw/credentials/oauth.json(يُستورد إلىauth-profiles.jsonعند أول استخدام).
type: "api_key"←{ provider, key }type: "oauth"←{ provider, access, refresh, expires, email? }(+projectId/enterpriseUrlلبعض الموفّرين)
معرّفات ملفات التعريف
تنشئ عمليات تسجيل الدخول عبر OAuth ملفات تعريف مميزة بحيث يمكن لعدة حسابات أن تتعايش.- الافتراضي:
provider:defaultعندما لا يتوفر بريد إلكتروني. - OAuth مع بريد إلكتروني:
provider:<email>(على سبيل المثالgoogle-antigravity:user@gmail.com).
~/.openclaw/agents/<agentId>/agent/auth-profiles.json تحت profiles.
ترتيب التدوير
عندما يكون لدى موفّر ما عدة ملفات تعريف، يختار OpenClaw ترتيبًا كهذا:- إعداد صريح:
auth.order[provider](إن كان مضبوطًا). - ملفات تعريف مهيأة:
auth.profilesبعد تصفيتها حسب الموفّر. - ملفات تعريف مخزنة: الإدخالات في
auth-profiles.jsonلذلك الموفّر.
- المفتاح الأساسي: نوع ملف التعريف (OAuth قبل مفاتيح API).
- المفتاح الثانوي:
usageStats.lastUsed(الأقدم أولًا، داخل كل نوع). - ملفات التعريف في حالة التهدئة/المعطلة تُنقل إلى النهاية، مرتبة حسب أقرب وقت انتهاء.
ثبات الجلسة (ملائم للذاكرة المؤقتة)
يقوم OpenClaw بتثبيت ملف تعريف المصادقة المختار لكل جلسة للحفاظ على دفء ذاكرات التخزين المؤقت لدى الموفّر. وهو لا يدوّر في كل طلب. ويُعاد استخدام ملف التعريف المثبّت حتى:- تتم إعادة تعيين الجلسة (
/new//reset) - تكتمل عملية ضغط (ويزيد عداد الضغط)
- يصبح ملف التعريف في حالة تهدئة/تعطيل
/model …@<profileId> إلى ضبط تجاوز من المستخدم لتلك الجلسة
ولا يتم تدويره تلقائيًا حتى تبدأ جلسة جديدة.
تُعامل ملفات التعريف المثبتة تلقائيًا (المختارة بواسطة موجه الجلسة) على أنها تفضيل:
تُجرَّب أولًا، لكن يمكن لـ OpenClaw أن يدوّر إلى ملف تعريف آخر عند حدود المعدل/المهلات.
أما ملفات التعريف المثبتة من المستخدم فتبقى مقفلة على ذلك الملف؛ وإذا فشل وكان تراجعات النماذج
مهيأة، ينتقل OpenClaw إلى النموذج التالي بدلًا من تبديل ملفات التعريف.
لماذا قد يبدو OAuth “مفقودًا”
إذا كان لديك ملف تعريف OAuth وملف تعريف مفتاح API للموفّر نفسه، فقد يؤدي round-robin إلى التبديل بينهما عبر الرسائل ما لم يتم تثبيت أحدهما. لفرض ملف تعريف واحد:- ثبّته باستخدام
auth.order[provider] = ["provider:profileId"]، أو - استخدم تجاوزًا لكل جلسة عبر
/model …مع تجاوز لملف التعريف (عندما يكون مدعومًا من واجهة المستخدم/سطح الدردشة لديك).
فترات التهدئة
عندما يفشل ملف تعريف بسبب أخطاء مصادقة/حد معدل (أو مهلة تبدو كأنها حد معدل)، يضعه OpenClaw في حالة تهدئة وينتقل إلى ملف التعريف التالي. وتكون حزمة حدود المعدل تلك أوسع من مجرد429: فهي تتضمن أيضًا رسائل الموفّر
مثل Too many concurrent requests وThrottlingException و
concurrency limit reached وworkers_ai ... quota limit exceeded،
وthrottled وresource exhausted، وحدود نوافذ الاستخدام الدورية مثل
weekly/monthly limit reached.
وتُعامَل أخطاء التنسيق/الطلب غير الصالح (على سبيل المثال فشل التحقق من
معرّف استدعاء الأداة في Cloud Code Assist) على أنها تستحق التراجع الاحتياطي وتستخدم
فترات التهدئة نفسها.
وتُصنَّف أخطاء سبب التوقف المتوافقة مع OpenAI مثل Unhandled stop reason: error،
وstop reason: error، وreason: error على أنها إشارات مهلة/تراجع احتياطي.
ويمكن أيضًا أن تقع نصوص الخادم العامة ذات النطاق الخاص بالموفّر في حزمة المهلات تلك عندما
يطابق المصدر نمطًا عابرًا معروفًا. على سبيل المثال، يُعامَل النص العاري في Anthropic
An unknown error occurred وحمولات JSON من نوع api_error التي تتضمن نص خادم عابرًا
مثل internal server error أو unknown error, 520 أو upstream error،
أو backend error على أنها مهلات تستحق التراجع الاحتياطي. كما يُعامَل نص المصدر العام
الخاص بـ OpenRouter مثل Provider returned error على أنه
مهلة فقط عندما يكون سياق الموفّر هو OpenRouter فعلًا. أما النص الاحتياطي الداخلي العام مثل
LLM request failed with an unknown error. فيبقى محافظًا
ولا يشغّل التراجع الاحتياطي بمفرده.
يمكن أيضًا أن تكون فترات تهدئة حدود المعدل ضمن نطاق النموذج:
- يسجل OpenClaw القيمة
cooldownModelلإخفاقات حدود المعدل عندما يكون معرّف النموذج الفاشل معروفًا. - يمكن الاستمرار في تجربة نموذج شقيق على الموفّر نفسه عندما تكون التهدئة ضمن نطاق نموذج مختلف.
- لكن فترات التعطيل الخاصة بالفوترة/التعطيل ما زالت تحظر ملف التعريف كله عبر جميع النماذج.
- دقيقة واحدة
- 5 دقائق
- 25 دقيقة
- ساعة واحدة (الحد الأقصى)
auth-profiles.json تحت usageStats:
تعطيل الفوترة
تُعامَل إخفاقات الفوترة/الرصيد (مثل “insufficient credits” / “credit balance too low”) على أنها تستحق التراجع الاحتياطي، لكنها عادةً ليست عابرة. وبدلًا من تهدئة قصيرة، يضع OpenClaw ملف التعريف في حالة تعطيل (مع تراجع أطول) ويدوّر إلى ملف التعريف/الموفّر التالي. ليست كل الاستجابات التي تشبه الفوترة هي402، وليس كل HTTP 402 ينتمي
إلى هذا المسار. يحتفظ OpenClaw بنصوص الفوترة الصريحة ضمن مسار الفوترة حتى عندما
يعيد الموفّر 401 أو 403 بدلًا منها، لكن المطابقات الخاصة بالموفّر تبقى
ضمن نطاق الموفّر الذي يملكها (مثلًا OpenRouter 403 Key limit exceeded). وفي الوقت نفسه، تُصنَّف أخطاء 402 المؤقتة الخاصة بنوافذ الاستخدام و
حدود إنفاق المؤسسة/مساحة العمل على أنها rate_limit عندما
تبدو الرسالة قابلة لإعادة المحاولة (مثل weekly usage limit exhausted أو daily limit reached, resets tomorrow أو organization spending limit exceeded).
وتبقى هذه الأخطاء في مسار التهدئة القصيرة/التراجع الاحتياطي بدلًا من مسار
تعطيل الفوترة الطويل.
تُخزَّن الحالة في auth-profiles.json:
- يبدأ تراجع الفوترة عند 5 ساعات، ويتضاعف مع كل إخفاق فوترة، ويبلغ حدًا أقصى مقداره 24 ساعة.
- تُعاد تعيين عدادات التراجع إذا لم يفشل ملف التعريف لمدة 24 ساعة (قابلة للتهيئة).
- تسمح إعادات المحاولة لحالات التحميل الزائد بتدوير واحد لملف تعريف من الموفّر نفسه قبل التراجع الاحتياطي للنموذج.
- تستخدم إعادات المحاولة لحالات التحميل الزائد قيمة تراجع قدرها 0 ms افتراضيًا.
التراجع الاحتياطي للنموذج
إذا فشلت كل ملفات التعريف الخاصة بموفّر ما، ينتقل OpenClaw إلى النموذج التالي فيagents.defaults.model.fallbacks. وينطبق ذلك على إخفاقات المصادقة، وحدود المعدل،
والمهلات التي استنفدت تدوير ملفات التعريف (أما الأخطاء الأخرى فلا تقدم التراجع الاحتياطي).
يتم التعامل مع أخطاء التحميل الزائد وحدود المعدل بشكل أكثر شراسة من
فترات تهدئة الفوترة. افتراضيًا، يسمح OpenClaw بمحاولة واحدة أخرى لملف تعريف مصادقة
من الموفّر نفسه، ثم ينتقل إلى التراجع الاحتياطي التالي المهيأ للنموذج من دون انتظار.
وتقع إشارات انشغال الموفّر مثل ModelNotReadyException ضمن
حزمة التحميل الزائد تلك. ويمكنك ضبط ذلك باستخدام auth.cooldowns.overloadedProfileRotations،
وauth.cooldowns.overloadedBackoffMs، و
auth.cooldowns.rateLimitedProfileRotations.
عندما يبدأ التشغيل بتجاوز نموذج (hooks أو CLI)، تظل التراجعات الاحتياطية تنتهي عند
agents.defaults.model.primary بعد تجربة أي تراجعات مهيأة.
قواعد سلسلة المرشحين
يبني OpenClaw قائمة المرشحين منprovider/model
المطلوب حاليًا بالإضافة إلى التراجعات الاحتياطية المهيأة.
القواعد:
- يكون النموذج المطلوب دائمًا أولًا.
- تُزال التكرارات من التراجعات الاحتياطية الصريحة المهيأة لكنها لا تُصفى بواسطة قائمة سماح النموذج. فهي تُعامل على أنها نية صريحة من المشغّل.
- إذا كان التشغيل الحالي بالفعل على تراجع احتياطي مهيأ ضمن عائلة الموفّر نفسها، يواصل OpenClaw استخدام السلسلة المهيأة الكاملة.
- إذا كان التشغيل الحالي على موفّر مختلف عن التهيئة وكان ذلك النموذج الحالي ليس جزءًا بالفعل من سلسلة التراجعات الاحتياطية المهيأة، فلا يضيف OpenClaw تراجعات احتياطية غير مرتبطة من موفّر آخر.
- عندما يكون التشغيل قد بدأ من تجاوز، يُلحَق النموذج الأساسي المهيأ في النهاية حتى تتمكن السلسلة من الاستقرار مجددًا على القيمة الافتراضية العادية بعد استنفاد المرشحين الأسبق.
ما الأخطاء التي تدفع التراجع الاحتياطي
يستمر التراجع الاحتياطي للنموذج عند:- إخفاقات المصادقة
- حدود المعدل واستنفاد التهدئة
- أخطاء التحميل الزائد/انشغال الموفّر
- أخطاء التراجع الاحتياطي ذات شكل المهلة
- تعطيلات الفوترة
LiveSessionModelSwitchError، الذي يُطبَّع إلى مسار تراجع احتياطي حتى لا ينشئ نموذج ثابت محفوظ قديم حلقة إعادة محاولة خارجية- الأخطاء الأخرى غير المعروفة عندما لا يزال هناك مرشحون متبقون
- الإيقافات الصريحة التي لا تكون ذات شكل مهلة/تراجع احتياطي
- أخطاء تجاوز السياق التي ينبغي أن تبقى داخل منطق الضغط/إعادة المحاولة
(مثل
request_too_largeأوINVALID_ARGUMENT: input exceeds the maximum number of tokensأوinput token count exceeds the maximum number of input tokensأوThe input is too long for the modelأوollama error: context length exceeded) - خطأ مجهول نهائي عندما لا يبقى أي مرشح
سلوك تخطي التهدئة مقابل الفحص
عندما تكون كل ملفات تعريف المصادقة لموفّر ما في حالة تهدئة بالفعل، فإن OpenClaw لا يتخطى ذلك الموفّر تلقائيًا إلى الأبد. بل يتخذ قرارًا لكل مرشح:- تتخطى إخفاقات المصادقة المستمرة الموفّر كله فورًا.
- عادةً ما تؤدي تعطيلات الفوترة إلى التخطي، لكن المرشح الأساسي قد يظل قابلًا للفحص ضمن خنق زمني حتى تصبح الاستعادة ممكنة من دون إعادة التشغيل.
- قد يُفحص المرشح الأساسي قرب انتهاء التهدئة، مع خنق على مستوى الموفّر.
- يمكن محاولة النماذج الشقيقة ضمن الموفّر نفسه رغم التهدئة عندما
يبدو الإخفاق عابرًا (
rate_limitأوoverloadedأو غير معروف). وهذا مهم بشكل خاص عندما يكون حد المعدل ضمن نطاق نموذج وقد يتعافى نموذج شقيق فورًا. - تُقيَّد فحوصات التهدئة العابرة بمحاولة واحدة لكل موفّر في كل تشغيل تراجع احتياطي حتى لا يوقف موفّر واحد التراجع الاحتياطي عبر الموفّرين.
تجاوزات الجلسة وتبديل النموذج الحي
تغييرات نموذج الجلسة هي حالة مشتركة. فالمشغّل النشط، وأمر/model،
وتحديثات الضغط/الجلسة، وتسوية الجلسة الحية، كلها تقرأ أو تكتب
أجزاء من إدخال الجلسة نفسه.
وهذا يعني أن إعادات المحاولة في التراجع الاحتياطي يجب أن تتناسق مع تبديل النموذج الحي:
- فقط تغييرات النماذج الصريحة التي يقودها المستخدم هي التي تحدد تبديلًا حيًا معلقًا. وهذا
يشمل
/modelوsession_status(model=...)وsessions.patch. - تغييرات النماذج المدفوعة من النظام مثل تدوير التراجع الاحتياطي، أو تجاوزات heartbeat، أو الضغط، لا تحدد أبدًا تبديلًا حيًا معلقًا من تلقاء نفسها.
- قبل بدء إعادة محاولة التراجع الاحتياطي، يحفظ مشغّل الرد حقول تجاوز التراجع الاحتياطي المحددة في إدخال الجلسة.
- تفضّل تسوية الجلسة الحية تجاوزات الجلسة المحفوظة على حقول النموذج القديمة في وقت التشغيل.
- إذا فشلت محاولة التراجع الاحتياطي، فإن المشغّل يرجع فقط حقول التجاوز التي كتبها، وفقط إذا كانت لا تزال تطابق ذلك المرشح الفاشل.
- يفشل النموذج الأساسي.
- يُختار مرشح تراجع احتياطي في الذاكرة.
- ما زال مخزن الجلسة يشير إلى النموذج الأساسي القديم.
- تقرأ تسوية الجلسة الحية حالة الجلسة القديمة.
- تُعاد المحاولة إلى النموذج القديم قبل أن تبدأ محاولة التراجع الاحتياطي.
قابلية المراقبة وملخصات الإخفاق
يسجلrunWithModelFallback(...) تفاصيل لكل محاولة تغذي السجلات ورسائل التهدئة
الموجهة للمستخدم:
- الموفّر/النموذج الذي جرت محاولته
- السبب (
rate_limitأوoverloadedأوbillingأوauthأوmodel_not_foundو أسباب مشابهة للتراجع الاحتياطي) status/codeاختياري- ملخص خطأ قابل للقراءة البشرية
FallbackSummaryError. ويمكن
لمشغّل الرد الخارجي استخدام ذلك لبناء رسالة أكثر تحديدًا مثل “كل النماذج
مقيّدة بالمعدل مؤقتًا” مع تضمين أقرب وقت لانتهاء التهدئة عندما يكون معروفًا.
ويكون ملخص التهدئة هذا واعيًا بالنموذج:
- يتم تجاهل حدود المعدل غير المرتبطة والمقيّدة ضمن نطاق نموذج في سلسلة الموفّر/النموذج التي جرت محاولتها
- إذا كان الحظر المتبقي حد معدل مطابقًا ضمن نطاق نموذج، فإن OpenClaw يبلّغ عن آخر وقت انتهاء مطابق لا يزال يحظر ذلك النموذج
الإعدادات ذات الصلة
راجع تهيئة Gateway للاطلاع على:auth.profiles/auth.orderauth.cooldowns.billingBackoffHours/auth.cooldowns.billingBackoffHoursByProviderauth.cooldowns.billingMaxHours/auth.cooldowns.failureWindowHoursauth.cooldowns.overloadedProfileRotations/auth.cooldowns.overloadedBackoffMsauth.cooldowns.rateLimitedProfileRotationsagents.defaults.model.primary/agents.defaults.model.fallbacks- توجيه
agents.defaults.imageModel