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.
- alita_sdk/runtime/clients/client.py +6 -2
- alita_sdk/runtime/clients/mcp_discovery.py +342 -0
- alita_sdk/runtime/clients/mcp_manager.py +262 -0
- alita_sdk/runtime/langchain/constants.py +1 -1
- alita_sdk/runtime/langchain/langraph_agent.py +4 -1
- alita_sdk/runtime/models/mcp_models.py +57 -0
- alita_sdk/runtime/toolkits/__init__.py +24 -0
- alita_sdk/runtime/toolkits/mcp.py +787 -0
- alita_sdk/runtime/toolkits/tools.py +19 -2
- alita_sdk/runtime/tools/mcp_inspect_tool.py +284 -0
- alita_sdk/runtime/tools/mcp_server_tool.py +79 -10
- alita_sdk/runtime/utils/streamlit.py +34 -3
- alita_sdk/runtime/utils/toolkit_utils.py +5 -2
- alita_sdk/tools/__init__.py +5 -0
- alita_sdk/tools/chunkers/sematic/proposal_chunker.py +1 -1
- alita_sdk/tools/gitlab/api_wrapper.py +5 -0
- alita_sdk/tools/qtest/api_wrapper.py +240 -39
- {alita_sdk-0.3.423.dist-info → alita_sdk-0.3.435.dist-info}/METADATA +1 -1
- {alita_sdk-0.3.423.dist-info → alita_sdk-0.3.435.dist-info}/RECORD +22 -17
- {alita_sdk-0.3.423.dist-info → alita_sdk-0.3.435.dist-info}/WHEEL +0 -0
- {alita_sdk-0.3.423.dist-info → alita_sdk-0.3.435.dist-info}/licenses/LICENSE +0 -0
- {alita_sdk-0.3.423.dist-info → alita_sdk-0.3.435.dist-info}/top_level.txt +0 -0
|
@@ -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
|
-
#
|
|
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
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
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
|
|
594
|
-
"""
|
|
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
|
-
|
|
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
|
-
"""
|
|
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
|
-
|
|
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(
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
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": "
|
|
740
|
-
"mode": "
|
|
741
|
-
"description": "
|
|
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.
|
|
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=
|
|
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=
|
|
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=
|
|
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/
|
|
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=
|
|
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/
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
357
|
-
alita_sdk-0.3.
|
|
358
|
-
alita_sdk-0.3.
|
|
359
|
-
alita_sdk-0.3.
|
|
360
|
-
alita_sdk-0.3.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|