refactor(compression): Astra native-compaction gate reuses is_astra_model

The -900k alias fix hand-rolled a second copy of the Astra slug set and its
vendor-prefix normalization. agent/reasoning_effort.py::is_astra_model is the
documented single home for that set (picker, effort vocabulary and request
sanitizer already key off it), so the gate now calls it and a future Astra
alias stays a one-line edit. The gpt-5.6 marker check is back to main's exact
form.

Tests move into the existing parametrized Astra gate table, which checks both
the capability resolver and the per-request gate: -900k on official Codex OAuth
is eligible; -900k through a relay or on provider openai is not. Docs and the
config example no longer say "exact gpt-6-astra".
This commit is contained in:
kshitijk4poor
2026-09-26 18:55:14 +05:30
committed by kshitij
parent 60b99e1932
commit 11c50f05d0
5 changed files with 17 additions and 26 deletions

View File

@@ -2,8 +2,8 @@
``context_management=[{"type": "compaction", "compact_threshold": N}]`` makes the server ``context_management=[{"type": "compaction", "compact_threshold": N}]`` makes the server
summarize older context into an opaque ``compaction`` item once the input crosses N tokens. summarize older context into an opaque ``compaction`` item once the input crosses N tokens.
Deliberately narrow: gpt-5.6 on api.openai.com or the ChatGPT Codex backend, plus exact Deliberately narrow: gpt-5.6 on api.openai.com or the ChatGPT Codex backend, plus gpt-6-astra
gpt-6-astra on official Codex OAuth. The local compressor (and its ``-900k`` picker alias) on official Codex OAuth. The local compressor
stays armed as fallback (native threshold clamped below the local trigger); compaction items stays armed as fallback (native threshold clamped below the local trigger); compaction items
ride the ``codex_reasoning_items`` sidecar. No transport imports (shared gate, no cycles). ride the ``codex_reasoning_items`` sidecar. No transport imports (shared gate, no cycles).
""" """
@@ -17,6 +17,7 @@ from urllib.parse import urlsplit
from agent.codex_headers import is_official_codex_base_url from agent.codex_headers import is_official_codex_base_url
from agent.context_compressor import is_compaction_summary_message from agent.context_compressor import is_compaction_summary_message
from agent.message_content import flatten_message_text from agent.message_content import flatten_message_text
from agent.reasoning_effort import is_astra_model
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -26,22 +27,15 @@ LOCAL_TRIGGER_SAFETY_MARGIN = 8_192
DEFAULT_COMPACT_THRESHOLD = 200_000 DEFAULT_COMPACT_THRESHOLD = 200_000
# Substring match so dated snapshots and variants (gpt-5.6-mini) stay eligible. # Substring match so dated snapshots and variants (gpt-5.6-mini) stay eligible.
_ELIGIBLE_MODEL_MARKER = "gpt-5.6" _ELIGIBLE_MODEL_MARKER = "gpt-5.6"
_ASTRA_NATIVE_COMPACTION_MODELS = frozenset({"gpt-6-astra", "gpt-6-astra-900k"})
def is_native_compaction_model( def is_native_compaction_model(
model: Optional[str], *, provider: Optional[str] = None, base_url: Optional[str] = None, model: Optional[str], *, provider: Optional[str] = None, base_url: Optional[str] = None,
) -> bool: ) -> bool:
"""Preserve gpt-5.6 eligibility; Astra additionally requires official Codex OAuth. """Preserve gpt-5.6 eligibility; Astra (``-900k`` is a picker alias of the same wire slug)
additionally requires official Codex OAuth."""
``-900k`` is Hermes' local picker alias and is stripped before the request is return _ELIGIBLE_MODEL_MARKER in (model or "").lower() or (
sent. It must retain the same native-compaction eligibility as the bare is_astra_model(model)
Astra wire model; otherwise enabling the feature in a 900K session is a
silent no-op.
"""
model_name = (model or "").strip().lower().rsplit("/", 1)[-1]
return _ELIGIBLE_MODEL_MARKER in model_name or (
model_name in _ASTRA_NATIVE_COMPACTION_MODELS
and (provider or "").strip().lower() == "openai-codex" and (provider or "").strip().lower() == "openai-codex"
and is_official_codex_base_url(base_url or "") and is_official_codex_base_url(base_url or "")
) )

View File

@@ -723,7 +723,7 @@ compression:
# Native OpenAI Responses server-side compaction (default: false). When true, # Native OpenAI Responses server-side compaction (default: false). When true,
# gpt-5.6-family models on the DIRECT OpenAI API (api.openai.com) or a ChatGPT # gpt-5.6-family models on the DIRECT OpenAI API (api.openai.com) or a ChatGPT
# Codex subscription, plus exact gpt-6-astra on official Codex OAuth, compact # Codex subscription, plus gpt-6-astra (and its -900k alias) on official Codex OAuth, compact
# server-side: OpenAI prunes older context into an # server-side: OpenAI prunes older context into an
# encrypted checkpoint that Hermes replays on later turns. No other provider, # encrypted checkpoint that Hermes replays on later turns. No other provider,
# route, or model is affected. Hermes' local compression stays armed as the # route, or model is affected. Hermes' local compression stays armed as the

View File

@@ -1,4 +1,5 @@
"""Exact gpt-6-astra is native-compaction eligible only on official Codex OAuth (#103720). """gpt-6-astra (and its ``-900k`` picker alias) is native-compaction eligible only on official
Codex OAuth (#103720).
Both the destination capability (``resolve_native_compaction_capabilities``) and the Both the destination capability (``resolve_native_compaction_capabilities``) and the
per-request gate (``native_compaction_context_management``) must agree, and the request per-request gate (``native_compaction_context_management``) must agree, and the request
@@ -20,6 +21,9 @@ _CODEX = "https://chatgpt.com/backend-api/codex"
@pytest.mark.parametrize("model,provider,base_url,eligible", [ @pytest.mark.parametrize("model,provider,base_url,eligible", [
("gpt-6-astra", "openai-codex", _CODEX, True), ("gpt-6-astra", "openai-codex", _CODEX, True),
("GPT-6-ASTRA", "openai-codex", "https://chatgpt.com:443/backend-api/codex/", True), ("GPT-6-ASTRA", "openai-codex", "https://chatgpt.com:443/backend-api/codex/", True),
("gpt-6-astra-900k", "openai-codex", _CODEX, True),
("gpt-6-astra-900k", "openai-codex", "https://relay.example/v1", False),
("gpt-6-astra-900k", "openai", "https://api.openai.com/v1", False),
("gpt-6-astra", "openai", "https://api.openai.com/v1", False), ("gpt-6-astra", "openai", "https://api.openai.com/v1", False),
("gpt-6-astra", "openai", _CODEX, False), ("gpt-6-astra", "openai", _CODEX, False),
("gpt-6-astra", "openai-codex", "https://relay.example/v1", False), ("gpt-6-astra", "openai-codex", "https://relay.example/v1", False),

View File

@@ -46,13 +46,6 @@ class TestModelGate:
assert is_native_compaction_model("gpt-5.6-mini") assert is_native_compaction_model("gpt-5.6-mini")
assert is_native_compaction_model("GPT-5.6-2026-07-15") assert is_native_compaction_model("GPT-5.6-2026-07-15")
def test_astra_900k_picker_alias_is_eligible_on_official_codex_oauth(self):
assert is_native_compaction_model(
"gpt-6-astra-900k",
provider="openai-codex",
base_url="https://chatgpt.com/backend-api/codex",
)
def test_other_models_ineligible(self): def test_other_models_ineligible(self):
# gpt-5.1/5.2 fail server-side on context_management (live-verified); # gpt-5.1/5.2 fail server-side on context_management (live-verified);
# gpt-5.3-codex works upstream but is outside the supported set. # gpt-5.3-codex works upstream but is outside the supported set.

View File

@@ -266,7 +266,7 @@ auxiliary:
| `codex_gpt55_autoraise` | `true` | bool | Raise the trigger to 85% for gpt-5.4/5.5/5.6 and gpt-6 Astra on the ChatGPT Codex OAuth route (see below). Set `false` to keep the global `threshold` | | `codex_gpt55_autoraise` | `true` | bool | Raise the trigger to 85% for gpt-5.4/5.5/5.6 and gpt-6 Astra on the ChatGPT Codex OAuth route (see below). Set `false` to keep the global `threshold` |
| `codex_gpt55_autoraise_notice` | `true` | bool | Show the one-time Codex gpt-5.5 autoraise notice. Set `false` to keep the 85% autoraise but suppress the banner | | `codex_gpt55_autoraise_notice` | `true` | bool | Show the one-time Codex gpt-5.5 autoraise notice. Set `false` to keep the 85% autoraise but suppress the banner |
| `codex_app_server_auto` | `native` | `native`, `hermes`, `off` | Thread-compaction mode for Codex app-server sessions (see below) | | `codex_app_server_auto` | `native` | `native`, `hermes`, `off` | Thread-compaction mode for Codex app-server sessions (see below) |
| `codex_responses_native` | `false` | bool | Opt in to OpenAI's server-side compaction on the Responses API. Engages for gpt-5.6-family models on the direct OpenAI API or a ChatGPT Codex subscription, and exact `gpt-6-astra` on official Codex OAuth (see below) | | `codex_responses_native` | `false` | bool | Opt in to OpenAI's server-side compaction on the Responses API. Engages for gpt-5.6-family models on the direct OpenAI API or a ChatGPT Codex subscription, and `gpt-6-astra` (including its `-900k` picker alias) on official Codex OAuth (see below) |
| `codex_responses_compact_threshold` | `null` | `null` or positive integer | Server-side compaction trigger, read **only when `codex_responses_native: true`** — it never changes when local compression fires; the local trigger is `threshold` (ratio) capped by `threshold_tokens`. `null` follows the resolved local compression trigger with an 8,192 token safety margin. A positive integer remains absolute and only clamps downward when required. Invalid values use automatic behavior. Automatic mode falls back to `200000` when no usable local trigger exists | | `codex_responses_compact_threshold` | `null` | `null` or positive integer | Server-side compaction trigger, read **only when `codex_responses_native: true`** — it never changes when local compression fires; the local trigger is `threshold` (ratio) capped by `threshold_tokens`. `null` follows the resolved local compression trigger with an 8,192 token safety margin. A positive integer remains absolute and only clamps downward when required. Invalid values use automatic behavior. Automatic mode falls back to `200000` when no usable local trigger exists |
| `in_place` | `true` | bool | Compact on the same session id instead of rotating to a new one (see below) | | `in_place` | `true` | bool | Compact on the same session id instead of rotating to a new one (see below) |
@@ -429,9 +429,9 @@ client-side summary pass, and ZDR-friendly (`store: false`, no
Opt in with `compression.codex_responses_native: true`. The gate is deliberately Opt in with `compression.codex_responses_native: true`. The gate is deliberately
narrow, re-checked on every request: narrow, re-checked on every request:
- **Models:** the gpt-5.6 family, plus exact `gpt-6-astra` on official Codex - **Models:** the gpt-5.6 family, plus `gpt-6-astra` (and its `-900k` picker
subscription OAuth. Astra on the direct API, Astra variants and other GPT-6 alias) on official Codex subscription OAuth. Astra on the direct API, other
models are excluded. gpt-5.1/5.2 return HTTP 500 or stall the stream when the Astra variants and other GPT-6 models are excluded. gpt-5.1/5.2 return HTTP 500 or stall the stream when the
field is present (no structured rejection to downgrade on, verified live Aug 2026). field is present (no structured rejection to downgrade on, verified live Aug 2026).
- **Routes:** `api.openai.com` (OpenAI API key) or the ChatGPT Codex backend - **Routes:** `api.openai.com` (OpenAI API key) or the ChatGPT Codex backend
(Codex subscription OAuth) only. xAI, GitHub/Copilot, OpenRouter, relays, and (Codex subscription OAuth) only. xAI, GitHub/Copilot, OpenRouter, relays, and