Ræsonnering og udvidet tænkning
Én parameter — reasoning_effort — styrer udvidet tænkning på tværs af modeller fra OpenAI, Anthropic, Google, Mistral og xAI. Stav oversætter den per inferensleverandør og per leverandørendepunkt og fortæller dig, hvad der blev sendt.
Hver inferensleverandør udformer udvidet tænkning forskelligt: en effort-enum, et tokenbudget eller en til/fra-tilstand. På /v1/chat/completions sender du én parameter, og Stav oversætter den.\n\npython\nresp = client.chat.completions.create(\n model="auto",\n messages=[{"role": "user", "content": "Bevis at √2 er irrational."}],\n reasoning_effort="high",\n)\n\nprint(resp.choices[0].message.content)\nprint(resp.usage.completion_tokens_details.reasoning_tokens)\n\n\n## Parameteren\n\nreasoning_effort er den gældende standard. reasoning og thinking er kaldenavne, enten som en streng eller et objekt med et effort-felt:\n\njson\n{ "reasoning_effort": "high" }\n{ "reasoning": "high" }\n{ "reasoning": { "effort": "high" } }\n{ "thinking": { "effort": "high" } }\n\n\nNiveauer, fra lavest til højest: none, minimal, low, medium, high, xhigh, max. Der ses bort fra store/små bogstaver og omgivende mellemrum.\n\nHvis mere end ét felt er til stede, vinder reasoning_effort, derefter reasoning og til sidst thinking.\n\nEt objekt uden en effort-streng giver en 400-fejl. Dette inkluderer Anthropics eget format og til/fra-flag:\n\njson\n{ "thinking": { "type": "enabled", "budget_tokens": 4096 } }\n{ "thinking": { "type": "disabled" } }\n{ "reasoning": { "enabled": false } }\n\n\njson\n{\n "error": {\n "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.",\n "type": "invalid_request_error",\n "param": "reasoning_effort",\n "code": "invalid_value"\n }\n}\n\n\n### Sådan slår du ræsonnering fra\n\nSend reasoning_effort: "none". Hvis feltet udelades, beholder modellen sin egen standard, og visse modeller ræsonnerer som standard. none kræver ikke en model med ræsonneringsegenskaber: på en model, der ikke kan ræsonnere, accepteres det, og intet sendes videre.\n\n## Hvad hver inferensleverandør modtager\n\n| Inferensleverandør | Oversættelse |\n| --- | --- |\n| OpenAI, xAI og andre OpenAI-kompatible leverandører | reasoning_effort sendes videre som den er |\n| Google (Gemini) | reasoning_effort; minimal → low, xhigh og max → high |\n| Anthropic, nyere modeller (Opus 4.7+, Opus 5, Sonnet 5) | thinking: {type: "adaptive"} plus output_config.effort; minimal → low |\n| Anthropic, tidligere modeller | thinking: {type: "enabled", budget_tokens: N} med max_tokens tilpasset i størrelse |\n| Mistral (Magistral) | prompt_mode: "reasoning". Der er intet niveau at variere. none sender prompt_mode: null |\n\nHos Anthropic sender none slet ingen thinking-blok.\n\n### Anthropic-budgettet
For modeller, der bruger et tokenbudget:
| Niveau | budget_tokens |
|---|---|
minimal | 1.024 |
low | 2.048 |
medium | 8.192 |
high | 16.384 |
xhigh | 32.768 |
max | 65.536 |
Anthropic kræver, at budgettet er under max_tokens. Stav:
- sætter
max_tokenstil budget + 512, hvis du ikke selv har sat en værdi - reducerer ellers budgettet for at efterlade 512 tokens til svaret
- hæver
max_tokens, hvis selv minimummet på 1.024 ikke kan være der
Mens ræsonnering er slået til, afviser Anthropic brugerdefinerede værdier for temperature og top_p, så Stav sender dem ikke.
Niveauer oversættes per leverandørendepunkt
Ikke alle endepunkter accepterer alle niveauer, og én model kan acceptere forskellige niveauer på forskellige API'er. Stav registrerer per leverandørendepunkt og API, hvilke niveauer der accepteres.
Hvis det betjenende endepunkt ikke accepterer dit niveau, sender Stav det nærmeste accepterede niveau. Ved lighed vælges det lavere niveau, så en forespørgsel aldrig bliver dyrere på grund af afrunding. Hvis der ikke er registreret en liste for endepunktet, sendes dit niveau uændret igennem.
Det niveau, der faktisk blev sendt, returneres i en header:
X-Stav-Reasoning-Effort: medium
Det er værdien efter begge trin — endepunktstrinnet og leverandøroversættelsen — eller fixed for Mistral. Den samme værdi findes på forespørgslen under Dit arbejdsområde → Overvåg → Forespørgselslog. Ved streaming beskriver headeren det første endepunkt, der blev forsøgt; hvis et automatisk skift flytter forespørgslen, indeholder loggen den endelige værdi.
Hvad der returneres på /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 afcompletion_tokens, ikke noget ekstra. Her blev 1.180 brugt på at tænke og 130 på svaret.completion_tokens_detailsvises kun, når der er brugt ræsonneringstokens.reasoning_contentindeholder ræsonneringsteksten, når leverandøren returnerer den separat. Mange gør ikke (OpenAI gør ikke), og så udelades feltet. Ved streaming ankommer det somdelta.reasoning_contentog blandes aldrig ind icontent.prompt_tokens_details.cached_tokensvises, når en del af prompten blev læst fra en cache.include_reasoningafvises med en400.
Brug ved streaming
Antallet af tokens ankommer kun i en afsluttende chunk, hvis du beder om det:
stream = client.chat.completions.create(
model="auto",
messages=[...],
reasoning_effort="medium",
stream=True,
stream_options={"include_usage": True},
)
Uden include_usage rapporterer en stream ingen tokens.
/v1/messages
claude-*-modeller sendes videre til Anthropic. Den indbyggede kontrakt gælder: thinking i forespørgslen, thinking-blokke i svaret og Anthropics usage-objekt som returneret. To Stav-tilføjelser:
output_config.effortoversættes per endepunkt som ethvert andet niveau.- En
reasoning_effortpå øverste niveau omdannes til Anthropics indbyggede format før videresendelse.
msg = anthropic_client.messages.create(
model="anthropic/claude-sonnet-4-5",
max_tokens=8192,
thinking={"type": "enabled", "budget_tokens": 4096},
messages=[{"role": "user", "content": "Planlæg en migrering fra Postgres 14 til 17."}],
)
for block in msg.content:
if block.type == "thinking":
print("[tænker]", block.thinking[:
Andre modeller (herunder auto, når den vælger en model, der ikke er fra Claude) oversættes til chat-stien. Dit thinking-objekt bliver til et niveau: output_config.effort bruges som det er; budget_tokens placeres i det højeste niveau, hvis budget det når, op til high; type: "disabled" betyder ingen ræsonnering. På denne sti har svaret kun text- og tool_use-blokke — ingen thinking-blokke — og usage har input_tokens og output_tokens.
/v1/responses
reasoning.effort er styringen. OpenAI-modeller sendes videre til OpenAIs Responses-API som de er. Andre modeller oversættes til chat-stien; her rapporterer usage.output_tokens_details.reasoning_tokens ræsonneringstokens, og ræsonneringselementer og krypteret ræsonnering returneres ikke.
Hvilke modeller kan ræsonnere
En flag-indstilling per model, bekræftet ved test frem for gæt ud fra navne:
info = client.models.retrieve("anthropic/claude-sonnet-4-5")
info.model_extra["stav_supports_thinking"] # True
Det findes også som extended_thinking i stav_capabilities.
Hvis du nævner en model, der ikke kan ræsonnere, med et andet niveau end none, fjernes niveauet: forespørgslen besvares, og X-Stav-Dropped-Params navngiver det felt, du sendte (reasoning_effort, reasoning eller thinking). Der kommer ingen X-Stav-Reasoning-Effort-header retur, da intet niveau blev sendt. Agenter, der sender et standardniveau med hver forespørgsel, fortsætter med at fungere på alle modeller.
Ræsonnering og routeren
Med auto eller en router vil et ræsonneringsniveau andet end none:
- filtrere kandidatgruppen til modeller med ræsonneringsegenskaber før scoring, så kandidater til automatisk skift også kan ræsonnere
- skalere de forventede uddata, der bruges til pris og hastighed:
minimal×1,25,low×2,medium×4,high×6, mere forxhighogmax, begrænset afmax_tokens
Hvis intet kvalificeret kan ræsonnere, får du en fejl i stedet for en lydløs nedgradering.
Når du ikke sender et niveau, kan routeren vælge et for den model, den finder – ud fra de niveauer, modellens leverandørendepunkt accepterer, og aldrig over modellens egen standard, medmindre din router tillader det. Den vælger mindre tænkning, når forespørgslen er kort, eller max_tokens ikke giver plads til det, så en ræsonneringsmodel ikke bruger hele grænsen for uddata på at tænke og intet svarer. Et niveau, du selv sender, bliver aldrig ændret. Svaret angiver, hvilket niveau der blev sendt (X-Stav-Reasoning-Effort), og forespørgselsloggen viser, hvem der valgte det: dig, routeren eller leverandørens standard.
Hver router har en indstilling for ræsonnering: Auto (routeren vælger, højst modellens standard), Aldrig (ingen ræsonnering, medmindre du beder om det) eller Højst et niveau; samt en kontakt til at lade routeren gå over modellens standard.
Forbrug
Ræsonneringstokens er uddata-tokens og trækkes fra tegnebogen som uddata. Hvor et endepunkt har en særskilt betinget pris for ræsonnering, bruges denne pris.
Se ræsonneringsniveauet som en knap til at styre forbruget. high til et svært problem kan være det værd; high til et resumé gør kun regningen større uden grund. Et almindeligt 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 vælger derefter en billig model til den nemme vej og en ræsonneringsmodel til den svære, fra samme sted i koden. Test på dine egne opgaver, før du aktiverer ræsonnering overalt.