From f1b958b32a99b075abdb303cf0374746c028be38 Mon Sep 17 00:00:00 2001 From: olegdater Date: Fri, 1 May 2026 10:09:38 +0400 Subject: [PATCH 1/3] feat(codex): add gpt-5.3-codex-spark model --- hermes_cli/codex_models.py | 2 ++ tests/hermes_cli/test_codex_models.py | 10 ++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/hermes_cli/codex_models.py b/hermes_cli/codex_models.py index e39b2c5943b7d..8ff2dd60a89c6 100644 --- a/hermes_cli/codex_models.py +++ b/hermes_cli/codex_models.py @@ -16,6 +16,7 @@ "gpt-5.4-mini", "gpt-5.4", "gpt-5.3-codex", + "gpt-5.3-codex-spark", "gpt-5.2-codex", "gpt-5.1-codex-max", "gpt-5.1-codex-mini", @@ -26,6 +27,7 @@ ("gpt-5.4-mini", ("gpt-5.3-codex", "gpt-5.2-codex")), ("gpt-5.4", ("gpt-5.3-codex", "gpt-5.2-codex")), ("gpt-5.3-codex", ("gpt-5.2-codex",)), + ("gpt-5.3-codex-spark", ("gpt-5.3-codex", "gpt-5.2-codex")), ] diff --git a/tests/hermes_cli/test_codex_models.py b/tests/hermes_cli/test_codex_models.py index 949d1c8e2395a..821558a1413d4 100644 --- a/tests/hermes_cli/test_codex_models.py +++ b/tests/hermes_cli/test_codex_models.py @@ -54,7 +54,7 @@ def test_get_codex_model_ids_falls_back_to_curated_defaults(tmp_path, monkeypatc assert models[: len(DEFAULT_CODEX_MODELS)] == DEFAULT_CODEX_MODELS assert "gpt-5.4" in models - assert "gpt-5.3-codex-spark" not in models + assert "gpt-5.3-codex-spark" in models def test_get_codex_model_ids_adds_forward_compat_models_from_templates(monkeypatch): @@ -65,7 +65,13 @@ def test_get_codex_model_ids_adds_forward_compat_models_from_templates(monkeypat models = get_codex_model_ids(access_token="codex-access-token") - assert models == ["gpt-5.2-codex", "gpt-5.4-mini", "gpt-5.4", "gpt-5.3-codex"] + assert models == [ + "gpt-5.2-codex", + "gpt-5.4-mini", + "gpt-5.4", + "gpt-5.3-codex", + "gpt-5.3-codex-spark", + ] def test_model_command_uses_runtime_access_token_for_codex_list(monkeypatch): From d2c8b677c5117f21632268f13e2bcdcc22e888f4 Mon Sep 17 00:00:00 2001 From: olegdater Date: Fri, 1 May 2026 11:12:52 +0400 Subject: [PATCH 2/3] fix(model-metadata): restore gpt-5.3-codex-spark fallback context --- agent/model_metadata.py | 1 + tests/agent/test_model_metadata.py | 1 + 2 files changed, 2 insertions(+) diff --git a/agent/model_metadata.py b/agent/model_metadata.py index 12117f1446bdf..ba55f84f1f381 100644 --- a/agent/model_metadata.py +++ b/agent/model_metadata.py @@ -1095,6 +1095,7 @@ def _query_anthropic_context_length(model: str, base_url: str, api_key: str) -> "gpt-5.1-codex-max": 272_000, "gpt-5.1-codex-mini": 272_000, "gpt-5.3-codex": 272_000, + "gpt-5.3-codex-spark": 272_000, "gpt-5.2-codex": 272_000, "gpt-5.4-mini": 272_000, "gpt-5.5": 272_000, diff --git a/tests/agent/test_model_metadata.py b/tests/agent/test_model_metadata.py index c28b68226b8e7..44b188ea516bf 100644 --- a/tests/agent/test_model_metadata.py +++ b/tests/agent/test_model_metadata.py @@ -266,6 +266,7 @@ def test_fallback_table_used_without_token(self): "gpt-5.4", "gpt-5.4-mini", "gpt-5.3-codex", + "gpt-5.3-codex-spark", "gpt-5.2-codex", "gpt-5.1-codex-max", "gpt-5.1-codex-mini", From c53048678dbab0fb6a7f3829e180e23d60865cdc Mon Sep 17 00:00:00 2001 From: olegdater Date: Fri, 1 May 2026 11:16:49 +0400 Subject: [PATCH 3/3] fix(model-metadata): set codex-spark fallback context to 128k --- agent/model_metadata.py | 2 +- tests/agent/test_model_metadata.py | 29 ++++++++++++++++------------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/agent/model_metadata.py b/agent/model_metadata.py index ba55f84f1f381..2d24ce48c8a54 100644 --- a/agent/model_metadata.py +++ b/agent/model_metadata.py @@ -1095,7 +1095,7 @@ def _query_anthropic_context_length(model: str, base_url: str, api_key: str) -> "gpt-5.1-codex-max": 272_000, "gpt-5.1-codex-mini": 272_000, "gpt-5.3-codex": 272_000, - "gpt-5.3-codex-spark": 272_000, + "gpt-5.3-codex-spark": 128_000, "gpt-5.2-codex": 272_000, "gpt-5.4-mini": 272_000, "gpt-5.5": 272_000, diff --git a/tests/agent/test_model_metadata.py b/tests/agent/test_model_metadata.py index 44b188ea516bf..027f7da686f90 100644 --- a/tests/agent/test_model_metadata.py +++ b/tests/agent/test_model_metadata.py @@ -244,8 +244,9 @@ def test_dict_is_not_empty(self): class TestCodexOAuthContextLength: """ChatGPT Codex OAuth imposes lower context limits than the direct OpenAI API for the same slugs. Verified Apr 2026 via live probe of - chatgpt.com/backend-api/codex/models: every model returns 272k, while + chatgpt.com/backend-api/codex/models: most models return 272k, while models.dev reports 1.05M for gpt-5.5/gpt-5.4 and 400k for the rest. + (Known exception: gpt-5.3-codex-spark is 128k.) """ def setup_method(self): @@ -259,26 +260,28 @@ def test_fallback_table_used_without_token(self): """ from agent.model_metadata import get_model_context_length + expected = { + "gpt-5.5": 272_000, + "gpt-5.4": 272_000, + "gpt-5.4-mini": 272_000, + "gpt-5.3-codex": 272_000, + "gpt-5.3-codex-spark": 128_000, + "gpt-5.2-codex": 272_000, + "gpt-5.1-codex-max": 272_000, + "gpt-5.1-codex-mini": 272_000, + } + with patch("agent.model_metadata.get_cached_context_length", return_value=None), \ patch("agent.model_metadata.save_context_length"): - for model in ( - "gpt-5.5", - "gpt-5.4", - "gpt-5.4-mini", - "gpt-5.3-codex", - "gpt-5.3-codex-spark", - "gpt-5.2-codex", - "gpt-5.1-codex-max", - "gpt-5.1-codex-mini", - ): + for model, expected_ctx in expected.items(): ctx = get_model_context_length( model=model, base_url="https://chatgpt.com/backend-api/codex", api_key="", provider="openai-codex", ) - assert ctx == 272_000, ( - f"Codex {model}: expected 272000 fallback, got {ctx} " + assert ctx == expected_ctx, ( + f"Codex {model}: expected {expected_ctx} fallback, got {ctx} " "(models.dev leakage?)" )