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.
- camel/__init__.py +1 -1
- camel/agents/chat_agent.py +26 -1
- camel/toolkits/__init__.py +2 -0
- camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit.py +101 -1101
- camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit_ts.py +1177 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/browser-session.ts +46 -17
- camel/toolkits/hybrid_browser_toolkit/ts/websocket-server.js +46 -2
- camel/toolkits/hybrid_browser_toolkit_py/__init__.py +17 -0
- camel/toolkits/hybrid_browser_toolkit_py/actions.py +417 -0
- camel/toolkits/hybrid_browser_toolkit_py/agent.py +311 -0
- camel/toolkits/hybrid_browser_toolkit_py/browser_session.py +740 -0
- camel/toolkits/hybrid_browser_toolkit_py/config_loader.py +447 -0
- camel/toolkits/hybrid_browser_toolkit_py/hybrid_browser_toolkit.py +1994 -0
- camel/toolkits/hybrid_browser_toolkit_py/snapshot.py +227 -0
- camel/toolkits/hybrid_browser_toolkit_py/stealth_script.js +0 -0
- camel/toolkits/hybrid_browser_toolkit_py/unified_analyzer.js +1002 -0
- camel/toolkits/notion_mcp_toolkit.py +234 -0
- camel/toolkits/slack_toolkit.py +38 -48
- {camel_ai-0.2.73a0.dist-info → camel_ai-0.2.73a2.dist-info}/METADATA +3 -3
- {camel_ai-0.2.73a0.dist-info → camel_ai-0.2.73a2.dist-info}/RECORD +22 -11
- {camel_ai-0.2.73a0.dist-info → camel_ai-0.2.73a2.dist-info}/WHEEL +0 -0
- {camel_ai-0.2.73a0.dist-info → camel_ai-0.2.73a2.dist-info}/licenses/LICENSE +0 -0
|
@@ -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)
|
camel/toolkits/slack_toolkit.py
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
166
|
+
return f"Error leaving channel: {e.response['error']}"
|
|
175
167
|
|
|
176
168
|
def get_slack_channel_information(self) -> str:
|
|
177
|
-
r"""Retrieve
|
|
178
|
-
format.
|
|
169
|
+
r"""Retrieve a list of all public channels in the Slack workspace.
|
|
179
170
|
|
|
180
|
-
|
|
181
|
-
|
|
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
|
-
|
|
184
|
-
|
|
185
|
-
|
|
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
|
|
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
|
|
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
|
|
250
|
-
file_path (Optional[str]): The path of
|
|
251
|
-
|
|
252
|
-
user (Optional[str]): The
|
|
253
|
-
|
|
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
|
|
257
|
-
|
|
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
|
|
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
|
|
282
|
+
r"""Delete a message from a Slack channel.
|
|
291
283
|
|
|
292
284
|
Args:
|
|
293
|
-
time_stamp (str):
|
|
294
|
-
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
460
|
-
camel_ai-0.2.
|
|
461
|
-
camel_ai-0.2.
|
|
462
|
-
camel_ai-0.2.
|
|
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,,
|
|
File without changes
|
|
File without changes
|