Resonnering og utvidet tenkning
Én parameter – reasoning_effort – styrer utvidet tenkning på tvers av modeller fra OpenAI, Anthropic, Google, Mistral og xAI. Stav oversetter den per leverandør og per leverandørendepunkt, og viser deg hva som ble sendt.
Hver leverandør utformer utvidet tenkning på sin måte: et resonneringsnivå som enum, et tokenbudsjett eller en på/av-modus. På /v1/chat/completions sender du én parameter, og Stav oversetter den.
resp = client.chat.completions.create(
model="auto",
messages=[{"role": "user", "content": "Prove that √2 is irrational."}],
reasoning_effort="high",
)
print(resp.choices[0].message.content)
print(resp.usage.completion_tokens_details.reasoning_tokens)
Parameteren
reasoning_effort er den kanoniske formen. reasoning og thinking er aliaser, enten som en streng eller som et objekt med et effort-felt:
{ "reasoning_effort": "high" }
{ "reasoning": "high" }
{ "reasoning": { "effort": "high" } }
{ "thinking": { "effort": "high" } }
Nivåer, fra lavest til høyest: none, minimal, low, medium, high, xhigh, max. Store/små bokstaver og mellomrom rundt verdien ignoreres.
Er mer enn ett felt til stede, vinner reasoning_effort, deretter reasoning, deretter thinking.
Et objekt uten et effort-felt av typen streng gir 400. Det gjelder Anthropics opprinnelige format og på/av-flagg:
{ "thinking": { "type": "enabled", "budget_tokens": 4096 } }
{ "thinking": { "type": "disabled" } }
{ "reasoning": { "enabled": false } }
{
"error": {
"message": "'thinking' must be one of ['none', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max'], or an object with a string 'effort' field, on /v1/chat/completions. Use 'reasoning_effort' for the simplest form.",
"type": "invalid_request_error",
"param": "reasoning_effort",
"code": "invalid_value"
}
}
Slå av resonnering
Send reasoning_effort: "none". Utelater du feltet, beholder modellen sin egen standard – og noen modeller resonnerer som standard. none krever ikke en resonneringskapabel modell: på en modell som ikke kan resonnere, aksepteres verdien uten at noe videresendes.
Hva hver leverandør mottar
| Leverandør | Oversettelse |
|---|---|
| OpenAI, xAI og andre OpenAI-kompatible leverandører | reasoning_effort videresendes uendret |
| Google (Gemini) | reasoning_effort; minimal → low, xhigh og max → high |
| Anthropic, nyere modeller (Opus 4.7+, Opus 5, Sonnet 5) | thinking: {type: "adaptive"} pluss output_config.effort; minimal → low |
| Anthropic, eldre modeller | thinking: {type: "enabled", budget_tokens: N} med max_tokens tilpasset til å passe |
| Mistral (Magistral) | prompt_mode: "reasoning". Det finnes ingen nivåer å variere. none sender prompt_mode: null |
For Anthropic sender none ingen thinking-blokk i det hele tatt.
Anthropic-budsjettet
For modeller som tar et tokenbudsjett:
| Nivå | budget_tokens |
|---|---|
minimal | 1 024 |
low | 2 048 |
medium | 8 192 |
high | 16 384 |
xhigh | 32 768 |
max | 65 536 |
Anthropic krever at budsjettet er lavere enn max_tokens. Stav:
- setter
max_tokenstil budsjett + 512 når du ikke har angitt en verdi - krymper ellers budsjettet slik at det er 512 token igjen til svaret
- øker
max_tokenshvis selv minimumet på 1 024 ikke får plass
Når resonnering er på, avviser Anthropic egendefinert temperature og top_p, så Stav sender dem ikke.
Nivåer oversettes per leverandørendepunkt
Ikke alle endepunkter godtar alle nivåer, og én modell kan godta ulike nivåer på ulike API-er. Stav registrerer, per leverandørendepunkt og overflate, hvilke nivåer som godtas.
Hvis endepunktet som betjener forespørselen ikke godtar nivået ditt, sender Stav nærmeste godtatte nivå. Ved uavgjort velges det lavere nivået, slik at en forespørsel aldri blir dyrere ved avrunding. Hvis ingen liste er registrert for endepunktet, sendes nivået ditt uendret.
Nivået som faktisk sendes, returneres i en header:
X-Stav-Reasoning-Effort: medium
Dette er verdien etter begge steg – endepunktsteget og leverandøroversettelsen – eller fixed for Mistral. Den samme verdien finnes på forespørselen under Arbeidsområdet ditt → Overvåk → Forespørselslogg. Ved strømming beskriver headeren det første endepunktet som ble forsøkt; hvis reserve-mekanismen flytter forespørselen, har loggen den endelige verdien.
Hva som returneres fra /v1/chat/completions
{
"choices": [{
"message": {
"role": "assistant",
"content": "…",
"reasoning_content": "…"
}
}],
"usage": {
"prompt_tokens": 42,
"completion_tokens": 1310,
"total_tokens": 1352,
"completion_tokens_details": { "reasoning_tokens": 1180 }
}
}
reasoning_tokenser en del avcompletion_tokens, ikke ekstra. Her gikk 1 180 til resonnering og 130 til svaret.completion_tokens_detailsvises bare når resonneringstoken ble brukt.reasoning_contentinneholder resonneringsteksten når leverandøren returnerer den separat. Mange gjør det ikke (OpenAI gjør det ikke), og da er feltet fraværende. Ved strømming ankommer den somdelta.reasoning_content, aldri blandet inn icontent.prompt_tokens_details.cached_tokensvises når deler av instruksen ble lest fra en buffer.include_reasoningavvises med en400.### Strømming av bruksdata
Tokentall leveres bare i en avsluttende del hvis du ber om det:
stream = client.chat.completions.create(
model="auto",
messages=[...],
reasoning_effort="medium",
stream=True,
stream_options={"include_usage": True},
)
Uten include_usage rapporterer en strøm ingen tokentall.
/v1/messages
claude-*-modeller videresendes til Anthropic. Den innebygde kontrakten gjelder: thinking i forespørselen, thinking-blokker i svaret, Anthropics usage-objekt slik det returneres. To Stav-tillegg:
output_config.effortoversettes per endepunkt som alle andre nivåer.- Et
reasoning_effortpå toppnivå konverteres til Anthropics innebygde format før videresending.
msg = anthropic_client.messages.create(
model="anthropic/claude-sonnet-4-5",
max_tokens=8192,
thinking={"type": "enabled", "budget_tokens": 4096},
messages=[{"role": "user", "content": "Plan a migration from Postgres 14 to 17."}],
)
for block in msg.content:
if block.type == "thinking":
print("[thinking]", block.thinking[:
Andre modeller (inkludert auto når den velger en modell som ikke er Claude) oversettes til chat-banen. thinking-objektet ditt blir et nivå: output_config.effort brukes som det er; budget_tokens plasseres i det høyeste nivået budsjettet rekker til, opptil high; type: "disabled" betyr ingen resonnering. På denne banen har svaret bare text- og tool_use-blokker – ingen thinking-blokker – og usage har input_tokens og output_tokens.
/v1/responses
reasoning.effort er styringsparameteren. OpenAI-modeller videresendes til OpenAIs Responses API som de er. Andre modeller oversettes til chat-banen; der rapporterer usage.output_tokens_details.reasoning_tokens resonneringstoken, og resonneringselementer og kryptert resonnering returneres ikke.
Hvilke modeller kan resonnere
Et flagg per modell, bekreftet ved sondering – ikke gjettet fra navn:
info = client.models.retrieve("anthropic/claude-sonnet-4-5")
info.model_extra["stav_supports_thinking"] # True
Det finnes også som extended_thinking i stav_capabilities.
Oppgir du en modell som ikke kan resonnere, med et annet nivå enn none, utelates nivået: forespørselen besvares, og X-Stav-Dropped-Params angir feltet du sendte (reasoning_effort, reasoning eller thinking). Ingen X-Stav-Reasoning-Effort-header returneres, fordi ingen nivå ble sendt. Agenter som sender et standardnivå med hver forespørsel, fortsetter å fungere med alle modeller.
Resonnering og routeren
Med auto eller en router, og et resonneringsnivå som ikke er none:
- filtreres utvalget til modeller med resonneringsevne før skåring, slik at reservekandidater også kan resonnere
- skaleres forventet utdata som brukes for kostnad og hastighet:
minimal×1,25,low×2,medium×4,high×6, mer forxhighogmax, begrenset avmax_tokens
Hvis ingen kvalifiserte modeller kan resonnere, får du en feil – ikke en stille nedgradering.
Når du ikke sender et nivå, kan routeren velge ett for modellen den velger – fra nivåene som modellens leverandørendepunkt godtar, og aldri over modellens eget standardnivå med mindre routeren din tillater det. Den velger mindre tenking når forespørselen er kort eller max_tokens ikke gir rom for det, slik at en resonneringsmodell ikke bruker hele utdatagrensen på å tenke uten å svare. Et nivå du sender, endres aldri. Svaret oppgir hvilket nivå som ble sendt (X-Stav-Reasoning-Effort), og forespørselsloggen sier hvem som valgte det: du, routeren eller leverandørens standard.
Hver router har en Resonnering-innstilling: Auto (routeren velger, maksimalt modellens standard), Aldri (ingen resonnering med mindre du ber om det), eller Maksimalt et nivå; og en bryter for å la routeren gå over modellens standard.
Kostnad
Resonneringstoken er utdatatoken og faktureres som utdata. Der et endepunkt har en egen resonneringspris, brukes den prisen.
Betrakt resonneringsnivået som en kostnadsskratt. high på et vanskelig problem kan være verdt det; high på et sammendrag mangedobler regningen uten nytte. Et vanlig mønster:
def complete(prompt, hard=False):
kwargs = {"reasoning_effort": "high"} if hard else {}
return client.chat.completions.create(
model="auto",
messages=[{"role": "user", "content": prompt}],
**kwargs,
)
Routeren velger da en rimelig modell for den enkle veien og en resonneringsmodell for den vanskelige – fra samme kallsted. Mål på dine egne oppgaver før du slår på resonnering overalt.