camel-ai 0.2.72a10__py3-none-any.whl → 0.2.73__py3-none-any.whl
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 camel-ai might be problematic. Click here for more details.
- camel/__init__.py +1 -1
- camel/agents/chat_agent.py +140 -345
- camel/memories/agent_memories.py +18 -17
- camel/societies/__init__.py +2 -0
- camel/societies/workforce/prompts.py +36 -10
- camel/societies/workforce/single_agent_worker.py +7 -5
- camel/societies/workforce/workforce.py +6 -4
- camel/storages/key_value_storages/mem0_cloud.py +48 -47
- camel/storages/vectordb_storages/__init__.py +1 -0
- camel/storages/vectordb_storages/surreal.py +100 -150
- camel/toolkits/__init__.py +6 -1
- camel/toolkits/base.py +60 -2
- camel/toolkits/excel_toolkit.py +153 -64
- camel/toolkits/file_write_toolkit.py +67 -0
- camel/toolkits/hybrid_browser_toolkit/config_loader.py +136 -413
- camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit.py +131 -1966
- camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit_ts.py +1177 -0
- camel/toolkits/hybrid_browser_toolkit/ts/package-lock.json +4356 -0
- camel/toolkits/hybrid_browser_toolkit/ts/package.json +33 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/browser-scripts.js +125 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/browser-session.ts +945 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/config-loader.ts +226 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/hybrid-browser-toolkit.ts +522 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/index.ts +7 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/types.ts +110 -0
- camel/toolkits/hybrid_browser_toolkit/ts/tsconfig.json +26 -0
- camel/toolkits/hybrid_browser_toolkit/ts/websocket-server.js +254 -0
- camel/toolkits/hybrid_browser_toolkit/ws_wrapper.py +582 -0
- camel/toolkits/hybrid_browser_toolkit_py/__init__.py +17 -0
- camel/toolkits/hybrid_browser_toolkit_py/config_loader.py +447 -0
- camel/toolkits/hybrid_browser_toolkit_py/hybrid_browser_toolkit.py +2077 -0
- camel/toolkits/mcp_toolkit.py +341 -46
- camel/toolkits/message_integration.py +719 -0
- camel/toolkits/notion_mcp_toolkit.py +234 -0
- camel/toolkits/screenshot_toolkit.py +116 -31
- camel/toolkits/search_toolkit.py +20 -2
- camel/toolkits/slack_toolkit.py +43 -48
- camel/toolkits/terminal_toolkit.py +288 -46
- camel/toolkits/video_analysis_toolkit.py +13 -13
- camel/toolkits/video_download_toolkit.py +11 -11
- camel/toolkits/web_deploy_toolkit.py +207 -12
- camel/types/enums.py +6 -0
- {camel_ai-0.2.72a10.dist-info → camel_ai-0.2.73.dist-info}/METADATA +49 -9
- {camel_ai-0.2.72a10.dist-info → camel_ai-0.2.73.dist-info}/RECORD +52 -35
- /camel/toolkits/{hybrid_browser_toolkit → hybrid_browser_toolkit_py}/actions.py +0 -0
- /camel/toolkits/{hybrid_browser_toolkit → hybrid_browser_toolkit_py}/agent.py +0 -0
- /camel/toolkits/{hybrid_browser_toolkit → hybrid_browser_toolkit_py}/browser_session.py +0 -0
- /camel/toolkits/{hybrid_browser_toolkit → hybrid_browser_toolkit_py}/snapshot.py +0 -0
- /camel/toolkits/{hybrid_browser_toolkit → hybrid_browser_toolkit_py}/stealth_script.js +0 -0
- /camel/toolkits/{hybrid_browser_toolkit → hybrid_browser_toolkit_py}/unified_analyzer.js +0 -0
- {camel_ai-0.2.72a10.dist-info → camel_ai-0.2.73.dist-info}/WHEEL +0 -0
- {camel_ai-0.2.72a10.dist-info → camel_ai-0.2.73.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
1
|
# ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
3
2
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
3
|
# you may not use this file except in compliance with the License.
|
|
@@ -12,436 +11,160 @@
|
|
|
12
11
|
# See the License for the specific language governing permissions and
|
|
13
12
|
# limitations under the License.
|
|
14
13
|
# ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
Configuration for browser automation including stealth mode and timeouts.
|
|
18
|
-
|
|
19
|
-
This module contains all the configuration needed to make the browser
|
|
20
|
-
appear as a regular user browser and configure action timeouts.
|
|
21
|
-
"""
|
|
22
|
-
|
|
23
|
-
import os
|
|
24
|
-
from typing import Any, Dict, List, Optional
|
|
14
|
+
from dataclasses import dataclass
|
|
15
|
+
from typing import Any, Dict, Optional
|
|
25
16
|
|
|
26
17
|
|
|
18
|
+
@dataclass
|
|
27
19
|
class BrowserConfig:
|
|
28
|
-
|
|
29
|
-
timeouts."""
|
|
30
|
-
|
|
31
|
-
# Default timeout values (in milliseconds)
|
|
32
|
-
DEFAULT_ACTION_TIMEOUT = 3000
|
|
33
|
-
DEFAULT_SHORT_TIMEOUT = 1000
|
|
34
|
-
DEFAULT_NAVIGATION_TIMEOUT = 10000
|
|
35
|
-
DEFAULT_NETWORK_IDLE_TIMEOUT = 5000
|
|
36
|
-
DEFAULT_SCREENSHOT_TIMEOUT = 15000
|
|
37
|
-
DEFAULT_PAGE_STABILITY_TIMEOUT = 1500
|
|
38
|
-
DEFAULT_DOM_CONTENT_LOADED_TIMEOUT = 5000
|
|
39
|
-
|
|
40
|
-
# Default action limits
|
|
41
|
-
DEFAULT_MAX_SCROLL_AMOUNT = 5000 # Maximum scroll distance in pixels
|
|
42
|
-
|
|
43
|
-
@staticmethod
|
|
44
|
-
def get_timeout_config() -> Dict[str, int]:
|
|
45
|
-
r"""Get timeout configuration with environment variable support.
|
|
46
|
-
|
|
47
|
-
Returns:
|
|
48
|
-
Dict[str, int]: Timeout configuration in milliseconds.
|
|
49
|
-
"""
|
|
50
|
-
return {
|
|
51
|
-
'default_timeout': int(
|
|
52
|
-
os.getenv(
|
|
53
|
-
'HYBRID_BROWSER_DEFAULT_TIMEOUT',
|
|
54
|
-
BrowserConfig.DEFAULT_ACTION_TIMEOUT,
|
|
55
|
-
)
|
|
56
|
-
),
|
|
57
|
-
'short_timeout': int(
|
|
58
|
-
os.getenv(
|
|
59
|
-
'HYBRID_BROWSER_SHORT_TIMEOUT',
|
|
60
|
-
BrowserConfig.DEFAULT_SHORT_TIMEOUT,
|
|
61
|
-
)
|
|
62
|
-
),
|
|
63
|
-
'navigation_timeout': int(
|
|
64
|
-
os.getenv(
|
|
65
|
-
'HYBRID_BROWSER_NAVIGATION_TIMEOUT',
|
|
66
|
-
BrowserConfig.DEFAULT_NAVIGATION_TIMEOUT,
|
|
67
|
-
)
|
|
68
|
-
),
|
|
69
|
-
'network_idle_timeout': int(
|
|
70
|
-
os.getenv(
|
|
71
|
-
'HYBRID_BROWSER_NETWORK_IDLE_TIMEOUT',
|
|
72
|
-
BrowserConfig.DEFAULT_NETWORK_IDLE_TIMEOUT,
|
|
73
|
-
)
|
|
74
|
-
),
|
|
75
|
-
'screenshot_timeout': int(
|
|
76
|
-
os.getenv(
|
|
77
|
-
'HYBRID_BROWSER_SCREENSHOT_TIMEOUT',
|
|
78
|
-
BrowserConfig.DEFAULT_SCREENSHOT_TIMEOUT,
|
|
79
|
-
)
|
|
80
|
-
),
|
|
81
|
-
'page_stability_timeout': int(
|
|
82
|
-
os.getenv(
|
|
83
|
-
'HYBRID_BROWSER_PAGE_STABILITY_TIMEOUT',
|
|
84
|
-
BrowserConfig.DEFAULT_PAGE_STABILITY_TIMEOUT,
|
|
85
|
-
)
|
|
86
|
-
),
|
|
87
|
-
'dom_content_loaded_timeout': int(
|
|
88
|
-
os.getenv(
|
|
89
|
-
'HYBRID_BROWSER_DOM_CONTENT_LOADED_TIMEOUT',
|
|
90
|
-
BrowserConfig.DEFAULT_DOM_CONTENT_LOADED_TIMEOUT,
|
|
91
|
-
)
|
|
92
|
-
),
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
@staticmethod
|
|
96
|
-
def get_action_limits() -> Dict[str, int]:
|
|
97
|
-
r"""Get action limits configuration with environment variable support.
|
|
98
|
-
|
|
99
|
-
Returns:
|
|
100
|
-
Dict[str, int]: Action limits configuration.
|
|
101
|
-
"""
|
|
102
|
-
return {
|
|
103
|
-
'max_scroll_amount': int(
|
|
104
|
-
os.getenv(
|
|
105
|
-
'HYBRID_BROWSER_MAX_SCROLL_AMOUNT',
|
|
106
|
-
BrowserConfig.DEFAULT_MAX_SCROLL_AMOUNT,
|
|
107
|
-
)
|
|
108
|
-
),
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
@staticmethod
|
|
112
|
-
def get_action_timeout(override: Optional[int] = None) -> int:
|
|
113
|
-
r"""Get action timeout with optional override.
|
|
114
|
-
|
|
115
|
-
Args:
|
|
116
|
-
override: Optional timeout override value in milliseconds.
|
|
117
|
-
|
|
118
|
-
Returns:
|
|
119
|
-
int: Timeout value in milliseconds.
|
|
120
|
-
"""
|
|
121
|
-
if override is not None:
|
|
122
|
-
return override
|
|
123
|
-
return BrowserConfig.get_timeout_config()['default_timeout']
|
|
124
|
-
|
|
125
|
-
@staticmethod
|
|
126
|
-
def get_short_timeout(override: Optional[int] = None) -> int:
|
|
127
|
-
r"""Get short timeout with optional override.
|
|
128
|
-
|
|
129
|
-
Args:
|
|
130
|
-
override: Optional timeout override value in milliseconds.
|
|
131
|
-
|
|
132
|
-
Returns:
|
|
133
|
-
int: Timeout value in milliseconds.
|
|
134
|
-
"""
|
|
135
|
-
if override is not None:
|
|
136
|
-
return override
|
|
137
|
-
return BrowserConfig.get_timeout_config()['short_timeout']
|
|
138
|
-
|
|
139
|
-
@staticmethod
|
|
140
|
-
def get_navigation_timeout(override: Optional[int] = None) -> int:
|
|
141
|
-
r"""Get navigation timeout with optional override.
|
|
142
|
-
|
|
143
|
-
Args:
|
|
144
|
-
override: Optional timeout override value in milliseconds.
|
|
145
|
-
|
|
146
|
-
Returns:
|
|
147
|
-
int: Timeout value in milliseconds.
|
|
148
|
-
"""
|
|
149
|
-
if override is not None:
|
|
150
|
-
return override
|
|
151
|
-
return BrowserConfig.get_timeout_config()['navigation_timeout']
|
|
20
|
+
"""Browser configuration settings."""
|
|
152
21
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
22
|
+
# Browser configuration
|
|
23
|
+
headless: bool = True
|
|
24
|
+
user_data_dir: Optional[str] = None
|
|
25
|
+
stealth: bool = False
|
|
156
26
|
|
|
157
|
-
|
|
158
|
-
|
|
27
|
+
# Default settings
|
|
28
|
+
default_start_url: str = "https://google.com/"
|
|
159
29
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
30
|
+
# Timeout configurations (in milliseconds)
|
|
31
|
+
default_timeout: Optional[int] = None
|
|
32
|
+
short_timeout: Optional[int] = None
|
|
33
|
+
navigation_timeout: int = 30000
|
|
34
|
+
network_idle_timeout: int = 5000
|
|
35
|
+
screenshot_timeout: int = 15000
|
|
36
|
+
page_stability_timeout: int = 1500
|
|
37
|
+
dom_content_loaded_timeout: int = 5000
|
|
166
38
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
r"""Get maximum scroll amount with optional override.
|
|
39
|
+
# Viewport configuration
|
|
40
|
+
viewport_limit: bool = False
|
|
170
41
|
|
|
171
|
-
|
|
172
|
-
|
|
42
|
+
# CDP connection configuration
|
|
43
|
+
connect_over_cdp: bool = False
|
|
44
|
+
cdp_url: Optional[str] = None
|
|
173
45
|
|
|
174
|
-
Returns:
|
|
175
|
-
int: Maximum scroll amount in pixels.
|
|
176
|
-
"""
|
|
177
|
-
if override is not None:
|
|
178
|
-
return override
|
|
179
|
-
return BrowserConfig.get_action_limits()['max_scroll_amount']
|
|
180
46
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
47
|
+
@dataclass
|
|
48
|
+
class ToolkitConfig:
|
|
49
|
+
"""Toolkit-specific configuration."""
|
|
184
50
|
|
|
185
|
-
|
|
186
|
-
|
|
51
|
+
cache_dir: str = "tmp/"
|
|
52
|
+
browser_log_to_file: bool = False
|
|
53
|
+
session_id: Optional[str] = None
|
|
54
|
+
enabled_tools: Optional[list] = None
|
|
187
55
|
|
|
188
|
-
Returns:
|
|
189
|
-
int: Timeout value in milliseconds.
|
|
190
|
-
"""
|
|
191
|
-
if override is not None:
|
|
192
|
-
return override
|
|
193
|
-
return BrowserConfig.get_timeout_config()['screenshot_timeout']
|
|
194
56
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
r"""Get page stability timeout with optional override.
|
|
198
|
-
|
|
199
|
-
Args:
|
|
200
|
-
override: Optional timeout override value in milliseconds.
|
|
201
|
-
|
|
202
|
-
Returns:
|
|
203
|
-
int: Timeout value in milliseconds.
|
|
204
|
-
"""
|
|
205
|
-
if override is not None:
|
|
206
|
-
return override
|
|
207
|
-
return BrowserConfig.get_timeout_config()['page_stability_timeout']
|
|
208
|
-
|
|
209
|
-
@staticmethod
|
|
210
|
-
def get_dom_content_loaded_timeout(override: Optional[int] = None) -> int:
|
|
211
|
-
r"""Get DOM content loaded timeout with optional override.
|
|
212
|
-
|
|
213
|
-
Args:
|
|
214
|
-
override: Optional timeout override value in milliseconds.
|
|
215
|
-
|
|
216
|
-
Returns:
|
|
217
|
-
int: Timeout value in milliseconds.
|
|
218
|
-
"""
|
|
219
|
-
if override is not None:
|
|
220
|
-
return override
|
|
221
|
-
return BrowserConfig.get_timeout_config()['dom_content_loaded_timeout']
|
|
222
|
-
|
|
223
|
-
@staticmethod
|
|
224
|
-
def get_launch_args() -> List[str]:
|
|
225
|
-
r"""Get Chrome launch arguments for stealth mode.
|
|
226
|
-
|
|
227
|
-
Returns:
|
|
228
|
-
List[str]: Chrome command line arguments to avoid detection.
|
|
229
|
-
"""
|
|
230
|
-
return [
|
|
231
|
-
'--disable-blink-features=AutomationControlled',
|
|
232
|
-
'--disable-features=VizDisplayCompositor',
|
|
233
|
-
'--disable-ipc-flooding-protection',
|
|
234
|
-
'--disable-renderer-backgrounding',
|
|
235
|
-
'--disable-backgrounding-occluded-windows',
|
|
236
|
-
'--disable-dev-shm-usage',
|
|
237
|
-
'--disable-extensions',
|
|
238
|
-
'--disable-plugins',
|
|
239
|
-
'--disable-default-apps',
|
|
240
|
-
'--disable-sync',
|
|
241
|
-
'--no-default-browser-check',
|
|
242
|
-
'--no-first-run',
|
|
243
|
-
'--no-sandbox',
|
|
244
|
-
'--disable-setuid-sandbox',
|
|
245
|
-
'--disable-web-security',
|
|
246
|
-
'--disable-features=TranslateUI',
|
|
247
|
-
'--disable-features=BlinkGenPropertyTrees',
|
|
248
|
-
'--disable-component-extensions-with-background-pages',
|
|
249
|
-
]
|
|
250
|
-
|
|
251
|
-
@staticmethod
|
|
252
|
-
def get_context_options() -> Dict[str, Any]:
|
|
253
|
-
r"""Get browser context options for stealth mode.
|
|
254
|
-
|
|
255
|
-
Returns:
|
|
256
|
-
Dict[str, Any]: Browser context configuration options.
|
|
257
|
-
"""
|
|
258
|
-
return {
|
|
259
|
-
'user_agent': (
|
|
260
|
-
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
|
|
261
|
-
'AppleWebKit/537.36 (KHTML, like Gecko) '
|
|
262
|
-
'Chrome/131.0.0.0 Safari/537.36'
|
|
263
|
-
),
|
|
264
|
-
'viewport': {'width': 1920, 'height': 1080},
|
|
265
|
-
'locale': 'en-US',
|
|
266
|
-
'timezone_id': 'America/New_York',
|
|
267
|
-
'geolocation': {'latitude': 40.7128, 'longitude': -74.0060},
|
|
268
|
-
'permissions': ['geolocation'],
|
|
269
|
-
}
|
|
57
|
+
class ConfigLoader:
|
|
58
|
+
"""Configuration loader for HybridBrowserToolkit."""
|
|
270
59
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
60
|
+
def __init__(
|
|
61
|
+
self,
|
|
62
|
+
browser_config: Optional[BrowserConfig] = None,
|
|
63
|
+
toolkit_config: Optional[ToolkitConfig] = None,
|
|
64
|
+
) -> None:
|
|
65
|
+
self.browser_config = browser_config or BrowserConfig()
|
|
66
|
+
self.toolkit_config = toolkit_config or ToolkitConfig()
|
|
274
67
|
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
"""
|
|
68
|
+
@classmethod
|
|
69
|
+
def from_kwargs(cls, **kwargs) -> 'ConfigLoader':
|
|
70
|
+
"""Create ConfigLoader from keyword arguments."""
|
|
71
|
+
browser_kwargs = {}
|
|
72
|
+
toolkit_kwargs = {}
|
|
73
|
+
|
|
74
|
+
# Map arguments to appropriate config classes
|
|
75
|
+
browser_fields = set(BrowserConfig.__dataclass_fields__.keys())
|
|
76
|
+
toolkit_fields = set(ToolkitConfig.__dataclass_fields__.keys())
|
|
77
|
+
|
|
78
|
+
for key, value in kwargs.items():
|
|
79
|
+
# Skip None values to preserve dataclass defaults
|
|
80
|
+
if value is None:
|
|
81
|
+
continue
|
|
82
|
+
|
|
83
|
+
if key in browser_fields:
|
|
84
|
+
browser_kwargs[key] = value
|
|
85
|
+
elif key in toolkit_fields:
|
|
86
|
+
toolkit_kwargs[key] = value
|
|
87
|
+
# Handle some common aliases
|
|
88
|
+
elif key == "userDataDir":
|
|
89
|
+
browser_kwargs["user_data_dir"] = value
|
|
90
|
+
elif key == "defaultStartUrl":
|
|
91
|
+
browser_kwargs["default_start_url"] = value
|
|
92
|
+
elif key == "navigationTimeout":
|
|
93
|
+
browser_kwargs["navigation_timeout"] = value
|
|
94
|
+
elif key == "networkIdleTimeout":
|
|
95
|
+
browser_kwargs["network_idle_timeout"] = value
|
|
96
|
+
elif key == "screenshotTimeout":
|
|
97
|
+
browser_kwargs["screenshot_timeout"] = value
|
|
98
|
+
elif key == "pageStabilityTimeout":
|
|
99
|
+
browser_kwargs["page_stability_timeout"] = value
|
|
100
|
+
elif key == "domContentLoadedTimeout":
|
|
101
|
+
browser_kwargs["dom_content_loaded_timeout"] = value
|
|
102
|
+
elif key == "viewportLimit":
|
|
103
|
+
browser_kwargs["viewport_limit"] = value
|
|
104
|
+
elif key == "connectOverCdp":
|
|
105
|
+
browser_kwargs["connect_over_cdp"] = value
|
|
106
|
+
elif key == "cdpUrl":
|
|
107
|
+
browser_kwargs["cdp_url"] = value
|
|
108
|
+
elif key == "cacheDir":
|
|
109
|
+
toolkit_kwargs["cache_dir"] = value
|
|
110
|
+
elif key == "browserLogToFile":
|
|
111
|
+
toolkit_kwargs["browser_log_to_file"] = value
|
|
112
|
+
elif key == "sessionId":
|
|
113
|
+
toolkit_kwargs["session_id"] = value
|
|
114
|
+
elif key == "enabledTools":
|
|
115
|
+
toolkit_kwargs["enabled_tools"] = value
|
|
116
|
+
|
|
117
|
+
browser_config = BrowserConfig(**browser_kwargs)
|
|
118
|
+
toolkit_config = ToolkitConfig(**toolkit_kwargs)
|
|
119
|
+
|
|
120
|
+
return cls(browser_config, toolkit_config)
|
|
121
|
+
|
|
122
|
+
def get_browser_config(self) -> BrowserConfig:
|
|
123
|
+
"""Get browser configuration."""
|
|
124
|
+
return self.browser_config
|
|
125
|
+
|
|
126
|
+
def get_toolkit_config(self) -> ToolkitConfig:
|
|
127
|
+
"""Get toolkit configuration."""
|
|
128
|
+
return self.toolkit_config
|
|
129
|
+
|
|
130
|
+
def to_ws_config(self) -> Dict[str, Any]:
|
|
131
|
+
"""Convert to WebSocket wrapper configuration format."""
|
|
278
132
|
return {
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
'Sec-Ch-Ua-Platform': '"Windows"',
|
|
293
|
-
'Sec-Fetch-Dest': 'document',
|
|
294
|
-
'Sec-Fetch-Mode': 'navigate',
|
|
295
|
-
'Sec-Fetch-Site': 'none',
|
|
296
|
-
'Sec-Fetch-User': '?1',
|
|
297
|
-
'Upgrade-Insecure-Requests': '1',
|
|
133
|
+
"headless": self.browser_config.headless,
|
|
134
|
+
"userDataDir": self.browser_config.user_data_dir,
|
|
135
|
+
"stealth": self.browser_config.stealth,
|
|
136
|
+
"defaultStartUrl": self.browser_config.default_start_url,
|
|
137
|
+
"navigationTimeout": self.browser_config.navigation_timeout,
|
|
138
|
+
"networkIdleTimeout": self.browser_config.network_idle_timeout,
|
|
139
|
+
"screenshotTimeout": self.browser_config.screenshot_timeout,
|
|
140
|
+
"pageStabilityTimeout": self.browser_config.page_stability_timeout,
|
|
141
|
+
"browser_log_to_file": self.toolkit_config.browser_log_to_file,
|
|
142
|
+
"session_id": self.toolkit_config.session_id,
|
|
143
|
+
"viewport_limit": self.browser_config.viewport_limit,
|
|
144
|
+
"connectOverCdp": self.browser_config.connect_over_cdp,
|
|
145
|
+
"cdpUrl": self.browser_config.cdp_url,
|
|
298
146
|
}
|
|
299
147
|
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
r"""Get stealth configuration.
|
|
303
|
-
|
|
304
|
-
Returns:
|
|
305
|
-
Dict[str, Any]: Complete stealth configuration.
|
|
306
|
-
"""
|
|
148
|
+
def get_timeout_config(self) -> Dict[str, Optional[int]]:
|
|
149
|
+
"""Get all timeout configurations."""
|
|
307
150
|
return {
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
151
|
+
"default_timeout": self.browser_config.default_timeout,
|
|
152
|
+
"short_timeout": self.browser_config.short_timeout,
|
|
153
|
+
"navigation_timeout": self.browser_config.navigation_timeout,
|
|
154
|
+
"network_idle_timeout": self.browser_config.network_idle_timeout,
|
|
155
|
+
"screenshot_timeout": self.browser_config.screenshot_timeout,
|
|
156
|
+
"page_stability_timeout": self.browser_config.page_stability_timeout, # noqa:E501
|
|
157
|
+
"dom_content_loaded_timeout": self.browser_config.dom_content_loaded_timeout, # noqa:E501
|
|
311
158
|
}
|
|
312
159
|
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
"""
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
'stealth': BrowserConfig.get_stealth_config(),
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
# Legacy ConfigLoader class for compatibility (now just wraps BrowserConfig)
|
|
329
|
-
class ConfigLoader:
|
|
330
|
-
r"""Legacy wrapper for BrowserConfig - maintained for backward
|
|
331
|
-
compatibility."""
|
|
332
|
-
|
|
333
|
-
@classmethod
|
|
334
|
-
def get_browser_config(cls):
|
|
335
|
-
r"""Get the BrowserConfig class."""
|
|
336
|
-
return BrowserConfig
|
|
337
|
-
|
|
338
|
-
@classmethod
|
|
339
|
-
def get_stealth_config(cls):
|
|
340
|
-
r"""Get the StealthConfig class (alias)."""
|
|
341
|
-
return BrowserConfig # StealthConfig is an alias for BrowserConfig
|
|
342
|
-
|
|
343
|
-
@classmethod
|
|
344
|
-
def get_timeout_config(cls) -> Dict[str, int]:
|
|
345
|
-
r"""Get timeout configuration."""
|
|
346
|
-
return BrowserConfig.get_timeout_config()
|
|
347
|
-
|
|
348
|
-
@classmethod
|
|
349
|
-
def get_action_timeout(cls, override: Optional[int] = None) -> int:
|
|
350
|
-
r"""Get action timeout with optional override."""
|
|
351
|
-
return BrowserConfig.get_action_timeout(override)
|
|
352
|
-
|
|
353
|
-
@classmethod
|
|
354
|
-
def get_short_timeout(cls, override: Optional[int] = None) -> int:
|
|
355
|
-
r"""Get short timeout with optional override."""
|
|
356
|
-
return BrowserConfig.get_short_timeout(override)
|
|
357
|
-
|
|
358
|
-
@classmethod
|
|
359
|
-
def get_navigation_timeout(cls, override: Optional[int] = None) -> int:
|
|
360
|
-
r"""Get navigation timeout with optional override."""
|
|
361
|
-
return BrowserConfig.get_navigation_timeout(override)
|
|
362
|
-
|
|
363
|
-
@classmethod
|
|
364
|
-
def get_network_idle_timeout(cls, override: Optional[int] = None) -> int:
|
|
365
|
-
r"""Get network idle timeout with optional override."""
|
|
366
|
-
return BrowserConfig.get_network_idle_timeout(override)
|
|
367
|
-
|
|
368
|
-
@classmethod
|
|
369
|
-
def get_max_scroll_amount(cls, override: Optional[int] = None) -> int:
|
|
370
|
-
r"""Get maximum scroll amount with optional override."""
|
|
371
|
-
return BrowserConfig.get_max_scroll_amount(override)
|
|
372
|
-
|
|
373
|
-
@classmethod
|
|
374
|
-
def get_screenshot_timeout(cls, override: Optional[int] = None) -> int:
|
|
375
|
-
r"""Get screenshot timeout with optional override."""
|
|
376
|
-
return BrowserConfig.get_screenshot_timeout(override)
|
|
377
|
-
|
|
378
|
-
@classmethod
|
|
379
|
-
def get_page_stability_timeout(cls, override: Optional[int] = None) -> int:
|
|
380
|
-
r"""Get page stability timeout with optional override."""
|
|
381
|
-
return BrowserConfig.get_page_stability_timeout(override)
|
|
382
|
-
|
|
383
|
-
@classmethod
|
|
384
|
-
def get_dom_content_loaded_timeout(
|
|
385
|
-
cls, override: Optional[int] = None
|
|
386
|
-
) -> int:
|
|
387
|
-
r"""Get DOM content loaded timeout with optional override."""
|
|
388
|
-
return BrowserConfig.get_dom_content_loaded_timeout(override)
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
# Backward compatibility aliases and convenience functions
|
|
392
|
-
StealthConfig = BrowserConfig
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
def get_browser_config():
|
|
396
|
-
r"""Get BrowserConfig class."""
|
|
397
|
-
return BrowserConfig
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
def get_stealth_config():
|
|
401
|
-
r"""Get StealthConfig class."""
|
|
402
|
-
return BrowserConfig
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
def get_timeout_config() -> Dict[str, int]:
|
|
406
|
-
r"""Get timeout configuration."""
|
|
407
|
-
return BrowserConfig.get_timeout_config()
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
def get_action_timeout(override: Optional[int] = None) -> int:
|
|
411
|
-
r"""Get action timeout with optional override."""
|
|
412
|
-
return BrowserConfig.get_action_timeout(override)
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
def get_short_timeout(override: Optional[int] = None) -> int:
|
|
416
|
-
r"""Get short timeout with optional override."""
|
|
417
|
-
return BrowserConfig.get_short_timeout(override)
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
def get_navigation_timeout(override: Optional[int] = None) -> int:
|
|
421
|
-
r"""Get navigation timeout with optional override."""
|
|
422
|
-
return BrowserConfig.get_navigation_timeout(override)
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
def get_network_idle_timeout(override: Optional[int] = None) -> int:
|
|
426
|
-
r"""Get network idle timeout with optional override."""
|
|
427
|
-
return BrowserConfig.get_network_idle_timeout(override)
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
def get_max_scroll_amount(override: Optional[int] = None) -> int:
|
|
431
|
-
r"""Get maximum scroll amount with optional override."""
|
|
432
|
-
return BrowserConfig.get_max_scroll_amount(override)
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
def get_screenshot_timeout(override: Optional[int] = None) -> int:
|
|
436
|
-
r"""Get screenshot timeout with optional override."""
|
|
437
|
-
return BrowserConfig.get_screenshot_timeout(override)
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
def get_page_stability_timeout(override: Optional[int] = None) -> int:
|
|
441
|
-
r"""Get page stability timeout with optional override."""
|
|
442
|
-
return BrowserConfig.get_page_stability_timeout(override)
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
def get_dom_content_loaded_timeout(override: Optional[int] = None) -> int:
|
|
446
|
-
r"""Get DOM content loaded timeout with optional override."""
|
|
447
|
-
return BrowserConfig.get_dom_content_loaded_timeout(override)
|
|
160
|
+
def update_browser_config(self, **kwargs) -> None:
|
|
161
|
+
"""Update browser configuration."""
|
|
162
|
+
for key, value in kwargs.items():
|
|
163
|
+
if hasattr(self.browser_config, key):
|
|
164
|
+
setattr(self.browser_config, key, value)
|
|
165
|
+
|
|
166
|
+
def update_toolkit_config(self, **kwargs) -> None:
|
|
167
|
+
"""Update toolkit configuration."""
|
|
168
|
+
for key, value in kwargs.items():
|
|
169
|
+
if hasattr(self.toolkit_config, key):
|
|
170
|
+
setattr(self.toolkit_config, key, value)
|