From 4a464ab78c856e0ed8a11f8460379c1c1ca14a1f Mon Sep 17 00:00:00 2001 From: openhands Date: Tue, 10 Mar 2026 13:59:50 +0000 Subject: [PATCH 1/3] Add gpt-5.4-codex to resolve_model_config.py Co-authored-by: openhands --- .github/run-eval/resolve_model_config.py | 5 +++++ 1 file changed, 5 insertions(+) mode change 100755 => 100644 .github/run-eval/resolve_model_config.py diff --git a/.github/run-eval/resolve_model_config.py b/.github/run-eval/resolve_model_config.py old mode 100755 new mode 100644 index c21ecc8888..bfde570044 --- a/.github/run-eval/resolve_model_config.py +++ b/.github/run-eval/resolve_model_config.py @@ -132,6 +132,11 @@ "display_name": "GPT-5.3 Codex", "llm_config": {"model": "litellm_proxy/gpt-5-3-codex"}, }, + "gpt-5.4-codex": { + "id": "gpt-5.4-codex", + "display_name": "GPT-5.4 Codex", + "llm_config": {"model": "litellm_proxy/gpt-5.4-codex"}, + }, "gpt-5.2-high-reasoning": { "id": "gpt-5.2-high-reasoning", "display_name": "GPT-5.2 High Reasoning", From 1f4d7345fbe68f7ace70eff0498905cb34700b11 Mon Sep 17 00:00:00 2001 From: openhands Date: Tue, 10 Mar 2026 14:01:57 +0000 Subject: [PATCH 2/3] Fix file permissions Co-authored-by: openhands --- .github/run-eval/resolve_model_config.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 .github/run-eval/resolve_model_config.py diff --git a/.github/run-eval/resolve_model_config.py b/.github/run-eval/resolve_model_config.py old mode 100644 new mode 100755 From 79de66ee06f559fc8cad86bae731c6f0181d3271 Mon Sep 17 00:00:00 2001 From: openhands Date: Wed, 11 Mar 2026 16:28:28 +0000 Subject: [PATCH 3/3] Add test and heuristics for gpt-5.4-codex - Add gpt-5.4-codex to model variant patterns in model_prompt_spec.py - Add test_gpt_5_4_codex_config() test for configuration validation - Add gpt-5.4-codex to reasoning effort test cases Co-authored-by: openhands --- .../openhands/sdk/llm/utils/model_prompt_spec.py | 8 +++++++- tests/github_workflows/test_resolve_model_config.py | 9 +++++++++ tests/sdk/llm/test_model_features.py | 1 + 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/openhands-sdk/openhands/sdk/llm/utils/model_prompt_spec.py b/openhands-sdk/openhands/sdk/llm/utils/model_prompt_spec.py index da226703a3..a61185fb0f 100644 --- a/openhands-sdk/openhands/sdk/llm/utils/model_prompt_spec.py +++ b/openhands-sdk/openhands/sdk/llm/utils/model_prompt_spec.py @@ -38,7 +38,13 @@ class ModelPromptSpec(BaseModel): "openai_gpt": ( ( "gpt-5-codex", - ("gpt-5-codex", "gpt-5.1-codex", "gpt-5.2-codex", "gpt-5.3-codex"), + ( + "gpt-5-codex", + "gpt-5.1-codex", + "gpt-5.2-codex", + "gpt-5.3-codex", + "gpt-5.4-codex", + ), ), ("gpt-5", ("gpt-5", "gpt-5.1", "gpt-5.2")), ), diff --git a/tests/github_workflows/test_resolve_model_config.py b/tests/github_workflows/test_resolve_model_config.py index 2ed496df68..e1b0ea0228 100644 --- a/tests/github_workflows/test_resolve_model_config.py +++ b/tests/github_workflows/test_resolve_model_config.py @@ -491,3 +491,12 @@ def test_models_importable_without_litellm(): f"stderr: {result.stderr}" ) assert "SUCCESS" in result.stdout + + +def test_gpt_5_4_codex_config(): + """Test that gpt-5.4-codex has correct configuration.""" + model = MODELS["gpt-5.4-codex"] + + assert model["id"] == "gpt-5.4-codex" + assert model["display_name"] == "GPT-5.4 Codex" + assert model["llm_config"]["model"] == "litellm_proxy/gpt-5.4-codex" diff --git a/tests/sdk/llm/test_model_features.py b/tests/sdk/llm/test_model_features.py index 9032c8dd39..297683abdb 100644 --- a/tests/sdk/llm/test_model_features.py +++ b/tests/sdk/llm/test_model_features.py @@ -39,6 +39,7 @@ def test_model_matches(name, pattern, expected): # GPT-5 family ("gpt-5.2", True), ("gpt-5.2-codex", True), + ("gpt-5.4-codex", True), ("gpt-4o", False), ("claude-3-5-sonnet", False), ("gemini-1.5-pro", False),