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
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
gpt-6-astra on official Codex OAuth. The local compressor
Deliberately narrow: gpt-5.6 on api.openai.com or the ChatGPT Codex backend, plus gpt-6-astra
(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
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.context_compressor import is_compaction_summary_message
from agent.message_content import flatten_message_text
from agent.reasoning_effort import is_astra_model
logger = logging.getLogger(__name__)
@@ -26,22 +27,15 @@ LOCAL_TRIGGER_SAFETY_MARGIN = 8_192
DEFAULT_COMPACT_THRESHOLD = 200_000
# Substring match so dated snapshots and variants (gpt-5.6-mini) stay eligible.
_ELIGIBLE_MODEL_MARKER = "gpt-5.6"
_ASTRA_NATIVE_COMPACTION_MODELS = frozenset({"gpt-6-astra", "gpt-6-astra-900k"})
def is_native_compaction_model(
model: Optional[str], *, provider: Optional[str] = None, base_url: Optional[str] = None,
) -> bool:
"""Preserve gpt-5.6 eligibility; Astra additionally requires official Codex OAuth.
``-900k`` is Hermes' local picker alias and is stripped before the request is
sent. It must retain the same native-compaction eligibility as the bare
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
"""Preserve gpt-5.6 eligibility; Astra (``-900k`` is a picker alias of the same wire slug)
additionally requires official Codex OAuth."""
return _ELIGIBLE_MODEL_MARKER in (model or "").lower() or (
is_astra_model(model)
and (provider or "").strip().lower() == "openai-codex"
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,
# 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
# encrypted checkpoint that Hermes replays on later turns. No other provider,
# 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
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", [
("gpt-6-astra", "openai-codex", _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", _CODEX, 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-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):
# 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.

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_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_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 |
| `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
narrow, re-checked on every request:
- **Models:** the gpt-5.6 family, plus exact `gpt-6-astra` on official Codex
subscription OAuth. Astra on the direct API, Astra variants and other GPT-6
models are excluded. gpt-5.1/5.2 return HTTP 500 or stall the stream when the
- **Models:** the gpt-5.6 family, plus `gpt-6-astra` (and its `-900k` picker
alias) on official Codex subscription OAuth. Astra on the direct API, other
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).
- **Routes:** `api.openai.com` (OpenAI API key) or the ChatGPT Codex backend
(Codex subscription OAuth) only. xAI, GitHub/Copilot, OpenRouter, relays, and