Reasoning Models
Access models that show their thinking process via reasoning_content, with full control over whether reasoning is included in responses.
Overview
Reasoning models generate a chain-of-thought before producing their final answer. Oxlo standardizes this across all providers - whether the model uses a native reasoning_content field or <think> tags, you always receive a consistent reasoning_content field in the API response.
Key Feature: Oxlo automatically extracts <think>...</think> tags from model outputs and normalizes them into the reasoning_content field. The content field always contains only the final answer with thinking tags stripped.
Supported Models
| Model | Reasoning | Tool Calling | Notes |
|---|---|---|---|
| deepseek-r1-70b | Uses <think> tags | ||
| deepseek-r1-8b | Lightweight reasoning | ||
| kimi-k2.6 | Native reasoning_content + tools | ||
| gpt-oss-120b | Open source agentic reasoning | ||
| kimi-k2.5 | Balanced reasoning | ||
| qwen-3-32b | Uses <think> tags in thinking mode | ||
| qwen-3-coder-30b | Code-specialized reasoning | ||
| minimax-m2.5 | Coding and agentic tool use |
The include_reasoning Parameter
Control whether the model's thinking process is included in responses. This parameter is available on all models - it has no effect on non-reasoning models.
| Value | Behavior |
|---|---|
| true | Default. The response includes both content (final answer) and reasoning_content (thinking process). |
| false | Only content is populated. reasoning_content is null. Use this for cleaner output when you don't need the thinking chain. |
Examples
With Reasoning (Default)
from openai import OpenAI
client = OpenAI(
base_url="https://api.oxlo.ai/v1",
api_key="YOUR_API_KEY"
)
response = client.chat.completions.create(
model="deepseek-r1-70b",
messages=[{"role": "user", "content": "What is 25 * 37?"}],
max_tokens=1024,
# include_reasoning=True # This is the default
)
msg = response.choices[0].message
print("Thinking:", msg.reasoning_content)
# "Let me calculate 25 * 37.
# 25 * 37 = 25 * (40 - 3) = 1000 - 75 = 925"
print("Answer:", msg.content)
# "25 × 37 = 925"
Without Reasoning (Clean Output)
response = client.chat.completions.create(
model="deepseek-r1-70b",
messages=[{"role": "user", "content": "What is 25 * 37?"}],
max_tokens=1024,
include_reasoning=False # Omit thinking content
)
msg = response.choices[0].message
print(msg.reasoning_content) # None
print(msg.content) # "25 × 37 = 925"
cURL Example
# Without reasoning - cleaner JSON response
curl https://api.oxlo.ai/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "kimi-k2.6",
"messages": [{"role": "user", "content": "Explain quantum entanglement"}],
"include_reasoning": false,
"max_tokens": 1024
}'How It Works
Different models express their reasoning in different ways. Oxlo normalizes all of them into a consistent format:
| Model Format | Oxlo Normalization |
|---|---|
Native reasoning_content field (Kimi K2.6) | Passed through as-is |
<think>...</think> tags in content (DeepSeek R1, Qwen 3) | Tags extracted → reasoning_content. Clean text → content. |
Streaming: When streaming is enabled, reasoning_content is delivered in delta.reasoning_content chunks before the main content begins. Set include_reasoning: false to skip these chunks entirely.