camel-ai 0.2.9__py3-none-any.whl → 0.2.10__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.

Files changed (236) hide show
  1. camel/__init__.py +5 -5
  2. camel/agents/__init__.py +4 -4
  3. camel/agents/base.py +4 -4
  4. camel/agents/chat_agent.py +32 -37
  5. camel/agents/critic_agent.py +4 -4
  6. camel/agents/deductive_reasoner_agent.py +4 -4
  7. camel/agents/embodied_agent.py +4 -4
  8. camel/agents/knowledge_graph_agent.py +4 -4
  9. camel/agents/role_assignment_agent.py +4 -4
  10. camel/agents/search_agent.py +4 -4
  11. camel/agents/task_agent.py +4 -4
  12. camel/agents/tool_agents/__init__.py +4 -4
  13. camel/agents/tool_agents/base.py +4 -4
  14. camel/agents/tool_agents/hugging_face_tool_agent.py +4 -4
  15. camel/bots/__init__.py +4 -4
  16. camel/bots/discord_app.py +4 -4
  17. camel/bots/slack/__init__.py +4 -4
  18. camel/bots/slack/models.py +4 -4
  19. camel/bots/slack/slack_app.py +4 -4
  20. camel/bots/telegram_bot.py +4 -4
  21. camel/configs/__init__.py +10 -4
  22. camel/configs/anthropic_config.py +4 -4
  23. camel/configs/base_config.py +4 -4
  24. camel/configs/cohere_config.py +76 -0
  25. camel/configs/deepseek_config.py +134 -0
  26. camel/configs/gemini_config.py +85 -127
  27. camel/configs/groq_config.py +4 -4
  28. camel/configs/litellm_config.py +4 -4
  29. camel/configs/mistral_config.py +4 -4
  30. camel/configs/ollama_config.py +4 -4
  31. camel/configs/openai_config.py +32 -7
  32. camel/configs/qwen_config.py +4 -4
  33. camel/configs/reka_config.py +4 -4
  34. camel/configs/samba_config.py +4 -4
  35. camel/configs/togetherai_config.py +4 -4
  36. camel/configs/vllm_config.py +4 -4
  37. camel/configs/yi_config.py +4 -4
  38. camel/configs/zhipuai_config.py +4 -4
  39. camel/embeddings/__init__.py +6 -4
  40. camel/embeddings/base.py +4 -4
  41. camel/embeddings/mistral_embedding.py +4 -4
  42. camel/embeddings/openai_compatible_embedding.py +91 -0
  43. camel/embeddings/openai_embedding.py +4 -4
  44. camel/embeddings/sentence_transformers_embeddings.py +4 -4
  45. camel/embeddings/vlm_embedding.py +4 -4
  46. camel/generators.py +4 -4
  47. camel/human.py +4 -4
  48. camel/interpreters/__init__.py +4 -4
  49. camel/interpreters/base.py +4 -4
  50. camel/interpreters/docker_interpreter.py +4 -4
  51. camel/interpreters/internal_python_interpreter.py +4 -4
  52. camel/interpreters/interpreter_error.py +4 -4
  53. camel/interpreters/ipython_interpreter.py +4 -4
  54. camel/interpreters/subprocess_interpreter.py +4 -4
  55. camel/loaders/__init__.py +4 -4
  56. camel/loaders/apify_reader.py +4 -4
  57. camel/loaders/base_io.py +4 -4
  58. camel/loaders/chunkr_reader.py +4 -4
  59. camel/loaders/firecrawl_reader.py +4 -4
  60. camel/loaders/jina_url_reader.py +4 -4
  61. camel/loaders/unstructured_io.py +4 -4
  62. camel/memories/__init__.py +4 -4
  63. camel/memories/agent_memories.py +4 -4
  64. camel/memories/base.py +4 -4
  65. camel/memories/blocks/__init__.py +4 -4
  66. camel/memories/blocks/chat_history_block.py +4 -4
  67. camel/memories/blocks/vectordb_block.py +4 -4
  68. camel/memories/context_creators/__init__.py +4 -4
  69. camel/memories/context_creators/score_based.py +4 -4
  70. camel/memories/records.py +4 -4
  71. camel/messages/__init__.py +20 -4
  72. camel/messages/base.py +108 -4
  73. camel/messages/conversion/__init__.py +29 -0
  74. camel/messages/conversion/models.py +178 -0
  75. camel/messages/conversion/sharegpt/__init__.py +20 -0
  76. camel/messages/conversion/sharegpt/function_call_formatter.py +49 -0
  77. camel/messages/conversion/sharegpt/hermes/__init__.py +19 -0
  78. camel/messages/conversion/sharegpt/hermes/hermes_function_formatter.py +128 -0
  79. camel/messages/func_message.py +50 -4
  80. camel/models/__init__.py +8 -4
  81. camel/models/anthropic_model.py +4 -4
  82. camel/models/azure_openai_model.py +4 -4
  83. camel/models/base_model.py +4 -4
  84. camel/models/cohere_model.py +282 -0
  85. camel/models/deepseek_model.py +139 -0
  86. camel/models/gemini_model.py +61 -146
  87. camel/models/groq_model.py +4 -4
  88. camel/models/litellm_model.py +4 -4
  89. camel/models/mistral_model.py +4 -4
  90. camel/models/model_factory.py +10 -4
  91. camel/models/nemotron_model.py +4 -4
  92. camel/models/ollama_model.py +4 -4
  93. camel/models/openai_audio_models.py +4 -4
  94. camel/models/openai_compatible_model.py +4 -4
  95. camel/models/openai_model.py +42 -4
  96. camel/models/qwen_model.py +4 -4
  97. camel/models/reka_model.py +4 -4
  98. camel/models/samba_model.py +6 -5
  99. camel/models/stub_model.py +4 -4
  100. camel/models/togetherai_model.py +4 -4
  101. camel/models/vllm_model.py +4 -4
  102. camel/models/yi_model.py +4 -4
  103. camel/models/zhipuai_model.py +4 -4
  104. camel/personas/__init__.py +17 -0
  105. camel/personas/persona.py +103 -0
  106. camel/personas/persona_hub.py +293 -0
  107. camel/prompts/__init__.py +6 -4
  108. camel/prompts/ai_society.py +4 -4
  109. camel/prompts/base.py +4 -4
  110. camel/prompts/code.py +4 -4
  111. camel/prompts/evaluation.py +4 -4
  112. camel/prompts/generate_text_embedding_data.py +4 -4
  113. camel/prompts/image_craft.py +4 -4
  114. camel/prompts/misalignment.py +4 -4
  115. camel/prompts/multi_condition_image_craft.py +4 -4
  116. camel/prompts/object_recognition.py +4 -4
  117. camel/prompts/persona_hub.py +61 -0
  118. camel/prompts/prompt_templates.py +4 -4
  119. camel/prompts/role_description_prompt_template.py +4 -4
  120. camel/prompts/solution_extraction.py +4 -4
  121. camel/prompts/task_prompt_template.py +4 -4
  122. camel/prompts/translation.py +4 -4
  123. camel/prompts/video_description_prompt.py +4 -4
  124. camel/responses/__init__.py +4 -4
  125. camel/responses/agent_responses.py +4 -4
  126. camel/retrievers/__init__.py +4 -4
  127. camel/retrievers/auto_retriever.py +4 -4
  128. camel/retrievers/base.py +4 -4
  129. camel/retrievers/bm25_retriever.py +4 -4
  130. camel/retrievers/cohere_rerank_retriever.py +7 -9
  131. camel/retrievers/vector_retriever.py +4 -4
  132. camel/runtime/__init__.py +29 -0
  133. camel/runtime/api.py +93 -0
  134. camel/runtime/base.py +45 -0
  135. camel/runtime/configs.py +56 -0
  136. camel/runtime/docker_runtime.py +404 -0
  137. camel/runtime/llm_guard_runtime.py +199 -0
  138. camel/runtime/remote_http_runtime.py +204 -0
  139. camel/runtime/utils/__init__.py +20 -0
  140. camel/runtime/utils/function_risk_toolkit.py +58 -0
  141. camel/runtime/utils/ignore_risk_toolkit.py +72 -0
  142. camel/schemas/__init__.py +17 -0
  143. camel/schemas/base.py +45 -0
  144. camel/schemas/openai_converter.py +116 -0
  145. camel/societies/__init__.py +4 -4
  146. camel/societies/babyagi_playing.py +4 -4
  147. camel/societies/role_playing.py +4 -4
  148. camel/societies/workforce/__init__.py +4 -4
  149. camel/societies/workforce/base.py +4 -4
  150. camel/societies/workforce/prompts.py +4 -4
  151. camel/societies/workforce/role_playing_worker.py +4 -4
  152. camel/societies/workforce/single_agent_worker.py +4 -4
  153. camel/societies/workforce/task_channel.py +4 -4
  154. camel/societies/workforce/utils.py +4 -4
  155. camel/societies/workforce/worker.py +4 -4
  156. camel/societies/workforce/workforce.py +7 -7
  157. camel/storages/__init__.py +4 -4
  158. camel/storages/graph_storages/__init__.py +4 -4
  159. camel/storages/graph_storages/base.py +4 -4
  160. camel/storages/graph_storages/graph_element.py +4 -4
  161. camel/storages/graph_storages/nebula_graph.py +4 -4
  162. camel/storages/graph_storages/neo4j_graph.py +4 -4
  163. camel/storages/key_value_storages/__init__.py +4 -4
  164. camel/storages/key_value_storages/base.py +4 -4
  165. camel/storages/key_value_storages/in_memory.py +4 -4
  166. camel/storages/key_value_storages/json.py +4 -4
  167. camel/storages/key_value_storages/redis.py +4 -4
  168. camel/storages/object_storages/__init__.py +4 -4
  169. camel/storages/object_storages/amazon_s3.py +4 -4
  170. camel/storages/object_storages/azure_blob.py +4 -4
  171. camel/storages/object_storages/base.py +4 -4
  172. camel/storages/object_storages/google_cloud.py +4 -4
  173. camel/storages/vectordb_storages/__init__.py +4 -4
  174. camel/storages/vectordb_storages/base.py +4 -4
  175. camel/storages/vectordb_storages/milvus.py +4 -4
  176. camel/storages/vectordb_storages/qdrant.py +4 -4
  177. camel/tasks/__init__.py +4 -4
  178. camel/tasks/task.py +4 -4
  179. camel/tasks/task_prompt.py +4 -4
  180. camel/terminators/__init__.py +4 -4
  181. camel/terminators/base.py +4 -4
  182. camel/terminators/response_terminator.py +4 -4
  183. camel/terminators/token_limit_terminator.py +4 -4
  184. camel/toolkits/__init__.py +13 -17
  185. camel/toolkits/arxiv_toolkit.py +4 -4
  186. camel/toolkits/ask_news_toolkit.py +7 -18
  187. camel/toolkits/base.py +4 -4
  188. camel/toolkits/code_execution.py +20 -7
  189. camel/toolkits/dalle_toolkit.py +4 -7
  190. camel/toolkits/data_commons_toolkit.py +4 -4
  191. camel/toolkits/function_tool.py +220 -69
  192. camel/toolkits/github_toolkit.py +4 -4
  193. camel/toolkits/google_maps_toolkit.py +4 -4
  194. camel/toolkits/google_scholar_toolkit.py +4 -4
  195. camel/toolkits/human_toolkit.py +52 -0
  196. camel/toolkits/linkedin_toolkit.py +4 -4
  197. camel/toolkits/math_toolkit.py +4 -7
  198. camel/toolkits/notion_toolkit.py +4 -4
  199. camel/toolkits/open_api_specs/biztoc/__init__.py +4 -4
  200. camel/toolkits/open_api_specs/coursera/__init__.py +4 -4
  201. camel/toolkits/open_api_specs/create_qr_code/__init__.py +4 -4
  202. camel/toolkits/open_api_specs/klarna/__init__.py +4 -4
  203. camel/toolkits/open_api_specs/nasa_apod/__init__.py +4 -4
  204. camel/toolkits/open_api_specs/outschool/__init__.py +4 -4
  205. camel/toolkits/open_api_specs/outschool/paths/__init__.py +4 -4
  206. camel/toolkits/open_api_specs/outschool/paths/get_classes.py +4 -4
  207. camel/toolkits/open_api_specs/outschool/paths/search_teachers.py +4 -4
  208. camel/toolkits/open_api_specs/security_config.py +4 -4
  209. camel/toolkits/open_api_specs/speak/__init__.py +4 -4
  210. camel/toolkits/open_api_specs/web_scraper/__init__.py +4 -4
  211. camel/toolkits/open_api_specs/web_scraper/paths/__init__.py +4 -4
  212. camel/toolkits/open_api_specs/web_scraper/paths/scraper.py +4 -4
  213. camel/toolkits/open_api_toolkit.py +4 -4
  214. camel/toolkits/reddit_toolkit.py +4 -4
  215. camel/toolkits/retrieval_toolkit.py +4 -4
  216. camel/toolkits/search_toolkit.py +49 -29
  217. camel/toolkits/slack_toolkit.py +4 -4
  218. camel/toolkits/twitter_toolkit.py +10 -13
  219. camel/toolkits/video_toolkit.py +211 -0
  220. camel/toolkits/weather_toolkit.py +4 -7
  221. camel/toolkits/whatsapp_toolkit.py +6 -6
  222. camel/types/__init__.py +6 -4
  223. camel/types/enums.py +77 -7
  224. camel/types/openai_types.py +6 -4
  225. camel/types/unified_model_type.py +9 -4
  226. camel/utils/__init__.py +35 -33
  227. camel/utils/async_func.py +4 -4
  228. camel/utils/commons.py +4 -4
  229. camel/utils/constants.py +4 -4
  230. camel/utils/response_format.py +63 -0
  231. camel/utils/token_counting.py +4 -4
  232. {camel_ai-0.2.9.dist-info → camel_ai-0.2.10.dist-info}/METADATA +108 -56
  233. camel_ai-0.2.10.dist-info/RECORD +246 -0
  234. camel_ai-0.2.9.dist-info/RECORD +0 -215
  235. {camel_ai-0.2.9.dist-info → camel_ai-0.2.10.dist-info}/LICENSE +0 -0
  236. {camel_ai-0.2.9.dist-info → camel_ai-0.2.10.dist-info}/WHEEL +0 -0
@@ -0,0 +1,211 @@
1
+ # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
2
+ # Licensed under the Apache License, Version 2.0 (the "License");
3
+ # you may not use this file except in compliance with the License.
4
+ # You may obtain a copy of the License at
5
+ #
6
+ # http://www.apache.org/licenses/LICENSE-2.0
7
+ #
8
+ # Unless required by applicable law or agreed to in writing, software
9
+ # distributed under the License is distributed on an "AS IS" BASIS,
10
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ # See the License for the specific language governing permissions and
12
+ # limitations under the License.
13
+ # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
14
+
15
+ import io
16
+ import logging
17
+ import re
18
+ import tempfile
19
+ from pathlib import Path
20
+ from typing import List, Optional
21
+
22
+ from PIL import Image
23
+
24
+ from camel.toolkits.base import BaseToolkit
25
+ from camel.toolkits.function_tool import FunctionTool
26
+ from camel.utils import dependencies_required
27
+
28
+ logger = logging.getLogger(__name__)
29
+
30
+
31
+ def _standardize_url(url: str) -> str:
32
+ r"""Standardize the given URL."""
33
+ # Special case for YouTube embed URLs
34
+ if "youtube.com/embed/" in url:
35
+ match = re.search(r"embed/([a-zA-Z0-9_-]+)", url)
36
+ if match:
37
+ return f"https://www.youtube.com/watch?v={match.group(1)}"
38
+ else:
39
+ raise ValueError(f"Invalid YouTube URL: {url}")
40
+
41
+ return url
42
+
43
+
44
+ def _capture_screenshot(video_file: str, timestamp: float) -> Image.Image:
45
+ r"""Capture a screenshot from a video file at a specific timestamp.
46
+
47
+ Args:
48
+ video_file (str): The path to the video file.
49
+ timestamp (float): The time in seconds from which to capture the
50
+ screenshot.
51
+
52
+ Returns:
53
+ Image.Image: The captured screenshot in the form of Image.Image.
54
+ """
55
+ import ffmpeg
56
+
57
+ try:
58
+ out, _ = (
59
+ ffmpeg.input(video_file, ss=timestamp)
60
+ .filter('scale', 320, -1)
61
+ .output('pipe:', vframes=1, format='image2', vcodec='png')
62
+ .run(capture_stdout=True, capture_stderr=True)
63
+ )
64
+ except ffmpeg.Error as e:
65
+ raise RuntimeError(f"Failed to capture screenshot: {e.stderr}")
66
+
67
+ return Image.open(io.BytesIO(out))
68
+
69
+
70
+ class VideoDownloaderToolkit(BaseToolkit):
71
+ r"""A class for downloading videos and optionally splitting them into
72
+ chunks.
73
+
74
+ Args:
75
+ download_directory (Optional[str], optional): The directory where the
76
+ video will be downloaded to. If not provided, video will be stored
77
+ in a temporary directory and will be cleaned up after use.
78
+ (default: :obj:`None`)
79
+ cookies_path (Optional[str], optional): The path to the cookies file
80
+ for the video service in Netscape format. (default: :obj:`None`)
81
+ """
82
+
83
+ @dependencies_required("yt_dlp", "ffmpeg")
84
+ def __init__(
85
+ self,
86
+ download_directory: Optional[str] = None,
87
+ cookies_path: Optional[str] = None,
88
+ ) -> None:
89
+ self._cleanup = download_directory is None
90
+ self._cookies_path = cookies_path
91
+
92
+ self._download_directory = Path(
93
+ download_directory or tempfile.mkdtemp()
94
+ ).resolve()
95
+
96
+ try:
97
+ self._download_directory.mkdir(parents=True, exist_ok=True)
98
+ except FileExistsError:
99
+ raise ValueError(
100
+ f"{self._download_directory} is not a valid directory."
101
+ )
102
+ except OSError as e:
103
+ raise ValueError(
104
+ f"Error creating directory {self._download_directory}: {e}"
105
+ )
106
+
107
+ logger.info(f"Video will be downloaded to {self._download_directory}")
108
+
109
+ def __del__(self) -> None:
110
+ r"""Deconstructor for the VideoDownloaderToolkit class.
111
+
112
+ Cleans up the downloaded video if they are stored in a temporary
113
+ directory.
114
+ """
115
+ import shutil
116
+
117
+ if self._cleanup:
118
+ shutil.rmtree(self._download_directory, ignore_errors=True)
119
+
120
+ def _download_video(self, url: str) -> str:
121
+ r"""Download the video and optionally split it into chunks.
122
+
123
+ yt-dlp will detect if the video is downloaded automatically so there
124
+ is no need to check if the video exists.
125
+
126
+ Returns:
127
+ str: The path to the downloaded video file.
128
+ """
129
+ import yt_dlp
130
+
131
+ video_template = self._download_directory / "%(title)s.%(ext)s"
132
+ ydl_opts = {
133
+ 'format': 'bestvideo+bestaudio/best',
134
+ 'outtmpl': str(video_template),
135
+ 'force_generic_extractor': True,
136
+ 'cookiefile': self._cookies_path,
137
+ }
138
+
139
+ try:
140
+ with yt_dlp.YoutubeDL(ydl_opts) as ydl:
141
+ # Download the video and get the filename
142
+ logger.info(f"Downloading video from {url}...")
143
+ info = ydl.extract_info(url, download=True)
144
+ return ydl.prepare_filename(info)
145
+ except yt_dlp.utils.DownloadError as e:
146
+ raise RuntimeError(f"Failed to download video from {url}: {e}")
147
+
148
+ def get_video_bytes(
149
+ self,
150
+ video_url: str,
151
+ ) -> bytes:
152
+ r"""Download video by the URL, and return the content in bytes.
153
+
154
+ Args:
155
+ video_url (str): The URL of the video to download.
156
+
157
+ Returns:
158
+ bytes: The video file content in bytes.
159
+ """
160
+ url = _standardize_url(video_url)
161
+ video_file = self._download_video(url)
162
+
163
+ with open(video_file, 'rb') as f:
164
+ video_bytes = f.read()
165
+
166
+ return video_bytes
167
+
168
+ def get_video_screenshots(
169
+ self, video_url: str, amount: int
170
+ ) -> List[Image.Image]:
171
+ r"""Capture screenshots from the video at specified timestamps or by
172
+ dividing the video into equal parts if an integer is provided.
173
+
174
+ Args:
175
+ video_url (str): The URL of the video to take screenshots.
176
+ amount (int): the amount of evenly split screenshots to capture.
177
+
178
+ Returns:
179
+ List[Image.Image]: A list of screenshots as Image.Image.
180
+ """
181
+ import ffmpeg
182
+
183
+ url = _standardize_url(video_url)
184
+ video_file = self._download_video(url)
185
+
186
+ # Get the video length
187
+ try:
188
+ probe = ffmpeg.probe(video_file)
189
+ video_length = float(probe['format']['duration'])
190
+ except ffmpeg.Error as e:
191
+ raise RuntimeError(f"Failed to determine video length: {e.stderr}")
192
+
193
+ interval = video_length / (amount + 1)
194
+ timestamps = [i * interval for i in range(1, amount + 1)]
195
+
196
+ images = [_capture_screenshot(video_file, ts) for ts in timestamps]
197
+
198
+ return images
199
+
200
+ def get_tools(self) -> List[FunctionTool]:
201
+ r"""Returns a list of FunctionTool objects representing the
202
+ functions in the toolkit.
203
+
204
+ Returns:
205
+ List[FunctionTool]: A list of FunctionTool objects representing
206
+ the functions in the toolkit.
207
+ """
208
+ return [
209
+ FunctionTool(self.get_video_bytes),
210
+ FunctionTool(self.get_video_screenshots),
211
+ ]
@@ -1,16 +1,16 @@
1
- # =========== Copyright 2023 @ CAMEL-AI.org. All Rights Reserved. ===========
2
- # Licensed under the Apache License, Version 2.0 (the License);
1
+ # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
2
+ # Licensed under the Apache License, Version 2.0 (the "License");
3
3
  # you may not use this file except in compliance with the License.
4
4
  # You may obtain a copy of the License at
5
5
  #
6
6
  # http://www.apache.org/licenses/LICENSE-2.0
7
7
  #
8
8
  # Unless required by applicable law or agreed to in writing, software
9
- # distributed under the License is distributed on an AS IS BASIS,
9
+ # distributed under the License is distributed on an "AS IS" BASIS,
10
10
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
11
  # See the License for the specific language governing permissions and
12
12
  # limitations under the License.
13
- # =========== Copyright 2023 @ CAMEL-AI.org. All Rights Reserved. ===========
13
+ # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
14
14
  import os
15
15
  from typing import List, Literal
16
16
 
@@ -168,6 +168,3 @@ class WeatherToolkit(BaseToolkit):
168
168
  return [
169
169
  FunctionTool(self.get_weather_data),
170
170
  ]
171
-
172
-
173
- WEATHER_FUNCS: List[FunctionTool] = WeatherToolkit().get_tools()
@@ -1,16 +1,16 @@
1
- # =========== Copyright 2023 @ CAMEL-AI.org. All Rights Reserved. ===========
2
- # Licensed under the Apache License, Version 2.0 (the License);
1
+ # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
2
+ # Licensed under the Apache License, Version 2.0 (the "License");
3
3
  # you may not use this file except in compliance with the License.
4
4
  # You may obtain a copy of the License at
5
5
  #
6
6
  # http://www.apache.org/licenses/LICENSE-2.0
7
7
  #
8
8
  # Unless required by applicable law or agreed to in writing, software
9
- # distributed under the License is distributed on an AS IS BASIS,
9
+ # distributed under the License is distributed on an "AS IS" BASIS,
10
10
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
11
  # See the License for the specific language governing permissions and
12
12
  # limitations under the License.
13
- # =========== Copyright 2023 @ CAMEL-AI.org. All Rights Reserved. ===========
13
+ # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
14
14
 
15
15
  import os
16
16
  from typing import Any, Dict, List, Union
@@ -163,11 +163,11 @@ class WhatsAppToolkit(BaseToolkit):
163
163
  return f"Failed to retrieve business profile: {e!s}"
164
164
 
165
165
  def get_tools(self) -> List[FunctionTool]:
166
- r"""Returns a list of OpenAIFunction objects representing the
166
+ r"""Returns a list of FunctionTool objects representing the
167
167
  functions in the toolkit.
168
168
 
169
169
  Returns:
170
- List[OpenAIFunction]: A list of OpenAIFunction objects for the
170
+ List[FunctionTool]: A list of FunctionTool objects for the
171
171
  toolkit methods.
172
172
  """
173
173
  return [
camel/types/__init__.py CHANGED
@@ -1,16 +1,16 @@
1
- # =========== Copyright 2023 @ CAMEL-AI.org. All Rights Reserved. ===========
2
- # Licensed under the Apache License, Version 2.0 (the License);
1
+ # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
2
+ # Licensed under the Apache License, Version 2.0 (the "License");
3
3
  # you may not use this file except in compliance with the License.
4
4
  # You may obtain a copy of the License at
5
5
  #
6
6
  # http://www.apache.org/licenses/LICENSE-2.0
7
7
  #
8
8
  # Unless required by applicable law or agreed to in writing, software
9
- # distributed under the License is distributed on an AS IS BASIS,
9
+ # distributed under the License is distributed on an "AS IS" BASIS,
10
10
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
11
  # See the License for the specific language governing permissions and
12
12
  # limitations under the License.
13
- # =========== Copyright 2023 @ CAMEL-AI.org. All Rights Reserved. ===========
13
+ # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
14
14
  from .enums import (
15
15
  AudioModelType,
16
16
  EmbeddingModelType,
@@ -40,6 +40,7 @@ from .openai_types import (
40
40
  Choice,
41
41
  CompletionUsage,
42
42
  NotGiven,
43
+ ParsedChatCompletion,
43
44
  )
44
45
  from .unified_model_type import UnifiedModelType
45
46
 
@@ -71,4 +72,5 @@ __all__ = [
71
72
  'UnifiedModelType',
72
73
  'NOT_GIVEN',
73
74
  'NotGiven',
75
+ 'ParsedChatCompletion',
74
76
  ]
camel/types/enums.py CHANGED
@@ -1,16 +1,17 @@
1
- # =========== Copyright 2023 @ CAMEL-AI.org. All Rights Reserved. ===========
2
- # Licensed under the Apache License, Version 2.0 (the License);
1
+ # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
2
+ # Licensed under the Apache License, Version 2.0 (the "License");
3
3
  # you may not use this file except in compliance with the License.
4
4
  # You may obtain a copy of the License at
5
5
  #
6
6
  # http://www.apache.org/licenses/LICENSE-2.0
7
7
  #
8
8
  # Unless required by applicable law or agreed to in writing, software
9
- # distributed under the License is distributed on an AS IS BASIS,
9
+ # distributed under the License is distributed on an "AS IS" BASIS,
10
10
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
11
  # See the License for the specific language governing permissions and
12
12
  # limitations under the License.
13
- # =========== Copyright 2023 @ CAMEL-AI.org. All Rights Reserved. ===========
13
+ # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
14
+ import os
14
15
  from enum import Enum, EnumMeta
15
16
  from typing import cast
16
17
 
@@ -26,7 +27,7 @@ class RoleType(Enum):
26
27
 
27
28
 
28
29
  class ModelType(UnifiedModelType, Enum):
29
- DEFAULT = "gpt-4o-mini"
30
+ DEFAULT = os.getenv("DEFAULT_MODEL_TYPE", "gpt-4o-mini")
30
31
 
31
32
  GPT_3_5_TURBO = "gpt-3.5-turbo"
32
33
  GPT_4 = "gpt-4"
@@ -69,6 +70,7 @@ class ModelType(UnifiedModelType, Enum):
69
70
  # Gemini models
70
71
  GEMINI_1_5_FLASH = "gemini-1.5-flash"
71
72
  GEMINI_1_5_PRO = "gemini-1.5-pro"
73
+ GEMINI_EXP_1114 = "gemini-exp-1114"
72
74
 
73
75
  # Mistral AI models
74
76
  MISTRAL_3B = "ministral-3b-latest"
@@ -87,6 +89,13 @@ class ModelType(UnifiedModelType, Enum):
87
89
  REKA_FLASH = "reka-flash"
88
90
  REKA_EDGE = "reka-edge"
89
91
 
92
+ # Cohere models
93
+ COHERE_COMMAND_R_PLUS = "command-r-plus"
94
+ COHERE_COMMAND_R = "command-r"
95
+ COHERE_COMMAND_LIGHT = "command-light"
96
+ COHERE_COMMAND = "command"
97
+ COHERE_COMMAND_NIGHTLY = "command-nightly"
98
+
90
99
  # Qwen models (Aliyun)
91
100
  QWEN_MAX = "qwen-max"
92
101
  QWEN_PLUS = "qwen-plus"
@@ -97,6 +106,11 @@ class ModelType(UnifiedModelType, Enum):
97
106
  QWEN_MATH_PLUS = "qwen-math-plus"
98
107
  QWEN_MATH_TURBO = "qwen-math-turbo"
99
108
  QWEN_CODER_TURBO = "qwen-coder-turbo"
109
+ QWEN_2_5_CODER_32B = "qwen2.5-coder-32b-instruct"
110
+ QWEN_2_5_72B = "qwen2.5-72b-instruct"
111
+ QWEN_2_5_32B = "qwen2.5-32b-instruct"
112
+ QWEN_2_5_14B = "qwen2.5-14b-instruct"
113
+ QWEN_QWQ_32B = "qwq-32b-preview"
100
114
 
101
115
  # Yi models (01-ai)
102
116
  YI_LIGHTNING = "yi-lightning"
@@ -109,6 +123,9 @@ class ModelType(UnifiedModelType, Enum):
109
123
  YI_LARGE_RAG = "yi-large-rag"
110
124
  YI_LARGE_FC = "yi-large-fc"
111
125
 
126
+ # DeepSeek models
127
+ DEEPSEEK_CHAT = "deepseek-chat"
128
+
112
129
  def __str__(self):
113
130
  return self.value
114
131
 
@@ -227,6 +244,7 @@ class ModelType(UnifiedModelType, Enum):
227
244
  return self in {
228
245
  ModelType.GEMINI_1_5_FLASH,
229
246
  ModelType.GEMINI_1_5_PRO,
247
+ ModelType.GEMINI_EXP_1114,
230
248
  }
231
249
 
232
250
  @property
@@ -242,6 +260,21 @@ class ModelType(UnifiedModelType, Enum):
242
260
  ModelType.REKA_FLASH,
243
261
  }
244
262
 
263
+ @property
264
+ def is_cohere(self) -> bool:
265
+ r"""Returns whether this type of models is a Cohere model.
266
+
267
+ Returns:
268
+ bool: Whether this type of models is Cohere.
269
+ """
270
+ return self in {
271
+ ModelType.COHERE_COMMAND_R_PLUS,
272
+ ModelType.COHERE_COMMAND_R,
273
+ ModelType.COHERE_COMMAND_LIGHT,
274
+ ModelType.COHERE_COMMAND,
275
+ ModelType.COHERE_COMMAND_NIGHTLY,
276
+ }
277
+
245
278
  @property
246
279
  def is_yi(self) -> bool:
247
280
  r"""Returns whether this type of models is Yi model.
@@ -273,6 +306,17 @@ class ModelType(UnifiedModelType, Enum):
273
306
  ModelType.QWEN_MATH_PLUS,
274
307
  ModelType.QWEN_MATH_TURBO,
275
308
  ModelType.QWEN_CODER_TURBO,
309
+ ModelType.QWEN_2_5_CODER_32B,
310
+ ModelType.QWEN_2_5_72B,
311
+ ModelType.QWEN_2_5_32B,
312
+ ModelType.QWEN_2_5_14B,
313
+ ModelType.QWEN_QWQ_32B,
314
+ }
315
+
316
+ @property
317
+ def is_deepseek(self) -> bool:
318
+ return self in {
319
+ ModelType.DEEPSEEK_CHAT,
276
320
  }
277
321
 
278
322
  @property
@@ -292,6 +336,8 @@ class ModelType(UnifiedModelType, Enum):
292
336
  ModelType.REKA_FLASH,
293
337
  ModelType.QWEN_MATH_PLUS,
294
338
  ModelType.QWEN_MATH_TURBO,
339
+ ModelType.COHERE_COMMAND,
340
+ ModelType.COHERE_COMMAND_LIGHT,
295
341
  }:
296
342
  return 4_096
297
343
  elif self in {
@@ -324,9 +370,13 @@ class ModelType(UnifiedModelType, Enum):
324
370
  ModelType.YI_LARGE_FC,
325
371
  ModelType.QWEN_MAX,
326
372
  ModelType.QWEN_VL_MAX,
373
+ ModelType.QWEN_QWQ_32B,
327
374
  }:
328
375
  return 32_768
329
- elif self in {ModelType.MISTRAL_MIXTRAL_8x22B}:
376
+ elif self in {
377
+ ModelType.MISTRAL_MIXTRAL_8x22B,
378
+ ModelType.DEEPSEEK_CHAT,
379
+ }:
330
380
  return 64_000
331
381
  elif self in {
332
382
  ModelType.CLAUDE_2_0,
@@ -344,6 +394,13 @@ class ModelType(UnifiedModelType, Enum):
344
394
  ModelType.MISTRAL_PIXTRAL_12B,
345
395
  ModelType.MISTRAL_8B,
346
396
  ModelType.MISTRAL_3B,
397
+ ModelType.QWEN_2_5_CODER_32B,
398
+ ModelType.QWEN_2_5_72B,
399
+ ModelType.QWEN_2_5_32B,
400
+ ModelType.QWEN_2_5_14B,
401
+ ModelType.COHERE_COMMAND_R,
402
+ ModelType.COHERE_COMMAND_R_PLUS,
403
+ ModelType.COHERE_COMMAND_NIGHTLY,
347
404
  }:
348
405
  return 128_000
349
406
  elif self in {
@@ -371,6 +428,7 @@ class ModelType(UnifiedModelType, Enum):
371
428
  elif self in {
372
429
  ModelType.GEMINI_1_5_FLASH,
373
430
  ModelType.GEMINI_1_5_PRO,
431
+ ModelType.GEMINI_EXP_1114, # Not given in docs, assuming the same
374
432
  }:
375
433
  return 1_048_576
376
434
  elif self in {
@@ -505,7 +563,7 @@ class OpenAPIName(Enum):
505
563
 
506
564
 
507
565
  class ModelPlatformType(Enum):
508
- DEFAULT = "openai"
566
+ DEFAULT = os.getenv("DEFAULT_MODEL_PLATFORM_TYPE", "openai")
509
567
 
510
568
  OPENAI = "openai"
511
569
  AZURE = "azure"
@@ -521,8 +579,10 @@ class ModelPlatformType(Enum):
521
579
  TOGETHER = "together"
522
580
  OPENAI_COMPATIBLE_MODEL = "openai-compatible-model"
523
581
  SAMBA = "samba-nova"
582
+ COHERE = "cohere"
524
583
  YI = "lingyiwanwu"
525
584
  QWEN = "tongyi-qianwen"
585
+ DEEPSEEK = "deepseek"
526
586
 
527
587
  @property
528
588
  def is_openai(self) -> bool:
@@ -595,6 +655,11 @@ class ModelPlatformType(Enum):
595
655
  r"""Returns whether this platform is Samba Nova."""
596
656
  return self is ModelPlatformType.SAMBA
597
657
 
658
+ @property
659
+ def is_cohere(self) -> bool:
660
+ r"""Returns whether this platform is Cohere."""
661
+ return self is ModelPlatformType.COHERE
662
+
598
663
  @property
599
664
  def is_yi(self) -> bool:
600
665
  r"""Returns whether this platform is Yi."""
@@ -605,6 +670,11 @@ class ModelPlatformType(Enum):
605
670
  r"""Returns whether this platform is Qwen."""
606
671
  return self is ModelPlatformType.QWEN
607
672
 
673
+ @property
674
+ def is_deepseek(self) -> bool:
675
+ r"""Returns whether this platform is DeepSeek."""
676
+ return self is ModelPlatformType.DEEPSEEK
677
+
608
678
 
609
679
  class AudioModelType(Enum):
610
680
  TTS_1 = "tts-1"
@@ -1,16 +1,16 @@
1
- # =========== Copyright 2023 @ CAMEL-AI.org. All Rights Reserved. ===========
2
- # Licensed under the Apache License, Version 2.0 (the License);
1
+ # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
2
+ # Licensed under the Apache License, Version 2.0 (the "License");
3
3
  # you may not use this file except in compliance with the License.
4
4
  # You may obtain a copy of the License at
5
5
  #
6
6
  # http://www.apache.org/licenses/LICENSE-2.0
7
7
  #
8
8
  # Unless required by applicable law or agreed to in writing, software
9
- # distributed under the License is distributed on an AS IS BASIS,
9
+ # distributed under the License is distributed on an "AS IS" BASIS,
10
10
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
11
  # See the License for the specific language governing permissions and
12
12
  # limitations under the License.
13
- # =========== Copyright 2023 @ CAMEL-AI.org. All Rights Reserved. ===========
13
+ # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
14
14
  # isort: skip_file
15
15
  from openai.types.chat.chat_completion import ChatCompletion, Choice
16
16
  from openai.types.chat.chat_completion_assistant_message_param import (
@@ -31,6 +31,7 @@ from openai.types.chat.chat_completion_user_message_param import (
31
31
  ChatCompletionUserMessageParam,
32
32
  )
33
33
  from openai.types.completion_usage import CompletionUsage
34
+ from openai.types.chat import ParsedChatCompletion
34
35
  from openai._types import NOT_GIVEN, NotGiven
35
36
 
36
37
  Choice = Choice
@@ -45,3 +46,4 @@ ChatCompletionFunctionMessageParam = ChatCompletionFunctionMessageParam
45
46
  CompletionUsage = CompletionUsage
46
47
  NOT_GIVEN = NOT_GIVEN
47
48
  NotGiven = NotGiven
49
+ ParsedChatCompletion = ParsedChatCompletion
@@ -1,16 +1,16 @@
1
- # =========== Copyright 2023 @ CAMEL-AI.org. All Rights Reserved. ===========
2
- # Licensed under the Apache License, Version 2.0 (the License);
1
+ # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
2
+ # Licensed under the Apache License, Version 2.0 (the "License");
3
3
  # you may not use this file except in compliance with the License.
4
4
  # You may obtain a copy of the License at
5
5
  #
6
6
  # http://www.apache.org/licenses/LICENSE-2.0
7
7
  #
8
8
  # Unless required by applicable law or agreed to in writing, software
9
- # distributed under the License is distributed on an AS IS BASIS,
9
+ # distributed under the License is distributed on an "AS IS" BASIS,
10
10
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
11
  # See the License for the specific language governing permissions and
12
12
  # limitations under the License.
13
- # =========== Copyright 2023 @ CAMEL-AI.org. All Rights Reserved. ===========
13
+ # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
14
14
  import logging
15
15
  from threading import Lock
16
16
  from typing import TYPE_CHECKING, ClassVar, Dict, Union, cast
@@ -98,6 +98,11 @@ class UnifiedModelType(str):
98
98
  r"""Returns whether the model is a Reka model."""
99
99
  return True
100
100
 
101
+ @property
102
+ def is_cohere(self) -> bool:
103
+ r"""Returns whether the model is a Cohere model."""
104
+ return True
105
+
101
106
  @property
102
107
  def is_yi(self) -> bool:
103
108
  r"""Returns whether the model is a Yi model."""
camel/utils/__init__.py CHANGED
@@ -1,16 +1,16 @@
1
- # =========== Copyright 2023 @ CAMEL-AI.org. All Rights Reserved. ===========
2
- # Licensed under the Apache License, Version 2.0 (the License);
1
+ # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
2
+ # Licensed under the Apache License, Version 2.0 (the "License");
3
3
  # you may not use this file except in compliance with the License.
4
4
  # You may obtain a copy of the License at
5
5
  #
6
6
  # http://www.apache.org/licenses/LICENSE-2.0
7
7
  #
8
8
  # Unless required by applicable law or agreed to in writing, software
9
- # distributed under the License is distributed on an AS IS BASIS,
9
+ # distributed under the License is distributed on an "AS IS" BASIS,
10
10
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
11
  # See the License for the specific language governing permissions and
12
12
  # limitations under the License.
13
- # =========== Copyright 2023 @ CAMEL-AI.org. All Rights Reserved. ===========
13
+ # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
14
14
 
15
15
  from .commons import (
16
16
  AgentOpsMeta,
@@ -36,6 +36,7 @@ from .commons import (
36
36
  track_agent,
37
37
  )
38
38
  from .constants import Constants
39
+ from .response_format import get_pydantic_model
39
40
  from .token_counting import (
40
41
  AnthropicTokenCounter,
41
42
  BaseTokenCounter,
@@ -47,33 +48,34 @@ from .token_counting import (
47
48
  )
48
49
 
49
50
  __all__ = [
50
- 'print_text_animated',
51
- 'get_prompt_template_key_words',
52
- 'get_first_int',
53
- 'download_tasks',
54
- 'get_task_list',
55
- 'check_server_running',
56
- 'AnthropicTokenCounter',
57
- 'get_system_information',
58
- 'to_pascal',
59
- 'get_model_encoding',
60
- 'BaseTokenCounter',
61
- 'OpenAITokenCounter',
62
- 'LiteLLMTokenCounter',
63
- 'Constants',
64
- 'text_extract_from_web',
65
- 'create_chunks',
66
- 'dependencies_required',
67
- 'api_keys_required',
68
- 'is_docker_running',
69
- 'GeminiTokenCounter',
70
- 'MistralTokenCounter',
71
- 'get_pydantic_major_version',
72
- 'get_pydantic_object_schema',
73
- 'func_string_to_callable',
74
- 'json_to_function_code',
75
- 'agentops_decorator',
76
- 'AgentOpsMeta',
77
- 'track_agent',
78
- 'handle_http_error',
51
+ "print_text_animated",
52
+ "get_prompt_template_key_words",
53
+ "get_first_int",
54
+ "download_tasks",
55
+ "get_task_list",
56
+ "check_server_running",
57
+ "AnthropicTokenCounter",
58
+ "get_system_information",
59
+ "to_pascal",
60
+ "get_model_encoding",
61
+ "BaseTokenCounter",
62
+ "OpenAITokenCounter",
63
+ "LiteLLMTokenCounter",
64
+ "Constants",
65
+ "text_extract_from_web",
66
+ "create_chunks",
67
+ "dependencies_required",
68
+ "api_keys_required",
69
+ "is_docker_running",
70
+ "GeminiTokenCounter",
71
+ "MistralTokenCounter",
72
+ "get_pydantic_major_version",
73
+ "get_pydantic_object_schema",
74
+ "func_string_to_callable",
75
+ "json_to_function_code",
76
+ "agentops_decorator",
77
+ "AgentOpsMeta",
78
+ "track_agent",
79
+ "handle_http_error",
80
+ "get_pydantic_model",
79
81
  ]