Tools
Rilevamento dei loop degli strumenti
OpenClaw dispone di due meccanismi di protezione cooperanti per gli schemi ripetitivi di chiamata agli strumenti:
- Rilevamento dei loop (
tools.loopDetection.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 (
tools.loopDetection.postCompactionGuard) — abilitata per impostazione predefinita, salvo chetools.loopDetection.enabledsia esplicitamentefalse. Si arma dopo ogni nuovo tentativo di compaction e interrompe l'esecuzione quando l'agente emette la stessa tripla(tool, args, result)all'interno della finestra.
Entrambi sono configurati nello stesso blocco tools.loopDetection, ma la protezione post-compaction viene eseguita ogni volta che l'interruttore principale non è esplicitamente disattivato. Imposta tools.loopDetection.enabled: false per silenziare entrambe le superfici.
Perché esiste
- Rilevare sequenze ripetitive che non producono avanzamento.
- Rilevare loop ad alta frequenza senza risultato (stesso strumento, stessi input, errori ripetuti).
- Rilevare schemi specifici di chiamate ripetute per strumenti di polling noti.
- Impedire che cicli di overflow del contesto, quindi compaction, quindi stesso loop continuino indefinitamente.
Blocco di configurazione
Valori predefiniti globali, con ogni campo documentato mostrato:
{
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
},
},
},
}
Override per agente (facoltativo):
{
agents: {
list: [
{
id: "safe-runner",
tools: {
loopDetection: {
enabled: true,
warningThreshold: 8,
criticalThreshold: 16,
},
},
},
],
},
}
Comportamento dei campi
| Campo | Predefinito | Effetto |
|---|---|---|
enabled |
false |
Interruttore principale per i rilevatori della cronologia mobile. Impostare false disabilita anche la protezione post-compaction. |
historySize |
30 |
Numero di chiamate recenti agli strumenti conservate per l'analisi. |
warningThreshold |
10 |
Soglia prima che uno schema sia classificato come solo avviso. |
criticalThreshold |
20 |
Soglia per bloccare schemi di loop ripetitivi. |
unknownToolThreshold |
10 |
Blocca le chiamate ripetute allo stesso strumento non disponibile dopo questo numero di mancati riscontri. |
globalCircuitBreakerThreshold |
30 |
Soglia dell'interruttore globale senza avanzamento su tutti i rilevatori. |
detectors.genericRepeat |
true |
Rileva schemi ripetuti con stesso strumento + stessi parametri. |
detectors.knownPollNoProgress |
true |
Rileva schemi noti simili al polling senza cambiamento di stato. |
detectors.pingPong |
true |
Rileva schemi alternati ping-pong. |
postCompactionGuard.windowSize |
3 |
Numero di chiamate agli strumenti post-compaction durante le quali la protezione resta armata e conteggio di triple identiche che interrompe l'esecuzione. |
Per exec, i controlli senza avanzamento confrontano esiti stabili dei comandi e ignorano metadati di runtime volatili come durata, PID, ID sessione e directory di lavoro. Quando è disponibile un ID di esecuzione, la cronologia recente delle chiamate agli strumenti viene valutata solo all'interno di quell'esecuzione, così i cicli di heartbeat pianificati e le nuove esecuzioni non ereditano conteggi di loop obsoleti da esecuzioni precedenti.
Configurazione consigliata
- Per i modelli più piccoli, imposta
enabled: truee lascia le soglie ai valori predefiniti. I modelli di punta raramente richiedono il rilevamento basato sulla cronologia mobile e possono lasciare l'interruttore principale sufalsecontinuando comunque a beneficiare della protezione post-compaction. - Mantieni le soglie ordinate come
warningThreshold < criticalThreshold < globalCircuitBreakerThreshold. - Se si verificano falsi positivi:
- Aumenta
warningThresholde/ocriticalThreshold. - Facoltativamente aumenta
globalCircuitBreakerThreshold. - Disabilita solo il rilevatore specifico che causa problemi (
detectors.<name>: false). - Riduci
historySizeper un contesto storico meno rigido.
- Aumenta
- Per disabilitare tutto (inclusa la protezione post-compaction), imposta esplicitamente
tools.loopDetection.enabled: false.
Protezione post-compaction
Quando il runner completa un nuovo tentativo di compaction dopo un overflow del contesto, arma una protezione con finestra breve che monitora le successive chiamate agli strumenti. Se l'agente emette più volte la stessa tripla (toolName, argsHash, resultHash) all'interno della finestra, la protezione conclude che la compaction non ha interrotto il loop e interrompe l'esecuzione con un errore compaction_loop_persisted.
La protezione è regolata dal flag principale tools.loopDetection.enabled con una particolarità: resta abilitata quando il flag non è impostato o è true e si disattiva solo quando il flag è esplicitamente false. Questo è intenzionale. La protezione esiste per uscire dai loop di compaction che altrimenti consumerebbero token senza limiti, quindi anche un utente senza configurazione ottiene comunque la protezione.
{
tools: {
loopDetection: {
// master switch; set false to disable the guard along with the rolling detectors
enabled: true,
postCompactionGuard: {
windowSize: 3, // default
},
},
},
}
- Un
windowSizepiù basso è più restrittivo (meno tentativi prima dell'interruzione). - Un
windowSizepiù alto concede all'agente più tentativi di recupero. - La protezione non interrompe mai quando i risultati cambiano, ma solo quando i risultati sono identici byte per byte nella finestra.
- È intenzionalmente ristretta: si attiva solo subito dopo un nuovo tentativo di compaction.
Log e comportamento previsto
Quando viene rilevato un loop, OpenClaw segnala un evento di loop e attenua o blocca il ciclo successivo degli strumenti in base alla gravità. Questo protegge gli utenti da spese incontrollate di token e blocchi, preservando al tempo stesso il normale accesso agli strumenti.
- Gli avvisi arrivano per primi.
- La soppressione segue quando gli schemi persistono oltre la soglia di avviso.
- Le soglie critiche bloccano il ciclo successivo degli strumenti e mostrano un motivo chiaro di rilevamento del loop nel record dell'esecuzione.
- La protezione post-compaction emette errori
compaction_loop_persistedcon il nome dello strumento responsabile e il conteggio delle chiamate identiche.
Correlati
Criterio di autorizzazione/negazione per l'esecuzione della shell.
Livelli di sforzo di ragionamento e interazione con i criteri del provider.
Generazione di agenti isolati per limitare comportamenti incontrollati.
Schema completo di tools.loopDetection e semantica di unione.