Tools
اكتشاف حلقة الأدوات
لدى OpenClaw آليتا حماية متعاونتان ضد أنماط استدعاء الأدوات المتكررة،
وتُضبط كلتاهما ضمن tools.loopDetection:
- اكتشاف الحلقات (
enabled) - معطّل افتراضيًا. يراقب السجل المتحرك لاستدعاءات الأدوات بحثًا عن الأنماط المتكررة وإعادات محاولة الأدوات المجهولة. - آلية الحماية بعد Compaction (
postCompactionGuard) - مفعّلة كلما لم تكن قيمةenabledهيfalseصراحةً. تُسلّح بعد كل إعادة محاولة تلي Compaction وتُجهض التشغيل إذا كرر الوكيل الثلاثية نفسها(tool, args, result)ضمن النافذة.
اضبط tools.loopDetection.enabled: false لتعطيل آليتي الحماية كلتيهما.
سبب وجود هذه الميزة
- اكتشاف التسلسلات المتكررة التي لا تحرز أي تقدم.
- اكتشاف حلقات انعدام النتائج عالية التكرار (الأداة نفسها، والمدخلات نفسها، والأخطاء المتكررة).
- اكتشاف أنماط محددة من الاستدعاءات المتكررة لأدوات الاستقصاء المعروفة.
- كسر دورات تجاوز السياق -> Compaction -> الحلقة نفسها بدلًا من السماح باستمرارها إلى أجل غير مسمى.
كتلة الإعداد
الإعدادات الافتراضية العامة، مع عرض كل حقل موثّق:
{ tools: { loopDetection: { enabled: false, // المفتاح الرئيسي لكاشفات السجل المتحرك historySize: 30, warningThreshold: 10, criticalThreshold: 20, unknownToolThreshold: 10, globalCircuitBreakerThreshold: 30, detectors: { genericRepeat: true, knownPollNoProgress: true, pingPong: true, }, postCompactionGuard: { windowSize: 3, // تُسلّح بعد إعادة المحاولة التالية لـ Compaction؛ تعمل ما لم تكن enabled هي false صراحةً }, }, },}تجاوز خاص بكل وكيل (اختياري، في agents.list[].tools.loopDetection):
{ agents: { list: [ { id: "safe-runner", tools: { loopDetection: { enabled: true, warningThreshold: 8, criticalThreshold: 16, }, }, }, ], },}تُركّب إعدادات كل وكيل فوق الكتلة العامة حقلًا بحقل (بما في ذلك
detectors وpostCompactionGuard المتداخلان)، لذا لا يحتاج الوكيل إلا إلى ضبط
الحقول التي يريد تغييرها.
سلوك الحقول
| الحقل | القيمة الافتراضية | التأثير |
|---|---|---|
enabled |
false |
المفتاح الرئيسي لكاشفات السجل المتحرك. تؤدي القيمة false أيضًا إلى تعطيل آلية الحماية بعد Compaction. |
historySize |
30 |
عدد استدعاءات الأدوات الحديثة المحتفظ بها للتحليل. |
warningThreshold |
10 |
عدد مرات التكرار قبل تصنيف النمط على أنه تحذير فقط. |
criticalThreshold |
20 |
عدد مرات التكرار اللازم لحظر نمط حلقة لا تحرز تقدمًا. يضبط وقت التشغيل هذه القيمة لتتجاوز warningThreshold إذا أسيء إعدادها. |
unknownToolThreshold |
10 |
يحظر الاستدعاءات المتكررة للأداة غير المتاحة نفسها بعد هذا العدد من الإخفاقات. لا يخضع لـdetectors. |
globalCircuitBreakerThreshold |
30 |
قاطع عام لانعدام التقدم عبر جميع الكاشفات. يضبط وقت التشغيل هذه القيمة لتتجاوز criticalThreshold إذا أسيء إعدادها. لا يخضع لـdetectors. |
detectors.genericRepeat |
true |
يحذّر عند تكرار استدعاءات الأداة نفسها + الوسائط نفسها؛ ويحظرها عندما تعيد تلك الاستدعاءات أيضًا نتائج متطابقة. |
detectors.knownPollNoProgress |
true |
يكتشف أنماط الاستقصاء المعروفة التي لا تحرز تقدمًا (process مع action: "poll"/"log"، وcommand_status). |
detectors.pingPong |
true |
يكتشف أنماط التناوب المتبادل التي لا تحرز تقدمًا بين استدعاءين. |
postCompactionGuard.windowSize |
3 |
عدد المحاولات التي تظل خلالها آلية الحماية مسلّحة بعد Compaction، وعدد الثلاثيات المتطابقة الذي يؤدي إلى إجهاض التشغيل. |
بالنسبة إلى exec، تقارن تجزئة انعدام التقدم نتائج الأوامر المستقرة (الحالة،
ورمز الخروج، وعلامة انتهاء المهلة، والمخرجات) وتتجاهل بيانات وقت التشغيل الوصفية
المتغيرة مثل المدة، ومعرّف العملية، ومعرّف الجلسة، ودليل العمل. تُجزّأ نتائج
إرسال الرسائل الصادرة بعد إزالة المعرّفات المتغيرة الخاصة بكل استدعاء (معرّف الرسالة،
ومعرّف الملف، والطابع الزمني)، بحيث لا تبدو نتيجة "تم الإرسال" مطابقة لنتيجة
"تم الإرسال" مختلفة. عندما يتوفر معرّف تشغيل، لا يُقيّم السجل إلا ضمن ذلك التشغيل،
ولذلك لا ترث دورات Heartbeat المجدولة وعمليات التشغيل الجديدة أعداد الحلقات القديمة
من عمليات التشغيل السابقة.
الإعداد الموصى به
- للنماذج الأصغر، اضبط
enabled: trueواترك الحدود عند قيمها الافتراضية. نادرًا ما تحتاج النماذج الرائدة إلى اكتشاف السجل المتحرك، ويمكنها إبقاء المفتاح الرئيسي علىfalseمع الاستفادة رغم ذلك من آلية الحماية بعد Compaction. - حافظ على ترتيب الحدود
warningThreshold < criticalThreshold < globalCircuitBreakerThreshold؛ يرفع وقت التشغيلcriticalThresholdوglobalCircuitBreakerThresholdإذا ضبطتهما عند الحد الذي يجب أن تتجاوزاه أو دونه. - إذا حدثت نتائج إيجابية كاذبة:
- ارفع
warningThresholdو/أوcriticalThreshold. - ارفع
globalCircuitBreakerThresholdاختياريًا. - عطّل فقط الكاشف المحدد المسبب للمشكلات (
detectors.<name>: false). - قلّل
historySizeللحصول على نافذة سجل أقصر.
- ارفع
- لتعطيل كل شيء، بما في ذلك آلية الحماية بعد Compaction، اضبط
tools.loopDetection.enabled: falseصراحةً.
آلية الحماية بعد Compaction
بعد إعادة محاولة Compaction التي تلي تجاوز السياق، يسلّح المشغّل آلية حماية
ذات نافذة قصيرة لاستدعاءات الأدوات القليلة التالية. إذا أصدر الوكيل الثلاثية نفسها
(toolName, argsHash, resultHash) بعدد مرات يساوي postCompactionGuard.windowSize
ضمن تلك النافذة، تستنتج آلية الحماية أن Compaction لم تكسر
الحلقة وتُجهض التشغيل بخطأ compaction_loop_persisted.
تخضع آلية الحماية للعلامة الرئيسية tools.loopDetection.enabled مع اختلاف
واحد: تظل مفعّلة عندما تكون العلامة غير مضبوطة أو تساوي true، ولا تُعطّل
إلا عندما تكون العلامة false صراحةً. هذا مقصود - إذ وُجدت آلية الحماية
للخروج من حلقات Compaction التي كانت ستستهلك عددًا غير محدود من الرموز،
وبذلك يحصل المستخدم الذي لا يضبط أي إعداد على الحماية أيضًا.
{ tools: { loopDetection: { // المفتاح الرئيسي؛ اضبطه على false لتعطيل آلية الحماية مع كاشفات السجل المتحرك enabled: true, postCompactionGuard: { windowSize: 3, // القيمة الافتراضية }, }, },}- تكون القيمة الأقل لـ
windowSizeأكثر صرامة (محاولات أقل قبل الإجهاض). - تمنح القيمة الأعلى لـ
windowSizeالوكيل محاولات استرداد أكثر. - لا تُجهض آلية الحماية التشغيل أبدًا ما دامت النتائج تتغير؛ ولا تُفعّلها إلا النتائج المتطابقة بايتًا ببايت عبر النافذة.
- لا تُسلّح إلا مباشرةً بعد إعادة محاولة Compaction، وليس في نقاط أخرى من التشغيل.
السجلات والسلوك المتوقع
عند اكتشاف حلقة، يسجّل OpenClaw حدث حلقة ويصدر تحذيرًا أو يحظر دورة الأداة التالية تبعًا للخطورة، مما يحمي من الاستهلاك المنفلت للرموز وحالات التعطل مع الحفاظ على الوصول الطبيعي إلى الأدوات.
- تأتي التحذيرات أولًا.
- يبدأ الحظر عندما يستمر النمط متجاوزًا حد التحذير.
- تحظر الحدود الحرجة دورة الأداة التالية وتعرض سببًا واضحًا لاكتشاف الحلقة في سجل التشغيل.
- تصدر آلية الحماية بعد Compaction أخطاء
compaction_loop_persistedتسمي الأداة المخالفة وعدد الاستدعاءات المتطابقة.