Direct Answer

Reasoning effort is a versioned inference control, not one cross-provider standard and not a window into a model's private algorithm. Some APIs expose discrete effort levels, some expose adaptive thinking, some accept a soft token budget, and some do not allow thinking to be disabled. Parameter names, defaults, accounting, output visibility, tool behavior, and supported values can all vary by model snapshot.

Production teams should treat effort as an experiment variable. Freeze the task and answer contract, compare supported settings, reserve enough answer space, validate external outcomes, and route only when the router beats simple always-low and always-high baselines.

Four Contracts Hidden Behind “Thinking Mode”

1. Control contract

The request might expose a level such as low or high, a mode such as adaptive, or a token-like budget. The control may be soft guidance rather than a hard compute limit. Unsupported values can fail the request.

2. Accounting contract

Reasoning work may count toward generated-token limits, the context window, and billing even when it is not visible. A request can exhaust its output budget before emitting a complete answer. Cost analysis therefore needs total generated work, incomplete responses, retries, and accepted outcomes.

3. Visibility contract

The API may return no reasoning, a summary, an omitted or encrypted block, or model-generated chain-of-thought text. These artifacts are not equivalent. They should not be stored by default, and they are not reliable evidence that a particular internal search, verification, or policy check occurred.

4. Conversation and tool contract

Providers differ in how reasoning state is carried between turns, whether signatures must be round-tripped, how prompt caching behaves across modes, and whether thinking can occur between tool calls. An adapter must preserve the provider contract without exposing it as a universal application invariant.

Current Provider Patterns

The table describes interface families, not permanent product specifications.

Provider pattern Current public control Important boundary
OpenAI reasoning models model-dependent reasoning.effort; some models also expose a reasoning mode supported levels and defaults vary; reasoning tokens count toward generated output and can end in an incomplete response
Anthropic adaptive thinking thinking: {type: "adaptive"} plus an effort level on current supported models fixed budget_tokens is deprecated or rejected on newer snapshots; displayed thinking may be summarized or omitted
Gemini 3 and later discrete thinking_level values levels and whether thinking can be disabled depend on the model
Gemini 2.5 family thinking_budget with model-specific ranges and zero behavior budget is documented as a soft limit; using newer level fields on older models is an error
Open-weight or hosted hybrid model model- or runtime-specific toggle, budget, template, or stop token generated <think> text is model output, not a faithful audit trace

Always read the exact model page before deployment. Pin model ID, API revision, SDK version, request shape, response fields, usage fields, cache behavior, and tested tool sequence.

What Extra Reasoning Can and Cannot Do

Extra inference work can help a model explore alternatives, plan tools, or solve multi-step problems under some protocols. It does not establish:

  • correctness or factual support;
  • a faithful chain of causation;
  • permission to access data or execute a tool;
  • adequate test coverage;
  • a fixed quality gain;
  • a portable latency or cost multiplier.

The DART paper studies routing between direct and extended reasoning under specific math and coding benchmarks. It also documents an important measurement artifact: a one-phase comparison can make a reasoning path look worse simply because the shared generation cap truncates the final answer. That finding supports budget-aware test-time compute experiments; it does not make draft agreement a universal production router.

Build a Matched Evaluation

Freeze the task unit

Each case should include:

  • input and authorized evidence;
  • expected result or executable verifier;
  • allowed refusal and escalation behavior;
  • tool and side-effect policy;
  • maximum answer and wall-clock budget;
  • business impact and slice labels.

Do not use one “difficulty” label as ground truth. A short question can require fresh evidence, while a long question can have a deterministic transformation.

Compare complete strategies

At minimum run:

  1. the lowest supported effort;
  2. the default effort;
  3. a higher effort;
  4. a simple policy router;
  5. any learned or multi-call router only after the first four.

Give each strategy enough room to produce a final answer, or record truncation as a distinct outcome. Match tool access, retrieval, prompt, timeout, and evaluator. If a higher effort uses a different model snapshot, report it as a model-plus-effort change.

Measure what the user receives

Metric Why it matters
task success final outcome, not rationale length
verifier false accept/reject a flawed judge can invert the decision
incomplete response rate reasoning may consume the output budget
p50/p95/p99 latency long tails determine interactive reliability
total generated and billed units visible text alone understates work
tool calls and retries reasoning can amplify external operations
cost per verified task normalizes quality and expense
refusal and escalation quality important for unsupported or high-risk cases

Report results by task slice. An average can hide a router that saves cost on easy tasks while sending a high-impact slice to an inadequate mode.

A Safe Routing Architecture

flowchart LR A["Task contract"] --> B["Deterministic eligibility checks"] B --> C["Select provider-supported effort"] C --> D["Model and bounded tools"] D --> E["Independent verifier"] E --> F{"Accepted?"} F -->|"Yes"| G["Return result"] F -->|"No, retryable"| H["One bounded escalation"] F -->|"No, high impact"| I["Human review or reject"] H --> D

The router should use signals available before or during execution that have been validated on the target workload. Prompt length, keywords, model self-confidence, and visible reasoning length are weak proxies unless calibrated.

Use a single bounded escalation rather than an unconstrained loop. After an ambiguous timeout, reconcile tool state before retrying. Never replay a payment, deployment, message, or deletion because a high-effort response failed to arrive.

Provider Adapter Requirements

A provider-neutral request can describe intent:

text
quality tier: economical | balanced | thorough
hard output limit
deadline
tool policy
required evidence
fallback policy

The adapter maps that intent to a provider's supported API. It must reject unsupported mappings instead of silently substituting a different mode.

Record in every trace:

  • provider, endpoint, model snapshot, SDK and API revision;
  • requested abstract tier and concrete mapped parameters;
  • input, cached, output, and reasoning usage when available;
  • stop reason, incomplete details, tool calls, retries, and latency;
  • answer verifier result and final route.

Do not log raw secrets, unrestricted prompts, private tool results, or reasoning blocks without a documented purpose and retention policy.

Runnable Go Router

This standard-library example chooses among measured modes for one task class. It first enforces quality, incomplete-response, and latency gates, then minimizes cost per verified task. The records are synthetic fixtures.

go
package main

import (
	"fmt"
	"sort"
)

type ModeResult struct {
	Name                string
	TaskSuccess         float64
	FalseAcceptRate     float64
	IncompleteRate      float64
	P95LatencyMS        int
	CostPerVerifiedTask float64
}

type Gate struct {
	MinTaskSuccess     float64
	MaxFalseAcceptRate float64
	MaxIncompleteRate  float64
	MaxP95LatencyMS    int
}

func passes(result ModeResult, gate Gate) bool {
	return result.TaskSuccess >= gate.MinTaskSuccess &&
		result.FalseAcceptRate <= gate.MaxFalseAcceptRate &&
		result.IncompleteRate <= gate.MaxIncompleteRate &&
		result.P95LatencyMS <= gate.MaxP95LatencyMS
}

func main() {
	gate := Gate{
		MinTaskSuccess:     0.88,
		MaxFalseAcceptRate: 0.01,
		MaxIncompleteRate:  0.02,
		MaxP95LatencyMS:    2500,
	}
	results := []ModeResult{
		{Name: "low", TaskSuccess: 0.84, FalseAcceptRate: 0.008, IncompleteRate: 0.002, P95LatencyMS: 650, CostPerVerifiedTask: 0.010},
		{Name: "medium", TaskSuccess: 0.90, FalseAcceptRate: 0.007, IncompleteRate: 0.006, P95LatencyMS: 1300, CostPerVerifiedTask: 0.017},
		{Name: "high", TaskSuccess: 0.92, FalseAcceptRate: 0.006, IncompleteRate: 0.031, P95LatencyMS: 3100, CostPerVerifiedTask: 0.034},
	}

	eligible := make([]ModeResult, 0, len(results))
	for _, result := range results {
		if passes(result, gate) {
			eligible = append(eligible, result)
		}
	}
	if len(eligible) == 0 {
		fmt.Println("route=review")
		return
	}

	sort.Slice(eligible, func(i, j int) bool {
		return eligible[i].CostPerVerifiedTask < eligible[j].CostPerVerifiedTask
	})
	fmt.Printf("route=%s cost_per_verified_task=%.3f\n",
		eligible[0].Name,
		eligible[0].CostPerVerifiedTask,
	)
}

Expected output:

text
route=medium cost_per_verified_task=0.017

The selected mode is valid only for the fixture's task class and policy. Re-run the experiment after changing the model, prompt, tool set, retrieval, output limit, or evaluator.

Common Failure Patterns

Treating high effort as a quality flag

Higher effort may improve one slice and degrade another. Keep the lower-effort baseline and use paired case-level analysis to find which failures actually changed.

Sharing one cap between reasoning and answer without inspection

A request can spend its allowance before producing the required answer. Monitor incomplete reasons and reserve answer space according to the provider contract.

Using a second model as unquestioned verifier

An LLM-as-a-judge can share the candidate's bias, prefer verbosity, or be manipulated by untrusted content. Calibrate it against human labels, randomize order for pairwise tests, and retain deterministic or executable checks.

Routing by surface form

Rules such as “math symbols mean high effort” or “short prompts mean low effort” miss hard factual, safety, and tool-use cases. Route by evaluated task contracts and business risk.

Storing reasoning as privileged evidence

Visible rationales may be incomplete or unfaithful. Anthropic's reasoning faithfulness research shows that models can omit influential hints from their stated reasoning under the studied conditions. Audit inputs, sources, tool calls, policy checks, and effects instead.

Frequently Asked Questions

Is reasoning effort the same as temperature?

No. Effort controls provider-specific inference work; temperature affects sampling on APIs that expose it. Some reasoning model versions restrict sampling parameters. Check the exact model contract rather than assuming the controls are independent or supported.

Can thinking be disabled?

It depends on the model. Some interfaces allow a disabled or minimal mode, while others require reasoning and only expose lower effort. Unsupported combinations can return an error.

Are reasoning tokens part of the context window?

Often they count toward generated output and the model's context accounting, but exact semantics are provider-specific. Inspect usage and incomplete-response fields for the deployed model.

Should a router use model confidence?

Only after calibration against labeled outcomes for the same task and version. Verbal confidence and token probabilities are not automatically calibrated correctness probabilities.

What is the safest default?

Use the provider's supported default only as an experimental starting point. The production default is the least costly mode that passes the task's quality, risk, latency, and recovery gates.

Primary Sources