alita-sdk 0.3.256__py3-none-any.whl → 0.3.257__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.
@@ -1,6 +1,6 @@
1
1
  from typing import Optional
2
2
 
3
- from pydantic import BaseModel, ConfigDict, Field, SecretStr
3
+ from pydantic import BaseModel, ConfigDict, Field, SecretStr, model_validator
4
4
 
5
5
 
6
6
  class GithubConfiguration(BaseModel):
@@ -35,6 +35,7 @@ class GithubConfiguration(BaseModel):
35
35
  }
36
36
  }
37
37
  )
38
+
38
39
  base_url: Optional[str] = Field(description="Base API URL", default="https://api.github.com")
39
40
  app_id: Optional[str] = Field(description="Github APP ID", default=None)
40
41
  app_private_key: Optional[SecretStr] = Field(description="Github APP private key", default=None)
@@ -43,3 +44,44 @@ class GithubConfiguration(BaseModel):
43
44
 
44
45
  username: Optional[str] = Field(description="Github Username", default=None)
45
46
  password: Optional[SecretStr] = Field(description="Github Password", default=None)
47
+
48
+ @model_validator(mode='before')
49
+ @classmethod
50
+ def validate_auth_sections(cls, data):
51
+ if not isinstance(data, dict):
52
+ return data
53
+
54
+ has_token = bool(data.get('access_token') and str(data.get('access_token')).strip())
55
+ has_password = bool(
56
+ data.get('username') and str(data.get('username')).strip() and
57
+ data.get('password') and str(data.get('password')).strip()
58
+ )
59
+ has_app_key = bool(
60
+ data.get('app_id') and str(data.get('app_id')).strip() and
61
+ data.get('app_private_key') and str(data.get('app_private_key')).strip()
62
+ )
63
+
64
+ # If any method is partially configured, raise exception
65
+ if (
66
+ (data.get('username') and not data.get('password')) or
67
+ (data.get('password') and not data.get('username')) or
68
+ (data.get('app_id') and not data.get('app_private_key')) or
69
+ (data.get('app_private_key') and not data.get('app_id'))
70
+ ):
71
+ raise ValueError(
72
+ "Authentication is misconfigured: both username and password, or both app_id and app_private_key, must be provided together."
73
+ )
74
+
75
+ # If all are missing, allow anonymous
76
+ if not (has_token or has_password or has_app_key):
77
+ return data
78
+
79
+ # If any method is fully configured
80
+ if has_token or has_password or has_app_key:
81
+ return data
82
+
83
+ raise ValueError(
84
+ "Authentication is misconfigured: provide either Token (access_token), "
85
+ "Password (username + password), App private key (app_id + app_private_key), "
86
+ "or leave all blank for anonymous access."
87
+ )
@@ -364,8 +364,8 @@ class AlitaClient:
364
364
  return data.content
365
365
 
366
366
  def delete_artifact(self, bucket_name, artifact_name):
367
- url = f'{self.artifact_url}/{bucket_name}/{quote(artifact_name)}'
368
- data = requests.delete(url, headers=self.headers, verify=False)
367
+ url = f'{self.artifact_url}/{bucket_name}'
368
+ data = requests.delete(url, headers=self.headers, verify=False, params={'filename': quote(artifact_name)})
369
369
  return self._process_requst(data)
370
370
 
371
371
  def _prepare_messages(self, messages: list[BaseMessage]):
@@ -95,6 +95,7 @@ class AzureDevOpsReposToolkit(BaseToolkit):
95
95
  **kwargs,
96
96
  # TODO use ado_repos_configuration fields
97
97
  **kwargs['ado_repos_configuration'],
98
+ **kwargs['ado_repos_configuration']['ado_configuration'],
98
99
  **(kwargs.get('pgvector_configuration') or {}),
99
100
  }
100
101
  azure_devops_repos_wrapper = ReposApiWrapper(**wrapper_payload)
@@ -16,11 +16,6 @@ from pydantic.fields import Field
16
16
 
17
17
  from alita_sdk.tools.non_code_indexer_toolkit import NonCodeIndexerToolkit
18
18
 
19
- try:
20
- from alita_sdk.runtime.langchain.interfaces.llm_processor import get_embeddings
21
- except ImportError:
22
- from alita_sdk.langchain.interfaces.llm_processor import get_embeddings
23
-
24
19
  logger = logging.getLogger(__name__)
25
20
 
26
21
  create_wi_field = """JSON of the work item fields to create in Azure DevOps, i.e.
@@ -95,7 +95,6 @@ BaseIndexDataParams = create_model(
95
95
  description="Optional step size for progress reporting during indexing")),
96
96
  clean_index=(Optional[bool], Field(default=False,
97
97
  description="Optional flag to enforce clean existing index before indexing new data")),
98
- chunking_tool=(Literal[None,'markdown', 'statistical', 'proposal'], Field(description="Name of chunking tool", default=None)),
99
98
  chunking_config=(Optional[dict], Field(description="Chunking tool configuration", default_factory=dict)),
100
99
  )
101
100
 
@@ -162,7 +161,7 @@ class BaseIndexerToolkit(VectorStoreWrapperBase):
162
161
  chunking_config = kwargs.get("chunking_config")
163
162
  #
164
163
  if clean_index:
165
- self._clean_index()
164
+ self._clean_index(collection_suffix)
166
165
  #
167
166
  documents = self._base_loader(**kwargs)
168
167
  documents = self._reduce_duplicates(documents, collection_suffix)
@@ -173,7 +172,7 @@ class BaseIndexerToolkit(VectorStoreWrapperBase):
173
172
  return self._save_index(list(documents), collection_suffix=collection_suffix, progress_step=progress_step)
174
173
 
175
174
  def _apply_loaders_chunkers(self, documents: Generator[Document, None, None], chunking_tool: str=None, chunking_config=None) -> Generator[Document, None, None]:
176
- from alita_sdk.tools.chunkers import __confluence_chunkers__ as chunkers
175
+ from alita_sdk.tools.chunkers import __all__ as chunkers
177
176
 
178
177
  if chunking_config is None:
179
178
  chunking_config = {}
@@ -134,7 +134,7 @@ class ListBranchesTool(BaseTool):
134
134
  name: str = "list_branches_in_repo"
135
135
  description: str = """This tool is a wrapper for the Bitbucket API to fetch a list of all branches in the repository.
136
136
  It will return the name of each branch. No input parameters are required."""
137
- args_schema: Type[BaseModel] = None
137
+ args_schema: Type[BaseModel] = create_model("NoInput")
138
138
 
139
139
  def _run(self):
140
140
  try:
@@ -2,13 +2,15 @@ from .code.codeparser import parse_code_files_for_db
2
2
  from .sematic.statistical_chunker import statistical_chunker
3
3
  from .sematic.markdown_chunker import markdown_chunker
4
4
  from .sematic.proposal_chunker import proposal_chunker
5
+ from .sematic.json_chunker import json_chunker
5
6
  from .models import StatisticalChunkerConfig, MarkdownChunkerConfig, ProposalChunkerConfig
6
7
 
7
8
  __all__ = {
8
9
  'code_parser': parse_code_files_for_db,
9
10
  'statistical': statistical_chunker,
10
11
  'markdown': markdown_chunker,
11
- 'proposal': proposal_chunker
12
+ 'proposal': proposal_chunker,
13
+ 'json': json_chunker
12
14
  }
13
15
 
14
16
  __confluence_chunkers__ = {
@@ -0,0 +1,24 @@
1
+ import json
2
+ import logging
3
+ from typing import Generator
4
+ from langchain_text_splitters import RecursiveJsonSplitter
5
+ from langchain_core.documents import Document
6
+
7
+ def json_chunker(file_content_generator: Generator[Document, None, None], config: dict, *args, **kwargs) -> Generator[Document, None, None]:
8
+ max_tokens = config.get("max_tokens", 512)
9
+ for doc in file_content_generator:
10
+ try:
11
+ data_dict = json.loads(doc.page_content)
12
+ chunks = RecursiveJsonSplitter(max_chunk_size=max_tokens).split_json(json_data=data_dict)
13
+ if len(chunks) == 1:
14
+ yield doc
15
+ continue
16
+ chunk_id = 1
17
+ for chunk in chunks:
18
+ metadata = doc.metadata.copy()
19
+ metadata['chunk_id'] = chunk_id
20
+ chunk_id += 1
21
+ yield Document(page_content=json.dumps(chunk), metadata=metadata)
22
+ except Exception as e:
23
+ logging.error(f"Failed to chunk document: {e}")
24
+ yield doc
@@ -1237,11 +1237,11 @@ class JiraApiWrapper(BaseVectorStoreToolApiWrapper):
1237
1237
  jql = kwargs.get('jql')
1238
1238
  fields_to_extract = kwargs.get('fields_to_extract')
1239
1239
  fields_to_index = kwargs.get('fields_to_index')
1240
- include_attachments = kwargs.get('include_attachments', False)
1241
1240
  max_total_issues = kwargs.get('max_total_issues', 1000)
1242
1241
 
1243
- # set values for skipped attachment extensions
1242
+ # set values for skipped attachment extension
1244
1243
  self._skipped_attachment_extensions = kwargs.get('skip_attachment_extensions', [])
1244
+ self._include_attachments = kwargs.get('include_attachments', False)
1245
1245
  self._included_fields = fields_to_extract.copy() if fields_to_extract else []
1246
1246
 
1247
1247
  try:
@@ -1252,7 +1252,7 @@ class JiraApiWrapper(BaseVectorStoreToolApiWrapper):
1252
1252
  if fields_to_extract:
1253
1253
  fields.extend(fields_to_extract)
1254
1254
 
1255
- if include_attachments:
1255
+ if self._include_attachments:
1256
1256
  fields.append('attachment')
1257
1257
 
1258
1258
  # Use provided JQL query or default to all issues
@@ -1292,36 +1292,36 @@ class JiraApiWrapper(BaseVectorStoreToolApiWrapper):
1292
1292
 
1293
1293
  issue_key = base_document.metadata.get('issue_key')
1294
1294
  # get attachments content
1295
-
1296
- issue = self._client.issue(issue_key, fields="attachment")
1297
- attachments = issue.get('fields', {}).get('attachment', [])
1298
- for attachment in attachments:
1299
- # get extension
1300
- ext = f".{attachment['filename'].split('.')[-1].lower()}"
1301
- if ext not in self._skipped_attachment_extensions:
1302
- attachment_id = f"attach_{attachment['id']}"
1303
- base_document.metadata.setdefault(IndexerKeywords.DEPENDENT_DOCS.value, []).append(attachment_id)
1304
- try:
1305
- attachment_content = self._client.get_attachment_content(attachment['id'])
1306
- except Exception as e:
1307
- logger.error(f"Failed to download attachment {attachment['filename']} for issue {issue_key}: {str(e)}")
1308
- attachment_content = self._client.get(path=f"secure/attachment/{attachment['id']}/{attachment['filename']}", not_json_response=True)
1309
- content = load_content_from_bytes(attachment_content, ext, llm=self.llm) if ext not in '.pdf' \
1310
- else parse_file_content(file_content=attachment_content, file_name=attachment['filename'], llm=self.llm, is_capture_image=True)
1311
- if not content:
1312
- continue
1313
- yield Document(page_content=content,
1314
- metadata={
1315
- 'id': attachment_id,
1316
- 'issue_key': issue_key,
1317
- 'source': f"{self.base_url}/browse/{issue_key}",
1318
- 'filename': attachment['filename'],
1319
- 'created': attachment['created'],
1320
- 'mimeType': attachment['mimeType'],
1321
- 'author': attachment.get('author', {}).get('name'),
1322
- IndexerKeywords.PARENT.value: base_document.metadata.get('id', None),
1323
- 'type': 'attachment',
1324
- })
1295
+ if self._include_attachments:
1296
+ issue = self._client.issue(issue_key, fields="attachment")
1297
+ attachments = issue.get('fields', {}).get('attachment', [])
1298
+ for attachment in attachments:
1299
+ # get extension
1300
+ ext = f".{attachment['filename'].split('.')[-1].lower()}"
1301
+ if ext not in self._skipped_attachment_extensions:
1302
+ attachment_id = f"attach_{attachment['id']}"
1303
+ base_document.metadata.setdefault(IndexerKeywords.DEPENDENT_DOCS.value, []).append(attachment_id)
1304
+ try:
1305
+ attachment_content = self._client.get_attachment_content(attachment['id'])
1306
+ except Exception as e:
1307
+ logger.error(f"Failed to download attachment {attachment['filename']} for issue {issue_key}: {str(e)}")
1308
+ attachment_content = self._client.get(path=f"secure/attachment/{attachment['id']}/{attachment['filename']}", not_json_response=True)
1309
+ content = load_content_from_bytes(attachment_content, ext, llm=self.llm) if ext not in '.pdf' \
1310
+ else parse_file_content(file_content=attachment_content, file_name=attachment['filename'], llm=self.llm, is_capture_image=True)
1311
+ if not content:
1312
+ continue
1313
+ yield Document(page_content=content,
1314
+ metadata={
1315
+ 'id': attachment_id,
1316
+ 'issue_key': issue_key,
1317
+ 'source': f"{self.base_url}/browse/{issue_key}",
1318
+ 'filename': attachment['filename'],
1319
+ 'created': attachment['created'],
1320
+ 'mimeType': attachment['mimeType'],
1321
+ 'author': attachment.get('author', {}).get('name'),
1322
+ IndexerKeywords.PARENT.value: base_document.metadata.get('id', None),
1323
+ 'type': 'attachment',
1324
+ })
1325
1325
 
1326
1326
  def _jql_get_tickets(self, jql, fields="*all", start=0, limit=None, expand=None, validate_query=None):
1327
1327
  """
@@ -1430,9 +1430,9 @@ class JiraApiWrapper(BaseVectorStoreToolApiWrapper):
1430
1430
  Field(description="Whether to include attachment content in indexing",
1431
1431
  default=False)),
1432
1432
  'max_total_issues': (Optional[int], Field(description="Maximum number of issues to index", default=1000)),
1433
- 'skip_attachment_extensions': (Optional[str], Field(
1434
- description="Comma-separated list of file extensions to skip when processing attachments",
1435
- default=None)),
1433
+ 'skip_attachment_extensions': (Optional[List[str]], Field(
1434
+ description="List of file extensions to skip when processing attachments: i.e. ['.png', '.jpg']",
1435
+ default=[])),
1436
1436
  }
1437
1437
 
1438
1438
  # def index_data(self,
@@ -35,7 +35,7 @@ class QtestToolkit(BaseToolkit):
35
35
  name,
36
36
  qtest_configuration=(Optional[QtestConfiguration], Field(description="QTest API token", json_schema_extra={
37
37
  'configuration_types': ['qtest']})),
38
- qtest_project_id=(int, Field(description="QTest project id", json_schema_extra={'toolkit_name': True,
38
+ qtest_project_id=(int, Field(default=None, description="QTest project id", json_schema_extra={'toolkit_name': True,
39
39
  'max_toolkit_length': QtestToolkit.toolkit_max_length})),
40
40
  selected_tools=(List[Literal[tuple(selected_tools)]],
41
41
  Field(default=[], json_schema_extra={'args_schemas': selected_tools})),
@@ -0,0 +1,6 @@
1
+ def extend_with_parent_available_tools(method):
2
+ def wrapper(self, *args, **kwargs):
3
+ child_tools = method(self, *args, **kwargs)
4
+ parent_tools = super(self.__class__, self).get_available_tools()
5
+ return parent_tools + child_tools
6
+ return wrapper
@@ -1,5 +1,6 @@
1
1
  import json
2
- from typing import Optional, Generator
2
+ import logging
3
+ from typing import Optional, Generator, Literal
3
4
  from pydantic import model_validator, create_model, Field, SecretStr, PrivateAttr
4
5
 
5
6
  from .client import ZephyrEssentialAPI
@@ -7,7 +8,11 @@ from ..elitea_base import extend_with_vector_tools, BaseVectorStoreToolApiWrappe
7
8
  from langchain_core.documents import Document
8
9
  from langchain_core.tools import ToolException
9
10
 
10
- class ZephyrEssentialApiWrapper(BaseVectorStoreToolApiWrapper):
11
+ from ..non_code_indexer_toolkit import NonCodeIndexerToolkit
12
+ from ..utils.available_tools_decorator import extend_with_parent_available_tools
13
+
14
+
15
+ class ZephyrEssentialApiWrapper(NonCodeIndexerToolkit):
11
16
  token: SecretStr
12
17
  _client: ZephyrEssentialAPI = PrivateAttr()
13
18
 
@@ -22,7 +27,7 @@ class ZephyrEssentialApiWrapper(BaseVectorStoreToolApiWrapper):
22
27
  base_url=base_url,
23
28
  token=token
24
29
  )
25
- return values
30
+ return super().validate_toolkit(values)
26
31
 
27
32
  def list_test_cases(self, project_key: Optional[str] = None, folder_id: Optional[str] = None, max_results: int = None, start_at: int = None):
28
33
  """List test cases with optional filters."""
@@ -229,6 +234,12 @@ class ZephyrEssentialApiWrapper(BaseVectorStoreToolApiWrapper):
229
234
  except json.JSONDecodeError as e:
230
235
  raise ValueError(f"Invalid JSON string: {str(e)}")
231
236
 
237
+ def _index_tool_params(self):
238
+ return {
239
+ 'chunking_tool':(Literal[None, 'json'],
240
+ Field(description="Name of chunking tool", default='json'))
241
+ }
242
+
232
243
  def _base_loader(self, **kwargs) -> Generator[Document, None, None]:
233
244
  try:
234
245
  test_cases = self.list_test_cases()
@@ -236,36 +247,34 @@ class ZephyrEssentialApiWrapper(BaseVectorStoreToolApiWrapper):
236
247
  raise ToolException(f"Unable to extract test cases: {e}")
237
248
 
238
249
  for case in test_cases:
239
- case['type'] = "TEST_CASE"
240
250
  metadata = {
241
251
  k: v for k, v in case.items()
242
252
  if isinstance(v, (str, int, float, bool, list, dict))
243
253
  }
244
-
245
- yield Document(page_content=json.dumps(case), metadata=metadata)
246
-
247
- def _process_document(self, document: Document) -> Generator[Document, None, None]:
248
- try:
249
- base_data = json.loads(document.page_content)
250
-
251
- if base_data['type'] and base_data['type'] == "TEST_CASE":
252
- additional_content = self._process_test_case(base_data)
253
- base_data['test_case_content'] = additional_content
254
-
255
- document.page_content = json.dumps(base_data)
256
- except json.JSONDecodeError as e:
257
- raise ToolException(f"Failed to decode JSON from document: {e}")
258
-
259
- def _process_test_case(self, case):
260
- steps = self.get_test_case_test_steps(case['key'])
261
- script = self.get_test_case_test_script(case['key'])
254
+ metadata['type'] = "TEST_CASE"
255
+
256
+ yield Document(page_content="", metadata=metadata)
257
+
258
+ def _extend_data(self, documents: Generator[Document, None, None]) -> Generator[Document, None, None]:
259
+ for document in documents:
260
+ try:
261
+ if document.metadata['type'] and document.metadata['type'] == "TEST_CASE":
262
+ additional_content = self._process_test_case(document.metadata['key'])
263
+ document.page_content = json.dumps(additional_content)
264
+ except json.JSONDecodeError as e:
265
+ logging.error(f"Failed to decode JSON from document: {e}")
266
+ yield document
267
+
268
+ def _process_test_case(self, key):
269
+ steps = self.get_test_case_test_steps(key)
270
+ script = self.get_test_case_test_script(key)
262
271
  additional_content = {
263
272
  "steps": "" if isinstance(steps, ToolException) else steps,
264
273
  "script": "" if isinstance(script, ToolException) else script,
265
274
  }
266
275
  return additional_content
267
276
 
268
- @extend_with_vector_tools
277
+ @extend_with_parent_available_tools
269
278
  def get_available_tools(self):
270
279
  return [
271
280
  {
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: alita_sdk
3
- Version: 0.3.256
3
+ Version: 0.3.257
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
@@ -10,7 +10,7 @@ alita_sdk/configurations/confluence.py,sha256=mAW2fgSEOg-BAV768Sc6b_EuRA3H5UL9xf
10
10
  alita_sdk/configurations/delta_lake.py,sha256=ADWcjabi7Krq2yxIpoc_tmhdncdgot2GBphE7ziDeTY,1133
11
11
  alita_sdk/configurations/embedding.py,sha256=8GSC8Feh8CH7bT_6cQhNqlS6raE91S2YRAtb2N9bUA8,552
12
12
  alita_sdk/configurations/figma.py,sha256=vecZ20IyZgnFO2GdphkovYHMISRPcUYh7fxkUQsPwX8,1306
13
- alita_sdk/configurations/github.py,sha256=GSj6sA4f6SfW0ZpoHXKi5FzbPDC6wE1AlscwWqIPj14,1832
13
+ alita_sdk/configurations/github.py,sha256=NAiXotsl766IwjOOsVrs70PuoP4gvXla2Yycsv1qBpI,3569
14
14
  alita_sdk/configurations/gitlab.py,sha256=0W35igIlue6QxOnPgw65ToLf4HSdPVuRyObdwQuEld8,1053
15
15
  alita_sdk/configurations/jira.py,sha256=ASh8I2iVXzOOtwjRX7kYNllXpCXyAIxFMP_YD4Q0PTI,1379
16
16
  alita_sdk/configurations/pgvector.py,sha256=P-Q07ocIg4CXN_7hUBDM6r9gN62XS1N2jyP79tM9Tig,500
@@ -26,7 +26,7 @@ alita_sdk/configurations/zephyr_enterprise.py,sha256=5W1QEcv62Y5Rk_kApI2QmOwvWZe
26
26
  alita_sdk/runtime/__init__.py,sha256=4W0UF-nl3QF2bvET5lnah4o24CoTwSoKXhuN0YnwvEE,828
27
27
  alita_sdk/runtime/clients/__init__.py,sha256=BdehU5GBztN1Qi1Wul0cqlU46FxUfMnI6Vq2Zd_oq1M,296
28
28
  alita_sdk/runtime/clients/artifact.py,sha256=H3pJAh5G-zWVyJ6YbqHGk4jA8U6HfacQduiTivpJZ3Y,3210
29
- alita_sdk/runtime/clients/client.py,sha256=irj2uTGdIQj8Wd1ZGdi5yDCFm_n9TiRhEhODJz4yI84,43493
29
+ alita_sdk/runtime/clients/client.py,sha256=ZkXP3-e785EyYoJLNowAGV3bRqv3fs1XqD_iuqqkg9Y,43513
30
30
  alita_sdk/runtime/clients/datasource.py,sha256=HAZovoQN9jBg0_-lIlGBQzb4FJdczPhkHehAiVG3Wx0,1020
31
31
  alita_sdk/runtime/clients/prompt.py,sha256=li1RG9eBwgNK_Qf0qUaZ8QNTmsncFrAL2pv3kbxZRZg,1447
32
32
  alita_sdk/runtime/langchain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -119,19 +119,19 @@ alita_sdk/runtime/utils/toolkit_runtime.py,sha256=MU63Fpxj0b5_r1IUUc0Q3-PN9VwL7r
119
119
  alita_sdk/runtime/utils/toolkit_utils.py,sha256=I9QFqnaqfVgN26LUr6s3XlBlG6y0CoHURnCzG7XcwVs,5311
120
120
  alita_sdk/runtime/utils/utils.py,sha256=CpEl3LCeLbhzQySz08lkKPm7Auac6IiLF7WB8wmArMI,589
121
121
  alita_sdk/tools/__init__.py,sha256=ko5TToGYZFmBrho26DRAVvrkHWxQ2sfs8gVAASinYp8,10611
122
- alita_sdk/tools/base_indexer_toolkit.py,sha256=gOjE1igKyjG1LohMj0XMlj1IGaFp7eEEDqyEG6-xLmc,18405
122
+ alita_sdk/tools/base_indexer_toolkit.py,sha256=g1_Gd_fK_cG3jedD8hWL_AaLv8FJp2c-gK3kCPWhuSQ,18275
123
123
  alita_sdk/tools/elitea_base.py,sha256=PfelIUb5YFTjDN_1jNYT9tJbjfYr11PAUrPQHyW2d5I,32830
124
124
  alita_sdk/tools/non_code_indexer_toolkit.py,sha256=v9uq1POE1fQKCd152mbqDtF-HSe0qoDj83k4E5LAkMI,1080
125
125
  alita_sdk/tools/ado/__init__.py,sha256=bArTObt5cqG1SkijKevWGbsIILHBA3aCStg8Q1jd69k,1243
126
126
  alita_sdk/tools/ado/utils.py,sha256=PTCludvaQmPLakF2EbCGy66Mro4-rjDtavVP-xcB2Wc,1252
127
- alita_sdk/tools/ado/repos/__init__.py,sha256=zPLrWuAZamPrcUStOYHwWb-_Cvq6qm2JOwbn4Nnog2w,5374
127
+ alita_sdk/tools/ado/repos/__init__.py,sha256=YXSU_4vhAjwH2zRmuRAOZ8dKY3er-rl0R8o6s6JOorQ,5444
128
128
  alita_sdk/tools/ado/repos/repos_wrapper.py,sha256=nPVsS10Se52yHmZ_YXVGywCSaYLlBEYBTBlhBcDJr80,50143
129
129
  alita_sdk/tools/ado/test_plan/__init__.py,sha256=4fEw_3cm4shuZ868HhAU-uMH3xNXPyb3uRjyNWoBKls,5243
130
130
  alita_sdk/tools/ado/test_plan/test_plan_wrapper.py,sha256=jQt8kFmdAzsopjByLTMiSnWtoqz_IUOmYkhPTVGeMnU,20265
131
131
  alita_sdk/tools/ado/wiki/__init__.py,sha256=uBKo_Meu2ZxMxcxGsMmvCXyplRE2um1_PIRvdYd37rM,5171
132
132
  alita_sdk/tools/ado/wiki/ado_wrapper.py,sha256=zg6wMRar1DTp-ZRlYaQifBEnpYmTrHXskTNPdrLdy8s,14759
133
133
  alita_sdk/tools/ado/work_item/__init__.py,sha256=HNcdIMwTSNe-25_Pg-KmVVXTFci3vNa84tkTFkls36c,5373
134
- alita_sdk/tools/ado/work_item/ado_wrapper.py,sha256=gEywCL_kS0k1jWcDhsmYUybpIP08tH8go6CixLJGwT4,28409
134
+ alita_sdk/tools/ado/work_item/ado_wrapper.py,sha256=uPhDp2zC8t42FQk7xc7gNyYs2o-hfOxsrw_rw31f7Sw,28223
135
135
  alita_sdk/tools/advanced_jira_mining/__init__.py,sha256=pUTzECqGvYaR5qWY3JPUhrImrZgc7pCXuqSe5eWIE80,4604
136
136
  alita_sdk/tools/advanced_jira_mining/data_mining_wrapper.py,sha256=nZPtuwVWp8VeHw1B8q9kdwf-6ZvHnlXTOGdcIMDkKpw,44211
137
137
  alita_sdk/tools/aws/__init__.py,sha256=tB6GCOg4XGSpR6qgbgAF4MUQ5-YmQCbWurWgrVKEKQ8,181
@@ -148,7 +148,7 @@ alita_sdk/tools/bitbucket/__init__.py,sha256=_ywYlgYoE6gtJlLR94MHcS4EPWIaCFU_Mxy
148
148
  alita_sdk/tools/bitbucket/api_wrapper.py,sha256=xKa2dQ-gw2YbLJx7P1xrc3JUfgBkXkMsEG-s0mzh3KI,11023
149
149
  alita_sdk/tools/bitbucket/bitbucket_constants.py,sha256=UsbhQ1iEvrKoxceTFPWTYhaXS1zSxbmjs1TwY0-P4gw,462
150
150
  alita_sdk/tools/bitbucket/cloud_api_wrapper.py,sha256=VELi65tLXvszwCGQSqVfyVal0ylx9DgAmAGpRQL_Zkg,15522
151
- alita_sdk/tools/bitbucket/tools.py,sha256=zKBUq7t9zLa1EvhlVZzyVcZSvwvdcbtz0oslgPFZeeo,15307
151
+ alita_sdk/tools/bitbucket/tools.py,sha256=o1hwSEbSmjd5YgF-AsWls2ZyrewUuegBn9S6xTwsT74,15326
152
152
  alita_sdk/tools/browser/__init__.py,sha256=iByi9uMGjd6v44SagIPTm5fu1vWnxIkjn3xsx86uRwI,5249
153
153
  alita_sdk/tools/browser/crawler.py,sha256=jhE35dU94eQLURSM-D50tspOqEMsiGzMDbYNqNSR2mU,2279
154
154
  alita_sdk/tools/browser/duck_duck_go_search.py,sha256=iKws923v34o-ySXohJw-8xTDBWlj3fMsnzC_ZRuPugE,2002
@@ -171,7 +171,7 @@ alita_sdk/tools/carrier/tools.py,sha256=xBKXKNEdPQ_kWysoV7w6y4cDjtAMno8Qj2ubI4zr
171
171
  alita_sdk/tools/carrier/ui_reports_tool.py,sha256=Y6EstTRCa9d11ipFUFGOYlpiEhFx7aOQcgZ_M5Gd1lQ,13708
172
172
  alita_sdk/tools/carrier/update_ui_test_schedule_tool.py,sha256=jh9Q86cMCEqpsFopJPNIP0wlr7sYVa_3lhlq6lRmkGg,11850
173
173
  alita_sdk/tools/carrier/utils.py,sha256=rl7aq-F6ed_PapDM15w8EtS0BkgsjpDrNdKYuDCMOaI,4376
174
- alita_sdk/tools/chunkers/__init__.py,sha256=myaBVvPbUsz6PXtBDpA4EiPQgLvIv3q_WPh86kxlccI,774
174
+ alita_sdk/tools/chunkers/__init__.py,sha256=5Nq--vAyECTh85HhDr0qEB-2UPXHXZWefP8hzX5zVO8,847
175
175
  alita_sdk/tools/chunkers/models.py,sha256=NNkLSljZboYDj6vbqeHmcjj9JrTHbkVWmoHGsL98q3k,3032
176
176
  alita_sdk/tools/chunkers/utils.py,sha256=gOyDHhXSH6Wlmxj_OsMOa2vydZuHD6HZql4PH-SYcTw,192
177
177
  alita_sdk/tools/chunkers/code/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -194,6 +194,7 @@ alita_sdk/tools/chunkers/code/treesitter/treesitter_rs.py,sha256=LgKyNffBy30gIr8
194
194
  alita_sdk/tools/chunkers/code/treesitter/treesitter_ts.py,sha256=Qs1a_BBN296iZc5hh8UNF9sc0G0-A_XZVhP3Na1ZNDg,387
195
195
  alita_sdk/tools/chunkers/sematic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
196
196
  alita_sdk/tools/chunkers/sematic/base.py,sha256=bRHpCFbOy-KPe4HBGpegrvIhvOsd7sDRfmb06T8tSuU,349
197
+ alita_sdk/tools/chunkers/sematic/json_chunker.py,sha256=NkHzDcMKC7z-1QO85VSziS2UBo6WuexTPqD5OVRlEk0,1018
197
198
  alita_sdk/tools/chunkers/sematic/markdown_chunker.py,sha256=HmAGKuIodnMcHl-kBwAb1NY0GKKwAskRFvGaW3m4HAM,3859
198
199
  alita_sdk/tools/chunkers/sematic/proposal_chunker.py,sha256=t8JjX9TH6yHXXaemiDK1E6000tlES2Kl8XfyezmlIoo,5116
199
200
  alita_sdk/tools/chunkers/sematic/statistical_chunker.py,sha256=VDQcMC-ky72GqdWJiHMmcRmfJTTU5XglBF1IWg2Qews,13403
@@ -246,7 +247,7 @@ alita_sdk/tools/google/bigquery/tool.py,sha256=Esf9Hsp8I0e7-5EdkFqQ-bid0cfrg-bfS
246
247
  alita_sdk/tools/google_places/__init__.py,sha256=mHKc7u9P2gqGDzqqJNQC9qiZYEm5gncnM_1XjtrM17o,3152
247
248
  alita_sdk/tools/google_places/api_wrapper.py,sha256=7nZly6nk4f4Tm7s2MVdnnwlb-1_WHRrDhyjDiqoyPjA,4674
248
249
  alita_sdk/tools/jira/__init__.py,sha256=k9Alxe1tEHYYzkCZv9hd89JMzBgv7cZiVT6k_tsO7hg,6073
249
- alita_sdk/tools/jira/api_wrapper.py,sha256=i8x8CttVEW_FFEl6hBNdzCqc-aMyy1FhqkiEHGaDmpo,76178
250
+ alita_sdk/tools/jira/api_wrapper.py,sha256=MRDBL_VES6Qs1mHXetwqfk-2BibsNsXQIiaz0bAocFY,76353
250
251
  alita_sdk/tools/keycloak/__init__.py,sha256=0WB9yXMUUAHQRni1ghDEmd7GYa7aJPsTVlZgMCM9cQ0,3050
251
252
  alita_sdk/tools/keycloak/api_wrapper.py,sha256=cOGr0f3S3-c6tRDBWI8wMnetjoNSxiV5rvC_0VHb8uw,3100
252
253
  alita_sdk/tools/llm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -284,7 +285,7 @@ alita_sdk/tools/postman/api_wrapper.py,sha256=bKgnEQVGv3QhqTevzBOwiXxAd0-Y5vUI1-
284
285
  alita_sdk/tools/postman/postman_analysis.py,sha256=2d-Oi2UORosIePIUyncSONw9hY7dw8Zc7BQvCd4aqpg,45115
285
286
  alita_sdk/tools/pptx/__init__.py,sha256=vVUrWnj7KWJgEk9oxGSsCAQ2SMSXrp_SFOdUHYQKcAo,3444
286
287
  alita_sdk/tools/pptx/pptx_wrapper.py,sha256=yyCYcTlIY976kJ4VfPo4dyxj4yeii9j9TWP6W8ZIpN8,29195
287
- alita_sdk/tools/qtest/__init__.py,sha256=4vXCB9GSKNFeRTimSB7wklAnO-4reZgrw0Nw1_QuRKE,4070
288
+ alita_sdk/tools/qtest/__init__.py,sha256=3NUBDnwIZFFmdNNzCo4u7hBfhgU3AT5NkyMBtdxS9yw,4084
288
289
  alita_sdk/tools/qtest/api_wrapper.py,sha256=cWXpmjjel9CYIXXjetJkARLYZXqvHufSghctTHN0ggc,22296
289
290
  alita_sdk/tools/qtest/tool.py,sha256=kKzNPS4fUC76WQQttQ6kdVANViHEvKE8Kf174MQiNYU,562
290
291
  alita_sdk/tools/rally/__init__.py,sha256=JvLt_hW_hC1WiCcwBwi1TlOH7QudJpM2z7XXGWYVaqI,3423
@@ -312,6 +313,7 @@ alita_sdk/tools/testio/api_wrapper.py,sha256=BvmL5h634BzG6p7ajnQLmj-uoAw1gjWnd4F
312
313
  alita_sdk/tools/testrail/__init__.py,sha256=0kETjWKLU7R6mugBWsjwEUsh10pipbAeNSGJAO0FBh0,4634
313
314
  alita_sdk/tools/testrail/api_wrapper.py,sha256=5T-QyTzt-J0rI32xc_E684lCdgyWeHSyeTYiwQwtGyg,32275
314
315
  alita_sdk/tools/utils/__init__.py,sha256=155xepXPr4OEzs2Mz5YnjXcBpxSv1X2eznRUVoPtyK0,3268
316
+ alita_sdk/tools/utils/available_tools_decorator.py,sha256=IbrdfeQkswxUFgvvN7-dyLMZMyXLiwvX7kgi3phciCk,273
315
317
  alita_sdk/tools/utils/content_parser.py,sha256=zqeyuxZqZqVFq5M5sZM-falMdlOw48FyZnp3Z0XUpCw,9868
316
318
  alita_sdk/tools/vector_adapters/VectorStoreAdapter.py,sha256=a6FAsiix_EvATIKUf5YT6vHh5LDyJ5uSP3LJqoxFo04,17367
317
319
  alita_sdk/tools/vector_adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -327,15 +329,15 @@ alita_sdk/tools/zephyr_enterprise/__init__.py,sha256=1E0xuyYx7QSuqIRKclEapI7MvxX
327
329
  alita_sdk/tools/zephyr_enterprise/api_wrapper.py,sha256=p9EpkO5tif3JJzprz2_VuLsQ1yET7TwwBfPOKJGwt9c,11215
328
330
  alita_sdk/tools/zephyr_enterprise/zephyr_enterprise.py,sha256=hV9LIrYfJT6oYp-ZfQR0YHflqBFPsUw2Oc55HwK0H48,6809
329
331
  alita_sdk/tools/zephyr_essential/__init__.py,sha256=BpRicA38JI9YEDuim1acZRGcDw-ZYTdP4Ewbiju37h8,3761
330
- alita_sdk/tools/zephyr_essential/api_wrapper.py,sha256=TpNov35XPgjM9eymCEFqv22mbpdVvLMBTb9WVqUcvNA,36795
332
+ alita_sdk/tools/zephyr_essential/api_wrapper.py,sha256=4lkma77QJuUFKT3obKfgX5dnHJzgnxqs5QvIn25yIUA,37180
331
333
  alita_sdk/tools/zephyr_essential/client.py,sha256=bfNcUKNqj9MFWTludGbbqD4qZlxrBaC2JtWsCfZMqSY,9722
332
334
  alita_sdk/tools/zephyr_scale/__init__.py,sha256=imuHOqdyOqtxQObeBZfyFvKPXfKVNuYfwKn2c9jJyeo,4299
333
335
  alita_sdk/tools/zephyr_scale/api_wrapper.py,sha256=JAeWf-RXohsxheUpT0iMDClc_izj-zxMwafXCW4jtC0,78015
334
336
  alita_sdk/tools/zephyr_squad/__init__.py,sha256=0AI_j27xVO5Gk5HQMFrqPTd4uvuVTpiZUicBrdfEpKg,2796
335
337
  alita_sdk/tools/zephyr_squad/api_wrapper.py,sha256=kmw_xol8YIYFplBLWTqP_VKPRhL_1ItDD0_vXTe_UuI,14906
336
338
  alita_sdk/tools/zephyr_squad/zephyr_squad_cloud_client.py,sha256=R371waHsms4sllHCbijKYs90C-9Yu0sSR3N4SUfQOgU,5066
337
- alita_sdk-0.3.256.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
338
- alita_sdk-0.3.256.dist-info/METADATA,sha256=Pz8NwBvPngJixME90E16UprodmhH7mPX8aR1oTzAHno,18897
339
- alita_sdk-0.3.256.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
340
- alita_sdk-0.3.256.dist-info/top_level.txt,sha256=0vJYy5p_jK6AwVb1aqXr7Kgqgk3WDtQ6t5C-XI9zkmg,10
341
- alita_sdk-0.3.256.dist-info/RECORD,,
339
+ alita_sdk-0.3.257.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
340
+ alita_sdk-0.3.257.dist-info/METADATA,sha256=iIoX76NfRPL9RgNuY4xFOytkJM0EwNTgx_WSJUn00GQ,18897
341
+ alita_sdk-0.3.257.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
342
+ alita_sdk-0.3.257.dist-info/top_level.txt,sha256=0vJYy5p_jK6AwVb1aqXr7Kgqgk3WDtQ6t5C-XI9zkmg,10
343
+ alita_sdk-0.3.257.dist-info/RECORD,,