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.
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/PKG-INFO +106 -71
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/README.md +104 -70
- hyperbrowser-1.0.0/hyperbrowser/client/_request.py +124 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/agents/browser_use.py +18 -11
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/agents/claude_computer_use.py +16 -3
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/agents/cua.py +12 -3
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/agents/gemini_computer_use.py +16 -3
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/agents/grok_computer_use.py +16 -3
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/agents/hyper_agent.py +10 -3
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/computer_action.py +57 -8
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/crawl.py +20 -5
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/extension.py +16 -13
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/extract.py +22 -10
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/profile.py +22 -14
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/sandbox.py +97 -60
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/sandboxes/sandbox_files.py +89 -59
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/sandboxes/sandbox_processes.py +21 -8
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/sandboxes/sandbox_terminal.py +13 -8
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/scrape.py +30 -9
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/session.py +80 -30
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/volume.py +9 -5
- hyperbrowser-1.0.0/hyperbrowser/client/managers/async_manager/web/__init__.py +43 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/web/batch_fetch.py +26 -19
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/web/crawl.py +26 -19
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sandboxes/shared.py +22 -16
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/agents/browser_use.py +20 -11
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/agents/claude_computer_use.py +16 -3
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/agents/cua.py +12 -3
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/agents/gemini_computer_use.py +16 -3
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/agents/grok_computer_use.py +16 -3
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/agents/hyper_agent.py +12 -3
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/computer_action.py +57 -8
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/crawl.py +20 -6
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/extension.py +16 -13
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/extract.py +22 -10
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/profile.py +24 -14
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/sandbox.py +97 -60
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/sandboxes/sandbox_files.py +89 -59
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/sandboxes/sandbox_processes.py +21 -8
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/sandboxes/sandbox_terminal.py +13 -8
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/scrape.py +32 -9
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/session.py +79 -28
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/volume.py +9 -5
- hyperbrowser-1.0.0/hyperbrowser/client/managers/sync_manager/web/__init__.py +43 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/web/batch_fetch.py +28 -19
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/web/crawl.py +26 -19
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/agents/browser_use.py +18 -12
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/agents/claude_computer_use.py +5 -3
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/agents/cua.py +5 -3
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/agents/gemini_computer_use.py +6 -3
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/agents/grok_computer_use.py +5 -3
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/agents/hyper_agent.py +3 -1
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/crawl.py +4 -2
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/extension.py +1 -1
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/scrape.py +7 -5
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/web/branding.py +5 -5
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/web/common.py +6 -6
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/web/fetch.py +2 -2
- hyperbrowser-1.0.0/hyperbrowser/py.typed +1 -0
- hyperbrowser-1.0.0/hyperbrowser/tools/__init__.py +145 -0
- hyperbrowser-1.0.0/hyperbrowser/types/__init__.py +309 -0
- hyperbrowser-1.0.0/hyperbrowser/types/_json.py +33 -0
- hyperbrowser-1.0.0/hyperbrowser/types/agents.py +177 -0
- hyperbrowser-1.0.0/hyperbrowser/types/computer_action.py +160 -0
- hyperbrowser-1.0.0/hyperbrowser/types/crawl.py +29 -0
- hyperbrowser-1.0.0/hyperbrowser/types/extension.py +13 -0
- hyperbrowser-1.0.0/hyperbrowser/types/extract.py +32 -0
- hyperbrowser-1.0.0/hyperbrowser/types/profile.py +26 -0
- hyperbrowser-1.0.0/hyperbrowser/types/sandbox.py +438 -0
- hyperbrowser-1.0.0/hyperbrowser/types/scrape.py +76 -0
- hyperbrowser-1.0.0/hyperbrowser/types/session.py +206 -0
- hyperbrowser-1.0.0/hyperbrowser/types/volume.py +10 -0
- hyperbrowser-1.0.0/hyperbrowser/types/web.py +246 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/pyproject.toml +6 -2
- hyperbrowser-0.93.4/hyperbrowser/client/managers/async_manager/web/__init__.py +0 -41
- hyperbrowser-0.93.4/hyperbrowser/client/managers/sync_manager/web/__init__.py +0 -41
- hyperbrowser-0.93.4/hyperbrowser/tools/__init__.py +0 -127
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/LICENSE +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/__init__.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/async_client.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/base.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/agents/__init__.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/sandboxes/__init__.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/sandboxes/sandbox_transport.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/async_manager/team.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sandboxes/__init__.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sandboxes/image_build.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/agents/__init__.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/sandboxes/__init__.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/sandboxes/sandbox_transport.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/managers/sync_manager/team.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/client/sync.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/config.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/exceptions.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/__init__.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/_parsers.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/computer_action.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/consts.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/extract.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/profile.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/sandbox.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/session.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/team.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/volume.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/web/batch_fetch.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/web/crawl.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/models/web/search.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/sandbox_common.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/tools/anthropic.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/tools/openai.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/tools/schema.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/transport/async_transport.py +0 -0
- {hyperbrowser-0.93.4 → hyperbrowser-1.0.0}/hyperbrowser/transport/base.py +0 -0
- {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.
|
|
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
|
-
|
|
73
|
-
|
|
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
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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.
|
|
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
|
-
|
|
149
|
-
image_name
|
|
150
|
-
cpu
|
|
151
|
-
memory_mib
|
|
152
|
-
disk_mib
|
|
153
|
-
exposed_ports
|
|
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(
|
|
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
|
-
|
|
179
|
-
image_name
|
|
180
|
-
mounts
|
|
181
|
-
"/workspace/cache":
|
|
182
|
-
id
|
|
183
|
-
type
|
|
184
|
-
shared
|
|
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
|
-
|
|
203
|
-
status
|
|
204
|
-
search
|
|
205
|
-
start
|
|
206
|
-
end
|
|
207
|
-
limit
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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(
|
|
292
|
+
sandbox = client.sandboxes.create({"image_name": "node"})
|
|
254
293
|
|
|
255
294
|
sandbox.files.write(
|
|
256
295
|
[
|
|
257
|
-
|
|
258
|
-
path
|
|
259
|
-
data
|
|
260
|
-
append
|
|
261
|
-
mode
|
|
262
|
-
|
|
263
|
-
|
|
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(
|
|
279
|
-
terminal = sandbox.terminal.create(
|
|
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
|
-
|
|
47
|
-
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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.
|
|
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
|
-
|
|
123
|
-
image_name
|
|
124
|
-
cpu
|
|
125
|
-
memory_mib
|
|
126
|
-
disk_mib
|
|
127
|
-
exposed_ports
|
|
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(
|
|
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
|
-
|
|
153
|
-
image_name
|
|
154
|
-
mounts
|
|
155
|
-
"/workspace/cache":
|
|
156
|
-
id
|
|
157
|
-
type
|
|
158
|
-
shared
|
|
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
|
-
|
|
177
|
-
status
|
|
178
|
-
search
|
|
179
|
-
start
|
|
180
|
-
end
|
|
181
|
-
limit
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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(
|
|
265
|
+
sandbox = client.sandboxes.create({"image_name": "node"})
|
|
228
266
|
|
|
229
267
|
sandbox.files.write(
|
|
230
268
|
[
|
|
231
|
-
|
|
232
|
-
path
|
|
233
|
-
data
|
|
234
|
-
append
|
|
235
|
-
mode
|
|
236
|
-
|
|
237
|
-
|
|
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(
|
|
253
|
-
terminal = sandbox.terminal.create(
|
|
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():
|