Audit Reasoning Options
AGENTS.md → Reasoning options is authoritative. This skill is the workflow.
Provider capability = this host’s HTTP request surface (not the npm package, SDK types, or UI).
Schema shapes
[[reasoning_options]]
type = "toggle"
[[reasoning_options]]
type = "effort"
values = ["low", "medium", "high"]
[[reasoning_options]]
type = "budget_tokens"
min = 1_024
max = 32_000
effort values may include null, none, minimal, low, medium, high, xhigh, max, default — never dump the full enum.
budget_tokens = reasoning tokens only, not max_tokens. Bounds only when verified.
[] = model reasons, no caller control. Omitted = not authored (invalid once reasoning = true).
Step 1 — classify the host (role, not npm)
| Kind |
Definition |
Options source |
| First-party lab |
providers/<id> is the model creator (OpenAI, Anthropic, DeepSeek, Alibaba, Google, …) |
That lab’s docs + existing providers/<lab>/ entries |
| Multi-model relay |
Hosts many labs (OpenRouter, aggregators, most new “OpenAI-compatible” startups) |
Lab entry for the underlying model + same-surface relay peers |
Critical: npm = "@ai-sdk/openai-compatible" is used by both labs (DeepSeek, Alibaba) and relays. It does not mean “apply GPT L/M/H gateway defaults.”
- DeepSeek first-party:
thinking.type + reasoning_effort high|max
- Alibaba first-party:
enable_thinking + often thinking_budget; Responses API may use reasoning.effort
- A random relay of GPT-5.4: usually passthrough
reasoning_effort with GPT-like levels
Never compare a native Anthropic Messages route to an OpenAI chat-completions relay as if they shared one control surface.
Step 2 — establish options
- Resolve underlying model (
base_model / lab id).
- Read first-party
providers/<lab>/models/… for that model.
- If authoring a relay, also sample 1–2 established relays of the same model.
- Copy the intersection that this host can actually expose:
- Effort values from native/peers (may be
high/max only, or low/medium/high, or include none/xhigh, …)
- Toggle if native/peers have a real on/off and this host forwards it
- Budget only if a reasoning-budget field exists on this path
- On relays: if native/peers have caller controls, do not write
[] from uncertainty.
- On labs: match that lab; do not paste another lab’s enum.
What “baseline” means
Baseline = the effort (and toggle/budget) set used by the lab and/or same-surface peers for this model.
It is not “always low/medium/high.” That triple is only the usual GPT-style relay case.
| Example |
Typical options |
| GPT-5.4 on a relay |
effort none/low/medium/high/xhigh as peers/native show |
| DeepSeek V4 on DeepSeek or a faithful relay |
toggle + effort high/max |
| Qwen3.5 Plus on Alibaba |
toggle + budget_tokens (chat path) |
| Always-on thinking model |
[] |
Step 3 — toggle rules
| Situation |
Shape |
none ∈ effort and other graded levels |
effort only — no toggle |
Separate on/off field + graded effort (no none in effort) |
toggle + effort |
| Binary on/off only |
toggle |
Toggle requires a leading top-of-file wire comment, e.g.:
# Toggle: thinking.type = enabled|disabled
# Effort: reasoning_effort = high|max
# Toggle: enable_thinking true|false
# Budget: thinking_budget
Not toggle: split model IDs; UI-only; effort=low as “off”; pairing toggle with effort that already includes none.
Step 4 — budget rules
- Reasoning-token budget only.
- Legitimate families: older Anthropic extended thinking, some Alibaba/Qwen
thinking_budget, some older Gemini budgets.
- Not for GPT-5.x effort-only, Claude 4.7+ adaptive effort, DeepSeek V4, or random MoE relays without a budget API.
- Never derive min/max from
limit.output or context.
Evidence bar
| Claim |
Bar |
| Effort/toggle/budget matching first-party lab entry on that lab |
Lab docs or existing lab TOML |
| Same options on a relay |
Lab + peer relays, or this host docs/test; no contradiction |
| Extra levels beyond lab/peers |
This host docs or live meaningful effect |
[] |
Affirmative no control — not “I didn’t check” |
Anti-patterns
- Treating every
@ai-sdk/openai-compatible host as a GPT L/M/H gateway
- Forcing
low/medium/high onto DeepSeek V4 (or any narrower native set)
[] on a relay of a controlled reasoner from uncertainty
- Full schema effort enum dumps
- Bogus
budget_tokens / bounds from output limits
toggle + none inside the same effort list
- Wrong wire comments in examples or files
Audit workflow
- Classify host: first-party lab vs multi-model relay.
- List changed models and proposed options.
- For each: lab entry + peers → expected shape.
- Fix invented L/M/H, false
[], dual none+toggle, bad budgets.
bun validate when authoring.
- PR body: host kind, wire fields, why this option set.
PR audit output
- Host classification per provider
- Models and options; verdict per option
- Toggle wire path when present
- Whether baseline was copied from lab vs peers
- Validation result
1---2name: audit-reasoning-options3description: Audit or write models.dev reasoning_options in provider TOML files and reasoning-option PRs. Use when verifying toggle, effort, budget_tokens, provider reasoning controls, or citations.4---56# Audit Reasoning Options78`AGENTS.md` → **Reasoning options** is authoritative. This skill is the workflow.910Provider capability = this host’s HTTP request surface (not the npm package, SDK types, or UI).1112## Schema shapes1314```toml15[[reasoning_options]]16type = "toggle"1718[[reasoning_options]]19type = "effort"20values = ["low", "medium", "high"]2122[[reasoning_options]]23type = "budget_tokens"24min = 1_02425max = 32_00026```2728- `effort` values may include `null`, `none`, `minimal`, `low`, `medium`, `high`, `xhigh`, `max`, `default` — **never dump the full enum**.29- `budget_tokens` = reasoning tokens only, not `max_tokens`. Bounds only when verified.30- `[]` = model reasons, **no** caller control. Omitted = not authored (invalid once `reasoning = true`).3132## Step 1 — classify the host (role, not npm)3334| Kind | Definition | Options source |35| --- | --- | --- |36| **First-party lab** | `providers/<id>` **is** the model creator (OpenAI, Anthropic, DeepSeek, Alibaba, Google, …) | That lab’s docs + existing `providers/<lab>/` entries |37| **Multi-model relay** | Hosts many labs (OpenRouter, aggregators, most new “OpenAI-compatible” startups) | Lab entry for the underlying model + same-surface relay peers |3839**Critical:** `npm = "@ai-sdk/openai-compatible"` is used by **both** labs (DeepSeek, Alibaba) and relays. It does **not** mean “apply GPT L/M/H gateway defaults.”4041- DeepSeek first-party: `thinking.type` + `reasoning_effort` `high`|`max`42- Alibaba first-party: `enable_thinking` + often `thinking_budget`; Responses API may use `reasoning.effort`43- A random relay of GPT-5.4: usually passthrough `reasoning_effort` with GPT-like levels4445Never compare a native Anthropic Messages route to an OpenAI chat-completions relay as if they shared one control surface.4647## Step 2 — establish options48491. Resolve underlying model (`base_model` / lab id).502. Read **first-party** `providers/<lab>/models/…` for that model.513. If authoring a **relay**, also sample 1–2 established relays of the same model.524. Copy the **intersection that this host can actually expose**:53 - Effort values from native/peers (may be `high`/`max` only, or `low`/`medium`/`high`, or include `none`/`xhigh`, …)54 - Toggle if native/peers have a real on/off **and** this host forwards it55 - Budget only if a reasoning-budget field exists on this path565. On relays: if native/peers have caller controls, **do not** write `[]` from uncertainty.576. On labs: match that lab; do not paste another lab’s enum.5859### What “baseline” means6061**Baseline = the effort (and toggle/budget) set used by the lab and/or same-surface peers for this model.**6263It is **not** “always `low`/`medium`/`high`.” That triple is only the usual GPT-style relay case.6465| Example | Typical options |66| --- | --- |67| GPT-5.4 on a relay | `effort` `none`/`low`/`medium`/`high`/`xhigh` as peers/native show |68| DeepSeek V4 on DeepSeek or a faithful relay | `toggle` + `effort` `high`/`max` |69| Qwen3.5 Plus on Alibaba | `toggle` + `budget_tokens` (chat path) |70| Always-on thinking model | `[]` |7172## Step 3 — toggle rules7374| Situation | Shape |75| --- | --- |76| `none` ∈ effort **and** other graded levels | `effort` only — **no** `toggle` |77| Separate on/off field + graded effort (no `none` in effort) | `toggle` + `effort` |78| Binary on/off only | `toggle` |7980Toggle requires a **leading top-of-file** wire comment, e.g.:8182```toml83# Toggle: thinking.type = enabled|disabled84# Effort: reasoning_effort = high|max85```8687```toml88# Toggle: enable_thinking true|false89# Budget: thinking_budget90```9192Not toggle: split model IDs; UI-only; `effort=low` as “off”; pairing `toggle` with effort that already includes `none`.9394## Step 4 — budget rules9596- Reasoning-token budget only.97- Legitimate families: older Anthropic extended thinking, some Alibaba/Qwen `thinking_budget`, some older Gemini budgets.98- Not for GPT-5.x effort-only, Claude 4.7+ adaptive effort, DeepSeek V4, or random MoE relays without a budget API.99- Never derive min/max from `limit.output` or context.100101## Evidence bar102103| Claim | Bar |104| --- | --- |105| Effort/toggle/budget matching first-party lab entry on that lab | Lab docs or existing lab TOML |106| Same options on a relay | Lab + peer relays, or this host docs/test; no contradiction |107| Extra levels beyond lab/peers | This host docs or live meaningful effect |108| `[]` | Affirmative no control — not “I didn’t check” |109110## Anti-patterns111112- Treating every `@ai-sdk/openai-compatible` host as a GPT L/M/H gateway113- Forcing `low`/`medium`/`high` onto DeepSeek V4 (or any narrower native set)114- `[]` on a relay of a controlled reasoner from uncertainty115- Full schema effort enum dumps116- Bogus `budget_tokens` / bounds from output limits117- `toggle` + `none` inside the same effort list118- Wrong wire comments in examples or files119120## Audit workflow1211221. Classify host: first-party lab vs multi-model relay.1232. List changed models and proposed options.1243. For each: lab entry + peers → expected shape.1254. Fix invented L/M/H, false `[]`, dual none+toggle, bad budgets.1265. `bun validate` when authoring.1276. PR body: host kind, wire fields, why this option set.128129## PR audit output130131- Host classification per provider132- Models and options; verdict per option133- Toggle wire path when present134- Whether baseline was copied from lab vs peers135- Validation result