Skip to content

Commit 9317579

Browse files
cursoragentnikhil
andcommitted
Add Gemini 4 Argon and reasoning effort to Gemini Computer Use
Co-authored-by: nikhil <nikhil@metlo.com>
1 parent 13396c4 commit 9317579

8 files changed

Lines changed: 78 additions & 2 deletions

File tree

‎hyperbrowser/models/__init__.py‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,8 @@
195195
ClaudeComputerUseReasoningEffort,
196196
CuaLlm,
197197
CuaReasoningEffort,
198+
GeminiComputerUseLlm,
199+
GeminiComputerUseReasoningEffort,
198200
GrokComputerUseLlm,
199201
GrokReasoningEffort,
200202
MetaComputerUseLlm,
@@ -492,6 +494,8 @@
492494
"ClaudeComputerUseReasoningEffort",
493495
"CuaLlm",
494496
"CuaReasoningEffort",
497+
"GeminiComputerUseLlm",
498+
"GeminiComputerUseReasoningEffort",
495499
"Country",
496500
"DownloadsStatus",
497501
"FetchScreenshotFormat",

‎hyperbrowser/models/agents/gemini_computer_use.py‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from pydantic import BaseModel, ConfigDict, Field
66

77
from ..session import CreateSessionParams
8-
from ..consts import GeminiComputerUseLlm
8+
from ..consts import GeminiComputerUseLlm, GeminiComputerUseReasoningEffort
99

1010
GeminiComputerUseTaskStatus = Literal[
1111
"pending", "running", "completed", "failed", "stopped"
@@ -35,6 +35,9 @@ class StartGeminiComputerUseTaskParams(BaseModel):
3535

3636
task: str
3737
llm: Optional[GeminiComputerUseLlm] = Field(default=None, serialization_alias="llm")
38+
reasoning_effort: Optional[GeminiComputerUseReasoningEffort] = Field(
39+
default=None, serialization_alias="reasoningEffort"
40+
)
3841
session_id: Optional[str] = Field(default=None, serialization_alias="sessionId")
3942
max_failures: Optional[int] = Field(default=None, serialization_alias="maxFailures")
4043
max_steps: Optional[int] = Field(default=None, serialization_alias="maxSteps")

‎hyperbrowser/models/consts.py‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@
115115
"max",
116116
]
117117
GeminiComputerUseLlm = Literal[
118+
"gemini-4-argon",
118119
"gemini-3.8-flash",
119120
"gemini-3.7-flash",
120121
"gemini-3.6-flash",
@@ -123,6 +124,13 @@
123124
"gemini-3-flash-preview",
124125
"gemini-2.5-computer-use-preview-10-2025",
125126
]
127+
# Gemini 4 Argon, 3.8 Flash, and 3.7 Flash do not support "minimal".
128+
GeminiComputerUseReasoningEffort = Literal[
129+
"minimal",
130+
"low",
131+
"medium",
132+
"high",
133+
]
126134
GrokComputerUseLlm = Literal[
127135
"grok-4.7",
128136
"grok-4.6",

‎hyperbrowser/types/agents.py‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
CuaLlm,
1111
CuaReasoningEffort,
1212
GeminiComputerUseLlm,
13+
GeminiComputerUseReasoningEffort,
1314
GrokComputerUseLlm,
1415
GrokReasoningEffort,
1516
MetaComputerUseLlm,
@@ -92,6 +93,7 @@ class StartGeminiComputerUseTaskParams(TypedDict, total=False):
9293

9394
task: Required[str]
9495
llm: Optional[GeminiComputerUseLlm]
96+
reasoning_effort: Optional[GeminiComputerUseReasoningEffort]
9597
session_id: Optional[str]
9698
max_failures: Optional[int]
9799
max_steps: Optional[int]

‎pyproject.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "hyperbrowser"
3-
version = "1.12.0"
3+
version = "1.12.1"
44
description = "Python SDK for hyperbrowser"
55
authors = ["Nikhil Shahi <nshahi1998@gmail.com>"]
66
license = "MIT"

‎tests/test_request_compat.py‎

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@
1212
CuaBaseUrls,
1313
CreateSandboxParams,
1414
CreateSessionParams,
15+
GeminiComputerUseApiKeys,
1516
JevComputerUseApiKeys,
1617
MetaComputerUseApiKeys,
1718
StartBrowserUseTaskParams,
1819
StartClaudeComputerUseTaskParams,
1920
StartCuaTaskParams,
21+
StartGeminiComputerUseTaskParams,
2022
StartJevComputerUseTaskParams,
2123
StartMetaComputerUseTaskParams,
2224
)
@@ -149,6 +151,42 @@ def test_claude_computer_use_serializes_reasoning_effort_for_mapping_and_legacy_
149151
}
150152

151153

154+
def test_gemini_computer_use_serializes_argon_reasoning_effort_for_mapping_and_legacy_model():
155+
mapping = {
156+
"task": "Complete the task",
157+
"llm": "gemini-4-argon",
158+
"reasoning_effort": "high",
159+
"use_custom_api_keys": True,
160+
"api_keys": {"google": "google-key"},
161+
}
162+
legacy = StartGeminiComputerUseTaskParams(
163+
task="Complete the task",
164+
llm="gemini-4-argon",
165+
reasoning_effort="high",
166+
use_custom_api_keys=True,
167+
api_keys=GeminiComputerUseApiKeys(google="google-key"),
168+
)
169+
170+
assert dump_request(mapping, StartGeminiComputerUseTaskParams) == dump_request(
171+
legacy,
172+
StartGeminiComputerUseTaskParams,
173+
)
174+
assert dump_request(mapping, StartGeminiComputerUseTaskParams) == {
175+
"task": "Complete the task",
176+
"llm": "gemini-4-argon",
177+
"reasoningEffort": "high",
178+
"useCustomApiKeys": True,
179+
"apiKeys": {"google": "google-key"},
180+
}
181+
182+
183+
def test_gemini_computer_use_omits_reasoning_effort_when_unset():
184+
assert dump_request(
185+
{"task": "Complete the task", "llm": "gemini-4-argon"},
186+
StartGeminiComputerUseTaskParams,
187+
) == {"task": "Complete the task", "llm": "gemini-4-argon"}
188+
189+
152190
@pytest.mark.parametrize("llm", ["muse-spark-1.3", "muse-wonder-1.0"])
153191
def test_meta_computer_use_serializes_for_mapping_and_legacy_model(llm):
154192
mapping = {

‎tests/typecheck/invalid_requests.py‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,13 @@ def invalid_sync_requests(client: Hyperbrowser) -> None:
5151
builder_scratch_mib="64g", # M,P
5252
)
5353
client.sandboxes.start_from_snapshot({"image_name": "node"}) # M,P
54+
client.agents.gemini_computer_use.start(
55+
{ # P
56+
"task": "Complete the task",
57+
"llm": "gemini-4-argon",
58+
"reasoning_effort": "xhigh", # M
59+
}
60+
)
5461
WebsiteExtractTool.runnable(
5562
client,
5663
{"urls": ["https://example.com"], "unknown": True}, # M,P

‎tests/typecheck/valid_requests.py‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,13 @@ def valid_sync_requests(client: Hyperbrowser) -> None:
125125
"reasoning_effort": "xhigh",
126126
}
127127
)
128+
client.agents.gemini_computer_use.start(
129+
{
130+
"task": "Complete the task",
131+
"llm": "gemini-4-argon",
132+
"reasoning_effort": "high",
133+
}
134+
)
128135
client.agents.jev_computer_use.start(
129136
{
130137
"task": "Find the order",
@@ -331,6 +338,13 @@ async def valid_async_requests(client: AsyncHyperbrowser) -> None:
331338
"reasoning_effort": "max",
332339
}
333340
)
341+
await client.agents.gemini_computer_use.start(
342+
{
343+
"task": "Complete the task",
344+
"llm": "gemini-3.6-flash",
345+
"reasoning_effort": "minimal",
346+
}
347+
)
334348
await client.agents.jev_computer_use.start(
335349
{
336350
"task": "Find the order",

0 commit comments

Comments
 (0)