# Reasoning

https://modelportal.ai/docs/reasoning

Models with reasoning (thinking) let you control how long they think and whether the thinking comes back. Each protocol's native parameters work directly, and OpenAI Chat also accepts one unified parameter across models.

| Parameter | Protocol | Example |
| --- | --- | --- |
| Unified `reasoning` | OpenAI Chat (OpenRouter-compatible) | `"reasoning": {"effort": "high"}`, `"reasoning": {"max_tokens": 4096}`, `"reasoning": {"exclude": true}` |
| `reasoning_effort` | OpenAI | `"reasoning_effort": "low"` |
| `thinking` | Anthropic | `"thinking": {"type": "enabled", "budget_tokens": 4096}` |
| `thinkingConfig` | Gemini | `"generationConfig": {"thinkingConfig": {"thinkingBudget": 4096}}` |

```bash
curl https://modelportal.ai/v1/chat/completions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "MODEL_ID", "reasoning": {"effort": "medium"}, "messages": [{"role": "user", "content": "Prove that the square root of 2 is irrational"}]}'
```

## How the platform handles it

- The unified parameter is translated for the serving endpoint's upstream: OpenAI `reasoning_effort`, Anthropic `thinking.budget_tokens`, Gemini `thinkingConfig`.
- `thinking.budget_tokens` maps to a level: up to 512 is minimal, up to 1024 low, up to 8192 medium, up to 24576 high, and anything above is xhigh.
- A level the upstream rejects becomes the next higher accepted level, or its highest one. If the model cannot turn reasoning off, asking for it returns 400 `unsupported_parameter`. Each model's level table is in the Reasoning effort section of its page, and rewritten calls are flagged in usage records.
- With `"exclude": true` the platform strips `reasoning_content`, `reasoning` and `reasoning_details` from the response, but reasoning tokens are still billed.
- Reasoning tokens count as output tokens at the output price; they are not charged twice.
