A tool that fails by returning {"error": "could not complete request"} forces the model to infer what to do next from prose. That inference is unreliable. Agents fail most often because the tool interface is unclear, not because the model is weak: when naming, schemas and error handling are vague, failures become predictable rather than accidental machinelearningmastery.com. The same article treats "structured error returns" as one of the concrete patterns that reduces hallucination at the tool boundary.
There is a second problem. Many failures are silent. A call returns HTTP 200, the action never committed, and the agent moves on as if it succeeded scalekit.com. Scalekit's taxonomy separates identity, connector, upstream API and execution-semantics failures precisely because a single status code means structurally different things depending on which layer failed. A prose string cannot carry that distinction; a named field can.
The third problem is cost. Frameworks default to "retry with exponential backoff" for every error, but that reflex was imported from stateless HTTP clients into stateful agent loops where it is often wrong tianpan.co. Retrying a calendar conflict that will never clear burns latency and proves nothing. The fix is to make the model read a class, not a paragraph.



