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.

@@ -20,7 +20,6 @@
20
20
  "license": "Apache-2.0",
21
21
  "dependencies": {
22
22
  "playwright": "^1.40.0",
23
- "sharp": "^0.32.0",
24
23
  "ws": "^8.14.0"
25
24
  },
26
25
  "devDependencies": {
@@ -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
- ['node', 'websocket-server.js'],
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
- with contextlib.suppress(ProcessLookupError, Exception):
290
- self.process.kill()
291
- with contextlib.suppress(Exception):
292
- self.process.wait(timeout=2)
293
- if self._log_reader_task and not self._log_reader_task.done():
294
- self._log_reader_task.cancel()
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 = "WebSocket server failed to start within timeout"
304
- import psutil
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
- with contextlib.suppress(ProcessLookupError, Exception):
371
- self.process.kill()
372
- with contextlib.suppress(Exception):
373
- self.process.wait(timeout=2)
374
- if self._log_reader_task and not self._log_reader_task.done():
375
- self._log_reader_task.cancel()
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
- import psutil
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(
@@ -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, FunctionTool
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
 
@@ -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
- image_prefix_format = "data:image/{};base64,"
199
- image_prefix: Optional[str] = None
200
- for image_type in list(OpenAIImageType):
201
- # Find the correct image format
202
- image_prefix = image_prefix_format.format(
203
- image_type.value
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
- if image_prefix in image_str:
206
- break
207
- assert isinstance(image_prefix, str)
208
- encoded_image = image_str.split(image_prefix)[1]
209
- image_bytes = BytesIO(
210
- base64.b64decode(encoded_image)
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.76a9
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<2,>=1.5.3; extra == 'all'
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<2,>=1.5.3; extra == 'data-tools'
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<2,>=1.5.3; extra == 'eigent'
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<2,>=1.5.3; extra == 'owl'
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.html">
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 [![Google Colab](https://colab.research.google.com/assets/colab-bad
698
697
 
699
698
  Explore different types of agents, their roles, and their applications.
700
699
 
701
- - **[Creating Your First Agent](https://docs.camel-ai.org/cookbooks/basic_concepts/create_your_first_agent.html)**
702
- - **[Creating Your First Agent Society](https://docs.camel-ai.org/cookbooks/basic_concepts/create_your_first_agents_society.html)**
703
- - **[Embodied Agents](https://docs.camel-ai.org/cookbooks/advanced_features/embodied_agents.html)**
704
- - **[Critic Agents](https://docs.camel-ai.org/cookbooks/advanced_features/critic_agents_and_tree_search.html)**
700
+ - **[Creating Your First Agent](https://docs.camel-ai.org/cookbooks/basic_concepts/create_your_first_agent)**
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.html)** | Core agent architectures and behaviors for autonomous operation. |
726
- | **[Agent Societies](https://docs.camel-ai.org/key_modules/society.html)** | Components for building and managing multi-agent systems and collaboration. |
727
- | **[Data Generation](https://docs.camel-ai.org/key_modules/datagen.html)** | Tools and methods for synthetic data creation and augmentation. |
728
- | **[Models](https://docs.camel-ai.org/key_modules/models.html)** | Model architectures and customization options for agent intelligence. |
729
- | **[Tools](https://docs.camel-ai.org/key_modules/tools.html)** | Tools integration for specialized agent tasks. |
730
- | **[Memory](https://docs.camel-ai.org/key_modules/memory.html)** | Memory storage and retrieval mechanisms for agent state management. |
731
- | **[Storage](https://docs.camel-ai.org/key_modules/storages.html)** | Persistent storage solutions for agent data and states. |
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.html)** | Code and command interpretation capabilities. |
734
- | **[Data Loaders](https://docs.camel-ai.org/key_modules/loaders.html)** | Data ingestion and preprocessing tools. |
735
- | **[Retrievers](https://docs.camel-ai.org/key_modules/retrievers.html)** | Knowledge retrieval and RAG components. |
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.html)** | Interactive components for human oversight and intervention. |
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.html#).
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.html)** | A step-by-step guide to building your first agent. |
828
- | **[Creating Your First Agent Society](https://docs.camel-ai.org/cookbooks/basic_concepts/create_your_first_agents_society.html)** | Learn to build a collaborative society of agents. |
829
- | **[Message Cookbook](https://docs.camel-ai.org/cookbooks/basic_concepts/agents_message.html)** | Best practices for message handling in agents. |
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.html)** | Integrating tools for enhanced functionality. |
835
- | **[Memory Cookbook](https://docs.camel-ai.org/cookbooks/advanced_features/agents_with_memory.html)** | Implementing memory systems in agents. |
836
- | **[RAG Cookbook](https://docs.camel-ai.org/cookbooks/advanced_features/agents_with_rag.html)** | Recipes for Retrieval-Augmented Generation. |
837
- | **[Graph RAG Cookbook](https://docs.camel-ai.org/cookbooks/advanced_features/agents_with_graph_rag.html)** | Leveraging knowledge graphs with RAG. |
838
- | **[Track CAMEL Agents with AgentOps](https://docs.camel-ai.org/cookbooks/advanced_features/agents_tracking.html)** | Tools for tracking and managing agents in operations. |
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.html)** | Learn how to generate data with CAMEL and fine-tune models effectively with Unsloth. |
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.html)** | Explore how to generate data with real function calls and the 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.html)** | Uncover how to generate CoT data with CAMEL and seamlessly upload it to Huggingface. |
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.html)** | Discover how to generate CoT data using CAMEL and SFT Qwen with Unsolth, and seamlessly upload your data and model to 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.html)** | Create role-playing agents for data scraping and reporting. |
852
- | **[Create A Hackathon Judge Committee with Workforce](https://docs.camel-ai.org/cookbooks/multi_agent_society/workforce_judge_committee.html)** | Building a team of agents for collaborative judging. |
853
- | **[Dynamic Knowledge Graph Role-Playing: Multi-Agent System with dynamic, temporally-aware knowledge graphs](https://docs.camel-ai.org/cookbooks/applications/dyamic_knowledge_graph.html)** | 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. |
854
- | **[Customer Service Discord Bot with Agentic RAG](https://docs.camel-ai.org/cookbooks/applications/customer_service_Discord_bot_using_SambaNova_with_agentic_RAG.html)** | Learn how to build a robust customer service bot for Discord using 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.html)** | Learn how to build a robust customer service bot for Discord using Agentic RAG which supports local deployment. |
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.html)** | Techniques for agents in video data 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.html)** | Explore three methods for extracting and processing data from websites using Firecrawl. |
862
- | **[Create AI Agents that work with your PDFs](https://docs.camel-ai.org/cookbooks/data_processing/agent_with_chunkr_for_pdf_parsing.html)** | Learn how to create AI agents that work with your PDFs using Chunkr and Mistral AI. |
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.html
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