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.

AliasBasmodell
qwen3.6:35b-a3b-thinkingqwen3.6:35b-a3b (även qwen3.5:35b-a3b-thinking)
qwen3.5:9b-thinkingqwen3.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

bash
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:

json
{
  "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:

text
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:

python
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)     # svar

I 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_tokensAutomatisk thinking-budgetKvar till svaret
1 500988512
4 0963 0721 024
16 384 (standard om du inte anger max_tokens)12 2884 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:

bash
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:

python
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_tokens på 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 content som assistentens meddelande i nästa anrop.