Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions cookbooks/codex-coding/codex_agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
11 changes: 11 additions & 0 deletions docs/changelog.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -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."
---

<Update label="July 14, 2026">
## 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).
</Update>

<Update label="May 6, 2026">
## Models, Tasksets, Templates & Sharing

Expand Down
2 changes: 1 addition & 1 deletion docs/v6/reference/agents.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -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` |
Expand Down
3 changes: 1 addition & 2 deletions hud/agents/openai/tools/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
ResponseInputFileContentParam,
ResponseInputImageContentParam,
ResponseInputTextContentParam,
ResponseInputTextParam,
)
from openai.types.responses.response_input_param import FunctionCallOutput, ResponseInputItemParam

Expand Down Expand Up @@ -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",
Expand Down
13 changes: 13 additions & 0 deletions hud/agents/tests/test_openai_agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion hud/agents/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion hud/cli/eval.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -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

Expand Down
4 changes: 3 additions & 1 deletion hud/eval/tests/test_rollout.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
4 changes: 3 additions & 1 deletion hud/tests/test_version.py
Original file line number Diff line number Diff line change
@@ -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")
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading