camel-ai 0.2.73a0__py3-none-any.whl → 0.2.73a2__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,234 @@
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, ClassVar, Dict, List, Optional, Set
16
+
17
+ from camel.toolkits import BaseToolkit, FunctionTool
18
+
19
+ from .mcp_toolkit import MCPToolkit
20
+
21
+
22
+ class NotionMCPToolkit(BaseToolkit):
23
+ r"""NotionMCPToolkit provides an interface for interacting with Notion
24
+ through the Model Context Protocol (MCP).
25
+
26
+ Attributes:
27
+ timeout (Optional[float]): Connection timeout in seconds.
28
+ (default: :obj:`None`)
29
+
30
+ Note:
31
+ Currently only supports asynchronous operation mode.
32
+ """
33
+
34
+ # TODO: Create unified method to validate and fix the schema
35
+ SCHEMA_KEYWORDS: ClassVar[Set[str]] = {
36
+ "type",
37
+ "properties",
38
+ "items",
39
+ "required",
40
+ "additionalProperties",
41
+ "description",
42
+ "title",
43
+ "default",
44
+ "enum",
45
+ "const",
46
+ "examples",
47
+ "$ref",
48
+ "$defs",
49
+ "definitions",
50
+ "allOf",
51
+ "oneOf",
52
+ "anyOf",
53
+ "not",
54
+ "if",
55
+ "then",
56
+ "else",
57
+ "format",
58
+ "pattern",
59
+ "minimum",
60
+ "maximum",
61
+ "minLength",
62
+ "maxLength",
63
+ "minItems",
64
+ "maxItems",
65
+ "uniqueItems",
66
+ }
67
+
68
+ def __init__(
69
+ self,
70
+ timeout: Optional[float] = None,
71
+ ) -> None:
72
+ r"""Initializes the NotionMCPToolkit.
73
+
74
+ Args:
75
+ timeout (Optional[float]): Connection timeout in seconds.
76
+ (default: :obj:`None`)
77
+ """
78
+ super().__init__(timeout=timeout)
79
+
80
+ self._mcp_toolkit = MCPToolkit(
81
+ config_dict={
82
+ "mcpServers": {
83
+ "notionMCP": {
84
+ "command": "npx",
85
+ "args": [
86
+ "-y",
87
+ "mcp-remote",
88
+ "https://mcp.notion.com/mcp",
89
+ ],
90
+ }
91
+ }
92
+ },
93
+ timeout=timeout,
94
+ )
95
+
96
+ async def connect(self):
97
+ r"""Explicitly connect to the Notion MCP server."""
98
+ await self._mcp_toolkit.connect()
99
+
100
+ async def disconnect(self):
101
+ r"""Explicitly disconnect from the Notion MCP server."""
102
+ await self._mcp_toolkit.disconnect()
103
+
104
+ def get_tools(self) -> List[FunctionTool]:
105
+ r"""Returns a list of tools provided by the NotionMCPToolkit.
106
+
107
+ Returns:
108
+ List[FunctionTool]: List of available tools.
109
+ """
110
+ all_tools = []
111
+ for client in self._mcp_toolkit.clients:
112
+ try:
113
+ original_build_schema = client._build_tool_schema
114
+
115
+ def create_wrapper(orig_func):
116
+ def wrapper(mcp_tool):
117
+ return self._build_notion_tool_schema(
118
+ mcp_tool, orig_func
119
+ )
120
+
121
+ return wrapper
122
+
123
+ client._build_tool_schema = create_wrapper( # type: ignore[method-assign]
124
+ original_build_schema
125
+ )
126
+
127
+ client_tools = client.get_tools()
128
+ all_tools.extend(client_tools)
129
+
130
+ client._build_tool_schema = original_build_schema # type: ignore[method-assign]
131
+
132
+ except Exception as e:
133
+ from camel.logger import get_logger
134
+
135
+ logger = get_logger(__name__)
136
+ logger.error(f"Failed to get tools from client: {e}")
137
+
138
+ return all_tools
139
+
140
+ def _build_notion_tool_schema(self, mcp_tool, original_build_schema):
141
+ r"""Build tool schema with Notion-specific fixes."""
142
+ schema = original_build_schema(mcp_tool)
143
+ self._fix_notion_schema_recursively(schema)
144
+ return schema
145
+
146
+ def _fix_notion_schema_recursively(self, obj: Any) -> None:
147
+ r"""Recursively fix Notion MCP schema issues."""
148
+ if isinstance(obj, dict):
149
+ self._fix_dict_schema(obj)
150
+ self._process_nested_structures(obj)
151
+ elif isinstance(obj, list):
152
+ for item in obj:
153
+ self._fix_notion_schema_recursively(item)
154
+
155
+ def _fix_dict_schema(self, obj: Dict[str, Any]) -> None:
156
+ r"""Fix dictionary schema issues."""
157
+ if "properties" in obj and "type" not in obj:
158
+ self._fix_missing_type_with_properties(obj)
159
+ elif obj.get("type") == "object" and "properties" in obj:
160
+ self._fix_object_with_properties(obj)
161
+
162
+ def _fix_missing_type_with_properties(self, obj: Dict[str, Any]) -> None:
163
+ r"""Fix objects with properties but missing type field."""
164
+ properties = obj.get("properties", {})
165
+ if properties and isinstance(properties, dict):
166
+ obj["type"] = "object"
167
+ obj["additionalProperties"] = False
168
+
169
+ required_properties = self._get_required_properties(
170
+ properties, conservative=True
171
+ )
172
+ if required_properties:
173
+ obj["required"] = required_properties
174
+
175
+ def _fix_object_with_properties(self, obj: Dict[str, Any]) -> None:
176
+ r"""Fix objects with type="object" and properties."""
177
+ properties = obj.get("properties", {})
178
+ if properties and isinstance(properties, dict):
179
+ existing_required = obj.get("required", [])
180
+
181
+ for prop_name, prop_schema in properties.items():
182
+ if (
183
+ prop_name not in existing_required
184
+ and prop_name not in self.SCHEMA_KEYWORDS
185
+ and self._is_property_required(prop_schema)
186
+ ):
187
+ existing_required.append(prop_name)
188
+
189
+ if existing_required:
190
+ obj["required"] = existing_required
191
+
192
+ if "additionalProperties" not in obj:
193
+ obj["additionalProperties"] = False
194
+
195
+ def _get_required_properties(
196
+ self, properties: Dict[str, Any], conservative: bool = False
197
+ ) -> List[str]:
198
+ r"""Get list of required properties from a properties dict."""
199
+ required = []
200
+ for prop_name, prop_schema in properties.items():
201
+ if (
202
+ prop_name not in self.SCHEMA_KEYWORDS
203
+ and isinstance(prop_schema, dict)
204
+ and self._is_property_required(prop_schema)
205
+ ):
206
+ required.append(prop_name)
207
+ return required
208
+
209
+ def _is_property_required(self, prop_schema: Dict[str, Any]) -> bool:
210
+ r"""Check if a property should be marked as required."""
211
+ prop_type = prop_schema.get("type")
212
+ return (
213
+ prop_type is not None
214
+ and prop_type != "null"
215
+ and "default" not in prop_schema
216
+ and not (isinstance(prop_type, list) and "null" in prop_type)
217
+ )
218
+
219
+ def _process_nested_structures(self, obj: Dict[str, Any]) -> None:
220
+ r"""Process all nested structures in a schema object."""
221
+ for key, value in obj.items():
222
+ if key in ["anyOf", "oneOf", "allOf"] and isinstance(value, list):
223
+ for item in value:
224
+ self._fix_notion_schema_recursively(item)
225
+ elif key == "items" and isinstance(value, dict):
226
+ self._fix_notion_schema_recursively(value)
227
+ elif key == "properties" and isinstance(value, dict):
228
+ for prop_value in value.values():
229
+ self._fix_notion_schema_recursively(prop_value)
230
+ elif key == "$defs" and isinstance(value, dict):
231
+ for def_value in value.values():
232
+ self._fix_notion_schema_recursively(def_value)
233
+ elif isinstance(value, (dict, list)):
234
+ self._fix_notion_schema_recursively(value)
@@ -128,18 +128,14 @@ class SlackToolkit(BaseToolkit):
128
128
  return f"Error creating conversation: {e.response['error']}"
129
129
 
130
130
  def join_slack_channel(self, channel_id: str) -> str:
131
- r"""Joins an existing Slack channel.
131
+ r"""Joins an existing Slack channel. To get the `channel_id` of a
132
+ channel, you can use the `get_slack_channel_information` function.
132
133
 
133
134
  Args:
134
135
  channel_id (str): The ID of the Slack channel to join.
135
136
 
136
137
  Returns:
137
- str: A confirmation message indicating whether join successfully
138
- or an error message.
139
-
140
- Raises:
141
- SlackApiError: If there is an error during get slack channel
142
- information.
138
+ str: A string containing the API response from Slack.
143
139
  """
144
140
  from slack_sdk.errors import SlackApiError
145
141
 
@@ -148,21 +144,17 @@ class SlackToolkit(BaseToolkit):
148
144
  response = slack_client.conversations_join(channel=channel_id)
149
145
  return str(response)
150
146
  except SlackApiError as e:
151
- return f"Error creating conversation: {e.response['error']}"
147
+ return f"Error joining channel: {e.response['error']}"
152
148
 
153
149
  def leave_slack_channel(self, channel_id: str) -> str:
154
- r"""Leaves an existing Slack channel.
150
+ r"""Leaves an existing Slack channel. To get the `channel_id` of a
151
+ channel, you can use the `get_slack_channel_information` function.
155
152
 
156
153
  Args:
157
154
  channel_id (str): The ID of the Slack channel to leave.
158
155
 
159
156
  Returns:
160
- str: A confirmation message indicating whether leave successfully
161
- or an error message.
162
-
163
- Raises:
164
- SlackApiError: If there is an error during get slack channel
165
- information.
157
+ str: A string containing the API response from Slack.
166
158
  """
167
159
  from slack_sdk.errors import SlackApiError
168
160
 
@@ -171,18 +163,18 @@ class SlackToolkit(BaseToolkit):
171
163
  response = slack_client.conversations_leave(channel=channel_id)
172
164
  return str(response)
173
165
  except SlackApiError as e:
174
- return f"Error creating conversation: {e.response['error']}"
166
+ return f"Error leaving channel: {e.response['error']}"
175
167
 
176
168
  def get_slack_channel_information(self) -> str:
177
- r"""Retrieve Slack channels and return relevant information in JSON
178
- format.
169
+ r"""Retrieve a list of all public channels in the Slack workspace.
179
170
 
180
- Returns:
181
- str: JSON string containing information about Slack channels.
171
+ This function is crucial for discovering available channels and their
172
+ `channel_id`s, which are required by many other functions.
182
173
 
183
- Raises:
184
- SlackApiError: If there is an error during get slack channel
185
- information.
174
+ Returns:
175
+ str: A JSON string representing a list of channels. Each channel
176
+ object in the list contains 'id', 'name', 'created', and
177
+ 'num_members'. Returns an error message string on failure.
186
178
  """
187
179
  from slack_sdk.errors import SlackApiError
188
180
 
@@ -204,21 +196,20 @@ class SlackToolkit(BaseToolkit):
204
196
  ]
205
197
  return json.dumps(filtered_result, ensure_ascii=False)
206
198
  except SlackApiError as e:
207
- return f"Error creating conversation: {e.response['error']}"
199
+ return f"Error retrieving channel list: {e.response['error']}"
208
200
 
209
201
  def get_slack_channel_message(self, channel_id: str) -> str:
210
- r"""Retrieve messages from a Slack channel.
202
+ r"""Retrieve messages from a Slack channel. To get the `channel_id`
203
+ of a channel, you can use the `get_slack_channel_information`
204
+ function.
211
205
 
212
206
  Args:
213
207
  channel_id (str): The ID of the Slack channel to retrieve messages
214
208
  from.
215
209
 
216
210
  Returns:
217
- str: JSON string containing filtered message data.
218
-
219
- Raises:
220
- SlackApiError: If there is an error during get
221
- slack channel message.
211
+ str: A JSON string representing a list of messages. Each message
212
+ object contains 'user', 'text', and 'ts' (timestamp).
222
213
  """
223
214
  from slack_sdk.errors import SlackApiError
224
215
 
@@ -242,19 +233,20 @@ class SlackToolkit(BaseToolkit):
242
233
  file_path: Optional[str] = None,
243
234
  user: Optional[str] = None,
244
235
  ) -> str:
245
- r"""Send a message to a Slack channel.
236
+ r"""Send a message to a Slack channel. To get the `channel_id` of a
237
+ channel, you can use the `get_slack_channel_information` function.
246
238
 
247
239
  Args:
248
240
  message (str): The message to send.
249
- channel_id (str): The ID of the Slack channel to send message.
250
- file_path (Optional[str]): The path of the file to send.
251
- Defaults to `None`.
252
- user (Optional[str]): The user ID of the recipient.
253
- Defaults to `None`.
241
+ channel_id (str): The ID of the channel to send the message to.
242
+ file_path (Optional[str]): The local path of a file to upload
243
+ with the message.
244
+ user (Optional[str]): The ID of a user to send an ephemeral
245
+ message to (visible only to that user).
254
246
 
255
247
  Returns:
256
- str: A confirmation message indicating whether the message was sent
257
- successfully or an error message.
248
+ str: A confirmation message indicating success or an error
249
+ message.
258
250
  """
259
251
  from slack_sdk.errors import SlackApiError
260
252
 
@@ -280,25 +272,23 @@ class SlackToolkit(BaseToolkit):
280
272
  f"got response: {response}"
281
273
  )
282
274
  except SlackApiError as e:
283
- return f"Error creating conversation: {e.response['error']}"
275
+ return f"Error sending message: {e.response['error']}"
284
276
 
285
277
  def delete_slack_message(
286
278
  self,
287
279
  time_stamp: str,
288
280
  channel_id: str,
289
281
  ) -> str:
290
- r"""Delete a message to a Slack channel.
282
+ r"""Delete a message from a Slack channel.
291
283
 
292
284
  Args:
293
- time_stamp (str): Timestamp of the message to be deleted.
294
- channel_id (str): The ID of the Slack channel to delete message.
285
+ time_stamp (str): The 'ts' value of the message to be deleted.
286
+ You can get this from the `get_slack_channel_message` function.
287
+ channel_id (str): The ID of the channel where the message is. Use
288
+ `get_slack_channel_information` to find the `channel_id`.
295
289
 
296
290
  Returns:
297
- str: A confirmation message indicating whether the message
298
- was delete successfully or an error message.
299
-
300
- Raises:
301
- SlackApiError: If an error occurs while sending the message.
291
+ str: A string containing the API response from Slack.
302
292
  """
303
293
  from slack_sdk.errors import SlackApiError
304
294
 
@@ -309,7 +299,7 @@ class SlackToolkit(BaseToolkit):
309
299
  )
310
300
  return str(response)
311
301
  except SlackApiError as e:
312
- return f"Error creating conversation: {e.response['error']}"
302
+ return f"Error deleting message: {e.response['error']}"
313
303
 
314
304
  def get_tools(self) -> List[FunctionTool]:
315
305
  r"""Returns a list of FunctionTool objects representing the
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: camel-ai
3
- Version: 0.2.73a0
3
+ Version: 0.2.73a2
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
@@ -128,7 +128,7 @@ Requires-Dist: sympy<2,>=1.13.3; extra == 'all'
128
128
  Requires-Dist: tabulate>=0.9.0; extra == 'all'
129
129
  Requires-Dist: tavily-python<0.6,>=0.5.0; extra == 'all'
130
130
  Requires-Dist: textblob<0.18,>=0.17.1; extra == 'all'
131
- Requires-Dist: traceroot==0.0.4a4; extra == 'all'
131
+ Requires-Dist: traceroot==0.0.4a5; extra == 'all'
132
132
  Requires-Dist: transformers<5,>=4; extra == 'all'
133
133
  Requires-Dist: tree-sitter-python<0.24,>=0.23.6; extra == 'all'
134
134
  Requires-Dist: tree-sitter<0.24,>=0.23.2; extra == 'all'
@@ -193,7 +193,7 @@ Requires-Dist: ipykernel<7,>=6.0.0; extra == 'dev-tools'
193
193
  Requires-Dist: jupyter-client<9,>=8.6.2; extra == 'dev-tools'
194
194
  Requires-Dist: langfuse>=2.60.5; extra == 'dev-tools'
195
195
  Requires-Dist: mcp>=1.3.0; extra == 'dev-tools'
196
- Requires-Dist: traceroot==0.0.4a4; extra == 'dev-tools'
196
+ Requires-Dist: traceroot==0.0.4a5; extra == 'dev-tools'
197
197
  Requires-Dist: tree-sitter-python<0.24,>=0.23.6; extra == 'dev-tools'
198
198
  Requires-Dist: tree-sitter<0.24,>=0.23.2; extra == 'dev-tools'
199
199
  Requires-Dist: typer>=0.15.2; extra == 'dev-tools'
@@ -1,4 +1,4 @@
1
- camel/__init__.py,sha256=LTkqY9-7B4fjQ79FR9WNMAnmrvxJWu3XOfTRTpz2fcU,901
1
+ camel/__init__.py,sha256=pn3-Lfew1wFDh_51dBOk0tY-qRlN-W_XoCGsZ9kOZ7o,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=1vypUj36VlAHRSb9U-jzJPq3TqA4dS6b8kZAPIaqJ0c,150855
10
+ camel/agents/chat_agent.py,sha256=4Hn27mtUvUQmwMIFTDTUcTsXWIjyeISvz1FCOdm5HSM,151957
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
@@ -317,7 +317,7 @@ camel/terminators/__init__.py,sha256=t8uqrkUnXEOYMXQDgaBkMFJ0EXFKI0kmx4cUimli3Ls
317
317
  camel/terminators/base.py,sha256=xmJzERX7GdSXcxZjAHHODa0rOxRChMSRboDCNHWSscs,1511
318
318
  camel/terminators/response_terminator.py,sha256=n3G5KP6Oj7-7WlRN0yFcrtLpqAJKaKS0bmhrWlFfCgQ,4982
319
319
  camel/terminators/token_limit_terminator.py,sha256=YWv6ZR8R9yI2Qnf_3xES5bEE_O5bb2CxQ0EUXfMh34c,2118
320
- camel/toolkits/__init__.py,sha256=ywXaXZJD8a3lyjNVV6ntVCpBYvgbSMK3N5ULJet-xKw,6013
320
+ camel/toolkits/__init__.py,sha256=ug0QbctUQWLUfVI4fSufMyqvorttPYDKy3cI33-v9Ho,6086
321
321
  camel/toolkits/aci_toolkit.py,sha256=39AsXloBb16hHB7DKi6mFU6NPZ3iVpM2FZgaP4o4eLE,16060
322
322
  camel/toolkits/arxiv_toolkit.py,sha256=mw629nIN_ozaAxNv3nbvhonJKNI2-97ScRCBS3gVqNo,6297
323
323
  camel/toolkits/ask_news_toolkit.py,sha256=WfWaqwEo1Apbil3-Rb5y65Ws43NU4rAFWZu5VHe4los,23448
@@ -355,6 +355,7 @@ camel/toolkits/message_integration.py,sha256=WdcoVoDAPwlvfXK26wHBf2q_IQCH4PQ_gJt
355
355
  camel/toolkits/mineru_toolkit.py,sha256=vRX9LholLNkpbJ6axfEN4pTG85aWb0PDmlVy3rAAXhg,6868
356
356
  camel/toolkits/networkx_toolkit.py,sha256=C7pUCZTzzGkFyqdkrmhRKpAHmHWfLKeuzYHC_BHPtbk,8826
357
357
  camel/toolkits/note_taking_toolkit.py,sha256=cp7uoSBMjiGy331Tdk2Bl6yqKSMGwws7rQJkq8tfTQs,10687
358
+ camel/toolkits/notion_mcp_toolkit.py,sha256=ie_6Z-7DqDhgTiwYX8L3X47rfWGwzgwQH_s2DaK1ckc,8362
358
359
  camel/toolkits/notion_toolkit.py,sha256=jmmVWk_WazRNWnx4r9DAvhFTAL-n_ige0tb32UHJ_ik,9752
359
360
  camel/toolkits/open_api_toolkit.py,sha256=Venfq8JwTMQfzRzzB7AYmYUMEX35hW0BjIv_ozFMiNk,23316
360
361
  camel/toolkits/openai_agent_toolkit.py,sha256=hT2ancdQigngAiY1LNnGJzZeiBDHUxrRGv6BdZTJizc,4696
@@ -373,7 +374,7 @@ camel/toolkits/screenshot_toolkit.py,sha256=IwfvfLSfqrEywvPlDbtYJe1qcbrO5uC3Mxxv
373
374
  camel/toolkits/search_toolkit.py,sha256=2zKclYTQi5ThjPLiwKV7qX8GxuvgtgSLBHipTz-ZgWY,48360
374
375
  camel/toolkits/searxng_toolkit.py,sha256=a2GtE4FGSrmaIVvX6Yide-abBYD1wsHqitnDlx9fdVg,7664
375
376
  camel/toolkits/semantic_scholar_toolkit.py,sha256=Rh7eA_YPxV5pvPIzhjjvpr3vtlaCniJicrqzkPWW9_I,11634
376
- camel/toolkits/slack_toolkit.py,sha256=ZT6Ndlce2qjGsyZaNMfQ54nSEi7DOC9Ro7YqtK-u5O4,11651
377
+ camel/toolkits/slack_toolkit.py,sha256=ZnK_fRdrQiaAUpjkgHSv1iXdv1HKEgXMlKevu3QivB8,11849
377
378
  camel/toolkits/stripe_toolkit.py,sha256=07swo5znGTnorafC1uYLKB4NRcJIOPOx19J7tkpLYWk,10102
378
379
  camel/toolkits/sympy_toolkit.py,sha256=BAQnI8EFJydNUpKQWXBdleQ1Cm-srDBhFlqp9V9pbPQ,33757
379
380
  camel/toolkits/task_planning_toolkit.py,sha256=Ttw9fHae4omGC1SA-6uaeXVHJ1YkwiVloz_hO-fm1gw,4855
@@ -389,18 +390,28 @@ camel/toolkits/wolfram_alpha_toolkit.py,sha256=qeIM8ySn5ilcExBWtx-hDOc35bNcebLVn
389
390
  camel/toolkits/zapier_toolkit.py,sha256=A83y1UcfuopH7Fx82pORzypl1StbhBjB2HhyOqYa300,7124
390
391
  camel/toolkits/hybrid_browser_toolkit/__init__.py,sha256=vxjWhq7GjUKE5I9RGQU_GoikZJ-AVK4ertdvEqp9pd0,802
391
392
  camel/toolkits/hybrid_browser_toolkit/config_loader.py,sha256=UwBh7wG4-owoI2VfiNMum0O7dPWMYiEDxQKtq_GazU4,6903
392
- camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit.py,sha256=riORnWhjhqdzYNNKEwANHVxf8WgpIMYK6q7pS7qsav0,45270
393
+ camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit.py,sha256=gotOOlXJjfjv9Qnn89PLNhJ4_Rw_aMMU6gTJcG-uCf8,7938
394
+ camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit_ts.py,sha256=8ArSGFCx1bIrZR8cdRVUX6axy5Fxgk5ADEgiSrPQ_Bo,45269
393
395
  camel/toolkits/hybrid_browser_toolkit/ws_wrapper.py,sha256=5wssGj2LvREtyl91lC5pTIb0G7DZlFvLT_Pn-7XPESY,18460
394
396
  camel/toolkits/hybrid_browser_toolkit/ts/package-lock.json,sha256=_-YE9S_C1XT59A6upQp9lLuZcC67cV9QlbwAsEKkfyw,156337
395
397
  camel/toolkits/hybrid_browser_toolkit/ts/package.json,sha256=pUQm0xwXR7ZyWNv6O2QtHW00agnfAoX9F_XGXZlAxl4,745
396
398
  camel/toolkits/hybrid_browser_toolkit/ts/tsconfig.json,sha256=SwpQnq4Q-rwRobF2iWrP96mgmgwaVPZEv-nii5QIYEU,523
397
- camel/toolkits/hybrid_browser_toolkit/ts/websocket-server.js,sha256=mLjufus1_ugzRtWMTMQmn5xqsph-RNW55jkWrXbGxrg,6752
399
+ camel/toolkits/hybrid_browser_toolkit/ts/websocket-server.js,sha256=WsH16sf1zP1TPTKdVgbZAx42eHtgeQGqcTef2FPdR6Y,8556
398
400
  camel/toolkits/hybrid_browser_toolkit/ts/src/browser-scripts.js,sha256=NNwM_H2xaDrlrdac0PJK1iUBwdiuQsg9qKaMhHAvZuI,3160
399
- camel/toolkits/hybrid_browser_toolkit/ts/src/browser-session.ts,sha256=NNjStas8xzOONI1yJIMkeQeSYGZHPRK19ksEu665hwo,31711
401
+ camel/toolkits/hybrid_browser_toolkit/ts/src/browser-session.ts,sha256=csJ6yelay5r0QULBzWybakO3IB7dQ5QpbrSdCxLlrwE,33165
400
402
  camel/toolkits/hybrid_browser_toolkit/ts/src/config-loader.ts,sha256=jYsu9qFuwpFIS5y8rQ5R6aX_HDlDEh2YsvFH6CQLhmg,6181
401
403
  camel/toolkits/hybrid_browser_toolkit/ts/src/hybrid-browser-toolkit.ts,sha256=VLhaKGQ2rz9OMRTluQ4h9kC0MMJz6-y29WxR-DQEu-c,16551
402
404
  camel/toolkits/hybrid_browser_toolkit/ts/src/index.ts,sha256=uJGHmGs640iCrjllqXDXwDE4hGW1VJA2YL6BkFkzYNs,353
403
405
  camel/toolkits/hybrid_browser_toolkit/ts/src/types.ts,sha256=Soid_nh1Ft829pKe_Xt1wxGf3pMSY2vDx4MJHGlhzaA,2442
406
+ camel/toolkits/hybrid_browser_toolkit_py/__init__.py,sha256=tPQloCw-Ayl1lPfyvzGJkMFa1ze3ilXJq_1Oz5jg5s4,796
407
+ camel/toolkits/hybrid_browser_toolkit_py/actions.py,sha256=x6X-kEdQx3K1ID-BBwdQEciX6C0KMt5QUszpnksnj3A,15003
408
+ camel/toolkits/hybrid_browser_toolkit_py/agent.py,sha256=0ifwhYUDJ5GLxfdpC5KquPaW1a0QBAutp2Y9y0YFujw,11685
409
+ camel/toolkits/hybrid_browser_toolkit_py/browser_session.py,sha256=fgV1o4pWOQ_fUvmpk7UHYcJCqHY_cmivoY_OB0ZKv3s,26866
410
+ camel/toolkits/hybrid_browser_toolkit_py/config_loader.py,sha256=0zpDq3aFKEva2jc38kgLHnyxypIDk9SOcMjoP26tozo,15414
411
+ camel/toolkits/hybrid_browser_toolkit_py/hybrid_browser_toolkit.py,sha256=nph9Nyam4349zPPA6f2NZ7KPA-xNLW18qHqooBeVlFM,76798
412
+ camel/toolkits/hybrid_browser_toolkit_py/snapshot.py,sha256=3vQaFK5C1P8WnkK2eDMaFOizrZf4uUAW0LxdeoF4F2w,8539
413
+ camel/toolkits/hybrid_browser_toolkit_py/stealth_script.js,sha256=z4XRSVUpAS87Sj36s3bY8XXhvRcHBlgsUOyMxV2HI80,27650
414
+ camel/toolkits/hybrid_browser_toolkit_py/unified_analyzer.js,sha256=VnzIn0KcEtxuncJi-OPZzdWbLSeSHCH-7sviFAGNM8g,40823
404
415
  camel/toolkits/open_api_specs/security_config.py,sha256=ZVnBa_zEifaE_ao2xsvV5majuJHpn2Tn7feMDOnj-eo,898
405
416
  camel/toolkits/open_api_specs/biztoc/__init__.py,sha256=OKCZrQCDwaWtXIN_2rA9FSqEvgpQRieRoHh7Ek6N16A,702
406
417
  camel/toolkits/open_api_specs/biztoc/ai-plugin.json,sha256=IJinQbLv5MFPGFwdN7PbOhwArFVExSEZdJspe-mOBIo,866
@@ -456,7 +467,7 @@ camel/verifiers/math_verifier.py,sha256=tA1D4S0sm8nsWISevxSN0hvSVtIUpqmJhzqfbuMo
456
467
  camel/verifiers/models.py,sha256=GdxYPr7UxNrR1577yW4kyroRcLGfd-H1GXgv8potDWU,2471
457
468
  camel/verifiers/physics_verifier.py,sha256=c1grrRddcrVN7szkxhv2QirwY9viIRSITWeWFF5HmLs,30187
458
469
  camel/verifiers/python_verifier.py,sha256=ogTz77wODfEcDN4tMVtiSkRQyoiZbHPY2fKybn59lHw,20558
459
- camel_ai-0.2.73a0.dist-info/METADATA,sha256=Xl3A8teMGBqoMuxICxwUID9PodwgAwsuCvAE_kkgwjE,50334
460
- camel_ai-0.2.73a0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
461
- camel_ai-0.2.73a0.dist-info/licenses/LICENSE,sha256=id0nB2my5kG0xXeimIu5zZrbHLS6EQvxvkKkzIHaT2k,11343
462
- camel_ai-0.2.73a0.dist-info/RECORD,,
470
+ camel_ai-0.2.73a2.dist-info/METADATA,sha256=cZbuO7_djNwJRLDIsjoopizSes24a2pjAewf7XM-u0A,50334
471
+ camel_ai-0.2.73a2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
472
+ camel_ai-0.2.73a2.dist-info/licenses/LICENSE,sha256=id0nB2my5kG0xXeimIu5zZrbHLS6EQvxvkKkzIHaT2k,11343
473
+ camel_ai-0.2.73a2.dist-info/RECORD,,