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

@@ -0,0 +1,346 @@
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
+ from typing import Any, Dict, List, Optional, Union, cast
16
+
17
+ import requests
18
+
19
+ from camel.logger import get_logger
20
+ from camel.toolkits import BaseToolkit, FunctionTool
21
+
22
+ logger = get_logger(__name__)
23
+
24
+
25
+ class PubMedToolkit(BaseToolkit):
26
+ r"""A toolkit for interacting with PubMed's E-utilities API to access
27
+ MEDLINE data.
28
+
29
+ This toolkit provides functionality to search and retrieve papers from the
30
+ PubMed database, including abstracts, citations, and other metadata.
31
+
32
+ Args:
33
+ timeout (Optional[float]): The timeout for API requests in seconds.
34
+ (default: :obj:`None`)
35
+ """
36
+
37
+ BASE_URL = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils"
38
+
39
+ def __init__(self, timeout: Optional[float] = None) -> None:
40
+ r"""Initializes the PubMedToolkit."""
41
+ super().__init__(timeout=timeout)
42
+
43
+ def _make_request(
44
+ self,
45
+ endpoint: str,
46
+ params: Dict[str, Union[str, int]],
47
+ retries: int = 3,
48
+ ) -> Optional[Dict[str, Any]]:
49
+ r"""Makes a request to the PubMed/MEDLINE API with error handling and
50
+ retries.
51
+
52
+ Args:
53
+ endpoint (str): The API endpoint to call.
54
+ params (Dict[str, Union[str, int]]): Query parameters.
55
+ retries (int, optional): Number of retry attempts.
56
+ (default: :obj:`3`)
57
+
58
+ Returns:
59
+ Optional[Dict[str, Any]]: JSON response if successful, else None.
60
+ """
61
+ url = f"{self.BASE_URL}/{endpoint}"
62
+ request_params = cast(Dict[str, Union[str, int]], params)
63
+
64
+ for attempt in range(retries):
65
+ try:
66
+ response = requests.get(
67
+ url, params=request_params, timeout=self.timeout
68
+ )
69
+ response.raise_for_status()
70
+
71
+ if not response.text:
72
+ logger.warning(
73
+ f"Empty response from PubMed API: {endpoint}"
74
+ )
75
+ return None
76
+
77
+ return response.json()
78
+ except requests.RequestException as e:
79
+ if attempt == retries - 1:
80
+ logger.error(f"Failed to fetch data from PubMed: {e!s}")
81
+ return None
82
+ logger.warning(f"Request attempt {attempt + 1} failed: {e!s}")
83
+ except ValueError as e:
84
+ logger.error(f"Failed to parse JSON response: {e!s}")
85
+ return None
86
+ return None
87
+
88
+ def search_papers(
89
+ self,
90
+ query: str,
91
+ max_results: int = 10,
92
+ sort: str = "relevance",
93
+ date_range: Optional[Dict[str, str]] = None,
94
+ publication_type: Optional[List[str]] = None,
95
+ ) -> List[Dict[str, str]]:
96
+ r"""Search for biomedical papers in MEDLINE via PubMed with advanced
97
+ filtering options.
98
+
99
+ Args:
100
+ query (str): The search query string.
101
+ max_results (int, optional): Maximum number of results to return.
102
+ (default: :obj:`10`)
103
+ sort (str, optional): Sort order - 'relevance' or 'date'.
104
+ (default: :obj:`"relevance"`)
105
+ date_range (Optional[Dict[str, str]], optional): Date range filter
106
+ with 'from' and 'to' dates in YYYY/MM/DD format.
107
+ (default: :obj:`None`)
108
+ publication_type (Optional[List[str]], optional): Filter by
109
+ publication types (e.g., ["Journal Article", "Review"]).
110
+ (default: :obj:`None`)
111
+
112
+ Returns:
113
+ List[Dict[str, str]]: List of papers with their metadata.
114
+ """
115
+ # Build query with filters
116
+ filtered_query = query
117
+ if publication_type:
118
+ type_filter = " OR ".join(
119
+ [f'"{pt}"[Publication Type]' for pt in publication_type]
120
+ )
121
+ filtered_query = f"({query}) AND ({type_filter})"
122
+ if date_range:
123
+ date_filter = (
124
+ f"{date_range.get('from', '')}:"
125
+ f"{date_range.get('to', '')}[Date - Publication]"
126
+ )
127
+ filtered_query = f"({filtered_query}) AND ({date_filter})"
128
+
129
+ # Search for paper IDs
130
+ search_params: Dict[str, Union[str, int]] = {
131
+ "db": "pubmed",
132
+ "term": filtered_query,
133
+ "retmax": max_results,
134
+ "sort": "relevance" if sort == "relevance" else "pub+date",
135
+ "retmode": "json",
136
+ }
137
+
138
+ search_data = self._make_request("esearch.fcgi", search_params)
139
+ if not search_data or "esearchresult" not in search_data:
140
+ logger.error("Failed to retrieve search results")
141
+ return []
142
+
143
+ paper_ids = search_data["esearchresult"].get("idlist", [])
144
+ if not paper_ids:
145
+ return []
146
+
147
+ # Fetch details for papers
148
+ results = []
149
+ for paper_id in paper_ids:
150
+ paper_details = self.get_paper_details(paper_id)
151
+ if paper_details:
152
+ results.append(paper_details)
153
+
154
+ return results
155
+
156
+ def get_paper_details(
157
+ self,
158
+ paper_id: Union[str, int],
159
+ include_references: bool = False,
160
+ ) -> Optional[Dict[str, Any]]:
161
+ r"""Get detailed information about a specific biomedical paper from
162
+ MEDLINE/PubMed.
163
+
164
+ Args:
165
+ paper_id (Union[str, int]): PubMed ID of the paper.
166
+ include_references (bool, optional): Whether to include referenced
167
+ papers. (default: :obj:`False`)
168
+
169
+ Returns:
170
+ Optional[Dict[str, Any]]: Paper details including title, authors,
171
+ abstract, etc., or None if retrieval fails.
172
+ """
173
+ # Fetch summary
174
+ summary_params: Dict[str, Union[str, int]] = {
175
+ "db": "pubmed",
176
+ "id": str(paper_id),
177
+ "retmode": "json",
178
+ }
179
+ summary_data = self._make_request("esummary.fcgi", summary_params)
180
+
181
+ if not summary_data or "result" not in summary_data:
182
+ logger.error(
183
+ f"Failed to retrieve paper details for ID: {paper_id}"
184
+ )
185
+ return None
186
+
187
+ paper_data = summary_data["result"][str(paper_id)]
188
+
189
+ # Handle authors - they come as a list of dicts with 'name' key
190
+ authors = paper_data.get("authors", [])
191
+ author_names = []
192
+ for author in authors:
193
+ if isinstance(author, dict) and "name" in author:
194
+ author_names.append(author["name"])
195
+ elif isinstance(author, str):
196
+ author_names.append(author)
197
+
198
+ # Get abstract
199
+ abstract = self.get_abstract(paper_id)
200
+
201
+ # Get references if requested
202
+ references = []
203
+ if include_references:
204
+ ref_params: Dict[str, Union[str, int]] = {
205
+ "db": "pubmed",
206
+ "id": str(paper_id),
207
+ "linkname": "pubmed_pubmed_refs",
208
+ "retmode": "json",
209
+ }
210
+ ref_data = self._make_request("elink.fcgi", ref_params)
211
+ if ref_data and "linksets" in ref_data:
212
+ try:
213
+ references = ref_data["linksets"][0]["linksetdbs"][0][
214
+ "links"
215
+ ]
216
+ except (KeyError, IndexError):
217
+ logger.warning(
218
+ f"No references found for paper ID: {paper_id}"
219
+ )
220
+
221
+ return cast(
222
+ Dict[str, Any],
223
+ {
224
+ "id": str(paper_id),
225
+ "title": paper_data.get("title", ""),
226
+ "authors": ", ".join(author_names),
227
+ "journal": paper_data.get("source", ""),
228
+ "pub_date": paper_data.get("pubdate", ""),
229
+ "abstract": abstract,
230
+ "doi": paper_data.get("elocationid", ""),
231
+ "keywords": paper_data.get("keywords", []),
232
+ "mesh_terms": paper_data.get("mesh", []),
233
+ "publication_types": paper_data.get("pubtype", []),
234
+ "references": references if include_references else None,
235
+ },
236
+ )
237
+
238
+ def get_abstract(self, paper_id: Union[str, int]) -> str:
239
+ r"""Get the abstract of a specific biomedical paper from MEDLINE/
240
+ PubMed.
241
+
242
+ Args:
243
+ paper_id (Union[str, int]): PubMed ID of the paper.
244
+
245
+ Returns:
246
+ str: The abstract text.
247
+ """
248
+ params: Dict[str, Union[str, int]] = {
249
+ "db": "pubmed",
250
+ "id": str(paper_id),
251
+ "rettype": "abstract",
252
+ "retmode": "text",
253
+ }
254
+
255
+ try:
256
+ response = requests.get(
257
+ f"{self.BASE_URL}/efetch.fcgi", params=params
258
+ )
259
+ response.raise_for_status()
260
+ return response.text.strip()
261
+ except requests.exceptions.RequestException as e:
262
+ logger.error(
263
+ f"Failed to retrieve abstract for ID {paper_id}: {e!s}"
264
+ )
265
+ return ""
266
+
267
+ def get_citation_count(self, paper_id: Union[str, int]) -> int:
268
+ r"""Get the number of citations for a biomedical paper in MEDLINE/
269
+ PubMed.
270
+
271
+ Args:
272
+ paper_id (Union[str, int]): PubMed ID of the paper.
273
+
274
+ Returns:
275
+ int: Number of citations, or 0 if retrieval fails.
276
+ """
277
+ params: Dict[str, Union[str, int]] = {
278
+ "db": "pubmed",
279
+ "id": str(paper_id),
280
+ "linkname": "pubmed_pubmed_citedin",
281
+ "retmode": "json",
282
+ }
283
+
284
+ data = self._make_request("elink.fcgi", params)
285
+ if not data or "linksets" not in data:
286
+ return 0
287
+
288
+ try:
289
+ return len(data["linksets"][0]["linksetdbs"][0]["links"])
290
+ except (KeyError, IndexError):
291
+ return 0
292
+
293
+ def get_related_papers(
294
+ self,
295
+ paper_id: Union[str, int],
296
+ max_results: int = 10,
297
+ ) -> List[Dict[str, Any]]:
298
+ r"""Get biomedical papers related to a specific paper in MEDLINE/
299
+ PubMed.
300
+
301
+ Args:
302
+ paper_id (Union[str, int]): PubMed ID of the paper.
303
+ max_results (int, optional): Maximum number of results to return.
304
+ (default: :obj:`10`)
305
+
306
+ Returns:
307
+ List[Dict[str, Any]]: List of related papers with their metadata.
308
+ """
309
+ params: Dict[str, Union[str, int]] = {
310
+ "db": "pubmed",
311
+ "id": str(paper_id),
312
+ "linkname": "pubmed_pubmed",
313
+ "retmode": "json",
314
+ }
315
+
316
+ data = self._make_request("elink.fcgi", params)
317
+ if not data or "linksets" not in data:
318
+ return []
319
+
320
+ try:
321
+ related_ids = data["linksets"][0]["linksetdbs"][0]["links"][
322
+ :max_results
323
+ ]
324
+ related_papers: List[Dict[str, Any]] = []
325
+
326
+ for pid in related_ids:
327
+ if paper := self.get_paper_details(pid):
328
+ related_papers.append(paper)
329
+
330
+ return related_papers
331
+ except (KeyError, IndexError):
332
+ return []
333
+
334
+ def get_tools(self) -> List[FunctionTool]:
335
+ r"""Returns a list of tools provided by the PubMed toolkit.
336
+
337
+ Returns:
338
+ List[FunctionTool]: List of available tools.
339
+ """
340
+ return [
341
+ FunctionTool(self.search_papers),
342
+ FunctionTool(self.get_paper_details),
343
+ FunctionTool(self.get_abstract),
344
+ FunctionTool(self.get_citation_count),
345
+ FunctionTool(self.get_related_papers),
346
+ ]
@@ -704,6 +704,68 @@ class SearchToolkit(BaseToolkit):
704
704
  except Exception as e:
705
705
  return [{"error": f"An unexpected error occurred: {e!s}"}]
706
706
 
707
+ @api_keys_required([(None, 'BOCHA_API_KEY')])
708
+ def search_bocha(
709
+ self,
710
+ query: str,
711
+ freshness: str = "noLimit",
712
+ summary: bool = False,
713
+ count: int = 10,
714
+ page: int = 1,
715
+ ) -> Dict[str, Any]:
716
+ r"""Query the Bocha AI search API and return search results.
717
+
718
+ Args:
719
+ query (str): The search query.
720
+ freshness (str): Time frame filter for search results. Default
721
+ is "noLimit". Options include:
722
+ - 'noLimit': no limit (default).
723
+ - 'oneDay': past day.
724
+ - 'oneWeek': past week.
725
+ - 'oneMonth': past month.
726
+ - 'oneYear': past year.
727
+ summary (bool): Whether to include text summaries in results.
728
+ Default is False.
729
+ count (int): Number of results to return (1-50). Default is 10.
730
+ page (int): Page number of results. Default is 1.
731
+
732
+ Returns:
733
+ Dict[str, Any]: A dictionary containing search results, including
734
+ web pages, images, and videos if available. The structure
735
+ follows the Bocha AI search API response format.
736
+ """
737
+ import json
738
+
739
+ BOCHA_API_KEY = os.getenv("BOCHA_API_KEY")
740
+
741
+ url = "https://api.bochaai.com/v1/web-search"
742
+ headers = {
743
+ "Authorization": f"Bearer {BOCHA_API_KEY}",
744
+ "Content-Type": "application/json",
745
+ }
746
+
747
+ payload = json.dumps(
748
+ {
749
+ "query": query,
750
+ "freshness": freshness,
751
+ "summary": summary,
752
+ "count": count,
753
+ "page": page,
754
+ }
755
+ )
756
+ try:
757
+ response = requests.post(url, headers=headers, data=payload)
758
+ if response.status_code != 200:
759
+ return {
760
+ "error": (
761
+ f"Bocha API failed with {response.status_code}: "
762
+ f"{response.text}"
763
+ )
764
+ }
765
+ return response.json()["data"]
766
+ except requests.exceptions.RequestException as e:
767
+ return {"error": f"Bocha AI search failed: {e!s}"}
768
+
707
769
  def get_tools(self) -> List[FunctionTool]:
708
770
  r"""Returns a list of FunctionTool objects representing the
709
771
  functions in the toolkit.
@@ -720,4 +782,5 @@ class SearchToolkit(BaseToolkit):
720
782
  FunctionTool(self.query_wolfram_alpha),
721
783
  FunctionTool(self.tavily_search),
722
784
  FunctionTool(self.search_brave),
785
+ FunctionTool(self.search_bocha),
723
786
  ]
@@ -117,9 +117,9 @@ class TerminalToolkit(BaseToolkit):
117
117
  else: # Windows
118
118
  # For Windows, we use dir command with /s for recursive search
119
119
  # and /b for bare format
120
-
121
120
  pattern = glob
122
- command.extend(["dir", "/s", "/b", os.path.join(path, pattern)])
121
+ file_path = os.path.join(path, pattern).replace('/', '\\')
122
+ command.extend(["cmd", "/c", "dir", "/s", "/b", file_path])
123
123
 
124
124
  try:
125
125
  result = subprocess.run(
camel/types/enums.py CHANGED
@@ -249,6 +249,7 @@ class ModelType(UnifiedModelType, Enum):
249
249
  self.is_siliconflow,
250
250
  self.is_zhipuai,
251
251
  self.is_aiml,
252
+ self.is_azure_openai,
252
253
  ]
253
254
  )
254
255
 
@@ -889,6 +890,7 @@ class ModelPlatformType(Enum):
889
890
  MOONSHOT = "moonshot"
890
891
  SILICONFLOW = "siliconflow"
891
892
  AIML = "aiml"
893
+ VOLCANO = "volcano"
892
894
 
893
895
  @property
894
896
  def is_openai(self) -> bool:
@@ -1011,6 +1013,11 @@ class ModelPlatformType(Enum):
1011
1013
  r"""Returns whether this platform is AIML."""
1012
1014
  return self is ModelPlatformType.AIML
1013
1015
 
1016
+ @property
1017
+ def is_volcano(self) -> bool:
1018
+ r"""Returns whether this platform is volcano."""
1019
+ return self is ModelPlatformType.VOLCANO
1020
+
1014
1021
 
1015
1022
  class AudioModelType(Enum):
1016
1023
  TTS_1 = "tts-1"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: camel-ai
3
- Version: 0.2.25
3
+ Version: 0.2.27
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
@@ -593,6 +593,7 @@ Practical guides and tutorials for implementing specific functionalities in CAME
593
593
  |:---|:---|
594
594
  | **[Role-Playing Scraper for Report & Knowledge Graph Generation](https://docs.camel-ai.org/cookbooks/applications/roleplaying_scraper.html)** | Create role-playing agents for data scraping and reporting. |
595
595
  | **[Create A Hackathon Judge Committee with Workforce](https://docs.camel-ai.org/cookbooks/multi_agent_society/workforce_judge_committee.html)** | Building a team of agents for collaborative judging. |
596
+ | **[Dynamic Knowledge Graph Role-Playing: Multi-Agent System with dynamic, temporally-aware knowledge graphs](https://docs.camel-ai.org/cookbooks/applications/dyamic_knowledge_graph.html)** | Builds dynamic, temporally-aware knowledge graphs for financial applications using a multi-agent system. It processes financial reports, news articles, and research papers to help traders analyze data, identify relationships, and uncover market insights. The system also utilizes diverse and optional element node deduplication techniques to ensure data integrity and optimize graph structure for financial decision-making. |
596
597
  | **[Customer Service Discord Bot with Agentic RAG](https://docs.camel-ai.org/cookbooks/applications/customer_service_Discord_bot_using_SambaNova_with_agentic_RAG.html)** | Learn how to build a robust customer service bot for Discord using Agentic RAG. |
597
598
  | **[Customer Service Discord Bot with Local Model](https://docs.camel-ai.org/cookbooks/applications/customer_service_Discord_bot_using_local_model_with_agentic_RAG.html)** | Learn how to build a robust customer service bot for Discord using Agentic RAG which supports local deployment. |
598
599
 
@@ -1,16 +1,17 @@
1
- camel/__init__.py,sha256=PzLOi5tF4retGUqkCZIJVUZbR9atlI1NspMfmVKtg5c,912
1
+ camel/__init__.py,sha256=6XPf3TQFxgCHXxPaRb-Lda_NJ-gHT1IsrHIeYeMzGGA,912
2
2
  camel/generators.py,sha256=JRqj9_m1PF4qT6UtybzTQ-KBT9MJQt18OAAYvQ_fr2o,13844
3
3
  camel/human.py,sha256=9X09UmxI2JqQnhrFfnZ3B9EzFmVfdSWQcjLWTIXKXe0,4962
4
4
  camel/logger.py,sha256=j6mPsLJyKOn16o6Um57882mHsURQ8h-jia6Jd_34wRA,4239
5
+ camel/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
6
  camel/agents/__init__.py,sha256=LcS4m8s97-yADfznvcaAdUe9W0E9h3m6zrSc9H6m9so,1545
6
7
  camel/agents/_types.py,sha256=GGpZ9FGq_SGla_Vz-YcYW7KMQzwE8lfM4Ga0QaGzKxk,1423
7
8
  camel/agents/_utils.py,sha256=Nw63FXGoyshllqcTmSTNjIFO7hi4rfENGn-gfne4yOo,6228
8
9
  camel/agents/base.py,sha256=c4bJYL3G3Z41SaFdMPMn8ZjLdFiFaVOFO6EQIfuCVR8,1124
9
- camel/agents/chat_agent.py,sha256=JvKrqPIWG1r2yehFmdZx_2gw5_O0LRH79jE3NUVdFWI,40844
10
+ camel/agents/chat_agent.py,sha256=_y_7QKPuphm3NLfU4y8dmMr7SiFbbW-kqgmQSrhvqlY,40848
10
11
  camel/agents/critic_agent.py,sha256=qFVlHlQo0CVgmPWfWYLT8_oP_KyzCLFsQw_nN_vu5Bs,7487
11
12
  camel/agents/deductive_reasoner_agent.py,sha256=6BZGaq1hR6hKJuQtOfoYQnk_AkZpw_Mr7mUy2MspQgs,13540
12
13
  camel/agents/embodied_agent.py,sha256=XBxBu5ZMmSJ4B2U3Z7SMwvLlgp6yNpaBe8HNQmY9CZA,7536
13
- camel/agents/knowledge_graph_agent.py,sha256=qBv_-t5wuk74bVVerbzaU86Qu2ZqwFhWi143djujGFI,9091
14
+ camel/agents/knowledge_graph_agent.py,sha256=mmnjgvY9gRcFKTWtH-M4ORC1AEIMRW4VOwmrmxog1Os,9472
14
15
  camel/agents/multi_hop_generator_agent.py,sha256=aYsZNsEFHxIq8_wDN8lZRkvRbfhlOYGBKezWr87y8Bs,4325
15
16
  camel/agents/programmed_agent_instruction.py,sha256=99fLe41che3X6wPpNPJXRwl4If6EoQqQVWIoT3DKE1s,7124
16
17
  camel/agents/role_assignment_agent.py,sha256=8bkTc14XToFHkP-ZOef5KP0P4hTlCDv0eNsDZPYuukA,5088
@@ -37,7 +38,7 @@ camel/bots/slack/models.py,sha256=xMz3RO-88yrxPRrbBDjiabpbZIlpEHCvU-1CvASKARc,51
37
38
  camel/bots/slack/slack_app.py,sha256=SoSRZZnuTJ0aiLUBZqdG8cUFJzYpfpZh7304t0a_7Dg,9944
38
39
  camel/configs/__init__.py,sha256=IWfwy2Q8O3uHi9q4NKcYaDwRV0npx3DqJdg050LDvjc,3242
39
40
  camel/configs/aiml_config.py,sha256=jMgNTvPM9mJ_blm-fM8jmnnI7Os_1vQTE6DPlkwR3ps,4197
40
- camel/configs/anthropic_config.py,sha256=9eLmNrBVlxCg7KtUZTa0nQVebRnYxcTcLcfTJuI8jq0,4991
41
+ camel/configs/anthropic_config.py,sha256=qrGCVRhpGxUZeM3tLDlP-JDDI4aOsxMmUUl3Z56-iYg,4955
41
42
  camel/configs/base_config.py,sha256=2nEIRQoY6tIMeBIcxcBtCadmpsd8bSQj9rzewQsgfXo,3188
42
43
  camel/configs/cohere_config.py,sha256=joF4GHqoTIRuEDlyTmxW5Ud23psE0xP1VCcEvKychko,3997
43
44
  camel/configs/deepseek_config.py,sha256=gZk-xRRNt_k3G5aI1wKsFT-InWKX1X79AzTi9Kt4hXM,5676
@@ -82,7 +83,7 @@ camel/datahubs/base.py,sha256=4QKWiJaeL5ReQpyTAbOtzHs-2CzAYbVyoMngYwdpZGU,4357
82
83
  camel/datahubs/huggingface.py,sha256=m1LDBv9ESNQINfiZdBpuVD5Zr1_iZqo-5LBYHXHhXw8,14853
83
84
  camel/datahubs/models.py,sha256=tGb9OP_aomIhnwc0VapJjTg9PmyV_QCp5to9sABXF0Y,978
84
85
  camel/datasets/__init__.py,sha256=6unKCxcm0wxnohyJuzr3BEi_CQMwnExadUWST9egVB0,937
85
- camel/datasets/base.py,sha256=sSlH-k9PaLasJLpvl1bmVDzDMpsuok3k064S9xbk7V4,33345
86
+ camel/datasets/base.py,sha256=W3Qc5lCi7U6tdDleLQbYkcXRIr-zqwukWIQQjPFc0S8,41052
86
87
  camel/embeddings/__init__.py,sha256=YKCFO_YVY-x4A4uWmRuoIEtltrilBmC17DkCcK4zSj8,1263
87
88
  camel/embeddings/base.py,sha256=mxqFkWh2AfbxuVKPOqVx16fCznmuSh9QXGjaEeZHvoY,2190
88
89
  camel/embeddings/jina_embedding.py,sha256=6aakojtsJ6KLp3nqYLhEOtoFm2shoXlRzxb1YYN_uwo,6623
@@ -92,9 +93,10 @@ camel/embeddings/openai_embedding.py,sha256=9kJBKUWkjEyxtn50V4MDjuOT2syIwWEnZeEH
92
93
  camel/embeddings/sentence_transformers_embeddings.py,sha256=E7a8lN50CtDBsFO-NOFQ6qfCnbH41O0_kTTg7dG3sOo,2724
93
94
  camel/embeddings/vlm_embedding.py,sha256=HZFdcz1YzkFPzMj45_jaCVmDQJyccoXN561aLWlrYmo,5497
94
95
  camel/environments/__init__.py,sha256=c2NsLuRbuqDftBSfw9pHMPQW98E0-py2n5AvTZvS74E,767
95
- camel/environments/base.py,sha256=X9-x26-4AKGrLSJEVKM3ZYfoSonWG9AbPiLsE4sIYlg,17632
96
- camel/extractors/__init__.py,sha256=aYcYo6rDxVQMFeMqXN1epitlPuLirOOQCcdpWq9basA,763
97
- camel/extractors/base.py,sha256=Id0odIG8u9ws6ai1HXT6mckNdQbCtAZflXC1F7ViqgQ,9454
96
+ camel/environments/base.py,sha256=Egj-T1IAVhJl7oqEA1s1vRxgJFmBdjqPliy0W3GtJWA,18013
97
+ camel/extractors/__init__.py,sha256=nrEI35-70NGHk-Y7jvyc4i0f1NlpJArVBqAmcfpaBng,811
98
+ camel/extractors/base.py,sha256=3jvuZpq27nlADDCX3GfubOpeb_zt-E9rzxF3x4lYm8s,10404
99
+ camel/extractors/python_strategies.py,sha256=k8q4BIAhPZnCSN2LqPaZVrhF56y3Y4cZ6ddn79jcIXE,7825
98
100
  camel/interpreters/__init__.py,sha256=NOQUsg7gR84zO8nBXu4JGUatsxSDJqZS6otltjXfop4,1265
99
101
  camel/interpreters/base.py,sha256=F026f2ZnvHwikSMbk6APYNvB9qP4Ye5quSkTbFKV3O0,1898
100
102
  camel/interpreters/docker_interpreter.py,sha256=K4J49oc-GnMtEKbvn3wNokWgWU97-vRgSfWSNadO9LU,9249
@@ -132,11 +134,11 @@ camel/messages/conversion/sharegpt/__init__.py,sha256=oWUuHV5w85kxqhz_hoElLmCfzL
132
134
  camel/messages/conversion/sharegpt/function_call_formatter.py,sha256=cn7e7CfmxEVFlfOqhjhNuA8nuWvWD6hXYn-3okXNxxQ,1832
133
135
  camel/messages/conversion/sharegpt/hermes/__init__.py,sha256=mxuMSm-neaTgInIjYXuIVdC310E6jKJzM3IdtaJ4qY4,812
134
136
  camel/messages/conversion/sharegpt/hermes/hermes_function_formatter.py,sha256=-9TT8iOQ-ieKSKR_PmJSA5Bi0uBx-qR7WQ6vxuFkorM,4639
135
- camel/models/__init__.py,sha256=30gJOmde3TS-j5I4m0hrxI5BJDd2H3UA1hxQD9TQzGE,2637
137
+ camel/models/__init__.py,sha256=iNZ1LcesJ3YaAbNRxHTA-sUaxfjn6gUQ-EQArll21KQ,2769
136
138
  camel/models/_utils.py,sha256=hob1ehnS5xZitMCdYToHVgaTB55JnaP4_DSWnTEfVsg,2045
137
139
  camel/models/aiml_model.py,sha256=4FW66DxmVMPWAJckh4UjMM6eD1QNyrAPAPtrpmWxzjc,6524
138
- camel/models/anthropic_model.py,sha256=I4a9yeqqgKF1skiTwvFmBmJTy6HjKAahyGlwF8zNPeM,7319
139
- camel/models/azure_openai_model.py,sha256=WBxnR-UNnBw49zyLxqF_d-7VKWTjBPnNR_xMvhWrggI,7471
140
+ camel/models/anthropic_model.py,sha256=8XAj9sVaN1X0hvrL9a-qsmkAFWoGe1Ozj5XZsXYe1UI,5894
141
+ camel/models/azure_openai_model.py,sha256=AblW2scYp12_odI1GG0ATHI8-Tn7d6SCsxHe7g66rWs,10386
140
142
  camel/models/base_audio_model.py,sha256=QkLqh0v-5kcE_jwFB5xAgvztAqB2Bot4_iG9sZdcl8A,2986
141
143
  camel/models/base_model.py,sha256=RolL8fRwVpfz8g9lpb_71h0mYTNl-U63f8KBy6hc3E0,10679
142
144
  camel/models/cohere_model.py,sha256=RAYHCyppDQxQ7BOR-e314AagB09vRxoScoHc-FtL6Bc,13355
@@ -147,14 +149,14 @@ camel/models/groq_model.py,sha256=FgXOHmIKAxGFASUmmk5tK49bPcXsr7diB3zRFGg9XDA,73
147
149
  camel/models/internlm_model.py,sha256=4nr5LXhxBfOjm-0i65pXyaS0_sT5oAXKXaUfkijAGmQ,5612
148
150
  camel/models/litellm_model.py,sha256=xi4kDd0FKuznKtox8ArsB39u40ueOhcb-CpWv4bcbXw,5544
149
151
  camel/models/mistral_model.py,sha256=OB948fRVnXikVIDO3PqxV0zb_qpwwta0DIW1bbX3SYI,11666
150
- camel/models/model_factory.py,sha256=1PgJdifxYYqQ9VnZRrEER7nKjz2X07uHwPMxg454Alk,6732
152
+ camel/models/model_factory.py,sha256=GdjGCxslqe04oWvpfiOdPl0ZGzuGooeA9M8ppby6hFo,6863
151
153
  camel/models/model_manager.py,sha256=gfpL-WUxuTXgNeCkIVg8Y0zRvxMqRLX8JGt0XEAPQ8Y,9214
152
154
  camel/models/moonshot_model.py,sha256=DNZzDYz0AWU1q6pIvbPALqesejoawwuKzeP0_ZbjDSg,6149
153
155
  camel/models/nemotron_model.py,sha256=jJrW8tpTlEJDT1FjflB9krhgEQhD5KBeLmyUIcZvWPk,3886
154
156
  camel/models/nvidia_model.py,sha256=lqp1iPwVDq6zSQ9B0SyBZ48Z3J5WbXwPshwlhj1ogZ8,6711
155
157
  camel/models/ollama_model.py,sha256=byJ0YbMlilEFRKJZIot-MPUcojwMHLIaBES0a1SURtg,10604
156
158
  camel/models/openai_audio_models.py,sha256=fYpxFvxT8p93KVb5BYODTuI5wdNXV9pu_bvxfARgVYk,13193
157
- camel/models/openai_compatible_model.py,sha256=9fzV3EtcE5YFZ5-rYYMoWVmqjjcGfC7rDml5Ngoz6Fs,5299
159
+ camel/models/openai_compatible_model.py,sha256=Nmps04Fo0ILmynE8wbKVzTrQ0VDyOrDR1ICD1nGrjd0,8142
158
160
  camel/models/openai_model.py,sha256=CbfD9yVtAltyqdFpjnLXncFnmaGPDZq8JhJDaSfG0pc,10186
159
161
  camel/models/qwen_model.py,sha256=_LeeB0yrXRMI-gZOEEOHg0bWNOJpuQHf2G7u40--3r8,7064
160
162
  camel/models/reka_model.py,sha256=15DscZf3lbqsIzm6kzjzDrhblBt1_0xlphT4isuQMu0,10146
@@ -164,6 +166,7 @@ camel/models/siliconflow_model.py,sha256=c5vk4zAhZVf8pDF1uh-iSa_v8d0QoPLuIN27Eem
164
166
  camel/models/stub_model.py,sha256=dygYoxemnWWaxEX21L8QyKe-c75ti2CK9HnTuyHL5vs,5160
165
167
  camel/models/togetherai_model.py,sha256=-YwZV1S1bkrX8jGguQI5dbtIHVuqhv96MoAcl33ptPo,6657
166
168
  camel/models/vllm_model.py,sha256=dzH4rYr2Se7cejk2hobblaW-s483uxPxb8976RQE8x0,6884
169
+ camel/models/volcano_model.py,sha256=inYDiKOfGvq8o3XW4KVQIrXiZOhXQfB4HfCHGCWHPKs,3792
167
170
  camel/models/yi_model.py,sha256=V4sc9n8MAKVfjGO-NU0I8W4lGKdORSCbMV020SHT3R0,6180
168
171
  camel/models/zhipuai_model.py,sha256=o3uoTY30p1yUIklvoRMyr8JX39xZ5mLVKSTtUknW8nE,6517
169
172
  camel/models/reward/__init__.py,sha256=MqPN6wXh7Y1SoeNoFlYaMG6xHzLG0CYsv_3kB2atIQk,984
@@ -229,9 +232,9 @@ camel/societies/workforce/workforce.py,sha256=lflBJO4vBPg_uY7U-O8STxo90c8iwLN9r-
229
232
  camel/storages/__init__.py,sha256=jXff0PfC9VzAlSAgwlPv3uzZQlhuc82Did_OPNLJJuY,1617
230
233
  camel/storages/graph_storages/__init__.py,sha256=G29BNn651C0WTOpjCl4QnVM-4B9tcNh8DdmsCiONH8Y,948
231
234
  camel/storages/graph_storages/base.py,sha256=uSe9jWuLudfm5jtfo6E-L_kNzITwK1_Ef-6L4HWw-JM,2852
232
- camel/storages/graph_storages/graph_element.py,sha256=v7Gzl63VhN00vlsI3G8GCZkbgiOCyonFCpNsPCo90Pk,2617
235
+ camel/storages/graph_storages/graph_element.py,sha256=X_2orbQOMaQd00xxzAoJLfEcrVNE1mgCqMJv0orMAKA,2733
233
236
  camel/storages/graph_storages/nebula_graph.py,sha256=iLcHrIgd5U59GXlcLtLBAI8vNFpqHHLHHFmHTceVVLc,22816
234
- camel/storages/graph_storages/neo4j_graph.py,sha256=yjxNWoikgoGC_N-JXiJQlhQTSre87_5wTSOeKeVtEoc,28046
237
+ camel/storages/graph_storages/neo4j_graph.py,sha256=FBOH19VvEU3vXcM1Kuel88hVb2v1K_AKAZob4NmG9m0,30713
235
238
  camel/storages/key_value_storages/__init__.py,sha256=le_hl7MYoQvaiYaJHwomy8c0cvTemicZbmwxgCJUpOs,962
236
239
  camel/storages/key_value_storages/base.py,sha256=FSfxeLuG7SPvn-Mg-OQxtRKPtQBnRkB7lYeDaFOefpk,2177
237
240
  camel/storages/key_value_storages/in_memory.py,sha256=k04Nx53lYxD5MoqDtBEgZrQYkAQ-zIuU6tqnoNqiHws,1949
@@ -253,11 +256,12 @@ camel/terminators/__init__.py,sha256=t8uqrkUnXEOYMXQDgaBkMFJ0EXFKI0kmx4cUimli3Ls
253
256
  camel/terminators/base.py,sha256=xmJzERX7GdSXcxZjAHHODa0rOxRChMSRboDCNHWSscs,1511
254
257
  camel/terminators/response_terminator.py,sha256=n3G5KP6Oj7-7WlRN0yFcrtLpqAJKaKS0bmhrWlFfCgQ,4982
255
258
  camel/terminators/token_limit_terminator.py,sha256=YWv6ZR8R9yI2Qnf_3xES5bEE_O5bb2CxQ0EUXfMh34c,2118
256
- camel/toolkits/__init__.py,sha256=l7G2_QjBMctZ4vebr42Xd7cAxuSOx2cc4UfrMVkM1aM,3624
259
+ camel/toolkits/__init__.py,sha256=SJ1Agk9YI_qH4gKX-pcvhl-m2t0Nori6R9Fs0gXReDs,3699
257
260
  camel/toolkits/arxiv_toolkit.py,sha256=d0Zn8LQGENhtlZ0BHlDr1pUV8xHOc6TOenAaKgbelu8,6279
258
261
  camel/toolkits/ask_news_toolkit.py,sha256=PAxio8I2eTau9TgOu1jyFC9fsHhvGb-aLIkroWPtwx4,23268
259
262
  camel/toolkits/audio_analysis_toolkit.py,sha256=LC0C6SEIwko8HqkT-C3ub6Ila2PfuIbKLBOEjrrF6BE,8552
260
263
  camel/toolkits/base.py,sha256=7WRovKrz380b25lYdwT-2FCXzS3dkllOjT53hmmCg_I,1999
264
+ camel/toolkits/browser_toolkit.py,sha256=Pbw7CoiHPtbFQagmXvCUiVHihCXwaN6uUbwCAfC-jso,51016
261
265
  camel/toolkits/code_execution.py,sha256=seqTtjulBZXH4qd5m2YAXQaxyL2_n2ekmqsYB-wBxvw,4547
262
266
  camel/toolkits/dalle_toolkit.py,sha256=Usmw3JiJErLQgWSB1qKq_bOACNwbUTQPFc_EsVzTrGo,5115
263
267
  camel/toolkits/dappier_toolkit.py,sha256=_69IAmXE2QSbwGxnSEycaV2XrrkiM5wKI6heM7-4MfU,8175
@@ -280,19 +284,19 @@ camel/toolkits/notion_toolkit.py,sha256=44TYy_51RhIQVfCuLKMH9U5cmRCzpQNSEN9IbrZl
280
284
  camel/toolkits/open_api_toolkit.py,sha256=Venfq8JwTMQfzRzzB7AYmYUMEX35hW0BjIv_ozFMiNk,23316
281
285
  camel/toolkits/openbb_toolkit.py,sha256=_13onVlXnUz9SZQHkeqQlZpXf1GVWp8BzrCFSK8aCMY,28911
282
286
  camel/toolkits/page_script.js,sha256=gypbuQ_gn_oa3rQDoCN_q-kJ0jND1eSvY-30PufPZmQ,12613
287
+ camel/toolkits/pubmed_toolkit.py,sha256=vrd5GIhSYt9Z8EHaWkFb0x9i6_TP7pQZc7jlLHSol04,12180
283
288
  camel/toolkits/reddit_toolkit.py,sha256=cTqEq1CRaLq9XxUHkHCmd09tRzb5Mz_bUs2JV58ewrs,8012
284
289
  camel/toolkits/retrieval_toolkit.py,sha256=y_mQtknrSIDDXSyQb-4FY6ahV_mOxkBhDkA2eMIVnz0,3801
285
- camel/toolkits/search_toolkit.py,sha256=4yTYkook3E3Yb-EOaio2O6FBcvzIXlVVC4WOvNSaYcw,29881
290
+ camel/toolkits/search_toolkit.py,sha256=KxJMB8tz37uyqlzHSK9X28hSZZMK793aOwkYT8jBnGc,32131
286
291
  camel/toolkits/semantic_scholar_toolkit.py,sha256=Kp-5rz99rkeUsUmk5ShQdNKJRGVs78hQvCNg-NQMFDk,11547
287
292
  camel/toolkits/slack_toolkit.py,sha256=n8cn3kZIc27B-2KMTRK6Nsdan37SwMqBiBi1PMtuUvQ,10744
288
293
  camel/toolkits/stripe_toolkit.py,sha256=1sCywkpo8mh4E_KwxFKLhAb-G5uZ47NXXQvcddThjqg,9781
289
294
  camel/toolkits/sympy_toolkit.py,sha256=TZzvBAr1tlk9p8jMnhAapg02ep9k9eIxSdybXEZDqeU,32760
290
- camel/toolkits/terminal_toolkit.py,sha256=ahLb3tBxpxInVqmQesI0Bm30JGziFoiXXi4qNGAJXBY,15116
295
+ camel/toolkits/terminal_toolkit.py,sha256=y-6Spdn_58Yrj3Rc5rhCX4vVgZsfm80lnI3fv9kPVUA,15181
291
296
  camel/toolkits/twitter_toolkit.py,sha256=a2OLSJSW2wY7pOwOApb1qchZPXzH22Rbgm9Yd7-7vrA,15826
292
297
  camel/toolkits/video_analysis_toolkit.py,sha256=lDAY6YP1zXykSxt8Qanf0WZR3l1p8c4akKPkaF5R3wU,15064
293
298
  camel/toolkits/video_download_toolkit.py,sha256=XjZICJTOG4dmKxfkHxYxmBMFESsOX51GvTeQXAQslMU,7104
294
299
  camel/toolkits/weather_toolkit.py,sha256=qHAMD56zqd5GWnEWiaA_0aBDwvgacdx0pAHScinY4GY,6965
295
- camel/toolkits/web_toolkit.py,sha256=DapiYYP95EFMVB1hU38a052nUPs4L5WdE25o_74h1Cw,48407
296
300
  camel/toolkits/whatsapp_toolkit.py,sha256=MBY92WLLptkXxnl4Ky5erGwI415XLFFGu9i2q6_b0oQ,5736
297
301
  camel/toolkits/zapier_toolkit.py,sha256=mgYxRGPw7_VZVj0xU9XwHewqFcV49eUjvuum_IHfuNs,6854
298
302
  camel/toolkits/open_api_specs/security_config.py,sha256=ZVnBa_zEifaE_ao2xsvV5majuJHpn2Tn7feMDOnj-eo,898
@@ -321,7 +325,7 @@ camel/toolkits/open_api_specs/web_scraper/openapi.yaml,sha256=u_WalQ01e8W1D27VnZ
321
325
  camel/toolkits/open_api_specs/web_scraper/paths/__init__.py,sha256=OKCZrQCDwaWtXIN_2rA9FSqEvgpQRieRoHh7Ek6N16A,702
322
326
  camel/toolkits/open_api_specs/web_scraper/paths/scraper.py,sha256=aWy1_ppV4NVVEZfnbN3tu9XA9yAPAC9bRStJ5JuXMRU,1117
323
327
  camel/types/__init__.py,sha256=VLWhAt857IFct3XepY5BNOIhyhDhfmODTezr9jhO_TI,2251
324
- camel/types/enums.py,sha256=h5UFYF6l2o1ITHClfAB79WU9GhbqFwHPTb3Lx3VYAgQ,34126
328
+ camel/types/enums.py,sha256=b3KZqTbenkWSxC7QrgR_rYO1bV8tpcmTczwofOiByJA,34343
325
329
  camel/types/openai_types.py,sha256=8ZFzLe-zGmKNPfuVZFzxlxAX98lGf18gtrPhOgMmzus,2104
326
330
  camel/types/unified_model_type.py,sha256=GP5GYtA3RfvLsqnk1c4UcOaRKMFhjDgZrLr0ln6JFw8,4253
327
331
  camel/types/agents/__init__.py,sha256=cbvVkogPoZgcwZrgxLH6EtpGXk0kavF79nOic0Dc1vg,786
@@ -337,7 +341,7 @@ camel/verifiers/__init__.py,sha256=p6UEyvaOlwUQaFACGB4C07fL1xSnpTouElt19YRuneQ,9
337
341
  camel/verifiers/base.py,sha256=efWZV9g58IHzJ24U4zr109y34CaAi8tV9WZPMCzP3YI,12017
338
342
  camel/verifiers/models.py,sha256=hC6m_YxEX-mqi_tkCNZHZWLBWf04ZTyv5vfKR-BEyU4,2818
339
343
  camel/verifiers/python_verifier.py,sha256=bj-UGxeJTZzxVVa3a8IEQ1lNOpSaaW3JdGnUEoPeQD0,7519
340
- camel_ai-0.2.25.dist-info/METADATA,sha256=SKrS5S00hnDWTqbqtN64dWdsqx2jkuT_nttTq68aVO0,37372
341
- camel_ai-0.2.25.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
342
- camel_ai-0.2.25.dist-info/licenses/LICENSE,sha256=id0nB2my5kG0xXeimIu5zZrbHLS6EQvxvkKkzIHaT2k,11343
343
- camel_ai-0.2.25.dist-info/RECORD,,
344
+ camel_ai-0.2.27.dist-info/METADATA,sha256=B4jItSRHDPybZtfm-i0xxUq3z4HWUQ99OEdaRJ33Mfw,37992
345
+ camel_ai-0.2.27.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
346
+ camel_ai-0.2.27.dist-info/licenses/LICENSE,sha256=id0nB2my5kG0xXeimIu5zZrbHLS6EQvxvkKkzIHaT2k,11343
347
+ camel_ai-0.2.27.dist-info/RECORD,,