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.
- camel/__init__.py +1 -1
- camel/agents/chat_agent.py +92 -18
- camel/models/openai_model.py +29 -15
- camel/toolkits/__init__.py +2 -0
- camel/toolkits/hybrid_browser_toolkit/browser_session.py +124 -123
- camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit.py +19 -19
- camel/toolkits/origene_mcp_toolkit.py +95 -0
- camel/toolkits/terminal_toolkit.py +135 -158
- camel/types/enums.py +6 -3
- camel/types/unified_model_type.py +16 -4
- camel/utils/mcp_client.py +8 -0
- {camel_ai-0.2.72a2.dist-info → camel_ai-0.2.72a5.dist-info}/METADATA +3 -3
- {camel_ai-0.2.72a2.dist-info → camel_ai-0.2.72a5.dist-info}/RECORD +15 -14
- {camel_ai-0.2.72a2.dist-info → camel_ai-0.2.72a5.dist-info}/WHEEL +0 -0
- {camel_ai-0.2.72a2.dist-info → camel_ai-0.2.72a5.dist-info}/licenses/LICENSE +0 -0
|
@@ -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
|
-
"
|
|
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
|
-
|
|
922
|
-
|
|
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
|
-
|
|
928
|
-
|
|
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
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
#
|
|
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
|
-
|
|
940
|
-
|
|
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
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
#
|
|
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
|
-
|
|
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
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
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
|
-
|
|
1493
|
-
|
|
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
|
-
|
|
1504
|
-
|
|
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
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
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
|
|
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
|
|
37
|
-
instance = super().__new__(cls,
|
|
38
|
-
cls._cache[
|
|
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[
|
|
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.
|
|
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.
|
|
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.
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
|
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.
|
|
450
|
-
camel_ai-0.2.
|
|
451
|
-
camel_ai-0.2.
|
|
452
|
-
camel_ai-0.2.
|
|
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,,
|
|
File without changes
|
|
File without changes
|