Skip to content
Insights · AI Agents

Which budget did that thinking use?

Name the thinking budget on that request, or the refusal in its place. A different request can carry another value, and the model does not report it.

Scroll
AI AgentsOct 20, 202613 min readBy Salman Naqvi, Founder & CEO
Which budget did that thinking use?

The answer came back long, or it came back thin, and someone is about to say the model thought hard. Do not send the sentence again, and do not ask the model how long it thought, until you can name the thinking budget on the request you stored, or the error that refused the field. Show a different request that carried a different value, or that omitted the field. Show that the value was one you set, or one the API rejected, rather than a number the model reported as a memory. If the log does not store the field, write that. A fluent description of reasoning is not the request.

This is the thinking configuration on one request. It is not the sampling field. Which temperature did that call use? is temperature. A temperature is not a token budget, and a budget is not a draw. It is not the bill. Name the tokens the response billed is the usage object, including the cache fields. A count of tokens you were charged is not the budget you asked for, even when both are integers. It is not why the tokens stopped. Name the stop the response carried is stop_reason. A completed turn can have thought under any budget the API accepted, and a turn cut off at max_tokens does not tell you the budget. It is not the prompt. Which prompt did that request send? is the system text, the messages, and the tools. The bytes you sent are not the budget beside them. It is not the tool result. Which tool result did the model see? is the payload stored against a tool use id. A tool result is not a thinking budget.

None of what follows is a rate for this product, and none of it is legal advice. The rules below are one vendor's current description of a thinking budget, and of the models that reject that field. The scores below that are a 2025 paper about an open model on contest math, forced to think for a chosen number of tokens. An open model on a math set is not a Claude call. A score in that table is not a share of your customers' requests. Do not ask the model to reconcile them.

Anthropic's extended-thinking page says manual mode is thinking.type enabled with budget_tokens. On the Claude 4.6 models that field is deprecated and requests that use it still succeed. On Claude 4.7 and later, the API does not support it and rejects the request with a 400 error. On Claude 4.5 and earlier models that support thinking, extended thinking is the only mode. Claude Mythos Preview supports both modes. A success on 4.6 is not a success on 4.7. A 400 is not a budget. If the error message starts with the words thinking.type.enabled is not supported, the page says the model uses adaptive thinking instead. That sentence is a migration hint. It is not a number of tokens. The example request on the page sets model claude-sonnet-4-6, max_tokens 16000, and budget_tokens 10000, and asks whether there are infinitely many primes such that n mod 4 equals 3. 10000 is a budget on an example. 16000 is max_tokens on that same example. 10000 is not 16000. The prime question is a prompt. It is not a budget (Anthropic, Extended thinking).

The budget rules are three constraints, and they are not the example's numbers. budget_tokens has a minimum of 1,024 tokens, and the API rejects smaller values. 1,024 is not 10000, and 1,024 is not 16000. The budget must be less than max_tokens, because thinking tokens count toward max_tokens and the budget has to leave room for the answer. The exception is interleaved thinking, where budget_tokens can exceed max_tokens because the budget spans every thinking block in one assistant turn. Less-than is the ordinary rule. Greater-than is the exception. Do not quote one of them as if it were the only sentence. Because the budget must be less than max_tokens, extended thinking cannot be combined with max_tokens 0, which is cache pre-warming. 0 is not 1,024. The budget is a target, not a strict cap. Claude may stop before the budget is exhausted. max_tokens remains the hard ceiling on total output. A target is not a ceiling. The tuning note says to start near the 1,024 minimum for simple tasks, and at 16,000 tokens or more for complex tasks. 16,000 in that sentence is a suggested budget. 16000 in the example is max_tokens. The digits can match across a thousands separator. The fields do not. For budgets above 32k, the page says to use batch processing. 32k is not 1,024, and it is not 16,000.

What you were billed for thinking is a different field from what you requested. The page says to read usage.output_tokens_details.thinking_tokens for how many of the billed output tokens were internal reasoning, and that on a stream this breakdown appears only on the final message_delta. A delta is not the request. A billed thinking count can be below the budget, because the budget is a target. It cannot be treated as the budget you sent. On Claude Opus 4.5, which the page calls the only extended-thinking-only model that supports effort, effort shapes the response and budget_tokens sets depth. Two controls. Effort is not the budget. Interleaved thinking on Opus 4.5, on Sonnet 4.5, and on earlier Claude 4 models needs the beta header interleaved-thinking-2025-05-14. The date in that header is May 14, 2025. It is not a token count. Sonnet 4.6 still accepts the header with manual mode, and the page calls that path deprecated. Opus 4.6 manual mode has no interleaved thinking. Haiku 4.5 does not support interleaved thinking, and the page says the header is accepted but ignored. Accepted-and-ignored is not enabled. Opus 4.5 and models numbered 4.6 and higher keep prior turns' thinking blocks and bill them as input. Sonnet 4.5, Haiku 4.5, and earlier models strip them. A block kept as input is not a new budget.

The per-model table is a fourth list, and a 400 on that table is not the 400 you get for a budget under 1,024. On Claude Opus 5.5, sending enabled with budget_tokens is a 400, and omitting the thinking field means adaptive thinking. On Claude Opus 4.5, adaptive is a 400 and enabled with budget_tokens is extended thinking. The same JSON object is legal on one row and rejected on the other. Opus 4.6 lists enabled with budget_tokens as extended thinking, deprecated, and lists no thinking field as thinking off. Off is not a budget of zero. The adaptive examples on that overview set max_tokens to 16000 with type adaptive and no budget_tokens. 16000 there is a max, on a request that does not send a budget. It is not the example budget of 10000, and it is not the minimum of 1,024. A display value of summarized, or of omitted, controls whether you can read the thinking text. It does not set the budget. If the model skips thinking, the overview says no thinking block is produced, whatever display you set (Anthropic, Thinking).

The paper that forced a thinking length did it to an open model, on purpose, and published the scores. Niklas Muennighoff and colleagues, including Li Fei-Fei, Percy Liang, Emmanuel Candès, and Tatsunori Hashimoto, arXiv:2501.19393, call the method budget forcing. They fine-tune Qwen2.5-32B-Instruct on s1K, which is 1,000 questions, for 26 minutes on 16 H100 GPUs. 1,000 questions is not 1,024 tokens. 16 GPUs is not 16,000 tokens. 26 minutes is not a budget. The pool before the cut was about 59K questions. API errors reduced it to 54,116. A formatting filter reduced it to 51,581. They then describe a pool of 24,496, and they pick 1,000 spanning 50 domains, of which 384 come from sets they treat as already high quality. 54,116 is not 51,581. 24,496 is not 1,000. 384 is not 1,000. 50 domains is not a score of 50.0. NuminaMATH contributes 30,660 problems, OlympicArena 4,250, OmniMath 4,238, and AGIEval 2,385. 30,660 is not 30, and 30 is the number of AIME24 problems, answered with integers from 000 through 999, from a contest held January 31 to February 1, 2024. MATH500 is 500 samples. GPQA Diamond is 198 questions. 500 is not 198, and 198 is not 30 (Muennighoff and colleagues, s1: Simple test-time scaling).

Table 1 is where one exam has two scores for one model, and where a rounded abstract does not match the cell. s1 without budget forcing, 1K examples, prints AIME 2024 at 50.0, MATH 500 at 92.6, and GPQA Diamond at 56.6. s1-32B, also 1K, with budget forcing, prints 56.7, 93.0, and 59.6. 50.0 is not 56.7. 56.6 is not 56.7. 92.6 is not 93.0. The base Qwen2.5-32B-Instruct prints AIME 26.7, MATH 84.0, and GPQA 49.0. 26.7 is not 56.7. o1-preview prints AIME 44.6, MATH 85.5, and GPQA 73.3. The abstract says s1-32B exceeds o1-preview by up to 27% on MATH and AIME24. 56.7 minus 44.6 is 12.1 points, which is not 27 points. The abstract's up to 27% is a relative claim. It is not a subtraction of the two cells, and it is not a score. Do not write 27 into the AIME column. Gemini 2.0 Flash Thinking prints AIME 60.0, and MATH and GPQA as N.A. 60.0 is not 56.7, and N.A. is not a zero. Bespoke-32B prints MATH 93.0, the same MATH cell as s1-32B, on 17K examples rather than 1K. 93.0 on Bespoke is not 93.0 on s1, even though the digits match. r1 prints a sample count of much greater than 800K and AIME 79.8. r1-distill prints 800K and AIME 72.6. Much greater than 800K is not 800K. The prose says r1-32B used 800 times more reasoning samples than 1,000. 800 times 1,000 is 800,000. The table's mark for r1 is not an equal sign.

The figure sentence and the ablation sentence use still other caps. The text of Figure 1 says the rightmost AIME24 point is f of 7320 equals 57%. 7320 thinking tokens is not 1,024, and 57% is not the table's 56.7, and 57% is not the abstract's move from 50% to 57%. The abstract prints 50% to 57%. The table prints 50.0 and 56.7. The figure prints 57% at 7320 tokens. Three sentences, three writings. Do not sand them into one number. The prose says the curve flattens at six times. Six times is not 7320, and it is not six points. Table 2 forces a maximum of around 30,000 thinking tokens, and the confidence intervals use 10,000 bootstrap samples. 30,000 is not 30 AIME problems, and 10,000 bootstrap samples is not the example budget of 10000 on the vendor page, and it is not 1,000 training questions. Random selection, longest traces, or diversity alone are described as around 30% worse on AIME24 on average. Around 30% is not the 30-point gap from 26.7 to 56.7, and it is not a budget. Their selection, they say, matters. Their budget is still not the budget on your request.

Do the three proofs on one real request, in the log the product actually stores. First, the field. Open the request and read thinking. If the type is enabled, copy budget_tokens. If the type is adaptive, write adaptive, and write that no budget_tokens was sent. If the response is a 400, copy the error and do not convert it into a number. If the field is absent, write absent, and then write which model you sent, because absent means a different thing on Opus 4.5 than on Opus 5.5. Second, the other request. A call with a different budget, or with the field omitted, or with a rejection, is not this one. A score from a paper is not that second request. Third, the source. The value has to be one you set or one the API rejected. A paragraph in which the model explains that it thought carefully is not the field. If the only record is the answer text, you do not have the budget. You have the prose.

Three moves feel like the proof and are a second problem. Raising max_tokens and calling it a thinking budget. 16000 as a max is not 10000 as a budget, and on an adaptive request it is not a budget at all. Quoting 56.7 because it is higher than 50.0, while the request you were asked about is one call you have not opened. Asking the model what its budget was. It will answer. The answer will not be the field. The temperature, while the question is the budget, is which temperature did that call use?. Reading that field does not name budget_tokens.

The shape of a product that answers from a recording, without that answer being a budget ledger, is a companion a person can point at. ReUniting AI turns a recording into a companion with video and voice, and the conversation is one recording's, distinct from the next. The shape that matters here is a generation you could have logged. That case is not a thinking-budget ledger. Nothing in the description is a headcount, a duration, or a result figure. If the product stores the reply and drops the request's thinking field, you do not have this proof. You have the words, and not the budget.

There is a version of this afternoon where hiring the path is the wrong purchase. Nothing is in production, because the feature has not reached a customer. No model is being called, so there is no request to open. The request was not logged, and a transcript someone pasted into chat is not a log. A customer has already seen another customer's data. Naming a budget does not close a leak. The wrong value was already a write. A budget will not unwind it. Or no metric was ever named, so there is nothing a rescue could be measured against. Those are reasons to stop, not reasons to send the sentence again.

When the call is real and the log does not store the budget, the remaining work is specific. An audit of what is salvageable, in the first one to two weeks. An engagement finished in eight to twelve weeks, scoped after that audit, not before it. One metric agreed up front. If the engagement does not move it, the build is on us and you do not pay for it. Rollout, when it happens, sits behind a human-review gate. That is what an AI pilot failed to reach production engagement is for. The harness that scores a pinned budget against the call you actually sent, on your examples, is AI evaluation and observability. If you do not yet know whether the pilot can be saved, a two-week AI readiness assessment hands you the findings either way. Those are the terms. They are not a promise that a 2025 math score will recur, and they are not a rate. Muennighoff's 56.7 is one model's AIME cell. It will not appear on the invoice for the engagement, and it is not 1,024.

The card a charge used, and the runner a job used, are different objects: which card did that charge use? and which runner did that job use?. Do not record either on this page. A last four is not a token budget. A workflow label is not thinking.type.

Before you send the sentence again, do the three proofs and write the field. Name the budget, or write that the call was refused, or write that the request did not send one. Show another request that was not this value. Show that you set it, or that the API rejected it, and that the model did not invent it. Do not ask the model how long it thought, and do not treat a long answer as evidence the budget was high. The prose is what they would have read. The field is the page you can defend.

Questions

You stop treating the answer as something a budget produced, and you stop asking the model how long it thought, until you can name the budget you sent or the error that refused it, show a different request that carried another value or omitted the field, and show that you stored the request rather than the model describing it. If the log does not keep the field, write that.

No. A score on a contest is a share of someone else's questions. A budget you can defend is the value on this request, the thinking tokens the response reported, or a written line that the call was refused or that the field was not stored. 1,000 training examples is not a budget of 1,024 tokens, and 56.7 on one exam is not 50.0 on the same exam.

When nothing is in production, when no model is being called, when the request was not logged, when a customer has already seen another customer's data, when the wrong value was already a write, or when no metric was ever named.

Find this useful? Tell Google to show you more of it.

Let's put AI to work in your business.

A 30-minute call. You bring the workflow or the roadmap — we'll tell you what's feasible, what it costs, and what we'd build first.

Book a call→