Skip to content

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.
json
"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):

bash
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…" }]
  }'
ParameterWhat it does
reasoning.effortReasoning depth: "low" / "medium" / "high". Lower effort — fewer reasoning tokens, cheaper responses
reasoning.max_tokensToken budget for reasoning (Anthropic style). Must be lower than the request's max_tokens
reasoning.enabled: falseTurn reasoning off (where the model supports it)
reasoning.exclude: trueHide 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:

ModelBehavior
anthropic/claude-sonnet-5Doesn't reason by default. effort and max_tokens enable thinking, enabled: false genuinely disables it
anthropic/claude-fable-5Thinks 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.5Reason by default; reasoning_effort scales the depth
x-ai/grok-4.3Reasons by default and generously (hundreds of tokens); effort: "low" cuts it down noticeably
deepseek/deepseek-r1, z-ai/glm-5.xAlways think: "disabling" only hides the text, reasoning tokens are still billed

How to save

  1. Set effort: "low" on simple tasks for GPT/Grok — quality holds, spend drops severalfold.
  2. Don't enable thinking on Claude without need — sonnet-5 answers without reasoning by default and costs less.
  3. Cap max_tokens — it's a hard ceiling on all output, reasoning included.
  4. Don't use exclude to save money — it only hides the text, it doesn't refund anything.
  5. For routine work pick non-reasoning models (deepseek-chat-v3.1, gemini-3.5-flash) — check actual usage, not just the price list.