Thinking effort compatibility
This guide ships with the Cayu package, so the installed version is always available offline with cayu guide thinking. Release source.
Use public ThinkingConfig(effort="max") on AgentSpec.thinking,
RunDefaults.thinking, RunRequest.thinking, ResumeRequest.thinking, or
StepRunOptions.thinking. Request/step overrides take precedence over agent
settings, which take precedence over application defaults. These values survive
JSON serialization and durable approval/dispatch recovery without normalization.
The exact vocabulary is none, minimal, low, medium, high, xhigh, max.
xlow remains invalid: the audit found no verified native xlow contract in these
adapters. It is not translated to minimal or low. Effort names are not a
cross-provider scale; xhigh, high, and max are distinct requests.
enabled=True enables the configuration, not necessarily model reasoning.
effort="none" explicitly requests native non-reasoning behavior; minimal
still permits reasoning. Both require enabled=True. enabled=False retains
its historical best-effort behavior (Anthropic disables, OpenAI/compatible Chat
Completions omit the typed control). Combining disabled thinking with any effort,
or combining effort with max_tokens, fails validation. Omitting effort preserves
existing defaults and legacy budget behavior. Typed effort overwrites raw effort;
unrelated raw siblings such as reasoning.summary and output_config.format
remain intact. No adapter downgrades or drops an explicit typed effort.
For an opt-in failover chain, ModelProvider.preflight_thinking(model=..., thinking=...) validates each candidate before initial session creation and the
actual selected request before attempt reservation and staging. The hook must be
side-effect-free: no authentication, network request, or provider probing. It
receives a detached, validated ThinkingConfig (or None) and must reject
unsupported controls without echoing request input. The base implementation
accepts only None; custom providers must explicitly declare configured-control
support. Transparent wrappers must delegate the hook. Bundled adapters reuse the
local compatibility rules below; success does not prove unknown backend support
or turn best-effort controls into portable guarantees. Ordinary nonrouted runs
retain their existing validation paths.
Provider-contract audit: 2026-09-05. “Declared” below means documented wire support, not tested backend availability or evidence of internal reasoning work.
| Adapter / transport | Typed effort contract |
|---|---|
| OpenAI Responses (streaming, buffered construction, background create) | Declared reasoning.effort; exact model restrictions below. |
| OpenAI Chat Completions | Declared reasoning_effort; same model effort restrictions, with Responses-only models rejected. |
| Compatible Responses and Chat Completions (including OpenRouter) | Forward the exact wire value. Unknown model/deployment/router compatibility is unresolved; acceptance must be established at the selected backend. |
| OpenAI subscription Responses | Same Responses wire construction and local model checks; subscription entitlement and backend acceptance are unverified independently of Platform support. |
| Anthropic Messages and Vertex Anthropic Messages | thinking.type=adaptive plus exact output_config.effort; model restrictions below. Vertex model/region availability remains backend-dependent. |
| Google AI Studio via Chat Completions | Exact reasoning_effort, subject to the Google rows below. This adapter does not emit native Gemini thinking_level. |
| Bedrock Converse | No implemented typed effort mapping; any explicit effort fails locally. Native additionalModelRequestFields do not establish typed effort support. |
| Custom providers | Their adapter owns compatibility and validation; this matrix makes no support claim. |
The following known model rules apply to exact IDs, -latest aliases, and dated
snapshots (-YYYY-MM-DD, -YYYYMMDD, or Vertex @YYYYMMDD). These are bounded
incompatibility rules, not a model allowlist. Unknown identifiers are accepted
locally within the adapter vocabulary and sent unchanged. Recognized IDs retain
these restrictions even through a compatible gateway; arbitrary deployment IDs
and vendor-prefixed router slugs do not establish native-model identity.
| Model IDs | Allowed explicit effort |
|---|---|
gpt-5, gpt-5-mini, gpt-5-nano |
minimal, low, medium, high |
gpt-5-pro |
high; Responses only |
gpt-5.1 |
none, low, medium, high |
gpt-5.1-codex / gpt-5.1-codex-max |
low, medium, high / additionally xhigh; Responses only |
gpt-5.2, gpt-5.4, gpt-5.5 |
none, low, medium, high, xhigh |
gpt-5.6, gpt-5.6-sol, gpt-5.6-terra, gpt-5.6-luna |
none, low, medium, high, xhigh, max |
gpt-6-astra |
low, medium, high, xhigh, max |
o1, o3, o3-mini, o4-mini |
low, medium, high |
gpt-4o, gpt-4o-mini, gpt-4.1, gpt-4.1-mini, gpt-4.1-nano |
No typed effort |
| Claude Opus 4.6, Sonnet 4.6, Mythos Preview | low, medium, high, max |
| Claude Opus 4.7/4.8/5, Sonnet 5, Fable 5/5.1, Mythos 5/5.1 | low, medium, high, xhigh, max |
| Claude Opus 4/4.1/4.5, Sonnet 4/4.5, Haiku 4.5, 3.7 Sonnet, 3.5 Sonnet/Haiku | No adaptive typed effort. Opus 4.5’s manual-thinking effort contract is not the adaptive mode selected by ThinkingConfig.effort. |
| Unknown Anthropic model | low, medium, high, xhigh, max forwarded; model acceptance unresolved. none and minimal fail locally. |
gemini-3.1-pro-preview, gemini-3.1-flash-lite-preview, gemini-3-flash-preview, gemini-2.5-pro |
minimal, low, medium, high |
gemini-2.5-flash, gemini-2.5-flash-lite |
none, minimal, low, medium, high |
Google documents its own compatibility mappings: minimal becomes low on
3.1 Pro, while 2.5 maps minimal/low, medium, high to budgets of 1,024,
8,192, 24,576. Cayu forwards the effort string; those translations occur at
Google, not in Runtime. Do not combine it with Google’s raw thinking level/budget.
Local incompatibility raises a bounded ValueError before authentication or model
network dispatch, with allowed values or an adapter-selection remedy. It includes
no model input, credentials, URLs, or request bodies. Upstream rejection continues
through the provider’s credential-safe API error path; it never triggers an effort
fallback. A successful fingerprint or payload build proves local validity and
requested/emitted settings only. Keep requested identity, emitted request identity,
and backend-reported identity separate.
Compatible Responses unit tests establish request construction with mocked transports. Confirm support at the selected backend with a bounded live probe that checks the emitted request and successful response. A successful response does not prove internal reasoning allocation.
Audit sources: OpenAI Chat Completions schema, reasoning guide, GPT-5, GPT-5 Pro, GPT-5.1, Codex-Max, GPT-5.2, GPT-5.4, GPT-5.5, Luna, model catalog; Anthropic effort and thinking modes; Google OpenAI compatibility.