Reasoning
Modern models can "think" before answering — generating an internal chain of reasoning. This noticeably improves quality on hard tasks (math, code, multi-step logic) but consumes extra tokens. NordRouter transparently passes through all the standard reasoning controls — nothing special to configure.
How it affects billing
One rule: reasoning tokens are billed as regular output tokens — at the model's output price from the catalog.
- They are already included in
usage.completion_tokens. - You can see them separately in
usage.completion_tokens_details.reasoning_tokens.
"usage": {
"prompt_tokens": 179,
"completion_tokens": 545, // total output — this is what's billed
"completion_tokens_details": {
"reasoning_tokens": 445 // of which, spent on reasoning
}
}Reasoning models cost more than they look
DeepSeek R1, Grok, GLM and other reasoning models think by default — a simple question can cost 5–10× more tokens than the visible text. Compare actual usage, not just the per-token price.
How to control it
Via the reasoning object in the request body (the classic OpenAI reasoning_effort: "low" | "medium" | "high" also works):
curl https://nordrouter.com/v1/chat/completions \
-H "Authorization: Bearer sk-nr-YOUR-KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-sonnet-5",
"max_tokens": 4000,
"reasoning": { "effort": "high" },
"messages": [{ "role": "user", "content": "A hard problem…" }]
}'| Parameter | What it does |
|---|---|
reasoning.effort | Reasoning depth: "low" / "medium" / "high". Lower effort — fewer reasoning tokens, cheaper responses |
reasoning.max_tokens | Token budget for reasoning (Anthropic style). Must be lower than the request's max_tokens |
reasoning.enabled: false | Turn reasoning off (where the model supports it) |
reasoning.exclude: true | Hide the reasoning text from the response. Does not save money — the model still thinks and the tokens are billed |
The reasoning text (unless hidden) is returned in message.reasoning / message.reasoning_details.
Per-model behavior
Verified with live requests through NordRouter:
| Model | Behavior |
|---|---|
anthropic/claude-sonnet-5 | Doesn't reason by default. effort and max_tokens enable thinking, enabled: false genuinely disables it |
anthropic/claude-fable-5 | Thinks adaptively — decides on its own how much. reasoning.* parameters are not supported (returns 400); control depth with output_config: { "effort": "low" | "medium" | "high" } |
openai/gpt-5.4, gpt-5.5 | Reason by default; reasoning_effort scales the depth |
x-ai/grok-4.3 | Reasons by default and generously (hundreds of tokens); effort: "low" cuts it down noticeably |
deepseek/deepseek-r1, z-ai/glm-5.x | Always think: "disabling" only hides the text, reasoning tokens are still billed |
How to save
- Set
effort: "low"on simple tasks for GPT/Grok — quality holds, spend drops severalfold. - Don't enable thinking on Claude without need — sonnet-5 answers without reasoning by default and costs less.
- Cap
max_tokens— it's a hard ceiling on all output, reasoning included. - Don't use
excludeto save money — it only hides the text, it doesn't refund anything. - For routine work pick non-reasoning models (
deepseek-chat-v3.1,gemini-3.5-flash) — check actualusage, not just the price list.