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 |
Виявляє почергові шаблони ping-pong. |
postCompactionGuard.windowSize |
3 |
Кількість викликів інструментів після Compaction, протягом яких запобіжник лишається активним, і кількість однакових трійок, що перериває виконання. |
Для exec перевірки відсутності прогресу порівнюють стабільні результати команд і ігнорують мінливі метадані виконання, як-от тривалість, PID, ID сесії та робочий каталог. Коли доступний ID виконання, історія останніх викликів інструментів оцінюється лише в межах цього виконання, щоб заплановані цикли Heartbeat і нові виконання не успадковували застарілі лічильники циклів із попередніх виконань.
Рекомендоване налаштування
- Для менших моделей установіть
enabled: trueі залиште пороги типовими. Флагманські моделі рідко потребують виявлення за рухомою історією та можуть залишити головний перемикач у станіfalse, водночас отримуючи користь від запобіжника після Compaction. - Тримайте пороги впорядкованими як
warningThreshold < criticalThreshold < globalCircuitBreakerThreshold. - Якщо виникають хибнопозитивні спрацьовування:
- Підвищте
warningThresholdта/абоcriticalThreshold. - За потреби підвищте
globalCircuitBreakerThreshold. - Вимкніть лише конкретний детектор, що спричиняє проблеми (
detectors.<name>: false). - Зменште
historySizeдля менш суворого історичного контексту.
- Підвищте
- Щоб вимкнути все (включно із запобіжником після Compaction), явно встановіть
tools.loopDetection.enabled: false.
Запобіжник після Compaction
Коли runner завершує повторну спробу після 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з назвою проблемного інструмента та кількістю однакових викликів.
Пов’язане
Політика дозволу/заборони для виконання shell-команд.
Рівні зусиль на міркування та взаємодія з політикою провайдера.
Запуск ізольованих агентів для обмеження неконтрольованої поведінки.
Повна схема tools.loopDetection і семантика злиття.