hyperbrowser 0.44.0__py3-none-any.whl → 0.72.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of hyperbrowser might be problematic. Click here for more details.

Files changed (38) hide show
  1. hyperbrowser/client/async_client.py +4 -0
  2. hyperbrowser/client/base.py +1 -1
  3. hyperbrowser/client/managers/async_manager/agents/__init__.py +2 -0
  4. hyperbrowser/client/managers/async_manager/agents/browser_use.py +8 -0
  5. hyperbrowser/client/managers/async_manager/agents/gemini_computer_use.py +71 -0
  6. hyperbrowser/client/managers/async_manager/computer_action.py +165 -0
  7. hyperbrowser/client/managers/async_manager/crawl.py +1 -0
  8. hyperbrowser/client/managers/async_manager/scrape.py +1 -0
  9. hyperbrowser/client/managers/async_manager/session.py +42 -1
  10. hyperbrowser/client/managers/async_manager/team.py +12 -0
  11. hyperbrowser/client/managers/sync_manager/agents/__init__.py +2 -0
  12. hyperbrowser/client/managers/sync_manager/agents/browser_use.py +8 -0
  13. hyperbrowser/client/managers/sync_manager/agents/claude_computer_use.py +1 -1
  14. hyperbrowser/client/managers/sync_manager/agents/gemini_computer_use.py +71 -0
  15. hyperbrowser/client/managers/sync_manager/computer_action.py +165 -0
  16. hyperbrowser/client/managers/sync_manager/crawl.py +1 -0
  17. hyperbrowser/client/managers/sync_manager/scrape.py +1 -0
  18. hyperbrowser/client/managers/sync_manager/session.py +40 -1
  19. hyperbrowser/client/managers/sync_manager/team.py +12 -0
  20. hyperbrowser/client/sync.py +4 -0
  21. hyperbrowser/config.py +2 -2
  22. hyperbrowser/models/__init__.py +137 -0
  23. hyperbrowser/models/agents/browser_use.py +113 -3
  24. hyperbrowser/models/agents/claude_computer_use.py +38 -0
  25. hyperbrowser/models/agents/cua.py +32 -0
  26. hyperbrowser/models/agents/gemini_computer_use.py +135 -0
  27. hyperbrowser/models/agents/hyper_agent.py +31 -0
  28. hyperbrowser/models/computer_action.py +208 -0
  29. hyperbrowser/models/consts.py +27 -0
  30. hyperbrowser/models/extract.py +11 -0
  31. hyperbrowser/models/scrape.py +18 -0
  32. hyperbrowser/models/session.py +148 -11
  33. hyperbrowser/models/team.py +15 -0
  34. {hyperbrowser-0.44.0.dist-info → hyperbrowser-0.72.0.dist-info}/METADATA +8 -2
  35. hyperbrowser-0.72.0.dist-info/RECORD +60 -0
  36. {hyperbrowser-0.44.0.dist-info → hyperbrowser-0.72.0.dist-info}/WHEEL +1 -1
  37. {hyperbrowser-0.44.0.dist-info → hyperbrowser-0.72.0.dist-info/licenses}/LICENSE +1 -1
  38. hyperbrowser-0.44.0.dist-info/RECORD +0 -51
@@ -109,6 +109,7 @@ class BatchScrapeManager:
109
109
  job_response.total_scraped_pages = tmp_job_response.total_scraped_pages
110
110
  job_response.total_page_batches = tmp_job_response.total_page_batches
111
111
  job_response.batch_size = tmp_job_response.batch_size
112
+ job_response.error = tmp_job_response.error
112
113
  failures = 0
113
114
  first_check = False
114
115
  except Exception as e:
@@ -1,4 +1,4 @@
1
- from typing import List
1
+ from typing import List, Union, IO
2
2
  from ....models.session import (
3
3
  BasicResponse,
4
4
  CreateSessionParams,
@@ -9,12 +9,33 @@ from ....models.session import (
9
9
  SessionListParams,
10
10
  SessionListResponse,
11
11
  SessionRecording,
12
+ UploadFileResponse,
13
+ SessionEventLogListParams,
14
+ SessionEventLogListResponse,
15
+ SessionEventLog,
12
16
  )
13
17
 
14
18
 
19
+ class SessionEventLogsManager:
20
+ def __init__(self, client):
21
+ self._client = client
22
+
23
+ def list(
24
+ self,
25
+ session_id: str,
26
+ params: SessionEventLogListParams = SessionEventLogListParams(),
27
+ ) -> SessionEventLogListResponse:
28
+ response = self._client.transport.get(
29
+ self._client._build_url(f"/session/{session_id}/event-logs"),
30
+ params=params.model_dump(exclude_none=True, by_alias=True),
31
+ )
32
+ return SessionEventLogListResponse(**response.data)
33
+
34
+
15
35
  class SessionManager:
16
36
  def __init__(self, client):
17
37
  self._client = client
38
+ self.event_logs = SessionEventLogsManager(client)
18
39
 
19
40
  def create(self, params: CreateSessionParams = None) -> SessionDetail:
20
41
  response = self._client.transport.post(
@@ -69,3 +90,21 @@ class SessionManager:
69
90
  self._client._build_url(f"/session/{id}/downloads-url")
70
91
  )
71
92
  return GetSessionDownloadsUrlResponse(**response.data)
93
+
94
+ def upload_file(self, id: str, file_input: Union[str, IO]) -> UploadFileResponse:
95
+ response = None
96
+ if isinstance(file_input, str):
97
+ with open(file_input, "rb") as file_obj:
98
+ files = {"file": file_obj}
99
+ response = self._client.transport.post(
100
+ self._client._build_url(f"/session/{id}/uploads"),
101
+ files=files,
102
+ )
103
+ else:
104
+ files = {"file": file_input}
105
+ response = self._client.transport.post(
106
+ self._client._build_url(f"/session/{id}/uploads"),
107
+ files=files,
108
+ )
109
+
110
+ return UploadFileResponse(**response.data)
@@ -0,0 +1,12 @@
1
+ from hyperbrowser.models import TeamCreditInfo
2
+
3
+
4
+ class TeamManager:
5
+ def __init__(self, client):
6
+ self._client = client
7
+
8
+ def get_credit_info(self) -> TeamCreditInfo:
9
+ response = self._client.transport.get(
10
+ self._client._build_url("/team/credit-info")
11
+ )
12
+ return TeamCreditInfo(**response.data)
@@ -10,6 +10,8 @@ from .managers.sync_manager.extract import ExtractManager
10
10
  from .managers.sync_manager.profile import ProfileManager
11
11
  from .managers.sync_manager.scrape import ScrapeManager
12
12
  from .managers.sync_manager.session import SessionManager
13
+ from .managers.sync_manager.team import TeamManager
14
+ from .managers.sync_manager.computer_action import ComputerActionManager
13
15
 
14
16
 
15
17
  class Hyperbrowser(HyperbrowserBase):
@@ -31,6 +33,8 @@ class Hyperbrowser(HyperbrowserBase):
31
33
  self.profiles = ProfileManager(self)
32
34
  self.extensions = ExtensionManager(self)
33
35
  self.agents = Agents(self)
36
+ self.team = TeamManager(self)
37
+ self.computer_action = ComputerActionManager(self)
34
38
 
35
39
  def close(self) -> None:
36
40
  self.transport.close()
hyperbrowser/config.py CHANGED
@@ -8,7 +8,7 @@ class ClientConfig:
8
8
  """Configuration for the Hyperbrowser client"""
9
9
 
10
10
  api_key: str
11
- base_url: str = "https://app.hyperbrowser.ai"
11
+ base_url: str = "https://api.hyperbrowser.ai"
12
12
 
13
13
  @classmethod
14
14
  def from_env(cls) -> "ClientConfig":
@@ -17,6 +17,6 @@ class ClientConfig:
17
17
  raise ValueError("HYPERBROWSER_API_KEY environment variable is required")
18
18
 
19
19
  base_url = os.environ.get(
20
- "HYPERBROWSER_BASE_URL", "https://app.hyperbrowser.ai"
20
+ "HYPERBROWSER_BASE_URL", "https://api.hyperbrowser.ai"
21
21
  )
22
22
  return cls(api_key=api_key, base_url=base_url)
@@ -4,13 +4,47 @@ from .agents.browser_use import (
4
4
  BrowserUseTaskStatusResponse,
5
5
  StartBrowserUseTaskParams,
6
6
  StartBrowserUseTaskResponse,
7
+ BrowserUseApiKeys,
8
+ BrowserUseAgentBrain,
9
+ BrowserUseAgentOutput,
10
+ BrowserUseActionResult,
11
+ BrowserUseStepMetadata,
12
+ BrowserUseTabInfo,
13
+ BrowserUseCoordinates,
14
+ BrowserUseCoordinateSet,
15
+ BrowserUseViewportInfo,
16
+ BrowserUseDOMHistoryElement,
17
+ BrowserUseBrowserStateHistory,
18
+ BrowserUseAgentHistory,
19
+ BrowserUseAgentOutputV0710,
20
+ BrowserUseActionResultV0710,
21
+ BrowserUseBrowserStateHistoryV0710,
22
+ BrowserUseStepMetadataV0710,
23
+ BrowserUseAgentHistoryV0710,
24
+ BrowserUseAgentHistoryLatest,
25
+ BrowserUseTaskMetadata,
26
+ BrowserUseStep,
27
+ cast_steps_for_version,
7
28
  )
8
29
  from .agents.claude_computer_use import (
30
+ ClaudeComputerUseTaskStatus,
31
+ ClaudeComputerUseStepResponse,
9
32
  ClaudeComputerUseTaskData,
10
33
  ClaudeComputerUseTaskResponse,
11
34
  ClaudeComputerUseTaskStatusResponse,
12
35
  StartClaudeComputerUseTaskParams,
13
36
  StartClaudeComputerUseTaskResponse,
37
+ ClaudeComputerUseApiKeys,
38
+ )
39
+ from .agents.gemini_computer_use import (
40
+ GeminiComputerUseTaskStatus,
41
+ GeminiComputerUseStepResponse,
42
+ GeminiComputerUseTaskData,
43
+ GeminiComputerUseTaskResponse,
44
+ GeminiComputerUseTaskStatusResponse,
45
+ StartGeminiComputerUseTaskParams,
46
+ StartGeminiComputerUseTaskResponse,
47
+ GeminiComputerUseApiKeys,
14
48
  )
15
49
  from .agents.cua import (
16
50
  CuaTaskData,
@@ -18,6 +52,7 @@ from .agents.cua import (
18
52
  CuaTaskStatusResponse,
19
53
  StartCuaTaskParams,
20
54
  StartCuaTaskResponse,
55
+ CuaApiKeys,
21
56
  )
22
57
  from .agents.hyper_agent import (
23
58
  HyperAgentActionOutput,
@@ -29,12 +64,14 @@ from .agents.hyper_agent import (
29
64
  HyperAgentTaskStatusResponse,
30
65
  StartHyperAgentTaskParams,
31
66
  StartHyperAgentTaskResponse,
67
+ HyperAgentApiKeys,
32
68
  )
33
69
  from .consts import (
34
70
  ISO639_1,
35
71
  POLLING_ATTEMPTS,
36
72
  HyperAgentLlm,
37
73
  BrowserUseLlm,
74
+ ClaudeComputerUseLlm,
38
75
  Country,
39
76
  DownloadsStatus,
40
77
  OperatingSystem,
@@ -44,7 +81,10 @@ from .consts import (
44
81
  ScrapePageStatus,
45
82
  ScrapeScreenshotFormat,
46
83
  ScrapeWaitUntil,
84
+ SessionEventLogType,
47
85
  State,
86
+ SessionRegion,
87
+ BrowserUseVersion,
48
88
  )
49
89
  from .crawl import (
50
90
  CrawledPage,
@@ -63,6 +103,7 @@ from .extract import (
63
103
  ExtractJobStatusResponse,
64
104
  StartExtractJobParams,
65
105
  StartExtractJobResponse,
106
+ ExtractJobMetadata,
66
107
  )
67
108
  from .profile import (
68
109
  CreateProfileParams,
@@ -86,6 +127,27 @@ from .scrape import (
86
127
  StartBatchScrapeJobResponse,
87
128
  StartScrapeJobParams,
88
129
  StartScrapeJobResponse,
130
+ StorageStateOptions,
131
+ )
132
+ from .computer_action import (
133
+ ClickActionParams,
134
+ ComputerAction,
135
+ ComputerActionParams,
136
+ ComputerActionResponse,
137
+ Coordinate,
138
+ DragActionParams,
139
+ HoldKeyActionParams,
140
+ MouseDownActionParams,
141
+ MouseUpActionParams,
142
+ MoveMouseActionParams,
143
+ PressKeysActionParams,
144
+ ScreenshotActionParams,
145
+ ScrollActionParams,
146
+ TypeTextActionParams,
147
+ ComputerActionMouseButton,
148
+ GetClipboardTextActionParams,
149
+ ComputerActionResponseDataClipboardText,
150
+ ComputerActionResponseData,
89
151
  )
90
152
  from .session import (
91
153
  BasicResponse,
@@ -101,7 +163,15 @@ from .session import (
101
163
  SessionListResponse,
102
164
  SessionRecording,
103
165
  SessionStatus,
166
+ SessionEventLog,
167
+ SessionEventLogListParams,
168
+ SessionEventLogListResponse,
169
+ SessionProfile,
170
+ SessionLaunchState,
171
+ UploadFileResponse,
172
+ ImageCaptchaParam,
104
173
  )
174
+ from .team import TeamCreditInfo
105
175
 
106
176
  __all__ = [
107
177
  # consts
@@ -109,6 +179,7 @@ __all__ = [
109
179
  "POLLING_ATTEMPTS",
110
180
  "HyperAgentLlm",
111
181
  "BrowserUseLlm",
182
+ "ClaudeComputerUseLlm",
112
183
  "Country",
113
184
  "DownloadsStatus",
114
185
  "OperatingSystem",
@@ -118,7 +189,10 @@ __all__ = [
118
189
  "ScrapePageStatus",
119
190
  "ScrapeScreenshotFormat",
120
191
  "ScrapeWaitUntil",
192
+ "SessionEventLogType",
121
193
  "State",
194
+ "SessionRegion",
195
+ "BrowserUseVersion",
122
196
  # agents
123
197
  "HyperAgentTaskStatus",
124
198
  "HyperAgentActionOutput",
@@ -135,18 +209,51 @@ __all__ = [
135
209
  "BrowserUseTaskStatusResponse",
136
210
  "StartBrowserUseTaskParams",
137
211
  "StartBrowserUseTaskResponse",
212
+ "BrowserUseAgentBrain",
213
+ "BrowserUseAgentOutput",
214
+ "BrowserUseActionResult",
215
+ "BrowserUseStepMetadata",
216
+ "BrowserUseTabInfo",
217
+ "BrowserUseCoordinates",
218
+ "BrowserUseCoordinateSet",
219
+ "BrowserUseViewportInfo",
220
+ "BrowserUseDOMHistoryElement",
221
+ "BrowserUseBrowserStateHistory",
222
+ "BrowserUseAgentHistory",
223
+ "BrowserUseAgentOutputV0710",
224
+ "BrowserUseActionResultV0710",
225
+ "BrowserUseBrowserStateHistoryV0710",
226
+ "BrowserUseStepMetadataV0710",
227
+ "BrowserUseAgentHistoryV0710",
228
+ "BrowserUseAgentHistoryLatest",
229
+ "BrowserUseStep",
230
+ "BrowserUseTaskMetadata",
231
+ "cast_steps_for_version",
138
232
  "ClaudeComputerUseTaskStatus",
233
+ "ClaudeComputerUseStepResponse",
139
234
  "ClaudeComputerUseTaskData",
140
235
  "ClaudeComputerUseTaskResponse",
141
236
  "ClaudeComputerUseTaskStatusResponse",
142
237
  "StartClaudeComputerUseTaskParams",
143
238
  "StartClaudeComputerUseTaskResponse",
239
+ "GeminiComputerUseTaskStatus",
240
+ "GeminiComputerUseStepResponse",
241
+ "GeminiComputerUseTaskData",
242
+ "GeminiComputerUseTaskResponse",
243
+ "GeminiComputerUseTaskStatusResponse",
244
+ "StartGeminiComputerUseTaskParams",
245
+ "StartGeminiComputerUseTaskResponse",
144
246
  "CuaTaskStatus",
145
247
  "CuaTaskData",
146
248
  "CuaTaskResponse",
147
249
  "CuaTaskStatusResponse",
148
250
  "StartCuaTaskParams",
149
251
  "StartCuaTaskResponse",
252
+ "BrowserUseApiKeys",
253
+ "ClaudeComputerUseApiKeys",
254
+ "GeminiComputerUseApiKeys",
255
+ "CuaApiKeys",
256
+ "HyperAgentApiKeys",
150
257
  # crawl
151
258
  "CrawledPage",
152
259
  "CrawlJobResponse",
@@ -165,6 +272,7 @@ __all__ = [
165
272
  "ExtractJobStatusResponse",
166
273
  "StartExtractJobParams",
167
274
  "StartExtractJobResponse",
275
+ "ExtractJobMetadata",
168
276
  # profile
169
277
  "CreateProfileParams",
170
278
  "CreateProfileResponse",
@@ -186,6 +294,7 @@ __all__ = [
186
294
  "StartBatchScrapeJobResponse",
187
295
  "StartScrapeJobParams",
188
296
  "StartScrapeJobResponse",
297
+ "StorageStateOptions",
189
298
  # session
190
299
  "BasicResponse",
191
300
  "CreateSessionParams",
@@ -200,4 +309,32 @@ __all__ = [
200
309
  "SessionListResponse",
201
310
  "SessionRecording",
202
311
  "SessionStatus",
312
+ "SessionEventLog",
313
+ "SessionEventLogListParams",
314
+ "SessionEventLogListResponse",
315
+ "SessionProfile",
316
+ "SessionLaunchState",
317
+ "UploadFileResponse",
318
+ "ImageCaptchaParam",
319
+ # team
320
+ "TeamCreditInfo",
321
+ # computer action
322
+ "ClickActionParams",
323
+ "ComputerAction",
324
+ "ComputerActionParams",
325
+ "ComputerActionResponse",
326
+ "Coordinate",
327
+ "DragActionParams",
328
+ "HoldKeyActionParams",
329
+ "MouseDownActionParams",
330
+ "MouseUpActionParams",
331
+ "MoveMouseActionParams",
332
+ "PressKeysActionParams",
333
+ "ScreenshotActionParams",
334
+ "ScrollActionParams",
335
+ "TypeTextActionParams",
336
+ "ComputerActionMouseButton",
337
+ "GetClipboardTextActionParams",
338
+ "ComputerActionResponseDataClipboardText",
339
+ "ComputerActionResponseData",
203
340
  ]
@@ -1,13 +1,27 @@
1
- from typing import Any, Dict, List, Literal, Optional, Union
1
+ from typing import Any, Dict, List, Literal, Optional, Type, Union
2
2
 
3
3
  from pydantic import BaseModel, ConfigDict, Field
4
4
 
5
- from ..consts import BrowserUseLlm
5
+ from ..consts import BrowserUseLlm, BrowserUseVersion
6
6
  from ..session import CreateSessionParams
7
7
 
8
8
  BrowserUseTaskStatus = Literal["pending", "running", "completed", "failed", "stopped"]
9
9
 
10
10
 
11
+ class BrowserUseApiKeys(BaseModel):
12
+ """
13
+ API keys for the browser use task.
14
+ """
15
+
16
+ model_config = ConfigDict(
17
+ populate_by_alias=True,
18
+ )
19
+
20
+ openai: Optional[str] = Field(default=None, serialization_alias="openai")
21
+ anthropic: Optional[str] = Field(default=None, serialization_alias="anthropic")
22
+ google: Optional[str] = Field(default=None, serialization_alias="google")
23
+
24
+
11
25
  class StartBrowserUseTaskParams(BaseModel):
12
26
  """
13
27
  Parameters for creating a new browser use task.
@@ -18,6 +32,9 @@ class StartBrowserUseTaskParams(BaseModel):
18
32
  )
19
33
 
20
34
  task: str
35
+ version: Optional[BrowserUseVersion] = Field(
36
+ default=None, serialization_alias="version"
37
+ )
21
38
  llm: Optional[BrowserUseLlm] = Field(default=None, serialization_alias="llm")
22
39
  session_id: Optional[str] = Field(default=None, serialization_alias="sessionId")
23
40
  validate_output: Optional[bool] = Field(
@@ -47,12 +64,27 @@ class StartBrowserUseTaskParams(BaseModel):
47
64
  initial_actions: Optional[List[Dict[str, Dict[str, Any]]]] = Field(
48
65
  default=None, serialization_alias="initialActions"
49
66
  )
67
+ sensitive_data: Optional[Dict[str, str]] = Field(
68
+ default=None, serialization_alias="sensitiveData"
69
+ )
70
+ message_context: Optional[str] = Field(
71
+ default=None, serialization_alias="messageContext"
72
+ )
73
+ output_model_schema: Optional[Union[Dict[str, Any], Type[BaseModel]]] = Field(
74
+ default=None, serialization_alias="outputModelSchema"
75
+ )
50
76
  keep_browser_open: Optional[bool] = Field(
51
77
  default=None, serialization_alias="keepBrowserOpen"
52
78
  )
53
79
  session_options: Optional[CreateSessionParams] = Field(
54
80
  default=None, serialization_alias="sessionOptions"
55
81
  )
82
+ use_custom_api_keys: Optional[bool] = Field(
83
+ default=None, serialization_alias="useCustomApiKeys"
84
+ )
85
+ api_keys: Optional[BrowserUseApiKeys] = Field(
86
+ default=None, serialization_alias="apiKeys"
87
+ )
56
88
 
57
89
 
58
90
  class StartBrowserUseTaskResponse(BaseModel):
@@ -164,15 +196,79 @@ class BrowserUseAgentHistory(BaseModel):
164
196
  metadata: Optional[BrowserUseStepMetadata] = None
165
197
 
166
198
 
199
+ # ===== 0.7.10-specific response models =====
200
+
201
+
202
+ class BrowserUseAgentOutputV0710(BaseModel):
203
+ thinking: Optional[str] = None
204
+ evaluation_previous_goal: Optional[str] = None
205
+ memory: Optional[str] = None
206
+ next_goal: Optional[str] = None
207
+ action: list[dict]
208
+
209
+
210
+ class BrowserUseActionResultV0710(BaseModel):
211
+ is_done: Optional[bool] = False
212
+ success: Optional[bool] = None
213
+ error: Optional[str] = None
214
+ metadata: Optional[dict] = None
215
+ attachments: Optional[list[str]] = None
216
+ long_term_memory: Optional[str] = None
217
+ extracted_content: Optional[str] = None
218
+ include_extracted_content_only_once: Optional[bool] = False
219
+ include_in_memory: bool = False
220
+
221
+
222
+ class BrowserUseBrowserStateHistoryV0710(BaseModel):
223
+ url: str
224
+ title: str
225
+ tabs: list[dict]
226
+ interacted_element: Union[list[Union[dict, None]], list[None]]
227
+
228
+
229
+ class BrowserUseStepMetadataV0710(BaseModel):
230
+ step_start_time: float
231
+ step_end_time: float
232
+ step_number: int
233
+
234
+
235
+ class BrowserUseAgentHistoryV0710(BaseModel):
236
+ model_output: Union[BrowserUseAgentOutputV0710, None]
237
+ result: list[BrowserUseActionResultV0710]
238
+ state: BrowserUseBrowserStateHistoryV0710
239
+ metadata: Optional[BrowserUseStepMetadataV0710] = None
240
+
241
+
242
+ # ===== latest response models =====
243
+
244
+ BrowserUseAgentHistoryLatest = Dict[str, Any]
245
+
246
+ BrowserUseStep = Union[
247
+ BrowserUseAgentHistory, BrowserUseAgentHistoryV0710, BrowserUseAgentHistoryLatest
248
+ ]
249
+
250
+
167
251
  class BrowserUseTaskData(BaseModel):
168
252
  model_config = ConfigDict(
169
253
  populate_by_alias=True,
170
254
  )
171
255
 
172
- steps: list[BrowserUseAgentHistory]
256
+ steps: list[BrowserUseStep]
173
257
  final_result: Optional[str] = Field(default=None, alias="finalResult")
174
258
 
175
259
 
260
+ class BrowserUseTaskMetadata(BaseModel):
261
+ model_config = ConfigDict(
262
+ populate_by_alias=True,
263
+ )
264
+
265
+ input_tokens: Optional[int] = Field(default=None, alias="inputTokens")
266
+ output_tokens: Optional[int] = Field(default=None, alias="outputTokens")
267
+ num_task_steps_completed: Optional[int] = Field(
268
+ default=None, alias="numTaskStepsCompleted"
269
+ )
270
+
271
+
176
272
  class BrowserUseTaskResponse(BaseModel):
177
273
  """
178
274
  Response from a browser use task.
@@ -184,6 +280,20 @@ class BrowserUseTaskResponse(BaseModel):
184
280
 
185
281
  job_id: str = Field(alias="jobId")
186
282
  status: BrowserUseTaskStatus
283
+ metadata: Optional[BrowserUseTaskMetadata] = Field(default=None, alias="metadata")
187
284
  data: Optional[BrowserUseTaskData] = Field(default=None, alias="data")
188
285
  error: Optional[str] = Field(default=None, alias="error")
189
286
  live_url: Optional[str] = Field(default=None, alias="liveUrl")
287
+
288
+
289
+ def cast_steps_for_version(
290
+ steps: List[BrowserUseStep], version: BrowserUseVersion
291
+ ) -> List[BrowserUseStep]:
292
+ if version == "0.1.40":
293
+ return [BrowserUseAgentHistory.model_validate(s) for s in steps]
294
+ elif version == "0.7.10":
295
+ return [BrowserUseAgentHistoryV0710.model_validate(s) for s in steps]
296
+ elif version == "latest":
297
+ return steps
298
+ else:
299
+ raise ValueError(f"Invalid version: {version}")
@@ -3,12 +3,25 @@ from typing import Any, Literal, Optional
3
3
  from pydantic import BaseModel, ConfigDict, Field
4
4
 
5
5
  from ..session import CreateSessionParams
6
+ from ..consts import ClaudeComputerUseLlm
6
7
 
7
8
  ClaudeComputerUseTaskStatus = Literal[
8
9
  "pending", "running", "completed", "failed", "stopped"
9
10
  ]
10
11
 
11
12
 
13
+ class ClaudeComputerUseApiKeys(BaseModel):
14
+ """
15
+ API keys for the Claude Computer Use task.
16
+ """
17
+
18
+ model_config = ConfigDict(
19
+ populate_by_alias=True,
20
+ )
21
+
22
+ anthropic: Optional[str] = Field(default=None, serialization_alias="anthropic")
23
+
24
+
12
25
  class StartClaudeComputerUseTaskParams(BaseModel):
13
26
  """
14
27
  Parameters for creating a new Claude Computer Use task.
@@ -19,6 +32,7 @@ class StartClaudeComputerUseTaskParams(BaseModel):
19
32
  )
20
33
 
21
34
  task: str
35
+ llm: Optional[ClaudeComputerUseLlm] = Field(default=None, serialization_alias="llm")
22
36
  session_id: Optional[str] = Field(default=None, serialization_alias="sessionId")
23
37
  max_failures: Optional[int] = Field(default=None, serialization_alias="maxFailures")
24
38
  max_steps: Optional[int] = Field(default=None, serialization_alias="maxSteps")
@@ -28,6 +42,15 @@ class StartClaudeComputerUseTaskParams(BaseModel):
28
42
  session_options: Optional[CreateSessionParams] = Field(
29
43
  default=None, serialization_alias="sessionOptions"
30
44
  )
45
+ use_custom_api_keys: Optional[bool] = Field(
46
+ default=None, serialization_alias="useCustomApiKeys"
47
+ )
48
+ api_keys: Optional[ClaudeComputerUseApiKeys] = Field(
49
+ default=None, serialization_alias="apiKeys"
50
+ )
51
+ use_computer_action: Optional[bool] = Field(
52
+ default=None, serialization_alias="useComputerAction"
53
+ )
31
54
 
32
55
 
33
56
  class StartClaudeComputerUseTaskResponse(BaseModel):
@@ -81,6 +104,18 @@ class ClaudeComputerUseTaskData(BaseModel):
81
104
  final_result: Optional[str] = Field(default=None, alias="finalResult")
82
105
 
83
106
 
107
+ class ClaudeComputerUseTaskMetadata(BaseModel):
108
+ model_config = ConfigDict(
109
+ populate_by_alias=True,
110
+ )
111
+
112
+ input_tokens: Optional[int] = Field(default=None, alias="inputTokens")
113
+ output_tokens: Optional[int] = Field(default=None, alias="outputTokens")
114
+ num_task_steps_completed: Optional[int] = Field(
115
+ default=None, alias="numTaskStepsCompleted"
116
+ )
117
+
118
+
84
119
  class ClaudeComputerUseTaskResponse(BaseModel):
85
120
  """
86
121
  Response from a Claude Computer Use task.
@@ -92,6 +127,9 @@ class ClaudeComputerUseTaskResponse(BaseModel):
92
127
 
93
128
  job_id: str = Field(alias="jobId")
94
129
  status: ClaudeComputerUseTaskStatus
130
+ metadata: Optional[ClaudeComputerUseTaskMetadata] = Field(
131
+ default=None, alias="metadata"
132
+ )
95
133
  data: Optional[ClaudeComputerUseTaskData] = Field(default=None, alias="data")
96
134
  error: Optional[str] = Field(default=None, alias="error")
97
135
  live_url: Optional[str] = Field(default=None, alias="liveUrl")
@@ -7,6 +7,18 @@ from ..session import CreateSessionParams
7
7
  CuaTaskStatus = Literal["pending", "running", "completed", "failed", "stopped"]
8
8
 
9
9
 
10
+ class CuaApiKeys(BaseModel):
11
+ """
12
+ API keys for the CUA task.
13
+ """
14
+
15
+ model_config = ConfigDict(
16
+ populate_by_alias=True,
17
+ )
18
+
19
+ openai: Optional[str] = Field(default=None, serialization_alias="openai")
20
+
21
+
10
22
  class StartCuaTaskParams(BaseModel):
11
23
  """
12
24
  Parameters for creating a new CUA task.
@@ -26,6 +38,13 @@ class StartCuaTaskParams(BaseModel):
26
38
  session_options: Optional[CreateSessionParams] = Field(
27
39
  default=None, serialization_alias="sessionOptions"
28
40
  )
41
+ use_custom_api_keys: Optional[bool] = Field(
42
+ default=None, serialization_alias="useCustomApiKeys"
43
+ )
44
+ api_keys: Optional[CuaApiKeys] = Field(default=None, serialization_alias="apiKeys")
45
+ use_computer_action: Optional[bool] = Field(
46
+ default=None, serialization_alias="useComputerAction"
47
+ )
29
48
 
30
49
 
31
50
  class StartCuaTaskResponse(BaseModel):
@@ -115,6 +134,18 @@ class CuaTaskData(BaseModel):
115
134
  final_result: Optional[str] = Field(default=None, alias="finalResult")
116
135
 
117
136
 
137
+ class CuaTaskMetadata(BaseModel):
138
+ model_config = ConfigDict(
139
+ populate_by_alias=True,
140
+ )
141
+
142
+ input_tokens: Optional[int] = Field(default=None, alias="inputTokens")
143
+ output_tokens: Optional[int] = Field(default=None, alias="outputTokens")
144
+ num_task_steps_completed: Optional[int] = Field(
145
+ default=None, alias="numTaskStepsCompleted"
146
+ )
147
+
148
+
118
149
  class CuaTaskResponse(BaseModel):
119
150
  """
120
151
  Response from a CUA task.
@@ -126,6 +157,7 @@ class CuaTaskResponse(BaseModel):
126
157
 
127
158
  job_id: str = Field(alias="jobId")
128
159
  status: CuaTaskStatus
160
+ metadata: Optional[CuaTaskMetadata] = Field(default=None, alias="metadata")
129
161
  data: Optional[CuaTaskData] = Field(default=None, alias="data")
130
162
  error: Optional[str] = Field(default=None, alias="error")
131
163
  live_url: Optional[str] = Field(default=None, alias="liveUrl")