hyperbrowser 0.93.4__tar.gz → 1.0.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 (114) hide show
  1. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/PKG-INFO +106 -71
  2. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/README.md +104 -70
  3. hyperbrowser-1.0.0/hyperbrowser/client/_request.py +124 -0
  4. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/agents/browser_use.py +18 -11
  5. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/agents/claude_computer_use.py +16 -3
  6. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/agents/cua.py +12 -3
  7. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/agents/gemini_computer_use.py +16 -3
  8. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/agents/grok_computer_use.py +16 -3
  9. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/agents/hyper_agent.py +10 -3
  10. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/computer_action.py +57 -8
  11. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/crawl.py +20 -5
  12. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/extension.py +16 -13
  13. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/extract.py +22 -10
  14. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/profile.py +22 -14
  15. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/sandbox.py +97 -60
  16. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/sandboxes/sandbox_files.py +89 -59
  17. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/sandboxes/sandbox_processes.py +21 -8
  18. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/sandboxes/sandbox_terminal.py +13 -8
  19. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/scrape.py +30 -9
  20. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/session.py +80 -30
  21. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/volume.py +9 -5
  22. hyperbrowser-1.0.0/hyperbrowser/client/managers/async_manager/web/__init__.py +43 -0
  23. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/web/batch_fetch.py +26 -19
  24. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/web/crawl.py +26 -19
  25. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sandboxes/shared.py +22 -16
  26. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/agents/browser_use.py +20 -11
  27. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/agents/claude_computer_use.py +16 -3
  28. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/agents/cua.py +12 -3
  29. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/agents/gemini_computer_use.py +16 -3
  30. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/agents/grok_computer_use.py +16 -3
  31. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/agents/hyper_agent.py +12 -3
  32. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/computer_action.py +57 -8
  33. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/crawl.py +20 -6
  34. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/extension.py +16 -13
  35. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/extract.py +22 -10
  36. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/profile.py +24 -14
  37. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/sandbox.py +97 -60
  38. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/sandboxes/sandbox_files.py +89 -59
  39. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/sandboxes/sandbox_processes.py +21 -8
  40. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/sandboxes/sandbox_terminal.py +13 -8
  41. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/scrape.py +32 -9
  42. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/session.py +79 -28
  43. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/volume.py +9 -5
  44. hyperbrowser-1.0.0/hyperbrowser/client/managers/sync_manager/web/__init__.py +43 -0
  45. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/web/batch_fetch.py +28 -19
  46. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/web/crawl.py +26 -19
  47. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/agents/browser_use.py +18 -12
  48. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/agents/claude_computer_use.py +5 -3
  49. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/agents/cua.py +5 -3
  50. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/agents/gemini_computer_use.py +6 -3
  51. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/agents/grok_computer_use.py +5 -3
  52. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/agents/hyper_agent.py +3 -1
  53. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/crawl.py +4 -2
  54. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/extension.py +1 -1
  55. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/scrape.py +7 -5
  56. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/web/branding.py +5 -5
  57. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/web/common.py +6 -6
  58. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/web/fetch.py +2 -2
  59. hyperbrowser-1.0.0/hyperbrowser/py.typed +1 -0
  60. hyperbrowser-1.0.0/hyperbrowser/tools/__init__.py +145 -0
  61. hyperbrowser-1.0.0/hyperbrowser/types/__init__.py +309 -0
  62. hyperbrowser-1.0.0/hyperbrowser/types/_json.py +33 -0
  63. hyperbrowser-1.0.0/hyperbrowser/types/agents.py +177 -0
  64. hyperbrowser-1.0.0/hyperbrowser/types/computer_action.py +160 -0
  65. hyperbrowser-1.0.0/hyperbrowser/types/crawl.py +29 -0
  66. hyperbrowser-1.0.0/hyperbrowser/types/extension.py +13 -0
  67. hyperbrowser-1.0.0/hyperbrowser/types/extract.py +32 -0
  68. hyperbrowser-1.0.0/hyperbrowser/types/profile.py +26 -0
  69. hyperbrowser-1.0.0/hyperbrowser/types/sandbox.py +438 -0
  70. hyperbrowser-1.0.0/hyperbrowser/types/scrape.py +76 -0
  71. hyperbrowser-1.0.0/hyperbrowser/types/session.py +206 -0
  72. hyperbrowser-1.0.0/hyperbrowser/types/volume.py +10 -0
  73. hyperbrowser-1.0.0/hyperbrowser/types/web.py +246 -0
  74. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/pyproject.toml +6 -2
  75. hyperbrowser-0.93.4/hyperbrowser/client/managers/async_manager/web/__init__.py +0 -41
  76. hyperbrowser-0.93.4/hyperbrowser/client/managers/sync_manager/web/__init__.py +0 -41
  77. hyperbrowser-0.93.4/hyperbrowser/tools/__init__.py +0 -127
  78. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/LICENSE +0 -0
  79. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/__init__.py +0 -0
  80. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/async_client.py +0 -0
  81. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/base.py +0 -0
  82. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/agents/__init__.py +0 -0
  83. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/sandboxes/__init__.py +0 -0
  84. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/sandboxes/sandbox_transport.py +0 -0
  85. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/team.py +0 -0
  86. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sandboxes/__init__.py +0 -0
  87. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sandboxes/image_build.py +0 -0
  88. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/agents/__init__.py +0 -0
  89. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/sandboxes/__init__.py +0 -0
  90. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/sandboxes/sandbox_transport.py +0 -0
  91. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/team.py +0 -0
  92. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/sync.py +0 -0
  93. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/config.py +0 -0
  94. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/exceptions.py +0 -0
  95. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/__init__.py +0 -0
  96. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/_parsers.py +0 -0
  97. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/computer_action.py +0 -0
  98. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/consts.py +0 -0
  99. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/extract.py +0 -0
  100. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/profile.py +0 -0
  101. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/sandbox.py +0 -0
  102. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/session.py +0 -0
  103. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/team.py +0 -0
  104. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/volume.py +0 -0
  105. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/web/batch_fetch.py +0 -0
  106. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/web/crawl.py +0 -0
  107. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/web/search.py +0 -0
  108. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/sandbox_common.py +0 -0
  109. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/tools/anthropic.py +0 -0
  110. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/tools/openai.py +0 -0
  111. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/tools/schema.py +0 -0
  112. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/transport/async_transport.py +0 -0
  113. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/transport/base.py +0 -0
  114. {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/transport/sync.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hyperbrowser
3
- Version: 0.93.4
3
+ Version: 1.0.0
4
4
  Summary: Python SDK for hyperbrowser
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -19,6 +19,7 @@ Classifier: Programming Language :: Python :: 3.14
19
19
  Requires-Dist: httpx (>=0.23.0,<1)
20
20
  Requires-Dist: jsonref (>=1.1.0)
21
21
  Requires-Dist: pydantic (>=2.0,<3)
22
+ Requires-Dist: typing-extensions (>=4.0,<5)
22
23
  Requires-Dist: websockets (>=13,<16)
23
24
  Project-URL: Homepage, https://github.com/hyperbrowserai/python-sdk
24
25
  Project-URL: Repository, https://github.com/hyperbrowserai/python-sdk
@@ -41,6 +42,12 @@ It can be installed from `pypi` by running :
41
42
  pip install hyperbrowser
42
43
  ```
43
44
 
45
+ The browser-control examples below also use Playwright:
46
+
47
+ ```shell
48
+ pip install playwright
49
+ ```
50
+
44
51
  ## Configuration
45
52
 
46
53
  Both the sync and async client follow similar configuration params
@@ -56,12 +63,59 @@ Profile names must match `^[A-Za-z0-9._-]+$`.
56
63
 
57
64
  ## Usage
58
65
 
66
+ Hyperbrowser 1.0 accepts plain dictionaries for request parameters. Method
67
+ signatures use `TypedDict` definitions, so editors can autocomplete keys at
68
+ every nested level:
69
+
70
+ ```python
71
+ from hyperbrowser import Hyperbrowser
72
+
73
+ client = Hyperbrowser(api_key="test-key")
74
+
75
+ # Preferred in 1.0: autocomplete works directly in the dictionary.
76
+ session = client.sessions.create(
77
+ {
78
+ "use_stealth": True,
79
+ "screen": {"width": 1920, "height": 1080},
80
+ }
81
+ )
82
+ ```
83
+
84
+ Existing Pydantic request classes remain accepted, so upgrading does not require
85
+ an immediate rewrite:
86
+
87
+ ```python
88
+ from hyperbrowser.models import CreateSessionParams, ScreenConfig
89
+
90
+ session = client.sessions.create(
91
+ CreateSessionParams(
92
+ use_stealth=True,
93
+ screen=ScreenConfig(width=1920, height=1080),
94
+ )
95
+ )
96
+ ```
97
+
98
+ Import request annotations from `hyperbrowser.types` when a named variable is
99
+ useful. The same names under `hyperbrowser.models` refer to the legacy Pydantic
100
+ request classes. Responses remain Pydantic models.
101
+
102
+ JSON Schema fields accept raw schema values, including object schemas with
103
+ `$defs`, `$ref`, or custom keywords, and boolean schemas where the API supports
104
+ them. Those schemas and other user-owned mappings are preserved as data; only
105
+ SDK-owned request keys are translated to their API aliases. Schema fields
106
+ documented as accepting a model class can also generate a schema from a Pydantic
107
+ model.
108
+
109
+ See the
110
+ [Hyperbrowser Python SDK 1.0 migration guide](https://hyperbrowser.ai/docs/sdks/python-1-0-migration)
111
+ for the complete compatibility details and migration checklist.
112
+
59
113
  ### Async
60
114
 
61
115
  ```python
62
116
  import asyncio
63
- from pyppeteer import connect
64
117
  from hyperbrowser import AsyncHyperbrowser
118
+ from playwright.async_api import async_playwright
65
119
 
66
120
  HYPERBROWSER_API_KEY = "test-key"
67
121
 
@@ -69,29 +123,22 @@ async def main():
69
123
  async with AsyncHyperbrowser(api_key=HYPERBROWSER_API_KEY) as client:
70
124
  session = await client.sessions.create()
71
125
 
72
- ws_endpoint = session.ws_endpoint
73
- browser = await connect(browserWSEndpoint=ws_endpoint, defaultViewport=None)
126
+ try:
127
+ async with async_playwright() as playwright:
128
+ browser = await playwright.chromium.connect_over_cdp(
129
+ session.ws_endpoint
130
+ )
131
+ context = browser.contexts[0]
132
+ page = context.pages[0]
74
133
 
75
- # Get pages
76
- pages = await browser.pages()
77
- if not pages:
78
- raise Exception("No pages available")
79
-
80
- page = pages[0]
81
-
82
- # Navigate to a website
83
- print("Navigating to Hacker News...")
84
- await page.goto("https://news.ycombinator.com/")
85
- page_title = await page.title()
86
- print("Page title:", page_title)
87
-
88
- await page.close()
89
- await browser.disconnect()
90
- await client.sessions.stop(session.id)
91
- print("Session completed!")
134
+ print("Navigating to Hacker News...")
135
+ await page.goto("https://news.ycombinator.com/")
136
+ print("Page title:", await page.title())
137
+ finally:
138
+ await client.sessions.stop(session.id)
92
139
 
93
140
  # Run the asyncio event loop
94
- asyncio.get_event_loop().run_until_complete(main())
141
+ asyncio.run(main())
95
142
  ```
96
143
  ### Sync
97
144
 
@@ -141,17 +188,16 @@ The sync and async clients expose the same sandbox APIs through `client.sandboxe
141
188
 
142
189
  ```python
143
190
  from hyperbrowser import Hyperbrowser
144
- from hyperbrowser.models import CreateSandboxParams, SandboxExposeParams
145
191
 
146
192
  client = Hyperbrowser(api_key="test-key")
147
193
  sandbox = client.sandboxes.create(
148
- CreateSandboxParams(
149
- image_name="node",
150
- cpu=4,
151
- memory_mib=4096,
152
- disk_mib=8192,
153
- exposed_ports=[SandboxExposeParams(port=3000, auth=True)],
154
- )
194
+ {
195
+ "image_name": "node",
196
+ "cpu": 2,
197
+ "memory_mib": 2048,
198
+ "disk_mib": 8192,
199
+ "exposed_ports": [{"port": 3000, "auth": True}],
200
+ }
155
201
  )
156
202
 
157
203
  print(sandbox.exposed_ports[0].browser_url)
@@ -166,25 +212,24 @@ client.close()
166
212
 
167
213
  ```python
168
214
  from hyperbrowser import Hyperbrowser
169
- from hyperbrowser.models import CreateSandboxParams, CreateVolumeParams, SandboxVolumeMount
170
215
 
171
216
  client = Hyperbrowser(api_key="test-key")
172
217
 
173
- volume = client.volumes.create(CreateVolumeParams(name="project-cache"))
218
+ volume = client.volumes.create({"name": "project-cache"})
174
219
  all_volumes = client.volumes.list()
175
220
  same_volume = client.volumes.get(volume.id)
176
221
 
177
222
  sandbox = client.sandboxes.create(
178
- CreateSandboxParams(
179
- image_name="node",
180
- mounts={
181
- "/workspace/cache": SandboxVolumeMount(
182
- id=same_volume.id,
183
- type="rw",
184
- shared=True,
185
- )
223
+ {
224
+ "image_name": "node",
225
+ "mounts": {
226
+ "/workspace/cache": {
227
+ "id": same_volume.id,
228
+ "type": "rw",
229
+ "shared": True,
230
+ }
186
231
  },
187
- )
232
+ }
188
233
  )
189
234
 
190
235
  sandbox.stop()
@@ -195,17 +240,16 @@ client.close()
195
240
 
196
241
  ```python
197
242
  from hyperbrowser import Hyperbrowser
198
- from hyperbrowser.models import SandboxListParams
199
243
 
200
244
  client = Hyperbrowser(api_key="test-key")
201
245
  result = client.sandboxes.list(
202
- SandboxListParams(
203
- status="active",
204
- search="sandbox",
205
- start=1711929600000,
206
- end=1712016000000,
207
- limit=20,
208
- )
246
+ {
247
+ "status": "active",
248
+ "search": "sandbox",
249
+ "start": 1711929600000,
250
+ "end": 1712016000000,
251
+ "limit": 20,
252
+ }
209
253
  )
210
254
 
211
255
  for sandbox in result.sandboxes:
@@ -216,11 +260,10 @@ for sandbox in result.sandboxes:
216
260
 
217
261
  ```python
218
262
  from hyperbrowser import Hyperbrowser
219
- from hyperbrowser.models import SandboxSnapshotListParams
220
263
 
221
264
  client = Hyperbrowser(api_key="test-key")
222
265
  snapshots = client.sandboxes.list_snapshots(
223
- SandboxSnapshotListParams(image_name="node", status="created", limit=10)
266
+ {"image_name": "node", "status": "created", "limit": 10}
224
267
  )
225
268
  ```
226
269
 
@@ -228,16 +271,13 @@ snapshots = client.sandboxes.list_snapshots(
228
271
 
229
272
  ```python
230
273
  from hyperbrowser import Hyperbrowser
231
- from hyperbrowser.models import CreateSandboxParams, SandboxExposeParams
232
274
 
233
275
  client = Hyperbrowser(api_key="test-key")
234
276
  sandbox = client.sandboxes.create(
235
- CreateSandboxParams(
236
- image_name="node", cpu=2, memory_mib=2048, disk_mib=8192
237
- )
277
+ {"image_name": "node", "cpu": 2, "memory_mib": 2048, "disk_mib": 8192}
238
278
  )
239
279
 
240
- result = sandbox.expose(SandboxExposeParams(port=8080, auth=True))
280
+ result = sandbox.expose({"port": 8080, "auth": True})
241
281
  print(result.url, result.browser_url)
242
282
 
243
283
  sandbox.unexpose(8080)
@@ -247,23 +287,19 @@ sandbox.unexpose(8080)
247
287
 
248
288
  ```python
249
289
  from hyperbrowser import Hyperbrowser
250
- from hyperbrowser.models import CreateSandboxParams, SandboxFileWriteEntry
251
290
 
252
291
  client = Hyperbrowser(api_key="test-key")
253
- sandbox = client.sandboxes.create(CreateSandboxParams(image_name="node"))
292
+ sandbox = client.sandboxes.create({"image_name": "node"})
254
293
 
255
294
  sandbox.files.write(
256
295
  [
257
- SandboxFileWriteEntry(
258
- path="/tmp/config.json",
259
- data='{"debug":true}\n',
260
- append=True,
261
- mode="600",
262
- ),
263
- SandboxFileWriteEntry(
264
- path="/tmp/blob.bin",
265
- data=b"\x00\x01\x02",
266
- ),
296
+ {
297
+ "path": "/tmp/config.json",
298
+ "data": '{"debug":true}\n',
299
+ "append": True,
300
+ "mode": "600",
301
+ },
302
+ {"path": "/tmp/blob.bin", "data": b"\x00\x01\x02"},
267
303
  ]
268
304
  )
269
305
  ```
@@ -272,11 +308,10 @@ sandbox.files.write(
272
308
 
273
309
  ```python
274
310
  from hyperbrowser import Hyperbrowser
275
- from hyperbrowser.models import CreateSandboxParams, SandboxTerminalCreateParams
276
311
 
277
312
  client = Hyperbrowser(api_key="test-key")
278
- sandbox = client.sandboxes.create(CreateSandboxParams(image_name="node"))
279
- terminal = sandbox.terminal.create(SandboxTerminalCreateParams(command="bash"))
313
+ sandbox = client.sandboxes.create({"image_name": "node"})
314
+ terminal = sandbox.terminal.create({"command": "bash"})
280
315
 
281
316
  connection = terminal.attach(cursor=10)
282
317
  for event in connection.events():
@@ -15,6 +15,12 @@ It can be installed from `pypi` by running :
15
15
  pip install hyperbrowser
16
16
  ```
17
17
 
18
+ The browser-control examples below also use Playwright:
19
+
20
+ ```shell
21
+ pip install playwright
22
+ ```
23
+
18
24
  ## Configuration
19
25
 
20
26
  Both the sync and async client follow similar configuration params
@@ -30,12 +36,59 @@ Profile names must match `^[A-Za-z0-9._-]+$`.
30
36
 
31
37
  ## Usage
32
38
 
39
+ Hyperbrowser 1.0 accepts plain dictionaries for request parameters. Method
40
+ signatures use `TypedDict` definitions, so editors can autocomplete keys at
41
+ every nested level:
42
+
43
+ ```python
44
+ from hyperbrowser import Hyperbrowser
45
+
46
+ client = Hyperbrowser(api_key="test-key")
47
+
48
+ # Preferred in 1.0: autocomplete works directly in the dictionary.
49
+ session = client.sessions.create(
50
+ {
51
+ "use_stealth": True,
52
+ "screen": {"width": 1920, "height": 1080},
53
+ }
54
+ )
55
+ ```
56
+
57
+ Existing Pydantic request classes remain accepted, so upgrading does not require
58
+ an immediate rewrite:
59
+
60
+ ```python
61
+ from hyperbrowser.models import CreateSessionParams, ScreenConfig
62
+
63
+ session = client.sessions.create(
64
+ CreateSessionParams(
65
+ use_stealth=True,
66
+ screen=ScreenConfig(width=1920, height=1080),
67
+ )
68
+ )
69
+ ```
70
+
71
+ Import request annotations from `hyperbrowser.types` when a named variable is
72
+ useful. The same names under `hyperbrowser.models` refer to the legacy Pydantic
73
+ request classes. Responses remain Pydantic models.
74
+
75
+ JSON Schema fields accept raw schema values, including object schemas with
76
+ `$defs`, `$ref`, or custom keywords, and boolean schemas where the API supports
77
+ them. Those schemas and other user-owned mappings are preserved as data; only
78
+ SDK-owned request keys are translated to their API aliases. Schema fields
79
+ documented as accepting a model class can also generate a schema from a Pydantic
80
+ model.
81
+
82
+ See the
83
+ [Hyperbrowser Python SDK 1.0 migration guide](https://hyperbrowser.ai/docs/sdks/python-1-0-migration)
84
+ for the complete compatibility details and migration checklist.
85
+
33
86
  ### Async
34
87
 
35
88
  ```python
36
89
  import asyncio
37
- from pyppeteer import connect
38
90
  from hyperbrowser import AsyncHyperbrowser
91
+ from playwright.async_api import async_playwright
39
92
 
40
93
  HYPERBROWSER_API_KEY = "test-key"
41
94
 
@@ -43,29 +96,22 @@ async def main():
43
96
  async with AsyncHyperbrowser(api_key=HYPERBROWSER_API_KEY) as client:
44
97
  session = await client.sessions.create()
45
98
 
46
- ws_endpoint = session.ws_endpoint
47
- browser = await connect(browserWSEndpoint=ws_endpoint, defaultViewport=None)
99
+ try:
100
+ async with async_playwright() as playwright:
101
+ browser = await playwright.chromium.connect_over_cdp(
102
+ session.ws_endpoint
103
+ )
104
+ context = browser.contexts[0]
105
+ page = context.pages[0]
48
106
 
49
- # Get pages
50
- pages = await browser.pages()
51
- if not pages:
52
- raise Exception("No pages available")
53
-
54
- page = pages[0]
55
-
56
- # Navigate to a website
57
- print("Navigating to Hacker News...")
58
- await page.goto("https://news.ycombinator.com/")
59
- page_title = await page.title()
60
- print("Page title:", page_title)
61
-
62
- await page.close()
63
- await browser.disconnect()
64
- await client.sessions.stop(session.id)
65
- print("Session completed!")
107
+ print("Navigating to Hacker News...")
108
+ await page.goto("https://news.ycombinator.com/")
109
+ print("Page title:", await page.title())
110
+ finally:
111
+ await client.sessions.stop(session.id)
66
112
 
67
113
  # Run the asyncio event loop
68
- asyncio.get_event_loop().run_until_complete(main())
114
+ asyncio.run(main())
69
115
  ```
70
116
  ### Sync
71
117
 
@@ -115,17 +161,16 @@ The sync and async clients expose the same sandbox APIs through `client.sandboxe
115
161
 
116
162
  ```python
117
163
  from hyperbrowser import Hyperbrowser
118
- from hyperbrowser.models import CreateSandboxParams, SandboxExposeParams
119
164
 
120
165
  client = Hyperbrowser(api_key="test-key")
121
166
  sandbox = client.sandboxes.create(
122
- CreateSandboxParams(
123
- image_name="node",
124
- cpu=4,
125
- memory_mib=4096,
126
- disk_mib=8192,
127
- exposed_ports=[SandboxExposeParams(port=3000, auth=True)],
128
- )
167
+ {
168
+ "image_name": "node",
169
+ "cpu": 2,
170
+ "memory_mib": 2048,
171
+ "disk_mib": 8192,
172
+ "exposed_ports": [{"port": 3000, "auth": True}],
173
+ }
129
174
  )
130
175
 
131
176
  print(sandbox.exposed_ports[0].browser_url)
@@ -140,25 +185,24 @@ client.close()
140
185
 
141
186
  ```python
142
187
  from hyperbrowser import Hyperbrowser
143
- from hyperbrowser.models import CreateSandboxParams, CreateVolumeParams, SandboxVolumeMount
144
188
 
145
189
  client = Hyperbrowser(api_key="test-key")
146
190
 
147
- volume = client.volumes.create(CreateVolumeParams(name="project-cache"))
191
+ volume = client.volumes.create({"name": "project-cache"})
148
192
  all_volumes = client.volumes.list()
149
193
  same_volume = client.volumes.get(volume.id)
150
194
 
151
195
  sandbox = client.sandboxes.create(
152
- CreateSandboxParams(
153
- image_name="node",
154
- mounts={
155
- "/workspace/cache": SandboxVolumeMount(
156
- id=same_volume.id,
157
- type="rw",
158
- shared=True,
159
- )
196
+ {
197
+ "image_name": "node",
198
+ "mounts": {
199
+ "/workspace/cache": {
200
+ "id": same_volume.id,
201
+ "type": "rw",
202
+ "shared": True,
203
+ }
160
204
  },
161
- )
205
+ }
162
206
  )
163
207
 
164
208
  sandbox.stop()
@@ -169,17 +213,16 @@ client.close()
169
213
 
170
214
  ```python
171
215
  from hyperbrowser import Hyperbrowser
172
- from hyperbrowser.models import SandboxListParams
173
216
 
174
217
  client = Hyperbrowser(api_key="test-key")
175
218
  result = client.sandboxes.list(
176
- SandboxListParams(
177
- status="active",
178
- search="sandbox",
179
- start=1711929600000,
180
- end=1712016000000,
181
- limit=20,
182
- )
219
+ {
220
+ "status": "active",
221
+ "search": "sandbox",
222
+ "start": 1711929600000,
223
+ "end": 1712016000000,
224
+ "limit": 20,
225
+ }
183
226
  )
184
227
 
185
228
  for sandbox in result.sandboxes:
@@ -190,11 +233,10 @@ for sandbox in result.sandboxes:
190
233
 
191
234
  ```python
192
235
  from hyperbrowser import Hyperbrowser
193
- from hyperbrowser.models import SandboxSnapshotListParams
194
236
 
195
237
  client = Hyperbrowser(api_key="test-key")
196
238
  snapshots = client.sandboxes.list_snapshots(
197
- SandboxSnapshotListParams(image_name="node", status="created", limit=10)
239
+ {"image_name": "node", "status": "created", "limit": 10}
198
240
  )
199
241
  ```
200
242
 
@@ -202,16 +244,13 @@ snapshots = client.sandboxes.list_snapshots(
202
244
 
203
245
  ```python
204
246
  from hyperbrowser import Hyperbrowser
205
- from hyperbrowser.models import CreateSandboxParams, SandboxExposeParams
206
247
 
207
248
  client = Hyperbrowser(api_key="test-key")
208
249
  sandbox = client.sandboxes.create(
209
- CreateSandboxParams(
210
- image_name="node", cpu=2, memory_mib=2048, disk_mib=8192
211
- )
250
+ {"image_name": "node", "cpu": 2, "memory_mib": 2048, "disk_mib": 8192}
212
251
  )
213
252
 
214
- result = sandbox.expose(SandboxExposeParams(port=8080, auth=True))
253
+ result = sandbox.expose({"port": 8080, "auth": True})
215
254
  print(result.url, result.browser_url)
216
255
 
217
256
  sandbox.unexpose(8080)
@@ -221,23 +260,19 @@ sandbox.unexpose(8080)
221
260
 
222
261
  ```python
223
262
  from hyperbrowser import Hyperbrowser
224
- from hyperbrowser.models import CreateSandboxParams, SandboxFileWriteEntry
225
263
 
226
264
  client = Hyperbrowser(api_key="test-key")
227
- sandbox = client.sandboxes.create(CreateSandboxParams(image_name="node"))
265
+ sandbox = client.sandboxes.create({"image_name": "node"})
228
266
 
229
267
  sandbox.files.write(
230
268
  [
231
- SandboxFileWriteEntry(
232
- path="/tmp/config.json",
233
- data='{"debug":true}\n',
234
- append=True,
235
- mode="600",
236
- ),
237
- SandboxFileWriteEntry(
238
- path="/tmp/blob.bin",
239
- data=b"\x00\x01\x02",
240
- ),
269
+ {
270
+ "path": "/tmp/config.json",
271
+ "data": '{"debug":true}\n',
272
+ "append": True,
273
+ "mode": "600",
274
+ },
275
+ {"path": "/tmp/blob.bin", "data": b"\x00\x01\x02"},
241
276
  ]
242
277
  )
243
278
  ```
@@ -246,11 +281,10 @@ sandbox.files.write(
246
281
 
247
282
  ```python
248
283
  from hyperbrowser import Hyperbrowser
249
- from hyperbrowser.models import CreateSandboxParams, SandboxTerminalCreateParams
250
284
 
251
285
  client = Hyperbrowser(api_key="test-key")
252
- sandbox = client.sandboxes.create(CreateSandboxParams(image_name="node"))
253
- terminal = sandbox.terminal.create(SandboxTerminalCreateParams(command="bash"))
286
+ sandbox = client.sandboxes.create({"image_name": "node"})
287
+ terminal = sandbox.terminal.create({"command": "bash"})
254
288
 
255
289
  connection = terminal.attach(cursor=10)
256
290
  for event in connection.events():