tools.loopDetection:
- Detecção de loops (
enabled) - desabilitada por padrão. Monitora o histórico contínuo de chamadas de ferramentas em busca de padrões repetidos e novas tentativas com ferramentas desconhecidas. - Proteção pós-Compaction (
postCompactionGuard) - habilitada sempre queenablednão for explicitamentefalse. É armada após cada nova tentativa decorrente de Compaction e interrompe a execução se o agente repetir a mesma tripla(tool, args, result)dentro da janela.
tools.loopDetection.enabled: false para desativar as duas proteções.
Por que isso existe
- Detectar sequências repetitivas que não produzem progresso.
- Detectar loops de alta frequência sem resultados (mesma ferramenta, mesmas entradas e erros repetidos).
- Detectar padrões específicos de chamadas repetidas para ferramentas de sondagem conhecidas.
- Interromper ciclos de estouro de contexto -> Compaction -> mesmo loop, em vez de permitir que continuem indefinidamente.
Bloco de configuração
Padrões globais, com todos os campos documentados:agents.list[].tools.loopDetection):
detectors e postCompactionGuard aninhados), portanto um agente precisa definir apenas os
campos que deseja alterar.
Comportamento dos campos
Para
exec, o hash de ausência de progresso compara resultados estáveis do comando (status,
código de saída, indicador de tempo limite e saída) e ignora metadados voláteis do runtime, como
duração, PID, ID da sessão e diretório de trabalho. Os hashes dos resultados de envio de mensagens
removem IDs voláteis específicos de cada chamada (ID da mensagem, ID do arquivo e carimbo de data e hora),
para que um resultado de “envio concluído” não pareça idêntico a outro resultado de “envio concluído”.
Quando um ID de execução está disponível, o histórico é avaliado somente dentro dessa execução,
portanto ciclos agendados de Heartbeat e novas execuções não herdam contagens obsoletas de loops
de execuções anteriores.
Configuração recomendada
- Para modelos menores, defina
enabled: truee mantenha os valores padrão dos limites. Modelos de ponta raramente precisam da detecção por histórico contínuo e podem manter a chave principal comofalse, ainda se beneficiando da proteção pós-Compaction. - Mantenha os limites na ordem
warningThreshold < criticalThreshold < globalCircuitBreakerThreshold; o runtime aumentacriticalThresholdeglobalCircuitBreakerThresholdse você os definir com valor igual ou inferior ao limite que eles precisam exceder. - Se ocorrerem falsos positivos:
- Aumente
warningThresholde/oucriticalThreshold. - Opcionalmente, aumente
globalCircuitBreakerThreshold. - Desabilite somente o detector específico que está causando problemas (
detectors.<name>: false). - Reduza
historySizepara usar uma janela histórica mais curta.
- Aumente
- Para desabilitar tudo, incluindo a proteção pós-Compaction, defina
explicitamente
tools.loopDetection.enabled: false.
Proteção pós-Compaction
Após uma nova tentativa de Compaction decorrente de um estouro de contexto, o executor arma uma proteção de janela curta para as próximas chamadas de ferramentas. Se o agente emitir a mesma tripla(toolName, argsHash, resultHash) postCompactionGuard.windowSize
vezes dentro dessa janela, a proteção conclui que a Compaction não interrompeu o
loop e encerra a execução com um erro compaction_loop_persisted.
A proteção é controlada pela chave principal tools.loopDetection.enabled, com uma
particularidade: ela permanece habilitada quando a chave não está definida ou é true e somente é
desativada quando a chave é explicitamente false. Isso é intencional: a proteção
existe para interromper loops de Compaction que, de outra forma, consumiriam tokens sem limite,
portanto até mesmo um usuário sem configuração recebe essa proteção.
- Um
windowSizemenor é mais rigoroso (menos tentativas antes da interrupção). - Um
windowSizemaior oferece ao agente mais tentativas de recuperação. - A proteção nunca interrompe a execução enquanto os resultados estiverem mudando; somente resultados idênticos byte a byte ao longo da janela a acionam.
- Ela é armada somente imediatamente após uma nova tentativa de Compaction, e não em outros pontos de uma execução.
A proteção pós-Compaction é executada sempre que a chave principal não é explicitamente
false, mesmo que você nunca tenha criado um bloco tools.loopDetection. Para verificar, procure post-compaction guard armed for N attempts no log do Gateway imediatamente após um evento de Compaction.Logs e comportamento esperado
Quando um loop é detectado, o OpenClaw registra um evento de loop e emite um aviso ou bloqueia o próximo ciclo de ferramenta, dependendo da gravidade, protegendo contra o consumo descontrolado de tokens e travamentos sem impedir o acesso normal às ferramentas.- Os avisos ocorrem primeiro.
- O bloqueio ocorre quando um padrão persiste além do limite de aviso.
- Os limites críticos bloqueiam o próximo ciclo de ferramenta e apresentam um motivo claro de detecção de loop no registro da execução.
- A proteção pós-Compaction emite erros
compaction_loop_persistedque identificam a ferramenta responsável e a contagem de chamadas idênticas.
Conteúdo relacionado
Aprovações de execução
Política de permissão e negação para execução no shell.
Níveis de raciocínio
Níveis de esforço de raciocínio e interação com a política do provedor.
Subagentes
Criação de agentes isolados para limitar comportamentos descontrolados.
Referência de configuração
Esquema completo de
tools.loopDetection e semântica de mesclagem.