diff --git a/.github/run-eval/resolve_model_config.py b/.github/run-eval/resolve_model_config.py index c21ecc8888..0705f9ccb6 100755 --- a/.github/run-eval/resolve_model_config.py +++ b/.github/run-eval/resolve_model_config.py @@ -140,6 +140,14 @@ "reasoning_effort": "high", }, }, + "gpt-5.4": { + "id": "gpt-5.4", + "display_name": "GPT-5.4", + "llm_config": { + "model": "litellm_proxy/openai/gpt-5.4", + "reasoning_effort": "high", + }, + }, "minimax-m2": { "id": "minimax-m2", "display_name": "MiniMax M2", diff --git a/openhands-sdk/openhands/sdk/llm/utils/model_features.py b/openhands-sdk/openhands/sdk/llm/utils/model_features.py index 2b1fec563f..6ca4b1badd 100644 --- a/openhands-sdk/openhands/sdk/llm/utils/model_features.py +++ b/openhands-sdk/openhands/sdk/llm/utils/model_features.py @@ -69,6 +69,7 @@ class ModelFeatures: "gemini-3.1-pro-preview", # OpenAI GPT-5 family (includes mini variants) "gpt-5", + "gpt-5.4", # Anthropic Opus 4.5 and 4.6 "claude-opus-4-5", "claude-opus-4-6", 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..a3fe71fffe 100644 --- a/openhands-sdk/openhands/sdk/llm/utils/model_prompt_spec.py +++ b/openhands-sdk/openhands/sdk/llm/utils/model_prompt_spec.py @@ -40,7 +40,7 @@ class ModelPromptSpec(BaseModel): "gpt-5-codex", ("gpt-5-codex", "gpt-5.1-codex", "gpt-5.2-codex", "gpt-5.3-codex"), ), - ("gpt-5", ("gpt-5", "gpt-5.1", "gpt-5.2")), + ("gpt-5", ("gpt-5", "gpt-5.1", "gpt-5.2", "gpt-5.4")), ), } diff --git a/tests/github_workflows/test_resolve_model_config.py b/tests/github_workflows/test_resolve_model_config.py index 2ed496df68..7e4c2ce145 100644 --- a/tests/github_workflows/test_resolve_model_config.py +++ b/tests/github_workflows/test_resolve_model_config.py @@ -491,3 +491,13 @@ def test_models_importable_without_litellm(): f"stderr: {result.stderr}" ) assert "SUCCESS" in result.stdout + + +def test_gpt_5_4_config(): + """Test that gpt-5.4 has correct configuration.""" + model = MODELS["gpt-5.4"] + + assert model["id"] == "gpt-5.4" + assert model["display_name"] == "GPT-5.4" + assert model["llm_config"]["model"] == "litellm_proxy/openai/gpt-5.4" + assert model["llm_config"]["reasoning_effort"] == "high" diff --git a/tests/sdk/llm/test_model_features.py b/tests/sdk/llm/test_model_features.py index 9032c8dd39..13c5f8e668 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", True), ("gpt-4o", False), ("claude-3-5-sonnet", False), ("gemini-1.5-pro", False),