Tool choice. Providers generally let you force a call, forbid one, or require a specific tool. Use it. A classification step that must return one of four tools should not be allowed to answer in prose, and a final summarisation turn should not be allowed to call anything. Leaving the decision open on every turn is how an agent ends up in a loop calling the same lookup nine times.
Parallel calls. Where a model can request several independent tools at once, take it — three lookups that could run concurrently are three round trips otherwise, and on a latency-sensitive path that is the whole budget. The constraint is that the calls must genuinely be independent; anything where the second call's arguments depend on the first result has to stay sequential, and a model will occasionally propose otherwise.
Errors are context, not exceptions. When a call fails, the useful move is usually to return the error to the model as a tool result in terms it can act on — “no customer with that reference; try searching by name” — rather than throwing. Models recover from a well-worded error surprisingly often. They recover from a stack trace never, and a raw exception message is also a place internal detail leaks into a context window.
Retries need a budget and a change. Retrying the identical call with the identical context usually produces the identical result. A retry should alter something — the temperature, the error hint, the sub-task — and there should be a hard cap, after which the system escalates rather than continuing. Unbounded self-correction loops are the most expensive failure mode in this whole area, because they fail slowly and bill the entire time.
Cardinality is a limit, not a suggestion. Recognition quality degrades as the tool list grows; a model choosing between forty tools makes worse choices than one choosing between six. Where a system genuinely needs many capabilities, route first — a cheap classifier selecting a small tool set — rather than presenting everything on every turn.