tools.loopDetection:
- Обнаружение циклов (
enabled) — по умолчанию отключено. Отслеживает скользящую историю вызовов инструментов для выявления повторяющихся шаблонов и повторных попыток вызова неизвестных инструментов. - Защита после Compaction (
postCompactionGuard) — включена, еслиenabledявно не задано какfalse. Активируется после каждой повторной попытки вслед за Compaction и прерывает выполнение, если агент повторяет одну и ту же тройку(tool, args, result)в пределах окна.
tools.loopDetection.enabled: false, чтобы отключить оба защитных механизма.
Зачем это нужно
- Обнаруживать повторяющиеся последовательности, которые не приводят к прогрессу.
- Обнаруживать высокочастотные циклы без результата (тот же инструмент, те же входные данные, повторяющиеся ошибки).
- Обнаруживать определённые шаблоны повторных вызовов известных инструментов опроса.
- Прерывать циклы «переполнение контекста -> Compaction -> тот же цикл», а не позволять им выполняться бесконечно.
Блок конфигурации
Глобальные значения по умолчанию со всеми документированными полями:agents.list[].tools.loopDetection:
detectors и postCompactionGuard), поэтому агенту достаточно задать только
поля, которые требуется изменить.
Поведение полей
Для
exec хеширование отсутствия прогресса сравнивает стабильные результаты команд (состояние,
код завершения, признак истечения времени ожидания, вывод) и игнорирует изменчивые метаданные среды выполнения,
такие как длительность, PID, идентификатор сеанса и рабочий каталог. Результаты исходящей отправки сообщений
хешируются без изменчивых идентификаторов отдельных вызовов (идентификатора сообщения, идентификатора файла, временной метки),
поэтому один результат «отправлено» не выглядит идентичным другому результату «отправлено».
Если доступен идентификатор выполнения, история оценивается только в пределах этого выполнения,
поэтому запланированные циклы 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, которые иначе расходовали бы неограниченное количество токенов,
поэтому защита действует даже для пользователя без соответствующей конфигурации.
- Меньшее значение
windowSizeделает проверку строже (меньше попыток до прерывания). - Большее значение
windowSizeпредоставляет агенту больше попыток восстановления. - Защита никогда не прерывает выполнение, пока результаты меняются; она срабатывает только при побайтово идентичных результатах в пределах окна.
- Она активируется только непосредственно после повторной попытки вслед за Compaction, но не в другие моменты выполнения.
Защита после Compaction работает всегда, когда главный флаг явно не задан как
false, даже если вы никогда не добавляли блок tools.loopDetection. Чтобы проверить это, найдите post-compaction guard armed for N attempts в журнале Gateway непосредственно после события Compaction.Журналы и ожидаемое поведение
При обнаружении цикла OpenClaw записывает событие цикла в журнал и либо выдаёт предупреждение, либо блокирует следующий цикл работы с инструментами в зависимости от серьёзности, предотвращая неконтролируемый расход токенов и зависания и при этом сохраняя обычный доступ к инструментам.- Сначала выдаются предупреждения.
- Если шаблон сохраняется после достижения порога предупреждений, начинается блокировка.
- Критические пороговые значения блокируют следующий цикл работы с инструментами и добавляют понятную причину обнаружения цикла в запись выполнения.
- Защита после Compaction выдаёт ошибки
compaction_loop_persistedс указанием проблемного инструмента и количества идентичных вызовов.
Связанные материалы
Подтверждения выполнения
Политика разрешения и запрета выполнения команд оболочки.
Уровни рассуждения
Уровни глубины рассуждений и взаимодействие с политикой провайдера.
Субагенты
Запуск изолированных агентов для ограничения неконтролируемого поведения.
Справочник по конфигурации
Полная схема
tools.loopDetection и семантика объединения.