camel-ai 0.2.76a8__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.

@@ -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(
@@ -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.76a8
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.html">
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 [![Google Colab](https://colab.research.google.com/assets/colab-bad
698
701
 
699
702
  Explore different types of agents, their roles, and their applications.
700
703
 
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)**
704
+ - **[Creating Your First Agent](https://docs.camel-ai.org/cookbooks/basic_concepts/create_your_first_agent)**
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.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. |
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.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. |
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.html)** | Interactive components for human oversight and intervention. |
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.html#).
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.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. |
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.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. |
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.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. |
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.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. |
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.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. |
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.html
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