camel-ai 0.2.72a2__py3-none-any.whl → 0.2.72a5__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.

@@ -93,7 +93,7 @@ class TerminalToolkit(BaseToolkit):
93
93
 
94
94
  self.python_executable = sys.executable
95
95
  self.is_macos = platform.system() == 'Darwin'
96
- self.initial_env_path = None
96
+ self.initial_env_path: Optional[str] = None
97
97
  self.initial_env_prepared = False
98
98
 
99
99
  atexit.register(self.__del__)
@@ -194,14 +194,50 @@ class TerminalToolkit(BaseToolkit):
194
194
  return
195
195
 
196
196
  self._update_terminal_output(
197
- f"Creating new Python environment at:{self.cloned_env_path}\n"
197
+ f"Creating new Python environment at: {self.cloned_env_path}\n"
198
198
  )
199
199
 
200
+ # Create virtual environment with pip
200
201
  venv.create(self.cloned_env_path, with_pip=True)
202
+
203
+ # Ensure pip is properly available by upgrading it
204
+ if self.os_type == 'Windows':
205
+ python_path = os.path.join(
206
+ self.cloned_env_path, "Scripts", "python.exe"
207
+ )
208
+ else:
209
+ python_path = os.path.join(
210
+ self.cloned_env_path, "bin", "python"
211
+ )
212
+
213
+ # Verify python executable exists
214
+ if os.path.exists(python_path):
215
+ # Use python -m pip to ensure pip is available
216
+ subprocess.run(
217
+ [python_path, "-m", "pip", "install", "--upgrade", "pip"],
218
+ check=True,
219
+ capture_output=True,
220
+ cwd=self.working_dir,
221
+ timeout=60,
222
+ )
223
+ self._update_terminal_output(
224
+ "New Python environment created successfully with pip!\n"
225
+ )
226
+ else:
227
+ self._update_terminal_output(
228
+ f"Warning: Python executable not found at {python_path}\n"
229
+ )
230
+
231
+ except subprocess.CalledProcessError as e:
232
+ error_msg = e.stderr.decode() if e.stderr else str(e)
201
233
  self._update_terminal_output(
202
- "New Python environment created successfully!\n"
234
+ f"Failed to upgrade pip in cloned environment: {error_msg}\n"
235
+ )
236
+ logger.error(f"Failed to upgrade pip: {error_msg}")
237
+ except subprocess.TimeoutExpired:
238
+ self._update_terminal_output(
239
+ "Pip upgrade timed out, but environment may still be usable\n"
203
240
  )
204
-
205
241
  except Exception as e:
206
242
  self._update_terminal_output(
207
243
  f"Failed to create environment: {e!s}\n"
@@ -259,6 +295,9 @@ class TerminalToolkit(BaseToolkit):
259
295
 
260
296
  def _setup_initial_env_with_uv(self):
261
297
  r"""Set up initial environment using uv."""
298
+ if self.initial_env_path is None:
299
+ raise Exception("Initial environment path not set")
300
+
262
301
  try:
263
302
  # Create virtual environment with Python 3.10 using uv
264
303
  subprocess.run(
@@ -312,6 +351,9 @@ class TerminalToolkit(BaseToolkit):
312
351
 
313
352
  def _setup_initial_env_with_venv(self):
314
353
  r"""Set up initial environment using standard venv."""
354
+ if self.initial_env_path is None:
355
+ raise Exception("Initial environment path not set")
356
+
315
357
  try:
316
358
  # Create virtual environment with system Python
317
359
  venv.create(
@@ -532,108 +574,6 @@ class TerminalToolkit(BaseToolkit):
532
574
  logger.error(f"Failed to copy file: {e}")
533
575
  return None
534
576
 
535
- def file_find_in_content(
536
- self, file: str, regex: str, sudo: bool = False
537
- ) -> str:
538
- r"""Search for text within a file's content using a regular expression.
539
-
540
- This function is useful for finding specific patterns or lines of text
541
- within a given file. It uses `grep` on Unix-like systems and `findstr`
542
- on Windows.
543
-
544
- Args:
545
- file (str): The absolute path of the file to search within.
546
- regex (str): The regular expression pattern to match.
547
- sudo (bool, optional): Whether to use sudo privileges for the
548
- search. Defaults to False. Note: Using sudo requires the
549
- process to have appropriate permissions.
550
- (default: :obj:`False`)
551
-
552
- Returns:
553
- str: The matching content found in the file. If no matches are
554
- found, an empty string is returned. Returns an error message
555
- if the file does not exist or another error occurs.
556
- """
557
-
558
- if not os.path.exists(file):
559
- return f"File not found: {file}"
560
-
561
- if not os.path.isfile(file):
562
- return f"The path provided is not a file: {file}"
563
-
564
- command = []
565
- if sudo:
566
- error_msg = self._enforce_working_dir_for_execution(file)
567
- if error_msg:
568
- return error_msg
569
- command.extend(["sudo"])
570
-
571
- if self.os_type in ['Darwin', 'Linux']: # macOS or Linux
572
- command.extend(["grep", "-E", regex, file])
573
- else: # Windows
574
- # For Windows, we could use PowerShell or findstr
575
- command.extend(["findstr", "/R", regex, file])
576
-
577
- try:
578
- result = subprocess.run(
579
- command, check=False, capture_output=True, text=True
580
- )
581
- return result.stdout.strip()
582
- except subprocess.SubprocessError as e:
583
- logger.error(f"Error searching in file content: {e}")
584
- return f"Error: {e!s}"
585
-
586
- def file_find_by_name(self, path: str, glob: str) -> str:
587
- r"""Find files by name in a specified directory using a glob pattern.
588
-
589
- This function recursively searches for files matching a given name or
590
- pattern within a directory. It uses `find` on Unix-like systems and
591
- `dir` on Windows.
592
-
593
- Args:
594
- path (str): The absolute path of the directory to search in.
595
- glob (str): The filename pattern to search for, using glob syntax
596
- (e.g., "*.py", "data*").
597
-
598
- Returns:
599
- str: A newline-separated string containing the paths of the files
600
- that match the pattern. Returns an error message if the
601
- directory does not exist or another error occurs.
602
- """
603
- if not os.path.exists(path):
604
- return f"Directory not found: {path}"
605
-
606
- if not os.path.isdir(path):
607
- return f"The path provided is not a directory: {path}"
608
-
609
- command = []
610
- if self.os_type in ['Darwin', 'Linux']: # macOS or Linux
611
- command.extend(["find", path, "-name", glob])
612
- else: # Windows
613
- # For Windows, we use dir command with /s for recursive search
614
- # and /b for bare format
615
-
616
- pattern = glob
617
- file_path = os.path.join(path, pattern).replace('/', '\\')
618
- command.extend(["cmd", "/c", "dir", "/s", "/b", file_path])
619
-
620
- try:
621
- result = subprocess.run(
622
- command,
623
- check=False,
624
- capture_output=True,
625
- text=True,
626
- shell=False,
627
- )
628
-
629
- output = result.stdout.strip()
630
- if self.os_type == 'Windows':
631
- output = output.replace('\\', '/')
632
- return output
633
- except subprocess.SubprocessError as e:
634
- logger.error(f"Error finding files by name: {e}")
635
- return f"Error: {e!s}"
636
-
637
577
  def _sanitize_command(self, command: str, exec_dir: str) -> Tuple:
638
578
  r"""Check and modify command to ensure safety.
639
579
 
@@ -918,38 +858,75 @@ class TerminalToolkit(BaseToolkit):
918
858
  self._update_terminal_output(f"\n$ {command}\n")
919
859
 
920
860
  if command.startswith('python') or command.startswith('pip'):
921
- if self.cloned_env_path:
922
- # Use cloned environment
861
+ python_path = None
862
+ pip_path = None
863
+
864
+ # Try cloned environment first
865
+ if self.cloned_env_path and os.path.exists(
866
+ self.cloned_env_path
867
+ ):
923
868
  if self.os_type == 'Windows':
924
869
  base_path = os.path.join(
925
870
  self.cloned_env_path, "Scripts"
926
871
  )
927
- python_path = os.path.join(base_path, "python.exe")
928
- pip_path = os.path.join(base_path, "pip.exe")
872
+ python_candidate = os.path.join(
873
+ base_path, "python.exe"
874
+ )
875
+ pip_candidate = os.path.join(base_path, "pip.exe")
929
876
  else:
930
877
  base_path = os.path.join(self.cloned_env_path, "bin")
931
- python_path = os.path.join(base_path, "python")
932
- pip_path = os.path.join(base_path, "pip")
933
- elif self.initial_env_prepared and self.initial_env_path:
934
- # Use initial prepared environment
878
+ python_candidate = os.path.join(base_path, "python")
879
+ pip_candidate = os.path.join(base_path, "pip")
880
+
881
+ # Verify the executables exist
882
+ if os.path.exists(python_candidate):
883
+ python_path = python_candidate
884
+ # For pip, use python -m pip if pip executable doesn't
885
+ # exist
886
+ if os.path.exists(pip_candidate):
887
+ pip_path = pip_candidate
888
+ else:
889
+ pip_path = f'"{python_path}" -m pip'
890
+
891
+ # Try initial environment if cloned environment failed
892
+ if (
893
+ python_path is None
894
+ and self.initial_env_prepared
895
+ and self.initial_env_path
896
+ and os.path.exists(self.initial_env_path)
897
+ ):
935
898
  if self.os_type == 'Windows':
936
899
  base_path = os.path.join(
937
900
  self.initial_env_path, "Scripts"
938
901
  )
939
- python_path = os.path.join(base_path, "python.exe")
940
- pip_path = os.path.join(base_path, "pip.exe")
902
+ python_candidate = os.path.join(
903
+ base_path, "python.exe"
904
+ )
905
+ pip_candidate = os.path.join(base_path, "pip.exe")
941
906
  else:
942
907
  base_path = os.path.join(self.initial_env_path, "bin")
943
- python_path = os.path.join(base_path, "python")
944
- pip_path = os.path.join(base_path, "pip")
945
- else:
946
- # Fall back to system Python
908
+ python_candidate = os.path.join(base_path, "python")
909
+ pip_candidate = os.path.join(base_path, "pip")
910
+
911
+ # Verify the executables exist
912
+ if os.path.exists(python_candidate):
913
+ python_path = python_candidate
914
+ # For pip, use python -m pip if pip executable doesn't
915
+ # exist
916
+ if os.path.exists(pip_candidate):
917
+ pip_path = pip_candidate
918
+ else:
919
+ pip_path = f'"{python_path}" -m pip'
920
+
921
+ # Fall back to system Python
922
+ if python_path is None:
947
923
  python_path = self.python_executable
948
924
  pip_path = f'"{python_path}" -m pip'
949
925
 
950
- if command.startswith('python'):
926
+ # Ensure we have valid paths before replacement
927
+ if python_path and command.startswith('python'):
951
928
  command = command.replace('python', f'"{python_path}"', 1)
952
- elif command.startswith('pip'):
929
+ elif pip_path and command.startswith('pip'):
953
930
  command = command.replace('pip', pip_path, 1)
954
931
 
955
932
  if not interactive:
@@ -1470,44 +1447,46 @@ class TerminalToolkit(BaseToolkit):
1470
1447
  logger.info("TerminalToolkit cleanup initiated")
1471
1448
 
1472
1449
  # Clean up all processes in shell sessions
1473
- for session_id, session in self.shell_sessions.items():
1474
- process = session.get("process")
1475
- if process is not None and session.get("running", False):
1476
- try:
1477
- logger.info(
1478
- f"Terminating process in session '{session_id}'"
1479
- )
1480
-
1481
- # Close process input/output streams if open
1482
- if (
1483
- hasattr(process, 'stdin')
1484
- and process.stdin
1485
- and not process.stdin.closed
1486
- ):
1487
- process.stdin.close()
1488
-
1489
- # Terminate the process
1490
- process.terminate()
1450
+ if hasattr(self, 'shell_sessions'):
1451
+ for session_id, session in self.shell_sessions.items():
1452
+ process = session.get("process")
1453
+ if process is not None and session.get("running", False):
1491
1454
  try:
1492
- # Give the process a short time to terminate gracefully
1493
- process.wait(timeout=3)
1494
- except subprocess.TimeoutExpired:
1495
- # Force kill if the process doesn't terminate
1496
- # gracefully
1497
- logger.warning(
1498
- f"Process in session '{session_id}' did not "
1499
- f"terminate gracefully, forcing kill"
1455
+ logger.info(
1456
+ f"Terminating process in session '{session_id}'"
1500
1457
  )
1501
- process.kill()
1502
1458
 
1503
- # Mark the session as not running
1504
- session["running"] = False
1459
+ # Close process input/output streams if open
1460
+ if (
1461
+ hasattr(process, 'stdin')
1462
+ and process.stdin
1463
+ and not process.stdin.closed
1464
+ ):
1465
+ process.stdin.close()
1505
1466
 
1506
- except Exception as e:
1507
- logger.error(
1508
- f"Error cleaning up process in session "
1509
- f"'{session_id}': {e}"
1510
- )
1467
+ # Terminate the process
1468
+ process.terminate()
1469
+ try:
1470
+ # Give the process a short time to terminate
1471
+ # gracefully
1472
+ process.wait(timeout=3)
1473
+ except subprocess.TimeoutExpired:
1474
+ # Force kill if the process doesn't terminate
1475
+ # gracefully
1476
+ logger.warning(
1477
+ f"Process in session '{session_id}' did not "
1478
+ f"terminate gracefully, forcing kill"
1479
+ )
1480
+ process.kill()
1481
+
1482
+ # Mark the session as not running
1483
+ session["running"] = False
1484
+
1485
+ except Exception as e:
1486
+ logger.error(
1487
+ f"Error cleaning up process in session "
1488
+ f"'{session_id}': {e}"
1489
+ )
1511
1490
 
1512
1491
  # Clean up file output if it exists
1513
1492
  if hasattr(self, 'log_file') and self.is_macos:
@@ -1548,8 +1527,6 @@ class TerminalToolkit(BaseToolkit):
1548
1527
  functions in the toolkit.
1549
1528
  """
1550
1529
  return [
1551
- FunctionTool(self.file_find_in_content),
1552
- FunctionTool(self.file_find_by_name),
1553
1530
  FunctionTool(self.shell_exec),
1554
1531
  FunctionTool(self.shell_view),
1555
1532
  FunctionTool(self.shell_wait),
camel/types/enums.py CHANGED
@@ -13,7 +13,7 @@
13
13
  # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
14
14
  import os
15
15
  from enum import Enum, EnumMeta
16
- from typing import cast
16
+ from typing import Union, cast
17
17
 
18
18
  from camel.logger import get_logger
19
19
  from camel.types.unified_model_type import UnifiedModelType
@@ -420,11 +420,14 @@ class ModelType(UnifiedModelType, Enum):
420
420
  def __str__(self):
421
421
  return self.value
422
422
 
423
- def __new__(cls, value) -> "ModelType":
423
+ def __repr__(self):
424
+ return self.value
425
+
426
+ def __new__(cls, value: Union["ModelType", str]) -> "ModelType":
424
427
  return cast("ModelType", UnifiedModelType.__new__(cls, value))
425
428
 
426
429
  @classmethod
427
- def from_name(cls, name):
430
+ def from_name(cls, name: str) -> "ModelType":
428
431
  r"""Returns the ModelType enum value from a string."""
429
432
  for model_type in cls:
430
433
  if model_type.value == name:
@@ -12,6 +12,7 @@
12
12
  # limitations under the License.
13
13
  # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
14
14
  import logging
15
+ from enum import Enum
15
16
  from threading import Lock
16
17
  from typing import TYPE_CHECKING, ClassVar, Dict, Union, cast
17
18
 
@@ -32,17 +33,28 @@ class UnifiedModelType(str):
32
33
  _lock: ClassVar[Lock] = Lock()
33
34
 
34
35
  def __new__(cls, value: Union["ModelType", str]) -> "UnifiedModelType":
36
+ if isinstance(value, Enum):
37
+ str_value = value.value
38
+ else:
39
+ str_value = str(value)
40
+
35
41
  with cls._lock:
36
- if value not in cls._cache:
37
- instance = super().__new__(cls, value)
38
- cls._cache[value] = cast(UnifiedModelType, instance)
42
+ if str_value not in cls._cache:
43
+ instance = super().__new__(cls, str_value)
44
+ cls._cache[str_value] = cast(UnifiedModelType, instance)
39
45
  else:
40
- instance = cls._cache[value]
46
+ instance = cls._cache[str_value]
41
47
  return instance
42
48
 
43
49
  def __init__(self, value: Union["ModelType", str]) -> None:
44
50
  pass
45
51
 
52
+ def __repr__(self) -> str:
53
+ return super().__str__()
54
+
55
+ def __str__(self) -> str:
56
+ return super().__str__()
57
+
46
58
  @property
47
59
  def value_for_tiktoken(self) -> str:
48
60
  r"""Returns the model name for TikToken."""
camel/utils/mcp_client.py CHANGED
@@ -353,6 +353,14 @@ class MCPClient:
353
353
  finally:
354
354
  self._connection_context = None
355
355
 
356
+ # Add a small delay to allow subprocess cleanup on Windows
357
+ # This prevents "Event loop is closed" errors during shutdown
358
+ import asyncio
359
+ import sys
360
+
361
+ if sys.platform == "win32":
362
+ await asyncio.sleep(0.01)
363
+
356
364
  finally:
357
365
  # Ensure state is reset
358
366
  self._tools = []
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: camel-ai
3
- Version: 0.2.72a2
3
+ Version: 0.2.72a5
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
@@ -127,7 +127,7 @@ Requires-Dist: sympy<2,>=1.13.3; extra == 'all'
127
127
  Requires-Dist: tabulate>=0.9.0; extra == 'all'
128
128
  Requires-Dist: tavily-python<0.6,>=0.5.0; extra == 'all'
129
129
  Requires-Dist: textblob<0.18,>=0.17.1; extra == 'all'
130
- Requires-Dist: traceroot==0.0.3; extra == 'all'
130
+ Requires-Dist: traceroot==0.0.4a2; extra == 'all'
131
131
  Requires-Dist: transformers<5,>=4; extra == 'all'
132
132
  Requires-Dist: tree-sitter-python<0.24,>=0.23.6; extra == 'all'
133
133
  Requires-Dist: tree-sitter<0.24,>=0.23.2; extra == 'all'
@@ -191,7 +191,7 @@ Requires-Dist: ipykernel<7,>=6.0.0; extra == 'dev-tools'
191
191
  Requires-Dist: jupyter-client<9,>=8.6.2; extra == 'dev-tools'
192
192
  Requires-Dist: langfuse>=2.60.5; extra == 'dev-tools'
193
193
  Requires-Dist: mcp>=1.3.0; extra == 'dev-tools'
194
- Requires-Dist: traceroot==0.0.3; extra == 'dev-tools'
194
+ Requires-Dist: traceroot==0.0.4a2; extra == 'dev-tools'
195
195
  Requires-Dist: tree-sitter-python<0.24,>=0.23.6; extra == 'dev-tools'
196
196
  Requires-Dist: tree-sitter<0.24,>=0.23.2; extra == 'dev-tools'
197
197
  Requires-Dist: typer>=0.15.2; extra == 'dev-tools'
@@ -1,4 +1,4 @@
1
- camel/__init__.py,sha256=_mXhIpC52sRjb19FSEYMCMjlTnE6SsVFKIK4fiWKMOI,901
1
+ camel/__init__.py,sha256=1CBJAF1mkpASoGuIu5or-PNvl4ZJZ11EMC1iSaJPBek,901
2
2
  camel/generators.py,sha256=JRqj9_m1PF4qT6UtybzTQ-KBT9MJQt18OAAYvQ_fr2o,13844
3
3
  camel/human.py,sha256=Xg8x1cS5KK4bQ1SDByiHZnzsRpvRP-KZViNvmu38xo4,5475
4
4
  camel/logger.py,sha256=WgEwael_eT6D-lVAKHpKIpwXSTjvLbny5jbV1Ab8lnA,5760
@@ -7,7 +7,7 @@ camel/agents/__init__.py,sha256=64weKqdvmpZcGWyVkO-OKASAmVUdrQjv60JApgPk_SA,1644
7
7
  camel/agents/_types.py,sha256=MeFZzay2kJA6evALQ-MbBTKW-0lu_0wBuKsxzH_4gWI,1552
8
8
  camel/agents/_utils.py,sha256=AR7Qqgbkmn4X2edYUQf1rdksGUyV5hm3iK1z-Dn0Mcg,6266
9
9
  camel/agents/base.py,sha256=c4bJYL3G3Z41SaFdMPMn8ZjLdFiFaVOFO6EQIfuCVR8,1124
10
- camel/agents/chat_agent.py,sha256=gF-Wq1YSL5C4_9pp9SN4jdfLrzF-d3xi51PnskQyi7k,159299
10
+ camel/agents/chat_agent.py,sha256=IAd0uY42DVsP8rV6XcgTO3G_iUREGI0NAq7KqFnZPHY,162638
11
11
  camel/agents/critic_agent.py,sha256=L6cTbYjyZB0DCa51tQ6LZLA6my8kHLC4nktHySH78H4,10433
12
12
  camel/agents/deductive_reasoner_agent.py,sha256=6BZGaq1hR6hKJuQtOfoYQnk_AkZpw_Mr7mUy2MspQgs,13540
13
13
  camel/agents/embodied_agent.py,sha256=XBxBu5ZMmSJ4B2U3Z7SMwvLlgp6yNpaBe8HNQmY9CZA,7536
@@ -201,7 +201,7 @@ camel/models/nvidia_model.py,sha256=WBn9PUz3FxqrSf8cfO3O6pyWL_0_9RYD8_t5qiEjGRQ,
201
201
  camel/models/ollama_model.py,sha256=srHz0-gC4w6S19l3AfVIEXbTlRCSJwRijXxXMoHkm8Y,4733
202
202
  camel/models/openai_audio_models.py,sha256=BSixkXlc8xirQLl2qCla-g6_y9wDLnMZVHukHrhzw98,13344
203
203
  camel/models/openai_compatible_model.py,sha256=CVKKMx34xyQh1t3Nx3RpUcS9dzIWAHKMGwKCS-mXK2c,16913
204
- camel/models/openai_model.py,sha256=tkgElziLXvb6ciLkqjZ-HNAfWebX5boCDH8xwTrEIBc,19875
204
+ camel/models/openai_model.py,sha256=5wBYBEAKEHMnP4Aej36nV1wA61K8SYLfMuMqR2Gr15U,20355
205
205
  camel/models/openrouter_model.py,sha256=mzWn_mSlp_2Ssnzyv_rs2ybGXkNOxqUzTkyyQFGkokw,4183
206
206
  camel/models/ppio_model.py,sha256=LoEyRNdcHI0z80AHJ2R1JO6JWtrIB0TnCcYa-71SOMw,4208
207
207
  camel/models/qianfan_model.py,sha256=7q8GkLBhPVzq5LxBxxQhbJrt7YZh7WwHxe8pILVZuqI,4292
@@ -316,7 +316,7 @@ camel/terminators/__init__.py,sha256=t8uqrkUnXEOYMXQDgaBkMFJ0EXFKI0kmx4cUimli3Ls
316
316
  camel/terminators/base.py,sha256=xmJzERX7GdSXcxZjAHHODa0rOxRChMSRboDCNHWSscs,1511
317
317
  camel/terminators/response_terminator.py,sha256=n3G5KP6Oj7-7WlRN0yFcrtLpqAJKaKS0bmhrWlFfCgQ,4982
318
318
  camel/terminators/token_limit_terminator.py,sha256=YWv6ZR8R9yI2Qnf_3xES5bEE_O5bb2CxQ0EUXfMh34c,2118
319
- camel/toolkits/__init__.py,sha256=xnzCDolb9-0sVI9cvsNPIYATgSHK6pnnHos-O7UOgKQ,5649
319
+ camel/toolkits/__init__.py,sha256=_pj0AsKLAQ3hezISovNfUESXGUDQ9R98YAs_jmRolhw,5719
320
320
  camel/toolkits/aci_toolkit.py,sha256=39AsXloBb16hHB7DKi6mFU6NPZ3iVpM2FZgaP4o4eLE,16060
321
321
  camel/toolkits/arxiv_toolkit.py,sha256=mw629nIN_ozaAxNv3nbvhonJKNI2-97ScRCBS3gVqNo,6297
322
322
  camel/toolkits/ask_news_toolkit.py,sha256=WfWaqwEo1Apbil3-Rb5y65Ws43NU4rAFWZu5VHe4los,23448
@@ -358,6 +358,7 @@ camel/toolkits/open_api_toolkit.py,sha256=Venfq8JwTMQfzRzzB7AYmYUMEX35hW0BjIv_oz
358
358
  camel/toolkits/openai_agent_toolkit.py,sha256=hT2ancdQigngAiY1LNnGJzZeiBDHUxrRGv6BdZTJizc,4696
359
359
  camel/toolkits/openai_image_toolkit.py,sha256=-7_3utTx3T2GgDSW5Sdz4yBDzUcBMimC2QUaXXvDWXg,11168
360
360
  camel/toolkits/openbb_toolkit.py,sha256=8yBZL9E2iSgskosBQhD3pTP56oV6gerWpFjIJc_2UMo,28935
361
+ camel/toolkits/origene_mcp_toolkit.py,sha256=tcYjYNiAyULQFtEgvCRa17WcBN7h-Um6dqulXnbCBdk,3085
361
362
  camel/toolkits/page_script.js,sha256=mXepZPnQNVLp_Wgb64lv7DMQIJYl_XIHJHLVt1OFZO4,13146
362
363
  camel/toolkits/playwright_mcp_toolkit.py,sha256=TRweKatFu-7UzfiuXrud2D_4OQjbf4tdP_sCBJ69FG8,3018
363
364
  camel/toolkits/pptx_toolkit.py,sha256=kE2sofzAm0Hmawj7oOu0Z7D-RdJRBAIG-Bdfxoag3zU,29136
@@ -373,7 +374,7 @@ camel/toolkits/slack_toolkit.py,sha256=ZT6Ndlce2qjGsyZaNMfQ54nSEi7DOC9Ro7YqtK-u5
373
374
  camel/toolkits/stripe_toolkit.py,sha256=07swo5znGTnorafC1uYLKB4NRcJIOPOx19J7tkpLYWk,10102
374
375
  camel/toolkits/sympy_toolkit.py,sha256=BAQnI8EFJydNUpKQWXBdleQ1Cm-srDBhFlqp9V9pbPQ,33757
375
376
  camel/toolkits/task_planning_toolkit.py,sha256=Ttw9fHae4omGC1SA-6uaeXVHJ1YkwiVloz_hO-fm1gw,4855
376
- camel/toolkits/terminal_toolkit.py,sha256=_VvSk1iPDNeA8q_D-2ianDhFqaYljSYM6ynTrzMFm4A,59076
377
+ camel/toolkits/terminal_toolkit.py,sha256=RssGBgrK8JGI188JQlmKwRnuJxwfj80swd9tbY1H2dM,58559
377
378
  camel/toolkits/thinking_toolkit.py,sha256=nZYLvKWIx2BM1DYu69I9B5EISAG7aYcLYXKv9663BVk,8000
378
379
  camel/toolkits/twitter_toolkit.py,sha256=Px4N8aUxUzy01LhGSWkdrC2JgwKkrY3cvxgMeJ2XYfU,15939
379
380
  camel/toolkits/video_analysis_toolkit.py,sha256=Wh08MAVvs3PtgXN88Sk0TXYaGfVmQAol8FPCXMPPpIM,23375
@@ -385,9 +386,9 @@ camel/toolkits/zapier_toolkit.py,sha256=A83y1UcfuopH7Fx82pORzypl1StbhBjB2HhyOqYa
385
386
  camel/toolkits/hybrid_browser_toolkit/__init__.py,sha256=vxjWhq7GjUKE5I9RGQU_GoikZJ-AVK4ertdvEqp9pd0,802
386
387
  camel/toolkits/hybrid_browser_toolkit/actions.py,sha256=x6X-kEdQx3K1ID-BBwdQEciX6C0KMt5QUszpnksnj3A,15003
387
388
  camel/toolkits/hybrid_browser_toolkit/agent.py,sha256=0ifwhYUDJ5GLxfdpC5KquPaW1a0QBAutp2Y9y0YFujw,11685
388
- camel/toolkits/hybrid_browser_toolkit/browser_session.py,sha256=LdXjF4eBFuqoRnbPU0ErBtR5wtbcv3cv-hBXtiDkgMg,27102
389
+ camel/toolkits/hybrid_browser_toolkit/browser_session.py,sha256=fgV1o4pWOQ_fUvmpk7UHYcJCqHY_cmivoY_OB0ZKv3s,26866
389
390
  camel/toolkits/hybrid_browser_toolkit/config_loader.py,sha256=0zpDq3aFKEva2jc38kgLHnyxypIDk9SOcMjoP26tozo,15414
390
- camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit.py,sha256=5rrwj7H3qKoSUaDBPozWxcGqbdCInUrhhDTPZ6O7ZBU,77550
391
+ camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit.py,sha256=0tNgYEEiTvgQ-_m2bRT3zSmClqyoHeF1VvMZuPce9Ow,77477
391
392
  camel/toolkits/hybrid_browser_toolkit/snapshot.py,sha256=3vQaFK5C1P8WnkK2eDMaFOizrZf4uUAW0LxdeoF4F2w,8539
392
393
  camel/toolkits/hybrid_browser_toolkit/stealth_script.js,sha256=z4XRSVUpAS87Sj36s3bY8XXhvRcHBlgsUOyMxV2HI80,27650
393
394
  camel/toolkits/hybrid_browser_toolkit/unified_analyzer.js,sha256=VnzIn0KcEtxuncJi-OPZzdWbLSeSHCH-7sviFAGNM8g,40823
@@ -417,10 +418,10 @@ camel/toolkits/open_api_specs/web_scraper/openapi.yaml,sha256=u_WalQ01e8W1D27VnZ
417
418
  camel/toolkits/open_api_specs/web_scraper/paths/__init__.py,sha256=OKCZrQCDwaWtXIN_2rA9FSqEvgpQRieRoHh7Ek6N16A,702
418
419
  camel/toolkits/open_api_specs/web_scraper/paths/scraper.py,sha256=aWy1_ppV4NVVEZfnbN3tu9XA9yAPAC9bRStJ5JuXMRU,1117
419
420
  camel/types/__init__.py,sha256=pFTg3CWGSCfwFdoxPDTf4dKV8DdJS1x-bBPuEOmtdf0,2549
420
- camel/types/enums.py,sha256=qEPE2r4Np7JgJqSsZmM0SNQ8_hy19aeCn5da3pK93so,62948
421
+ camel/types/enums.py,sha256=Zf37-MvLlbZt6WLNRMDi5UWiVDN1Q2CeZvLPSbFcg_Q,63051
421
422
  camel/types/mcp_registries.py,sha256=dl4LgYtSaUhsqAKpz28k_SA9La11qxqBvDLaEuyzrFE,4971
422
423
  camel/types/openai_types.py,sha256=8ZFzLe-zGmKNPfuVZFzxlxAX98lGf18gtrPhOgMmzus,2104
423
- camel/types/unified_model_type.py,sha256=ZweHiS4MQ1QbDEX3a3oUc-pvgueYP27Zt0SlAPcYg_4,5623
424
+ camel/types/unified_model_type.py,sha256=U3NUZux7QuMIxPW2H0qDp9BOyDJFHAx6jUmDNw5_9KM,5912
424
425
  camel/types/agents/__init__.py,sha256=cbvVkogPoZgcwZrgxLH6EtpGXk0kavF79nOic0Dc1vg,786
425
426
  camel/types/agents/tool_calling_record.py,sha256=xG0a9TJu-nQQ9aAxpZwYmgqnpjEbnm2cRjjG8uDSIbg,1979
426
427
  camel/utils/__init__.py,sha256=qQeMHZJ8Bbgpm4tBu-LWc_P3iFjXBlVfALdKTiD_s8I,3305
@@ -431,7 +432,7 @@ camel/utils/deduplication.py,sha256=UHikAtOW1TTDunf2t_wa2kFbmkrXWf7HfOKwLvwCxzo,
431
432
  camel/utils/filename.py,sha256=HYNc1wbSCgNR1CN21cwHxdAhpnsf5ySJ6jUDfeqOK20,2532
432
433
  camel/utils/langfuse.py,sha256=OowR6A790XG-b0UHiTYduYvS18PvSGFdmqki2Poogo0,8578
433
434
  camel/utils/mcp.py,sha256=iuthL8VuUXIRU34Nvx8guq7frfglpZoxewUKuAg3e1s,5077
434
- camel/utils/mcp_client.py,sha256=-EIUj6v2hXB75Xvj2FyEedwUMEpUUVXzXWNLLYGrJfE,37305
435
+ camel/utils/mcp_client.py,sha256=o-EPdJ5EL5M9sjkSADvLBz9IoHhtXteKGidauIxw3ps,37584
435
436
  camel/utils/message_summarizer.py,sha256=7AvPDlevle5uU3mXtfvSFS--nDjp9yqfrf546qTe9rE,5939
436
437
  camel/utils/response_format.py,sha256=xZcx6xBxeg3A0e7R0JCMJdNm2oQ1-diqVLs0JsiCkZU,5319
437
438
  camel/utils/token_counting.py,sha256=apkERzNoVc4sgvJvWVosvepX3KH8pVypVjrL4AA7RB4,17521
@@ -446,7 +447,7 @@ camel/verifiers/math_verifier.py,sha256=tA1D4S0sm8nsWISevxSN0hvSVtIUpqmJhzqfbuMo
446
447
  camel/verifiers/models.py,sha256=GdxYPr7UxNrR1577yW4kyroRcLGfd-H1GXgv8potDWU,2471
447
448
  camel/verifiers/physics_verifier.py,sha256=c1grrRddcrVN7szkxhv2QirwY9viIRSITWeWFF5HmLs,30187
448
449
  camel/verifiers/python_verifier.py,sha256=ogTz77wODfEcDN4tMVtiSkRQyoiZbHPY2fKybn59lHw,20558
449
- camel_ai-0.2.72a2.dist-info/METADATA,sha256=DCvskziajpL3_f8dK9Nnh1AEAeX2AEGza114yFYimL0,49998
450
- camel_ai-0.2.72a2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
451
- camel_ai-0.2.72a2.dist-info/licenses/LICENSE,sha256=id0nB2my5kG0xXeimIu5zZrbHLS6EQvxvkKkzIHaT2k,11343
452
- camel_ai-0.2.72a2.dist-info/RECORD,,
450
+ camel_ai-0.2.72a5.dist-info/METADATA,sha256=Wz9MWyKAIycL-cbi72RKL7fa0PGkah967IzH03-ag_o,50002
451
+ camel_ai-0.2.72a5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
452
+ camel_ai-0.2.72a5.dist-info/licenses/LICENSE,sha256=id0nB2my5kG0xXeimIu5zZrbHLS6EQvxvkKkzIHaT2k,11343
453
+ camel_ai-0.2.72a5.dist-info/RECORD,,