hyperbrowser 0.37.0__py3-none-any.whl → 0.39.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.

@@ -1,8 +1,10 @@
1
1
  from .browser_use import BrowserUseManager
2
2
  from .cua import CuaManager
3
+ from .claude_computer_use import ClaudeComputerUseManager
3
4
 
4
5
 
5
6
  class Agents:
6
7
  def __init__(self, client):
7
8
  self.browser_use = BrowserUseManager(client)
8
9
  self.cua = CuaManager(client)
10
+ self.claude_computer_use = ClaudeComputerUseManager(client)
@@ -0,0 +1,71 @@
1
+ import asyncio
2
+
3
+ from hyperbrowser.exceptions import HyperbrowserError
4
+
5
+ from .....models import (
6
+ POLLING_ATTEMPTS,
7
+ BasicResponse,
8
+ ClaudeComputerUseTaskResponse,
9
+ ClaudeComputerUseTaskStatusResponse,
10
+ StartClaudeComputerUseTaskParams,
11
+ StartClaudeComputerUseTaskResponse,
12
+ )
13
+
14
+
15
+ class ClaudeComputerUseManager:
16
+ def __init__(self, client):
17
+ self._client = client
18
+
19
+ async def start(
20
+ self, params: StartClaudeComputerUseTaskParams
21
+ ) -> StartClaudeComputerUseTaskResponse:
22
+ response = await self._client.transport.post(
23
+ self._client._build_url("/task/claude-computer-use"),
24
+ data=params.model_dump(exclude_none=True, by_alias=True),
25
+ )
26
+ return StartClaudeComputerUseTaskResponse(**response.data)
27
+
28
+ async def get(self, job_id: str) -> ClaudeComputerUseTaskResponse:
29
+ response = await self._client.transport.get(
30
+ self._client._build_url(f"/task/claude-computer-use/{job_id}")
31
+ )
32
+ return ClaudeComputerUseTaskResponse(**response.data)
33
+
34
+ async def get_status(self, job_id: str) -> ClaudeComputerUseTaskStatusResponse:
35
+ response = await self._client.transport.get(
36
+ self._client._build_url(f"/task/claude-computer-use/{job_id}/status")
37
+ )
38
+ return ClaudeComputerUseTaskStatusResponse(**response.data)
39
+
40
+ async def stop(self, job_id: str) -> BasicResponse:
41
+ response = await self._client.transport.put(
42
+ self._client._build_url(f"/task/claude-computer-use/{job_id}/stop")
43
+ )
44
+ return BasicResponse(**response.data)
45
+
46
+ async def start_and_wait(
47
+ self, params: StartClaudeComputerUseTaskParams
48
+ ) -> ClaudeComputerUseTaskResponse:
49
+ job_start_resp = await self.start(params)
50
+ job_id = job_start_resp.job_id
51
+ if not job_id:
52
+ raise HyperbrowserError("Failed to start Claude Computer Use task job")
53
+
54
+ failures = 0
55
+ while True:
56
+ try:
57
+ job_response = await self.get_status(job_id)
58
+ if (
59
+ job_response.status == "completed"
60
+ or job_response.status == "failed"
61
+ or job_response.status == "stopped"
62
+ ):
63
+ return await self.get(job_id)
64
+ failures = 0
65
+ except Exception as e:
66
+ failures += 1
67
+ if failures >= POLLING_ATTEMPTS:
68
+ raise HyperbrowserError(
69
+ f"Failed to poll Claude Computer Use task job {job_id} after {POLLING_ATTEMPTS} attempts: {e}"
70
+ )
71
+ await asyncio.sleep(2)
@@ -1,8 +1,10 @@
1
1
  from .browser_use import BrowserUseManager
2
2
  from .cua import CuaManager
3
+ from .claude_computer_use import ClaudeComputerUseManager
3
4
 
4
5
 
5
6
  class Agents:
6
7
  def __init__(self, client):
7
8
  self.browser_use = BrowserUseManager(client)
8
9
  self.cua = CuaManager(client)
10
+ self.claude_computer_use = ClaudeComputerUseManager(client)
@@ -0,0 +1,71 @@
1
+ import time
2
+
3
+ from hyperbrowser.exceptions import HyperbrowserError
4
+
5
+ from .....models import (
6
+ POLLING_ATTEMPTS,
7
+ BasicResponse,
8
+ ClaudeComputerUseTaskResponse,
9
+ ClaudeComputerUseTaskStatusResponse,
10
+ StartClaudeComputerUseTaskParams,
11
+ StartClaudeComputerUseTaskResponse,
12
+ )
13
+
14
+
15
+ class ClaudeComputerUseManager:
16
+ def __init__(self, client):
17
+ self._client = client
18
+
19
+ def start(
20
+ self, params: StartClaudeComputerUseTaskParams
21
+ ) -> StartClaudeComputerUseTaskResponse:
22
+ response = self._client.transport.post(
23
+ self._client._build_url("/task/claude-computer-use"),
24
+ data=params.model_dump(exclude_none=True, by_alias=True),
25
+ )
26
+ return StartClaudeComputerUseTaskResponse(**response.data)
27
+
28
+ def get(self, job_id: str) -> ClaudeComputerUseTaskResponse:
29
+ response = self._client.transport.get(
30
+ self._client._build_url(f"/task/claude-computer-use/{job_id}")
31
+ )
32
+ return ClaudeComputerUseTaskResponse(**response.data)
33
+
34
+ def get_status(self, job_id: str) -> ClaudeComputerUseTaskStatusResponse:
35
+ response = self._client.transport.get(
36
+ self._client._build_url(f"/task/claude-computer-use/{job_id}/status")
37
+ )
38
+ return ClaudeComputerUseTaskStatusResponse(**response.data)
39
+
40
+ def stop(self, job_id: str) -> BasicResponse:
41
+ response = self._client.transport.put(
42
+ self._client._build_url(f"/task/claude-computer-use/{job_id}/stop")
43
+ )
44
+ return BasicResponse(**response.data)
45
+
46
+ def start_and_wait(
47
+ self, params: StartClaudeComputerUseTaskParams
48
+ ) -> ClaudeComputerUseTaskResponse:
49
+ job_start_resp = self.start(params)
50
+ job_id = job_start_resp.job_id
51
+ if not job_id:
52
+ raise HyperbrowserError("Failed to start CUA task job")
53
+
54
+ failures = 0
55
+ while True:
56
+ try:
57
+ job_response = self.get_status(job_id)
58
+ if (
59
+ job_response.status == "completed"
60
+ or job_response.status == "failed"
61
+ or job_response.status == "stopped"
62
+ ):
63
+ return self.get(job_id)
64
+ failures = 0
65
+ except Exception as e:
66
+ failures += 1
67
+ if failures >= POLLING_ATTEMPTS:
68
+ raise HyperbrowserError(
69
+ f"Failed to poll Claude Computer Use task job {job_id} after {POLLING_ATTEMPTS} attempts: {e}"
70
+ )
71
+ time.sleep(2)
@@ -5,6 +5,13 @@ from .agents.browser_use import (
5
5
  StartBrowserUseTaskParams,
6
6
  StartBrowserUseTaskResponse,
7
7
  )
8
+ from .agents.claude_computer_use import (
9
+ ClaudeComputerUseTaskData,
10
+ ClaudeComputerUseTaskResponse,
11
+ ClaudeComputerUseTaskStatusResponse,
12
+ StartClaudeComputerUseTaskParams,
13
+ StartClaudeComputerUseTaskResponse,
14
+ )
8
15
  from .agents.cua import (
9
16
  CuaTaskData,
10
17
  CuaTaskResponse,
@@ -104,6 +111,12 @@ __all__ = [
104
111
  "BrowserUseTaskStatusResponse",
105
112
  "StartBrowserUseTaskParams",
106
113
  "StartBrowserUseTaskResponse",
114
+ "ClaudeComputerUseTaskStatus",
115
+ "ClaudeComputerUseTaskData",
116
+ "ClaudeComputerUseTaskResponse",
117
+ "ClaudeComputerUseTaskStatusResponse",
118
+ "StartClaudeComputerUseTaskParams",
119
+ "StartClaudeComputerUseTaskResponse",
107
120
  "CuaTaskStatus",
108
121
  "CuaTaskData",
109
122
  "CuaTaskResponse",
@@ -0,0 +1,97 @@
1
+ from typing import Any, Literal, Optional
2
+
3
+ from pydantic import BaseModel, ConfigDict, Field
4
+
5
+ from ..session import CreateSessionParams
6
+
7
+ ClaudeComputerUseTaskStatus = Literal[
8
+ "pending", "running", "completed", "failed", "stopped"
9
+ ]
10
+
11
+
12
+ class StartClaudeComputerUseTaskParams(BaseModel):
13
+ """
14
+ Parameters for creating a new Claude Computer Use task.
15
+ """
16
+
17
+ model_config = ConfigDict(
18
+ populate_by_alias=True,
19
+ )
20
+
21
+ task: str
22
+ session_id: Optional[str] = Field(default=None, serialization_alias="sessionId")
23
+ max_failures: Optional[int] = Field(default=None, serialization_alias="maxFailures")
24
+ max_steps: Optional[int] = Field(default=None, serialization_alias="maxSteps")
25
+ keep_browser_open: Optional[bool] = Field(
26
+ default=None, serialization_alias="keepBrowserOpen"
27
+ )
28
+ session_options: Optional[CreateSessionParams] = Field(
29
+ default=None, serialization_alias="sessionOptions"
30
+ )
31
+
32
+
33
+ class StartClaudeComputerUseTaskResponse(BaseModel):
34
+ """
35
+ Response from starting a Claude Computer Use task.
36
+ """
37
+
38
+ model_config = ConfigDict(
39
+ populate_by_alias=True,
40
+ )
41
+
42
+ job_id: str = Field(alias="jobId")
43
+ live_url: Optional[str] = Field(default=None, alias="liveUrl")
44
+
45
+
46
+ class ClaudeComputerUseTaskStatusResponse(BaseModel):
47
+ """
48
+ Response from getting a Claude Computer Use task status.
49
+ """
50
+
51
+ model_config = ConfigDict(
52
+ populate_by_alias=True,
53
+ )
54
+
55
+ status: ClaudeComputerUseTaskStatus
56
+
57
+
58
+ class ClaudeComputerUseStepResponse(BaseModel):
59
+ """
60
+ Response from a single Claude Computer Use step.
61
+ """
62
+
63
+ model_config = ConfigDict(
64
+ populate_by_alias=True,
65
+ )
66
+
67
+ role: str
68
+ type: str
69
+ model: str
70
+ content: list[Any]
71
+ stop_reason: Optional[str] = Field(default=None)
72
+ stop_sequence: Optional[str] = Field(default=None)
73
+
74
+
75
+ class ClaudeComputerUseTaskData(BaseModel):
76
+ model_config = ConfigDict(
77
+ populate_by_alias=True,
78
+ )
79
+
80
+ steps: list[ClaudeComputerUseStepResponse]
81
+ final_result: Optional[str] = Field(default=None, alias="finalResult")
82
+
83
+
84
+ class ClaudeComputerUseTaskResponse(BaseModel):
85
+ """
86
+ Response from a Claude Computer Use task.
87
+ """
88
+
89
+ model_config = ConfigDict(
90
+ populate_by_alias=True,
91
+ )
92
+
93
+ job_id: str = Field(alias="jobId")
94
+ status: ClaudeComputerUseTaskStatus
95
+ data: Optional[ClaudeComputerUseTaskData] = Field(default=None, alias="data")
96
+ error: Optional[str] = Field(default=None, alias="error")
97
+ live_url: Optional[str] = Field(default=None, alias="liveUrl")
@@ -127,6 +127,11 @@ class CreateSessionProfile(BaseModel):
127
127
  )
128
128
 
129
129
 
130
+ class ImageCaptchaParam(BaseModel):
131
+ image_selector: str = Field(serialization_alias="imageSelector")
132
+ input_selector: str = Field(serialization_alias="inputSelector")
133
+
134
+
130
135
  class CreateSessionParams(BaseModel):
131
136
  """
132
137
  Parameters for creating a new browser session.
@@ -181,6 +186,9 @@ class CreateSessionParams(BaseModel):
181
186
  save_downloads: Optional[bool] = Field(
182
187
  default=None, serialization_alias="saveDownloads"
183
188
  )
189
+ image_captcha_params: Optional[List[ImageCaptchaParam]] = Field(
190
+ default=None, serialization_alias="imageCaptchaParams"
191
+ )
184
192
 
185
193
 
186
194
  class SessionRecording(BaseModel):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: hyperbrowser
3
- Version: 0.37.0
3
+ Version: 0.39.0
4
4
  Summary: Python SDK for hyperbrowser
5
5
  License: MIT
6
6
  Author: Nikhil Shahi
@@ -1,8 +1,9 @@
1
1
  hyperbrowser/__init__.py,sha256=zWGcLhqhvWy6BTwuNpzWK1-0LpIn311ks-4U9nrsb7Y,187
2
2
  hyperbrowser/client/async_client.py,sha256=TfDVCO0AxgUI5mB4bmnP0mvWdDR_C6yvMpo24KIkaDc,1474
3
3
  hyperbrowser/client/base.py,sha256=9gFma7RdvJBUlDCqr8tZd315UPrjn4ldU4B0-Y-L4O4,1268
4
- hyperbrowser/client/managers/async_manager/agents/__init__.py,sha256=4kfpZt3DvpWMFGFEtsyzaFr-7iNvFwUhTKVsYl3Ntjs,210
4
+ hyperbrowser/client/managers/async_manager/agents/__init__.py,sha256=iQF-JlDvCG7X-c0848OTD2WUMdb3sUsUokvEJzDea2g,336
5
5
  hyperbrowser/client/managers/async_manager/agents/browser_use.py,sha256=DLRcQfmM8LKBJsaFCx8cYn0L4UjCd0I3egoX5ytVoTg,2511
6
+ hyperbrowser/client/managers/async_manager/agents/claude_computer_use.py,sha256=gTnX8r3rETyLMsDy_4nO0oB5cDdHHN9s-y7xw-4ekqc,2657
6
7
  hyperbrowser/client/managers/async_manager/agents/cua.py,sha256=e43QgSLi0LvGd9cOirsRETcit0MXvvtLA2cNv16xH0s,2337
7
8
  hyperbrowser/client/managers/async_manager/crawl.py,sha256=fzaF6cK5HZej2C6FwXxnrRt4OpJ5qYxMktaQGVYTlWE,4357
8
9
  hyperbrowser/client/managers/async_manager/extension.py,sha256=a-xYtXXdCspukYtsguRgjEoQ8E_kzzA2tQAJtIyCtAs,1439
@@ -10,8 +11,9 @@ hyperbrowser/client/managers/async_manager/extract.py,sha256=wZO696_3Mse3tnsHgpS
10
11
  hyperbrowser/client/managers/async_manager/profile.py,sha256=fuNgZ5KFy6Jzy2fcjlF0yi2g8dudD_nTMkk5Coz06wE,1293
11
12
  hyperbrowser/client/managers/async_manager/scrape.py,sha256=U8oa5QNOfLfYxd31BmcLE2dqJbOK60cmoLDGoHzJnAI,6500
12
13
  hyperbrowser/client/managers/async_manager/session.py,sha256=4DTBbup-fK_uHNhgjZ4K7oqmTNtVH8tZtVQUpXzHyD8,2379
13
- hyperbrowser/client/managers/sync_manager/agents/__init__.py,sha256=4kfpZt3DvpWMFGFEtsyzaFr-7iNvFwUhTKVsYl3Ntjs,210
14
+ hyperbrowser/client/managers/sync_manager/agents/__init__.py,sha256=iQF-JlDvCG7X-c0848OTD2WUMdb3sUsUokvEJzDea2g,336
14
15
  hyperbrowser/client/managers/sync_manager/agents/browser_use.py,sha256=DX2Z5k6B_oA3wm4iYHCOq3l8B0ZyspdKlJhzf592-bw,2413
16
+ hyperbrowser/client/managers/sync_manager/agents/claude_computer_use.py,sha256=6mAaqDjKrLrxRaGZfZSgC7wYVyDQeWZEE6K6wLrnTXk,2557
15
17
  hyperbrowser/client/managers/sync_manager/agents/cua.py,sha256=rh3JyXWzh9SvSLkDBtWGVUd2KMx27MyLMuNPnRwvbxk,2253
16
18
  hyperbrowser/client/managers/sync_manager/crawl.py,sha256=gwLtEX-qGNvqxA7IhCIKYTF3QV3_gX7nOpMWZ2s7HzA,4289
17
19
  hyperbrowser/client/managers/sync_manager/extension.py,sha256=1YoyTZtMo43trl9jAsXv95aor0nBHiJEmLva39jFW-k,1415
@@ -22,8 +24,9 @@ hyperbrowser/client/managers/sync_manager/session.py,sha256=ipPv6uesN8Y7gDF8YL0X
22
24
  hyperbrowser/client/sync.py,sha256=LjBkuXGhGJaMbDPEZbF9mzonb2UBw_I9d6xk2MDQqIU,1297
23
25
  hyperbrowser/config.py,sha256=6xtUiVXy7MQMiARAsadP62U46tL0wzVMDuGmQBcH_LQ,623
24
26
  hyperbrowser/exceptions.py,sha256=SUUkptK2OL36xDORYmSicaTYR7pMbxeWAjAgz35xnM8,1171
25
- hyperbrowser/models/__init__.py,sha256=8K2Yzvj5809FVxV-7o5N56juh2WoEQPqCI9Ie_xyTJ8,3757
27
+ hyperbrowser/models/__init__.py,sha256=m8z8FXnFDqZF4NFTINuwNVm9D6quNmvp4xjmEaBr770,4216
26
28
  hyperbrowser/models/agents/browser_use.py,sha256=Wi-w0pTn33lDwfuleEre83vVfTc2oQDIoyuxgiHL3nA,5047
29
+ hyperbrowser/models/agents/claude_computer_use.py,sha256=6bnaF9Y-5jSr0vLXJijDwW29GZXr7H_8SMQSmY4vAFk,2568
27
30
  hyperbrowser/models/agents/cua.py,sha256=ao7AA6NBet31duCZLI5aiWydNiiHvgQTPxkxHR5r2Cw,3061
28
31
  hyperbrowser/models/consts.py,sha256=KdwLaRPMXv1U_oWwfGv8Kmml7Nygy-d1qH-IvAT2U_E,6601
29
32
  hyperbrowser/models/crawl.py,sha256=XUS5Ja-Abl8gMyDtLIsRaEKa_taSOORMLOFCdAPgGaI,2820
@@ -31,7 +34,7 @@ hyperbrowser/models/extension.py,sha256=nXjKXKt9R7RxyZ4hd3EvfqZsEGy_ufh1r5j2mqCL
31
34
  hyperbrowser/models/extract.py,sha256=DXg0HtO44plAtcFOmqUpdp9P93tq45U2fLWxn5jdjAw,1745
32
35
  hyperbrowser/models/profile.py,sha256=KRb_LNxxW00AsD_thzzthFS51vInJawt1RcoNz4Q9i8,1322
33
36
  hyperbrowser/models/scrape.py,sha256=iMsUuMx3UFtSci6TVUpcH5ytbgwiImIXjviVcGZ_gBQ,5048
34
- hyperbrowser/models/session.py,sha256=i1NkrQWNlKziDd98ySdrUUH7XSv6qOa2cmiK5vV7VeI,6730
37
+ hyperbrowser/models/session.py,sha256=rhDRb-HkjdXsfzjUg4VKOzaGMoHxcG38947bhT_jmiU,7044
35
38
  hyperbrowser/tools/__init__.py,sha256=L-2xveBbSuIBQBQhJmXGCLNYEUq_XHDdgz_gBAsmQZo,4605
36
39
  hyperbrowser/tools/anthropic.py,sha256=bo8jn2ROHCp_hpX1_cjkCk7qU0LmuBr_gvlvM0f5OMc,2699
37
40
  hyperbrowser/tools/openai.py,sha256=YkdONf2CYuuJei2019a5cpCcZGn8g5bH-PnZ4YY7c4U,3514
@@ -39,7 +42,7 @@ hyperbrowser/tools/schema.py,sha256=YFUAoQjx_SpjezS3UQdTCCn4xMdN3CgEeKAlulkIATc,
39
42
  hyperbrowser/transport/async_transport.py,sha256=6HKoeM5TutIqraEscEWobvSPWF3iVKh2hPflGNKwykw,4128
40
43
  hyperbrowser/transport/base.py,sha256=ildpMrDiM8nvrSGrH2LTOafmB17T7PQB_NQ1ODA378U,1703
41
44
  hyperbrowser/transport/sync.py,sha256=aUVpxWF8sqSycLNKxVNEZvlsZSoqc1eHgPK1Y1QA1u8,3422
42
- hyperbrowser-0.37.0.dist-info/LICENSE,sha256=6rUGKlyKb_1ZAH7h7YITYAAUNFN3MNGGKCyfrw49NLE,1071
43
- hyperbrowser-0.37.0.dist-info/METADATA,sha256=1zTwQupkHDgZkoFo-vVLCs77izhXOf0HWxmeKY0zQU4,3471
44
- hyperbrowser-0.37.0.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
45
- hyperbrowser-0.37.0.dist-info/RECORD,,
45
+ hyperbrowser-0.39.0.dist-info/LICENSE,sha256=6rUGKlyKb_1ZAH7h7YITYAAUNFN3MNGGKCyfrw49NLE,1071
46
+ hyperbrowser-0.39.0.dist-info/METADATA,sha256=rs329AZHJ-LrRSOPW2lSrRAts7yQd8pCKfEOSvRwBfo,3471
47
+ hyperbrowser-0.39.0.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
48
+ hyperbrowser-0.39.0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.1.1
2
+ Generator: poetry-core 2.1.2
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any