Most budget talk happens before the call: you pick a model, size the prompt, and set a maximum output length. The overrun is the moment after that, when the response stops with a length finish reason and the text ends mid-sentence, mid-object or mid-tool call. The first thing to record is not the failure but the shape of it: how many tokens the answer used before the cut, whether the stop landed inside a structured structure (valid JSON that fails to parse, or a tool call with missing arguments), and whether the visible content already satisfies the user.
That distinction matters because a truncated response is not automatically useless. If the cut lands after the final paragraph of a summary, the reader has what they asked for and the extra tokens were padding. If the cut lands inside a function call, the caller may be holding a syntactically valid JSON object with a missing argument, which is worse than an obvious error. The tool calling literature is explicit that models can emit structurally valid JSON with nonsensical or missing parameter values, so schema validation is the only reliable gate, not the finish reason alone, as described in this overview of LLM function calling.
A useful first classification runs in three cheap steps:
- Read the finish reason. If it is a normal stop, there is no overrun even if the answer is long.
- Validate the payload against its schema. A parse failure or a missing required field turns the cut into a hard error, whatever the text looks like.
- Score completeness against the task type. A summary, an explanation, or a first draft tolerates a cut. A migration script, a data extraction, or a tool call does not.
Only after those three steps should you choose between the three usable paths: retry with a hard cap, fall back to a different tier, or refuse with the partial output attached.



