| --- |
| title: "Tool-loop detection" |
| description: "Configure optional guardrails for preventing repetitive or stalled tool-call loops" |
| summary: "How to enable and tune guardrails that detect repetitive tool-call loops" |
| read_when: |
| - A user reports agents getting stuck repeating tool calls |
| - You need to tune repetitive-call protection |
| - You are editing agent tool/runtime policies |
| --- |
| |
| # Tool-loop detection |
|
|
| OpenClaw can keep agents from getting stuck in repeated tool-call patterns. |
| The guard is **disabled by default**. |
|
|
| Enable it only where needed, because it can block legitimate repeated calls with strict settings. |
|
|
| ## Why this exists |
|
|
| - Detect repetitive sequences that do not make progress. |
| - Detect high-frequency no-result loops (same tool, same inputs, repeated errors). |
| - Detect specific repeated-call patterns for known polling tools. |
|
|
| ## Configuration block |
|
|
| Global defaults: |
|
|
| ```json5 |
| { |
| tools: { |
| loopDetection: { |
| enabled: false, |
| historySize: 30, |
| warningThreshold: 10, |
| criticalThreshold: 20, |
| globalCircuitBreakerThreshold: 30, |
| detectors: { |
| genericRepeat: true, |
| knownPollNoProgress: true, |
| pingPong: true, |
| }, |
| }, |
| }, |
| } |
| ``` |
|
|
| Per-agent override (optional): |
|
|
| ```json5 |
| { |
| agents: { |
| list: [ |
| { |
| id: "safe-runner", |
| tools: { |
| loopDetection: { |
| enabled: true, |
| warningThreshold: 8, |
| criticalThreshold: 16, |
| }, |
| }, |
| }, |
| ], |
| }, |
| } |
| ``` |
|
|
| ### Field behavior |
|
|
| - `enabled`: Master switch. `false` means no loop detection is performed. |
| - `historySize`: number of recent tool calls kept for analysis. |
| - `warningThreshold`: threshold before classifying a pattern as warning-only. |
| - `criticalThreshold`: threshold for blocking repetitive loop patterns. |
| - `globalCircuitBreakerThreshold`: global no-progress breaker threshold. |
| - `detectors.genericRepeat`: detects repeated same-tool + same-params patterns. |
| - `detectors.knownPollNoProgress`: detects known polling-like patterns with no state change. |
| - `detectors.pingPong`: detects alternating ping-pong patterns. |
|
|
| ## Recommended setup |
|
|
| - Start with `enabled: true`, defaults unchanged. |
| - Keep thresholds ordered as `warningThreshold < criticalThreshold < globalCircuitBreakerThreshold`. |
| - If false positives occur: |
| - raise `warningThreshold` and/or `criticalThreshold` |
| - (optionally) raise `globalCircuitBreakerThreshold` |
| - disable only the detector causing issues |
| - reduce `historySize` for less strict historical context |
|
|
| ## Logs and expected behavior |
|
|
| When a loop is detected, OpenClaw reports a loop event and blocks or dampens the next tool-cycle depending on severity. |
| This protects users from runaway token spend and lockups while preserving normal tool access. |
|
|
| - Prefer warning and temporary suppression first. |
| - Escalate only when repeated evidence accumulates. |
|
|
| ## Notes |
|
|
| - `tools.loopDetection` is merged with agent-level overrides. |
| - Per-agent config fully overrides or extends global values. |
| - If no config exists, guardrails stay off. |
|
|