hyperbrowser 0.90.8__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.8 → hyperbrowser-0.91.0}/PKG-INFO +7 -1
  2. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/README.md +6 -0
  3. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/session.py +51 -0
  4. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/session.py +51 -0
  5. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/models/__init__.py +17 -0
  6. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/models/session.py +113 -1
  7. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/transport/async_transport.py +11 -4
  8. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/transport/base.py +7 -1
  9. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/transport/sync.py +11 -4
  10. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/pyproject.toml +1 -1
  11. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/LICENSE +0 -0
  12. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/__init__.py +0 -0
  13. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/async_client.py +0 -0
  14. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/base.py +0 -0
  15. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/agents/__init__.py +0 -0
  16. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/agents/browser_use.py +0 -0
  17. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/agents/claude_computer_use.py +0 -0
  18. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/agents/cua.py +0 -0
  19. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/agents/gemini_computer_use.py +0 -0
  20. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/agents/hyper_agent.py +0 -0
  21. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/computer_action.py +0 -0
  22. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/crawl.py +0 -0
  23. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/extension.py +0 -0
  24. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/extract.py +0 -0
  25. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/profile.py +0 -0
  26. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/sandbox.py +0 -0
  27. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/sandboxes/__init__.py +0 -0
  28. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/sandboxes/sandbox_files.py +0 -0
  29. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/sandboxes/sandbox_processes.py +0 -0
  30. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/sandboxes/sandbox_terminal.py +0 -0
  31. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/sandboxes/sandbox_transport.py +0 -0
  32. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/scrape.py +0 -0
  33. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/team.py +0 -0
  34. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/volume.py +0 -0
  35. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/web/__init__.py +0 -0
  36. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/web/batch_fetch.py +0 -0
  37. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/async_manager/web/crawl.py +0 -0
  38. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sandboxes/__init__.py +0 -0
  39. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sandboxes/shared.py +0 -0
  40. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/agents/__init__.py +0 -0
  41. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/agents/browser_use.py +0 -0
  42. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/agents/claude_computer_use.py +0 -0
  43. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/agents/cua.py +0 -0
  44. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/agents/gemini_computer_use.py +0 -0
  45. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/agents/hyper_agent.py +0 -0
  46. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/computer_action.py +0 -0
  47. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/crawl.py +0 -0
  48. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/extension.py +0 -0
  49. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/extract.py +0 -0
  50. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/profile.py +0 -0
  51. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/sandbox.py +0 -0
  52. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/sandboxes/__init__.py +0 -0
  53. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/sandboxes/sandbox_files.py +0 -0
  54. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/sandboxes/sandbox_processes.py +0 -0
  55. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/sandboxes/sandbox_terminal.py +0 -0
  56. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/sandboxes/sandbox_transport.py +0 -0
  57. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/scrape.py +0 -0
  58. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/team.py +0 -0
  59. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/volume.py +0 -0
  60. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/web/__init__.py +0 -0
  61. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/web/batch_fetch.py +0 -0
  62. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/managers/sync_manager/web/crawl.py +0 -0
  63. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/client/sync.py +0 -0
  64. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/config.py +0 -0
  65. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/exceptions.py +0 -0
  66. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/models/_parsers.py +0 -0
  67. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/models/agents/browser_use.py +0 -0
  68. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/models/agents/claude_computer_use.py +0 -0
  69. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/models/agents/cua.py +0 -0
  70. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/models/agents/gemini_computer_use.py +0 -0
  71. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/models/agents/hyper_agent.py +0 -0
  72. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/models/computer_action.py +0 -0
  73. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/models/consts.py +0 -0
  74. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/models/crawl.py +0 -0
  75. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/models/extension.py +0 -0
  76. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/models/extract.py +0 -0
  77. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/models/profile.py +0 -0
  78. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/models/sandbox.py +0 -0
  79. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/models/scrape.py +0 -0
  80. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/models/team.py +0 -0
  81. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/models/volume.py +0 -0
  82. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/models/web/batch_fetch.py +0 -0
  83. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/models/web/branding.py +0 -0
  84. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/models/web/common.py +0 -0
  85. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/models/web/crawl.py +0 -0
  86. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/models/web/fetch.py +0 -0
  87. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/models/web/search.py +0 -0
  88. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/sandbox_common.py +0 -0
  89. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/tools/__init__.py +0 -0
  90. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/tools/anthropic.py +0 -0
  91. {hyperbrowser-0.90.8 → hyperbrowser-0.91.0}/hyperbrowser/tools/openai.py +0 -0
  92. {hyperbrowser-0.90.8 → 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.8
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
@@ -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
@@ -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
@@ -262,10 +262,18 @@ from .session import (
262
262
  SessionLaunchState,
263
263
  UploadFileResponse,
264
264
  ImageCaptchaParam,
265
+ CaptchaSolverType,
266
+ CaptchaEvaluationPageResult,
267
+ CaptchaEvaluationParams,
268
+ CaptchaEvaluationResponse,
269
+ CaptchaEvaluationTarget,
270
+ CaptchaEvaluationType,
265
271
  UpdateSessionProfileParams,
266
272
  UpdateSessionProxyLocationParams,
267
273
  UpdateSessionProxyParams,
268
274
  UpdateSessionScreenParams,
275
+ UpdateSessionSolveCaptchasParams,
276
+ UpdateSessionSolveCaptchasResponse,
269
277
  )
270
278
  from .sandbox import (
271
279
  SandboxStatus,
@@ -524,10 +532,18 @@ __all__ = [
524
532
  "SessionLaunchState",
525
533
  "UploadFileResponse",
526
534
  "ImageCaptchaParam",
535
+ "CaptchaSolverType",
536
+ "CaptchaEvaluationPageResult",
537
+ "CaptchaEvaluationParams",
538
+ "CaptchaEvaluationResponse",
539
+ "CaptchaEvaluationTarget",
540
+ "CaptchaEvaluationType",
527
541
  "UpdateSessionProfileParams",
528
542
  "UpdateSessionProxyLocationParams",
529
543
  "UpdateSessionProxyParams",
530
544
  "UpdateSessionScreenParams",
545
+ "UpdateSessionSolveCaptchasParams",
546
+ "UpdateSessionSolveCaptchasResponse",
531
547
  # sandbox
532
548
  "SandboxStatus",
533
549
  "SandboxRegion",
@@ -551,6 +567,7 @@ __all__ = [
551
567
  "SandboxMemorySnapshotResult",
552
568
  "SandboxExposeParams",
553
569
  "SandboxExposeResult",
570
+ "SandboxUnexposeResult",
554
571
  "SandboxProcessStatus",
555
572
  "SandboxExecParams",
556
573
  "SandboxProcessSummary",
@@ -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.8"
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