skip to content
conifer
Reasoning effort

CONIFER · DOCS

SDK

Reasoning effort

One reasoning_effort field, translated to each provider's dial. The measured support matrix: what serves, what the gateway snaps, what refuses.


Each provider has its own dial: OpenAI reasoning_effort, Anthropic an effort config, Gemini a token-denominated thinking budget, GLM three fixed tiers, DeepSeek a model swap. Conifer takes the OpenAI-shaped field and translates per provider:

terminal
curl https://api.conifer.build/v1/chat/completions \
  -H "authorization: Bearer $CONIFER_API_KEY" \
  -H "content-type: application/json" \
  -d '{
    "model": "glm-5.3",
    "max_tokens": 3000,
    "reasoning_effort": "medium",
    "messages": [{"role": "user", "content": "why is the sky blue?"}]
  }'

The levels

none, minimal, low, medium, high, xhigh, max — the superset across providers. Few models serve all seven natively.

The matrix

Probed 2026-08-29, one real request per cell against the live gateway, and re-probed after each snap shipped. ✓ = observed 200. Every cell is served except command-a-cohere, which has no effort dial at all and whose refusals relay honestly rather than being discarded.

Modelnoneminimallowmediumhighxhighmax
claude-fable-5
claude-haiku-4-5
claude-opus-4-8
claude-sonnet-5
command-a-cohere422422422422422422
deepseek-v3.1-sambanova
deepseek-v4-flash-vision
deepseek-v4-pro
gemini-3.1-pro
gemini-3.1-pro-preview
gemini-3.5-flash
gemini-3.6-flash
glm-4.7
glm-4.7-deepinfra
glm-4.7-flash
glm-5.2
glm-5.2-deepinfra
glm-5.2-sail
glm-5.3
glm-5.3-flash
gpt-5.4
gpt-5.4-mini
gpt-5.4-nano
gpt-5.5
gpt-5.6-luna
gpt-5.6-sol
gpt-5.6-terra
gpt-oss-120b
gpt-oss-120b-cerebras
gpt-oss-120b-deepinfra
gpt-oss-20b
grok-4.3
grok-4.5
grok-4.6
inkling
inkling-small
kimi-k2.6
kimi-k2.6-fireworks
kimi-k2.7-code
kimi-k2.7-code-highspeed
kimi-k2.7-code-nebius
kimi-k3
kimi-k3-together
ling-3.0-flash
nemotron-3-super-120b
qwen3.7-max
qwen3.8-2.4t
qwen3.8-27b
qwen3.8-flash
qwen3.8-max
seed-2.0-code
seed-2.0-mini
seed-2.0-pro

A 422 cell is the upstream’s own refusal, relayed honestly rather than absorbed. After the snap rules below, the only refusing row left is command-a-cohere, which serves no effort dial at all; a — cell is one a rate limit kept the probe from measuring.

Where the gateway snaps for you

OpenAI’s current reasoning models refuse minimal and max by name (“Supported values are: none, low, medium, high, and xhigh”), so the gateway snaps minimal to low and max to xhigh on OpenAI-proper seats — which is why every gpt row above reads as fully served.

GLM’s thinking models serve exactly three tiers — low, high, max — and 400 on every other spelling (“This model always engages in thinking and cannot be disabled”). An effort is a preference, not a contract term, so the gateway snaps the missing levels to the nearest served tier instead of relaying the refusal:

You sendGLM receives
none, minimallow
mediumhigh
xhighmax
low, high, maxunchanged

The snap is host-gated to Z.ai’s surface: no other provider sees the rewrite. If a GLM model refuses an effort level with “please use low, high, or max”, this shim is the fix — the refused spellings snap to the nearest tier the surface serves instead of erroring.

A third rule covers seats whose served band varies per model rather than per provider: Gemini 3.1 Pro’s floor is low while 3.5 Flash serves none, qwen3.8-27b tops out at medium, grok-4.5/4.6 refuse none and max, gpt-oss-120b starts at low. Each carries a measured floor-to-ceiling band and an out-of-band level clamps to the nearest end — which is why those rows above read as fully served.

Provider quirks

ProviderBehavior
OpenAI (gpt-5.6 family)Function tools plus an explicit effort is a documented 400 on the chat wire. With tools and no effort set, the gateway pins reasoning_effort: "none" so the call serves. An explicit effort beside tools is forwarded and OpenAI’s refusal relays.
AnthropicEach level maps to a minimum thinking budget. A max_tokens that looks generous for the visible answer can be consumed by the thinking block first — give the turn room.
DeepSeekEffort selects which model serves, not a body field. x-conifer-effective-model discloses the swap.
GeminiA token-denominated thinking budget underneath, with a per-model served band. The gateway clamps out-of-band levels to the band ends, so every level serves on every Gemini seat.

When it still errors

A refused level relays as 422 upstream_error carrying the provider’s message where it names the fix. 422, not 400: the request was well-formed on this wire; the provider declined it. Refused turns are not billed. A server fallback chain advances on these.