diff --git a/cookbooks/codex-coding/codex_agent.py b/cookbooks/codex-coding/codex_agent.py index aa3aaa418..ce489cb94 100644 --- a/cookbooks/codex-coding/codex_agent.py +++ b/cookbooks/codex-coding/codex_agent.py @@ -37,6 +37,7 @@ "gpt-5.1", "gpt-5.3-codex", "gpt-5.4", + "gpt-5.6", } PROMPT_TEMPLATE = """You are a skilled software developer. Complete the following task: diff --git a/docs/changelog.mdx b/docs/changelog.mdx index 04625fbca..7105e9a4d 100644 --- a/docs/changelog.mdx +++ b/docs/changelog.mdx @@ -3,6 +3,17 @@ title: "Changelog" description: "Product updates and release notes for the HUD SDK and platform, covering new features, CLI commands, integrations, and UI changes by release date." --- + +## GPT-5.6 Support + +- **GPT-5.6 family** — `gpt-5.6` (Sol), `gpt-5.6-terra`, and `gpt-5.6-luna` are available through the + HUD gateway and `create_agent`. `OpenAIAgent` now defaults to `gpt-5.6`. +- **Reasoning controls** — GPT-5.6 reasoning passes through `OpenAIConfig.reasoning` unchanged: effort + levels `none` through `xhigh` and `max`, and `mode` (`standard` or `pro`). +- **OpenAI SDK floor** — the SDK now requires `openai>=2.45.0` (Responses API function-call outputs use + the current content-item types). + + ## Models, Tasksets, Templates & Sharing diff --git a/docs/v6/reference/agents.mdx b/docs/v6/reference/agents.mdx index 1f32b2961..28339d989 100644 --- a/docs/v6/reference/agents.mdx +++ b/docs/v6/reference/agents.mdx @@ -56,7 +56,7 @@ agent = ClaudeAgent(ClaudeConfig(model="claude-sonnet-4-5", max_steps=30)) | Agent | Config | Default model | |-------|--------|---------------| | `ClaudeAgent` | `ClaudeConfig` | `claude-sonnet-4-6` | -| `OpenAIAgent` | `OpenAIConfig` | `gpt-5.5` | +| `OpenAIAgent` | `OpenAIConfig` | `gpt-5.6` | | `GeminiAgent` | `GeminiConfig` | `gemini-3-pro-preview` | | `OpenAIChatAgent` | `OpenAIChatConfig` | `gpt-5.4-mini` | | `ClaudeSDKAgent` | `ClaudeSDKConfig` | `claude-sonnet-4-6` | diff --git a/hud/agents/openai/tools/base.py b/hud/agents/openai/tools/base.py index 734c0a6cb..9f7c912a6 100644 --- a/hud/agents/openai/tools/base.py +++ b/hud/agents/openai/tools/base.py @@ -12,7 +12,6 @@ ResponseInputFileContentParam, ResponseInputImageContentParam, ResponseInputTextContentParam, - ResponseInputTextParam, ) from openai.types.responses.response_input_param import FunctionCallOutput, ResponseInputItemParam @@ -76,7 +75,7 @@ def format_openai_result(call: MCPToolCall, result: MCPToolResult) -> ResponseIn logger.warning("Unknown content block type: %s", type(block)) if not output_items: - output_items.append(ResponseInputTextParam(type="input_text", text="")) + output_items.append(ResponseInputTextContentParam(type="input_text", text="")) return cast( "ResponseInputItemParam", diff --git a/hud/agents/tests/test_openai_agent.py b/hud/agents/tests/test_openai_agent.py index b7dd88297..e3d9e4503 100644 --- a/hud/agents/tests/test_openai_agent.py +++ b/hud/agents/tests/test_openai_agent.py @@ -11,7 +11,9 @@ from openai.types.responses import ResponseOutputText from hud.agents.openai.agent import OpenAIAgent, OpenAIRunState +from hud.agents.openai.tools.base import format_openai_result from hud.agents.types import OpenAIConfig +from hud.types import MCPToolCall, MCPToolResult class FakeResponses: @@ -39,6 +41,17 @@ def test_format_message_shapes_user_text() -> None: assert msg["role"] == "user" +def test_format_openai_result_empty_output_emits_one_text_item() -> None: + # The Responses API rejects a function_call_output with an empty output + # list, so a contentless tool result must still produce one input_text item. + call = MCPToolCall(id="call_1", name="noop") + formatted = cast("dict[str, Any]", format_openai_result(call, MCPToolResult(content=[]))) + + assert formatted["type"] == "function_call_output" + assert formatted["call_id"] == "call_1" + assert formatted["output"] == [{"type": "input_text", "text": ""}] + + def _api_response( id: str, output: list[Any], usage: Any = None, incomplete_details: Any = None ) -> Any: diff --git a/hud/agents/types.py b/hud/agents/types.py index 8bafff7e9..81c566d79 100644 --- a/hud/agents/types.py +++ b/hud/agents/types.py @@ -103,7 +103,7 @@ class OpenAIConfig(AgentConfig): """Configuration for OpenAIAgent.""" model_name: str = "OpenAI" - model: str = Field(default="gpt-5.5", validation_alias=_model_alias) + model: str = Field(default="gpt-5.6", validation_alias=_model_alias) max_output_tokens: int | None = None temperature: float | None = None reasoning: Any = None # openai Reasoning diff --git a/hud/cli/eval.py b/hud/cli/eval.py index 0a071b53b..f0d05c56e 100644 --- a/hud/cli/eval.py +++ b/hud/cli/eval.py @@ -119,6 +119,7 @@ class AgentPreset: _AGENT_PRESETS: list[AgentPreset] = [ AgentPreset("Claude Sonnet 4.6", AgentType.CLAUDE, "claude-sonnet-4-6"), AgentPreset("Claude Opus 4.8", AgentType.CLAUDE, "claude-opus-4-8"), + AgentPreset("GPT-5.6", AgentType.OPENAI, "gpt-5.6"), AgentPreset("GPT-5.5", AgentType.OPENAI, "gpt-5.5"), AgentPreset("Gemini 3.1 Pro (Preview)", AgentType.GEMINI, "gemini-3.1-pro-preview"), AgentPreset( @@ -176,7 +177,7 @@ class AgentPreset: # use_computer_beta = true [openai] -# model = "gpt-5.5" +# model = "gpt-5.6" # temperature = 0.7 # max_output_tokens = 4096 diff --git a/hud/eval/tests/test_rollout.py b/hud/eval/tests/test_rollout.py index 3473d5a1c..4995a9505 100644 --- a/hud/eval/tests/test_rollout.py +++ b/hud/eval/tests/test_rollout.py @@ -249,7 +249,9 @@ async def start_child(): try: with pytest.raises(RuntimeError, match="startup boom"): - async with SubprocessRuntime(env_file, ready_timeout=2.0)(Task(env="leaky", id="noop")): + async with SubprocessRuntime(env_file, ready_timeout=30.0)( + Task(env="leaky", id="noop") + ): pass pid = int(pid_file.read_text()) assert await _wait_for_pid_inactive(pid) diff --git a/hud/tests/test_version.py b/hud/tests/test_version.py index 13019b107..c569e4d2a 100644 --- a/hud/tests/test_version.py +++ b/hud/tests/test_version.py @@ -1,8 +1,10 @@ from __future__ import annotations +from importlib.metadata import version + def test_import(): """Test that the package can be imported.""" import hud - assert hud.__version__ == "0.6.9" + assert hud.__version__ == version("hud") diff --git a/pyproject.toml b/pyproject.toml index 527b7436c..a194b1974 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,7 +18,7 @@ dependencies = [ "mcp>=1.24.0,<2.0", "fastmcp==3.0.2", # For all inference agents - "openai==2.44.0", + "openai>=2.45.0", "anthropic>=0.78.0", "google-genai", # CLI dependencies