hyperbrowser 0.2.0__tar.gz → 0.71.0__tar.gz

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.
Files changed (64) hide show
  1. {hyperbrowser-0.2.0 → hyperbrowser-0.71.0}/LICENSE +1 -1
  2. {hyperbrowser-0.2.0 → hyperbrowser-0.71.0}/PKG-INFO +27 -14
  3. {hyperbrowser-0.2.0 → hyperbrowser-0.71.0}/README.md +17 -8
  4. hyperbrowser-0.71.0/hyperbrowser/client/async_client.py +46 -0
  5. {hyperbrowser-0.2.0 → hyperbrowser-0.71.0}/hyperbrowser/client/base.py +1 -1
  6. hyperbrowser-0.71.0/hyperbrowser/client/managers/async_manager/agents/__init__.py +14 -0
  7. hyperbrowser-0.71.0/hyperbrowser/client/managers/async_manager/agents/browser_use.py +79 -0
  8. hyperbrowser-0.71.0/hyperbrowser/client/managers/async_manager/agents/claude_computer_use.py +71 -0
  9. hyperbrowser-0.71.0/hyperbrowser/client/managers/async_manager/agents/cua.py +67 -0
  10. hyperbrowser-0.71.0/hyperbrowser/client/managers/async_manager/agents/gemini_computer_use.py +71 -0
  11. hyperbrowser-0.71.0/hyperbrowser/client/managers/async_manager/agents/hyper_agent.py +71 -0
  12. hyperbrowser-0.71.0/hyperbrowser/client/managers/async_manager/computer_action.py +165 -0
  13. hyperbrowser-0.71.0/hyperbrowser/client/managers/async_manager/crawl.py +117 -0
  14. hyperbrowser-0.71.0/hyperbrowser/client/managers/async_manager/extension.py +40 -0
  15. hyperbrowser-0.71.0/hyperbrowser/client/managers/async_manager/extract.py +64 -0
  16. hyperbrowser-0.71.0/hyperbrowser/client/managers/async_manager/profile.py +45 -0
  17. hyperbrowser-0.71.0/hyperbrowser/client/managers/async_manager/scrape.py +172 -0
  18. hyperbrowser-0.71.0/hyperbrowser/client/managers/async_manager/session.py +116 -0
  19. hyperbrowser-0.71.0/hyperbrowser/client/managers/async_manager/team.py +12 -0
  20. hyperbrowser-0.71.0/hyperbrowser/client/managers/sync_manager/agents/__init__.py +14 -0
  21. hyperbrowser-0.71.0/hyperbrowser/client/managers/sync_manager/agents/browser_use.py +77 -0
  22. hyperbrowser-0.71.0/hyperbrowser/client/managers/sync_manager/agents/claude_computer_use.py +71 -0
  23. hyperbrowser-0.71.0/hyperbrowser/client/managers/sync_manager/agents/cua.py +67 -0
  24. hyperbrowser-0.71.0/hyperbrowser/client/managers/sync_manager/agents/gemini_computer_use.py +71 -0
  25. hyperbrowser-0.71.0/hyperbrowser/client/managers/sync_manager/agents/hyper_agent.py +69 -0
  26. hyperbrowser-0.71.0/hyperbrowser/client/managers/sync_manager/computer_action.py +165 -0
  27. hyperbrowser-0.71.0/hyperbrowser/client/managers/sync_manager/crawl.py +118 -0
  28. hyperbrowser-0.71.0/hyperbrowser/client/managers/sync_manager/extension.py +40 -0
  29. hyperbrowser-0.71.0/hyperbrowser/client/managers/sync_manager/extract.py +63 -0
  30. hyperbrowser-0.71.0/hyperbrowser/client/managers/sync_manager/profile.py +45 -0
  31. hyperbrowser-0.71.0/hyperbrowser/client/managers/sync_manager/scrape.py +170 -0
  32. hyperbrowser-0.71.0/hyperbrowser/client/managers/sync_manager/session.py +110 -0
  33. hyperbrowser-0.71.0/hyperbrowser/client/managers/sync_manager/team.py +12 -0
  34. hyperbrowser-0.71.0/hyperbrowser/client/sync.py +40 -0
  35. {hyperbrowser-0.2.0 → hyperbrowser-0.71.0}/hyperbrowser/config.py +2 -2
  36. hyperbrowser-0.71.0/hyperbrowser/models/__init__.py +340 -0
  37. hyperbrowser-0.71.0/hyperbrowser/models/agents/browser_use.py +299 -0
  38. hyperbrowser-0.71.0/hyperbrowser/models/agents/claude_computer_use.py +135 -0
  39. hyperbrowser-0.71.0/hyperbrowser/models/agents/cua.py +163 -0
  40. hyperbrowser-0.71.0/hyperbrowser/models/agents/gemini_computer_use.py +135 -0
  41. hyperbrowser-0.71.0/hyperbrowser/models/agents/hyper_agent.py +153 -0
  42. hyperbrowser-0.71.0/hyperbrowser/models/computer_action.py +208 -0
  43. hyperbrowser-0.71.0/hyperbrowser/models/consts.py +640 -0
  44. hyperbrowser-0.71.0/hyperbrowser/models/crawl.py +104 -0
  45. hyperbrowser-0.71.0/hyperbrowser/models/extension.py +27 -0
  46. hyperbrowser-0.71.0/hyperbrowser/models/extract.py +81 -0
  47. hyperbrowser-0.71.0/hyperbrowser/models/profile.py +80 -0
  48. hyperbrowser-0.71.0/hyperbrowser/models/scrape.py +219 -0
  49. hyperbrowser-0.71.0/hyperbrowser/models/session.py +391 -0
  50. hyperbrowser-0.71.0/hyperbrowser/models/team.py +15 -0
  51. hyperbrowser-0.71.0/hyperbrowser/tools/__init__.py +126 -0
  52. hyperbrowser-0.71.0/hyperbrowser/tools/anthropic.py +80 -0
  53. hyperbrowser-0.71.0/hyperbrowser/tools/openai.py +105 -0
  54. hyperbrowser-0.71.0/hyperbrowser/tools/schema.py +189 -0
  55. hyperbrowser-0.71.0/hyperbrowser/transport/async_transport.py +114 -0
  56. {hyperbrowser-0.2.0 → hyperbrowser-0.71.0}/hyperbrowser/transport/base.py +4 -0
  57. {hyperbrowser-0.2.0 → hyperbrowser-0.71.0}/hyperbrowser/transport/sync.py +31 -14
  58. {hyperbrowser-0.2.0 → hyperbrowser-0.71.0}/pyproject.toml +7 -6
  59. hyperbrowser-0.2.0/hyperbrowser/client/async_client.py +0 -51
  60. hyperbrowser-0.2.0/hyperbrowser/client/sync.py +0 -43
  61. hyperbrowser-0.2.0/hyperbrowser/models/session.py +0 -89
  62. hyperbrowser-0.2.0/hyperbrowser/transport/async_transport.py +0 -97
  63. {hyperbrowser-0.2.0 → hyperbrowser-0.71.0}/hyperbrowser/__init__.py +0 -0
  64. {hyperbrowser-0.2.0 → hyperbrowser-0.71.0}/hyperbrowser/exceptions.py +0 -0
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2024 hyperbrowserai
3
+ Copyright (c) 2025 S2 Labs Inc.
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -1,25 +1,32 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: hyperbrowser
3
- Version: 0.2.0
3
+ Version: 0.71.0
4
4
  Summary: Python SDK for hyperbrowser
5
- Home-page: https://github.com/hyperbrowserai/python-sdk
6
5
  License: MIT
6
+ License-File: LICENSE
7
7
  Author: Nikhil Shahi
8
8
  Author-email: nshahi1998@gmail.com
9
- Requires-Python: >=3.9,<4.0
9
+ Requires-Python: >=3.8,<4.0
10
10
  Classifier: License :: OSI Approved :: MIT License
11
11
  Classifier: Programming Language :: Python :: 3
12
+ Classifier: Programming Language :: Python :: 3.8
12
13
  Classifier: Programming Language :: Python :: 3.9
13
14
  Classifier: Programming Language :: Python :: 3.10
14
15
  Classifier: Programming Language :: Python :: 3.11
15
16
  Classifier: Programming Language :: Python :: 3.12
16
17
  Classifier: Programming Language :: Python :: 3.13
17
- Requires-Dist: aiohttp (>=3.11.7,<4.0.0)
18
- Requires-Dist: pydantic (>=2.10.0,<3.0.0)
19
- Requires-Dist: requests (>=2.32.3,<3.0.0)
18
+ Classifier: Programming Language :: Python :: 3.14
19
+ Requires-Dist: httpx (>=0.23.0,<1)
20
+ Requires-Dist: jsonref (>=1.1.0)
21
+ Requires-Dist: pydantic (>=2.0,<3)
22
+ Project-URL: Homepage, https://github.com/hyperbrowserai/python-sdk
20
23
  Project-URL: Repository, https://github.com/hyperbrowserai/python-sdk
21
24
  Description-Content-Type: text/markdown
22
25
 
26
+ # Hyperbrowser Python SDK
27
+
28
+ Checkout the full documentation [here](https://docs.hyperbrowser.ai/)
29
+
23
30
  ## Installation
24
31
 
25
32
  Currently Hyperbrowser supports creating a browser session in two ways:
@@ -47,15 +54,15 @@ The API key can be configured either from the constructor arguments or environme
47
54
  ```python
48
55
  import asyncio
49
56
  from pyppeteer import connect
50
- from hyperbrowser.client.async_client import AsyncHyperbrowser as Hyperbrowser
57
+ from hyperbrowser import AsyncHyperbrowser
51
58
 
52
59
  HYPERBROWSER_API_KEY = "test-key"
53
60
 
54
61
  async def main():
55
- async with Hyperbrowser(api_key=HYPERBROWSER_API_KEY) as client:
56
- session = await client.create_session()
62
+ async with AsyncHyperbrowser(api_key=HYPERBROWSER_API_KEY) as client:
63
+ session = await client.sessions.create()
57
64
 
58
- ws_endpoint = f"{session.websocket_url}&apiKey={HYPERBROWSER_API_KEY}"
65
+ ws_endpoint = session.ws_endpoint
59
66
  browser = await connect(browserWSEndpoint=ws_endpoint, defaultViewport=None)
60
67
 
61
68
  # Get pages
@@ -73,6 +80,7 @@ async def main():
73
80
 
74
81
  await page.close()
75
82
  await browser.disconnect()
83
+ await client.sessions.stop(session.id)
76
84
  print("Session completed!")
77
85
 
78
86
  # Run the asyncio event loop
@@ -82,15 +90,15 @@ asyncio.get_event_loop().run_until_complete(main())
82
90
 
83
91
  ```python
84
92
  from playwright.sync_api import sync_playwright
85
- from hyperbrowser.client.sync import Hyperbrowser
93
+ from hyperbrowser import Hyperbrowser
86
94
 
87
95
  HYPERBROWSER_API_KEY = "test-key"
88
96
 
89
97
  def main():
90
98
  client = Hyperbrowser(api_key=HYPERBROWSER_API_KEY)
91
- session = client.create_session()
99
+ session = client.sessions.create()
92
100
 
93
- ws_endpoint = f"{session.websocket_url}&apiKey={HYPERBROWSER_API_KEY}"
101
+ ws_endpoint = session.ws_endpoint
94
102
 
95
103
  # Launch Playwright and connect to the remote browser
96
104
  with sync_playwright() as p:
@@ -112,7 +120,12 @@ def main():
112
120
  page.close()
113
121
  browser.close()
114
122
  print("Session completed!")
123
+ client.sessions.stop(session.id)
115
124
 
116
125
  # Run the asyncio event loop
117
126
  main()
118
127
  ```
128
+ ## License
129
+
130
+ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
131
+
@@ -1,3 +1,7 @@
1
+ # Hyperbrowser Python SDK
2
+
3
+ Checkout the full documentation [here](https://docs.hyperbrowser.ai/)
4
+
1
5
  ## Installation
2
6
 
3
7
  Currently Hyperbrowser supports creating a browser session in two ways:
@@ -25,15 +29,15 @@ The API key can be configured either from the constructor arguments or environme
25
29
  ```python
26
30
  import asyncio
27
31
  from pyppeteer import connect
28
- from hyperbrowser.client.async_client import AsyncHyperbrowser as Hyperbrowser
32
+ from hyperbrowser import AsyncHyperbrowser
29
33
 
30
34
  HYPERBROWSER_API_KEY = "test-key"
31
35
 
32
36
  async def main():
33
- async with Hyperbrowser(api_key=HYPERBROWSER_API_KEY) as client:
34
- session = await client.create_session()
37
+ async with AsyncHyperbrowser(api_key=HYPERBROWSER_API_KEY) as client:
38
+ session = await client.sessions.create()
35
39
 
36
- ws_endpoint = f"{session.websocket_url}&apiKey={HYPERBROWSER_API_KEY}"
40
+ ws_endpoint = session.ws_endpoint
37
41
  browser = await connect(browserWSEndpoint=ws_endpoint, defaultViewport=None)
38
42
 
39
43
  # Get pages
@@ -51,6 +55,7 @@ async def main():
51
55
 
52
56
  await page.close()
53
57
  await browser.disconnect()
58
+ await client.sessions.stop(session.id)
54
59
  print("Session completed!")
55
60
 
56
61
  # Run the asyncio event loop
@@ -60,15 +65,15 @@ asyncio.get_event_loop().run_until_complete(main())
60
65
 
61
66
  ```python
62
67
  from playwright.sync_api import sync_playwright
63
- from hyperbrowser.client.sync import Hyperbrowser
68
+ from hyperbrowser import Hyperbrowser
64
69
 
65
70
  HYPERBROWSER_API_KEY = "test-key"
66
71
 
67
72
  def main():
68
73
  client = Hyperbrowser(api_key=HYPERBROWSER_API_KEY)
69
- session = client.create_session()
74
+ session = client.sessions.create()
70
75
 
71
- ws_endpoint = f"{session.websocket_url}&apiKey={HYPERBROWSER_API_KEY}"
76
+ ws_endpoint = session.ws_endpoint
72
77
 
73
78
  # Launch Playwright and connect to the remote browser
74
79
  with sync_playwright() as p:
@@ -90,7 +95,11 @@ def main():
90
95
  page.close()
91
96
  browser.close()
92
97
  print("Session completed!")
98
+ client.sessions.stop(session.id)
93
99
 
94
100
  # Run the asyncio event loop
95
101
  main()
96
- ```
102
+ ```
103
+ ## License
104
+
105
+ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
@@ -0,0 +1,46 @@
1
+ from typing import Optional
2
+
3
+ from ..config import ClientConfig
4
+ from ..transport.async_transport import AsyncTransport
5
+ from .base import HyperbrowserBase
6
+ from .managers.async_manager.agents import Agents
7
+ from .managers.async_manager.crawl import CrawlManager
8
+ from .managers.async_manager.extension import ExtensionManager
9
+ from .managers.async_manager.extract import ExtractManager
10
+ from .managers.async_manager.profile import ProfileManager
11
+ from .managers.async_manager.scrape import ScrapeManager
12
+ from .managers.async_manager.session import SessionManager
13
+ from .managers.async_manager.team import TeamManager
14
+ from .managers.async_manager.computer_action import ComputerActionManager
15
+
16
+
17
+ class AsyncHyperbrowser(HyperbrowserBase):
18
+ """Asynchronous Hyperbrowser client"""
19
+
20
+ def __init__(
21
+ self,
22
+ config: Optional[ClientConfig] = None,
23
+ api_key: Optional[str] = None,
24
+ base_url: Optional[str] = None,
25
+ timeout: Optional[int] = 30,
26
+ ):
27
+ super().__init__(AsyncTransport, config, api_key, base_url)
28
+ self.transport.client.timeout = timeout
29
+ self.sessions = SessionManager(self)
30
+ self.scrape = ScrapeManager(self)
31
+ self.crawl = CrawlManager(self)
32
+ self.extract = ExtractManager(self)
33
+ self.profiles = ProfileManager(self)
34
+ self.extensions = ExtensionManager(self)
35
+ self.agents = Agents(self)
36
+ self.team = TeamManager(self)
37
+ self.computer_action = ComputerActionManager(self)
38
+
39
+ async def close(self) -> None:
40
+ await self.transport.close()
41
+
42
+ async def __aenter__(self):
43
+ return self
44
+
45
+ async def __aexit__(self, exc_type, exc_val, exc_tb):
46
+ await self.close()
@@ -27,7 +27,7 @@ class HyperbrowserBase:
27
27
  base_url
28
28
  if base_url is not None
29
29
  else os.environ.get(
30
- "HYPERBROWSER_BASE_URL", "https://app.hyperbrowser.ai"
30
+ "HYPERBROWSER_BASE_URL", "https://api.hyperbrowser.ai"
31
31
  )
32
32
  ),
33
33
  )
@@ -0,0 +1,14 @@
1
+ from .browser_use import BrowserUseManager
2
+ from .cua import CuaManager
3
+ from .claude_computer_use import ClaudeComputerUseManager
4
+ from .hyper_agent import HyperAgentManager
5
+ from .gemini_computer_use import GeminiComputerUseManager
6
+
7
+
8
+ class Agents:
9
+ def __init__(self, client):
10
+ self.browser_use = BrowserUseManager(client)
11
+ self.cua = CuaManager(client)
12
+ self.claude_computer_use = ClaudeComputerUseManager(client)
13
+ self.hyper_agent = HyperAgentManager(client)
14
+ self.gemini_computer_use = GeminiComputerUseManager(client)
@@ -0,0 +1,79 @@
1
+ import asyncio
2
+ import jsonref
3
+
4
+ from hyperbrowser.exceptions import HyperbrowserError
5
+
6
+ from .....models import (
7
+ POLLING_ATTEMPTS,
8
+ BasicResponse,
9
+ BrowserUseTaskResponse,
10
+ BrowserUseTaskStatusResponse,
11
+ StartBrowserUseTaskParams,
12
+ StartBrowserUseTaskResponse,
13
+ )
14
+
15
+
16
+ class BrowserUseManager:
17
+ def __init__(self, client):
18
+ self._client = client
19
+
20
+ async def start(
21
+ self, params: StartBrowserUseTaskParams
22
+ ) -> StartBrowserUseTaskResponse:
23
+ if params.output_model_schema:
24
+ if hasattr(params.output_model_schema, "model_json_schema"):
25
+ params.output_model_schema = jsonref.replace_refs(
26
+ params.output_model_schema.model_json_schema(),
27
+ proxies=False,
28
+ lazy_load=False,
29
+ )
30
+ response = await self._client.transport.post(
31
+ self._client._build_url("/task/browser-use"),
32
+ data=params.model_dump(exclude_none=True, by_alias=True),
33
+ )
34
+ return StartBrowserUseTaskResponse(**response.data)
35
+
36
+ async def get(self, job_id: str) -> BrowserUseTaskResponse:
37
+ response = await self._client.transport.get(
38
+ self._client._build_url(f"/task/browser-use/{job_id}")
39
+ )
40
+ return BrowserUseTaskResponse(**response.data)
41
+
42
+ async def get_status(self, job_id: str) -> BrowserUseTaskStatusResponse:
43
+ response = await self._client.transport.get(
44
+ self._client._build_url(f"/task/browser-use/{job_id}/status")
45
+ )
46
+ return BrowserUseTaskStatusResponse(**response.data)
47
+
48
+ async def stop(self, job_id: str) -> BasicResponse:
49
+ response = await self._client.transport.put(
50
+ self._client._build_url(f"/task/browser-use/{job_id}/stop")
51
+ )
52
+ return BasicResponse(**response.data)
53
+
54
+ async def start_and_wait(
55
+ self, params: StartBrowserUseTaskParams
56
+ ) -> BrowserUseTaskResponse:
57
+ job_start_resp = await self.start(params)
58
+ job_id = job_start_resp.job_id
59
+ if not job_id:
60
+ raise HyperbrowserError("Failed to start browser-use task job")
61
+
62
+ failures = 0
63
+ while True:
64
+ try:
65
+ job_response = await self.get_status(job_id)
66
+ if (
67
+ job_response.status == "completed"
68
+ or job_response.status == "failed"
69
+ or job_response.status == "stopped"
70
+ ):
71
+ return await self.get(job_id)
72
+ failures = 0
73
+ except Exception as e:
74
+ failures += 1
75
+ if failures >= POLLING_ATTEMPTS:
76
+ raise HyperbrowserError(
77
+ f"Failed to poll browser-use task job {job_id} after {POLLING_ATTEMPTS} attempts: {e}"
78
+ )
79
+ await asyncio.sleep(2)
@@ -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)
@@ -0,0 +1,67 @@
1
+ import asyncio
2
+
3
+ from hyperbrowser.exceptions import HyperbrowserError
4
+
5
+ from .....models import (
6
+ POLLING_ATTEMPTS,
7
+ BasicResponse,
8
+ CuaTaskResponse,
9
+ CuaTaskStatusResponse,
10
+ StartCuaTaskParams,
11
+ StartCuaTaskResponse,
12
+ )
13
+
14
+
15
+ class CuaManager:
16
+ def __init__(self, client):
17
+ self._client = client
18
+
19
+ async def start(self, params: StartCuaTaskParams) -> StartCuaTaskResponse:
20
+ response = await self._client.transport.post(
21
+ self._client._build_url("/task/cua"),
22
+ data=params.model_dump(exclude_none=True, by_alias=True),
23
+ )
24
+ return StartCuaTaskResponse(**response.data)
25
+
26
+ async def get(self, job_id: str) -> CuaTaskResponse:
27
+ response = await self._client.transport.get(
28
+ self._client._build_url(f"/task/cua/{job_id}")
29
+ )
30
+ return CuaTaskResponse(**response.data)
31
+
32
+ async def get_status(self, job_id: str) -> CuaTaskStatusResponse:
33
+ response = await self._client.transport.get(
34
+ self._client._build_url(f"/task/cua/{job_id}/status")
35
+ )
36
+ return CuaTaskStatusResponse(**response.data)
37
+
38
+ async def stop(self, job_id: str) -> BasicResponse:
39
+ response = await self._client.transport.put(
40
+ self._client._build_url(f"/task/cua/{job_id}/stop")
41
+ )
42
+ return BasicResponse(**response.data)
43
+
44
+ async def start_and_wait(self, params: StartCuaTaskParams) -> CuaTaskResponse:
45
+ job_start_resp = await self.start(params)
46
+ job_id = job_start_resp.job_id
47
+ if not job_id:
48
+ raise HyperbrowserError("Failed to start CUA task job")
49
+
50
+ failures = 0
51
+ while True:
52
+ try:
53
+ job_response = await self.get_status(job_id)
54
+ if (
55
+ job_response.status == "completed"
56
+ or job_response.status == "failed"
57
+ or job_response.status == "stopped"
58
+ ):
59
+ return await self.get(job_id)
60
+ failures = 0
61
+ except Exception as e:
62
+ failures += 1
63
+ if failures >= POLLING_ATTEMPTS:
64
+ raise HyperbrowserError(
65
+ f"Failed to poll CUA task job {job_id} after {POLLING_ATTEMPTS} attempts: {e}"
66
+ )
67
+ await asyncio.sleep(2)
@@ -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
+ GeminiComputerUseTaskResponse,
9
+ GeminiComputerUseTaskStatusResponse,
10
+ StartGeminiComputerUseTaskParams,
11
+ StartGeminiComputerUseTaskResponse,
12
+ )
13
+
14
+
15
+ class GeminiComputerUseManager:
16
+ def __init__(self, client):
17
+ self._client = client
18
+
19
+ async def start(
20
+ self, params: StartGeminiComputerUseTaskParams
21
+ ) -> StartGeminiComputerUseTaskResponse:
22
+ response = await self._client.transport.post(
23
+ self._client._build_url("/task/gemini-computer-use"),
24
+ data=params.model_dump(exclude_none=True, by_alias=True),
25
+ )
26
+ return StartGeminiComputerUseTaskResponse(**response.data)
27
+
28
+ async def get(self, job_id: str) -> GeminiComputerUseTaskResponse:
29
+ response = await self._client.transport.get(
30
+ self._client._build_url(f"/task/gemini-computer-use/{job_id}")
31
+ )
32
+ return GeminiComputerUseTaskResponse(**response.data)
33
+
34
+ async def get_status(self, job_id: str) -> GeminiComputerUseTaskStatusResponse:
35
+ response = await self._client.transport.get(
36
+ self._client._build_url(f"/task/gemini-computer-use/{job_id}/status")
37
+ )
38
+ return GeminiComputerUseTaskStatusResponse(**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/gemini-computer-use/{job_id}/stop")
43
+ )
44
+ return BasicResponse(**response.data)
45
+
46
+ async def start_and_wait(
47
+ self, params: StartGeminiComputerUseTaskParams
48
+ ) -> GeminiComputerUseTaskResponse:
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 Gemini 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 Gemini Computer Use task job {job_id} after {POLLING_ATTEMPTS} attempts: {e}"
70
+ )
71
+ await asyncio.sleep(2)
@@ -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
+ HyperAgentTaskResponse,
9
+ HyperAgentTaskStatusResponse,
10
+ StartHyperAgentTaskParams,
11
+ StartHyperAgentTaskResponse,
12
+ )
13
+
14
+
15
+ class HyperAgentManager:
16
+ def __init__(self, client):
17
+ self._client = client
18
+
19
+ async def start(
20
+ self, params: StartHyperAgentTaskParams
21
+ ) -> StartHyperAgentTaskResponse:
22
+ response = await self._client.transport.post(
23
+ self._client._build_url("/task/hyper-agent"),
24
+ data=params.model_dump(exclude_none=True, by_alias=True),
25
+ )
26
+ return StartHyperAgentTaskResponse(**response.data)
27
+
28
+ async def get(self, job_id: str) -> HyperAgentTaskResponse:
29
+ response = await self._client.transport.get(
30
+ self._client._build_url(f"/task/hyper-agent/{job_id}")
31
+ )
32
+ return HyperAgentTaskResponse(**response.data)
33
+
34
+ async def get_status(self, job_id: str) -> HyperAgentTaskStatusResponse:
35
+ response = await self._client.transport.get(
36
+ self._client._build_url(f"/task/hyper-agent/{job_id}/status")
37
+ )
38
+ return HyperAgentTaskStatusResponse(**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/hyper-agent/{job_id}/stop")
43
+ )
44
+ return BasicResponse(**response.data)
45
+
46
+ async def start_and_wait(
47
+ self, params: StartHyperAgentTaskParams
48
+ ) -> HyperAgentTaskResponse:
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 HyperAgent task")
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 HyperAgent task {job_id} after {POLLING_ATTEMPTS} attempts: {e}"
70
+ )
71
+ await asyncio.sleep(2)