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 @@ -195,6 +195,8 @@
ClaudeComputerUseReasoningEffort,
CuaLlm,
CuaReasoningEffort,
GeminiComputerUseLlm,
GeminiComputerUseReasoningEffort,
GrokComputerUseLlm,
GrokReasoningEffort,
MetaComputerUseLlm,
Expand Down Expand Up @@ -492,6 +494,8 @@
"ClaudeComputerUseReasoningEffort",
"CuaLlm",
"CuaReasoningEffort",
"GeminiComputerUseLlm",
"GeminiComputerUseReasoningEffort",
"Country",
"DownloadsStatus",
"FetchScreenshotFormat",
Expand Down
5 changes: 4 additions & 1 deletion hyperbrowser/models/agents/gemini_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 GeminiComputerUseLlm
from ..consts import GeminiComputerUseLlm, GeminiComputerUseReasoningEffort

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

task: str
llm: Optional[GeminiComputerUseLlm] = Field(default=None, serialization_alias="llm")
reasoning_effort: Optional[GeminiComputerUseReasoningEffort] = 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
8 changes: 8 additions & 0 deletions hyperbrowser/models/consts.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@
"max",
]
GeminiComputerUseLlm = Literal[
"gemini-4-argon",
"gemini-3.8-flash",
"gemini-3.7-flash",
"gemini-3.6-flash",
Expand All @@ -123,6 +124,13 @@
"gemini-3-flash-preview",
"gemini-2.5-computer-use-preview-10-2025",
]
# Gemini 4 Argon, 3.8 Flash, and 3.7 Flash do not support "minimal".
GeminiComputerUseReasoningEffort = Literal[
"minimal",
"low",
"medium",
"high",
]
GrokComputerUseLlm = Literal[
"grok-4.7",
"grok-4.6",
Expand Down
2 changes: 2 additions & 0 deletions hyperbrowser/types/agents.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
CuaLlm,
CuaReasoningEffort,
GeminiComputerUseLlm,
GeminiComputerUseReasoningEffort,
GrokComputerUseLlm,
GrokReasoningEffort,
MetaComputerUseLlm,
Expand Down Expand Up @@ -92,6 +93,7 @@ class StartGeminiComputerUseTaskParams(TypedDict, total=False):

task: Required[str]
llm: Optional[GeminiComputerUseLlm]
reasoning_effort: Optional[GeminiComputerUseReasoningEffort]
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.12.0"
version = "1.12.1"
description = "Python SDK for hyperbrowser"
authors = ["Nikhil Shahi <nshahi1998@gmail.com>"]
license = "MIT"
Expand Down
38 changes: 38 additions & 0 deletions tests/test_request_compat.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,13 @@
CuaBaseUrls,
CreateSandboxParams,
CreateSessionParams,
GeminiComputerUseApiKeys,
JevComputerUseApiKeys,
MetaComputerUseApiKeys,
StartBrowserUseTaskParams,
StartClaudeComputerUseTaskParams,
StartCuaTaskParams,
StartGeminiComputerUseTaskParams,
StartJevComputerUseTaskParams,
StartMetaComputerUseTaskParams,
)
Expand Down Expand Up @@ -149,6 +151,42 @@ def test_claude_computer_use_serializes_reasoning_effort_for_mapping_and_legacy_
}


def test_gemini_computer_use_serializes_argon_reasoning_effort_for_mapping_and_legacy_model():
mapping = {
"task": "Complete the task",
"llm": "gemini-4-argon",
"reasoning_effort": "high",
"use_custom_api_keys": True,
"api_keys": {"google": "google-key"},
}
legacy = StartGeminiComputerUseTaskParams(
task="Complete the task",
llm="gemini-4-argon",
reasoning_effort="high",
use_custom_api_keys=True,
api_keys=GeminiComputerUseApiKeys(google="google-key"),
)

assert dump_request(mapping, StartGeminiComputerUseTaskParams) == dump_request(
legacy,
StartGeminiComputerUseTaskParams,
)
assert dump_request(mapping, StartGeminiComputerUseTaskParams) == {
"task": "Complete the task",
"llm": "gemini-4-argon",
"reasoningEffort": "high",
"useCustomApiKeys": True,
"apiKeys": {"google": "google-key"},
}


def test_gemini_computer_use_omits_reasoning_effort_when_unset():
assert dump_request(
{"task": "Complete the task", "llm": "gemini-4-argon"},
StartGeminiComputerUseTaskParams,
) == {"task": "Complete the task", "llm": "gemini-4-argon"}


@pytest.mark.parametrize("llm", ["muse-spark-1.3", "muse-wonder-1.0"])
def test_meta_computer_use_serializes_for_mapping_and_legacy_model(llm):
mapping = {
Expand Down
7 changes: 7 additions & 0 deletions tests/typecheck/invalid_requests.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,13 @@ def invalid_sync_requests(client: Hyperbrowser) -> None:
builder_scratch_mib="64g", # M,P
)
client.sandboxes.start_from_snapshot({"image_name": "node"}) # M,P
client.agents.gemini_computer_use.start(
{ # P
"task": "Complete the task",
"llm": "gemini-4-argon",
"reasoning_effort": "xhigh", # M
}
)
WebsiteExtractTool.runnable(
client,
{"urls": ["https://example.com"], "unknown": True}, # M,P
Expand Down
14 changes: 14 additions & 0 deletions tests/typecheck/valid_requests.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,13 @@ def valid_sync_requests(client: Hyperbrowser) -> None:
"reasoning_effort": "xhigh",
}
)
client.agents.gemini_computer_use.start(
{
"task": "Complete the task",
"llm": "gemini-4-argon",
"reasoning_effort": "high",
}
)
client.agents.jev_computer_use.start(
{
"task": "Find the order",
Expand Down Expand Up @@ -331,6 +338,13 @@ async def valid_async_requests(client: AsyncHyperbrowser) -> None:
"reasoning_effort": "max",
}
)
await client.agents.gemini_computer_use.start(
{
"task": "Complete the task",
"llm": "gemini-3.6-flash",
"reasoning_effort": "minimal",
}
)
await client.agents.jev_computer_use.start(
{
"task": "Find the order",
Expand Down