alita-sdk 0.3.215__py3-none-any.whl → 0.3.216__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.
@@ -0,0 +1,219 @@
1
+ import requests
2
+
3
+ class ZephyrEssentialAPI:
4
+ def __init__(self, base_url: str, token: str):
5
+ self.base_url = base_url.rstrip("/")
6
+ self.token = token
7
+
8
+ def _do_request(self, method: str, api_path: str, json: dict = None, params: dict = None, headers: dict = None, files=None):
9
+ url = f"{self.base_url}{api_path}"
10
+ headers = headers or {}
11
+ headers.update({
12
+ "Authorization": f"Bearer {self.token}",
13
+ **({"Content-Type": "application/json"} if json else {})
14
+ })
15
+ try:
16
+ resp = requests.request(method=method, url=url, headers=headers, json=json, params=params, files=files)
17
+ resp.raise_for_status()
18
+ if resp.headers.get("Content-Type", "").startswith("application/json"):
19
+ return resp.json()
20
+ return resp.text
21
+ except requests.RequestException as e:
22
+ raise Exception(f"Error performing request {method} {api_path}: {str(e)}")
23
+
24
+ # Test Cases
25
+ def list_test_cases(self, project_key=None, folder_id=None, max_results=10, start_at=0):
26
+ params = {
27
+ "projectKey": project_key,
28
+ "folderId": folder_id,
29
+ "maxResults": max_results,
30
+ "startAt": start_at,
31
+ }
32
+ return self._do_request("GET", "/testcases", params=params)
33
+
34
+ def create_test_case(self, test_case_data):
35
+ return self._do_request("POST", "/testcases", json=test_case_data)
36
+
37
+ def get_test_case(self, test_case_key):
38
+ return self._do_request("GET", f"/testcases/{test_case_key}")
39
+
40
+ def update_test_case(self, test_case_key, test_case_data):
41
+ return self._do_request("PUT", f"/testcases/{test_case_key}", json=test_case_data)
42
+
43
+ def get_test_case_links(self, test_case_key):
44
+ return self._do_request("GET", f"/testcases/{test_case_key}/links")
45
+
46
+ def create_test_case_issue_link(self, test_case_key, issue_link_data):
47
+ return self._do_request("POST", f"/testcases/{test_case_key}/links/issues", json=issue_link_data)
48
+
49
+ def create_test_case_web_link(self, test_case_key, web_link_data):
50
+ return self._do_request("POST", f"/testcases/{test_case_key}/links/weblinks", json=web_link_data)
51
+
52
+ def list_test_case_versions(self, test_case_key, max_results=10, start_at=0):
53
+ params = {
54
+ "maxResults": max_results,
55
+ "startAt": start_at,
56
+ }
57
+ return self._do_request("GET", f"/testcases/{test_case_key}/versions", params=params)
58
+
59
+ def get_test_case_version(self, test_case_key, version):
60
+ return self._do_request("GET", f"/testcases/{test_case_key}/versions/{version}")
61
+
62
+ def get_test_case_test_script(self, test_case_key):
63
+ return self._do_request("GET", f"/testcases/{test_case_key}/testscript")
64
+
65
+ def create_test_case_test_script(self, test_case_key, test_script_data):
66
+ return self._do_request("POST", f"/testcases/{test_case_key}/testscript", json=test_script_data)
67
+
68
+ def get_test_case_test_steps(self, test_case_key, max_results=10, start_at=0):
69
+ params = {
70
+ "maxResults": max_results,
71
+ "startAt": start_at,
72
+ }
73
+ return self._do_request("GET", f"/testcases/{test_case_key}/teststeps", params=params)
74
+
75
+ def create_test_case_test_steps(self, test_case_key, test_steps_data):
76
+ return self._do_request("POST", f"/testcases/{test_case_key}/teststeps", json=test_steps_data)
77
+
78
+ # Test Cycles
79
+ def list_test_cycles(self, project_key=None, folder_id=None, jira_project_version_id=None, max_results=10, start_at=0):
80
+ params = {
81
+ "projectKey": project_key,
82
+ "folderId": folder_id,
83
+ "jiraProjectVersionId": jira_project_version_id,
84
+ "maxResults": max_results,
85
+ "startAt": start_at,
86
+ }
87
+ return self._do_request("GET", "/testcycles", params=params)
88
+
89
+ def create_test_cycle(self, test_cycle_data):
90
+ return self._do_request("POST", "/testcycles", json=test_cycle_data)
91
+
92
+ def get_test_cycle(self, test_cycle_id_or_key):
93
+ return self._do_request("GET", f"/testcycles/{test_cycle_id_or_key}")
94
+
95
+ def update_test_cycle(self, test_cycle_id_or_key, test_cycle_data):
96
+ return self._do_request("PUT", f"/testcycles/{test_cycle_id_or_key}", json=test_cycle_data)
97
+
98
+ def get_test_cycle_links(self, test_cycle_id_or_key):
99
+ return self._do_request("GET", f"/testcycles/{test_cycle_id_or_key}/links")
100
+
101
+ def create_test_cycle_issue_link(self, test_cycle_id_or_key, issue_link_data):
102
+ return self._do_request("POST", f"/testcycles/{test_cycle_id_or_key}/links/issues", json=issue_link_data)
103
+
104
+ def create_test_cycle_web_link(self, test_cycle_id_or_key, web_link_data):
105
+ return self._do_request("POST", f"/testcycles/{test_cycle_id_or_key}/links/weblinks", json=web_link_data)
106
+
107
+ # Test Executions
108
+ def list_test_executions(self, project_key=None, test_cycle=None, test_case=None, max_results=10, start_at=0):
109
+ params = {
110
+ "projectKey": project_key,
111
+ "testCycle": test_cycle,
112
+ "testCase": test_case,
113
+ "maxResults": max_results,
114
+ "startAt": start_at,
115
+ }
116
+ return self._do_request("GET", "/testexecutions", params=params)
117
+
118
+ def create_test_execution(self, test_execution_data):
119
+ return self._do_request("POST", "/testexecutions", json=test_execution_data)
120
+
121
+ def get_test_execution(self, test_execution_id_or_key):
122
+ return self._do_request("GET", f"/testexecutions/{test_execution_id_or_key}")
123
+
124
+ def update_test_execution(self, test_execution_id_or_key, test_execution_data):
125
+ return self._do_request("PUT", f"/testexecutions/{test_execution_id_or_key}", json=test_execution_data)
126
+
127
+ def get_test_execution_test_steps(self, test_execution_id_or_key, max_results=10, start_at=0):
128
+ params = {
129
+ "maxResults": max_results,
130
+ "startAt": start_at,
131
+ }
132
+ return self._do_request("GET", f"/testexecutions/{test_execution_id_or_key}/teststeps", params=params)
133
+
134
+ def update_test_execution_test_steps(self, test_execution_id_or_key, test_steps_data):
135
+ return self._do_request("PUT", f"/testexecutions/{test_execution_id_or_key}/teststeps", json=test_steps_data)
136
+
137
+ def sync_test_execution_script(self, test_execution_id_or_key):
138
+ return self._do_request("POST", f"/testexecutions/{test_execution_id_or_key}/teststeps/sync")
139
+
140
+ def list_test_execution_links(self, test_execution_id_or_key):
141
+ return self._do_request("GET", f"/testexecutions/{test_execution_id_or_key}/links")
142
+
143
+ def create_test_execution_issue_link(self, test_execution_id_or_key, issue_link_data):
144
+ return self._do_request("POST", f"/testexecutions/{test_execution_id_or_key}/links/issues", json=issue_link_data)
145
+
146
+ # Projects
147
+ def list_projects(self, max_results=10, start_at=0):
148
+ params = {
149
+ "maxResults": max_results,
150
+ "startAt": start_at,
151
+ }
152
+ return self._do_request("GET", "/projects", params=params)
153
+
154
+ def get_project(self, project_id_or_key):
155
+ return self._do_request("GET", f"/projects/{project_id_or_key}")
156
+
157
+ # Folders
158
+ def list_folders(self, project_key=None, folder_type=None, max_results=10, start_at=0):
159
+ params = {
160
+ "projectKey": project_key,
161
+ "folderType": folder_type,
162
+ "maxResults": max_results,
163
+ "startAt": start_at,
164
+ }
165
+ return self._do_request("GET", "/folders", params=params)
166
+
167
+ def create_folder(self, folder_data):
168
+ return self._do_request("POST", "/folders", json=folder_data)
169
+
170
+ def get_folder(self, folder_id):
171
+ return self._do_request("GET", f"/folders/{folder_id}")
172
+
173
+ # Links
174
+ def delete_link(self, link_id):
175
+ return self._do_request("DELETE", f"/links/{link_id}")
176
+
177
+ # Issue Links
178
+ def get_issue_link_test_cases(self, issue_key):
179
+ return self._do_request("GET", f"/issuelinks/{issue_key}/testcases")
180
+
181
+ def get_issue_link_test_cycles(self, issue_key):
182
+ return self._do_request("GET", f"/issuelinks/{issue_key}/testcycles")
183
+
184
+ def get_issue_link_test_plans(self, issue_key):
185
+ return self._do_request("GET", f"/issuelinks/{issue_key}/testplans")
186
+
187
+ def get_issue_link_test_executions(self, issue_key):
188
+ return self._do_request("GET", f"/issuelinks/{issue_key}/executions")
189
+
190
+ # Automations
191
+ def create_custom_executions(self, project_key, files, auto_create_test_cases=False):
192
+ params = {
193
+ "projectKey": project_key,
194
+ "autoCreateTestCases": auto_create_test_cases,
195
+ }
196
+ return self._do_request("POST", "/automations/executions/custom", params=params, files=files)
197
+
198
+ def create_cucumber_executions(self, project_key, files, auto_create_test_cases=False):
199
+ params = {
200
+ "projectKey": project_key,
201
+ "autoCreateTestCases": auto_create_test_cases,
202
+ }
203
+ return self._do_request("POST", "/automations/executions/cucumber", params=params, files=files)
204
+
205
+ def create_junit_executions(self, project_key, files, auto_create_test_cases=False):
206
+ params = {
207
+ "projectKey": project_key,
208
+ "autoCreateTestCases": auto_create_test_cases,
209
+ }
210
+ return self._do_request("POST", "/automations/executions/junit", params=params, files=files)
211
+
212
+ def retrieve_bdd_test_cases(self, project_key):
213
+ headers = {"Accept": "application/zip"}
214
+ params = {"projectKey": project_key}
215
+ return self._do_request("GET", "/automations/testcases", params=params, headers=headers)
216
+
217
+ # Healthcheck
218
+ def healthcheck(self):
219
+ return self._do_request("GET", "/healthcheck")
@@ -248,35 +248,6 @@ ZephyrUpdateTestSteps = create_model(
248
248
  steps_updates=(str, Field(description="JSON string representing the test steps to update. Format: [{\"index\": 0, \"description\": \"Updated step description\", \"testData\": \"Updated test data\", \"expectedResult\": \"Updated expected result\"}]"))
249
249
  )
250
250
 
251
- # Schema for indexing Zephyr scale data into vector store
252
- indexData = create_model(
253
- "indexData",
254
- __base__=BaseIndexParams,
255
- project_key=(str, Field(description="Jira project key filter")),
256
- jql=(str, Field(description="""JQL-like query for searching test cases.
257
-
258
- Supported fields:
259
- - folder: exact folder name (e.g., folder = "Login Tests")
260
- - folderPath: full folder path (e.g., folderPath = "Root/Subfolder")
261
- - label: one or more labels (e.g., label in ("Smoke", "Critical"))
262
- - text: full-text search in name/description (e.g., text ~ "login")
263
- - customFields: JSON string with key-value pairs to filter by custom fields
264
- - steps: search within test steps (e.g., steps ~ "click submit")
265
- - orderBy: sort field (e.g., orderBy = "name")
266
- - orderDirection: ASC or DESC (e.g., orderDirection = "DESC")
267
- - limit: maximum number of results (e.g., limit = 100)
268
- - includeSubfolders: whether to include subfolders (e.g., includeSubfolders = false)
269
- - exactFolderMatch: match folder name exactly (e.g., exactFolderMatch = true)
270
-
271
- Example:
272
- 'folder = "Authentication" AND label in ("Smoke", "Critical") AND text ~ "login" AND orderBy = "name" AND orderDirection = "ASC"'
273
- """)),
274
- progress_step=(Optional[int], Field(default=None, ge=0, le=100,
275
- description="Optional step size for progress reporting during indexing")),
276
- clean_index=(Optional[bool], Field(default=False,
277
- description="Optional flag to enforce clean existing index before indexing new data")),
278
- )
279
-
280
251
 
281
252
  class ZephyrScaleApiWrapper(BaseVectorStoreToolApiWrapper):
282
253
  # url for a Zephyr server
@@ -295,14 +266,6 @@ class ZephyrScaleApiWrapper(BaseVectorStoreToolApiWrapper):
295
266
  _is_cloud: bool = False
296
267
  _api: Any = PrivateAttr()
297
268
 
298
- llm: Any = None
299
-
300
- connection_string: Optional[SecretStr] = None
301
- collection_name: Optional[str] = None
302
- embedding_model: Optional[str] = "HuggingFaceEmbeddings"
303
- embedding_model_params: Optional[Dict[str, Any]] = {"model_name": "sentence-transformers/all-MiniLM-L6-v2"}
304
- vectorstore_type: Optional[str] = "PGVector"
305
-
306
269
  class Config:
307
270
  arbitrary_types_allowed = True
308
271
 
@@ -1225,26 +1188,36 @@ class ZephyrScaleApiWrapper(BaseVectorStoreToolApiWrapper):
1225
1188
 
1226
1189
  return result
1227
1190
 
1228
- def index_data(self, project_key: str,
1229
- jql: str,
1230
- collection_suffix: str = '',
1231
- progress_step: int = None,
1232
- clean_index: bool = False) -> str:
1191
+ def _index_tool_params(self, **kwargs) -> dict[str, tuple[type, Field]]:
1233
1192
  """
1234
- Search test cases using a JQL-like query with explicit project_key.
1235
-
1236
- Example:
1237
- jql = 'folder = "Authentication" AND label in ("Smoke", "Critical") AND text ~ "login"'
1193
+ Returns a list of fields for index_data args schema.
1238
1194
  """
1239
- docs = self._base_loader(project_key, jql)
1240
- embedding = get_embeddings(self.embedding_model, self.embedding_model_params)
1241
- vs = self._init_vector_store(collection_suffix, embeddings=embedding)
1242
- return vs.index_documents(docs, progress_step=progress_step, clean_index=clean_index)
1195
+ return {
1196
+ "project_key": (str, Field(description="Jira project key filter")),
1197
+ "jql":(str, Field(description="""JQL-like query for searching test cases.
1198
+ Supported fields:
1199
+ - folder: exact folder name (e.g., folder = "Login Tests")
1200
+ - folderPath: full folder path (e.g., folderPath = "Root/Subfolder")
1201
+ - label: one or more labels (e.g., label in ("Smoke", "Critical"))
1202
+ - text: full-text search in name/description (e.g., text ~ "login")
1203
+ - customFields: JSON string with key-value pairs to filter by custom fields
1204
+ - steps: search within test steps (e.g., steps ~ "click submit")
1205
+ - orderBy: sort field (e.g., orderBy = "name")
1206
+ - orderDirection: ASC or DESC (e.g., orderDirection = "DESC")
1207
+ - limit: maximum number of results (e.g., limit = 100)
1208
+ - includeSubfolders: whether to include subfolders (e.g., includeSubfolders = false)
1209
+ - exactFolderMatch: match folder name exactly (e.g., exactFolderMatch = true)
1210
+
1211
+ Example:
1212
+ 'folder = "Authentication" AND label in ("Smoke", "Critical") AND text ~ "login" AND orderBy = "name" AND orderDirection = "ASC"'
1213
+ """))
1214
+ }
1243
1215
 
1244
- def _base_loader(self, project_key: str, jql: str):
1245
- test_cases_docs = self._get_test_cases_docs(project_key, jql)
1246
- folders_docs = self._get_folders_docs(project_key)
1247
- return test_cases_docs + folders_docs
1216
+ def _base_loader(self, project_key: str, jql: str) -> Generator[Document, None, None]:
1217
+ for test_case_doc in self._get_test_cases_docs(project_key, jql):
1218
+ yield test_case_doc
1219
+ for folder_doc in self._get_folders_docs(project_key):
1220
+ yield folder_doc
1248
1221
 
1249
1222
  def _get_all_folders(self, project_key: str, folder_type:str, step: int = 10):
1250
1223
  max_iterations = 50
@@ -1262,7 +1235,7 @@ class ZephyrScaleApiWrapper(BaseVectorStoreToolApiWrapper):
1262
1235
  break
1263
1236
  return all_folders
1264
1237
 
1265
- def _get_folders_docs(self, project_key: str):
1238
+ def _get_folders_docs(self, project_key: str) -> Generator[Document, None, None]:
1266
1239
  folder_types = ['TEST_CASE', 'TEST_PLAN', 'TEST_CYCLE']
1267
1240
  folders = []
1268
1241
  for folder_type in folder_types:
@@ -1271,7 +1244,6 @@ class ZephyrScaleApiWrapper(BaseVectorStoreToolApiWrapper):
1271
1244
  except Exception as e:
1272
1245
  raise ToolException(f"Unable to extract folders for folder type '{folder_type}': {e}")
1273
1246
  page_content = {}
1274
- docs: List[Document] = []
1275
1247
  for folder in folders:
1276
1248
  page_content['name'] = folder['name']
1277
1249
  metadata = {}
@@ -1279,16 +1251,14 @@ class ZephyrScaleApiWrapper(BaseVectorStoreToolApiWrapper):
1279
1251
  if value is not None:
1280
1252
  metadata[key] = value
1281
1253
  page_content['type'] = "FOLDER"
1282
- docs.append(Document(page_content=json.dumps(page_content), metadata=metadata))
1283
- return docs
1254
+ yield Document(page_content=json.dumps(page_content), metadata=metadata)
1284
1255
 
1285
- def _get_test_cases_docs(self, project_key: str, jql: str):
1256
+ def _get_test_cases_docs(self, project_key: str, jql: str) -> Generator[Document, None, None]:
1286
1257
  try:
1287
1258
  test_cases = self._search_test_cases_by_jql(project_key, jql)
1288
1259
  except Exception as e:
1289
1260
  raise ToolException(f"Unable to extract test cases: {e}")
1290
1261
 
1291
- docs: List[Document] = []
1292
1262
  for case in test_cases:
1293
1263
  last_version = self._get_last_version(case['key'], step=100)
1294
1264
  metadata = {
@@ -1302,8 +1272,7 @@ class ZephyrScaleApiWrapper(BaseVectorStoreToolApiWrapper):
1302
1272
 
1303
1273
  case['type'] = "TEST_CASE"
1304
1274
 
1305
- docs.append(Document(page_content=json.dumps(case), metadata=metadata))
1306
- return docs
1275
+ yield Document(page_content=json.dumps(case), metadata=metadata)
1307
1276
 
1308
1277
  def _process_document(self, document: Document) -> Generator[Document, None, None]:
1309
1278
  try:
@@ -1706,11 +1675,5 @@ class ZephyrScaleApiWrapper(BaseVectorStoreToolApiWrapper):
1706
1675
  "description": self.get_tests_by_folder_path.__doc__,
1707
1676
  "args_schema": ZephyrGetTestsByFolderPath,
1708
1677
  "ref": self.get_tests_by_folder_path,
1709
- },
1710
- {
1711
- "name": "index_data",
1712
- "ref": self.index_data,
1713
- "description": self.index_data.__doc__,
1714
- "args_schema": indexData,
1715
1678
  }
1716
1679
  ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: alita_sdk
3
- Version: 0.3.215
3
+ Version: 0.3.216
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
@@ -93,8 +93,8 @@ alita_sdk/runtime/utils/streamlit.py,sha256=ZgHpibL2ARHt6qrWj5JhK6HNZv2UjxQ04qTk
93
93
  alita_sdk/runtime/utils/toolkit_runtime.py,sha256=MU63Fpxj0b5_r1IUUc0Q3-PN9VwL7rUxp2MRR4tmYR8,5136
94
94
  alita_sdk/runtime/utils/toolkit_utils.py,sha256=I9QFqnaqfVgN26LUr6s3XlBlG6y0CoHURnCzG7XcwVs,5311
95
95
  alita_sdk/runtime/utils/utils.py,sha256=CpEl3LCeLbhzQySz08lkKPm7Auac6IiLF7WB8wmArMI,589
96
- alita_sdk/tools/__init__.py,sha256=kTw83lzfWf4HWlvGzfwwHhQlRhpPAbfCAhKkMWCzLFo,10324
97
- alita_sdk/tools/elitea_base.py,sha256=K5ejMrOZQ566y_D9nH0f2RRbXHctZaV8vOSc78d7jTs,29359
96
+ alita_sdk/tools/__init__.py,sha256=1AHqP2xyLjn92xVm70l9XIke6FkfHkLo5OoQVe4BuP8,10421
97
+ alita_sdk/tools/elitea_base.py,sha256=4_OWvTlvJwEZaRC1rB5NpD6BcTbKSXsutGrb4BBsR1A,30245
98
98
  alita_sdk/tools/ado/__init__.py,sha256=2NMQwt2pjIukSC9nSZ7CLocdGpK7002x7ixKr_wunxk,1313
99
99
  alita_sdk/tools/ado/utils.py,sha256=PTCludvaQmPLakF2EbCGy66Mro4-rjDtavVP-xcB2Wc,1252
100
100
  alita_sdk/tools/ado/repos/__init__.py,sha256=guYY95Gtyb0S4Jj0V1qO0x2jlRoH0H1cKjHXNwmShow,6388
@@ -297,13 +297,16 @@ alita_sdk/tools/zephyr/rest_client.py,sha256=7vSD3oYIX-3KbAFed-mphSQif_VRuXrq5O0
297
297
  alita_sdk/tools/zephyr_enterprise/__init__.py,sha256=y9KDJS3E3D22xc0l08AUuhmGSjS6195XKrSlrDrJ-Zs,2807
298
298
  alita_sdk/tools/zephyr_enterprise/api_wrapper.py,sha256=Ir3zHljhbZQJRJJQOBzS_GL5xvxb3-Vq5VF8XIMkxck,9348
299
299
  alita_sdk/tools/zephyr_enterprise/zephyr_enterprise.py,sha256=hV9LIrYfJT6oYp-ZfQR0YHflqBFPsUw2Oc55HwK0H48,6809
300
+ alita_sdk/tools/zephyr_essential/__init__.py,sha256=3_v1F31YM1VovDe6rzeLtPbZ6fropmrcPXddbPMkSzc,2540
301
+ alita_sdk/tools/zephyr_essential/api_wrapper.py,sha256=ksg-2j_w74pt2pdoWuuSU-gF3E6IlNtv4wxPf8sJMWg,36812
302
+ alita_sdk/tools/zephyr_essential/client.py,sha256=bfNcUKNqj9MFWTludGbbqD4qZlxrBaC2JtWsCfZMqSY,9722
300
303
  alita_sdk/tools/zephyr_scale/__init__.py,sha256=2NTcdrfkx4GSegqyXhsPLsEpc4FlACuDy85b0fk6cAo,4572
301
- alita_sdk/tools/zephyr_scale/api_wrapper.py,sha256=kYYOJX15VLRcuEFpobpW2JHw_WND2Gb28TJocH4YXzs,79445
304
+ alita_sdk/tools/zephyr_scale/api_wrapper.py,sha256=9CzQqQKv45LqZCmwSe4zzEXvBtStIcGQ1b51EQG5rhQ,78032
302
305
  alita_sdk/tools/zephyr_squad/__init__.py,sha256=0AI_j27xVO5Gk5HQMFrqPTd4uvuVTpiZUicBrdfEpKg,2796
303
306
  alita_sdk/tools/zephyr_squad/api_wrapper.py,sha256=kmw_xol8YIYFplBLWTqP_VKPRhL_1ItDD0_vXTe_UuI,14906
304
307
  alita_sdk/tools/zephyr_squad/zephyr_squad_cloud_client.py,sha256=R371waHsms4sllHCbijKYs90C-9Yu0sSR3N4SUfQOgU,5066
305
- alita_sdk-0.3.215.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
306
- alita_sdk-0.3.215.dist-info/METADATA,sha256=ex-fUvLuk6WJYDqw9-7Iirp52FvANnetlFYCt51m7D0,18917
307
- alita_sdk-0.3.215.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
308
- alita_sdk-0.3.215.dist-info/top_level.txt,sha256=0vJYy5p_jK6AwVb1aqXr7Kgqgk3WDtQ6t5C-XI9zkmg,10
309
- alita_sdk-0.3.215.dist-info/RECORD,,
308
+ alita_sdk-0.3.216.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
309
+ alita_sdk-0.3.216.dist-info/METADATA,sha256=UtT_lnvEsUcDTZTITervx85djwHpVdoLnJmhwuQjZYw,18917
310
+ alita_sdk-0.3.216.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
311
+ alita_sdk-0.3.216.dist-info/top_level.txt,sha256=0vJYy5p_jK6AwVb1aqXr7Kgqgk3WDtQ6t5C-XI9zkmg,10
312
+ alita_sdk-0.3.216.dist-info/RECORD,,