Skip to content
Merged
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
4 changes: 4 additions & 0 deletions hyperbrowser/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,9 @@
HyperAgentLlm,
BrowserUseLlm,
ClaudeComputerUseLlm,
ClaudeComputerUseReasoningEffort,
CuaLlm,
CuaReasoningEffort,
GrokComputerUseLlm,
GrokReasoningEffort,
MetaComputerUseLlm,
Expand Down Expand Up @@ -428,7 +430,9 @@
"HyperAgentLlm",
"BrowserUseLlm",
"ClaudeComputerUseLlm",
"ClaudeComputerUseReasoningEffort",
"CuaLlm",
"CuaReasoningEffort",
"Country",
"DownloadsStatus",
"FetchScreenshotFormat",
Expand Down
5 changes: 4 additions & 1 deletion hyperbrowser/models/agents/claude_computer_use.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from pydantic import BaseModel, ConfigDict, Field

from ..session import CreateSessionParams
from ..consts import ClaudeComputerUseLlm
from ..consts import ClaudeComputerUseLlm, ClaudeComputerUseReasoningEffort

ClaudeComputerUseTaskStatus = Literal[
"pending", "running", "completed", "failed", "stopped"
Expand Down Expand Up @@ -35,6 +35,9 @@ class StartClaudeComputerUseTaskParams(BaseModel):

task: str
llm: Optional[ClaudeComputerUseLlm] = Field(default=None, serialization_alias="llm")
reasoning_effort: Optional[ClaudeComputerUseReasoningEffort] = Field(
default=None, serialization_alias="reasoningEffort"
)
session_id: Optional[str] = Field(default=None, serialization_alias="sessionId")
max_failures: Optional[int] = Field(default=None, serialization_alias="maxFailures")
max_steps: Optional[int] = Field(default=None, serialization_alias="maxSteps")
Expand Down
5 changes: 4 additions & 1 deletion hyperbrowser/models/agents/cua.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

from pydantic import BaseModel, ConfigDict, Field

from ..consts import CuaLlm
from ..consts import CuaLlm, CuaReasoningEffort
from ..session import CreateSessionParams

CuaTaskStatus = Literal["pending", "running", "completed", "failed", "stopped"]
Expand Down Expand Up @@ -45,6 +45,9 @@ class StartCuaTaskParams(BaseModel):

task: str
llm: Optional[CuaLlm] = Field(default=None, serialization_alias="llm")
reasoning_effort: Optional[CuaReasoningEffort] = Field(
default=None, serialization_alias="reasoningEffort"
)
session_id: Optional[str] = Field(default=None, serialization_alias="sessionId")
max_failures: Optional[int] = Field(default=None, serialization_alias="maxFailures")
max_steps: Optional[int] = Field(default=None, serialization_alias="maxSteps")
Expand Down
15 changes: 15 additions & 0 deletions hyperbrowser/models/consts.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,13 @@
"claude-sonnet-4-20250514",
"claude-3-7-sonnet-20250219",
]
ClaudeComputerUseReasoningEffort = Literal[
"low",
"medium",
"high",
"xhigh",
"max",
]
CuaLlm = Literal[
"computer-use-preview",
"gpt-6-astra",
Expand All @@ -91,6 +98,14 @@
"gpt-5.4",
"gpt-5.4-mini",
]
CuaReasoningEffort = Literal[
"none",
"low",
"medium",
"high",
"xhigh",
"max",
]
GeminiComputerUseLlm = Literal[
"gemini-3.8-flash",
"gemini-3.7-flash",
Expand Down
4 changes: 4 additions & 0 deletions hyperbrowser/types/agents.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
BrowserUseLlm,
BrowserUseVersion,
ClaudeComputerUseLlm,
ClaudeComputerUseReasoningEffort,
CuaLlm,
CuaReasoningEffort,
GeminiComputerUseLlm,
GrokComputerUseLlm,
GrokReasoningEffort,
Expand Down Expand Up @@ -66,6 +68,7 @@ class StartClaudeComputerUseTaskParams(TypedDict, total=False):

task: Required[str]
llm: Optional[ClaudeComputerUseLlm]
reasoning_effort: Optional[ClaudeComputerUseReasoningEffort]
session_id: Optional[str]
max_failures: Optional[int]
max_steps: Optional[int]
Expand Down Expand Up @@ -158,6 +161,7 @@ class StartCuaTaskParams(TypedDict, total=False):

task: Required[str]
llm: Optional[CuaLlm]
reasoning_effort: Optional[CuaReasoningEffort]
session_id: Optional[str]
max_failures: Optional[int]
max_steps: Optional[int]
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "hyperbrowser"
version = "1.4.2"
version = "1.4.3"
description = "Python SDK for hyperbrowser"
authors = ["Nikhil Shahi <nshahi1998@gmail.com>"]
license = "MIT"
Expand Down
37 changes: 37 additions & 0 deletions tests/test_request_compat.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,13 @@
normalize_pydantic_schema,
)
from hyperbrowser.models import (
ClaudeComputerUseApiKeys,
CuaBaseUrls,
CreateSandboxParams,
CreateSessionParams,
MetaComputerUseApiKeys,
StartBrowserUseTaskParams,
StartClaudeComputerUseTaskParams,
StartCuaTaskParams,
StartMetaComputerUseTaskParams,
)
Expand Down Expand Up @@ -83,6 +85,8 @@ def test_mapping_uses_existing_cross_field_validation():
def test_cua_custom_base_url_serializes_for_mapping_and_legacy_model():
mapping = {
"task": "Complete the task",
"llm": "gpt-5.6-terra",
"reasoning_effort": "high",
"use_custom_api_keys": True,
"api_keys": {"openai": "openai-key"},
"base_urls": {
Expand All @@ -91,6 +95,8 @@ def test_cua_custom_base_url_serializes_for_mapping_and_legacy_model():
}
legacy = StartCuaTaskParams(
task="Complete the task",
llm="gpt-5.6-terra",
reasoning_effort="high",
use_custom_api_keys=True,
api_keys={"openai": "openai-key"},
base_urls=CuaBaseUrls(openai="https://example.openai.azure.com/openai/v1/"),
Expand All @@ -102,6 +108,8 @@ def test_cua_custom_base_url_serializes_for_mapping_and_legacy_model():
)
assert dump_request(mapping, StartCuaTaskParams) == {
"task": "Complete the task",
"llm": "gpt-5.6-terra",
"reasoningEffort": "high",
"useCustomApiKeys": True,
"apiKeys": {"openai": "openai-key"},
"baseUrls": {
Expand All @@ -110,6 +118,35 @@ def test_cua_custom_base_url_serializes_for_mapping_and_legacy_model():
}


def test_claude_computer_use_serializes_reasoning_effort_for_mapping_and_legacy_model():
mapping = {
"task": "Complete the task",
"llm": "claude-opus-5",
"reasoning_effort": "xhigh",
"use_custom_api_keys": True,
"api_keys": {"anthropic": "anthropic-key"},
}
legacy = StartClaudeComputerUseTaskParams(
task="Complete the task",
llm="claude-opus-5",
reasoning_effort="xhigh",
use_custom_api_keys=True,
api_keys=ClaudeComputerUseApiKeys(anthropic="anthropic-key"),
)

assert dump_request(mapping, StartClaudeComputerUseTaskParams) == dump_request(
legacy,
StartClaudeComputerUseTaskParams,
)
assert dump_request(mapping, StartClaudeComputerUseTaskParams) == {
"task": "Complete the task",
"llm": "claude-opus-5",
"reasoningEffort": "xhigh",
"useCustomApiKeys": True,
"apiKeys": {"anthropic": "anthropic-key"},
}


def test_meta_computer_use_serializes_for_mapping_and_legacy_model():
mapping = {
"task": "Complete the task",
Expand Down
18 changes: 18 additions & 0 deletions tests/typecheck/valid_requests.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,13 +99,22 @@ def valid_sync_requests(client: Hyperbrowser) -> None:
client.agents.cua.start(
{
"task": "Complete the task",
"llm": "gpt-5.6-terra",
"reasoning_effort": "high",
"use_custom_api_keys": True,
"api_keys": {"openai": "openai-key"},
"base_urls": {
"openai": "https://example.openai.azure.com/openai/v1/",
},
}
)
client.agents.claude_computer_use.start(
{
"task": "Complete the task",
"llm": "claude-opus-5",
"reasoning_effort": "xhigh",
}
)
client.agents.meta_computer_use.start(
{
"task": "Complete the task",
Expand Down Expand Up @@ -235,13 +244,22 @@ async def valid_async_requests(client: AsyncHyperbrowser) -> None:
await client.agents.cua.start(
{
"task": "Complete the task",
"llm": "gpt-5.4",
"reasoning_effort": "none",
"use_custom_api_keys": True,
"api_keys": {"openai": "openai-key"},
"base_urls": {
"openai": "https://example.openai.azure.com/openai/v1/",
},
}
)
await client.agents.claude_computer_use.start(
{
"task": "Complete the task",
"llm": "claude-sonnet-4-6",
"reasoning_effort": "max",
}
)
await client.agents.meta_computer_use.start(
{
"task": "Complete the task",
Expand Down