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را با نام ابزار متخلف و تعداد فراخوانیهای یکسان منتشر میکند.