Skip to content

Commit a357d74

Browse files
committed
add custom baseurl for cua
1 parent 6cdca49 commit a357d74

6 files changed

Lines changed: 79 additions & 0 deletions

File tree

hyperbrowser/models/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@
134134
StartCuaTaskParams,
135135
StartCuaTaskResponse,
136136
CuaApiKeys,
137+
CuaBaseUrls,
137138
CuaTaskStatus,
138139
)
139140
from .agents.hyper_agent import (
@@ -493,6 +494,7 @@
493494
"GeminiComputerUseApiKeys",
494495
"GrokComputerUseApiKeys",
495496
"CuaApiKeys",
497+
"CuaBaseUrls",
496498
"HyperAgentApiKeys",
497499
"GrokComputerUseLlm",
498500
"GrokReasoningEffort",

hyperbrowser/models/agents/cua.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,18 @@ class CuaApiKeys(BaseModel):
2222
openai: Optional[str] = Field(default=None, serialization_alias="openai")
2323

2424

25+
class CuaBaseUrls(BaseModel):
26+
"""
27+
Provider base URLs for the CUA task.
28+
"""
29+
30+
model_config = ConfigDict(
31+
populate_by_alias=True,
32+
)
33+
34+
openai: Optional[str] = Field(default=None, serialization_alias="openai")
35+
36+
2537
class StartCuaTaskParams(BaseModel):
2638
"""
2739
Parameters for creating a new CUA task.
@@ -46,6 +58,9 @@ class StartCuaTaskParams(BaseModel):
4658
default=None, serialization_alias="useCustomApiKeys"
4759
)
4860
api_keys: Optional[CuaApiKeys] = Field(default=None, serialization_alias="apiKeys")
61+
base_urls: Optional[CuaBaseUrls] = Field(
62+
default=None, serialization_alias="baseUrls"
63+
)
4964
use_computer_action: Optional[bool] = Field(
5065
default=None, serialization_alias="useComputerAction"
5166
)

hyperbrowser/types/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
BrowserUseApiKeys,
1717
ClaudeComputerUseApiKeys,
1818
CuaApiKeys,
19+
CuaBaseUrls,
1920
GeminiComputerUseApiKeys,
2021
GrokComputerUseApiKeys,
2122
HyperAgentApiKeys,
@@ -173,6 +174,7 @@
173174
"BrowserUseApiKeys",
174175
"ClaudeComputerUseApiKeys",
175176
"CuaApiKeys",
177+
"CuaBaseUrls",
176178
"GeminiComputerUseApiKeys",
177179
"GrokComputerUseApiKeys",
178180
"HyperAgentApiKeys",

hyperbrowser/types/agents.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,12 @@ class CuaApiKeys(TypedDict, total=False):
123123
openai: Optional[str]
124124

125125

126+
class CuaBaseUrls(TypedDict, total=False):
127+
"""Provider base URLs for an OpenAI CUA task."""
128+
129+
openai: Optional[str]
130+
131+
126132
class StartCuaTaskParams(TypedDict, total=False):
127133
"""Parameters for starting an OpenAI CUA task."""
128134

@@ -135,6 +141,7 @@ class StartCuaTaskParams(TypedDict, total=False):
135141
session_options: Optional[CreateSessionParams]
136142
use_custom_api_keys: Optional[bool]
137143
api_keys: Optional[CuaApiKeys]
144+
base_urls: Optional[CuaBaseUrls]
138145
use_computer_action: Optional[bool]
139146

140147

@@ -165,6 +172,7 @@ class StartHyperAgentTaskParams(TypedDict, total=False):
165172
"BrowserUseApiKeys",
166173
"ClaudeComputerUseApiKeys",
167174
"CuaApiKeys",
175+
"CuaBaseUrls",
168176
"GeminiComputerUseApiKeys",
169177
"GrokComputerUseApiKeys",
170178
"HyperAgentApiKeys",

tests/test_request_compat.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@
88
normalize_pydantic_schema,
99
)
1010
from hyperbrowser.models import (
11+
CuaBaseUrls,
1112
CreateSandboxParams,
1213
CreateSessionParams,
1314
StartBrowserUseTaskParams,
15+
StartCuaTaskParams,
1416
)
1517
from hyperbrowser.tools import _normalize_extract_tool_params
1618

@@ -76,6 +78,36 @@ def test_mapping_uses_existing_cross_field_validation():
7678
)
7779

7880

81+
def test_cua_custom_base_url_serializes_for_mapping_and_legacy_model():
82+
mapping = {
83+
"task": "Complete the task",
84+
"use_custom_api_keys": True,
85+
"api_keys": {"openai": "openai-key"},
86+
"base_urls": {
87+
"openai": "https://example.openai.azure.com/openai/v1/",
88+
},
89+
}
90+
legacy = StartCuaTaskParams(
91+
task="Complete the task",
92+
use_custom_api_keys=True,
93+
api_keys={"openai": "openai-key"},
94+
base_urls=CuaBaseUrls(openai="https://example.openai.azure.com/openai/v1/"),
95+
)
96+
97+
assert dump_request(mapping, StartCuaTaskParams) == dump_request(
98+
legacy,
99+
StartCuaTaskParams,
100+
)
101+
assert dump_request(mapping, StartCuaTaskParams) == {
102+
"task": "Complete the task",
103+
"useCustomApiKeys": True,
104+
"apiKeys": {"openai": "openai-key"},
105+
"baseUrls": {
106+
"openai": "https://example.openai.azure.com/openai/v1/",
107+
},
108+
}
109+
110+
79111
def test_raw_json_schema_is_copied_without_rewriting_or_dereferencing():
80112
schema = {
81113
"$defs": {

tests/typecheck/valid_requests.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,16 @@ def valid_sync_requests(client: Hyperbrowser) -> None:
9696
"session_options": {"use_stealth": True},
9797
}
9898
)
99+
client.agents.cua.start(
100+
{
101+
"task": "Complete the task",
102+
"use_custom_api_keys": True,
103+
"api_keys": {"openai": "openai-key"},
104+
"base_urls": {
105+
"openai": "https://example.openai.azure.com/openai/v1/",
106+
},
107+
}
108+
)
99109
client.sandboxes.create(
100110
{
101111
"image_name": "node",
@@ -182,6 +192,16 @@ async def valid_async_requests(client: AsyncHyperbrowser) -> None:
182192
},
183193
}
184194
)
195+
await client.agents.cua.start(
196+
{
197+
"task": "Complete the task",
198+
"use_custom_api_keys": True,
199+
"api_keys": {"openai": "openai-key"},
200+
"base_urls": {
201+
"openai": "https://example.openai.azure.com/openai/v1/",
202+
},
203+
}
204+
)
185205
await client.sandboxes.create(
186206
{
187207
"snapshot_name": "ready-to-run",

0 commit comments

Comments
 (0)