Tools
اكتشاف حلقة الأدوات
لدى OpenClaw آليتا حماية متعاونتان لأنماط استدعاء الأدوات المتكررة:
- اكتشاف الحلقات (
tools.loopDetection.enabled) — معطّل افتراضيًا. يراقب سجل استدعاءات الأدوات المتحرك بحثًا عن الأنماط المتكررة ومحاولات إعادة الأدوات غير المعروفة. - حارس ما بعد Compaction (
tools.loopDetection.postCompactionGuard) — مفعّل افتراضيًا ما لم تكنtools.loopDetection.enabledمضبوطة صراحةً علىfalse. يتسلّح بعد كل إعادة محاولة عقب Compaction ويجهض التشغيل عندما يصدر الوكيل الثلاثية نفسها(tool, args, result)ضمن النافذة.
كلاهما يُهيّأ ضمن كتلة tools.loopDetection نفسها، لكن حارس ما بعد Compaction يعمل كلما لم يكن المفتاح الرئيسي مغلقًا صراحةً. اضبط tools.loopDetection.enabled: false لإسكات السطحين كليهما.
سبب وجود هذا
- اكتشاف التسلسلات المتكررة التي لا تحقق تقدمًا.
- اكتشاف حلقات عدم وجود نتائج عالية التكرار (الأداة نفسها، والمدخلات نفسها، والأخطاء المتكررة).
- اكتشاف أنماط محددة للاستدعاءات المتكررة لأدوات الاستطلاع المعروفة.
- منع دورات فيض السياق ثم Compaction ثم تكرار الحلقة نفسها من العمل إلى أجل غير مسمى.
كتلة التهيئة
الإعدادات الافتراضية العامة، مع عرض كل حقل موثق:
{
tools: {
loopDetection: {
enabled: false, // master switch for the rolling-history detectors
historySize: 30,
warningThreshold: 10,
criticalThreshold: 20,
unknownToolThreshold: 10,
globalCircuitBreakerThreshold: 30,
detectors: {
genericRepeat: true,
knownPollNoProgress: true,
pingPong: true,
},
postCompactionGuard: {
windowSize: 3, // armed after compaction-retry; runs unless enabled is explicitly false
},
},
},
}
تجاوز اختياري لكل وكيل:
{
agents: {
list: [
{
id: "safe-runner",
tools: {
loopDetection: {
enabled: true,
warningThreshold: 8,
criticalThreshold: 16,
},
},
},
],
},
}
سلوك الحقول
| الحقل | الافتراضي | التأثير |
|---|---|---|
enabled |
false |
المفتاح الرئيسي لكواشف السجل المتحرك. يؤدي ضبطه على false أيضًا إلى تعطيل حارس ما بعد Compaction. |
historySize |
30 |
عدد استدعاءات الأدوات الحديثة المحتفظ بها للتحليل. |
warningThreshold |
10 |
الحد الذي يُصنّف قبله النمط على أنه تحذير فقط. |
criticalThreshold |
20 |
حد حظر أنماط الحلقات المتكررة. |
unknownToolThreshold |
10 |
حظر الاستدعاءات المتكررة للأداة غير المتاحة نفسها بعد هذا العدد من الإخفاقات. |
globalCircuitBreakerThreshold |
30 |
حد قاطع عدم التقدم العام عبر جميع الكواشف. |
detectors.genericRepeat |
true |
يكتشف أنماط تكرار الأداة نفسها + المعلمات نفسها. |
detectors.knownPollNoProgress |
true |
يكتشف الأنماط المعروفة الشبيهة بالاستطلاع دون تغير في الحالة. |
detectors.pingPong |
true |
يكتشف أنماط التناوب ذهابًا وإيابًا. |
postCompactionGuard.windowSize |
3 |
عدد استدعاءات الأدوات بعد Compaction التي يبقى الحارس خلالها مسلحًا، وعدد الثلاثيات المتطابقة التي تجهض التشغيل. |
بالنسبة إلى exec، تقارن فحوصات عدم التقدم نتائج الأوامر المستقرة وتتجاهل بيانات وقت التشغيل المتقلبة مثل المدة وPID ومعرّف الجلسة ودليل العمل. عند توفر معرّف تشغيل، لا يُقيَّم سجل استدعاءات الأدوات الحديث إلا ضمن ذلك التشغيل، حتى لا ترث دورات Heartbeat المجدولة والتشغيلات الجديدة عدادات حلقات قديمة من تشغيلات سابقة.
الإعداد الموصى به
- للنماذج الأصغر، اضبط
enabled: trueواترك الحدود بقيمها الافتراضية. نادرًا ما تحتاج النماذج الرائدة إلى اكتشاف السجل المتحرك، ويمكنها ترك المفتاح الرئيسي عندfalseمع الاستمرار في الاستفادة من حارس ما بعد Compaction. - أبقِ الحدود مرتبة بالشكل
warningThreshold < criticalThreshold < globalCircuitBreakerThreshold. - إذا حدثت نتائج إيجابية كاذبة:
- ارفع
warningThresholdو/أوcriticalThreshold. - ارفع
globalCircuitBreakerThresholdاختياريًا. - عطّل فقط الكاشف المحدد الذي يسبب المشكلات (
detectors.<name>: false). - قلل
historySizeلسياق تاريخي أقل صرامة.
- ارفع
- لتعطيل كل شيء (بما في ذلك حارس ما بعد Compaction)، اضبط
tools.loopDetection.enabled: falseصراحةً.
حارس ما بعد Compaction
عندما يكمل المشغّل إعادة محاولة Compaction بعد فيض في السياق، فإنه يسلّح حارسًا قصير النافذة يراقب استدعاءات الأدوات القليلة التالية. إذا أصدر الوكيل الثلاثية نفسها (toolName, argsHash, resultHash) عدة مرات ضمن النافذة، يستنتج الحارس أن Compaction لم تكسر الحلقة ويجهض التشغيل بخطأ compaction_loop_persisted.
يتحكم العلم الرئيسي tools.loopDetection.enabled في الحارس مع تفصيل واحد: يبقى مفعّلًا عندما يكون العلم غير مضبوط أو true ولا يتوقف إلا عندما يكون العلم مضبوطًا صراحةً على false. هذا مقصود. يوجد الحارس للخروج من حلقات Compaction التي كانت ستستهلك رموزًا بلا حدود، لذلك يحصل المستخدم بلا تهيئة على الحماية أيضًا.
{
tools: {
loopDetection: {
// master switch; set false to disable the guard along with the rolling detectors
enabled: true,
postCompactionGuard: {
windowSize: 3, // default
},
},
},
}
- قيمة
windowSizeالأقل أكثر صرامة (محاولات أقل قبل الإجهاض). - قيمة
windowSizeالأعلى تمنح الوكيل محاولات استرداد أكثر. - لا يجهض الحارس أبدًا عندما تتغير النتائج، بل فقط عندما تكون النتائج متطابقة بالبايت عبر النافذة.
- وهو ضيق النطاق عن قصد: لا يعمل إلا مباشرةً بعد إعادة محاولة Compaction.
السجلات والسلوك المتوقع
عند اكتشاف حلقة، يبلغ OpenClaw عن حدث حلقة ويخفف أو يحظر دورة الأداة التالية حسب درجة الخطورة. يحمي هذا المستخدمين من الإنفاق المنفلت للرموز وحالات التجمّد مع الحفاظ على الوصول العادي إلى الأدوات.
- تأتي التحذيرات أولًا.
- يتبعها الكبح عندما تستمر الأنماط بعد حد التحذير.
- تحظر الحدود الحرجة دورة الأداة التالية وتعرض سببًا واضحًا لاكتشاف الحلقة في سجل التشغيل.
- يصدر حارس ما بعد Compaction أخطاء
compaction_loop_persistedمع اسم الأداة المخالفة وعدد الاستدعاءات المتطابقة.