camel-ai 0.2.76a9__py3-none-any.whl → 0.2.76a12__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/loaders/chunkr_reader.py +9 -0
- camel/memories/records.py +36 -0
- camel/messages/base.py +126 -33
- 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/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.76a12.dist-info}/METADATA +43 -40
- {camel_ai-0.2.76a9.dist-info → camel_ai-0.2.76a12.dist-info}/RECORD +20 -19
- {camel_ai-0.2.76a9.dist-info → camel_ai-0.2.76a12.dist-info}/WHEEL +0 -0
- {camel_ai-0.2.76a9.dist-info → camel_ai-0.2.76a12.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(
|
|
@@ -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.76a12
|
|
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'
|
|
@@ -235,6 +236,8 @@ Requires-Dist: docx>=0.2.4; extra == 'eigent'
|
|
|
235
236
|
Requires-Dist: exa-py<2,>=1.10.0; extra == 'eigent'
|
|
236
237
|
Requires-Dist: ffmpeg-python<0.3,>=0.2.0; extra == 'eigent'
|
|
237
238
|
Requires-Dist: google-api-python-client==2.166.0; extra == 'eigent'
|
|
239
|
+
Requires-Dist: google-auth-httplib2==0.2.0; extra == 'eigent'
|
|
240
|
+
Requires-Dist: google-auth-oauthlib==1.2.1; extra == 'eigent'
|
|
238
241
|
Requires-Dist: imageio[pyav]<3,>=2.34.2; extra == 'eigent'
|
|
239
242
|
Requires-Dist: markitdown[all]>=0.1.1; extra == 'eigent'
|
|
240
243
|
Requires-Dist: mcp-server-fetch==2025.1.17; extra == 'eigent'
|
|
@@ -612,7 +615,7 @@ We are a community-driven research collective comprising over 100 researchers de
|
|
|
612
615
|
</div>
|
|
613
616
|
|
|
614
617
|
<div align="center">
|
|
615
|
-
<a href="https://docs.camel-ai.org/cookbooks/advanced_features/agents_with_rag
|
|
618
|
+
<a href="https://docs.camel-ai.org/cookbooks/advanced_features/agents_with_rag">
|
|
616
619
|
<img src="docs/images/rag_pipeline.png" alt="RAG Pipeline">
|
|
617
620
|
</a>
|
|
618
621
|
</div>
|
|
@@ -698,10 +701,10 @@ We provide a [**
|
|
705
|
+
- **[Creating Your First Agent Society](https://docs.camel-ai.org/cookbooks/basic_concepts/create_your_first_agents_society)**
|
|
706
|
+
- **[Embodied Agents](https://docs.camel-ai.org/cookbooks/advanced_features/embodied_agents)**
|
|
707
|
+
- **[Critic Agents](https://docs.camel-ai.org/cookbooks/advanced_features/critic_agents_and_tree_search)**
|
|
705
708
|
|
|
706
709
|
### Seeking Help
|
|
707
710
|
|
|
@@ -722,19 +725,19 @@ Core components and utilities to build, operate, and enhance CAMEL-AI agents and
|
|
|
722
725
|
|
|
723
726
|
| Module | Description |
|
|
724
727
|
|:---|:---|
|
|
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
|
|
728
|
+
| **[Agents](https://docs.camel-ai.org/key_modules/agents)** | Core agent architectures and behaviors for autonomous operation. |
|
|
729
|
+
| **[Agent Societies](https://docs.camel-ai.org/key_modules/society)** | Components for building and managing multi-agent systems and collaboration. |
|
|
730
|
+
| **[Data Generation](https://docs.camel-ai.org/key_modules/datagen)** | Tools and methods for synthetic data creation and augmentation. |
|
|
731
|
+
| **[Models](https://docs.camel-ai.org/key_modules/models)** | Model architectures and customization options for agent intelligence. |
|
|
732
|
+
| **[Tools](https://docs.camel-ai.org/key_modules/tools)** | Tools integration for specialized agent tasks. |
|
|
733
|
+
| **[Memory](https://docs.camel-ai.org/key_modules/memory)** | Memory storage and retrieval mechanisms for agent state management. |
|
|
734
|
+
| **[Storage](https://docs.camel-ai.org/key_modules/storages)** | Persistent storage solutions for agent data and states. |
|
|
732
735
|
| **[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
|
|
736
|
+
| **[Interpreters](https://docs.camel-ai.org/key_modules/interpreters)** | Code and command interpretation capabilities. |
|
|
737
|
+
| **[Data Loaders](https://docs.camel-ai.org/key_modules/loaders)** | Data ingestion and preprocessing tools. |
|
|
738
|
+
| **[Retrievers](https://docs.camel-ai.org/key_modules/retrievers)** | Knowledge retrieval and RAG components. |
|
|
736
739
|
| **[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
|
|
740
|
+
| **[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
741
|
---
|
|
739
742
|
|
|
740
743
|
## Research
|
|
@@ -795,7 +798,7 @@ We believe that studying these agents on a large scale offers valuable insights
|
|
|
795
798
|
|
|
796
799
|
### 1. Utilize Various LLMs as Backends
|
|
797
800
|
|
|
798
|
-
For more details, please see our [`Models Documentation`](https://docs.camel-ai.org/key_modules/models
|
|
801
|
+
For more details, please see our [`Models Documentation`](https://docs.camel-ai.org/key_modules/models#).
|
|
799
802
|
|
|
800
803
|
> **Data (Hosted on Hugging Face)**
|
|
801
804
|
|
|
@@ -824,42 +827,42 @@ Practical guides and tutorials for implementing specific functionalities in CAME
|
|
|
824
827
|
### 1. Basic Concepts
|
|
825
828
|
| Cookbook | Description |
|
|
826
829
|
|:---|:---|
|
|
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
|
|
830
|
+
| **[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. |
|
|
831
|
+
| **[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. |
|
|
832
|
+
| **[Message Cookbook](https://docs.camel-ai.org/cookbooks/basic_concepts/agents_message)** | Best practices for message handling in agents. |
|
|
830
833
|
|
|
831
834
|
### 2. Advanced Features
|
|
832
835
|
| Cookbook | Description |
|
|
833
836
|
|:---|:---|
|
|
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
|
|
837
|
+
| **[Tools Cookbook](https://docs.camel-ai.org/cookbooks/advanced_features/agents_with_tools)** | Integrating tools for enhanced functionality. |
|
|
838
|
+
| **[Memory Cookbook](https://docs.camel-ai.org/cookbooks/advanced_features/agents_with_memory)** | Implementing memory systems in agents. |
|
|
839
|
+
| **[RAG Cookbook](https://docs.camel-ai.org/cookbooks/advanced_features/agents_with_rag)** | Recipes for Retrieval-Augmented Generation. |
|
|
840
|
+
| **[Graph RAG Cookbook](https://docs.camel-ai.org/cookbooks/advanced_features/agents_with_graph_rag)** | Leveraging knowledge graphs with RAG. |
|
|
841
|
+
| **[Track CAMEL Agents with AgentOps](https://docs.camel-ai.org/cookbooks/advanced_features/agents_tracking)** | Tools for tracking and managing agents in operations. |
|
|
839
842
|
|
|
840
843
|
### 3. Model Training & Data Generation
|
|
841
844
|
| Cookbook | Description |
|
|
842
845
|
|:---|:---|
|
|
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
|
|
846
|
+
| **[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. |
|
|
847
|
+
| **[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. |
|
|
848
|
+
| **[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. |
|
|
849
|
+
| **[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
850
|
|
|
848
851
|
### 4. Multi-Agent Systems & Applications
|
|
849
852
|
| Cookbook | Description |
|
|
850
853
|
|:---|:---|
|
|
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
|
|
854
|
+
| **[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. |
|
|
855
|
+
| **[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. |
|
|
856
|
+
| **[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. |
|
|
857
|
+
| **[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. |
|
|
858
|
+
| **[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
859
|
|
|
857
860
|
### 5. Data Processing
|
|
858
861
|
| Cookbook | Description |
|
|
859
862
|
|:---|:---|
|
|
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
|
|
863
|
+
| **[Video Analysis](https://docs.camel-ai.org/cookbooks/data_processing/video_analysis)** | Techniques for agents in video data analysis. |
|
|
864
|
+
| **[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. |
|
|
865
|
+
| **[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
866
|
|
|
864
867
|
<br>
|
|
865
868
|
|
|
@@ -1000,7 +1003,7 @@ The source code is licensed under Apache 2.0.
|
|
|
1000
1003
|
<br>
|
|
1001
1004
|
|
|
1002
1005
|
[docs-image]: https://img.shields.io/badge/Documentation-EB3ECC
|
|
1003
|
-
[docs-url]: https://camel-ai.github.io/camel/index
|
|
1006
|
+
[docs-url]: https://camel-ai.github.io/camel/index
|
|
1004
1007
|
[star-image]: https://img.shields.io/github/stars/camel-ai/camel?label=stars&logo=github&color=brightgreen
|
|
1005
1008
|
[star-url]: https://github.com/camel-ai/camel/stargazers
|
|
1006
1009
|
[package-license-image]: https://img.shields.io/badge/License-Apache_2.0-blue.svg
|
|
@@ -1024,4 +1027,4 @@ The source code is licensed under Apache 2.0.
|
|
|
1024
1027
|
[package-download-url]: https://pypi.org/project/camel-ai
|
|
1025
1028
|
[join-us]:https://eigent-ai.notion.site/eigent-ai-careers
|
|
1026
1029
|
[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
|
|
1030
|
+
[image-join-us]: https://camel-ai.github.io/camel_asset/graphics/join_us.png
|