alita-sdk 0.3.343__py3-none-any.whl → 0.3.344__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of alita-sdk might be problematic. Click here for more details.

@@ -349,7 +349,8 @@ class AlitaClient:
349
349
  return self._process_requst(resp)
350
350
 
351
351
  def list_artifacts(self, bucket_name: str):
352
- url = f'{self.artifacts_url}/{bucket_name}'
352
+ # Ensure bucket name is lowercase as required by the API
353
+ url = f'{self.artifacts_url}/{bucket_name.lower()}'
353
354
  data = requests.get(url, headers=self.headers, verify=False)
354
355
  return self._process_requst(data)
355
356
 
@@ -747,7 +747,7 @@ class LangGraphAgentRunnable(CompiledStateGraph):
747
747
  if input.get('input'):
748
748
  current_message = input.get('input')[-1]
749
749
  # TODO: add handler after we add 2+ inputs (filterByType, etc.)
750
- input['input'] = current_message # Clear input after extracting current message
750
+ input['input'] = current_message if isinstance(current_message, str) else str(current_message)
751
751
  if input.get('messages'):
752
752
  # Ensure existing messages are LangChain objects
753
753
  input['messages'] = [convert_dict_to_message(msg) for msg in input['messages']]
@@ -6,7 +6,7 @@ from langchain_core.tools import BaseTool
6
6
  from pydantic import create_model, BaseModel, ConfigDict, Field
7
7
  from pydantic.fields import FieldInfo
8
8
  from ..tools.artifact import ArtifactWrapper
9
- from alita_sdk.tools.base.tool import BaseAction
9
+ from ...tools.base.tool import BaseAction
10
10
  from ...configurations.pgvector import PgVectorConfiguration
11
11
 
12
12
 
@@ -1,7 +1,7 @@
1
1
  import json
2
2
 
3
3
  from ..utils.utils import clean_string
4
- from langchain_core.tools import BaseTool
4
+ from langchain_core.tools import BaseTool, ToolException
5
5
  from langchain_core.messages import BaseMessage, AIMessage, HumanMessage
6
6
  from typing import Any, Type, Optional
7
7
  from pydantic import create_model, field_validator, BaseModel
@@ -31,7 +31,11 @@ def formulate_query(kwargs):
31
31
  chat_history = []
32
32
  for each in kwargs.get('chat_history')[:]:
33
33
  chat_history.append(AIMessage(each))
34
- input_message = HumanMessage(content=kwargs.get('task'))
34
+ user_task = kwargs.get('task')
35
+ if not user_task:
36
+ raise ToolException("Task is required to invoke the application. "
37
+ "Check the provided input (some errors may happen on previous steps).")
38
+ input_message = HumanMessage(content=user_task)
35
39
  result = {"input": [input_message], "chat_history": chat_history}
36
40
  for key, value in kwargs.items():
37
41
  if key not in ("task", "chat_history"):
@@ -7,8 +7,8 @@ from langchain_core.documents import Document
7
7
  from langchain_core.tools import ToolException
8
8
  from pydantic import create_model, Field, model_validator
9
9
 
10
- from alita_sdk.tools.non_code_indexer_toolkit import NonCodeIndexerToolkit
11
- from alita_sdk.tools.utils.available_tools_decorator import extend_with_parent_available_tools
10
+ from ...tools.non_code_indexer_toolkit import NonCodeIndexerToolkit
11
+ from ...tools.utils.available_tools_decorator import extend_with_parent_available_tools
12
12
  from ...runtime.utils.utils import IndexerKeywords
13
13
 
14
14
 
@@ -1,5 +1,6 @@
1
1
  import json
2
2
  import logging
3
+ import re
3
4
  import xml.etree.ElementTree as ET
4
5
  from typing import Generator, Literal, Optional, List
5
6
 
@@ -384,6 +385,10 @@ class TestPlanApiWrapper(NonCodeIndexerToolkit):
384
385
  field_dicts = case.get('work_item', {}).get('work_item_fields', [])
385
386
  data = {k: v for d in field_dicts for k, v in d.items()}
386
387
  if chunking_tool:
388
+ steps = data.get('Microsoft.VSTS.TCM.Steps', '')
389
+ # Remove XML declaration if present (like <?xml version="1.0" encoding="utf-16"?>) to avoid encoding issues
390
+ steps_no_decl = re.sub(r'<\?xml[^>]*\?>', '', steps, count=1).lstrip()
391
+
387
392
  yield Document(
388
393
  page_content='',
389
394
  metadata={
@@ -394,7 +399,7 @@ class TestPlanApiWrapper(NonCodeIndexerToolkit):
394
399
  'description': data.get('System.Description', ''),
395
400
  'updated_on': data.get('System.Rev', ''),
396
401
  # content is in metadata for chunking tool post-processing
397
- IndexerKeywords.CONTENT_IN_BYTES.value: data.get('Microsoft.VSTS.TCM.Steps', '').encode("utf-8")
402
+ IndexerKeywords.CONTENT_IN_BYTES.value: steps_no_decl.encode("utf-8")
398
403
  })
399
404
  else:
400
405
  yield Document(
@@ -411,7 +416,7 @@ class TestPlanApiWrapper(NonCodeIndexerToolkit):
411
416
  def _index_tool_params(self):
412
417
  """Return the parameters for indexing data."""
413
418
  return {
414
- 'chunking_tool': (Literal['html', ''], Field(description="Name of chunking tool", default='html')),
419
+ 'chunking_tool': (Literal['xml', ''], Field(description="Name of chunking tool", default='xml')),
415
420
  "plan_id": (int, Field(description="ID of the test plan for which test cases are requested")),
416
421
  "suite_ids": (Optional[List[int]], Field(description='List of test suite IDs for which test cases are requested '
417
422
  '(can be empty for all suites indexing from the plan). '
@@ -1043,27 +1043,39 @@ class JiraApiWrapper(NonCodeIndexerToolkit):
1043
1043
 
1044
1044
  def _extract_image_data(self, field_data):
1045
1045
  """
1046
- Extracts image data from general JSON response
1046
+ Extracts image data from general JSON response.
1047
+ Handles lists, dicts with image info, and plain strings.
1047
1048
  """
1048
- if isinstance(field_data, dict) and 'filename' in field_data and 'content' in field_data:
1049
- return f"!{field_data['filename']}|alt={field_data['filename']}!"
1050
- if 'content' in field_data and isinstance(field_data['content'], list):
1051
- result = []
1052
- for content_item in field_data['content']:
1053
- if 'content' in content_item and isinstance(content_item['content'], list) and len(content_item['content']) > 0:
1054
- if content_item.get('type') == 'mediaSingle':
1055
- media = content_item['content'][0]
1056
- attrs = media.get('attrs', {})
1057
- if attrs.get('type') == 'file':
1058
- alt = attrs.get('alt', '')
1059
- image_str = f'!{alt}|alt="{alt}"!'
1060
- result.append(image_str)
1061
- elif content_item.get('type') == 'paragraph':
1062
- result.append(content_item['content'][0].get('text', ''))
1063
- else:
1064
- result.append(self._extract_image_data(content_item))
1065
- return '\n'.join(result)
1066
- return str(field_data)
1049
+ if isinstance(field_data, list):
1050
+ return ' '.join(self._extract_image_data(item) for item in field_data)
1051
+ if isinstance(field_data, dict):
1052
+ if 'filename' in field_data and 'content' in field_data:
1053
+ return f"!{field_data['filename']}|alt={field_data['filename']}!"
1054
+ if 'content' in field_data and isinstance(field_data['content'], list):
1055
+ result = []
1056
+ for content_item in field_data['content']:
1057
+ if (
1058
+ isinstance(content_item, dict)
1059
+ and 'content' in content_item
1060
+ and isinstance(content_item['content'], list)
1061
+ and content_item['content']
1062
+ ):
1063
+ if content_item.get('type') == 'mediaSingle':
1064
+ media = content_item['content'][0]
1065
+ attrs = media.get('attrs', {})
1066
+ if attrs.get('type') == 'file':
1067
+ alt = attrs.get('alt', '')
1068
+ image_str = f'!{alt}|alt="{alt}"!'
1069
+ result.append(image_str)
1070
+ elif content_item.get('type') == 'paragraph':
1071
+ result.append(content_item['content'][0].get('text', ''))
1072
+ else:
1073
+ result.append(self._extract_image_data(content_item))
1074
+ return '\n'.join(result)
1075
+ return f"Unsupported format of field content."
1076
+ if isinstance(field_data, str):
1077
+ return field_data
1078
+ return f"Unsupported field content type: {type(field_data)}. Expected a string, list, or dict."
1067
1079
 
1068
1080
  def get_field_with_image_descriptions(self, jira_issue_key: str, field_name: str, prompt: Optional[str] = None,
1069
1081
  context_radius: int = 500):
@@ -1098,12 +1110,7 @@ class JiraApiWrapper(NonCodeIndexerToolkit):
1098
1110
  return f"Unable to find field '{field_name}' or it's empty. Available fields are: {existing_fields_str}"
1099
1111
 
1100
1112
  # Handle multiple images or non-string content
1101
- if isinstance(field_content, list):
1102
- field_content = ' '.join(map(self._extract_image_data, field_content))
1103
- elif isinstance(field_content, dict):
1104
- field_content = self._extract_image_data(field_content)
1105
- elif not isinstance(field_content, str):
1106
- return f"Unsupported field content type: {type(field_content)}. Expected a string, list, or dict."
1113
+ field_content = self._extract_image_data(field_content)
1107
1114
 
1108
1115
  # Regular expression to find image references in Jira markup
1109
1116
  image_pattern = r'!([^!|]+)(?:\|[^!]*)?!'
@@ -1237,24 +1244,22 @@ class JiraApiWrapper(NonCodeIndexerToolkit):
1237
1244
 
1238
1245
  comment_author = comment.get('author', {}).get('displayName', 'Unknown')
1239
1246
  comment_created = comment.get('created', 'Unknown date')
1247
+ comment_body = self._extract_image_data(comment_body)
1240
1248
 
1241
1249
  # Process the comment body by replacing image references with descriptions
1242
- try:
1243
- processed_body = re.sub(image_pattern,
1244
- lambda match: self.process_image_match(match, comment_body, attachment_resolver, context_radius, prompt),
1245
- comment_body)
1246
-
1247
- # Add the processed comment to our results
1248
- processed_comments.append({
1249
- "author": comment_author,
1250
- "created": comment_created,
1251
- "id": comment.get('id'),
1252
- "original_content": comment_body,
1253
- "processed_content": processed_body
1254
- })
1255
- except Exception as e:
1256
- logger.error(f"Error processing image references in comment: {str(e)}")
1257
- # TODO process comment in api 3 format
1250
+ processed_body = re.sub(image_pattern,
1251
+ lambda match: self.process_image_match(match, comment_body, attachment_resolver, context_radius, prompt),
1252
+ comment_body)
1253
+
1254
+ # Add the processed comment to our results
1255
+ processed_comments.append({
1256
+ "author": comment_author,
1257
+ "created": comment_created,
1258
+ "id": comment.get('id'),
1259
+ "original_content": comment_body,
1260
+ "processed_content": processed_body
1261
+ })
1262
+
1258
1263
  return processed_comments
1259
1264
 
1260
1265
  def get_comments_with_image_descriptions(self, jira_issue_key: str, prompt: Optional[str] = None, context_radius: int = 500):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: alita_sdk
3
- Version: 0.3.343
3
+ Version: 0.3.344
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 <lifedj27@gmail.com>, Artem Dubrovskiy <ad13box@gmail.com>
6
6
  License-Expression: Apache-2.0
@@ -36,7 +36,7 @@ alita_sdk/configurations/zephyr_essential.py,sha256=tUIrh-PRNvdrLBj6rJXqlF-h6oaM
36
36
  alita_sdk/runtime/__init__.py,sha256=4W0UF-nl3QF2bvET5lnah4o24CoTwSoKXhuN0YnwvEE,828
37
37
  alita_sdk/runtime/clients/__init__.py,sha256=BdehU5GBztN1Qi1Wul0cqlU46FxUfMnI6Vq2Zd_oq1M,296
38
38
  alita_sdk/runtime/clients/artifact.py,sha256=TPvROw1qu4IyUEGuf7x40IKRpb5eFZpYGN3-8LfQE0M,3461
39
- alita_sdk/runtime/clients/client.py,sha256=q9dRNrwDQJmb3dlFa6iWp-rB-XsgNLJh7gtrFhp9V1w,43240
39
+ alita_sdk/runtime/clients/client.py,sha256=uG97uviNsbBZvg2h5UbqH2VIW2_jDHwaTa2OKkhwvBc,43313
40
40
  alita_sdk/runtime/clients/datasource.py,sha256=HAZovoQN9jBg0_-lIlGBQzb4FJdczPhkHehAiVG3Wx0,1020
41
41
  alita_sdk/runtime/clients/prompt.py,sha256=li1RG9eBwgNK_Qf0qUaZ8QNTmsncFrAL2pv3kbxZRZg,1447
42
42
  alita_sdk/runtime/langchain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -44,7 +44,7 @@ alita_sdk/runtime/langchain/assistant.py,sha256=lF46zxtEg8Tnims5gm-24jvjvUoJ28GB
44
44
  alita_sdk/runtime/langchain/chat_message_template.py,sha256=kPz8W2BG6IMyITFDA5oeb5BxVRkHEVZhuiGl4MBZKdc,2176
45
45
  alita_sdk/runtime/langchain/constants.py,sha256=eHVJ_beJNTf1WJo4yq7KMK64fxsRvs3lKc34QCXSbpk,3319
46
46
  alita_sdk/runtime/langchain/indexer.py,sha256=0ENHy5EOhThnAiYFc7QAsaTNp9rr8hDV_hTK8ahbatk,37592
47
- alita_sdk/runtime/langchain/langraph_agent.py,sha256=bXTxLHELB2heKwT2y8izBeo9QW6C0MZd7r0vfsS9TJA,46852
47
+ alita_sdk/runtime/langchain/langraph_agent.py,sha256=5I5l4zpbKeHy9JONwkkrEyFAMzpBY_BBeAOhHPwmWB8,46866
48
48
  alita_sdk/runtime/langchain/mixedAgentParser.py,sha256=M256lvtsL3YtYflBCEp-rWKrKtcY1dJIyRGVv7KW9ME,2611
49
49
  alita_sdk/runtime/langchain/mixedAgentRenderes.py,sha256=asBtKqm88QhZRILditjYICwFVKF5KfO38hu2O-WrSWE,5964
50
50
  alita_sdk/runtime/langchain/store_manager.py,sha256=i8Fl11IXJhrBXq1F1ukEVln57B1IBe-tqSUvfUmBV4A,2218
@@ -96,7 +96,7 @@ alita_sdk/runtime/llms/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3
96
96
  alita_sdk/runtime/llms/preloaded.py,sha256=3AaUbZK3d8fvxAQMjR3ftOoYa0SnkCOL1EvdvDCXIHE,11321
97
97
  alita_sdk/runtime/toolkits/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
98
98
  alita_sdk/runtime/toolkits/application.py,sha256=Mn8xwIdlbuyNzroH-WVVWJG0biOUV7u8qS15fQJ_XmI,2186
99
- alita_sdk/runtime/toolkits/artifact.py,sha256=3AjdKxrsbb0kzQ6NxJla9XqJcgyDJicMAqhQcWOjLW0,3035
99
+ alita_sdk/runtime/toolkits/artifact.py,sha256=nFDfEwDuhVLRDL-TIA-Um_-B3ifZjL6sc6q4txnMvcM,3028
100
100
  alita_sdk/runtime/toolkits/configurations.py,sha256=kIDAlnryPQfbZyFxV-9SzN2-Vefzx06TX1BBdIIpN90,141
101
101
  alita_sdk/runtime/toolkits/datasource.py,sha256=qk78OdPoReYPCWwahfkKLbKc4pfsu-061oXRryFLP6I,2498
102
102
  alita_sdk/runtime/toolkits/prompt.py,sha256=WIpTkkVYWqIqOWR_LlSWz3ug8uO9tm5jJ7aZYdiGRn0,1192
@@ -105,8 +105,8 @@ alita_sdk/runtime/toolkits/tools.py,sha256=YkDvbN1TdWNO-wHbbJbNeonGCwCPlxsuegH33
105
105
  alita_sdk/runtime/toolkits/vectorstore.py,sha256=BGppQADa1ZiLO17fC0uCACTTEvPHlodEDYEzUcBRbAA,2901
106
106
  alita_sdk/runtime/tools/__init__.py,sha256=7OA8YPKlEOfXu3-gJA08cyR-VymjSPL-OmbXI-B2xVA,355
107
107
  alita_sdk/runtime/tools/agent.py,sha256=m98QxOHwnCRTT9j18Olbb5UPS8-ZGeQaGiUyZJSyFck,3162
108
- alita_sdk/runtime/tools/application.py,sha256=C_qz3vCqIYvccfK-psIFBcG509VAs51lgjy8F9WETW8,2891
109
- alita_sdk/runtime/tools/artifact.py,sha256=yIn-kfI9OWoaxbBeqdqF0M1HPeMtNnvZ_pCPoUIwnCk,8708
108
+ alita_sdk/runtime/tools/application.py,sha256=z3vLZODs-_xEEnZFmGF0fKz1j3VtNJxqsAmg5ovExpQ,3129
109
+ alita_sdk/runtime/tools/artifact.py,sha256=2Jjrhuj7Q-Sc5AKkAG7Pk8cJnGPqnqgtOmE3eDOVX0M,8694
110
110
  alita_sdk/runtime/tools/datasource.py,sha256=pvbaSfI-ThQQnjHG-QhYNSTYRnZB0rYtZFpjCfpzxYI,2443
111
111
  alita_sdk/runtime/tools/echo.py,sha256=spw9eCweXzixJqHnZofHE1yWiSUa04L4VKycf3KCEaM,486
112
112
  alita_sdk/runtime/tools/function.py,sha256=0iZJ-UxaPbtcXAVX9G5Vsn7vmD7lrz3cBG1qylto1gs,2844
@@ -142,7 +142,7 @@ alita_sdk/tools/ado/utils.py,sha256=PTCludvaQmPLakF2EbCGy66Mro4-rjDtavVP-xcB2Wc,
142
142
  alita_sdk/tools/ado/repos/__init__.py,sha256=rR-c40Pw_WpQeOXtEuS-COvgRUs1_cTkcJfHlK09N88,5339
143
143
  alita_sdk/tools/ado/repos/repos_wrapper.py,sha256=y1wJZNhuoWaSkFsGU5Pct3LClc1xfgmgBy2u_dgBF-4,49769
144
144
  alita_sdk/tools/ado/test_plan/__init__.py,sha256=qANjEjxwEEs0aTarH9LaQ745Dv_6iRdXxMKP8RDoeGs,5344
145
- alita_sdk/tools/ado/test_plan/test_plan_wrapper.py,sha256=j4O2IKM_G11T8qR2ZtaW_d0_g7tC6DsguoURkSx5Llg,21964
145
+ alita_sdk/tools/ado/test_plan/test_plan_wrapper.py,sha256=MHM1WJUUWIgOUxGPjQUhNUxOj_Et2MAowIbhbU99h4I,22222
146
146
  alita_sdk/tools/ado/wiki/__init__.py,sha256=ela6FOuT1fqN3FvHGBflzAh16HS1SSPsJYS2SldRX7A,5272
147
147
  alita_sdk/tools/ado/wiki/ado_wrapper.py,sha256=dGzhJO2PlrIL74sMRQg9iNNnNAopngCT_rsgLxvKYUY,14958
148
148
  alita_sdk/tools/ado/work_item/__init__.py,sha256=jml_zSkdC7gdGIoX2ZqRgDb45nhT3ZWzNsZ0II0iVJI,5474
@@ -261,7 +261,7 @@ alita_sdk/tools/google/bigquery/tool.py,sha256=Esf9Hsp8I0e7-5EdkFqQ-bid0cfrg-bfS
261
261
  alita_sdk/tools/google_places/__init__.py,sha256=QtmBCI0bHDK79u4hsCSWFcUihu-h4EmPSh9Yll7zz3w,3590
262
262
  alita_sdk/tools/google_places/api_wrapper.py,sha256=7nZly6nk4f4Tm7s2MVdnnwlb-1_WHRrDhyjDiqoyPjA,4674
263
263
  alita_sdk/tools/jira/__init__.py,sha256=G-9qnOYKFWM_adG0QFexh5-2pj_WaxIxxZanB3ARFqI,6339
264
- alita_sdk/tools/jira/api_wrapper.py,sha256=39kolbDBJkRgyIc3lRyT6nWGXJ0KCYxXxmJ7Hg1HqA8,82622
264
+ alita_sdk/tools/jira/api_wrapper.py,sha256=iavUyh0_ZbuhetEqYZza6skTWQpJL2NVuw_ev0hFB1Q,82719
265
265
  alita_sdk/tools/keycloak/__init__.py,sha256=0WB9yXMUUAHQRni1ghDEmd7GYa7aJPsTVlZgMCM9cQ0,3050
266
266
  alita_sdk/tools/keycloak/api_wrapper.py,sha256=cOGr0f3S3-c6tRDBWI8wMnetjoNSxiV5rvC_0VHb8uw,3100
267
267
  alita_sdk/tools/llm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -350,8 +350,8 @@ alita_sdk/tools/zephyr_scale/api_wrapper.py,sha256=kT0TbmMvuKhDUZc0i7KO18O38JM9S
350
350
  alita_sdk/tools/zephyr_squad/__init__.py,sha256=0ne8XLJEQSLOWfzd2HdnqOYmQlUliKHbBED5kW_Vias,2895
351
351
  alita_sdk/tools/zephyr_squad/api_wrapper.py,sha256=kmw_xol8YIYFplBLWTqP_VKPRhL_1ItDD0_vXTe_UuI,14906
352
352
  alita_sdk/tools/zephyr_squad/zephyr_squad_cloud_client.py,sha256=R371waHsms4sllHCbijKYs90C-9Yu0sSR3N4SUfQOgU,5066
353
- alita_sdk-0.3.343.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
354
- alita_sdk-0.3.343.dist-info/METADATA,sha256=ylPekfUmH7d9Y9K9R3zg0xDnrj_LZGTBdlVsQH1RQlE,19015
355
- alita_sdk-0.3.343.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
356
- alita_sdk-0.3.343.dist-info/top_level.txt,sha256=0vJYy5p_jK6AwVb1aqXr7Kgqgk3WDtQ6t5C-XI9zkmg,10
357
- alita_sdk-0.3.343.dist-info/RECORD,,
353
+ alita_sdk-0.3.344.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
354
+ alita_sdk-0.3.344.dist-info/METADATA,sha256=b_iDXrCrmVAMdEpyYJkUb09r3tHnM9GQQKUAP1KWDgs,19015
355
+ alita_sdk-0.3.344.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
356
+ alita_sdk-0.3.344.dist-info/top_level.txt,sha256=0vJYy5p_jK6AwVb1aqXr7Kgqgk3WDtQ6t5C-XI9zkmg,10
357
+ alita_sdk-0.3.344.dist-info/RECORD,,