hyperbrowser 0.90.7__tar.gz → 0.91.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 (92) hide show
  1. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/PKG-INFO +7 -1
  2. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/README.md +6 -0
  3. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/computer_action.py +9 -0
  4. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/session.py +51 -0
  5. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/computer_action.py +9 -0
  6. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/session.py +51 -0
  7. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/models/__init__.py +23 -0
  8. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/models/computer_action.py +34 -1
  9. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/models/session.py +113 -1
  10. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/transport/async_transport.py +11 -4
  11. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/transport/base.py +7 -1
  12. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/transport/sync.py +11 -4
  13. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/pyproject.toml +1 -1
  14. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/LICENSE +0 -0
  15. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/__init__.py +0 -0
  16. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/async_client.py +0 -0
  17. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/base.py +0 -0
  18. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/agents/__init__.py +0 -0
  19. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/agents/browser_use.py +0 -0
  20. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/agents/claude_computer_use.py +0 -0
  21. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/agents/cua.py +0 -0
  22. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/agents/gemini_computer_use.py +0 -0
  23. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/agents/hyper_agent.py +0 -0
  24. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/crawl.py +0 -0
  25. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/extension.py +0 -0
  26. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/extract.py +0 -0
  27. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/profile.py +0 -0
  28. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/sandbox.py +0 -0
  29. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/sandboxes/__init__.py +0 -0
  30. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/sandboxes/sandbox_files.py +0 -0
  31. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/sandboxes/sandbox_processes.py +0 -0
  32. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/sandboxes/sandbox_terminal.py +0 -0
  33. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/sandboxes/sandbox_transport.py +0 -0
  34. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/scrape.py +0 -0
  35. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/team.py +0 -0
  36. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/volume.py +0 -0
  37. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/web/__init__.py +0 -0
  38. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/web/batch_fetch.py +0 -0
  39. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/web/crawl.py +0 -0
  40. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sandboxes/__init__.py +0 -0
  41. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sandboxes/shared.py +0 -0
  42. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/agents/__init__.py +0 -0
  43. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/agents/browser_use.py +0 -0
  44. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/agents/claude_computer_use.py +0 -0
  45. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/agents/cua.py +0 -0
  46. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/agents/gemini_computer_use.py +0 -0
  47. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/agents/hyper_agent.py +0 -0
  48. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/crawl.py +0 -0
  49. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/extension.py +0 -0
  50. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/extract.py +0 -0
  51. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/profile.py +0 -0
  52. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/sandbox.py +0 -0
  53. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/sandboxes/__init__.py +0 -0
  54. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/sandboxes/sandbox_files.py +0 -0
  55. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/sandboxes/sandbox_processes.py +0 -0
  56. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/sandboxes/sandbox_terminal.py +0 -0
  57. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/sandboxes/sandbox_transport.py +0 -0
  58. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/scrape.py +0 -0
  59. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/team.py +0 -0
  60. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/volume.py +0 -0
  61. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/web/__init__.py +0 -0
  62. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/web/batch_fetch.py +0 -0
  63. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/web/crawl.py +0 -0
  64. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/client/sync.py +0 -0
  65. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/config.py +0 -0
  66. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/exceptions.py +0 -0
  67. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/models/_parsers.py +0 -0
  68. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/models/agents/browser_use.py +0 -0
  69. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/models/agents/claude_computer_use.py +0 -0
  70. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/models/agents/cua.py +0 -0
  71. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/models/agents/gemini_computer_use.py +0 -0
  72. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/models/agents/hyper_agent.py +0 -0
  73. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/models/consts.py +0 -0
  74. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/models/crawl.py +0 -0
  75. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/models/extension.py +0 -0
  76. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/models/extract.py +0 -0
  77. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/models/profile.py +0 -0
  78. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/models/sandbox.py +0 -0
  79. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/models/scrape.py +0 -0
  80. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/models/team.py +0 -0
  81. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/models/volume.py +0 -0
  82. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/models/web/batch_fetch.py +0 -0
  83. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/models/web/branding.py +0 -0
  84. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/models/web/common.py +0 -0
  85. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/models/web/crawl.py +0 -0
  86. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/models/web/fetch.py +0 -0
  87. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/models/web/search.py +0 -0
  88. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/sandbox_common.py +0 -0
  89. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/tools/__init__.py +0 -0
  90. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/tools/anthropic.py +0 -0
  91. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/tools/openai.py +0 -0
  92. {hyperbrowser-0.90.7 → hyperbrowser-0.91.0}/hyperbrowser/tools/schema.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hyperbrowser
3
- Version: 0.90.7
3
+ Version: 0.91.0
4
4
  Summary: Python SDK for hyperbrowser
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -48,6 +48,12 @@ Both the sync and async client follow similar configuration params
48
48
  ### API Key
49
49
  The API key can be configured either from the constructor arguments or environment variables using `HYPERBROWSER_API_KEY`
50
50
 
51
+ If no API key is provided, the client falls back to a saved OAuth session created by `hx auth login`. By default it reads `~/.hx_config/auth/default.json`, or `~/.hx_config/auth/<profile>.json` when `HYPERBROWSER_PROFILE` or `ClientConfig(profile=...)` is set.
52
+
53
+ Profile names must match `^[A-Za-z0-9._-]+$`.
54
+
55
+ `base_url` and `HYPERBROWSER_BASE_URL` accept either `https://host` or `https://host/api`. The client normalizes both to the same control-plane base URL.
56
+
51
57
  ## Usage
52
58
 
53
59
  ### Async
@@ -22,6 +22,12 @@ Both the sync and async client follow similar configuration params
22
22
  ### API Key
23
23
  The API key can be configured either from the constructor arguments or environment variables using `HYPERBROWSER_API_KEY`
24
24
 
25
+ If no API key is provided, the client falls back to a saved OAuth session created by `hx auth login`. By default it reads `~/.hx_config/auth/default.json`, or `~/.hx_config/auth/<profile>.json` when `HYPERBROWSER_PROFILE` or `ClientConfig(profile=...)` is set.
26
+
27
+ Profile names must match `^[A-Za-z0-9._-]+$`.
28
+
29
+ `base_url` and `HYPERBROWSER_BASE_URL` accept either `https://host` or `https://host/api`. The client normalizes both to the same control-plane base URL.
30
+
25
31
  ## Usage
26
32
 
27
33
  ### Async
@@ -18,6 +18,7 @@ from hyperbrowser.models import (
18
18
  ComputerActionMouseButton,
19
19
  GetClipboardTextActionParams,
20
20
  PutSelectionTextActionParams,
21
+ ListWindowsActionParams,
21
22
  )
22
23
 
23
24
 
@@ -175,3 +176,11 @@ class ComputerActionManager:
175
176
  text=text, return_screenshot=return_screenshot
176
177
  )
177
178
  return await self._execute_request(session, params)
179
+
180
+ async def list_windows(
181
+ self,
182
+ session: Union[SessionDetail, str],
183
+ return_screenshot: bool = False,
184
+ ) -> ComputerActionResponse:
185
+ params = ListWindowsActionParams(return_screenshot=return_screenshot)
186
+ return await self._execute_request(session, params)
@@ -2,6 +2,8 @@ from typing import List, Optional, Union, IO, overload
2
2
  import warnings
3
3
  from ....models.session import (
4
4
  BasicResponse,
5
+ CaptchaEvaluationParams,
6
+ CaptchaEvaluationResponse,
5
7
  CreateSessionParams,
6
8
  GetSessionDownloadsUrlResponse,
7
9
  GetSessionRecordingUrlResponse,
@@ -17,9 +19,13 @@ from ....models.session import (
17
19
  UpdateSessionProfileParams,
18
20
  UpdateSessionProxyParams,
19
21
  UpdateSessionScreenParams,
22
+ UpdateSessionSolveCaptchasParams,
23
+ UpdateSessionSolveCaptchasResponse,
20
24
  SessionGetParams,
21
25
  )
22
26
 
27
+ CAPTCHA_EVALUATION_REQUEST_TIMEOUT_SECONDS = 185
28
+
23
29
 
24
30
  class SessionEventLogsManager:
25
31
  def __init__(self, client):
@@ -70,6 +76,21 @@ class SessionManager:
70
76
  )
71
77
  return BasicResponse(**response.data)
72
78
 
79
+ async def evaluate_captcha(
80
+ self,
81
+ id: str,
82
+ params: Optional[CaptchaEvaluationParams] = None,
83
+ ) -> CaptchaEvaluationResponse:
84
+ params_obj = params or CaptchaEvaluationParams()
85
+ response = await self._client.transport.post(
86
+ self._client._build_url(f"/session/{id}/captcha/evaluate"),
87
+ data=params_obj.model_dump(exclude_none=True, by_alias=True),
88
+ timeout=max(
89
+ self._client.timeout, CAPTCHA_EVALUATION_REQUEST_TIMEOUT_SECONDS
90
+ ),
91
+ )
92
+ return CaptchaEvaluationResponse(**response.data)
93
+
73
94
  async def list(
74
95
  self, params: SessionListParams = SessionListParams()
75
96
  ) -> SessionListResponse:
@@ -213,6 +234,36 @@ class SessionManager:
213
234
  )
214
235
  return BasicResponse(**response.data)
215
236
 
237
+ async def start_captcha_solving(
238
+ self,
239
+ id: str,
240
+ params: Optional[UpdateSessionSolveCaptchasParams] = None,
241
+ ) -> UpdateSessionSolveCaptchasResponse:
242
+ params_obj = params or UpdateSessionSolveCaptchasParams()
243
+ response = await self._client.transport.put(
244
+ self._client._build_url(f"/session/{id}/update"),
245
+ data={
246
+ "type": "solveCaptchas",
247
+ "params": {
248
+ "enabled": True,
249
+ **params_obj.model_dump(exclude_none=True, by_alias=True),
250
+ },
251
+ },
252
+ )
253
+ return UpdateSessionSolveCaptchasResponse(**response.data)
254
+
255
+ async def stop_captcha_solving(self, id: str) -> UpdateSessionSolveCaptchasResponse:
256
+ response = await self._client.transport.put(
257
+ self._client._build_url(f"/session/{id}/update"),
258
+ data={
259
+ "type": "solveCaptchas",
260
+ "params": {
261
+ "enabled": False,
262
+ },
263
+ },
264
+ )
265
+ return UpdateSessionSolveCaptchasResponse(**response.data)
266
+
216
267
  def _warn_update_profile_params_boolean_deprecated(self) -> None:
217
268
  if SessionManager._has_warned_update_profile_params_boolean_deprecated:
218
269
  return
@@ -18,6 +18,7 @@ from hyperbrowser.models import (
18
18
  ComputerActionMouseButton,
19
19
  GetClipboardTextActionParams,
20
20
  PutSelectionTextActionParams,
21
+ ListWindowsActionParams,
21
22
  )
22
23
 
23
24
 
@@ -175,3 +176,11 @@ class ComputerActionManager:
175
176
  text=text, return_screenshot=return_screenshot
176
177
  )
177
178
  return self._execute_request(session, params)
179
+
180
+ def list_windows(
181
+ self,
182
+ session: Union[SessionDetail, str],
183
+ return_screenshot: bool = False,
184
+ ) -> ComputerActionResponse:
185
+ params = ListWindowsActionParams(return_screenshot=return_screenshot)
186
+ return self._execute_request(session, params)
@@ -2,6 +2,8 @@ from typing import List, Optional, Union, IO, overload
2
2
  import warnings
3
3
  from ....models.session import (
4
4
  BasicResponse,
5
+ CaptchaEvaluationParams,
6
+ CaptchaEvaluationResponse,
5
7
  CreateSessionParams,
6
8
  GetSessionDownloadsUrlResponse,
7
9
  GetSessionRecordingUrlResponse,
@@ -16,9 +18,13 @@ from ....models.session import (
16
18
  UpdateSessionProfileParams,
17
19
  UpdateSessionProxyParams,
18
20
  UpdateSessionScreenParams,
21
+ UpdateSessionSolveCaptchasParams,
22
+ UpdateSessionSolveCaptchasResponse,
19
23
  SessionGetParams,
20
24
  )
21
25
 
26
+ CAPTCHA_EVALUATION_REQUEST_TIMEOUT_SECONDS = 185
27
+
22
28
 
23
29
  class SessionEventLogsManager:
24
30
  def __init__(self, client):
@@ -69,6 +75,21 @@ class SessionManager:
69
75
  )
70
76
  return BasicResponse(**response.data)
71
77
 
78
+ def evaluate_captcha(
79
+ self,
80
+ id: str,
81
+ params: Optional[CaptchaEvaluationParams] = None,
82
+ ) -> CaptchaEvaluationResponse:
83
+ params_obj = params or CaptchaEvaluationParams()
84
+ response = self._client.transport.post(
85
+ self._client._build_url(f"/session/{id}/captcha/evaluate"),
86
+ data=params_obj.model_dump(exclude_none=True, by_alias=True),
87
+ timeout=max(
88
+ self._client.timeout, CAPTCHA_EVALUATION_REQUEST_TIMEOUT_SECONDS
89
+ ),
90
+ )
91
+ return CaptchaEvaluationResponse(**response.data)
92
+
72
93
  def list(
73
94
  self, params: SessionListParams = SessionListParams()
74
95
  ) -> SessionListResponse:
@@ -208,6 +229,36 @@ class SessionManager:
208
229
  )
209
230
  return BasicResponse(**response.data)
210
231
 
232
+ def start_captcha_solving(
233
+ self,
234
+ id: str,
235
+ params: Optional[UpdateSessionSolveCaptchasParams] = None,
236
+ ) -> UpdateSessionSolveCaptchasResponse:
237
+ params_obj = params or UpdateSessionSolveCaptchasParams()
238
+ response = self._client.transport.put(
239
+ self._client._build_url(f"/session/{id}/update"),
240
+ data={
241
+ "type": "solveCaptchas",
242
+ "params": {
243
+ "enabled": True,
244
+ **params_obj.model_dump(exclude_none=True, by_alias=True),
245
+ },
246
+ },
247
+ )
248
+ return UpdateSessionSolveCaptchasResponse(**response.data)
249
+
250
+ def stop_captcha_solving(self, id: str) -> UpdateSessionSolveCaptchasResponse:
251
+ response = self._client.transport.put(
252
+ self._client._build_url(f"/session/{id}/update"),
253
+ data={
254
+ "type": "solveCaptchas",
255
+ "params": {
256
+ "enabled": False,
257
+ },
258
+ },
259
+ )
260
+ return UpdateSessionSolveCaptchasResponse(**response.data)
261
+
211
262
  def _warn_update_profile_params_boolean_deprecated(self) -> None:
212
263
  if SessionManager._has_warned_update_profile_params_boolean_deprecated:
213
264
  return
@@ -233,7 +233,10 @@ from .computer_action import (
233
233
  ComputerActionMouseButton,
234
234
  GetClipboardTextActionParams,
235
235
  PutSelectionTextActionParams,
236
+ ListWindowsActionParams,
237
+ ComputerActionWindow,
236
238
  ComputerActionResponseDataClipboardText,
239
+ ComputerActionResponseDataListWindows,
237
240
  ComputerActionResponseData,
238
241
  )
239
242
  from .session import (
@@ -259,10 +262,18 @@ from .session import (
259
262
  SessionLaunchState,
260
263
  UploadFileResponse,
261
264
  ImageCaptchaParam,
265
+ CaptchaSolverType,
266
+ CaptchaEvaluationPageResult,
267
+ CaptchaEvaluationParams,
268
+ CaptchaEvaluationResponse,
269
+ CaptchaEvaluationTarget,
270
+ CaptchaEvaluationType,
262
271
  UpdateSessionProfileParams,
263
272
  UpdateSessionProxyLocationParams,
264
273
  UpdateSessionProxyParams,
265
274
  UpdateSessionScreenParams,
275
+ UpdateSessionSolveCaptchasParams,
276
+ UpdateSessionSolveCaptchasResponse,
266
277
  )
267
278
  from .sandbox import (
268
279
  SandboxStatus,
@@ -521,10 +532,18 @@ __all__ = [
521
532
  "SessionLaunchState",
522
533
  "UploadFileResponse",
523
534
  "ImageCaptchaParam",
535
+ "CaptchaSolverType",
536
+ "CaptchaEvaluationPageResult",
537
+ "CaptchaEvaluationParams",
538
+ "CaptchaEvaluationResponse",
539
+ "CaptchaEvaluationTarget",
540
+ "CaptchaEvaluationType",
524
541
  "UpdateSessionProfileParams",
525
542
  "UpdateSessionProxyLocationParams",
526
543
  "UpdateSessionProxyParams",
527
544
  "UpdateSessionScreenParams",
545
+ "UpdateSessionSolveCaptchasParams",
546
+ "UpdateSessionSolveCaptchasResponse",
528
547
  # sandbox
529
548
  "SandboxStatus",
530
549
  "SandboxRegion",
@@ -548,6 +567,7 @@ __all__ = [
548
567
  "SandboxMemorySnapshotResult",
549
568
  "SandboxExposeParams",
550
569
  "SandboxExposeResult",
570
+ "SandboxUnexposeResult",
551
571
  "SandboxProcessStatus",
552
572
  "SandboxExecParams",
553
573
  "SandboxProcessSummary",
@@ -628,7 +648,10 @@ __all__ = [
628
648
  "ComputerActionMouseButton",
629
649
  "GetClipboardTextActionParams",
630
650
  "PutSelectionTextActionParams",
651
+ "ListWindowsActionParams",
652
+ "ComputerActionWindow",
631
653
  "ComputerActionResponseDataClipboardText",
654
+ "ComputerActionResponseDataListWindows",
632
655
  "ComputerActionResponseData",
633
656
  # web
634
657
  "StartBatchFetchJobParams",
@@ -18,6 +18,7 @@ class ComputerAction(str, Enum):
18
18
  TYPE_TEXT = "type_text"
19
19
  GET_CLIPBOARD_TEXT = "get_clipboard_text"
20
20
  PUT_SELECTION_TEXT = "put_selection_text"
21
+ LIST_WINDOWS = "list_windows"
21
22
 
22
23
 
23
24
  ComputerActionMouseButton = Literal[
@@ -183,6 +184,17 @@ class PutSelectionTextActionParams(BaseModel):
183
184
  )
184
185
 
185
186
 
187
+ class ListWindowsActionParams(BaseModel):
188
+ """Parameters for list windows action."""
189
+
190
+ model_config = ConfigDict(use_enum_values=True)
191
+
192
+ action: Literal[ComputerAction.LIST_WINDOWS] = ComputerAction.LIST_WINDOWS
193
+ return_screenshot: bool = Field(
194
+ serialization_alias="returnScreenshot", default=False
195
+ )
196
+
197
+
186
198
  ComputerActionParams = Union[
187
199
  ClickActionParams,
188
200
  DragActionParams,
@@ -196,6 +208,7 @@ ComputerActionParams = Union[
196
208
  MouseUpActionParams,
197
209
  GetClipboardTextActionParams,
198
210
  PutSelectionTextActionParams,
211
+ ListWindowsActionParams,
199
212
  ]
200
213
 
201
214
 
@@ -207,7 +220,27 @@ class ComputerActionResponseDataClipboardText(BaseModel):
207
220
  clipboard_text: Optional[str] = Field(default=None, alias="clipboardText")
208
221
 
209
222
 
210
- ComputerActionResponseData = Union[ComputerActionResponseDataClipboardText]
223
+ class ComputerActionWindow(BaseModel):
224
+ model_config = ConfigDict(populate_by_alias=True)
225
+
226
+ id: str
227
+ name: str
228
+ active: bool
229
+
230
+
231
+ class ComputerActionResponseDataListWindows(BaseModel):
232
+ """Data for list windows action."""
233
+
234
+ model_config = ConfigDict(populate_by_alias=True)
235
+
236
+ active_window_id: str = Field(default="", alias="activeWindowId")
237
+ windows: List[ComputerActionWindow] = Field(default_factory=list)
238
+
239
+
240
+ ComputerActionResponseData = Union[
241
+ ComputerActionResponseDataListWindows,
242
+ ComputerActionResponseDataClipboardText,
243
+ ]
211
244
 
212
245
 
213
246
  class ComputerActionResponse(BaseModel):
@@ -1,5 +1,5 @@
1
1
  from datetime import datetime
2
- from typing import Any, List, Literal, Optional, Union, Dict
2
+ from typing import Any, Dict, List, Literal, Optional, Union
3
3
 
4
4
  from pydantic import BaseModel, ConfigDict, Field, field_validator
5
5
 
@@ -16,6 +16,16 @@ from hyperbrowser.models.consts import (
16
16
  )
17
17
 
18
18
  SessionStatus = Literal["active", "closed", "error"]
19
+ CaptchaSolverType = Literal["visual"]
20
+ CaptchaEvaluationType = Literal[
21
+ "turnstile",
22
+ "cloudflare-challenge",
23
+ "aliexpress",
24
+ "recaptcha",
25
+ "recaptcha-visual",
26
+ "amazon",
27
+ ]
28
+ CaptchaEvaluationTarget = CaptchaEvaluationType
19
29
 
20
30
 
21
31
  class BasicResponse(BaseModel):
@@ -134,6 +144,7 @@ class SessionLaunchState(BaseModel):
134
144
  )
135
145
  enable_log_capture: Optional[bool] = Field(default=None, alias="enableLogCapture")
136
146
  accept_cookies: Optional[bool] = Field(default=None, alias="acceptCookies")
147
+ solver_type: Optional[CaptchaSolverType] = Field(default=None, alias="solverType")
137
148
  profile: Optional[SessionProfile] = Field(default=None, alias="profile")
138
149
  static_ip_id: Optional[str] = Field(default=None, alias="staticIpId")
139
150
  save_downloads: Optional[bool] = Field(default=None, alias="saveDownloads")
@@ -303,6 +314,75 @@ class ImageCaptchaParam(BaseModel):
303
314
  input_selector: str = Field(serialization_alias="inputSelector")
304
315
 
305
316
 
317
+ class CaptchaEvaluationParams(BaseModel):
318
+ """
319
+ Parameters for manually evaluating captchas in a running session.
320
+ """
321
+
322
+ model_config = ConfigDict(
323
+ populate_by_alias=True,
324
+ )
325
+
326
+ captcha: Optional[CaptchaEvaluationTarget] = Field(default=None)
327
+ captcha_type: Optional[CaptchaEvaluationTarget] = Field(
328
+ default=None, serialization_alias="captchaType"
329
+ )
330
+ text: Optional[CaptchaEvaluationTarget] = Field(default=None)
331
+ iterations: Optional[int] = Field(default=None)
332
+ max_iterations: Optional[int] = Field(
333
+ default=None, serialization_alias="maxIterations"
334
+ )
335
+ solver_type: Optional[CaptchaSolverType] = Field(
336
+ default=None, serialization_alias="solverType"
337
+ )
338
+ image_captcha_params: Optional[List[ImageCaptchaParam]] = Field(
339
+ default=None, serialization_alias="imageCaptchaParams"
340
+ )
341
+ use_gemini_captcha_solver: Optional[bool] = Field(
342
+ default=None, serialization_alias="useGeminiCaptchaSolver"
343
+ )
344
+ use_ultra_stealth: Optional[bool] = Field(
345
+ default=None, serialization_alias="useUltraStealth"
346
+ )
347
+
348
+
349
+ class CaptchaEvaluationPageResult(BaseModel):
350
+ """
351
+ Result of manually evaluating captchas on a single page target.
352
+ """
353
+
354
+ model_config = ConfigDict(
355
+ populate_by_alias=True,
356
+ )
357
+
358
+ url: str = Field(alias="url")
359
+ target_id: Optional[str] = Field(default=None, alias="targetId")
360
+ iterations_run: int = Field(alias="iterationsRun")
361
+ solved: bool = Field(alias="solved")
362
+ solved_captchas: List[CaptchaEvaluationType] = Field(alias="solvedCaptchas")
363
+ checked_captchas: List[CaptchaEvaluationType] = Field(alias="checkedCaptchas")
364
+ captcha_solved_counts: Dict[str, int] = Field(alias="captchaSolvedCounts")
365
+ last_solve_time: Dict[str, float] = Field(alias="lastSolveTime")
366
+
367
+
368
+ class CaptchaEvaluationResponse(BaseModel):
369
+ """
370
+ Response from manually evaluating captchas in a running session.
371
+ """
372
+
373
+ model_config = ConfigDict(
374
+ populate_by_alias=True,
375
+ )
376
+
377
+ success: bool = Field(alias="success")
378
+ captcha: Optional[CaptchaEvaluationType] = Field(default=None, alias="captcha")
379
+ iterations_requested: int = Field(alias="iterationsRequested")
380
+ iterations_run: int = Field(alias="iterationsRun")
381
+ solved: bool = Field(alias="solved")
382
+ solved_captchas: List[CaptchaEvaluationType] = Field(alias="solvedCaptchas")
383
+ pages: List[CaptchaEvaluationPageResult] = Field(alias="pages")
384
+
385
+
306
386
  class CreateSessionParams(BaseModel):
307
387
  """
308
388
  Parameters for creating a new browser session.
@@ -337,6 +417,9 @@ class CreateSessionParams(BaseModel):
337
417
  locales: List[ISO639_1] = Field(default=["en"])
338
418
  screen: Optional[ScreenConfig] = Field(default=None)
339
419
  solve_captchas: bool = Field(default=False, serialization_alias="solveCaptchas")
420
+ solver_type: Optional[CaptchaSolverType] = Field(
421
+ default=None, serialization_alias="solverType"
422
+ )
340
423
  adblock: bool = Field(default=False, serialization_alias="adblock")
341
424
  trackers: bool = Field(default=False, serialization_alias="trackers")
342
425
  annoyances: bool = Field(default=False, serialization_alias="annoyances")
@@ -480,6 +563,35 @@ class UploadFileResponse(BaseModel):
480
563
  original_name: Optional[str] = Field(default=None, alias="originalName")
481
564
 
482
565
 
566
+ class UpdateSessionSolveCaptchasParams(BaseModel):
567
+ """
568
+ Parameters for starting automatic captcha solving in a running session.
569
+ """
570
+
571
+ model_config = ConfigDict(
572
+ populate_by_alias=True,
573
+ )
574
+
575
+ solver_type: Optional[CaptchaSolverType] = Field(
576
+ default=None,
577
+ serialization_alias="solverType",
578
+ )
579
+
580
+
581
+ class UpdateSessionSolveCaptchasResponse(BasicResponse):
582
+ """
583
+ Response from updating automatic captcha solving in a running session.
584
+ """
585
+
586
+ model_config = ConfigDict(
587
+ populate_by_alias=True,
588
+ )
589
+
590
+ solve_captchas: Optional[bool] = Field(default=None, alias="solveCaptchas")
591
+ session_id: Optional[str] = Field(default=None, alias="sessionId")
592
+ telemetry_ready: Optional[bool] = Field(default=None, alias="telemetryReady")
593
+
594
+
483
595
  class SessionEventLog(BaseModel):
484
596
  model_config = ConfigDict(
485
597
  populate_by_alias=True,
@@ -55,7 +55,7 @@ class AsyncTransport(TransportStrategy):
55
55
  try:
56
56
  error_data = response.json()
57
57
  message = error_data.get("message") or error_data.get("error") or str(e)
58
- except:
58
+ except Exception:
59
59
  message = str(e)
60
60
  raise HyperbrowserError(
61
61
  message,
@@ -67,13 +67,20 @@ class AsyncTransport(TransportStrategy):
67
67
  raise HyperbrowserError("Request failed", original_error=e)
68
68
 
69
69
  async def post(
70
- self, url: str, data: Optional[dict] = None, files: Optional[dict] = None
70
+ self,
71
+ url: str,
72
+ data: Optional[dict] = None,
73
+ files: Optional[dict] = None,
74
+ timeout: Optional[float] = None,
71
75
  ) -> APIResponse:
72
76
  try:
77
+ kwargs = {}
78
+ if timeout is not None:
79
+ kwargs["timeout"] = timeout
73
80
  if files:
74
- response = await self.client.post(url, data=data, files=files)
81
+ response = await self.client.post(url, data=data, files=files, **kwargs)
75
82
  else:
76
- response = await self.client.post(url, json=data)
83
+ response = await self.client.post(url, json=data, **kwargs)
77
84
  return await self._handle_response(response)
78
85
  except HyperbrowserError:
79
86
  raise
@@ -45,7 +45,13 @@ class TransportStrategy(ABC):
45
45
  pass
46
46
 
47
47
  @abstractmethod
48
- def post(self, url: str) -> APIResponse:
48
+ def post(
49
+ self,
50
+ url: str,
51
+ data: Optional[dict] = None,
52
+ files: Optional[dict] = None,
53
+ timeout: Optional[float] = None,
54
+ ) -> APIResponse:
49
55
  pass
50
56
 
51
57
  @abstractmethod
@@ -31,7 +31,7 @@ class SyncTransport(TransportStrategy):
31
31
  try:
32
32
  error_data = response.json()
33
33
  message = error_data.get("message") or error_data.get("error") or str(e)
34
- except:
34
+ except Exception:
35
35
  message = str(e)
36
36
  raise HyperbrowserError(
37
37
  message,
@@ -46,13 +46,20 @@ class SyncTransport(TransportStrategy):
46
46
  self.client.close()
47
47
 
48
48
  def post(
49
- self, url: str, data: Optional[dict] = None, files: Optional[dict] = None
49
+ self,
50
+ url: str,
51
+ data: Optional[dict] = None,
52
+ files: Optional[dict] = None,
53
+ timeout: Optional[float] = None,
50
54
  ) -> APIResponse:
51
55
  try:
56
+ kwargs = {}
57
+ if timeout is not None:
58
+ kwargs["timeout"] = timeout
52
59
  if files:
53
- response = self.client.post(url, data=data, files=files)
60
+ response = self.client.post(url, data=data, files=files, **kwargs)
54
61
  else:
55
- response = self.client.post(url, json=data)
62
+ response = self.client.post(url, json=data, **kwargs)
56
63
  return self._handle_response(response)
57
64
  except HyperbrowserError:
58
65
  raise
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "hyperbrowser"
3
- version = "0.90.7"
3
+ version = "0.91.0"
4
4
  description = "Python SDK for hyperbrowser"
5
5
  authors = ["Nikhil Shahi <nshahi1998@gmail.com>"]
6
6
  license = "MIT"
File without changes