Repository navigation
GPT-6 Astra reasoning-effort changes do not use configuration_update, defeating cache preservation #42996
Description
What issue are you seeing?
GPT-6 Astra now supports changing reasoning effort mid-conversation without invalidating the reusable prompt prefix by keeping the request-level reasoning.effort stable and adding a positional configuration_update input item instead.
Codex has also recently added first-class durable/trusted support for ResponseItem::ConfigurationUpdate in #42328 (0d502a423031396a8d11c096e5b9f1cb0d30b3d0), including persistence, replay, resume/fork handling, provenance, and filtering of untrusted client-injected updates.
However, on current main (531f3836a1e38ea61eaaba3dccda6711eb6c0dca at the time of this report), normal reasoning-effort changes still appear to follow the older request-level settings path rather than materializing a trusted configuration_update.
The current path is approximately:
TUI reasoning picker / shortcut
-> UpdateReasoningEffort
-> thread/settings/update
-> ThreadSettingsOverrides / SessionSettingsUpdate
-> StepSettings current effort changes
-> ModelClientSession::stream(...)
-> Responses request reasoning.effort changes
At the model-call boundary, session/turn.rs passes the current step effort into the client:
step_context.settings.reasoning_effort().cloned()and core/src/client.rs uses that value to build the provider-facing request-level reasoning object:
Reasoning {
effort: effort
.or_else(|| model_info.default_reasoning_level.clone())
.map(|effort| reasoning_effort_for_request(model_info, effort)),
...
}So an in-thread change such as high -> xhigh changes the request-level reasoning.effort on the next request.
For Astra, current OpenAI guidance explicitly provides a cache-preserving alternative: add a configuration_update history/input item and keep request-level reasoning.effort unchanged so the existing prompt prefix remains cacheable.
Codex already contains the protocol/history machinery for exactly such an item:
ResponseItem::ConfigurationUpdate {
reasoning: ConfigurationReasoning { effort },
}with trusted harness provenance:
CodexHarnessMetadata {
harness_authored_configuration: true,
..Default::default()
}But I could not find a production path that creates this trusted history item when an ordinary reasoning-effort setting changes. The production occurrences appear to be serialization/replay/filtering support, while explicit construction with trusted provenance is currently exercised in tests.
This looks like the final wiring between the existing reasoning-settings machinery and the new Astra configuration-update machinery may not have landed yet.
Why this is distinct from #35416
#35416, opened July 26, already demonstrates empirically that changing to a previously unused reasoning effort causes a substantial prompt-cache regression in Codex. That issue predates GPT-6 Astra and predates the September 2 configuration_update infrastructure, so at the time there was no documented cache-preserving mechanism for Codex to use.
Astra materially changes the situation: the API now has an explicit mechanism intended to preserve cache across reasoning-effort transitions, and Codex now has durable trusted support for representing that mechanism in model history.
This issue is therefore specifically about wiring the new Astra capability into Codex, rather than documenting the older cache-miss behavior as unavoidable.
Additional impact: WebSocket / incremental reuse
This may also affect Codex's incremental Responses/WebSocket request reuse, not only provider-side prompt caching.
#32533 documents a long Responses Lite session where changing reasoning effort caused:
incremental request failed, websocket reuse properties didn't match
followed by a full-history resend. Keeping the request-scoped reasoning configuration stable and expressing the effective effort transition as incremental input via configuration_update should potentially avoid the reasoning-property mismatch for models that support the new mechanism.
What steps can reproduce the bug?
Source-level reproduction on current main:
- Start a GPT-6 Astra thread at one supported effort, e.g.
high. - Change the thread reasoning effort to
xhighthrough the normal TUI/model setting. - Trace the next turn through
thread/settings/update->SessionSettingsUpdate->StepSettings->ModelClientSession::stream. - Observe that the next provider request is built using
reasoning.effort = xhigh. - Inspect model history / rollout construction and observe no corresponding harness-authored
ResponseItem::ConfigurationUpdatebeing created by the settings transition.
A focused integration test should be able to demonstrate this without a live backend by inspecting the mocked Responses request body and model-visible input.
For a supported Astra-style fix, the expected test would be:
- Start at effort A and complete a turn.
- Change effort A -> B.
- Start the next turn.
- Assert the effective/thread setting is B.
- Assert request-level
reasoning.effortremains the stable base A for that same model/cache lineage. - Assert model-visible input contains a trusted
configuration_update(B)in the correct position. - Repeat B -> C and verify a second positional update without changing the request-level base.
- Cover no-op A -> A, resume, fork, compaction, model switches, and unsupported models/providers.
What is the expected behavior?
For GPT-6 Astra (and any other model/provider explicitly supporting positional reasoning configuration updates):
- changing the selected/effective reasoning effort within the same model lineage should not require changing the request-level reasoning configuration;
- Codex should append a harness-authored
configuration_updateat the correct history position; - the user's effective reasoning setting should still update normally in UI/thread state;
- no-op effort changes should not append redundant controls;
- resume/fork/compaction should preserve the effective reasoning state without duplicating updates;
- unsupported models/providers should retain existing behavior;
- model switches should establish whatever new request-level configuration is appropriate for the new model rather than carrying an old model's baseline across lineages;
- external app-server clients should remain unable to forge trusted
configuration_updatecontrols.
This should preserve the prompt prefix/cache topology Astra's API feature was designed for, and may also preserve incremental WebSocket reuse across same-model effort changes.
Relevant current code / history
- Existing cache-miss report: Changing reasoning level results in cache miss #35416
- Related full-resend / reuse failure: Responses Lite: changing reasoning effort can strand a large session on “Request blocked.” until compaction #32533
- Durable configuration-update infrastructure: Support durable reasoning configuration updates #42328 /
0d502a423031396a8d11c096e5b9f1cb0d30b3d0 codex-rs/protocol/src/models/configuration_update.rscodex-rs/core/src/context_manager/history.rscodex-rs/core/src/session/thread_settings.rscodex-rs/core/src/session/turn.rscodex-rs/core/src/client.rscodex-rs/app-server/README.md- bundled Astra migration guidance:
codex-rs/skills/src/assets/samples/openai-docs/references/upgrading-to-gpt-6-astra.md
The repository's own AGENTS.md also calls out model-visible context invariants including incremental history construction and avoiding frequent context changes that cause cache misses, which seems aligned with using the new positional configuration control here.
Additional information
I am not assuming there is no proprietary server-side rewrite for ChatGPT-authenticated Codex traffic. The open-source client/harness itself, however, currently appears to send the changed effort as request-level configuration, and API-key / direct Responses usage cannot rely on an opaque Codex backend to compensate.
If there is an intentional reason not to wire ordinary Codex effort changes through configuration_update, clarification would be useful because the current Astra guidance and the newly landed trusted-history machinery otherwise appear designed for exactly this case.
Activity
dogancanbaris commentedon Sep 6, 2026
We observed matching cache-loss timing in a Windows Astra task; sanitized details are in #43229. Three reasoning-effort changes were followed by cache-hit drops from approximately 99% to 12.05%, 0%, and 12.06%, with the next request recovering to 96-99%.
The root was created under 0.153.1; the currently running desktop executable is 0.153.4, so we cannot establish the exact executable for every resumed historical turn from creation metadata alone. The main task's overall cache hit ratio remained 98.32%. These transition misses appear to contribute extra usage, but cannot explain most of that day's consumption.
This is a matching observed symptom, not proof from our logs that the missing
configuration_updatepath is the sole cause. The issue includes UTC timestamps and uncached/cache accounting, and we are preparing a bounded comparison.jiang-yuan commentedon Sep 8, 2026
Mac Codex 0.153.4 also found this problem. Cache miss when switch reasoning effort.
tommedema commentedon Sep 19, 2026
This should fix it:
codex features enable reasoning_effort_overridehassan-mohiddin commentedon Sep 30, 2026
A related data point from a third-party client, for whoever picks this up.
With a ChatGPT plan through Sign in with ChatGPT (
POST https://api.openai.com/v1/responseswith a ChatGPT access token; Pi coding agent 0.99.1;store: false; standard single-agent requests),configuration_updateitems are rejected ongpt-6-lunaandgpt-6.1-sol:Without it, each request-level effort gets its own cache. Same conversation (~9.9k input tokens), requests 15 s apart, cached tokens:
So on this route the first switch to each effort reprocesses the whole conversation (the symptom in this issue), and a client cannot avoid it.
max_output_tokensis also rejected there (Unsupported parameter), so a capped cache warm-up is not possible either.On the older
chatgpt.com/backend-api/codexroute, our earlier tests sawconfiguration_updateaccepted and the cache kept across an effort change, so the gap looks specific to subscription sharing through api.openai.com. This is also being reported through OpenAI support and the developer forum.feat(compaction): compact server-side on OpenAI, xAI, and Anthropic
robertn702 commentedon Oct 13, 2026
Another data point for the
chatgpt.com/backend-api/codexroute @hassan-mohiddin mentioned. A positionalconfiguration_updatewith a pinned request-level effort keeps the cache there ongpt-6-astra.I tested it through a local proxy I maintain (reasoning-router). It sits behind a custom
model_providersentry in Codex CLIrust-v0.161.0and forwards to the ChatGPT backend through CLIProxyAPI on a Pro login. The proxy keeps request-levelreasoning.effortfixed and inserts the update item when the effort changes. Cached input on the request right after each switch, in one session:This only shows the cache survived. It doesn't show the model actually reasoned at the new effort.
Also,
reasoning_effort_overridedoesn't apply to custommodel_providers, so anyone routing Codex through a custom provider still hits this issue even with the flag enabled.Setup and notes: https://github.com/robertn702/reasoning-router/blob/main/docs/harnesses/codex.md