# Tool Errors and Thrashing — Agent Loops, Stop Conditions and Token Budgets

Source: https://www.geekswithgeeks.com/en/agent-loops/fail-tool-error-thrash

> Return useful errors to the model but stop when failures keep stacking up.

## Let it recover, but only so far

When a tool fails, send the error back as the tool result (flagged as an error) so the model can adjust, for example fix a wrong argument. But if errors keep coming, the model is thrashing. Count **consecutive failures**, and after a small number stop and escalate with the last error attached.

## Returning an error result

The `is_error` flag tells the model the call failed. The consecutive counter resets on any success.

```python
try:
    content, ok = run_tool(block.name, block.input), True
except Exception as exc:
    content, ok = f"Tool failed: {exc}", False

results.append({"type": "tool_result", "tool_use_id": block.id,
                "content": content, "is_error": not ok})
failures = 0 if ok else failures + 1
if failures >= 3:
    return escalate("3 consecutive tool failures", last_error=content)
```

**Quiz:** Why count consecutive tool failures?

- [x] To detect a model that is thrashing and not recovering
- [ ] To make tools slower
- [ ] Because errors are good
- [ ] To hide failures

*Answer:* To detect a model that is thrashing and not recovering. A run of failures without a success means more retries are unlikely to help.
