Docs for SCORPIOX CODE @ 77c49df

Reasoning Effort Control

One live slash command, one shared key, two per-provider keys, and three providers that disagree on what off means. Set the dial mid-turn and see exactly which value wins.

Reasoning effort is the dial that tells a reasoning model how hard to think before it answers: low for quick turns, high for hard problems, and everything in between. SCORPIOX CODE exposes it two ways at once — a live slash command you can flip mid-conversation, and a set of per-provider config keys that make the choice permanent — and it shows you exactly which one is active instead of hiding it.

The reason there are two surfaces is that the three providers which read reasoning effort do not agree on their key names, their accepted values, or even what "off" means. The slash command is the universal control; the per-provider keys are how you pin it per provider in the configuration cascade.

Docs for SCORPIOX CODE @ 77c49df.

The whole idea in one line: /reasoning_effort <low|medium|high|max|off> changes reasoning effort for the running session on any provider that supports it, and the *_REASONING_EFFORT config keys make the same choice permanent — with each provider reading its own key first, then the generic fallbacks.


The one command: /reasoning_effort

Type it with no argument and it tells you where you stand:

reasoning_effort: high
Usage: /reasoning_effort <low|medium|high|max|off>

Set it with a value:

/reasoning_effort low       → reasoning_effort: low
/reasoning_effort max       → reasoning_effort: max
/reasoning_effort off       → reasoning_effort: off (not sent)

Three properties worth knowing:

The command works in the interactive TUI and in machine mode (the same handler backs both entry points), so scripts driving the agent can retune effort the same way a human can.

One value is written no matter which provider you are on: the command updates OPENAI_REASONING_EFFORT — the shared key that every reasoning-effort-reading provider falls back to. See The fallback chain for what that means when provider-specific keys are also set.


What each value does per provider

This is the part that actually matters, because the three providers disagree.

ProviderKey it reads firstAccepted valuesWhat off doesWire field
openaiOPENAI_REASONING_EFFORTlow, medium, high, maxField omitted entirelyreasoning_effort in the request body
codexCODEX_REASONING_EFFORT → REASONING_EFFORT → OPENAI_REASONING_EFFORTlow, medium, high, max, offSent as none (the Responses API way of saying "no reasoning")reasoning: { effort: ... }
copilotCOPILOT_REASONING_EFFORT → REASONING_EFFORT → OPENAI_REASONING_EFFORTlow, medium, highField omitted — you get the provider's default thinkingreasoning_effort in the request body

The details behind that table:

openai (PROVIDER=openai — llama.cpp, vLLM, SGLang, Ollama, LM Studio, Azure, any OpenAI-compatible endpoint). When OPENAI_REASONING_EFFORT is non-empty, SCORPIOX CODE injects it into the request as reasoning_effort. Engines that understand the field use it; engines that do not ignore it harmlessly. max is passed through verbatim — it is up to your engine to accept or reject it, which makes max the value to use for local reasoning builds that support extended effort levels. There is exactly one key and no fallback: what you set is what goes out.

codex (PROVIDER=codex — ChatGPT/Codex subscription). The Codex provider maps your value onto the Responses API's reasoning field, and it is the one provider where off is a sent value: off (or none, or 0) becomes reasoning: { effort: "none" } on the wire. low, medium, high, and max pass through directly. If no reasoning key is set at all, the provider falls back to its thinking toggle: with THINKING=1 (the shipped default) the request carries high. So on Codex, out of the box, you are already running at high — set a key only to change it.

copilot (PROVIDER=copilot — GitHub Copilot subscription). The Copilot endpoint accepts low, medium, high, and here off (or none, or 0) means omit the field — the provider's default thinking behavior applies, which is not the same as Codex's explicit none. One model-specific wrinkle: if the selected model is a Gemini model, max is mapped down to high before sending, because the Copilot surface for Gemini models does not accept max. On Claude-family Copilot models max passes through as-is.

How fresh is the value?

Fresh every request, on every provider. The Codex and Copilot request builders re-read the configuration for each outgoing request, and the openai provider passes the setting to its request translator on every call. Change the value mid-session — by slash command, by config editor — and the very next request carries the new effort. There is no apply step and no restart.


The fallback chain, and the gotcha it creates

Codex and Copilot do not read only their own key. Each walks a three-step chain, first-set-wins:

CODEX_REASONING_EFFORT    →  REASONING_EFFORT  →  OPENAI_REASONING_EFFORT
COPILOT_REASONING_EFFORT  →  REASONING_EFFORT  →  OPENAI_REASONING_EFFORT

This design gives you one generic key (REASONING_EFFORT) that sets effort for both subscription providers at once, and one shared key (OPENAI_REASONING_EFFORT) that covers all three. But it creates the single most important gotcha on this page:

/reasoning_effort writes the shared key — which is the last fallback. If you have CODEX_REASONING_EFFORT=high in any config file and then run /reasoning_effort low, Codex keeps sending high, because its own key is checked first and it is still set. The slash command only rules when nothing above the shared key is set.

The rule of thumb:

REASONING_EFFORT, the generic middle key, is deliberately file-and-environment only: it has no entry in the interactive config editor, so it never gets written by the editor by accident. Put it in a scorpiox-env.txt or a profile when you want it.


Persistence: session-live vs permanent

What /reasoning_effort actually does is two writes, both in the running process:

  1. It sets the shared key in the in-memory configuration.
  2. It sets the matching OS environment variable (OPENAI_REASONING_EFFORT=low) in the process.

The second write is why the command is authoritative for the rest of the session: an OS environment variable outranks every file in the cascade. If your user-level scorpiox-env.txt says OPENAI_REASONING_EFFORT=high and you run /reasoning_effort low, the session-level low wins for as long as this process lives. And that is also the trap:

The slash-command setting evaporates on restart. It is an environment variable of a running process, not a file. Restart SCORPIOX CODE and the cascade resolves again — your file value (or nothing) applies. If the value you just tried is the one you want to keep, persist it before you lose it.

Making it permanent, in the tier that matches how widely you want it:

You want it for…Put the key in
This project only.scorpiox/scorpiox-env.txt (or .claude/scorpiox-env.txt) in the repo
Every project on this machine, for you~/.claude/scorpiox-env.txt
Everyone using this installscorpiox-env.txt next to the installed binaries
A named profile you flip with /profile / /usescorpiox-env/<name>.txt

The mechanical way, without opening an editor:

scorpiox-config --set OPENAI_REASONING_EFFORT high          # project tier (default)
scorpiox-config --set OPENAI_REASONING_EFFORT high --level user
scorpiox-config --set CODEX_REASONING_EFFORT max  --level user

The interactive editor (/config or scorpiox-config) offers the same keys as multiple-choice entries in the Provider & Authentication section — OPENAI_REASONING_EFFORT and OPENAI_EXTRA_HEADERS when PROVIDER=openai is active, CODEX_REASONING_EFFORT when codex is active, COPILOT_REASONING_EFFORT when copilot is active — so you pick from the legal values instead of typing them.


Where you can see the current value

Three places, all live:

And to see what would resolve after a restart, ask the config tool:

scorpiox-config --get OPENAI_REASONING_EFFORT     # effective value of the shared key
scorpiox-config --get CODEX_REASONING_EFFORT      # per-provider key
scorpiox-config --verbose                         # every key + which tier it came from

--verbose is the arbiter for the fallback-chain gotcha: it shows whether a provider-specific key is set anywhere in your cascade, which is exactly what determines whether your slash-command value or your file value wins.


How the rest of the lineup handles it

Reasoning effort is one of two control models in SCORPIOX CODE, and knowing which model a provider uses tells you which knob to reach for:

ProviderControl modelWhat you get
openai / codex / copilotReasoning effort (this page)Discrete levels, one key per provider, visible in the UI
claude_code / anthropic / scorpiox (router)Thinking budgetTHINKING=1/0 on/off plus THINKING_BUDGET tokens — a budget, not a level
grokFixed mappingTHINKING=1 sends high, THINKING=0 sends low — no key, no choice (the endpoint rejects none)
opencodeFixedhigh whenever thinking is enabled — fully hidden

The thinking-budget providers are worth a word: there is no reasoning effort key on Anthropic-style providers because their API model is different — you enable thinking and cap it with a token budget rather than picking a level. THINKING_BUDGET=10000 (the shipped default) is that cap. If you switch a profile from codex to claude_code, your CODEX_REASONING_EFFORT goes dormant and THINKING/THINKING_BUDGET take over — the two models of control do not translate into each other.

Against the mainstream harnesses: the Codex CLI exposes the same dial as a config-file value (model_reasoning_effort) that you edit and reload; Claude Code steers thinking with reserved prompt keywords and a MAX_THINKING_TOKENS environment variable rather than a discrete level; the Gemini CLI keeps generation parameters in its settings file. SCORPIOX CODE's approach differs on two axes — the dial is a first-class slash command you can flip mid-conversation, and the same mental model covers three different providers whose underlying fields disagree — which is why the per-provider mapping table above exists at all.


Configuration reference

KeyTypeDefaultDescription
OPENAI_REASONING_EFFORTchoice(empty)Shared reasoning effort key. low, medium, high, max. Read directly by the openai provider; read as the last fallback by codex and copilot. Empty = field not sent (provider default). This is the key /reasoning_effort writes.
CODEX_REASONING_EFFORTchoice(empty)Codex provider effort. low, medium, high, max, off. off/none/0 sends none on the wire. Overrides the generic and shared keys. Falls back to THINKING=1 → high when all keys are empty. Visible in the config editor when PROVIDER=codex.
COPILOT_REASONING_EFFORTchoice(empty)Copilot provider effort. low, medium, high. off/none/0 omits the field. max maps to high on Gemini-family Copilot models. Overrides the generic and shared keys. Visible in the config editor when PROVIDER=copilot.
REASONING_EFFORTtext(empty)Generic effort key for codex + copilot (middle of both fallback chains). File/environment only — not offered by the interactive config editor.
THINKINGbool1Thinking toggle for the budget-based providers, and the codex fallback: with all reasoning keys empty, THINKING=1 makes codex send high.

All five keys resolve through the standard cascade — global, user, project, profile, OS environment, highest tier wins — and the provider-specific keys always outrank the generic and shared keys within their provider's chain.


Gotchas