Controlling reasoning
Most models in the catalogue think before they answer. The thinking is billed
as output tokens and counts against your max_tokens, so it is worth knowing how
to turn it up when you want a better answer and off when you want a cheap one.
You control it with one parameter, in the naming you already use. Tokligence translates it into whatever the model behind your request actually understands — so the same request keeps working if the model moves to a different upstream.
You don't, to make your first call — see the Quickstart. Come back when an answer arrives empty, slower than you expected, or costs more than you expected.
The parameter
Two spellings are accepted. Use whichever your SDK already speaks.
{
"model": "glm-5.2",
"messages": [{ "role": "user", "content": "..." }],
"reasoning": { "enabled": false }
}
{
"model": "glm-5.2",
"messages": [{ "role": "user", "content": "..." }],
"reasoning_effort": "low"
}
| Field | Type | Meaning |
|---|---|---|
reasoning.enabled | boolean | Think, or don't. The one that matters most. |
reasoning.effort | "minimal" | "low" | "medium" | "high" | How hard, where the model has levels. |
reasoning.max_tokens | integer | Token budget for the thinking itself. |
reasoning_effort | string | The same as reasoning.effort, OpenAI's spelling. Implies enabled: true. |
Sending both is allowed; the reasoning object wins, because it is the more
specific statement.
Saying nothing leaves the model's own default in place. We never flip it for you: a model's default thinking behaviour is part of its answers and its price, and changing it silently would change both.
Why you would turn it off
Thinking tokens are output tokens. On the same question, with the reply capped at 200 tokens:
| Output tokens billed | Time | |
|---|---|---|
| Default (thinking on) | 1345 | 23.9 s |
"reasoning": {"enabled": false} | 55 | 2.8 s |
Same answer, in the same amount of prose. The difference is entirely the model thinking out loud on your budget.
If a response comes back with content: "" and finish_reason: "length", the
model spent your whole max_tokens on reasoning and never reached the answer.
Either raise max_tokens well above the thinking budget, or set
"reasoning": {"enabled": false}. A small max_tokens and a thinking model are
a bad pair.
What we send upstream
You do not need this table — it is here so you can see there is no magic, and so you can predict what a model will do.
| Model family | What your reasoning becomes |
|---|---|
| GLM (Zhipu), DeepSeek, Kimi (Moonshot) | thinking: {"type": "enabled" / "disabled"} |
| Qwen | enable_thinking: true / false, plus thinking_budget from reasoning.max_tokens |
| GPT (OpenAI) | reasoning_effort |
| Claude (Anthropic), Gemini | thinking: {"type": "enabled", "budget_tokens": …} |
Two honest notes about the edges:
effortonly reaches models that have levels. GLM and Qwen have no notion of effort — they get "think" or "don't". We do not invent a level for them.- OpenAI has no off switch.
"enabled": falsebecomesreasoning_effort: "minimal", the least that API offers. It is the closest thing available, not a true disable, and you will still be billed for the little it does. - Claude needs a budget to think. If you enable reasoning for a Claude model
without
reasoning.max_tokens, we leave the model's own default alone rather than picking a number — that number is billed, and it is your money.
Vendor-native parameters still work
If you already send a model's own field — thinking, enable_thinking,
thinking_budget, reasoning_effort — it is forwarded untouched, as are any
other parameters we have not modelled. That escape hatch exists so a new upstream
feature is usable through Tokligence the day it ships, before we have wrapped it.
The trade-off is the reason this page recommends the normalized parameter: a vendor-native field is a bet on which vendor is behind the model name today. The normalized one keeps working if that changes.
Reading the thinking
Models that expose their reasoning return it alongside the answer, in the field
the upstream uses (commonly reasoning_content on the message). It is billed
whether or not you read it — the token count is in usage.completion_tokens, and
usage.completion_tokens_details.reasoning_tokens breaks out how much of it was
thinking.
curl https://llm-api.tokligence.ai/v1/chat/completions \
-H "Authorization: Bearer $TOKLIGENCE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "glm-5.2",
"messages": [{"role": "user", "content": "In one sentence: what is a B-tree?"}],
"max_tokens": 200,
"reasoning": {"enabled": false}
}'