tools.loopDetection:
- Rilevamento dei cicli (
enabled) - disabilitato per impostazione predefinita. Monitora la cronologia mobile delle chiamate agli strumenti per individuare schemi ripetuti e nuovi tentativi con strumenti sconosciuti. - Protezione post-Compaction (
postCompactionGuard) - abilitata ogni volta cheenablednon è esplicitamentefalse. Si attiva dopo ogni nuovo tentativo successivo alla Compaction e interrompe l’esecuzione se l’agente ripete la stessa terna(tool, args, result)entro la finestra.
tools.loopDetection.enabled: false per disattivare entrambi i meccanismi di protezione.
Perché esiste
- Rilevare sequenze ripetitive che non producono progressi.
- Rilevare cicli ad alta frequenza senza risultati (stesso strumento, stessi input, errori ripetuti).
- Rilevare specifici schemi di chiamate ripetute per strumenti di polling noti.
- Interrompere i cicli overflow del contesto -> Compaction -> stesso ciclo, invece di lasciarli proseguire indefinitamente.
Blocco di configurazione
Valori predefiniti globali, con tutti i campi documentati:agents.list[].tools.loopDetection):
detectors e postCompactionGuard annidati), quindi un agente deve impostare solo i
campi che desidera modificare.
Comportamento dei campi
Per
exec, l’hashing dell’assenza di progressi confronta risultati stabili dei comandi (stato,
codice di uscita, indicatore di timeout, output) e ignora metadati volatili del runtime come
durata, PID, ID sessione e directory di lavoro. L’hashing dei risultati dell’invio di messaggi
in uscita rimuove gli ID volatili specifici di ogni chiamata (ID messaggio, ID file, timestamp),
affinché un risultato “inviato” non appaia identico a un altro risultato “inviato”.
Quando è disponibile un ID esecuzione, la cronologia viene valutata solo all’interno di tale esecuzione,
quindi i cicli Heartbeat pianificati e le nuove esecuzioni non ereditano conteggi obsoleti dei cicli
dalle esecuzioni precedenti.
Configurazione consigliata
- Per i modelli più piccoli, imposta
enabled: truee lascia le soglie ai valori predefiniti. I modelli di punta raramente necessitano del rilevamento basato sulla cronologia mobile e possono lasciare l’interruttore principale sufalse, continuando comunque a beneficiare della protezione post-Compaction. - Mantieni le soglie nell’ordine
warningThreshold < criticalThreshold < globalCircuitBreakerThreshold; il runtime aumentacriticalThresholdeglobalCircuitBreakerThresholdse vengono impostate a un valore uguale o inferiore alla soglia che devono superare. - Se si verificano falsi positivi:
- Aumenta
warningThresholde/ocriticalThreshold. - Facoltativamente, aumenta
globalCircuitBreakerThreshold. - Disabilita solo il rilevatore specifico che causa problemi (
detectors.<name>: false). - Riduci
historySizeper ottenere una finestra cronologica più breve.
- Aumenta
- Per disabilitare tutto, inclusa la protezione post-Compaction, imposta
esplicitamente
tools.loopDetection.enabled: false.
Protezione post-Compaction
Dopo un nuovo tentativo di Compaction successivo a un overflow del contesto, l’esecutore attiva una protezione a finestra breve per le chiamate agli strumenti immediatamente successive. Se l’agente emette la stessa terna(toolName, argsHash, resultHash) per postCompactionGuard.windowSize
volte entro tale finestra, la protezione conclude che la Compaction non ha interrotto il
ciclo e termina l’esecuzione con un errore compaction_loop_persisted.
La protezione è controllata dal flag principale tools.loopDetection.enabled, con una
particolarità: rimane abilitata quando il flag non è impostato o è true e viene
disattivata solo quando il flag è esplicitamente false. Questo comportamento è intenzionale: la protezione
serve a interrompere i cicli di Compaction che altrimenti consumerebbero una quantità illimitata di token,
quindi anche un utente senza configurazione beneficia della protezione.
- Un valore
windowSizeinferiore è più restrittivo (meno tentativi prima dell’interruzione). - Un valore
windowSizesuperiore concede all’agente più tentativi di recupero. - La protezione non interrompe mai l’esecuzione finché i risultati cambiano; si attiva solo con risultati identici byte per byte nell’intera finestra.
- Si attiva esclusivamente subito dopo un nuovo tentativo di Compaction, non in altri momenti dell’esecuzione.
La protezione post-Compaction viene eseguita ogni volta che il flag principale non è esplicitamente
false, anche se non hai mai scritto un blocco tools.loopDetection. Per verificarlo, cerca post-compaction guard armed for N attempts nel log del Gateway subito dopo un evento di Compaction.Log e comportamento previsto
Quando viene rilevato un ciclo, OpenClaw registra un evento di ciclo e genera un avviso oppure blocca il ciclo successivo dello strumento in base alla gravità, proteggendo dal consumo incontrollato di token e dai blocchi, senza compromettere il normale accesso agli strumenti.- Gli avvisi vengono emessi per primi.
- Il blocco avviene quando uno schema persiste oltre la soglia di avviso.
- Le soglie critiche bloccano il ciclo successivo dello strumento e mostrano chiaramente il motivo del rilevamento del ciclo nel record dell’esecuzione.
- La protezione post-Compaction genera errori
compaction_loop_persistedche indicano lo strumento responsabile e il numero di chiamate identiche.
Argomenti correlati
Approvazioni di Exec
Criteri di autorizzazione e rifiuto per l’esecuzione nella shell.
Livelli di ragionamento
Livelli di impegno del ragionamento e interazione con i criteri del provider.
Sottoagenti
Creazione di agenti isolati per limitare comportamenti incontrollati.
Riferimento della configurazione
Schema completo di
tools.loopDetection e semantica dell’unione.