camel-ai 0.2.76a9__py3-none-any.whl → 0.2.76a13__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/mcp_agent.py +30 -27
- camel/loaders/__init__.py +11 -2
- camel/loaders/chunkr_reader.py +9 -0
- camel/memories/records.py +36 -0
- camel/messages/base.py +126 -33
- camel/parsers/__init__.py +18 -0
- camel/parsers/mcp_tool_call_parser.py +176 -0
- camel/societies/workforce/task_channel.py +43 -0
- camel/societies/workforce/workforce.py +433 -76
- camel/storages/vectordb_storages/oceanbase.py +0 -1
- camel/tasks/task.py +4 -3
- camel/toolkits/hybrid_browser_toolkit/installer.py +203 -0
- camel/toolkits/hybrid_browser_toolkit/ts/package-lock.json +5 -612
- camel/toolkits/hybrid_browser_toolkit/ts/package.json +0 -1
- camel/toolkits/hybrid_browser_toolkit/ws_wrapper.py +54 -131
- camel/toolkits/mcp_toolkit.py +2 -1
- camel/toolkits/video_analysis_toolkit.py +1 -1
- camel/types/enums.py +3 -0
- camel/utils/commons.py +13 -0
- camel/utils/token_counting.py +25 -17
- {camel_ai-0.2.76a9.dist-info → camel_ai-0.2.76a13.dist-info}/METADATA +47 -48
- {camel_ai-0.2.76a9.dist-info → camel_ai-0.2.76a13.dist-info}/RECORD +25 -23
- camel/loaders/pandas_reader.py +0 -368
- {camel_ai-0.2.76a9.dist-info → camel_ai-0.2.76a13.dist-info}/WHEEL +0 -0
- {camel_ai-0.2.76a9.dist-info → camel_ai-0.2.76a13.dist-info}/licenses/LICENSE +0 -0
|
@@ -34,9 +34,42 @@ else:
|
|
|
34
34
|
from camel.logger import get_logger
|
|
35
35
|
from camel.utils.tool_result import ToolResult
|
|
36
36
|
|
|
37
|
+
from .installer import check_and_install_dependencies
|
|
38
|
+
|
|
37
39
|
logger = get_logger(__name__)
|
|
38
40
|
|
|
39
41
|
|
|
42
|
+
def _create_memory_aware_error(base_msg: str) -> str:
|
|
43
|
+
import psutil
|
|
44
|
+
|
|
45
|
+
mem = psutil.virtual_memory()
|
|
46
|
+
if mem.available < 1024**3:
|
|
47
|
+
return (
|
|
48
|
+
f"{base_msg} "
|
|
49
|
+
f"(likely due to insufficient memory). "
|
|
50
|
+
f"Available memory: {mem.available / 1024**3:.2f}GB "
|
|
51
|
+
f"({mem.percent}% used)"
|
|
52
|
+
)
|
|
53
|
+
return base_msg
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
async def _cleanup_process_and_tasks(process, log_reader_task, ts_log_file):
|
|
57
|
+
if process:
|
|
58
|
+
with contextlib.suppress(ProcessLookupError, Exception):
|
|
59
|
+
process.kill()
|
|
60
|
+
with contextlib.suppress(Exception):
|
|
61
|
+
process.wait(timeout=2)
|
|
62
|
+
|
|
63
|
+
if log_reader_task and not log_reader_task.done():
|
|
64
|
+
log_reader_task.cancel()
|
|
65
|
+
with contextlib.suppress(asyncio.CancelledError):
|
|
66
|
+
await log_reader_task
|
|
67
|
+
|
|
68
|
+
if ts_log_file:
|
|
69
|
+
with contextlib.suppress(Exception):
|
|
70
|
+
ts_log_file.close()
|
|
71
|
+
|
|
72
|
+
|
|
40
73
|
def action_logger(func):
|
|
41
74
|
"""Decorator to add logging to action methods."""
|
|
42
75
|
|
|
@@ -192,69 +225,14 @@ class WebSocketBrowserWrapper:
|
|
|
192
225
|
"""Start the WebSocket server and connect to it."""
|
|
193
226
|
await self._cleanup_existing_processes()
|
|
194
227
|
|
|
228
|
+
npm_cmd, node_cmd = await check_and_install_dependencies(self.ts_dir)
|
|
229
|
+
|
|
195
230
|
import platform
|
|
196
231
|
|
|
197
232
|
use_shell = platform.system() == 'Windows'
|
|
198
|
-
npm_check = subprocess.run(
|
|
199
|
-
['npm', '--version'],
|
|
200
|
-
capture_output=True,
|
|
201
|
-
text=True,
|
|
202
|
-
shell=use_shell,
|
|
203
|
-
)
|
|
204
|
-
if npm_check.returncode != 0:
|
|
205
|
-
raise RuntimeError(
|
|
206
|
-
"npm is not installed or not in PATH. "
|
|
207
|
-
"Please install Node.js and npm from https://nodejs.org/ "
|
|
208
|
-
"to use the hybrid browser toolkit."
|
|
209
|
-
)
|
|
210
233
|
|
|
211
|
-
node_check = subprocess.run(
|
|
212
|
-
['node', '--version'],
|
|
213
|
-
capture_output=True,
|
|
214
|
-
text=True,
|
|
215
|
-
shell=use_shell,
|
|
216
|
-
)
|
|
217
|
-
if node_check.returncode != 0:
|
|
218
|
-
raise RuntimeError(
|
|
219
|
-
"node is not installed or not in PATH. "
|
|
220
|
-
"Please install Node.js from https://nodejs.org/ "
|
|
221
|
-
"to use the hybrid browser toolkit."
|
|
222
|
-
)
|
|
223
|
-
|
|
224
|
-
node_modules_path = os.path.join(self.ts_dir, 'node_modules')
|
|
225
|
-
if not os.path.exists(node_modules_path):
|
|
226
|
-
logger.warning("Node modules not found. Running npm install...")
|
|
227
|
-
install_result = subprocess.run(
|
|
228
|
-
['npm', 'install'],
|
|
229
|
-
cwd=self.ts_dir,
|
|
230
|
-
capture_output=True,
|
|
231
|
-
text=True,
|
|
232
|
-
shell=use_shell,
|
|
233
|
-
)
|
|
234
|
-
if install_result.returncode != 0:
|
|
235
|
-
logger.error(f"npm install failed: {install_result.stderr}")
|
|
236
|
-
raise RuntimeError(
|
|
237
|
-
f"Failed to install npm dependencies: {install_result.stderr}\n" # noqa:E501
|
|
238
|
-
f"Please run 'npm install' in {self.ts_dir} manually."
|
|
239
|
-
)
|
|
240
|
-
logger.info("npm dependencies installed successfully")
|
|
241
|
-
|
|
242
|
-
build_result = subprocess.run(
|
|
243
|
-
['npm', 'run', 'build'],
|
|
244
|
-
cwd=self.ts_dir,
|
|
245
|
-
capture_output=True,
|
|
246
|
-
text=True,
|
|
247
|
-
shell=use_shell,
|
|
248
|
-
)
|
|
249
|
-
if build_result.returncode != 0:
|
|
250
|
-
logger.error(f"TypeScript build failed: {build_result.stderr}")
|
|
251
|
-
raise RuntimeError(
|
|
252
|
-
f"TypeScript build failed: {build_result.stderr}"
|
|
253
|
-
)
|
|
254
|
-
|
|
255
|
-
# use_shell already defined above
|
|
256
234
|
self.process = subprocess.Popen(
|
|
257
|
-
[
|
|
235
|
+
[node_cmd, 'websocket-server.js'],
|
|
258
236
|
cwd=self.ts_dir,
|
|
259
237
|
stdout=subprocess.PIPE,
|
|
260
238
|
stderr=subprocess.STDOUT,
|
|
@@ -286,32 +264,17 @@ class WebSocketBrowserWrapper:
|
|
|
286
264
|
server_ready = False
|
|
287
265
|
|
|
288
266
|
if not server_ready:
|
|
289
|
-
|
|
290
|
-
self.process
|
|
291
|
-
|
|
292
|
-
self
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
with contextlib.suppress(asyncio.CancelledError):
|
|
296
|
-
await self._log_reader_task
|
|
297
|
-
if getattr(self, 'ts_log_file', None):
|
|
298
|
-
with contextlib.suppress(Exception):
|
|
299
|
-
self.ts_log_file.close()
|
|
300
|
-
self.ts_log_file = None
|
|
267
|
+
await _cleanup_process_and_tasks(
|
|
268
|
+
self.process,
|
|
269
|
+
self._log_reader_task,
|
|
270
|
+
getattr(self, 'ts_log_file', None),
|
|
271
|
+
)
|
|
272
|
+
self.ts_log_file = None
|
|
301
273
|
self.process = None
|
|
302
274
|
|
|
303
|
-
error_msg =
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
mem = psutil.virtual_memory()
|
|
307
|
-
if mem.available < 1024**3:
|
|
308
|
-
error_msg = (
|
|
309
|
-
f"WebSocket server failed to start"
|
|
310
|
-
f"(likely due to insufficient memory). "
|
|
311
|
-
f"Available memory: {mem.available / 1024**3:.2f}GB "
|
|
312
|
-
f"({mem.percent}% used)"
|
|
313
|
-
)
|
|
314
|
-
|
|
275
|
+
error_msg = _create_memory_aware_error(
|
|
276
|
+
"WebSocket server failed to start within timeout"
|
|
277
|
+
)
|
|
315
278
|
raise RuntimeError(error_msg)
|
|
316
279
|
|
|
317
280
|
max_retries = 3
|
|
@@ -367,35 +330,17 @@ class WebSocketBrowserWrapper:
|
|
|
367
330
|
break
|
|
368
331
|
|
|
369
332
|
if not self.websocket:
|
|
370
|
-
|
|
371
|
-
self.process
|
|
372
|
-
|
|
373
|
-
self
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
with contextlib.suppress(asyncio.CancelledError):
|
|
377
|
-
await self._log_reader_task
|
|
378
|
-
if getattr(self, 'ts_log_file', None):
|
|
379
|
-
with contextlib.suppress(Exception):
|
|
380
|
-
self.ts_log_file.close()
|
|
381
|
-
self.ts_log_file = None
|
|
333
|
+
await _cleanup_process_and_tasks(
|
|
334
|
+
self.process,
|
|
335
|
+
self._log_reader_task,
|
|
336
|
+
getattr(self, 'ts_log_file', None),
|
|
337
|
+
)
|
|
338
|
+
self.ts_log_file = None
|
|
382
339
|
self.process = None
|
|
383
340
|
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
mem = psutil.virtual_memory()
|
|
387
|
-
|
|
388
|
-
error_msg = (
|
|
341
|
+
error_msg = _create_memory_aware_error(
|
|
389
342
|
"Failed to connect to WebSocket server after multiple attempts"
|
|
390
343
|
)
|
|
391
|
-
if mem.available < 1024**3:
|
|
392
|
-
error_msg = (
|
|
393
|
-
f"Failed to connect to WebSocket server "
|
|
394
|
-
f"(likely due to insufficient memory). "
|
|
395
|
-
f"Available memory: {mem.available / 1024**3:.2f}GB "
|
|
396
|
-
f"({mem.percent}% used)"
|
|
397
|
-
)
|
|
398
|
-
|
|
399
344
|
raise RuntimeError(error_msg)
|
|
400
345
|
|
|
401
346
|
self._receive_task = asyncio.create_task(self._receive_loop())
|
|
@@ -601,18 +546,7 @@ class WebSocketBrowserWrapper:
|
|
|
601
546
|
async def _ensure_connection(self) -> None:
|
|
602
547
|
"""Ensure WebSocket connection is alive."""
|
|
603
548
|
if not self.websocket:
|
|
604
|
-
error_msg = "WebSocket not connected"
|
|
605
|
-
import psutil
|
|
606
|
-
|
|
607
|
-
mem = psutil.virtual_memory()
|
|
608
|
-
if mem.available < 1024**3:
|
|
609
|
-
error_msg = (
|
|
610
|
-
f"WebSocket not connected "
|
|
611
|
-
f"(likely due to insufficient memory). "
|
|
612
|
-
f"Available memory: {mem.available / 1024**3:.2f}GB "
|
|
613
|
-
f"({mem.percent}% used)"
|
|
614
|
-
)
|
|
615
|
-
|
|
549
|
+
error_msg = _create_memory_aware_error("WebSocket not connected")
|
|
616
550
|
raise RuntimeError(error_msg)
|
|
617
551
|
|
|
618
552
|
# Check if connection is still alive
|
|
@@ -624,18 +558,7 @@ class WebSocketBrowserWrapper:
|
|
|
624
558
|
logger.warning(f"WebSocket ping failed: {e}")
|
|
625
559
|
self.websocket = None
|
|
626
560
|
|
|
627
|
-
error_msg = "WebSocket connection lost"
|
|
628
|
-
import psutil
|
|
629
|
-
|
|
630
|
-
mem = psutil.virtual_memory()
|
|
631
|
-
if mem.available < 1024**3:
|
|
632
|
-
error_msg = (
|
|
633
|
-
f"WebSocket connection lost "
|
|
634
|
-
f"(likely due to insufficient memory). "
|
|
635
|
-
f"Available memory: {mem.available / 1024**3:.2f}GB "
|
|
636
|
-
f"({mem.percent}% used)"
|
|
637
|
-
)
|
|
638
|
-
|
|
561
|
+
error_msg = _create_memory_aware_error("WebSocket connection lost")
|
|
639
562
|
raise RuntimeError(error_msg)
|
|
640
563
|
|
|
641
564
|
async def _send_command(
|
camel/toolkits/mcp_toolkit.py
CHANGED
|
@@ -21,7 +21,8 @@ from typing import Any, Dict, List, Optional
|
|
|
21
21
|
from typing_extensions import TypeGuard
|
|
22
22
|
|
|
23
23
|
from camel.logger import get_logger
|
|
24
|
-
from camel.toolkits import BaseToolkit
|
|
24
|
+
from camel.toolkits.base import BaseToolkit
|
|
25
|
+
from camel.toolkits.function_tool import FunctionTool
|
|
25
26
|
from camel.utils.commons import run_async
|
|
26
27
|
from camel.utils.mcp_client import MCPClient, create_mcp_client
|
|
27
28
|
|
|
@@ -600,7 +600,7 @@ class VideoAnalysisToolkit(BaseToolkit):
|
|
|
600
600
|
msg = BaseMessage.make_user_message(
|
|
601
601
|
role_name="User",
|
|
602
602
|
content=prompt,
|
|
603
|
-
image_list=video_frames,
|
|
603
|
+
image_list=video_frames, # type: ignore[arg-type]
|
|
604
604
|
)
|
|
605
605
|
# Reset the agent to clear previous state
|
|
606
606
|
self.vl_agent.reset()
|
camel/types/enums.py
CHANGED
|
@@ -207,6 +207,7 @@ class ModelType(UnifiedModelType, Enum):
|
|
|
207
207
|
CLAUDE_3_5_SONNET = "claude-3-5-sonnet-latest"
|
|
208
208
|
CLAUDE_3_5_HAIKU = "claude-3-5-haiku-latest"
|
|
209
209
|
CLAUDE_3_7_SONNET = "claude-3-7-sonnet-latest"
|
|
210
|
+
CLAUDE_4_5_SONNET = "claude-4-5-sonnet-latest"
|
|
210
211
|
CLAUDE_SONNET_4 = "claude-sonnet-4-20250514"
|
|
211
212
|
CLAUDE_OPUS_4 = "claude-opus-4-20250514"
|
|
212
213
|
CLAUDE_OPUS_4_1 = "claude-opus-4-1-20250805"
|
|
@@ -641,6 +642,7 @@ class ModelType(UnifiedModelType, Enum):
|
|
|
641
642
|
ModelType.CLAUDE_3_5_SONNET,
|
|
642
643
|
ModelType.CLAUDE_3_5_HAIKU,
|
|
643
644
|
ModelType.CLAUDE_3_7_SONNET,
|
|
645
|
+
ModelType.CLAUDE_4_5_SONNET,
|
|
644
646
|
ModelType.CLAUDE_SONNET_4,
|
|
645
647
|
ModelType.CLAUDE_OPUS_4,
|
|
646
648
|
ModelType.CLAUDE_OPUS_4_1,
|
|
@@ -1421,6 +1423,7 @@ class ModelType(UnifiedModelType, Enum):
|
|
|
1421
1423
|
ModelType.CLAUDE_3_5_SONNET,
|
|
1422
1424
|
ModelType.CLAUDE_3_5_HAIKU,
|
|
1423
1425
|
ModelType.CLAUDE_3_7_SONNET,
|
|
1426
|
+
ModelType.CLAUDE_4_5_SONNET,
|
|
1424
1427
|
ModelType.CLAUDE_SONNET_4,
|
|
1425
1428
|
ModelType.CLAUDE_OPUS_4,
|
|
1426
1429
|
ModelType.CLAUDE_OPUS_4_1,
|
camel/utils/commons.py
CHANGED
|
@@ -1015,6 +1015,19 @@ def with_timeout(timeout=None):
|
|
|
1015
1015
|
if effective_timeout is None:
|
|
1016
1016
|
return func(*args, **kwargs)
|
|
1017
1017
|
|
|
1018
|
+
# If current thread has a running asyncio event loop, avoid
|
|
1019
|
+
# switching threads to preserve asyncio context (e.g., for
|
|
1020
|
+
# asyncio.create_task). Execute inline without enforcing a
|
|
1021
|
+
# sync timeout to keep event loop semantics intact.
|
|
1022
|
+
try:
|
|
1023
|
+
asyncio.get_running_loop()
|
|
1024
|
+
loop_running = True
|
|
1025
|
+
except RuntimeError:
|
|
1026
|
+
loop_running = False
|
|
1027
|
+
|
|
1028
|
+
if loop_running:
|
|
1029
|
+
return func(*args, **kwargs)
|
|
1030
|
+
|
|
1018
1031
|
# Container to hold the result of the function call
|
|
1019
1032
|
result_container = []
|
|
1020
1033
|
|
camel/utils/token_counting.py
CHANGED
|
@@ -195,24 +195,32 @@ class OpenAITokenCounter(BaseTokenCounter):
|
|
|
195
195
|
image_str: str = item["image_url"]["url"]
|
|
196
196
|
detail = item["image_url"]["detail"]
|
|
197
197
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
#
|
|
202
|
-
|
|
203
|
-
|
|
198
|
+
# Only count tokens for base64 encoded images
|
|
199
|
+
# For URLs, we cannot reliably determine token count without fetching the image
|
|
200
|
+
if image_str.startswith("data:image"):
|
|
201
|
+
# Base64 encoded image
|
|
202
|
+
image_prefix_format = "data:image/{};base64,"
|
|
203
|
+
image_prefix: Optional[str] = None
|
|
204
|
+
for image_type in list(OpenAIImageType):
|
|
205
|
+
# Find the correct image format
|
|
206
|
+
image_prefix = image_prefix_format.format(
|
|
207
|
+
image_type.value
|
|
208
|
+
)
|
|
209
|
+
if image_prefix in image_str:
|
|
210
|
+
break
|
|
211
|
+
assert isinstance(image_prefix, str)
|
|
212
|
+
encoded_image = image_str.split(image_prefix)[
|
|
213
|
+
1
|
|
214
|
+
]
|
|
215
|
+
image_bytes = BytesIO(
|
|
216
|
+
base64.b64decode(encoded_image)
|
|
204
217
|
)
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
)
|
|
212
|
-
image = Image.open(image_bytes)
|
|
213
|
-
num_tokens += self._count_tokens_from_image(
|
|
214
|
-
image, OpenAIVisionDetailType(detail)
|
|
215
|
-
)
|
|
218
|
+
image = Image.open(image_bytes)
|
|
219
|
+
num_tokens += self._count_tokens_from_image(
|
|
220
|
+
image, OpenAIVisionDetailType(detail)
|
|
221
|
+
)
|
|
222
|
+
# Note: For regular URLs, token count cannot be determined without fetching the image
|
|
223
|
+
# The actual token usage will be reported by the API response
|
|
216
224
|
if key == "name":
|
|
217
225
|
num_tokens += self.tokens_per_name
|
|
218
226
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: camel-ai
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.76a13
|
|
4
4
|
Summary: Communicative Agents for AI Society Study
|
|
5
5
|
Project-URL: Homepage, https://www.camel-ai.org/
|
|
6
6
|
Project-URL: Repository, https://github.com/camel-ai/camel
|
|
@@ -20,6 +20,7 @@ Requires-Dist: pillow<11.0.0,>=10.1.0
|
|
|
20
20
|
Requires-Dist: psutil<6,>=5.9.8
|
|
21
21
|
Requires-Dist: pydantic>=2.10.6
|
|
22
22
|
Requires-Dist: tiktoken<0.8,>=0.7.0
|
|
23
|
+
Requires-Dist: websockets<15.1,>=13.0
|
|
23
24
|
Provides-Extra: all
|
|
24
25
|
Requires-Dist: aci-sdk>=1.0.0b1; extra == 'all'
|
|
25
26
|
Requires-Dist: agentops<0.4,>=0.3.21; extra == 'all'
|
|
@@ -86,8 +87,7 @@ Requires-Dist: numpy<=2.2,>=1.2; extra == 'all'
|
|
|
86
87
|
Requires-Dist: onnxruntime<=1.19.2; extra == 'all'
|
|
87
88
|
Requires-Dist: openapi-spec-validator<0.8,>=0.7.1; extra == 'all'
|
|
88
89
|
Requires-Dist: openpyxl>=3.1.5; extra == 'all'
|
|
89
|
-
Requires-Dist: pandas
|
|
90
|
-
Requires-Dist: pandasai<3,>=2.3.0; extra == 'all'
|
|
90
|
+
Requires-Dist: pandas>=2; extra == 'all'
|
|
91
91
|
Requires-Dist: pgvector<0.3,>=0.2.4; extra == 'all'
|
|
92
92
|
Requires-Dist: playwright>=1.50.0; extra == 'all'
|
|
93
93
|
Requires-Dist: prance<24,>=23.6.21.0; extra == 'all'
|
|
@@ -165,7 +165,7 @@ Requires-Dist: datacommons<2,>=1.4.3; extra == 'data-tools'
|
|
|
165
165
|
Requires-Dist: math-verify<0.8,>=0.7.0; extra == 'data-tools'
|
|
166
166
|
Requires-Dist: networkx<4,>=3.4.2; extra == 'data-tools'
|
|
167
167
|
Requires-Dist: numpy<=2.2,>=1.2; extra == 'data-tools'
|
|
168
|
-
Requires-Dist: pandas
|
|
168
|
+
Requires-Dist: pandas>=2; extra == 'data-tools'
|
|
169
169
|
Requires-Dist: rouge<2,>=1.0.1; extra == 'data-tools'
|
|
170
170
|
Requires-Dist: stripe<12,>=11.3.0; extra == 'data-tools'
|
|
171
171
|
Requires-Dist: textblob<0.18,>=0.17.1; extra == 'data-tools'
|
|
@@ -219,7 +219,6 @@ Requires-Dist: numpy<=2.2,>=1.2; extra == 'document-tools'
|
|
|
219
219
|
Requires-Dist: onnxruntime<=1.19.2; extra == 'document-tools'
|
|
220
220
|
Requires-Dist: openapi-spec-validator<0.8,>=0.7.1; extra == 'document-tools'
|
|
221
221
|
Requires-Dist: openpyxl>=3.1.5; extra == 'document-tools'
|
|
222
|
-
Requires-Dist: pandasai<3,>=2.3.0; extra == 'document-tools'
|
|
223
222
|
Requires-Dist: prance<24,>=23.6.21.0; extra == 'document-tools'
|
|
224
223
|
Requires-Dist: pylatex>=1.4.2; extra == 'document-tools'
|
|
225
224
|
Requires-Dist: pymupdf<2,>=1.22.5; extra == 'document-tools'
|
|
@@ -235,6 +234,8 @@ Requires-Dist: docx>=0.2.4; extra == 'eigent'
|
|
|
235
234
|
Requires-Dist: exa-py<2,>=1.10.0; extra == 'eigent'
|
|
236
235
|
Requires-Dist: ffmpeg-python<0.3,>=0.2.0; extra == 'eigent'
|
|
237
236
|
Requires-Dist: google-api-python-client==2.166.0; extra == 'eigent'
|
|
237
|
+
Requires-Dist: google-auth-httplib2==0.2.0; extra == 'eigent'
|
|
238
|
+
Requires-Dist: google-auth-oauthlib==1.2.1; extra == 'eigent'
|
|
238
239
|
Requires-Dist: imageio[pyav]<3,>=2.34.2; extra == 'eigent'
|
|
239
240
|
Requires-Dist: markitdown[all]>=0.1.1; extra == 'eigent'
|
|
240
241
|
Requires-Dist: mcp-server-fetch==2025.1.17; extra == 'eigent'
|
|
@@ -242,7 +243,7 @@ Requires-Dist: mcp-simple-arxiv==0.2.2; extra == 'eigent'
|
|
|
242
243
|
Requires-Dist: numpy<=2.2,>=1.2; extra == 'eigent'
|
|
243
244
|
Requires-Dist: onnxruntime<=1.19.2; extra == 'eigent'
|
|
244
245
|
Requires-Dist: openpyxl>=3.1.5; extra == 'eigent'
|
|
245
|
-
Requires-Dist: pandas
|
|
246
|
+
Requires-Dist: pandas>=2; extra == 'eigent'
|
|
246
247
|
Requires-Dist: pydub<0.26,>=0.25.1; extra == 'eigent'
|
|
247
248
|
Requires-Dist: pylatex>=1.4.2; extra == 'eigent'
|
|
248
249
|
Requires-Dist: pytesseract>=0.3.13; extra == 'eigent'
|
|
@@ -302,8 +303,7 @@ Requires-Dist: numpy<=2.2,>=1.2; extra == 'owl'
|
|
|
302
303
|
Requires-Dist: onnxruntime<=1.19.2; extra == 'owl'
|
|
303
304
|
Requires-Dist: openapi-spec-validator<0.8,>=0.7.1; extra == 'owl'
|
|
304
305
|
Requires-Dist: openpyxl>=3.1.5; extra == 'owl'
|
|
305
|
-
Requires-Dist: pandas
|
|
306
|
-
Requires-Dist: pandasai<3,>=2.3.0; extra == 'owl'
|
|
306
|
+
Requires-Dist: pandas>=2; extra == 'owl'
|
|
307
307
|
Requires-Dist: playwright>=1.50.0; extra == 'owl'
|
|
308
308
|
Requires-Dist: prance<24,>=23.6.21.0; extra == 'owl'
|
|
309
309
|
Requires-Dist: pyautogui<0.10,>=0.9.54; extra == 'owl'
|
|
@@ -340,7 +340,6 @@ Requires-Dist: google-genai>=1.13.0; extra == 'rag'
|
|
|
340
340
|
Requires-Dist: nebula3-python==3.8.2; extra == 'rag'
|
|
341
341
|
Requires-Dist: neo4j<6,>=5.18.0; extra == 'rag'
|
|
342
342
|
Requires-Dist: numpy<=2.2,>=1.2; extra == 'rag'
|
|
343
|
-
Requires-Dist: pandasai<3,>=2.3.0; extra == 'rag'
|
|
344
343
|
Requires-Dist: protobuf>=6.0.0; extra == 'rag'
|
|
345
344
|
Requires-Dist: pymilvus<3,>=2.4.0; extra == 'rag'
|
|
346
345
|
Requires-Dist: pyobvector>=0.1.18; extra == 'rag'
|
|
@@ -612,7 +611,7 @@ We are a community-driven research collective comprising over 100 researchers de
|
|
|
612
611
|
</div>
|
|
613
612
|
|
|
614
613
|
<div align="center">
|
|
615
|
-
<a href="https://docs.camel-ai.org/cookbooks/advanced_features/agents_with_rag
|
|
614
|
+
<a href="https://docs.camel-ai.org/cookbooks/advanced_features/agents_with_rag">
|
|
616
615
|
<img src="docs/images/rag_pipeline.png" alt="RAG Pipeline">
|
|
617
616
|
</a>
|
|
618
617
|
</div>
|
|
@@ -698,10 +697,10 @@ We provide a [**
|
|
701
|
+
- **[Creating Your First Agent Society](https://docs.camel-ai.org/cookbooks/basic_concepts/create_your_first_agents_society)**
|
|
702
|
+
- **[Embodied Agents](https://docs.camel-ai.org/cookbooks/advanced_features/embodied_agents)**
|
|
703
|
+
- **[Critic Agents](https://docs.camel-ai.org/cookbooks/advanced_features/critic_agents_and_tree_search)**
|
|
705
704
|
|
|
706
705
|
### Seeking Help
|
|
707
706
|
|
|
@@ -722,19 +721,19 @@ Core components and utilities to build, operate, and enhance CAMEL-AI agents and
|
|
|
722
721
|
|
|
723
722
|
| Module | Description |
|
|
724
723
|
|:---|:---|
|
|
725
|
-
| **[Agents](https://docs.camel-ai.org/key_modules/agents
|
|
726
|
-
| **[Agent Societies](https://docs.camel-ai.org/key_modules/society
|
|
727
|
-
| **[Data Generation](https://docs.camel-ai.org/key_modules/datagen
|
|
728
|
-
| **[Models](https://docs.camel-ai.org/key_modules/models
|
|
729
|
-
| **[Tools](https://docs.camel-ai.org/key_modules/tools
|
|
730
|
-
| **[Memory](https://docs.camel-ai.org/key_modules/memory
|
|
731
|
-
| **[Storage](https://docs.camel-ai.org/key_modules/storages
|
|
724
|
+
| **[Agents](https://docs.camel-ai.org/key_modules/agents)** | Core agent architectures and behaviors for autonomous operation. |
|
|
725
|
+
| **[Agent Societies](https://docs.camel-ai.org/key_modules/society)** | Components for building and managing multi-agent systems and collaboration. |
|
|
726
|
+
| **[Data Generation](https://docs.camel-ai.org/key_modules/datagen)** | Tools and methods for synthetic data creation and augmentation. |
|
|
727
|
+
| **[Models](https://docs.camel-ai.org/key_modules/models)** | Model architectures and customization options for agent intelligence. |
|
|
728
|
+
| **[Tools](https://docs.camel-ai.org/key_modules/tools)** | Tools integration for specialized agent tasks. |
|
|
729
|
+
| **[Memory](https://docs.camel-ai.org/key_modules/memory)** | Memory storage and retrieval mechanisms for agent state management. |
|
|
730
|
+
| **[Storage](https://docs.camel-ai.org/key_modules/storages)** | Persistent storage solutions for agent data and states. |
|
|
732
731
|
| **[Benchmarks](https://github.com/camel-ai/camel/tree/master/camel/benchmarks)** | Performance evaluation and testing frameworks. |
|
|
733
|
-
| **[Interpreters](https://docs.camel-ai.org/key_modules/interpreters
|
|
734
|
-
| **[Data Loaders](https://docs.camel-ai.org/key_modules/loaders
|
|
735
|
-
| **[Retrievers](https://docs.camel-ai.org/key_modules/retrievers
|
|
732
|
+
| **[Interpreters](https://docs.camel-ai.org/key_modules/interpreters)** | Code and command interpretation capabilities. |
|
|
733
|
+
| **[Data Loaders](https://docs.camel-ai.org/key_modules/loaders)** | Data ingestion and preprocessing tools. |
|
|
734
|
+
| **[Retrievers](https://docs.camel-ai.org/key_modules/retrievers)** | Knowledge retrieval and RAG components. |
|
|
736
735
|
| **[Runtime](https://github.com/camel-ai/camel/tree/master/camel/runtime)** | Execution environment and process management. |
|
|
737
|
-
| **[Human-in-the-Loop](https://docs.camel-ai.org/cookbooks/advanced_features/agents_with_human_in_loop_and_tool_approval
|
|
736
|
+
| **[Human-in-the-Loop](https://docs.camel-ai.org/cookbooks/advanced_features/agents_with_human_in_loop_and_tool_approval)** | Interactive components for human oversight and intervention. |
|
|
738
737
|
---
|
|
739
738
|
|
|
740
739
|
## Research
|
|
@@ -795,7 +794,7 @@ We believe that studying these agents on a large scale offers valuable insights
|
|
|
795
794
|
|
|
796
795
|
### 1. Utilize Various LLMs as Backends
|
|
797
796
|
|
|
798
|
-
For more details, please see our [`Models Documentation`](https://docs.camel-ai.org/key_modules/models
|
|
797
|
+
For more details, please see our [`Models Documentation`](https://docs.camel-ai.org/key_modules/models#).
|
|
799
798
|
|
|
800
799
|
> **Data (Hosted on Hugging Face)**
|
|
801
800
|
|
|
@@ -824,42 +823,42 @@ Practical guides and tutorials for implementing specific functionalities in CAME
|
|
|
824
823
|
### 1. Basic Concepts
|
|
825
824
|
| Cookbook | Description |
|
|
826
825
|
|:---|:---|
|
|
827
|
-
| **[Creating Your First Agent](https://docs.camel-ai.org/cookbooks/basic_concepts/create_your_first_agent
|
|
828
|
-
| **[Creating Your First Agent Society](https://docs.camel-ai.org/cookbooks/basic_concepts/create_your_first_agents_society
|
|
829
|
-
| **[Message Cookbook](https://docs.camel-ai.org/cookbooks/basic_concepts/agents_message
|
|
826
|
+
| **[Creating Your First Agent](https://docs.camel-ai.org/cookbooks/basic_concepts/create_your_first_agent)** | A step-by-step guide to building your first agent. |
|
|
827
|
+
| **[Creating Your First Agent Society](https://docs.camel-ai.org/cookbooks/basic_concepts/create_your_first_agents_society)** | Learn to build a collaborative society of agents. |
|
|
828
|
+
| **[Message Cookbook](https://docs.camel-ai.org/cookbooks/basic_concepts/agents_message)** | Best practices for message handling in agents. |
|
|
830
829
|
|
|
831
830
|
### 2. Advanced Features
|
|
832
831
|
| Cookbook | Description |
|
|
833
832
|
|:---|:---|
|
|
834
|
-
| **[Tools Cookbook](https://docs.camel-ai.org/cookbooks/advanced_features/agents_with_tools
|
|
835
|
-
| **[Memory Cookbook](https://docs.camel-ai.org/cookbooks/advanced_features/agents_with_memory
|
|
836
|
-
| **[RAG Cookbook](https://docs.camel-ai.org/cookbooks/advanced_features/agents_with_rag
|
|
837
|
-
| **[Graph RAG Cookbook](https://docs.camel-ai.org/cookbooks/advanced_features/agents_with_graph_rag
|
|
838
|
-
| **[Track CAMEL Agents with AgentOps](https://docs.camel-ai.org/cookbooks/advanced_features/agents_tracking
|
|
833
|
+
| **[Tools Cookbook](https://docs.camel-ai.org/cookbooks/advanced_features/agents_with_tools)** | Integrating tools for enhanced functionality. |
|
|
834
|
+
| **[Memory Cookbook](https://docs.camel-ai.org/cookbooks/advanced_features/agents_with_memory)** | Implementing memory systems in agents. |
|
|
835
|
+
| **[RAG Cookbook](https://docs.camel-ai.org/cookbooks/advanced_features/agents_with_rag)** | Recipes for Retrieval-Augmented Generation. |
|
|
836
|
+
| **[Graph RAG Cookbook](https://docs.camel-ai.org/cookbooks/advanced_features/agents_with_graph_rag)** | Leveraging knowledge graphs with RAG. |
|
|
837
|
+
| **[Track CAMEL Agents with AgentOps](https://docs.camel-ai.org/cookbooks/advanced_features/agents_tracking)** | Tools for tracking and managing agents in operations. |
|
|
839
838
|
|
|
840
839
|
### 3. Model Training & Data Generation
|
|
841
840
|
| Cookbook | Description |
|
|
842
841
|
|:---|:---|
|
|
843
|
-
| **[Data Generation with CAMEL and Finetuning with Unsloth](https://docs.camel-ai.org/cookbooks/data_generation/sft_data_generation_and_unsloth_finetuning_Qwen2_5_7B
|
|
844
|
-
| **[Data Gen with Real Function Calls and Hermes Format](https://docs.camel-ai.org/cookbooks/data_generation/data_gen_with_real_function_calls_and_hermes_format
|
|
845
|
-
| **[CoT Data Generation and Upload Data to Huggingface](https://docs.camel-ai.org/cookbooks/data_generation/distill_math_reasoning_data_from_deepseek_r1
|
|
846
|
-
| **[CoT Data Generation and SFT Qwen with Unsolth](https://docs.camel-ai.org/cookbooks/data_generation/cot_data_gen_sft_qwen_unsolth_upload_huggingface
|
|
842
|
+
| **[Data Generation with CAMEL and Finetuning with Unsloth](https://docs.camel-ai.org/cookbooks/data_generation/sft_data_generation_and_unsloth_finetuning_Qwen2_5_7B)** | Learn how to generate data with CAMEL and fine-tune models effectively with Unsloth. |
|
|
843
|
+
| **[Data Gen with Real Function Calls and Hermes Format](https://docs.camel-ai.org/cookbooks/data_generation/data_gen_with_real_function_calls_and_hermes_format)** | Explore how to generate data with real function calls and the Hermes format. |
|
|
844
|
+
| **[CoT Data Generation and Upload Data to Huggingface](https://docs.camel-ai.org/cookbooks/data_generation/distill_math_reasoning_data_from_deepseek_r1)** | Uncover how to generate CoT data with CAMEL and seamlessly upload it to Huggingface. |
|
|
845
|
+
| **[CoT Data Generation and SFT Qwen with Unsolth](https://docs.camel-ai.org/cookbooks/data_generation/cot_data_gen_sft_qwen_unsolth_upload_huggingface)** | Discover how to generate CoT data using CAMEL and SFT Qwen with Unsolth, and seamlessly upload your data and model to Huggingface. |
|
|
847
846
|
|
|
848
847
|
### 4. Multi-Agent Systems & Applications
|
|
849
848
|
| Cookbook | Description |
|
|
850
849
|
|:---|:---|
|
|
851
|
-
| **[Role-Playing Scraper for Report & Knowledge Graph Generation](https://docs.camel-ai.org/cookbooks/applications/roleplaying_scraper
|
|
852
|
-
| **[Create A Hackathon Judge Committee with Workforce](https://docs.camel-ai.org/cookbooks/multi_agent_society/workforce_judge_committee
|
|
853
|
-
| **[Dynamic Knowledge Graph Role-Playing: Multi-Agent System with dynamic, temporally-aware knowledge graphs](https://docs.camel-ai.org/cookbooks/
|
|
854
|
-
| **[Customer Service Discord Bot with Agentic RAG](https://docs.camel-ai.org/cookbooks/applications/customer_service_Discord_bot_using_SambaNova_with_agentic_RAG
|
|
855
|
-
| **[Customer Service Discord Bot with Local Model](https://docs.camel-ai.org/cookbooks/applications/customer_service_Discord_bot_using_local_model_with_agentic_RAG
|
|
850
|
+
| **[Role-Playing Scraper for Report & Knowledge Graph Generation](https://docs.camel-ai.org/cookbooks/applications/roleplaying_scraper)** | Create role-playing agents for data scraping and reporting. |
|
|
851
|
+
| **[Create A Hackathon Judge Committee with Workforce](https://docs.camel-ai.org/cookbooks/multi_agent_society/workforce_judge_committee)** | Building a team of agents for collaborative judging. |
|
|
852
|
+
| **[Dynamic Knowledge Graph Role-Playing: Multi-Agent System with dynamic, temporally-aware knowledge graphs](https://docs.camel-ai.org/cookbooks/advanced_features/agents_with_dkg)** | Builds dynamic, temporally-aware knowledge graphs for financial applications using a multi-agent system. It processes financial reports, news articles, and research papers to help traders analyze data, identify relationships, and uncover market insights. The system also utilizes diverse and optional element node deduplication techniques to ensure data integrity and optimize graph structure for financial decision-making. |
|
|
853
|
+
| **[Customer Service Discord Bot with Agentic RAG](https://docs.camel-ai.org/cookbooks/applications/customer_service_Discord_bot_using_SambaNova_with_agentic_RAG)** | Learn how to build a robust customer service bot for Discord using Agentic RAG. |
|
|
854
|
+
| **[Customer Service Discord Bot with Local Model](https://docs.camel-ai.org/cookbooks/applications/customer_service_Discord_bot_using_local_model_with_agentic_RAG)** | Learn how to build a robust customer service bot for Discord using Agentic RAG which supports local deployment. |
|
|
856
855
|
|
|
857
856
|
### 5. Data Processing
|
|
858
857
|
| Cookbook | Description |
|
|
859
858
|
|:---|:---|
|
|
860
|
-
| **[Video Analysis](https://docs.camel-ai.org/cookbooks/data_processing/video_analysis
|
|
861
|
-
| **[3 Ways to Ingest Data from Websites with Firecrawl](https://docs.camel-ai.org/cookbooks/data_processing/ingest_data_from_websites_with_Firecrawl
|
|
862
|
-
| **[Create AI Agents that work with your PDFs](https://docs.camel-ai.org/cookbooks/data_processing/agent_with_chunkr_for_pdf_parsing
|
|
859
|
+
| **[Video Analysis](https://docs.camel-ai.org/cookbooks/data_processing/video_analysis)** | Techniques for agents in video data analysis. |
|
|
860
|
+
| **[3 Ways to Ingest Data from Websites with Firecrawl](https://docs.camel-ai.org/cookbooks/data_processing/ingest_data_from_websites_with_Firecrawl)** | Explore three methods for extracting and processing data from websites using Firecrawl. |
|
|
861
|
+
| **[Create AI Agents that work with your PDFs](https://docs.camel-ai.org/cookbooks/data_processing/agent_with_chunkr_for_pdf_parsing)** | Learn how to create AI agents that work with your PDFs using Chunkr and Mistral AI. |
|
|
863
862
|
|
|
864
863
|
<br>
|
|
865
864
|
|
|
@@ -1000,7 +999,7 @@ The source code is licensed under Apache 2.0.
|
|
|
1000
999
|
<br>
|
|
1001
1000
|
|
|
1002
1001
|
[docs-image]: https://img.shields.io/badge/Documentation-EB3ECC
|
|
1003
|
-
[docs-url]: https://camel-ai.github.io/camel/index
|
|
1002
|
+
[docs-url]: https://camel-ai.github.io/camel/index
|
|
1004
1003
|
[star-image]: https://img.shields.io/github/stars/camel-ai/camel?label=stars&logo=github&color=brightgreen
|
|
1005
1004
|
[star-url]: https://github.com/camel-ai/camel/stargazers
|
|
1006
1005
|
[package-license-image]: https://img.shields.io/badge/License-Apache_2.0-blue.svg
|
|
@@ -1024,4 +1023,4 @@ The source code is licensed under Apache 2.0.
|
|
|
1024
1023
|
[package-download-url]: https://pypi.org/project/camel-ai
|
|
1025
1024
|
[join-us]:https://eigent-ai.notion.site/eigent-ai-careers
|
|
1026
1025
|
[join-us-image]:https://img.shields.io/badge/Join%20Us-yellow?style=plastic
|
|
1027
|
-
[image-join-us]: https://camel-ai.github.io/camel_asset/graphics/join_us.png
|
|
1026
|
+
[image-join-us]: https://camel-ai.github.io/camel_asset/graphics/join_us.png
|