Reasoning
With reasoning on, the model works through a problem step by step before it writes its answer. This helps with maths, planning, multi-step analysis, tricky code and long tool sequences. You choose how much effort to spend, and you can get the reasoning back as a summary.
Today reasoning is turned off for every API request.
When to use it
| Turn it on for | Leave it off for |
|---|---|
| Multi-step maths and logic | Short replies and chit-chat |
| Planning an agent’s next steps | Classification and extraction |
| Debugging and code review | Anything where speed matters most |
| Comparing many options against rules | High-volume, low-margin traffic |
Endpoint and auth
POST https://app.syntic.ai/v1/chat/completions (and Messages), Authorization: Bearer sk_live_.... The model needs capabilities.reasoning: true.
Request fields
| Field | Type | Details |
|---|---|---|
reasoning.effort | string | low, medium or high. A simple dial. |
reasoning.budget_tokens | integer | An exact cap on reasoning tokens, 1,024 or more. Use instead of effort, not with it. |
reasoning.summary | string | none (default), auto or detailed. Whether to return a readable summary of the reasoning. |
effort | Typical reasoning tokens |
|---|---|
low | up to about 2,000 |
medium | up to about 8,000 |
high | up to about 32,000 |
Reasoning tokens count towards max_tokens, so leave room for the answer: max_tokens must be larger than budget_tokens. Sampling settings are fixed while reasoning is on (see Sampling).
Response
{
"choices": [{
"index": 0,
"message": {
"role": "assistant",
"content": "Route B is cheaper by £42 per week.",
"reasoning": {
"summary": "Compared fuel and driver hours for both routes across five delivery days...",
"encrypted": "rsn_7dK2..."
}
},
"finish_reason": "stop"
}],
"usage": {
"prompt_tokens": 640,
"completion_tokens": 3210,
"total_tokens": 3850,
"completion_tokens_details": { "reasoning_tokens": 3100 }
}
}| Field | Description |
|---|---|
message.reasoning.summary | Present when summary is not none. A readable account, not the full reasoning. |
message.reasoning.encrypted | An opaque value that lets the model pick up its earlier reasoning. Send it back unchanged. |
usage.completion_tokens_details.reasoning_tokens | Reasoning tokens, billed as output. |
On Messages the same data is a reasoning content block.
Streaming
Reasoning streams before the answer in its own delta field:
data: {"choices":[{"index":0,"delta":{"reasoning":{"summary":"Compared fuel and"}}}]}
data: {"choices":[{"index":0,"delta":{"content":"Route B"}}]}Keep-alive comments are sent while the model reasons without a summary, so the connection stays open.
Reasoning across tool calls
When a reply both reasons and calls tools, return the assistant message including its reasoning object in the next request. The model then continues the same line of thought after reading the tool results. Dropping it does not cause an error, but the model starts its reasoning again, which costs more and gives worse results. Editing it returns 400 invalid_reasoning_block.
Examples
curl https://app.syntic.ai/v1/chat/completions \
-H "Authorization: Bearer $SYNTIC_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "Amara Deep",
"stream": false,
"max_tokens": 12000,
"reasoning": { "effort": "medium", "summary": "auto" },
"messages": [{ "role": "user", "content": "Route A: 182 km, 2 drivers. Route B: 205 km, 1 driver. Diesel £1.48/l at 9 l/100km, drivers £16/h, average 60 km/h, 5 days a week. Which is cheaper per week?" }]
}'Errors
| Status | code | param | Cause |
|---|---|---|---|
| 400 | reasoning_not_supported | model | The model cannot reason. |
| 400 | conflicting_parameters | reasoning | Both effort and budget_tokens. |
| 400 | budget_too_small | reasoning.budget_tokens | Below 1,024. |
| 400 | max_tokens_too_small | max_tokens | Not larger than budget_tokens. |
| 400 | invalid_reasoning_block | messages[i].reasoning | A returned reasoning value was changed. |
Cost
Reasoning tokens are billed at the output rate. A high effort answer can cost ten times a plain one, so start at low and raise it only where quality improves.
Build notes for the platform team
- Reasoning is forced off today because tool loops broke when reasoning content was dropped between turns. The fix is carrying
reasoning.encryptedback into assistant turns and passing it to the model. encryptedis signed with a Syntic key and bound to the org, so it cannot be forged or moved between organisations.- Summaries are produced by Syntic and must not expose upstream provider details.