Thinking och reasoning
Senast uppdaterad:
På denna sida
Med thinking resonerar modellen steg för steg innan den svarar. Det ger bättre svar på problem som kräver flera steg, som matematik, logik, felsökning och planering, men tar längre tid och använder fler tokens. Resonemanget levereras separat från svaret, så din applikation kan visa det, logga det eller strunta i det.
Modeller med thinking
Thinking aktiveras med suffixet -thinking på modellnamnet. Aliaset kör samma
modell på samma hårdvara som basmodellen.
| Alias | Basmodell |
|---|---|
qwen3.6:35b-a3b-thinking | qwen3.6:35b-a3b (även qwen3.5:35b-a3b-thinking) |
qwen3.5:9b-thinking | qwen3.5:9b |
Basmodellerna svarar direkt utan resonemang, vilket är snabbast för enkla frågor.
Bara aliasen i tabellen stödjer thinking
gemma4:31b har inget thinking-alias. Ett namn som gemma4:31b-thinking
räknas som okänd modell och besvaras av standardmodellen
(qwen3.6:35b-a3b) utan thinking. Kontrollera model i svaret om du är
osäker på vilken modell som svarade.
Anropa med thinking
curl https://api.staik.se/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-st-your-key" \
-d '{
"model": "qwen3.6:35b-a3b-thinking",
"messages": [{"role": "user", "content": "Vad är 12 * 13?"}],
"max_tokens": 4096
}'Var resonemanget finns i svaret
Resonemanget ligger i fältet reasoning och svaret i content:
{
"model": "qwen3.6:35b-a3b",
"choices": [{
"message": {
"role": "assistant",
"reasoning": "Användaren vill veta 12 * 13. 12 * 13 = 12 * 10 + 12 * 3 = 120 + 36 = 156.",
"content": "12 * 13 = 156"
},
"finish_reason": "stop"
}],
"usage": {
"prompt_tokens": 20,
"completion_tokens": 143,
"total_tokens": 163,
"completion_tokens_details": {"reasoning_tokens": 137}
}
}usage.completion_tokens_details.reasoning_tokens visar hur många av
output-tokens som gick till resonemanget. Reasoning-tokens räknas som
output-tokens i usage och mot din tokengräns.
När du streamar kommer resonemanget först som delta.reasoning-chunks och
därefter svaret som delta.content-chunks:
data: {"choices":[{"delta":{"reasoning":"Användaren vill veta"}}], ...}
data: {"choices":[{"delta":{"reasoning":" 12 * 13."}}], ...}
data: {"choices":[{"delta":{"content":"12 * 13 = 156"}}], ...}
data: [DONE]Fältet heter reasoning, inte reasoning_content
Vissa klienter och äldre exempel läser reasoning_content (DeepSeeks
konvention). staik följer den nyare konventionen och skickar reasoning.
Läser din klient bara reasoning_content ser du inget resonemang, men svaret
i content påverkas inte.
Läsa resonemanget i kod
OpenAI:s SDK:er har inget eget fält för reasoning, men värdet följer med i
svaret och kan läsas direkt:
from openai import OpenAI
client = OpenAI(base_url="https://api.staik.se/v1", api_key="sk-st-your-key")
# Utan streaming
response = client.chat.completions.create(
model="qwen3.6:35b-a3b-thinking",
messages=[{"role": "user", "content": "Vad är 12 * 13?"}],
max_tokens=4096,
)
message = response.choices[0].message
print("Resonemang:", getattr(message, "reasoning", None))
print("Svar:", message.content)
# Med streaming
stream = client.chat.completions.create(
model="qwen3.6:35b-a3b-thinking",
messages=[{"role": "user", "content": "Vad är 12 * 13?"}],
max_tokens=4096,
stream=True,
)
for chunk in stream:
if not chunk.choices:
continue
delta = chunk.choices[0].delta
if getattr(delta, "reasoning", None):
print(delta.reasoning, end="", flush=True) # resonemang
elif delta.content:
print(delta.content, end="", flush=True) # svarI TypeScript saknas reasoning i SDK:ns typer. Läs det med
(message as { reasoning?: string }).reasoning.
Thinking-budget
Resonemanget räknas mot max_tokens. Utan gräns kan modellen resonera tills hela
budgeten är slut och aldrig hinna svara. Särskilt qwen3.5:9b tenderar att
fortsätta dubbelkolla ett svar den redan har.
staik sätter därför automatiskt en thinking-budget på alla thinking-anrop.
När budgeten är nådd avslutar modellen resonemanget och skriver sitt svar, så
att svaret alltid får plats inom max_tokens:
max_tokens | Automatisk thinking-budget | Kvar till svaret |
|---|---|---|
| 1 500 | 988 | 512 |
| 4 096 | 3 072 | 1 024 |
16 384 (standard om du inte anger max_tokens) | 12 288 | 4 096 |
Budgeten är 75 % av max_tokens, men minst 512 tokens (eller halva
max_tokens om det är mindre) reserveras alltid för svaret.
Sätta en egen budget
Skicka thinking_token_budget för att styra budgeten själv. Ditt värde gäller i
stället för det automatiska:
curl https://api.staik.se/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-st-your-key" \
-d '{
"model": "qwen3.5:9b-thinking",
"messages": [{"role": "user", "content": "Planera en tre dagars resa till Göteborg."}],
"max_tokens": 8192,
"thinking_token_budget": 2000
}'I OpenAI:s Python-SDK skickas fält som SDK:n inte känner till via extra_body:
response = client.chat.completions.create(
model="qwen3.5:9b-thinking",
messages=[{"role": "user", "content": "Planera en tre dagars resa till Göteborg."}],
max_tokens=8192,
extra_body={"thinking_token_budget": 2000},
)En låg budget ger snabbare svar med kortare resonemang. En hög budget ger
modellen mer utrymme på svåra problem. Håll budgeten lägre än max_tokens,
annars finns inget utrymme kvar för svaret.
Rekommendationer
- Använd
max_tokenspå minst 4096 för thinking-anrop. Med lägre värden blir både resonemang och svar kortare. - Välj basmodellen för enkla frågor. Thinking gör anropet långsammare och dyrare utan att förbättra svar på faktafrågor eller enkla omskrivningar.
qwen3.6:35b-a3b-thinkingär bäst för svåra problem.qwen3.5:9b-thinkingär snabbare men mindre träffsäker.- Streama om du visar svaret för en användare. Resonemanget kan ta flera sekunder innan det första ordet i svaret kommer.
Om resonemanget saknas
Om modellen trots budgeten inte hinner svara gör staik automatiskt ett nytt
försök utan thinking, så att du alltid får ett svar. Det svaret har då inget
reasoning-fält. Det händer sällan med thinking-budgeten, men din kod bör klara
att reasoning saknas.
Begränsningar
/v1/messages(Anthropic-formatet, till exempel Claude Code) stödjer inte thinking.thinking-parametern ignoreras och thinking-aliasen beter sig som basmodellen. Använd chat completions för thinking.- Resonemanget ska inte skickas tillbaka i konversationshistoriken. Skicka
bara
contentsom assistentens meddelande i nästa anrop.