Why does my answer come back empty on a reasoning model?

Because max_tokens budgets the reasoning too, and the reasoning is emitted first. Every model here returned an empty answer at 512 and below.

Finding

What we found

On a thinking model, max_tokens is a ceiling on everything the model emits, and the reasoning comes first. If the budget runs out before the reasoning finishes, the model never reaches the answer. You get a normal 200 response with an empty content string and finish_reason set to length. Nothing errored, so this reads like a bug in your own code, and that is why it is hard to diagnose.

We swept max_tokens across all five models against one identical prompt. At 16, 64, 256 and 512, every model returned an empty answer, and the reasoning consumed almost exactly the whole budget each time: 256 of 256, 512 of 512, 1024 of 1024. That is the shape to recognise. When completion tokens equal your cap and the content is empty, the model was cut off mid-thought.

The cap at which an answer first appeared differs by model. GLM-5.3-Flash produced a partial answer at 1024. GLM-5.3, GLM-5.3-Flash and DeepSeek-V4-Flash answered at 2048. DeepSeek-V4-Pro and Kimi K3 still returned nothing at 2048, spending 2048 and 2045 reasoning tokens respectively, and first answered at 3072.

The more surprising result is that the amount of reasoning is not fixed. On the same prompt, DeepSeek-V4-Pro used 985 reasoning tokens at a cap of 3072 and 4800 at a cap of 8192. Kimi K3 used 523, then 1149, then 2023 across the same three caps. So raising max_tokens does not only buy headroom, it can also change how much the model thinks. A budget that worked yesterday can return an empty string today, which is the part that makes this look intermittent rather than systematic.

One thing we looked for and did not find. A public report describes these truncated turns arriving with no usage object at all, which would make them impossible to bill correctly. That did not reproduce here. Every successful call on every model returned usage, including the truncated ones.

Workaround

What to do instead

  • Treat an empty content string with finish_reason of length as a budget problem, not a model failure, and check whether completion tokens equal your cap.
  • Budget for the reasoning, not for the answer you want. On the models here, 3072 was the first cap at which all five answered a short arithmetic question.
  • Do not tune max_tokens down to the smallest value that worked once. Reasoning length varies by several times on an identical prompt, so the smallest working value is the one most likely to fail later.
Provenance

How this was measured

An unattributed measurement is a marketing claim, so here is the receipt.

Probe
probe_reasoning_budget.py
Measured
2026-09-21

We found this by running the probe against the models we serve, which is also why it is worth trusting: it is a reading rather than a restatement of somebody's documentation. The full catalog is on /models, and what a request costs is on /pricing.

Upstream behaviour changes without notice, and a measurement is only as good as its date. If you find this is no longer true, tell us on the support page and we will re-run the probe.