From 9317579eb49d99effd4f33cc86cbb5b828aa29b5 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 14 Oct 2026 22:20:59 +0000 Subject: [PATCH] Add Gemini 4 Argon and reasoning effort to Gemini Computer Use Co-authored-by: nikhil --- hyperbrowser/models/__init__.py | 4 ++ .../models/agents/gemini_computer_use.py | 5 ++- hyperbrowser/models/consts.py | 8 ++++ hyperbrowser/types/agents.py | 2 + pyproject.toml | 2 +- tests/test_request_compat.py | 38 +++++++++++++++++++ tests/typecheck/invalid_requests.py | 7 ++++ tests/typecheck/valid_requests.py | 14 +++++++ 8 files changed, 78 insertions(+), 2 deletions(-) diff --git a/hyperbrowser/models/__init__.py b/hyperbrowser/models/__init__.py index 017c4cec..44801c68 100644 --- a/hyperbrowser/models/__init__.py +++ b/hyperbrowser/models/__init__.py @@ -195,6 +195,8 @@ ClaudeComputerUseReasoningEffort, CuaLlm, CuaReasoningEffort, + GeminiComputerUseLlm, + GeminiComputerUseReasoningEffort, GrokComputerUseLlm, GrokReasoningEffort, MetaComputerUseLlm, @@ -492,6 +494,8 @@ "ClaudeComputerUseReasoningEffort", "CuaLlm", "CuaReasoningEffort", + "GeminiComputerUseLlm", + "GeminiComputerUseReasoningEffort", "Country", "DownloadsStatus", "FetchScreenshotFormat", diff --git a/hyperbrowser/models/agents/gemini_computer_use.py b/hyperbrowser/models/agents/gemini_computer_use.py index 9e567e9e..04074ba8 100644 --- a/hyperbrowser/models/agents/gemini_computer_use.py +++ b/hyperbrowser/models/agents/gemini_computer_use.py @@ -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" @@ -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") diff --git a/hyperbrowser/models/consts.py b/hyperbrowser/models/consts.py index dc36195f..36f703f2 100644 --- a/hyperbrowser/models/consts.py +++ b/hyperbrowser/models/consts.py @@ -115,6 +115,7 @@ "max", ] GeminiComputerUseLlm = Literal[ + "gemini-4-argon", "gemini-3.8-flash", "gemini-3.7-flash", "gemini-3.6-flash", @@ -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", diff --git a/hyperbrowser/types/agents.py b/hyperbrowser/types/agents.py index bb6592e0..f75a8e48 100644 --- a/hyperbrowser/types/agents.py +++ b/hyperbrowser/types/agents.py @@ -10,6 +10,7 @@ CuaLlm, CuaReasoningEffort, GeminiComputerUseLlm, + GeminiComputerUseReasoningEffort, GrokComputerUseLlm, GrokReasoningEffort, MetaComputerUseLlm, @@ -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] diff --git a/pyproject.toml b/pyproject.toml index 0221793d..49639501 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "hyperbrowser" -version = "1.12.0" +version = "1.12.1" description = "Python SDK for hyperbrowser" authors = ["Nikhil Shahi "] license = "MIT" diff --git a/tests/test_request_compat.py b/tests/test_request_compat.py index af493577..b503c0e0 100644 --- a/tests/test_request_compat.py +++ b/tests/test_request_compat.py @@ -12,11 +12,13 @@ CuaBaseUrls, CreateSandboxParams, CreateSessionParams, + GeminiComputerUseApiKeys, JevComputerUseApiKeys, MetaComputerUseApiKeys, StartBrowserUseTaskParams, StartClaudeComputerUseTaskParams, StartCuaTaskParams, + StartGeminiComputerUseTaskParams, StartJevComputerUseTaskParams, StartMetaComputerUseTaskParams, ) @@ -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 = { diff --git a/tests/typecheck/invalid_requests.py b/tests/typecheck/invalid_requests.py index 7d2cea30..7781d188 100644 --- a/tests/typecheck/invalid_requests.py +++ b/tests/typecheck/invalid_requests.py @@ -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 diff --git a/tests/typecheck/valid_requests.py b/tests/typecheck/valid_requests.py index 5ae35200..07eb4465 100644 --- a/tests/typecheck/valid_requests.py +++ b/tests/typecheck/valid_requests.py @@ -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", @@ -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",