alita-sdk 0.3.182__py3-none-any.whl → 0.3.184__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.
- alita_sdk/runtime/clients/client.py +38 -0
- alita_sdk/runtime/langchain/assistant.py +160 -26
- alita_sdk/runtime/langchain/langraph_agent.py +65 -8
- alita_sdk/runtime/llms/alita.py +1 -1
- alita_sdk/runtime/toolkits/tools.py +48 -0
- alita_sdk/runtime/tools/llm.py +260 -41
- alita_sdk/runtime/tools/mcp_server_tool.py +15 -0
- alita_sdk/runtime/utils/streamlit.py +2 -1
- alita_sdk/tools/__init__.py +1 -0
- alita_sdk/tools/ado/test_plan/test_plan_wrapper.py +55 -3
- alita_sdk/tools/ado/work_item/ado_wrapper.py +10 -6
- alita_sdk/tools/carrier/api_wrapper.py +3 -0
- alita_sdk/tools/carrier/backend_tests_tool.py +101 -7
- alita_sdk/tools/carrier/carrier_sdk.py +4 -0
- alita_sdk/tools/slack/__init__.py +57 -0
- alita_sdk/tools/slack/api_wrapper.py +190 -0
- {alita_sdk-0.3.182.dist-info → alita_sdk-0.3.184.dist-info}/METADATA +2 -1
- {alita_sdk-0.3.182.dist-info → alita_sdk-0.3.184.dist-info}/RECORD +21 -19
- {alita_sdk-0.3.182.dist-info → alita_sdk-0.3.184.dist-info}/WHEEL +0 -0
- {alita_sdk-0.3.182.dist-info → alita_sdk-0.3.184.dist-info}/licenses/LICENSE +0 -0
- {alita_sdk-0.3.182.dist-info → alita_sdk-0.3.184.dist-info}/top_level.txt +0 -0
@@ -79,8 +79,8 @@ class RunTestByIDTool(BaseTool):
|
|
79
79
|
description: str = "Execute test plan from the Carrier platform."
|
80
80
|
args_schema: Type[BaseModel] = create_model(
|
81
81
|
"RunTestByIdInput",
|
82
|
-
test_id=(
|
83
|
-
name=(str, Field(default=None, description="Test name to execute")),
|
82
|
+
test_id=(int, Field(default=None, description="Test id to execute. Use test_id if user provide id in int format")),
|
83
|
+
name=(str, Field(default=None, description="Test name to execute. Use name if user provide name in str format")),
|
84
84
|
test_parameters=(list, Field(
|
85
85
|
default=None,
|
86
86
|
description=(
|
@@ -89,9 +89,26 @@ class RunTestByIDTool(BaseTool):
|
|
89
89
|
"contain parameter names and their values."
|
90
90
|
)
|
91
91
|
)),
|
92
|
+
location=(str, Field(
|
93
|
+
default=None,
|
94
|
+
description=(
|
95
|
+
"Location to execute the test. Choose from public_regions, project_regions, "
|
96
|
+
"or cloud_regions. For cloud_regions, additional parameters may be required."
|
97
|
+
)
|
98
|
+
)),
|
99
|
+
cloud_settings=(dict, Field(
|
100
|
+
default={},
|
101
|
+
description=(
|
102
|
+
"Additional parameters for cloud_regions. Provide as a dictionary, "
|
103
|
+
"e.g., {'region_name': 'us-west-1', 'instance_type': 't2.large'}. "
|
104
|
+
"Don't provide this parameter as string! It should be a dictionary!"
|
105
|
+
"If no changes are needed, respond with 'use default'."
|
106
|
+
"Ensure these settings are passed as a valid dictionary not string"
|
107
|
+
)
|
108
|
+
)),
|
92
109
|
)
|
93
110
|
|
94
|
-
def _run(self, test_id=None, name=None, test_parameters=None):
|
111
|
+
def _run(self, test_id=None, name=None, test_parameters=None, location=None, cloud_settings=None):
|
95
112
|
try:
|
96
113
|
if not test_id and not name:
|
97
114
|
return {"message": "Please provide test id or test name to start"}
|
@@ -115,9 +132,18 @@ class RunTestByIDTool(BaseTool):
|
|
115
132
|
# If no test_parameters are provided, return the default ones for confirmation
|
116
133
|
if test_parameters is None:
|
117
134
|
return {
|
118
|
-
"message": "
|
135
|
+
"message": "The test requires confirmation or customization of the following parameters before execution.",
|
119
136
|
"default_test_parameters": default_test_parameters,
|
120
|
-
"instruction":
|
137
|
+
"instruction": (
|
138
|
+
"If the user has already indicated that default parameters should be used, "
|
139
|
+
"pass 'default_test_parameters' as 'test_parameters' and invoke the '_run' method again without prompting the user.\n"
|
140
|
+
"If the user wants to proceed with default parameters, respond with 'use default'.\n"
|
141
|
+
"In this case, the agent should pass 'default_test_parameters' as 'test_parameters' to the tool.\n"
|
142
|
+
"If the user provides specific overrides, parse them into a list of dictionaries in the following format:\n"
|
143
|
+
"[{'vUsers': '5', 'duration': '120'}].\n"
|
144
|
+
"Each dictionary should contain the parameter name and its desired value.\n"
|
145
|
+
"Ensure that you correctly parse and validate the user's input before invoking the '_run' method."
|
146
|
+
),
|
121
147
|
}
|
122
148
|
|
123
149
|
# Normalize test_parameters if provided in an incorrect format
|
@@ -126,6 +152,55 @@ class RunTestByIDTool(BaseTool):
|
|
126
152
|
# Apply user-provided test parameters
|
127
153
|
updated_test_parameters = self._apply_test_parameters(default_test_parameters, test_parameters)
|
128
154
|
|
155
|
+
# Fetch available locations
|
156
|
+
available_locations = self.api_wrapper.get_available_locations()
|
157
|
+
# If location is not provided, prompt the user with available options
|
158
|
+
if not location:
|
159
|
+
return {
|
160
|
+
"message": "Please select a location to execute the test.",
|
161
|
+
"available_locations": {
|
162
|
+
"public_regions": available_locations["public_regions"],
|
163
|
+
"project_regions": available_locations["project_regions"],
|
164
|
+
"cloud_regions": [region["name"] for region in available_locations["cloud_regions"]],
|
165
|
+
},
|
166
|
+
"instruction": (
|
167
|
+
"For public_regions and project_regions, provide the region name. "
|
168
|
+
"For cloud_regions, provide the region name and optionally override cloud_settings."
|
169
|
+
)
|
170
|
+
}
|
171
|
+
|
172
|
+
# Handle cloud_regions with additional parameters
|
173
|
+
selected_cloud_region = next(
|
174
|
+
(region for region in available_locations["cloud_regions"] if region["name"] == location),
|
175
|
+
None
|
176
|
+
)
|
177
|
+
|
178
|
+
if selected_cloud_region:
|
179
|
+
# Extract available cloud_settings from the selected cloud region
|
180
|
+
available_cloud_settings = selected_cloud_region["cloud_settings"]
|
181
|
+
|
182
|
+
# Add default values for instance_type and ec2_instance_type
|
183
|
+
available_cloud_settings["instance_type"] = "spot"
|
184
|
+
available_cloud_settings["ec2_instance_type"] = "t2.medium"
|
185
|
+
|
186
|
+
# If cloud_settings are not provided, prompt the user with available parameters
|
187
|
+
if not cloud_settings:
|
188
|
+
return {
|
189
|
+
"message": f"Please confirm or override the following cloud settings for the selected location: {location}",
|
190
|
+
"available_cloud_settings": available_cloud_settings,
|
191
|
+
"instruction": (
|
192
|
+
"Provide a dictionary to override cloud settings, e.g., "
|
193
|
+
"{'region_name': 'us-west-1', 'instance_type': 't2.large'}. "
|
194
|
+
"Don't provide this parameter as string! It should be a dictionary! "
|
195
|
+
"Ensure these settings are passed to the 'cloud_settings' argument, not 'test_parameters'."
|
196
|
+
"Ensure these settings are passed as a valid dictionary not string"
|
197
|
+
)
|
198
|
+
}
|
199
|
+
|
200
|
+
# Validate and merge user-provided cloud_settings with available parameters
|
201
|
+
cloud_settings = self._merge_cloud_settings(available_cloud_settings, cloud_settings)
|
202
|
+
|
203
|
+
|
129
204
|
# Build common_params dictionary
|
130
205
|
common_params = {
|
131
206
|
param["name"]: param
|
@@ -136,7 +211,8 @@ class RunTestByIDTool(BaseTool):
|
|
136
211
|
# Add env_vars, parallel_runners, and location to common_params
|
137
212
|
common_params["env_vars"] = test_data.get("env_vars", {})
|
138
213
|
common_params["parallel_runners"] = test_data.get("parallel_runners")
|
139
|
-
common_params["location"] =
|
214
|
+
common_params["location"] = location
|
215
|
+
common_params["env_vars"]["cloud_settings"] = cloud_settings or {}
|
140
216
|
|
141
217
|
# Build the JSON body
|
142
218
|
json_body = {
|
@@ -146,7 +222,7 @@ class RunTestByIDTool(BaseTool):
|
|
146
222
|
}
|
147
223
|
|
148
224
|
# Execute the test
|
149
|
-
report_id = self.api_wrapper.run_test(
|
225
|
+
report_id = self.api_wrapper.run_test(test_data.get("id"), json_body)
|
150
226
|
return f"Test started. Report id: {report_id}. Link to report:" \
|
151
227
|
f"{self.api_wrapper.url.rstrip('/')}/-/performance/backend/results?result_id={report_id}"
|
152
228
|
|
@@ -207,6 +283,24 @@ class RunTestByIDTool(BaseTool):
|
|
207
283
|
})
|
208
284
|
return updated_parameters
|
209
285
|
|
286
|
+
def _merge_cloud_settings(self, available_cloud_settings, user_cloud_settings):
|
287
|
+
"""
|
288
|
+
Merge user-provided cloud settings with available cloud settings.
|
289
|
+
Ensure that user-provided values override the defaults.
|
290
|
+
"""
|
291
|
+
if not user_cloud_settings:
|
292
|
+
return available_cloud_settings
|
293
|
+
|
294
|
+
# Validate user-provided keys against available keys
|
295
|
+
invalid_keys = [key for key in user_cloud_settings if key not in available_cloud_settings]
|
296
|
+
if invalid_keys:
|
297
|
+
raise ValueError(
|
298
|
+
f"Invalid keys in cloud settings: {invalid_keys}. Allowed keys: {list(available_cloud_settings.keys())}")
|
299
|
+
|
300
|
+
# Merge the settings
|
301
|
+
merged_settings = {**available_cloud_settings, **user_cloud_settings}
|
302
|
+
return merged_settings
|
303
|
+
|
210
304
|
|
211
305
|
class CreateBackendTestInput(BaseModel):
|
212
306
|
test_name: str = Field(..., description="Test name")
|
@@ -103,6 +103,10 @@ class CarrierClient(BaseModel):
|
|
103
103
|
endpoint = f"api/v1/integrations/integrations/{self.credentials.project_id}?name={name}"
|
104
104
|
return self.request('get', endpoint)
|
105
105
|
|
106
|
+
def get_available_locations(self):
|
107
|
+
endpoint = f"api/v1/shared/locations/default/{self.credentials.project_id}"
|
108
|
+
return self.request('get', endpoint)
|
109
|
+
|
106
110
|
def run_ui_test(self, test_id: str, json_body):
|
107
111
|
"""Run a UI test with the given test ID and JSON body."""
|
108
112
|
endpoint = f"api/v1/ui_performance/test/{self.credentials.project_id}/{test_id}"
|
@@ -0,0 +1,57 @@
|
|
1
|
+
from typing import List, Optional
|
2
|
+
|
3
|
+
from langchain_core.tools import BaseToolkit, BaseTool
|
4
|
+
from pydantic import create_model, BaseModel, Field, SecretStr
|
5
|
+
from ..base.tool import BaseAction
|
6
|
+
|
7
|
+
from .api_wrapper import SlackApiWrapper
|
8
|
+
from ..utils import TOOLKIT_SPLITTER, clean_string, get_max_toolkit_length
|
9
|
+
|
10
|
+
name = "slack"
|
11
|
+
|
12
|
+
def get_tools(tool):
|
13
|
+
return SlackToolkit().get_toolkit(
|
14
|
+
selected_tools=tool['settings'].get('selected_tools', []),
|
15
|
+
slack_token=tool['settings'].get('slack_token'),
|
16
|
+
channel_id=tool['settings'].get('channel_id'),
|
17
|
+
toolkit_name=tool.get('toolkit_name')
|
18
|
+
).get_tools()
|
19
|
+
|
20
|
+
class SlackToolkit(BaseToolkit):
|
21
|
+
tools: List[BaseTool] = []
|
22
|
+
|
23
|
+
@staticmethod
|
24
|
+
def toolkit_config_schema() -> BaseModel:
|
25
|
+
selected_tools = {x['name']: x['args_schema'].schema() for x in SlackApiWrapper.model_construct().get_available_tools()}
|
26
|
+
SlackToolkit.toolkit_max_length = get_max_toolkit_length(selected_tools)
|
27
|
+
return create_model(
|
28
|
+
name,
|
29
|
+
slack_token=(SecretStr, Field( description="Slack Bot/User OAuth Token like XOXB-*****-*****-*****-*****")),
|
30
|
+
channel_id=(str, Field(title="Channel ID", description="Channel ID, user ID, or conversation ID to send the message to. (like C12345678 for public channels, D12345678 for DMs)")),
|
31
|
+
selected_tools=(list[str], Field(title="Selected Tools", description="List of tools to enable", default=[])),
|
32
|
+
__config__={'json_schema_extra': {'metadata': {"label": "slack", "icon_url": None, "hidden": True}}}
|
33
|
+
)
|
34
|
+
|
35
|
+
@classmethod
|
36
|
+
def get_toolkit(cls, selected_tools: Optional[List[str]] = None, toolkit_name: Optional[str] = None, **kwargs):
|
37
|
+
if selected_tools is None:
|
38
|
+
selected_tools = []
|
39
|
+
slack_api_wrapper = SlackApiWrapper(**kwargs)
|
40
|
+
prefix = clean_string(toolkit_name, cls.toolkit_max_length) + TOOLKIT_SPLITTER if toolkit_name else ''
|
41
|
+
available_tools = slack_api_wrapper.get_available_tools()
|
42
|
+
tools = []
|
43
|
+
for tool in available_tools:
|
44
|
+
if selected_tools and tool["name"] not in selected_tools:
|
45
|
+
continue
|
46
|
+
tools.append(BaseAction(
|
47
|
+
api_wrapper=slack_api_wrapper,
|
48
|
+
name=prefix + tool["name"],
|
49
|
+
description=tool["description"],
|
50
|
+
args_schema=tool["args_schema"],
|
51
|
+
func=tool["ref"]
|
52
|
+
))
|
53
|
+
return cls(tools=tools)
|
54
|
+
|
55
|
+
def get_tools(self) -> List[BaseTool]:
|
56
|
+
return self.tools
|
57
|
+
|
@@ -0,0 +1,190 @@
|
|
1
|
+
import logging
|
2
|
+
from typing import Optional
|
3
|
+
from pydantic import BaseModel, Field, SecretStr, create_model, model_validator
|
4
|
+
from slack_sdk import WebClient
|
5
|
+
from slack_sdk.errors import SlackApiError
|
6
|
+
|
7
|
+
from alita_sdk.tools.elitea_base import BaseToolApiWrapper
|
8
|
+
|
9
|
+
|
10
|
+
logger = logging.getLogger(__name__)
|
11
|
+
|
12
|
+
SendMessageModel = create_model(
|
13
|
+
"SendMessageModel",
|
14
|
+
message=(str, Field(description="The message text to send."))
|
15
|
+
)
|
16
|
+
|
17
|
+
ReadMessagesModel = create_model(
|
18
|
+
"ReadMessagesModel",
|
19
|
+
limit=(int, Field(default=10, description="The number of messages to fetch (default is 10)."))
|
20
|
+
)
|
21
|
+
|
22
|
+
CreateChannelModel = create_model(
|
23
|
+
"CreateChannelModel",
|
24
|
+
channel_name=(str, Field(description="Channel ID, user ID, or conversation ID to send the message to. (like C12345678 for public channels, D12345678 for DMs)")),
|
25
|
+
is_private=(bool, Field(default=False, description="Whether to make the channel private (default: False)."))
|
26
|
+
)
|
27
|
+
|
28
|
+
ListUsersModel = create_model(
|
29
|
+
"ListUsersModel"
|
30
|
+
)
|
31
|
+
|
32
|
+
|
33
|
+
class SlackApiWrapper(BaseToolApiWrapper):
|
34
|
+
|
35
|
+
"""
|
36
|
+
Slack API wrapper for interacting with Slack channels and messages.
|
37
|
+
"""
|
38
|
+
slack_token: Optional[SecretStr] = Field(default=None,description="Slack Bot/User OAuth Token like XOXB-*****-*****-*****-*****")
|
39
|
+
channel_id: Optional[str] = Field(default=None, description="Channel ID, user ID, or conversation ID to send the message to. (like C12345678 for public channels, D12345678 for DMs)")
|
40
|
+
|
41
|
+
@model_validator(mode="after")
|
42
|
+
@classmethod
|
43
|
+
def validate_toolkit(cls, values):
|
44
|
+
token = values.slack_token.get_secret_value() if values.slack_token else None
|
45
|
+
if not token:
|
46
|
+
logging.error("Slack token is required.")
|
47
|
+
raise ValueError("Slack token is required.")
|
48
|
+
try:
|
49
|
+
cls._client = WebClient(token=token)
|
50
|
+
logging.info("Authenticated with Slack token.")
|
51
|
+
except Exception as e:
|
52
|
+
logging.error(f"Failed to authenticate with Slack: {str(e)}")
|
53
|
+
raise ValueError(f"Failed to authenticate with Slack: {str(e)}")
|
54
|
+
return values
|
55
|
+
|
56
|
+
def _get_client(self):
|
57
|
+
if not self._client:
|
58
|
+
self._client = WebClient(token=self.slack_token.get_secret_value())
|
59
|
+
return self._client
|
60
|
+
|
61
|
+
|
62
|
+
def send_message(self, message: str):
|
63
|
+
"""
|
64
|
+
Sends a message to a specified Slack channel, user, or conversation.
|
65
|
+
"""
|
66
|
+
|
67
|
+
try:
|
68
|
+
|
69
|
+
client = self._get_client()
|
70
|
+
response = client.chat_postMessage(channel=self.channel_id, text=message)
|
71
|
+
logger.info(f"Message sent to {self.channel_id}: {message}")
|
72
|
+
return f"Message sent successfully to {self.channel_id}."
|
73
|
+
|
74
|
+
except SlackApiError as e:
|
75
|
+
logger.error(f"Failed to send message to {self.channel_id}: {e.response['error']}")
|
76
|
+
return f"Received the error : {e.response['error']}"
|
77
|
+
|
78
|
+
def read_messages(self, limit=10):
|
79
|
+
"""
|
80
|
+
Reads the latest messages from a Slack channel or conversation.
|
81
|
+
|
82
|
+
:param limit: int: The number of messages to fetch (default is 10)
|
83
|
+
:return: list: Returns a list of messages with metadata.
|
84
|
+
"""
|
85
|
+
try:
|
86
|
+
|
87
|
+
client = self._get_client()
|
88
|
+
# Fetch conversation history
|
89
|
+
response = client.conversations_history(
|
90
|
+
channel=self.channel_id,
|
91
|
+
limit=limit )
|
92
|
+
|
93
|
+
# Extract messages from the response
|
94
|
+
messages = self.extract_slack_messages(response.get('messages', []))
|
95
|
+
|
96
|
+
return messages
|
97
|
+
|
98
|
+
except SlackApiError as e:
|
99
|
+
# Handle errors from the Slack API
|
100
|
+
logger.error(f"Failed to read message from {self.channel_id}: {e.response['error']}")
|
101
|
+
return f"Received the error : {e.response['error']}"
|
102
|
+
|
103
|
+
def create_slack_channel(self, channel_name: str, is_private=False):
|
104
|
+
"""
|
105
|
+
Creates a new Slack channel.
|
106
|
+
|
107
|
+
:param channel_name: str: Desired name for the channel (e.g., "my-new-channel").
|
108
|
+
:param is_private: bool: Whether to make the channel private (default: False).
|
109
|
+
:return: dict: Slack API response or error message.
|
110
|
+
"""
|
111
|
+
|
112
|
+
try:
|
113
|
+
client = self._get_client()
|
114
|
+
response = client.conversations_create(
|
115
|
+
name=channel_name,
|
116
|
+
is_private=is_private
|
117
|
+
)
|
118
|
+
channel_id = response["channel"]["id"]
|
119
|
+
print(f"Channel '{channel_name}' created successfully! Channel ID: {channel_id}")
|
120
|
+
return {"success": True, "channel_id": channel_id}
|
121
|
+
except SlackApiError as e:
|
122
|
+
error_message = e.response.get("error", "unknown_error")
|
123
|
+
print(f"Failed to create channel '{channel_name}': {error_message}")
|
124
|
+
return {"success": False, "error": error_message}
|
125
|
+
|
126
|
+
def list_users(self):
|
127
|
+
"""
|
128
|
+
Lists all users in the Slack workspace.
|
129
|
+
|
130
|
+
:return: list: List of users with their IDs and names.
|
131
|
+
"""
|
132
|
+
|
133
|
+
|
134
|
+
try:
|
135
|
+
client = self._get_client()
|
136
|
+
print(client.auth_test())
|
137
|
+
response = client.users_list()
|
138
|
+
users = response["members"]
|
139
|
+
return [{"id": user["id"], "name": user["name"]} for user in users if not user["is_bot"]]
|
140
|
+
|
141
|
+
except SlackApiError as e:
|
142
|
+
logger.error(f"Failed to list users: {e.response['error']}")
|
143
|
+
return f"Received the error : {e.response['error']}"
|
144
|
+
|
145
|
+
def extract_slack_messages(self, data):
|
146
|
+
extracted_info = []
|
147
|
+
|
148
|
+
for item in data:
|
149
|
+
# Extract 'user' and 'text'
|
150
|
+
user = item.get("user", "Undefined User")
|
151
|
+
message = item.get("text", "No message")
|
152
|
+
|
153
|
+
# Extract 'app name'
|
154
|
+
app_name = item.get("bot_profile", {}).get("name", "No App Name")
|
155
|
+
|
156
|
+
# Append to result
|
157
|
+
extracted_info.append({"user": user, "message": message, "app_name": app_name})
|
158
|
+
|
159
|
+
return extracted_info
|
160
|
+
|
161
|
+
|
162
|
+
def get_available_tools(self):
|
163
|
+
return [
|
164
|
+
{
|
165
|
+
"name": "send_message",
|
166
|
+
"description": self.send_message.__doc__ or "Send a message to a Slack channel, user, or conversation.",
|
167
|
+
"args_schema": SendMessageModel,
|
168
|
+
"ref": self.send_message
|
169
|
+
|
170
|
+
},
|
171
|
+
{
|
172
|
+
"name": "read_messages",
|
173
|
+
"description": self.read_messages.__doc__ or "Send a message to a Slack channel, user, or conversation.",
|
174
|
+
"args_schema": ReadMessagesModel,
|
175
|
+
"ref": self.read_messages
|
176
|
+
},
|
177
|
+
{
|
178
|
+
"name": "create_channel",
|
179
|
+
"description": self.create_slack_channel.__doc__ or "Send a message to a Slack channel, user, or conversation.",
|
180
|
+
"args_schema": CreateChannelModel,
|
181
|
+
"ref": self.create_slack_channel
|
182
|
+
},
|
183
|
+
{
|
184
|
+
"name": "list_users",
|
185
|
+
"description": self.list_users.__doc__ or "List all users in the Slack workspace.",
|
186
|
+
"args_schema": ListUsersModel,
|
187
|
+
"ref": self.list_users
|
188
|
+
}
|
189
|
+
|
190
|
+
]
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: alita_sdk
|
3
|
-
Version: 0.3.
|
3
|
+
Version: 0.3.184
|
4
4
|
Summary: SDK for building langchain agents using resources from Alita
|
5
5
|
Author-email: Artem Rozumenko <artyom.rozumenko@gmail.com>, Mikalai Biazruchka <mikalai_biazruchka@epam.com>, Roman Mitusov <roman_mitusov@epam.com>, Ivan Krakhmaliuk <lifedjik@gmail.com>, Artem Dubrovskiy <ad13box@gmail.com>
|
6
6
|
License-Expression: Apache-2.0
|
@@ -124,6 +124,7 @@ Requires-Dist: shortuuid==1.0.13; extra == "tools"
|
|
124
124
|
Requires-Dist: yarl==1.17.1; extra == "tools"
|
125
125
|
Requires-Dist: langmem==0.0.27; extra == "tools"
|
126
126
|
Requires-Dist: textract-py3==2.1.1; extra == "tools"
|
127
|
+
Requires-Dist: slack_sdk==3.35.0; extra == "tools"
|
127
128
|
Provides-Extra: community
|
128
129
|
Requires-Dist: retry-extended==0.2.3; extra == "community"
|
129
130
|
Requires-Dist: pyobjtojson==0.3; extra == "community"
|
@@ -13,15 +13,15 @@ alita_sdk/community/analysis/jira_analyse/api_wrapper.py,sha256=Ui1GBWizIFGFOi98
|
|
13
13
|
alita_sdk/runtime/__init__.py,sha256=4W0UF-nl3QF2bvET5lnah4o24CoTwSoKXhuN0YnwvEE,828
|
14
14
|
alita_sdk/runtime/clients/__init__.py,sha256=BdehU5GBztN1Qi1Wul0cqlU46FxUfMnI6Vq2Zd_oq1M,296
|
15
15
|
alita_sdk/runtime/clients/artifact.py,sha256=4N2t5x3GibyXLq3Fvrv2o_VA7Z000yNfc-UN4eGsHZg,2679
|
16
|
-
alita_sdk/runtime/clients/client.py,sha256=
|
16
|
+
alita_sdk/runtime/clients/client.py,sha256=hppbxdpliAdF-BucacLSONP1p8qZjQ-xP5rZfnRx3ug,21650
|
17
17
|
alita_sdk/runtime/clients/datasource.py,sha256=HAZovoQN9jBg0_-lIlGBQzb4FJdczPhkHehAiVG3Wx0,1020
|
18
18
|
alita_sdk/runtime/clients/prompt.py,sha256=li1RG9eBwgNK_Qf0qUaZ8QNTmsncFrAL2pv3kbxZRZg,1447
|
19
19
|
alita_sdk/runtime/langchain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
20
|
-
alita_sdk/runtime/langchain/assistant.py,sha256=
|
20
|
+
alita_sdk/runtime/langchain/assistant.py,sha256=wvRVnEXmh15QP_sIcex-6zwm4GNBP7z581GVzDfc8hw,13311
|
21
21
|
alita_sdk/runtime/langchain/chat_message_template.py,sha256=kPz8W2BG6IMyITFDA5oeb5BxVRkHEVZhuiGl4MBZKdc,2176
|
22
22
|
alita_sdk/runtime/langchain/constants.py,sha256=eHVJ_beJNTf1WJo4yq7KMK64fxsRvs3lKc34QCXSbpk,3319
|
23
23
|
alita_sdk/runtime/langchain/indexer.py,sha256=0ENHy5EOhThnAiYFc7QAsaTNp9rr8hDV_hTK8ahbatk,37592
|
24
|
-
alita_sdk/runtime/langchain/langraph_agent.py,sha256=
|
24
|
+
alita_sdk/runtime/langchain/langraph_agent.py,sha256=ssPJOf_REAx8lx2tQdnZ0ccbdiZX8WwSRcX5ASgLyxs,43327
|
25
25
|
alita_sdk/runtime/langchain/mixedAgentParser.py,sha256=M256lvtsL3YtYflBCEp-rWKrKtcY1dJIyRGVv7KW9ME,2611
|
26
26
|
alita_sdk/runtime/langchain/mixedAgentRenderes.py,sha256=asBtKqm88QhZRILditjYICwFVKF5KfO38hu2O-WrSWE,5964
|
27
27
|
alita_sdk/runtime/langchain/store_manager.py,sha256=w5-0GbPGJAw14g0CCD9BKFMznzk1I-iJ5OGj_HZJZgA,2211
|
@@ -63,7 +63,7 @@ alita_sdk/runtime/langchain/tools/bdd_parser/bdd_parser.py,sha256=DiEEOqDef2Xo3x
|
|
63
63
|
alita_sdk/runtime/langchain/tools/bdd_parser/feature_types.py,sha256=l3AdjSQnNv1CE1NuHi7wts6h6AsCiK-iPu0PnPf3jf0,399
|
64
64
|
alita_sdk/runtime/langchain/tools/bdd_parser/parser.py,sha256=1H1Nd_OH5Wx8A5YV1zUghBxo613yPptZ7fqNo8Eg48M,17289
|
65
65
|
alita_sdk/runtime/llms/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
66
|
-
alita_sdk/runtime/llms/alita.py,sha256=
|
66
|
+
alita_sdk/runtime/llms/alita.py,sha256=aKvFQgKocwgHm90hngRhkZ6aaHC0-vXKXDWKSdqM6sY,10126
|
67
67
|
alita_sdk/runtime/llms/preloaded.py,sha256=3AaUbZK3d8fvxAQMjR3ftOoYa0SnkCOL1EvdvDCXIHE,11321
|
68
68
|
alita_sdk/runtime/toolkits/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
69
69
|
alita_sdk/runtime/toolkits/application.py,sha256=akqUuaIL9u7-SsUmS-XgN4qxDEnXFhsK9do4n8inpSo,2432
|
@@ -71,7 +71,7 @@ alita_sdk/runtime/toolkits/artifact.py,sha256=7fTr9VpGd2zwCB3EwW4aqWa5jVKRTunqV3
|
|
71
71
|
alita_sdk/runtime/toolkits/datasource.py,sha256=qk78OdPoReYPCWwahfkKLbKc4pfsu-061oXRryFLP6I,2498
|
72
72
|
alita_sdk/runtime/toolkits/prompt.py,sha256=WIpTkkVYWqIqOWR_LlSWz3ug8uO9tm5jJ7aZYdiGRn0,1192
|
73
73
|
alita_sdk/runtime/toolkits/subgraph.py,sha256=ZYqI4yVLbEPAjCR8dpXbjbL2ipX598Hk3fL6AgaqFD4,1758
|
74
|
-
alita_sdk/runtime/toolkits/tools.py,sha256=
|
74
|
+
alita_sdk/runtime/toolkits/tools.py,sha256=QFCeNCUXoad9jpaibsUdbu_JqZsNJlqlJbSQTECqwZU,8002
|
75
75
|
alita_sdk/runtime/toolkits/vectorstore.py,sha256=BGppQADa1ZiLO17fC0uCACTTEvPHlodEDYEzUcBRbAA,2901
|
76
76
|
alita_sdk/runtime/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
77
77
|
alita_sdk/runtime/tools/agent.py,sha256=m98QxOHwnCRTT9j18Olbb5UPS8-ZGeQaGiUyZJSyFck,3162
|
@@ -81,10 +81,10 @@ alita_sdk/runtime/tools/datasource.py,sha256=pvbaSfI-ThQQnjHG-QhYNSTYRnZB0rYtZFp
|
|
81
81
|
alita_sdk/runtime/tools/echo.py,sha256=spw9eCweXzixJqHnZofHE1yWiSUa04L4VKycf3KCEaM,486
|
82
82
|
alita_sdk/runtime/tools/function.py,sha256=ZFpd7TGwIawze2e7BHlKwP0NHwNw42wwrmmnXyJQJhk,2600
|
83
83
|
alita_sdk/runtime/tools/indexer_tool.py,sha256=whSLPevB4WD6dhh2JDXEivDmTvbjiMV1MrPl9cz5eLA,4375
|
84
|
-
alita_sdk/runtime/tools/llm.py,sha256=
|
84
|
+
alita_sdk/runtime/tools/llm.py,sha256=qy3-TYhV-rvT4PzSNMw0vvJTMmgZI9nAmvW4NNhL5QU,14937
|
85
85
|
alita_sdk/runtime/tools/loop.py,sha256=uds0WhZvwMxDVFI6MZHrcmMle637cQfBNg682iLxoJA,8335
|
86
86
|
alita_sdk/runtime/tools/loop_output.py,sha256=U4hO9PCQgWlXwOq6jdmCGbegtAxGAPXObSxZQ3z38uk,8069
|
87
|
-
alita_sdk/runtime/tools/mcp_server_tool.py,sha256=
|
87
|
+
alita_sdk/runtime/tools/mcp_server_tool.py,sha256=eI8QUt497xblwF4Zhbvi8wCg17yh2yoWjcw_AIzHwGE,2819
|
88
88
|
alita_sdk/runtime/tools/pgvector_search.py,sha256=NN2BGAnq4SsDHIhUcFZ8d_dbEOM8QwB0UwpsWCYruXU,11692
|
89
89
|
alita_sdk/runtime/tools/prompt.py,sha256=nJafb_e5aOM1Rr3qGFCR-SKziU9uCsiP2okIMs9PppM,741
|
90
90
|
alita_sdk/runtime/tools/router.py,sha256=wCvZjVkdXK9dMMeEerrgKf5M790RudH68pDortnHSz0,1517
|
@@ -96,20 +96,20 @@ alita_sdk/runtime/utils/constants.py,sha256=Xntx1b_uxUzT4clwqHA_U6K8y5bBqf_4lSQw
|
|
96
96
|
alita_sdk/runtime/utils/evaluate.py,sha256=iM1P8gzBLHTuSCe85_Ng_h30m52hFuGuhNXJ7kB1tgI,1872
|
97
97
|
alita_sdk/runtime/utils/logging.py,sha256=svPyiW8ztDfhqHFITv5FBCj8UhLxz6hWcqGIY6wpJJE,3331
|
98
98
|
alita_sdk/runtime/utils/save_dataframe.py,sha256=i-E1wp-t4wb17Zq3nA3xYwgSILjoXNizaQAA9opWvxY,1576
|
99
|
-
alita_sdk/runtime/utils/streamlit.py,sha256=
|
99
|
+
alita_sdk/runtime/utils/streamlit.py,sha256=gRwsT4lv4kujQfNSQripMPe1ZbmjbHNLSraW3FmL-qA,85710
|
100
100
|
alita_sdk/runtime/utils/utils.py,sha256=dM8whOJAuFJFe19qJ69-FLzrUp6d2G-G6L7d4ss2XqM,346
|
101
|
-
alita_sdk/tools/__init__.py,sha256=
|
101
|
+
alita_sdk/tools/__init__.py,sha256=UztP-wrR-MuJI2V0gcJzNoMhsNJV6mre07TJNPChAtM,10032
|
102
102
|
alita_sdk/tools/elitea_base.py,sha256=NQaIxPX6DVIerHCb18jwUR6maZxxk73NZaTsFHkBQWE,21119
|
103
103
|
alita_sdk/tools/ado/__init__.py,sha256=mD6GHcYMTtffPJkJvFPe2rzvye_IRmXmWfI7xYuZhO4,912
|
104
104
|
alita_sdk/tools/ado/utils.py,sha256=PTCludvaQmPLakF2EbCGy66Mro4-rjDtavVP-xcB2Wc,1252
|
105
105
|
alita_sdk/tools/ado/repos/__init__.py,sha256=cS7yON7bwQxAu7CI7-SeSLCB4c83awjbLj3ZB1mWN2I,6317
|
106
106
|
alita_sdk/tools/ado/repos/repos_wrapper.py,sha256=_OWKAls7VFfFtEPTwqj_DxE1MSvpC0ivxdTIULEz3Tk,48206
|
107
107
|
alita_sdk/tools/ado/test_plan/__init__.py,sha256=1DMvP4GjgBhrLPSQl6KNbNkInFqVFsDEeLBX99rEhfU,4248
|
108
|
-
alita_sdk/tools/ado/test_plan/test_plan_wrapper.py,sha256=
|
108
|
+
alita_sdk/tools/ado/test_plan/test_plan_wrapper.py,sha256=lovTViAO7Q10fN7Lkbb24N-s04Buh6KEubiArSHrxkc,15276
|
109
109
|
alita_sdk/tools/ado/wiki/__init__.py,sha256=eiV2uJ7s0hnok68v5eRr48bBSArraHr0bv_3AsxnZiQ,4597
|
110
110
|
alita_sdk/tools/ado/wiki/ado_wrapper.py,sha256=l4bc2QoKSUXg9UqNcx0ylv7YL9JPPQd35Ti5MXyEgC4,12690
|
111
111
|
alita_sdk/tools/ado/work_item/__init__.py,sha256=WxlxoAZKDMVqb2t7ijrCE7nCBAx5kKuCRes9t8RJv4M,4700
|
112
|
-
alita_sdk/tools/ado/work_item/ado_wrapper.py,sha256=
|
112
|
+
alita_sdk/tools/ado/work_item/ado_wrapper.py,sha256=aLB-aSNQST0FCwP7I01OXanCpZHKVarZZB1u9j2H1LA,26253
|
113
113
|
alita_sdk/tools/advanced_jira_mining/__init__.py,sha256=pUTzECqGvYaR5qWY3JPUhrImrZgc7pCXuqSe5eWIE80,4604
|
114
114
|
alita_sdk/tools/advanced_jira_mining/data_mining_wrapper.py,sha256=nZPtuwVWp8VeHw1B8q9kdwf-6ZvHnlXTOGdcIMDkKpw,44211
|
115
115
|
alita_sdk/tools/azure_ai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -129,11 +129,11 @@ alita_sdk/tools/browser/google_search_rag.py,sha256=QVHFbVwymiJGuno_HLSJOK1c_Mpg
|
|
129
129
|
alita_sdk/tools/browser/utils.py,sha256=4k3YM_f1Kqlhjz9vt2pNsGkvCjhy-EmY3nvcwdFCsLA,2501
|
130
130
|
alita_sdk/tools/browser/wiki.py,sha256=Qh3HBFd4dkS2VavXbFJOm4b8SjVSIe5xSD7CY1vEkKE,1126
|
131
131
|
alita_sdk/tools/carrier/__init__.py,sha256=pP-nk-dpqOkrvwcRY_szgwqoowyVNl_GobD4Inp-Qus,4435
|
132
|
-
alita_sdk/tools/carrier/api_wrapper.py,sha256=
|
132
|
+
alita_sdk/tools/carrier/api_wrapper.py,sha256=Lx3UcfRDV0Bt224fUrdhBiqtDpYYT565B8e5ucdlFKo,8971
|
133
133
|
alita_sdk/tools/carrier/backend_reports_tool.py,sha256=2Z1DCt6f0XTrQcEoynxMFUnenhtYMuIt_epq4YBSLDE,12234
|
134
|
-
alita_sdk/tools/carrier/backend_tests_tool.py,sha256=
|
134
|
+
alita_sdk/tools/carrier/backend_tests_tool.py,sha256=7kXnaEaxpFAqvsJq7WDmP4xQRm64K0s92IXgSl2Mt9Y,27126
|
135
135
|
alita_sdk/tools/carrier/cancel_ui_test_tool.py,sha256=pD1sKEcZGBWJqFpgjeohMk93uuUPWruVJRPVVg90rpo,6438
|
136
|
-
alita_sdk/tools/carrier/carrier_sdk.py,sha256=
|
136
|
+
alita_sdk/tools/carrier/carrier_sdk.py,sha256=65ELjQyPNZb21sSmqIg-LdsCovpvNAguRcsj-f4xhPw,14682
|
137
137
|
alita_sdk/tools/carrier/create_ui_excel_report_tool.py,sha256=8aSpkyIGXsOBTo8Ye_6p19v8OOl1y7QW47IJxZ6QDgM,20163
|
138
138
|
alita_sdk/tools/carrier/create_ui_test_tool.py,sha256=knKvPOo9usI2XHqZtcbBEBzKwB9tS7GEl9KIX78vJiA,8184
|
139
139
|
alita_sdk/tools/carrier/excel_reporter.py,sha256=fXptz7iaBDBcFSc8Ah8nZ9CSgugTONc5JMC1XcQEnfM,21487
|
@@ -270,6 +270,8 @@ alita_sdk/tools/sharepoint/__init__.py,sha256=HqKQDFboab1AYh20uJvHxs9HFLJSqVfVTj
|
|
270
270
|
alita_sdk/tools/sharepoint/api_wrapper.py,sha256=qCHCIH4FRDtgdpIK22ewFhZJeOaTv9hT9BVivslxxlE,7119
|
271
271
|
alita_sdk/tools/sharepoint/authorization_helper.py,sha256=n-nL5dlBoLMK70nHu7P2RYCb8C6c9HMA_gEaw8LxuhE,2007
|
272
272
|
alita_sdk/tools/sharepoint/utils.py,sha256=fZ1YzAu5CTjKSZeslowpOPH974902S8vCp1Wu7L44LM,446
|
273
|
+
alita_sdk/tools/slack/__init__.py,sha256=_s4Ogro3O92AxHdUgWCp0SlrnBChRhCimZLbcDvNzeA,2550
|
274
|
+
alita_sdk/tools/slack/api_wrapper.py,sha256=yZWrJtXBowhq1fmF7YrrBVyChdnxkYF1XfwHxe8-_D8,7555
|
273
275
|
alita_sdk/tools/sql/__init__.py,sha256=9Lh8YHKO8zD5eeolpR4O9swTUsjpXj9LVDn8fM-T5IM,3506
|
274
276
|
alita_sdk/tools/sql/api_wrapper.py,sha256=Rky0_CX9HWDQ2mClHGAgP3LHjYVX4iymPuilZMtaDlQ,3687
|
275
277
|
alita_sdk/tools/sql/models.py,sha256=AKJgSl_kEEz4fZfw3kbvdGHXaRZ-yiaqfJOB6YOj3i0,641
|
@@ -295,8 +297,8 @@ alita_sdk/tools/zephyr_scale/api_wrapper.py,sha256=UHVQUVqcBc3SZvDfO78HSuBzwAsRw
|
|
295
297
|
alita_sdk/tools/zephyr_squad/__init__.py,sha256=rq4jOb3lRW2GXvAguk4H1KinO5f-zpygzhBJf-E1Ucw,2773
|
296
298
|
alita_sdk/tools/zephyr_squad/api_wrapper.py,sha256=iOMxyE7vOc_LwFB_nBMiSFXkNtvbptA4i-BrTlo7M0A,5854
|
297
299
|
alita_sdk/tools/zephyr_squad/zephyr_squad_cloud_client.py,sha256=IYUJoMFOMA70knLhLtAnuGoy3OK80RuqeQZ710oyIxE,3631
|
298
|
-
alita_sdk-0.3.
|
299
|
-
alita_sdk-0.3.
|
300
|
-
alita_sdk-0.3.
|
301
|
-
alita_sdk-0.3.
|
302
|
-
alita_sdk-0.3.
|
300
|
+
alita_sdk-0.3.184.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
301
|
+
alita_sdk-0.3.184.dist-info/METADATA,sha256=EcTPWHalyM0ZosAb6ZgojuYjTM203YoDzHX8eV8BxPs,18804
|
302
|
+
alita_sdk-0.3.184.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
303
|
+
alita_sdk-0.3.184.dist-info/top_level.txt,sha256=0vJYy5p_jK6AwVb1aqXr7Kgqgk3WDtQ6t5C-XI9zkmg,10
|
304
|
+
alita_sdk-0.3.184.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|