grasp-sdk 0.1.8__tar.gz → 0.1.10__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.
Potentially problematic release.
This version of grasp-sdk might be problematic. Click here for more details.
- {grasp_sdk-0.1.8/grasp_sdk.egg-info → grasp_sdk-0.1.10}/PKG-INFO +6 -1
- {grasp_sdk-0.1.8 → grasp_sdk-0.1.10}/README.md +5 -0
- {grasp_sdk-0.1.8 → grasp_sdk-0.1.10}/example_usage.py +2 -2
- {grasp_sdk-0.1.8 → grasp_sdk-0.1.10}/grasp_sdk/__init__.py +1 -1
- {grasp_sdk-0.1.8 → grasp_sdk-0.1.10}/grasp_sdk/services/browser.py +28 -37
- {grasp_sdk-0.1.8 → grasp_sdk-0.1.10}/grasp_sdk/services/sandbox.py +7 -0
- {grasp_sdk-0.1.8 → grasp_sdk-0.1.10/grasp_sdk.egg-info}/PKG-INFO +6 -1
- {grasp_sdk-0.1.8 → grasp_sdk-0.1.10}/grasp_sdk.egg-info/SOURCES.txt +0 -4
- grasp_sdk-0.1.10/grasp_sdk.egg-info/top_level.txt +4 -0
- {grasp_sdk-0.1.8 → grasp_sdk-0.1.10}/pyproject.toml +1 -1
- grasp_sdk-0.1.8/grasp_sdk/sandbox/bootstrap-chrome-stable.mjs +0 -69
- grasp_sdk-0.1.8/grasp_sdk/sandbox/chrome-stable.mjs +0 -424
- grasp_sdk-0.1.8/grasp_sdk/sandbox/chromium.mjs +0 -395
- grasp_sdk-0.1.8/grasp_sdk/sandbox/http-proxy.mjs +0 -324
- grasp_sdk-0.1.8/grasp_sdk.egg-info/top_level.txt +0 -2
- {grasp_sdk-0.1.8 → grasp_sdk-0.1.10}/MANIFEST.in +0 -0
- {grasp_sdk-0.1.8 → grasp_sdk-0.1.10}/build_and_publish.py +0 -0
- {grasp_sdk-0.1.8 → grasp_sdk-0.1.10}/grasp_sdk/models/__init__.py +0 -0
- {grasp_sdk-0.1.8 → grasp_sdk-0.1.10}/grasp_sdk/services/__init__.py +0 -0
- {grasp_sdk-0.1.8 → grasp_sdk-0.1.10}/grasp_sdk/utils/__init__.py +0 -0
- {grasp_sdk-0.1.8 → grasp_sdk-0.1.10}/grasp_sdk/utils/auth.py +0 -0
- {grasp_sdk-0.1.8 → grasp_sdk-0.1.10}/grasp_sdk/utils/config.py +0 -0
- {grasp_sdk-0.1.8 → grasp_sdk-0.1.10}/grasp_sdk/utils/logger.py +0 -0
- {grasp_sdk-0.1.8 → grasp_sdk-0.1.10}/grasp_sdk.egg-info/dependency_links.txt +0 -0
- {grasp_sdk-0.1.8 → grasp_sdk-0.1.10}/grasp_sdk.egg-info/entry_points.txt +0 -0
- {grasp_sdk-0.1.8 → grasp_sdk-0.1.10}/grasp_sdk.egg-info/not-zip-safe +0 -0
- {grasp_sdk-0.1.8 → grasp_sdk-0.1.10}/grasp_sdk.egg-info/requires.txt +0 -0
- {grasp_sdk-0.1.8 → grasp_sdk-0.1.10}/py.typed +0 -0
- {grasp_sdk-0.1.8 → grasp_sdk-0.1.10}/requirements.txt +0 -0
- {grasp_sdk-0.1.8 → grasp_sdk-0.1.10}/setup.cfg +0 -0
- {grasp_sdk-0.1.8 → grasp_sdk-0.1.10}/setup.py +0 -0
- {grasp_sdk-0.1.8 → grasp_sdk-0.1.10}/test_install.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: grasp_sdk
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.10
|
|
4
4
|
Summary: Python SDK for Grasp E2B - Browser automation and sandbox management
|
|
5
5
|
Home-page: https://github.com/grasp-team/grasp-e2b
|
|
6
6
|
Author: Grasp Team
|
|
@@ -308,6 +308,11 @@ MIT License - see the [LICENSE](../LICENSE) file for details.
|
|
|
308
308
|
|
|
309
309
|
## 📋 Release History
|
|
310
310
|
|
|
311
|
+
### v0.1.10 (2025-01-27)
|
|
312
|
+
- Bug fixes and improvements
|
|
313
|
+
- Enhanced stability
|
|
314
|
+
- Updated dependencies
|
|
315
|
+
|
|
311
316
|
### v0.1.4 (2025-01-27)
|
|
312
317
|
- Version synchronization update
|
|
313
318
|
- Package metadata improvements
|
|
@@ -261,6 +261,11 @@ MIT License - see the [LICENSE](../LICENSE) file for details.
|
|
|
261
261
|
|
|
262
262
|
## 📋 Release History
|
|
263
263
|
|
|
264
|
+
### v0.1.10 (2025-01-27)
|
|
265
|
+
- Bug fixes and improvements
|
|
266
|
+
- Enhanced stability
|
|
267
|
+
- Updated dependencies
|
|
268
|
+
|
|
264
269
|
### v0.1.4 (2025-01-27)
|
|
265
270
|
- Version synchronization update
|
|
266
271
|
- Package metadata improvements
|
|
@@ -33,10 +33,10 @@ async def main():
|
|
|
33
33
|
|
|
34
34
|
async with GraspServer({
|
|
35
35
|
# 'key': api_key,
|
|
36
|
-
|
|
36
|
+
'type': 'chrome-stable',
|
|
37
37
|
# 'headless': False,
|
|
38
38
|
# 'adblock': True,
|
|
39
|
-
|
|
39
|
+
'debug': True,
|
|
40
40
|
'timeout': 3600000, # 容器最长运行1小时(最大值可以为一天 86400000)
|
|
41
41
|
}) as connection:
|
|
42
42
|
|
|
@@ -147,7 +147,7 @@ class BrowserService:
|
|
|
147
147
|
# except FileNotFoundError:
|
|
148
148
|
# raise RuntimeError(f'Browser script not found: {script_path}')
|
|
149
149
|
|
|
150
|
-
playwright_script = '/home/user/http-proxy.
|
|
150
|
+
playwright_script = '/home/user/http-proxy.js'
|
|
151
151
|
|
|
152
152
|
# Prepare script options
|
|
153
153
|
from ..models import IScriptOptions
|
|
@@ -156,7 +156,7 @@ class BrowserService:
|
|
|
156
156
|
'background': True,
|
|
157
157
|
'nohup': not self.sandbox_service.is_debug,
|
|
158
158
|
'timeoutMs': 0,
|
|
159
|
-
'preCommand': ''
|
|
159
|
+
'preCommand': ''
|
|
160
160
|
}
|
|
161
161
|
|
|
162
162
|
# Run the Playwright script in background
|
|
@@ -226,7 +226,7 @@ class BrowserService:
|
|
|
226
226
|
Raises:
|
|
227
227
|
RuntimeError: If CDP server fails to become ready within timeout
|
|
228
228
|
"""
|
|
229
|
-
delay_ms =
|
|
229
|
+
delay_ms = 50
|
|
230
230
|
max_attempts = self.config['launchTimeout'] // delay_ms
|
|
231
231
|
|
|
232
232
|
for attempt in range(1, max_attempts + 1):
|
|
@@ -240,40 +240,31 @@ class BrowserService:
|
|
|
240
240
|
)
|
|
241
241
|
|
|
242
242
|
# Check if CDP endpoint is responding
|
|
243
|
-
|
|
244
|
-
'
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
connection = CDPConnection(
|
|
270
|
-
ws_url=ws_url,
|
|
271
|
-
http_url=http_url,
|
|
272
|
-
port=9222
|
|
273
|
-
)
|
|
274
|
-
|
|
275
|
-
self.logger.info(f'CDP server is ready (metadata: {metadata})')
|
|
276
|
-
return connection
|
|
243
|
+
async with aiohttp.ClientSession() as session:
|
|
244
|
+
async with session.get(f'https://{host}/json/version') as response:
|
|
245
|
+
if response.status == 200:
|
|
246
|
+
response_text = await response.text()
|
|
247
|
+
if 'Browser' in response_text:
|
|
248
|
+
stdout_content = response_text
|
|
249
|
+
metadata = json.loads(stdout_content)
|
|
250
|
+
|
|
251
|
+
# Update URLs for external access
|
|
252
|
+
ws_url = metadata['webSocketDebuggerUrl'].replace(
|
|
253
|
+
'ws://', 'wss://'
|
|
254
|
+
).replace(
|
|
255
|
+
f'localhost:9222', host
|
|
256
|
+
)
|
|
257
|
+
|
|
258
|
+
http_url = f'https://{host}'
|
|
259
|
+
|
|
260
|
+
connection = CDPConnection(
|
|
261
|
+
ws_url=ws_url,
|
|
262
|
+
http_url=http_url,
|
|
263
|
+
port=9222
|
|
264
|
+
)
|
|
265
|
+
|
|
266
|
+
self.logger.info(f'CDP server is ready (metadata: {metadata})')
|
|
267
|
+
return connection
|
|
277
268
|
|
|
278
269
|
except Exception as error:
|
|
279
270
|
self.logger.debug(
|
|
@@ -145,10 +145,17 @@ class SandboxService:
|
|
|
145
145
|
self.logger.info('Creating Grasp sandbox', {
|
|
146
146
|
'templateId': template_id,
|
|
147
147
|
})
|
|
148
|
+
|
|
149
|
+
domain = 'e2b.app'
|
|
150
|
+
if api_key.startswith('sk_'):
|
|
151
|
+
domain = 'sandbox.novita.ai'
|
|
152
|
+
template_id = f'{template_id}-novita'
|
|
153
|
+
|
|
148
154
|
# Use Sandbox constructor directly (e2b SDK 1.5.3+)
|
|
149
155
|
self.sandbox = await AsyncSandbox.create(
|
|
150
156
|
template=template_id,
|
|
151
157
|
api_key=api_key,
|
|
158
|
+
domain=domain,
|
|
152
159
|
timeout=self.config['timeout'] // 1000, # Convert ms to seconds
|
|
153
160
|
envs=envs,
|
|
154
161
|
)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: grasp_sdk
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.10
|
|
4
4
|
Summary: Python SDK for Grasp E2B - Browser automation and sandbox management
|
|
5
5
|
Home-page: https://github.com/grasp-team/grasp-e2b
|
|
6
6
|
Author: Grasp Team
|
|
@@ -308,6 +308,11 @@ MIT License - see the [LICENSE](../LICENSE) file for details.
|
|
|
308
308
|
|
|
309
309
|
## 📋 Release History
|
|
310
310
|
|
|
311
|
+
### v0.1.10 (2025-01-27)
|
|
312
|
+
- Bug fixes and improvements
|
|
313
|
+
- Enhanced stability
|
|
314
|
+
- Updated dependencies
|
|
315
|
+
|
|
311
316
|
### v0.1.4 (2025-01-27)
|
|
312
317
|
- Version synchronization update
|
|
313
318
|
- Package metadata improvements
|
|
@@ -30,10 +30,6 @@ grasp_sdk.egg-info/not-zip-safe
|
|
|
30
30
|
grasp_sdk.egg-info/requires.txt
|
|
31
31
|
grasp_sdk.egg-info/top_level.txt
|
|
32
32
|
grasp_sdk/models/__init__.py
|
|
33
|
-
grasp_sdk/sandbox/bootstrap-chrome-stable.mjs
|
|
34
|
-
grasp_sdk/sandbox/chrome-stable.mjs
|
|
35
|
-
grasp_sdk/sandbox/chromium.mjs
|
|
36
|
-
grasp_sdk/sandbox/http-proxy.mjs
|
|
37
33
|
grasp_sdk/services/__init__.py
|
|
38
34
|
grasp_sdk/services/browser.py
|
|
39
35
|
grasp_sdk/services/sandbox.py
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { spawn } from 'child_process';
|
|
2
|
-
|
|
3
|
-
// const asblockPlugin = '/home/user/.config/google-chrome/Default/Extensions/adblock';
|
|
4
|
-
|
|
5
|
-
const args = [
|
|
6
|
-
'--no-sandbox',
|
|
7
|
-
'--disable-setuid-sandbox',
|
|
8
|
-
'--disable-dev-shm-usage',
|
|
9
|
-
'--disable-gpu',
|
|
10
|
-
'--disable-software-rasterizer',
|
|
11
|
-
'--user-data-dir=/home/user/.browser-context'
|
|
12
|
-
];
|
|
13
|
-
|
|
14
|
-
args.push(
|
|
15
|
-
// 避免缓存积累影响性能
|
|
16
|
-
'--disable-application-cache',
|
|
17
|
-
|
|
18
|
-
// 关闭所有硬件加速特性,防止 GPU 相关崩溃
|
|
19
|
-
'--disable-accelerated-2d-canvas',
|
|
20
|
-
'--disable-accelerated-video-decode',
|
|
21
|
-
|
|
22
|
-
// 禁用后台渲染,减少无关资源消耗
|
|
23
|
-
'--disable-background-timer-throttling',
|
|
24
|
-
'--disable-backgrounding-occluded-windows',
|
|
25
|
-
'--disable-renderer-backgrounding',
|
|
26
|
-
|
|
27
|
-
// 避免过度日志影响性能
|
|
28
|
-
'--disable-logging',
|
|
29
|
-
|
|
30
|
-
// 禁用不必要的多媒体解码
|
|
31
|
-
'--mute-audio',
|
|
32
|
-
|
|
33
|
-
// 避免崩溃时弹窗
|
|
34
|
-
'--no-default-browser-check',
|
|
35
|
-
'--no-first-run',
|
|
36
|
-
'--headless=new',
|
|
37
|
-
);
|
|
38
|
-
|
|
39
|
-
args.push(
|
|
40
|
-
`--remote-debugging-port=9222`,
|
|
41
|
-
'--remote-debugging-address=0.0.0.0',
|
|
42
|
-
'about:blank',
|
|
43
|
-
);
|
|
44
|
-
|
|
45
|
-
const chromePath = '/usr/bin/google-chrome';
|
|
46
|
-
|
|
47
|
-
// 启动 Chrome 并启用远程调试
|
|
48
|
-
const chrome = spawn(chromePath, args, {
|
|
49
|
-
env: { ...process.env, DISPLAY: ':99' }
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
chrome.stdout.on('data', (data) => {
|
|
53
|
-
console.log(`stdout: ${data}`);
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
chrome.stderr.on('data', (data) => {
|
|
57
|
-
console.error(`stderr: ${data}`);
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
chrome.on('close', (code) => {
|
|
61
|
-
console.log(`Chrome process exited with code ${code}`);
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
console.log('Browser launched and ready...');
|
|
65
|
-
|
|
66
|
-
// 保持进程不退出,并监听中止信号
|
|
67
|
-
process.stdin.resume();
|
|
68
|
-
process.on('SIGINT', () => process.exit());
|
|
69
|
-
process.on('SIGTERM', () => process.exit());
|