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.
@@ -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=(str, Field(default=None, description="Test id to execute")),
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": "Please confirm or override the following test parameters to proceed with the test execution.",
135
+ "message": "The test requires confirmation or customization of the following parameters before execution.",
119
136
  "default_test_parameters": default_test_parameters,
120
- "instruction": "To override parameters, provide a list of dictionaries for 'test_parameters', e.g., [{'vUsers': '5', 'duration': '120'}].",
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"] = test_data.get("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(test_id, json_body)
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.182
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=6ezOJ92CSw6b2PVs4uFMQKQdp40uT1awoFEqWAfBH_A,20029
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=QJEMiEOrFMJ4GpnK24U2pKFblrvdQpKFdfhZsI2wAUI,7507
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=ac96v-Nr7t1x1NzaOpvV1VuML3LfoNNIDTDl8pb-bSY,40505
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=oAALCyrTbQ8gygJO7xzZLjOowpUnTbh8R363argRUVs,10119
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=NjGzuP8wxk8SHIZFj6CLFufGIbHYG6dLctxJFkOLxRU,6176
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=UUd4U4CuCNImHxVJAF5daYbew-7X9H8k21bUWy2PDvg,3502
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=xcH9AiqfR2TYrwJ3Ixw-_A7XDodtJCnwmq1SsikXpYk,1930
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=z4J_bdxkA0zMROkvTB4u379YBRFCkKh-h7PD8RlnZWQ,85644
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=l3KxV-Qtu-04QQ9YYcovbLtEkZ30fGWDZ7o9nuRF16o,9967
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=oIvVhLUMP5ZGctoAtK6sU0y6Si9gNv9-mbLqcWtw3gY,12525
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=t0D9xubU0yy_JmRJ_zEtRCxwFLyanT1StbIrtHGaqpw,26108
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=R8fyGesykTDJ1D2t7z1h_W9TO9B5GaqKaWI7OU9tdRE,8877
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=xfcp0-CHLW_yi5eNeoepd9w8He_1ls_knnhuWt_Kjv4,21723
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=JDPgZ0MSUGEQf07ZBwBYpY-9RvYpXyyDj-cKZsx-3m0,14513
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.182.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
299
- alita_sdk-0.3.182.dist-info/METADATA,sha256=WqwMApLsjTHN2hiq_uUi8e6SOE7PdJZZXf50UULLvPk,18753
300
- alita_sdk-0.3.182.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
301
- alita_sdk-0.3.182.dist-info/top_level.txt,sha256=0vJYy5p_jK6AwVb1aqXr7Kgqgk3WDtQ6t5C-XI9zkmg,10
302
- alita_sdk-0.3.182.dist-info/RECORD,,
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,,