alita-sdk 0.3.423__py3-none-any.whl → 0.3.435__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.

@@ -44,6 +44,10 @@ Test Type: Category of test (e.g., 'Functional', 'Regression', 'Smoke').
44
44
  Precondition: Prerequisites for the test, formatted as: <Step1> <Step2> Leave blank if none.
45
45
  Steps: Array of test steps with Description and Expected Result.
46
46
 
47
+ **Multi-select fields**: For fields that allow multiple values (e.g., Team, Assigned To etc.), you can provide:
48
+ - Single value: "Team": "Epam"
49
+ - Multiple values: "Team": ["Epam", "EJ"]
50
+
47
51
  **For Updates**: Include only the fields you want to modify. The system will validate property values against project configuration.
48
52
 
49
53
  ### EXAMPLE
@@ -57,6 +61,7 @@ Steps: Array of test steps with Description and Expected Result.
57
61
  "Priority": "",
58
62
  "Test Type": "Functional",
59
63
  "Precondition": "<ONLY provided by user precondition>",
64
+ "Team": ["Epam", "EJ"],
60
65
  "Steps": [
61
66
  {{ "Test Step Number": 1, "Test Step Description": "Navigate to url", "Test Step Expected Result": "Page content is loaded"}},
62
67
  {{ "Test Step Number": 2, "Test Step Description": "Click 'Login'", "Test Step Expected Result": "Form is expanded"}},
@@ -86,8 +91,16 @@ QtestCreateTestCase = create_model(
86
91
 
87
92
  QtestLinkTestCaseToJiraRequirement = create_model(
88
93
  "QtestLinkTestCaseToJiraRequirement",
89
- requirement_external_id=(str, Field("Qtest requirement external id which represent jira issue id linked to Qtest as a requirement e.g. SITEPOD-4038")),
90
- json_list_of_test_case_ids=(str, Field("""List of the test case ids to be linked to particular requirement.
94
+ requirement_external_id=(str, Field(description="Qtest requirement external id which represent jira issue id linked to Qtest as a requirement e.g. SITEPOD-4038")),
95
+ json_list_of_test_case_ids=(str, Field(description="""List of the test case ids to be linked to particular requirement.
96
+ Create a list of the test case ids in the following format '["TC-123", "TC-234", "TC-456"]' which represents json array as a string.
97
+ It should be capable to be extracted directly by python json.loads method."""))
98
+ )
99
+
100
+ QtestLinkTestCaseToQtestRequirement = create_model(
101
+ "QtestLinkTestCaseToQtestRequirement",
102
+ requirement_id=(str, Field(description="QTest internal requirement ID in format RQ-123")),
103
+ json_list_of_test_case_ids=(str, Field(description="""List of the test case ids to be linked to particular requirement.
91
104
  Create a list of the test case ids in the following format '["TC-123", "TC-234", "TC-456"]' which represents json array as a string.
92
105
  It should be capable to be extracted directly by python json.loads method."""))
93
106
  )
@@ -257,19 +270,57 @@ class QtestApiWrapper(BaseToolApiWrapper):
257
270
 
258
271
  field_def = field_definitions[field_name]
259
272
  field_id = field_def['field_id']
273
+ data_type = field_def.get('data_type')
274
+ is_multiple = field_def.get('multiple', False)
260
275
 
261
- # Validate value for dropdown fields (only if field has allowed values)
276
+ # Normalize field_value to list for consistent processing
277
+ # Multi-select fields can receive: "value", ["value1", "value2"], or ["value1"]
278
+ # Single-select fields: "value" only
279
+ if is_multiple:
280
+ # Convert to list if not already
281
+ values_to_process = field_value if isinstance(field_value, list) else [field_value]
282
+ else:
283
+ # Single-select: keep as single value
284
+ values_to_process = [field_value]
285
+
286
+ # Validate value(s) for dropdown fields (only if field has allowed values)
262
287
  if field_def['values']:
263
- # Field has allowed values (dropdown/combobox) - validate strictly
264
- if field_value not in field_def['values']:
265
- available = ", ".join(sorted(field_def['values'].keys()))
266
- validation_errors.append(
267
- f"❌ Invalid value '{field_value}' for field '{field_name}'. "
268
- f"Allowed values: {available}"
269
- )
270
- continue # Skip to next field, keep collecting errors
271
- field_value_id = field_def['values'][field_value]
272
- field_value_name = field_value
288
+ # Field has allowed values (dropdown/combobox/user fields) - validate strictly
289
+ value_ids = []
290
+ value_names = []
291
+
292
+ for single_value in values_to_process:
293
+ if single_value not in field_def['values']:
294
+ available = ", ".join(sorted(field_def['values'].keys()))
295
+ validation_errors.append(
296
+ f"❌ Invalid value '{single_value}' for field '{field_name}'. "
297
+ f"Allowed values: {available}"
298
+ )
299
+ continue # Skip this value, but continue validating others
300
+
301
+ # Valid value - add to lists
302
+ value_ids.append(field_def['values'][single_value])
303
+ value_names.append(single_value)
304
+
305
+ # If all values were invalid, skip this field
306
+ if not value_ids:
307
+ continue
308
+
309
+ # Format based on field type and value count
310
+ if is_multiple and len(value_ids) == 1:
311
+ # Single value in multi-select field: bracketed string "[419950]"
312
+ # This includes single user assignment: "[626983]"
313
+ field_value_id = f"[{value_ids[0]}]"
314
+ field_value_name = f"[{value_names[0]}]" if data_type == 5 else value_names[0]
315
+ elif is_multiple:
316
+ # Multiple values in multi-select: bracketed string with comma-separated IDs
317
+ ids_str = ",".join(str(vid) for vid in value_ids)
318
+ field_value_id = f"[{ids_str}]"
319
+ field_value_name = ", ".join(value_names)
320
+ else:
321
+ # Regular single-select dropdown: plain ID
322
+ field_value_id = value_ids[0]
323
+ field_value_name = value_names[0]
273
324
  else:
274
325
  # Text field or field without restricted values - use value directly
275
326
  # No validation needed - users can write anything (by design)
@@ -400,14 +451,22 @@ class QtestApiWrapper(BaseToolApiWrapper):
400
451
  field_mapping[field_name] = {
401
452
  'field_id': field.id,
402
453
  'required': getattr(field, 'required', False),
454
+ 'data_type': getattr(field, 'data_type', None), # 5 = user field
455
+ 'multiple': getattr(field, 'multiple', False), # True = multi-select, needs array format
403
456
  'values': {}
404
457
  }
405
458
 
406
- # Map allowed values if field has them (dropdown/combobox fields)
459
+ # Map allowed values if field has them (dropdown/combobox/user fields)
460
+ # Only include active values (is_active=True)
407
461
  if hasattr(field, 'allowed_values') and field.allowed_values:
408
462
  for allowed_value in field.allowed_values:
463
+ # Skip inactive values (deleted/deprecated options)
464
+ if hasattr(allowed_value, 'is_active') and not allowed_value.is_active:
465
+ continue
466
+
409
467
  # AllowedValueResource has 'label' for the display name and 'value' for the ID
410
468
  # Note: 'value' is the field_value, not 'id'
469
+ # For user fields (data_type=5), label is user name and value is user ID
411
470
  value_label = allowed_value.label
412
471
  value_id = allowed_value.value
413
472
  field_mapping[field_name]['values'][value_label] = value_id
@@ -496,27 +555,49 @@ class QtestApiWrapper(BaseToolApiWrapper):
496
555
 
497
556
  def __parse_data(self, response_to_parse: dict, parsed_data: list, extract_images: bool=False, prompt: str=None):
498
557
  import html
558
+
559
+ # Get field definitions to ensure all fields are included (uses cached version)
560
+ field_definitions = self.__get_field_definitions_cached()
561
+
499
562
  for item in response_to_parse['items']:
563
+ # Start with core fields (always present)
500
564
  parsed_data_row = {
501
565
  'Id': item['pid'],
566
+ 'Name': item['name'],
502
567
  'Description': html.unescape(strip_tags(item['description'])),
503
568
  'Precondition': html.unescape(strip_tags(item['precondition'])),
504
- 'Name': item['name'],
505
569
  QTEST_ID: item['id'],
506
570
  'Steps': list(map(lambda step: {
507
571
  'Test Step Number': step[0] + 1,
508
572
  'Test Step Description': self._process_image(step[1]['description'], extract_images, prompt),
509
573
  'Test Step Expected Result': self._process_image(step[1]['expected'], extract_images, prompt)
510
574
  }, enumerate(item['test_steps']))),
511
- 'Status': ''.join([properties['field_value_name'] for properties in item['properties']
512
- if properties['field_name'] == 'Status']),
513
- 'Automation': ''.join([properties['field_value_name'] for properties in item['properties']
514
- if properties['field_name'] == 'Automation']),
515
- 'Type': ''.join([properties['field_value_name'] for properties in item['properties']
516
- if properties['field_name'] == 'Type']),
517
- 'Priority': ''.join([properties['field_value_name'] for properties in item['properties']
518
- if properties['field_name'] == 'Priority']),
519
575
  }
576
+
577
+ # Dynamically add all custom fields from project configuration
578
+ # This ensures consistency and includes fields even if they have null/empty values
579
+ for field_name in field_definitions.keys():
580
+ field_def = field_definitions[field_name]
581
+ is_multiple = field_def.get('multiple', False)
582
+
583
+ # Find the property value in the response (if exists)
584
+ field_value = None
585
+ for prop in item['properties']:
586
+ if prop['field_name'] == field_name:
587
+ # Use field_value_name if available (for dropdowns), otherwise field_value
588
+ field_value = prop.get('field_value_name') or prop.get('field_value') or ''
589
+ break
590
+
591
+ # Format based on field type
592
+ if is_multiple and (field_value is None or field_value == ''):
593
+ # Multi-select field with no value: show empty array with hint
594
+ parsed_data_row[field_name] = '[] (multi-select)'
595
+ elif field_value is not None:
596
+ parsed_data_row[field_name] = field_value
597
+ else:
598
+ # Regular field with no value
599
+ parsed_data_row[field_name] = ''
600
+
520
601
  parsed_data.append(parsed_data_row)
521
602
 
522
603
  def _process_image(self, content: str, extract: bool=False, prompt: str=None):
@@ -574,6 +655,38 @@ class QtestApiWrapper(BaseToolApiWrapper):
574
655
  parsed_data = self.__perform_search_by_dql(dql)
575
656
  return parsed_data[0]['QTest Id']
576
657
 
658
+ def __find_qtest_requirement_id_by_id(self, requirement_id: str) -> int:
659
+ """Search for requirement's internal QTest ID using requirement ID (RQ-xxx format).
660
+
661
+ Args:
662
+ requirement_id: Requirement ID in format RQ-123
663
+
664
+ Returns:
665
+ int: Internal QTest ID for the requirement
666
+
667
+ Raises:
668
+ ValueError: If requirement is not found
669
+ """
670
+ dql = f"Id = '{requirement_id}'"
671
+ search_instance: SearchApi = swagger_client.SearchApi(self._client)
672
+ body = swagger_client.ArtifactSearchParams(object_type='requirements', fields=['*'], query=dql)
673
+
674
+ try:
675
+ response = search_instance.search_artifact(self.qtest_project_id, body)
676
+ if response['total'] == 0:
677
+ raise ValueError(
678
+ f"Requirement '{requirement_id}' not found in project {self.qtest_project_id}. "
679
+ f"Please verify the requirement ID exists."
680
+ )
681
+ return response['items'][0]['id']
682
+ except ApiException as e:
683
+ stacktrace = format_exc()
684
+ logger.error(f"Exception when searching for requirement: \n {stacktrace}")
685
+ raise ToolException(
686
+ f"Unable to search for requirement '{requirement_id}' in project {self.qtest_project_id}. "
687
+ f"Exception: \n{stacktrace}"
688
+ ) from e
689
+
577
690
  def __is_jira_requirement_present(self, jira_issue_id: str) -> tuple[bool, dict]:
578
691
  """ Define if particular Jira requirement is present in qtest or not """
579
692
  dql = f"'External Id' = '{jira_issue_id}'"
@@ -590,31 +703,112 @@ class QtestApiWrapper(BaseToolApiWrapper):
590
703
  logger.error(f"Error: {format_exc()}")
591
704
  raise e
592
705
 
593
- def _get_jira_requirement_id(self, jira_issue_id: str) -> int | None:
594
- """ Search for requirement id using the linked jira_issue_id. """
706
+ def _get_jira_requirement_id(self, jira_issue_id: str) -> int:
707
+ """Search for requirement id using the linked jira_issue_id.
708
+
709
+ Args:
710
+ jira_issue_id: External Jira issue ID (e.g., PLAN-128)
711
+
712
+ Returns:
713
+ int: Internal QTest ID for the Jira requirement
714
+
715
+ Raises:
716
+ ValueError: If Jira requirement is not found in QTest
717
+ """
595
718
  is_present, response = self.__is_jira_requirement_present(jira_issue_id)
596
719
  if not is_present:
597
- return None
720
+ raise ValueError(
721
+ f"Jira requirement '{jira_issue_id}' not found in QTest project {self.qtest_project_id}. "
722
+ f"Please ensure the Jira issue is linked to QTest as a requirement."
723
+ )
598
724
  return response['items'][0]['id']
599
725
 
600
726
 
601
727
  def link_tests_to_jira_requirement(self, requirement_external_id: str, json_list_of_test_case_ids: str) -> str:
602
- """ Link the list of the test cases represented as string like this '["TC-123", "TC-234"]' to the Jira requirement represented as external id e.g. PLAN-128 which is the Jira Issue Id"""
728
+ """Link test cases to external Jira requirement.
729
+
730
+ Args:
731
+ requirement_external_id: Jira issue ID (e.g., PLAN-128)
732
+ json_list_of_test_case_ids: JSON array string of test case IDs (e.g., '["TC-123", "TC-234"]')
733
+
734
+ Returns:
735
+ Success message with linked test case IDs
736
+ """
603
737
  link_object_api_instance = swagger_client.ObjectLinkApi(self._client)
604
738
  source_type = "requirements"
605
739
  linked_type = "test-cases"
606
- list = [self.__find_qtest_id_by_test_id(test_case_id) for test_case_id in json.loads(json_list_of_test_case_ids)]
740
+ test_case_ids = json.loads(json_list_of_test_case_ids)
741
+ qtest_test_case_ids = [self.__find_qtest_id_by_test_id(tc_id) for tc_id in test_case_ids]
607
742
  requirement_id = self._get_jira_requirement_id(requirement_external_id)
608
743
 
609
744
  try:
610
- response = link_object_api_instance.link_artifacts(self.qtest_project_id, object_id=requirement_id,
611
- type=linked_type,
612
- object_type=source_type, body=list)
613
- return f"The test cases with the following id's - {[link.pid for link in response[0].objects]} have been linked in following project {self.qtest_project_id} under following requirement {requirement_external_id}"
614
- except Exception as e:
615
- from traceback import format_exc
616
- logger.error(f"Error: {format_exc()}")
617
- raise e
745
+ response = link_object_api_instance.link_artifacts(
746
+ self.qtest_project_id,
747
+ object_id=requirement_id,
748
+ type=linked_type,
749
+ object_type=source_type,
750
+ body=qtest_test_case_ids
751
+ )
752
+ linked_test_cases = [link.pid for link in response[0].objects]
753
+ return (
754
+ f"Successfully linked {len(linked_test_cases)} test case(s) to Jira requirement '{requirement_external_id}' "
755
+ f"in project {self.qtest_project_id}.\n"
756
+ f"Linked test cases: {', '.join(linked_test_cases)}"
757
+ )
758
+ except ApiException as e:
759
+ stacktrace = format_exc()
760
+ logger.error(f"Error linking to Jira requirement: {stacktrace}")
761
+ raise ToolException(
762
+ f"Unable to link test cases to Jira requirement '{requirement_external_id}' "
763
+ f"in project {self.qtest_project_id}. Exception: \n{stacktrace}"
764
+ ) from e
765
+
766
+ def link_tests_to_qtest_requirement(self, requirement_id: str, json_list_of_test_case_ids: str) -> str:
767
+ """Link test cases to internal QTest requirement.
768
+
769
+ Args:
770
+ requirement_id: QTest requirement ID in format RQ-123
771
+ json_list_of_test_case_ids: JSON array string of test case IDs (e.g., '["TC-123", "TC-234"]')
772
+
773
+ Returns:
774
+ Success message with linked test case IDs
775
+
776
+ Raises:
777
+ ValueError: If requirement or test cases are not found
778
+ ToolException: If linking fails
779
+ """
780
+ link_object_api_instance = swagger_client.ObjectLinkApi(self._client)
781
+ source_type = "requirements"
782
+ linked_type = "test-cases"
783
+
784
+ # Parse and convert test case IDs
785
+ test_case_ids = json.loads(json_list_of_test_case_ids)
786
+ qtest_test_case_ids = [self.__find_qtest_id_by_test_id(tc_id) for tc_id in test_case_ids]
787
+
788
+ # Get internal QTest ID for the requirement
789
+ qtest_requirement_id = self.__find_qtest_requirement_id_by_id(requirement_id)
790
+
791
+ try:
792
+ response = link_object_api_instance.link_artifacts(
793
+ self.qtest_project_id,
794
+ object_id=qtest_requirement_id,
795
+ type=linked_type,
796
+ object_type=source_type,
797
+ body=qtest_test_case_ids
798
+ )
799
+ linked_test_cases = [link.pid for link in response[0].objects]
800
+ return (
801
+ f"Successfully linked {len(linked_test_cases)} test case(s) to QTest requirement '{requirement_id}' "
802
+ f"in project {self.qtest_project_id}.\n"
803
+ f"Linked test cases: {', '.join(linked_test_cases)}"
804
+ )
805
+ except ApiException as e:
806
+ stacktrace = format_exc()
807
+ logger.error(f"Error linking to QTest requirement: {stacktrace}")
808
+ raise ToolException(
809
+ f"Unable to link test cases to QTest requirement '{requirement_id}' "
810
+ f"in project {self.qtest_project_id}. Exception: \n{stacktrace}"
811
+ ) from e
618
812
 
619
813
  def search_by_dql(self, dql: str, extract_images:bool=False, prompt: str=None):
620
814
  """Search for the test cases in qTest using Data Query Language """
@@ -736,12 +930,19 @@ class QtestApiWrapper(BaseToolApiWrapper):
736
930
  "ref": self.delete_test_case,
737
931
  },
738
932
  {
739
- "name": "link_tests_to_requirement",
740
- "mode": "link_tests_to_requirement",
741
- "description": """Link tests to Jira requirements. The input is jira issue id and th list of test ids in format '["TC-123", "TC-234", "TC-345"]'""",
933
+ "name": "link_tests_to_jira_requirement",
934
+ "mode": "link_tests_to_jira_requirement",
935
+ "description": "Link test cases to external Jira requirement. Provide Jira issue ID (e.g., PLAN-128) and list of test case IDs in format '[\"TC-123\", \"TC-234\"]'",
742
936
  "args_schema": QtestLinkTestCaseToJiraRequirement,
743
937
  "ref": self.link_tests_to_jira_requirement,
744
938
  },
939
+ {
940
+ "name": "link_tests_to_qtest_requirement",
941
+ "mode": "link_tests_to_qtest_requirement",
942
+ "description": "Link test cases to internal QTest requirement. Provide QTest requirement ID (e.g., RQ-15) and list of test case IDs in format '[\"TC-123\", \"TC-234\"]'",
943
+ "args_schema": QtestLinkTestCaseToQtestRequirement,
944
+ "ref": self.link_tests_to_qtest_requirement,
945
+ },
745
946
  {
746
947
  "name": "get_modules",
747
948
  "mode": "get_modules",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: alita_sdk
3
- Version: 0.3.423
3
+ Version: 0.3.435
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,16 +36,18 @@ alita_sdk/configurations/zephyr_essential.py,sha256=TiZedsBlfIDroflipvoqxjJeEWPo
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=b7hVuGRROt6qUcT11uAZqzJqslzmlgW-Y6oGsiwNmjI,4029
39
- alita_sdk/runtime/clients/client.py,sha256=ElJdZHYLpuXLQadoHMcuhiHzs8HVUiiv5rZE7UU-iNg,45896
39
+ alita_sdk/runtime/clients/client.py,sha256=8Ch-2wGB6pDT2fexABuZgk5XW4aoO35TPSfezgwVdSQ,46267
40
40
  alita_sdk/runtime/clients/datasource.py,sha256=HAZovoQN9jBg0_-lIlGBQzb4FJdczPhkHehAiVG3Wx0,1020
41
+ alita_sdk/runtime/clients/mcp_discovery.py,sha256=aFJ0wYQ8EAmXa9qLUusHZfQXkNec1wbgkqHdVeSFX-g,11697
42
+ alita_sdk/runtime/clients/mcp_manager.py,sha256=DRbqiO761l7UgOdv_keHbD2g0oZodtPHejpArXYZIoE,9050
41
43
  alita_sdk/runtime/clients/prompt.py,sha256=li1RG9eBwgNK_Qf0qUaZ8QNTmsncFrAL2pv3kbxZRZg,1447
42
44
  alita_sdk/runtime/clients/sandbox_client.py,sha256=kGOGfm3OAFmYeTM4bIuKbhRsOiOhF0M1q8takBe-sWY,16637
43
45
  alita_sdk/runtime/langchain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
46
  alita_sdk/runtime/langchain/assistant.py,sha256=qKoEjbGuUnX-OZDHmSaK3plb1jON9unzEwAjxBT9DY8,16044
45
47
  alita_sdk/runtime/langchain/chat_message_template.py,sha256=kPz8W2BG6IMyITFDA5oeb5BxVRkHEVZhuiGl4MBZKdc,2176
46
- alita_sdk/runtime/langchain/constants.py,sha256=I3dwexVp_Qq3MueRA2ClLgFDEhk4BkJhgR6m7V0gVPc,3404
48
+ alita_sdk/runtime/langchain/constants.py,sha256=oiEHg1h_IYUA5NE8O6nEF24hpxahi9BTvJWrkXjbVcU,3405
47
49
  alita_sdk/runtime/langchain/indexer.py,sha256=0ENHy5EOhThnAiYFc7QAsaTNp9rr8hDV_hTK8ahbatk,37592
48
- alita_sdk/runtime/langchain/langraph_agent.py,sha256=Tdcp9YrwiCHRqXqype6EBPT7DOaC0oQcHAQQ8jm0W18,51643
50
+ alita_sdk/runtime/langchain/langraph_agent.py,sha256=CxDFfUTCG-i8koMR9PwOktvlcdUe5cyG4D8CQHrTH1E,51836
49
51
  alita_sdk/runtime/langchain/mixedAgentParser.py,sha256=M256lvtsL3YtYflBCEp-rWKrKtcY1dJIyRGVv7KW9ME,2611
50
52
  alita_sdk/runtime/langchain/mixedAgentRenderes.py,sha256=asBtKqm88QhZRILditjYICwFVKF5KfO38hu2O-WrSWE,5964
51
53
  alita_sdk/runtime/langchain/store_manager.py,sha256=i8Fl11IXJhrBXq1F1ukEVln57B1IBe-tqSUvfUmBV4A,2218
@@ -95,14 +97,16 @@ alita_sdk/runtime/langchain/tools/bdd_parser/feature_types.py,sha256=l3AdjSQnNv1
95
97
  alita_sdk/runtime/langchain/tools/bdd_parser/parser.py,sha256=1H1Nd_OH5Wx8A5YV1zUghBxo613yPptZ7fqNo8Eg48M,17289
96
98
  alita_sdk/runtime/llms/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
97
99
  alita_sdk/runtime/llms/preloaded.py,sha256=3AaUbZK3d8fvxAQMjR3ftOoYa0SnkCOL1EvdvDCXIHE,11321
98
- alita_sdk/runtime/toolkits/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
100
+ alita_sdk/runtime/models/mcp_models.py,sha256=OdeDsKvB43auvTS1F3O2VBLd1dwe_7zCkhZZjFbICpw,2152
101
+ alita_sdk/runtime/toolkits/__init__.py,sha256=IenSyI2SrXSFuiWT7c8YO_mRFLVE_zNge61U4bpoyPw,631
99
102
  alita_sdk/runtime/toolkits/application.py,sha256=HHAKgwKOckxc7EQG-AV7rz4POOzQJKFRr7AGEjmLudE,2688
100
103
  alita_sdk/runtime/toolkits/artifact.py,sha256=YChNCX4QhVpaQG7Jk4TS-Wl0Aruc4slQ2K21zh9nNO0,3176
101
104
  alita_sdk/runtime/toolkits/configurations.py,sha256=kIDAlnryPQfbZyFxV-9SzN2-Vefzx06TX1BBdIIpN90,141
102
105
  alita_sdk/runtime/toolkits/datasource.py,sha256=qk78OdPoReYPCWwahfkKLbKc4pfsu-061oXRryFLP6I,2498
106
+ alita_sdk/runtime/toolkits/mcp.py,sha256=MnsvXHRbEIE_8O_qPtsGaW3ZiwSOeWUGYVCZGbHLH1E,31402
103
107
  alita_sdk/runtime/toolkits/prompt.py,sha256=WIpTkkVYWqIqOWR_LlSWz3ug8uO9tm5jJ7aZYdiGRn0,1192
104
108
  alita_sdk/runtime/toolkits/subgraph.py,sha256=wwUK8JjPXkGzyVZ3tAukmvST6eGbqx_U11rpnmbrvtg,2105
105
- alita_sdk/runtime/toolkits/tools.py,sha256=vJGZtXAP-EMT6HXTeDzKd_BuH3fx3Ht_8Skp_BvI9O8,10168
109
+ alita_sdk/runtime/toolkits/tools.py,sha256=YCTjrTJuwj2V2C8ZQqXhFvUbVr7NQcUHZlCQLLvoeGA,10946
106
110
  alita_sdk/runtime/toolkits/vectorstore.py,sha256=BGppQADa1ZiLO17fC0uCACTTEvPHlodEDYEzUcBRbAA,2901
107
111
  alita_sdk/runtime/tools/__init__.py,sha256=Fx7iHqkzA90-KfjdcUUzMUI_7kDarjuTsSpSzOW2pN0,568
108
112
  alita_sdk/runtime/tools/agent.py,sha256=m98QxOHwnCRTT9j18Olbb5UPS8-ZGeQaGiUyZJSyFck,3162
@@ -117,7 +121,8 @@ alita_sdk/runtime/tools/indexer_tool.py,sha256=whSLPevB4WD6dhh2JDXEivDmTvbjiMV1M
117
121
  alita_sdk/runtime/tools/llm.py,sha256=iRG_wU4T01LRsjEMPZe5Uah7LiMqDc-vspwkMuQtltk,16136
118
122
  alita_sdk/runtime/tools/loop.py,sha256=uds0WhZvwMxDVFI6MZHrcmMle637cQfBNg682iLxoJA,8335
119
123
  alita_sdk/runtime/tools/loop_output.py,sha256=U4hO9PCQgWlXwOq6jdmCGbegtAxGAPXObSxZQ3z38uk,8069
120
- alita_sdk/runtime/tools/mcp_server_tool.py,sha256=MhLxZJ44LYrB_0GrojmkyqKoDRaqIHkEQAsg718ipog,4277
124
+ alita_sdk/runtime/tools/mcp_inspect_tool.py,sha256=38X8euaxDbEGjcfp6ElvExZalpZun6QEr6ZEW4nU5pQ,11496
125
+ alita_sdk/runtime/tools/mcp_server_tool.py,sha256=HPlEppCbNafee41wSxZL1wnVyYCiOwdMD_dy0eE9IUs,7505
121
126
  alita_sdk/runtime/tools/pgvector_search.py,sha256=NN2BGAnq4SsDHIhUcFZ8d_dbEOM8QwB0UwpsWCYruXU,11692
122
127
  alita_sdk/runtime/tools/prompt.py,sha256=nJafb_e5aOM1Rr3qGFCR-SKziU9uCsiP2okIMs9PppM,741
123
128
  alita_sdk/runtime/tools/router.py,sha256=p7e0tX6YAWw2M2Nq0A_xqw1E2P-Xz1DaJvhUstfoZn4,1584
@@ -131,11 +136,11 @@ alita_sdk/runtime/utils/constants.py,sha256=Xntx1b_uxUzT4clwqHA_U6K8y5bBqf_4lSQw
131
136
  alita_sdk/runtime/utils/evaluate.py,sha256=iM1P8gzBLHTuSCe85_Ng_h30m52hFuGuhNXJ7kB1tgI,1872
132
137
  alita_sdk/runtime/utils/logging.py,sha256=svPyiW8ztDfhqHFITv5FBCj8UhLxz6hWcqGIY6wpJJE,3331
133
138
  alita_sdk/runtime/utils/save_dataframe.py,sha256=i-E1wp-t4wb17Zq3nA3xYwgSILjoXNizaQAA9opWvxY,1576
134
- alita_sdk/runtime/utils/streamlit.py,sha256=GQ69CsjfRMcGXcCrslL0Uoj24Cl07Jeji0rZxELaKTQ,104930
139
+ alita_sdk/runtime/utils/streamlit.py,sha256=yIb4YIGH8HRAXZtZlywjxI07Xdcb5eUt7rMA-elFTdc,107261
135
140
  alita_sdk/runtime/utils/toolkit_runtime.py,sha256=MU63Fpxj0b5_r1IUUc0Q3-PN9VwL7rUxp2MRR4tmYR8,5136
136
- alita_sdk/runtime/utils/toolkit_utils.py,sha256=I9QFqnaqfVgN26LUr6s3XlBlG6y0CoHURnCzG7XcwVs,5311
141
+ alita_sdk/runtime/utils/toolkit_utils.py,sha256=n11byeV6uLHAT7D8lPgIA0FE7tergbaRfbrwTWh5Twk,5447
137
142
  alita_sdk/runtime/utils/utils.py,sha256=PJK8A-JVIzY1IowOjGG8DIqsIiEFe65qDKvFcjJCKWA,1041
138
- alita_sdk/tools/__init__.py,sha256=wrcSP0AN6HukZHPXpObCKI58cY0lVpHyzbpq609CMhE,10726
143
+ alita_sdk/tools/__init__.py,sha256=uQzvtnyOsgfdHl3pdo2LqK49Hb3SKFXDBXW_szN2R3k,10992
139
144
  alita_sdk/tools/base_indexer_toolkit.py,sha256=hK1Q2dvNctZCw2K1-khlQrR1Q0JDQviZjqDUiqpnazg,27180
140
145
  alita_sdk/tools/code_indexer_toolkit.py,sha256=2VkOC8JfBDc25_jp-NWyMYqpaYRETIzTJFLrIYrfBpE,7814
141
146
  alita_sdk/tools/elitea_base.py,sha256=34fmVdYgd2YXifU5LFNjMQysr4OOIZ6AOZjq4GxLgSw,34417
@@ -213,7 +218,7 @@ alita_sdk/tools/chunkers/sematic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRk
213
218
  alita_sdk/tools/chunkers/sematic/base.py,sha256=bRHpCFbOy-KPe4HBGpegrvIhvOsd7sDRfmb06T8tSuU,349
214
219
  alita_sdk/tools/chunkers/sematic/json_chunker.py,sha256=wzlGeoS4qZOQA6Alcc0sn6zAxZSGVdwCLm0wHqmMODA,1038
215
220
  alita_sdk/tools/chunkers/sematic/markdown_chunker.py,sha256=HmAGKuIodnMcHl-kBwAb1NY0GKKwAskRFvGaW3m4HAM,3859
216
- alita_sdk/tools/chunkers/sematic/proposal_chunker.py,sha256=t8JjX9TH6yHXXaemiDK1E6000tlES2Kl8XfyezmlIoo,5116
221
+ alita_sdk/tools/chunkers/sematic/proposal_chunker.py,sha256=33RQfonQK_qyOQWx1EmWIihpKAghfMswgsHlKNdwMgA,5098
217
222
  alita_sdk/tools/chunkers/sematic/statistical_chunker.py,sha256=VDQcMC-ky72GqdWJiHMmcRmfJTTU5XglBF1IWg2Qews,13403
218
223
  alita_sdk/tools/cloud/__init__.py,sha256=ekqANTJAyuURqpjNTn6MmSn2q6qEKwENxEXBUFGkkck,512
219
224
  alita_sdk/tools/cloud/aws/__init__.py,sha256=dewHtDC0lS4ZtB0B98RX8I8CdHY54k13Tcwb7YdjXlQ,3132
@@ -248,7 +253,7 @@ alita_sdk/tools/github/schemas.py,sha256=TxEWR3SjDKVwzo9i2tLnss_uPAv85Mh7oWjvQvY
248
253
  alita_sdk/tools/github/tool.py,sha256=Jnnv5lenV5ds8AAdyo2m8hSzyJ117HZBjzHC6T1ck-M,1037
249
254
  alita_sdk/tools/github/tool_prompts.py,sha256=y6ZW_FpUCE87Uop3WuQAZVRnzxO5t7xjBOI5bCqiluw,30194
250
255
  alita_sdk/tools/gitlab/__init__.py,sha256=iis7RHD3YgKWxF_ryTfdtA8RPGV-W8zUfy4BgiTDADw,4540
251
- alita_sdk/tools/gitlab/api_wrapper.py,sha256=csANoMp_hiOODU3bSa19gqvKdF_x1ub8aBkDHKeekVs,22726
256
+ alita_sdk/tools/gitlab/api_wrapper.py,sha256=FYvtuU-JE2gH0TeayYkfxpfArRzGRtB6WAitEvLy8-4,22888
252
257
  alita_sdk/tools/gitlab/tools.py,sha256=vOGTlSaGaFmWn6LS6YFP-FuTqUPun9vnv1VrUcUHAZQ,16500
253
258
  alita_sdk/tools/gitlab/utils.py,sha256=Z2XiqIg54ouqqt1to-geFybmkCb1I6bpE91wfnINH1I,2320
254
259
  alita_sdk/tools/gitlab_org/__init__.py,sha256=PSTsC4BcPoyDv03Wj9VQHrEGUeR8hw4MRarB64VeqFg,3865
@@ -303,7 +308,7 @@ alita_sdk/tools/postman/postman_analysis.py,sha256=ckc2BfKEop0xnmLPksVRE_Y94ixuq
303
308
  alita_sdk/tools/pptx/__init__.py,sha256=vVUrWnj7KWJgEk9oxGSsCAQ2SMSXrp_SFOdUHYQKcAo,3444
304
309
  alita_sdk/tools/pptx/pptx_wrapper.py,sha256=yyCYcTlIY976kJ4VfPo4dyxj4yeii9j9TWP6W8ZIpN8,29195
305
310
  alita_sdk/tools/qtest/__init__.py,sha256=Jf0xo5S_4clXR2TfCbJbB1sFgCbcFQRM-YYX2ltWBzo,4461
306
- alita_sdk/tools/qtest/api_wrapper.py,sha256=6MVRokCZTpI7kPAqZtnO6CfLkx7HyDAV7yrP4MhyXcA,37310
311
+ alita_sdk/tools/qtest/api_wrapper.py,sha256=5YJPcEGUT_V_SdgiYBoPDJHTEDfCrDgzoXTdXuGoH4I,46652
307
312
  alita_sdk/tools/qtest/tool.py,sha256=kKzNPS4fUC76WQQttQ6kdVANViHEvKE8Kf174MQiNYU,562
308
313
  alita_sdk/tools/rally/__init__.py,sha256=2BPPXJxAOKgfmaxVFVvxndfK0JxOXDLkoRmzu2dUwOE,3512
309
314
  alita_sdk/tools/rally/api_wrapper.py,sha256=mouzU6g0KML4UNapdk0k6Q0pU3MpJuWnNo71n9PSEHM,11752
@@ -353,8 +358,8 @@ alita_sdk/tools/zephyr_scale/api_wrapper.py,sha256=kT0TbmMvuKhDUZc0i7KO18O38JM9S
353
358
  alita_sdk/tools/zephyr_squad/__init__.py,sha256=0ne8XLJEQSLOWfzd2HdnqOYmQlUliKHbBED5kW_Vias,2895
354
359
  alita_sdk/tools/zephyr_squad/api_wrapper.py,sha256=kmw_xol8YIYFplBLWTqP_VKPRhL_1ItDD0_vXTe_UuI,14906
355
360
  alita_sdk/tools/zephyr_squad/zephyr_squad_cloud_client.py,sha256=R371waHsms4sllHCbijKYs90C-9Yu0sSR3N4SUfQOgU,5066
356
- alita_sdk-0.3.423.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
357
- alita_sdk-0.3.423.dist-info/METADATA,sha256=eTJxaeFX-hl-mNOiNRGZ3Tk6w7nXD0L4niy8pTzSCSg,19071
358
- alita_sdk-0.3.423.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
359
- alita_sdk-0.3.423.dist-info/top_level.txt,sha256=0vJYy5p_jK6AwVb1aqXr7Kgqgk3WDtQ6t5C-XI9zkmg,10
360
- alita_sdk-0.3.423.dist-info/RECORD,,
361
+ alita_sdk-0.3.435.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
362
+ alita_sdk-0.3.435.dist-info/METADATA,sha256=kuNOhhnRzdqSLgYrM41t-qLOE62bgF6VE-0r9no-3Z0,19071
363
+ alita_sdk-0.3.435.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
364
+ alita_sdk-0.3.435.dist-info/top_level.txt,sha256=0vJYy5p_jK6AwVb1aqXr7Kgqgk3WDtQ6t5C-XI9zkmg,10
365
+ alita_sdk-0.3.435.dist-info/RECORD,,