Overview
Reasoning is the deeper pipeline. It gathers evidence first, then composes the final answer from the collected sources. Use it when the question needs chained inference, comparison across sources, or a defensible position rather than a quick reply.
Reasoning supports the same streaming and citation surface as Instant. Output sizes can be twice as large to accommodate longer arguments.
Endpoint
POST https://evaesi.dev/api/v1/responsesPass "model": "reasoning" in the JSON body to route through this surface.
When To Use Reasoning vs Instant
| Question shape | Pick |
|---|---|
| Casual chat, definitions, short factual lookups | instant |
| News summary with citations | instant with web_search: true |
| Multi-step analysis or argumentation | reasoning |
| Synthesis across multiple sources | reasoning |
| "Why" questions requiring chained inference | reasoning |
Limits
| Field | Value |
|---|---|
| Max input rungs | 100,000 |
| Max output rungs | 64,000 |
| Context window | 4,096 model bytes (billing rungs are separate: 4,096 input bytes meter as 5,734 rungs here) |
| Streaming | Yes |
| Batch | No. The route is mounted but returns 503 EVA_UNAVAILABLE |
| Tools | No |
Billing
Reasoning is billed at 1.4× the Instant rate on both input and output rungs. The multiplier is applied server-side before any usage row is written, so the rungs reported on usage and on the x-evaesi-*-rungs headers already include the multiplier.
Example: a 100-byte prompt that produces 500 bytes of output charges 140 input rungs and 700 output rungs. A maximal 100,000-byte prompt meters as 140,000 input rungs.
The request
Same JSON shape as Instant. The web_search flag is accepted but the evidence-gather stage runs whenever the underlying pipeline determines it is needed.
| Field | Type | Required | Description |
|---|---|---|---|
prompt | string | Yes | Prompt text. Max 100,000 bytes. |
model | string | Yes | Pass "reasoning" to route here. |
max_output_rungs | u64? | No | Output cap, validated against the model's 64,000 limit (400 INVALID_REQUEST above it). Falls back to 64,000. |
stream | bool? | No | Server-sent event streaming. |
Response
{
"request_id": "req_e201...",
"content": "...",
"sources": [
{
"url": "https://example.org/report",
"domain": "example.org",
"title": "Example report",
"tier": "t1_authoritative",
"retrieved_at": "2026-05-12T09:00:00Z",
"snippet": "Quoted evidence...",
"stance": "supports"
}
],
"sources_url": "/api/v1/sources/req_e201...",
"evidence_verdict": "supported",
"usage": {
"input_rungs": 168,
"output_rungs": 980,
"total_rungs": 1148
},
"model": "reasoning"
}Notice 168 input rungs on a 120-byte prompt, that is the 1.4× multiplier showing up on the reported usage.
Examples
cURL
curl -X POST https://evaesi.dev/api/v1/responses \
-H "Authorization: Bearer esi_dev_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "Compare the 2024 and 2026 UK energy policy reforms.",
"model": "reasoning",
"max_output_rungs": 2048
}'Python
import requests
response = requests.post(
"https://evaesi.dev/api/v1/responses",
headers={"Authorization": "Bearer esi_dev_YOUR_KEY"},
json={
"prompt": "Compare the 2024 and 2026 UK energy policy reforms.",
"model": "reasoning",
"max_output_rungs": 2048,
},
)
data = response.json()
print(data["content"])
print(f"sources cited: {len(data['sources'])}")
print(f"verdict: {data.get('evidence_verdict')}")JavaScript
const response = await fetch("https://evaesi.dev/api/v1/responses", {
method: "POST",
headers: {
"Authorization": "Bearer esi_dev_YOUR_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
prompt: "Compare the 2024 and 2026 UK energy policy reforms.",
model: "reasoning",
max_output_rungs: 2048,
}),
});
const data = await response.json();
console.log(data.content);
console.log(`sources: ${data.sources.length}, verdict: ${data.evidence_verdict}`);