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:
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.
| Model | none | minimal | low | medium | high | xhigh | max |
|---|---|---|---|---|---|---|---|
claude-fable-5 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
claude-haiku-4-5 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
claude-opus-4-8 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
claude-sonnet-5 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
command-a-cohere | ✓ | 422 | 422 | 422 | 422 | 422 | 422 |
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 send | GLM receives |
|---|---|
none, minimal | low |
medium | high |
xhigh | max |
low, high, max | unchanged |
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
| Provider | Behavior |
|---|---|
| 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. |
| Anthropic | Each 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. |
| DeepSeek | Effort selects which model serves, not a body field. x-conifer-effective-model discloses the swap. |
| Gemini | A 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.