Building

Reasoning effort

reasoning_effort tells the model how much thinking to do before it answers. More effort means better answers on hard problems, and a bigger bill — thinking tokens are output tokens.

The levels#

ValueUse it for
noneNo thinking. Fastest and cheapest.
minimalA moment of consideration. Simple multi-step questions.
lowEveryday reasoning — comparisons, short derivations.
mediumThe sensible default when you know a question is not trivial.
highGenuinely hard problems: proofs, tricky debugging, planning.
xhighThe most we will let a model think. Slow and expensive.

max is accepted as a synonym for xhigh.

Bala has no reasoning levels

upfyn-bala reports an empty supported_efforts list. Yuva and Rishi support all six. Read the list from GET /v1/models rather than assuming.

Using it#

response = client.chat.completions.create(
model="upfyn-rishi",
messages=[{"role": "user", "content": "Prove that sqrt(2) is irrational."}],
reasoning_effort="high",
max_tokens=8000, # leave room: the budget is taken out of this
)

Effort and max_tokens interact#

On Rishi, effort becomes a thinking-token budget that is taken out of the same allowance as the answer. The gateway reserves 512 tokens of headroom so a model cannot think itself out of room to reply.

EffortThinking budget on Rishi
minimal1,024 tokens
low2,048
medium4,096
high8,192
xhigh16,384

Too small a max_tokens silently drops the thinking

If max_tokens cannot fit the budget plus headroom, the reasoning request is dropped rather than the call failing. Ask for high with max_tokens: 2000 and you will get an ordinary answer at ordinary quality. Give the model room.

On the other models the six levels are mapped onto the upstream’s own three-rung ladder, so xhigh and high can land on the same setting. The value is never ignored — it is translated.

What it costs you#

Thinking tokens appear in completion_tokens_details.reasoning_tokens and are billed at the normal output rate.

Usage on a high-effort call
"usage": {
"prompt_tokens": 24,
"completion_tokens": 1840,
"total_tokens": 1864,
"completion_tokens_details": {
"reasoning_tokens": 1602 // thinking, billed like any other output token
}
}
  • Start at medium and move up only when you can see the answers are wrong.
  • Do not set a high effort on a classification or extraction task — there is nothing to think about, and you pay for it anyway.
  • Watch reasoning_tokens in your logs before rolling a higher effort out everywhere.

One thing that will 400#

Sending both reasoning_effort and a nested reasoning.effort with different values is rejected with unsupported_parameter rather than one silently winning. Pick one.

Fast mode is a different dial

service_tier: "priority" asks for faster scheduling, not less thinking — but no Upfyn model offers a priority tier today, so none advertises Fast in /api.json. When a model's upstream does support it, the catalogue will say so; Fast mode will never swap in a smaller model.