alita-sdk 0.3.162__tar.gz → 0.3.164__tar.gz

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.
Files changed (342) hide show
  1. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/PKG-INFO +4 -3
  2. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/assistant.py +2 -2
  3. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/store_manager.py +22 -1
  4. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/toolkits/tools.py +1 -1
  5. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/__init__.py +7 -1
  6. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/carrier/api_wrapper.py +76 -4
  7. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/carrier/backend_reports_tool.py +31 -12
  8. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/carrier/backend_tests_tool.py +14 -8
  9. alita_sdk-0.3.164/alita_sdk/tools/carrier/cancel_ui_test_tool.py +178 -0
  10. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/carrier/carrier_sdk.py +99 -15
  11. alita_sdk-0.3.164/alita_sdk/tools/carrier/create_ui_excel_report_tool.py +473 -0
  12. alita_sdk-0.3.164/alita_sdk/tools/carrier/create_ui_test_tool.py +199 -0
  13. alita_sdk-0.3.164/alita_sdk/tools/carrier/lighthouse_excel_reporter.py +155 -0
  14. alita_sdk-0.3.164/alita_sdk/tools/carrier/run_ui_test_tool.py +394 -0
  15. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/carrier/tools.py +11 -1
  16. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/carrier/ui_reports_tool.py +6 -2
  17. alita_sdk-0.3.164/alita_sdk/tools/carrier/update_ui_test_schedule_tool.py +278 -0
  18. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/memory/__init__.py +7 -0
  19. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/postman/__init__.py +7 -0
  20. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/postman/api_wrapper.py +335 -0
  21. alita_sdk-0.3.164/alita_sdk/tools/zephyr_squad/__init__.py +62 -0
  22. alita_sdk-0.3.164/alita_sdk/tools/zephyr_squad/api_wrapper.py +135 -0
  23. alita_sdk-0.3.164/alita_sdk/tools/zephyr_squad/zephyr_squad_cloud_client.py +79 -0
  24. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk.egg-info/PKG-INFO +4 -3
  25. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk.egg-info/SOURCES.txt +9 -0
  26. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk.egg-info/requires.txt +3 -2
  27. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/pyproject.toml +3 -3
  28. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/LICENSE +0 -0
  29. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/README.md +0 -0
  30. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/__init__.py +0 -0
  31. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/__init__.py +0 -0
  32. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/analysis/__init__.py +0 -0
  33. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/analysis/ado_analyse/__init__.py +0 -0
  34. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/analysis/ado_analyse/api_wrapper.py +0 -0
  35. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/analysis/github_analyse/__init__.py +0 -0
  36. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/analysis/github_analyse/api_wrapper.py +0 -0
  37. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/analysis/gitlab_analyse/__init__.py +0 -0
  38. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/analysis/gitlab_analyse/api_wrapper.py +0 -0
  39. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/analysis/jira_analyse/__init__.py +0 -0
  40. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/analysis/jira_analyse/api_wrapper.py +0 -0
  41. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/browseruse/__init__.py +0 -0
  42. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/browseruse/api_wrapper.py +0 -0
  43. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/deep_researcher/__init__.py +0 -0
  44. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/deep_researcher/agents/__init__.py +0 -0
  45. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/deep_researcher/agents/baseclass.py +0 -0
  46. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/deep_researcher/agents/knowledge_gap_agent.py +0 -0
  47. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/deep_researcher/agents/long_writer_agent.py +0 -0
  48. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/deep_researcher/agents/planner_agent.py +0 -0
  49. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/deep_researcher/agents/proofreader_agent.py +0 -0
  50. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/deep_researcher/agents/thinking_agent.py +0 -0
  51. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/deep_researcher/agents/tool_agents/__init__.py +0 -0
  52. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/deep_researcher/agents/tool_agents/crawl_agent.py +0 -0
  53. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/deep_researcher/agents/tool_agents/search_agent.py +0 -0
  54. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/deep_researcher/agents/tool_selector_agent.py +0 -0
  55. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/deep_researcher/agents/utils/__init__.py +0 -0
  56. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/deep_researcher/agents/utils/parse_output.py +0 -0
  57. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/deep_researcher/agents/writer_agent.py +0 -0
  58. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/deep_researcher/api_wrapper.py +0 -0
  59. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/deep_researcher/deep_research.py +0 -0
  60. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/deep_researcher/examples/deep_example.py +0 -0
  61. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/deep_researcher/examples/iterative_example.py +0 -0
  62. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/deep_researcher/examples/report_plan_example.py +0 -0
  63. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/deep_researcher/iterative_research.py +0 -0
  64. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/deep_researcher/llm_config.py +0 -0
  65. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/deep_researcher/main.py +0 -0
  66. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/deep_researcher/tools/__init__.py +0 -0
  67. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/deep_researcher/tools/crawl_website.py +0 -0
  68. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/deep_researcher/tools/web_search.py +0 -0
  69. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/deep_researcher/utils/__init__.py +0 -0
  70. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/deep_researcher/utils/md_to_pdf.py +0 -0
  71. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/deep_researcher/utils/os.py +0 -0
  72. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/community/utils.py +0 -0
  73. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/__init__.py +0 -0
  74. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/clients/__init__.py +0 -0
  75. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/clients/artifact.py +0 -0
  76. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/clients/client.py +0 -0
  77. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/clients/datasource.py +0 -0
  78. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/clients/prompt.py +0 -0
  79. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/__init__.py +0 -0
  80. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/agents/__init__.py +0 -0
  81. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/agents/xml_chat.py +0 -0
  82. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/chat_message_template.py +0 -0
  83. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/constants.py +0 -0
  84. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/document_loaders/AlitaBDDScenariosLoader.py +0 -0
  85. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/document_loaders/AlitaCSVLoader.py +0 -0
  86. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/document_loaders/AlitaConfluenceLoader.py +0 -0
  87. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/document_loaders/AlitaDirectoryLoader.py +0 -0
  88. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/document_loaders/AlitaDocxMammothLoader.py +0 -0
  89. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/document_loaders/AlitaExcelLoader.py +0 -0
  90. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/document_loaders/AlitaGitRepoLoader.py +0 -0
  91. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/document_loaders/AlitaImageLoader.py +0 -0
  92. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/document_loaders/AlitaJiraLoader.py +0 -0
  93. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/document_loaders/AlitaQtestLoader.py +0 -0
  94. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/document_loaders/AlitaTableLoader.py +0 -0
  95. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/document_loaders/__init__.py +0 -0
  96. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/document_loaders/constants.py +0 -0
  97. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/document_loaders/utils.py +0 -0
  98. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/indexer.py +0 -0
  99. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/interfaces/__init__.py +0 -0
  100. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/interfaces/kwextractor.py +0 -0
  101. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/interfaces/llm_processor.py +0 -0
  102. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/interfaces/loaders.py +0 -0
  103. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/interfaces/splitters.py +0 -0
  104. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/langraph_agent.py +0 -0
  105. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/mixedAgentParser.py +0 -0
  106. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/mixedAgentRenderes.py +0 -0
  107. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/retrievers/AlitaRetriever.py +0 -0
  108. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/retrievers/VectorstoreRetriever.py +0 -0
  109. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/retrievers/__init__.py +0 -0
  110. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/tools/__init__.py +0 -0
  111. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/tools/bdd_parser/__init__.py +0 -0
  112. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/tools/bdd_parser/bdd_exceptions.py +0 -0
  113. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/tools/bdd_parser/bdd_parser.py +0 -0
  114. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/tools/bdd_parser/feature_types.py +0 -0
  115. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/tools/bdd_parser/parser.py +0 -0
  116. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/tools/git.py +0 -0
  117. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/tools/log.py +0 -0
  118. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/tools/quota.py +0 -0
  119. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/tools/state.py +0 -0
  120. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/tools/utils.py +0 -0
  121. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/tools/vector.py +0 -0
  122. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/langchain/utils.py +0 -0
  123. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/llms/__init__.py +0 -0
  124. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/llms/alita.py +0 -0
  125. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/llms/preloaded.py +0 -0
  126. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/toolkits/__init__.py +0 -0
  127. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/toolkits/application.py +0 -0
  128. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/toolkits/artifact.py +0 -0
  129. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/toolkits/datasource.py +0 -0
  130. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/toolkits/prompt.py +0 -0
  131. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/toolkits/subgraph.py +0 -0
  132. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/toolkits/vectorstore.py +0 -0
  133. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/tools/__init__.py +0 -0
  134. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/tools/agent.py +0 -0
  135. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/tools/application.py +0 -0
  136. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/tools/artifact.py +0 -0
  137. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/tools/datasource.py +0 -0
  138. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/tools/echo.py +0 -0
  139. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/tools/function.py +0 -0
  140. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/tools/indexer_tool.py +0 -0
  141. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/tools/llm.py +0 -0
  142. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/tools/loop.py +0 -0
  143. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/tools/loop_output.py +0 -0
  144. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/tools/mcp_server_tool.py +0 -0
  145. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/tools/pgvector_search.py +0 -0
  146. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/tools/prompt.py +0 -0
  147. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/tools/router.py +0 -0
  148. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/tools/tool.py +0 -0
  149. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/tools/vectorstore.py +0 -0
  150. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/utils/AlitaCallback.py +0 -0
  151. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/utils/__init__.py +0 -0
  152. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/utils/constants.py +0 -0
  153. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/utils/evaluate.py +0 -0
  154. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/utils/logging.py +0 -0
  155. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/utils/save_dataframe.py +0 -0
  156. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/utils/streamlit.py +0 -0
  157. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/runtime/utils/utils.py +0 -0
  158. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/ado/__init__.py +0 -0
  159. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/ado/repos/__init__.py +0 -0
  160. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/ado/repos/repos_wrapper.py +0 -0
  161. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/ado/test_plan/__init__.py +0 -0
  162. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/ado/test_plan/test_plan_wrapper.py +0 -0
  163. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/ado/utils.py +0 -0
  164. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/ado/wiki/__init__.py +0 -0
  165. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/ado/wiki/ado_wrapper.py +0 -0
  166. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/ado/work_item/__init__.py +0 -0
  167. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/ado/work_item/ado_wrapper.py +0 -0
  168. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/advanced_jira_mining/__init__.py +0 -0
  169. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/advanced_jira_mining/data_mining_wrapper.py +0 -0
  170. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/azure_ai/__init__.py +0 -0
  171. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/azure_ai/search/__init__.py +0 -0
  172. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/azure_ai/search/api_wrapper.py +0 -0
  173. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/base/__init__.py +0 -0
  174. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/base/tool.py +0 -0
  175. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/bitbucket/__init__.py +0 -0
  176. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/bitbucket/api_wrapper.py +0 -0
  177. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/bitbucket/bitbucket_constants.py +0 -0
  178. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/bitbucket/cloud_api_wrapper.py +0 -0
  179. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/bitbucket/tools.py +0 -0
  180. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/browser/__init__.py +0 -0
  181. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/browser/crawler.py +0 -0
  182. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/browser/duck_duck_go_search.py +0 -0
  183. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/browser/google_search_rag.py +0 -0
  184. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/browser/utils.py +0 -0
  185. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/browser/wiki.py +0 -0
  186. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/carrier/__init__.py +0 -0
  187. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/carrier/excel_reporter.py +0 -0
  188. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/carrier/tickets_tool.py +0 -0
  189. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/carrier/utils.py +0 -0
  190. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/chunkers/__init__.py +0 -0
  191. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/chunkers/code/__init__.py +0 -0
  192. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/chunkers/code/codeparser.py +0 -0
  193. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/chunkers/code/constants.py +0 -0
  194. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/chunkers/code/treesitter/__init__.py +0 -0
  195. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/chunkers/code/treesitter/treesitter.py +0 -0
  196. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/chunkers/code/treesitter/treesitter_c.py +0 -0
  197. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/chunkers/code/treesitter/treesitter_cpp.py +0 -0
  198. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/chunkers/code/treesitter/treesitter_cs.py +0 -0
  199. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/chunkers/code/treesitter/treesitter_go.py +0 -0
  200. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/chunkers/code/treesitter/treesitter_hs.py +0 -0
  201. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/chunkers/code/treesitter/treesitter_java.py +0 -0
  202. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/chunkers/code/treesitter/treesitter_js.py +0 -0
  203. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/chunkers/code/treesitter/treesitter_kt.py +0 -0
  204. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/chunkers/code/treesitter/treesitter_py.py +0 -0
  205. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/chunkers/code/treesitter/treesitter_rb.py +0 -0
  206. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/chunkers/code/treesitter/treesitter_registry.py +0 -0
  207. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/chunkers/code/treesitter/treesitter_rs.py +0 -0
  208. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/chunkers/code/treesitter/treesitter_ts.py +0 -0
  209. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/chunkers/models.py +0 -0
  210. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/chunkers/sematic/__init__.py +0 -0
  211. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/chunkers/sematic/base.py +0 -0
  212. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/chunkers/sematic/markdown_chunker.py +0 -0
  213. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/chunkers/sematic/proposal_chunker.py +0 -0
  214. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/chunkers/sematic/statistical_chunker.py +0 -0
  215. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/chunkers/utils.py +0 -0
  216. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/cloud/__init__.py +0 -0
  217. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/cloud/aws/__init__.py +0 -0
  218. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/cloud/aws/api_wrapper.py +0 -0
  219. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/cloud/azure/__init__.py +0 -0
  220. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/cloud/azure/api_wrapper.py +0 -0
  221. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/cloud/gcp/__init__.py +0 -0
  222. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/cloud/gcp/api_wrapper.py +0 -0
  223. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/cloud/k8s/__init__.py +0 -0
  224. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/cloud/k8s/api_wrapper.py +0 -0
  225. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/code/__init__.py +0 -0
  226. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/code/linter/__init__.py +0 -0
  227. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/code/linter/api_wrapper.py +0 -0
  228. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/code/loaders/codesearcher.py +0 -0
  229. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/code/sonar/__init__.py +0 -0
  230. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/code/sonar/api_wrapper.py +0 -0
  231. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/confluence/__init__.py +0 -0
  232. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/confluence/api_wrapper.py +0 -0
  233. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/confluence/loader.py +0 -0
  234. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/confluence/utils.py +0 -0
  235. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/custom_open_api/__init__.py +0 -0
  236. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/custom_open_api/api_wrapper.py +0 -0
  237. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/elastic/__init__.py +0 -0
  238. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/elastic/api_wrapper.py +0 -0
  239. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/elitea_base.py +0 -0
  240. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/figma/__init__.py +0 -0
  241. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/figma/api_wrapper.py +0 -0
  242. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/github/__init__.py +0 -0
  243. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/github/api_wrapper.py +0 -0
  244. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/github/github_client.py +0 -0
  245. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/github/graphql_client_wrapper.py +0 -0
  246. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/github/schemas.py +0 -0
  247. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/github/tool.py +0 -0
  248. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/github/tool_prompts.py +0 -0
  249. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/gitlab/__init__.py +0 -0
  250. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/gitlab/api_wrapper.py +0 -0
  251. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/gitlab/tools.py +0 -0
  252. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/gitlab/utils.py +0 -0
  253. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/gitlab_org/__init__.py +0 -0
  254. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/gitlab_org/api_wrapper.py +0 -0
  255. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/gmail/__init__.py +0 -0
  256. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/gmail/gmail_wrapper.py +0 -0
  257. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/gmail/utils.py +0 -0
  258. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/google_places/__init__.py +0 -0
  259. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/google_places/api_wrapper.py +0 -0
  260. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/jira/__init__.py +0 -0
  261. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/jira/api_wrapper.py +0 -0
  262. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/keycloak/__init__.py +0 -0
  263. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/keycloak/api_wrapper.py +0 -0
  264. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/llm/__init__.py +0 -0
  265. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/llm/img_utils.py +0 -0
  266. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/llm/llm_utils.py +0 -0
  267. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/localgit/__init__.py +0 -0
  268. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/localgit/local_git.py +0 -0
  269. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/localgit/tool.py +0 -0
  270. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/ocr/__init__.py +0 -0
  271. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/ocr/api_wrapper.py +0 -0
  272. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/ocr/text_detection.py +0 -0
  273. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/openapi/__init__.py +0 -0
  274. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/pandas/__init__.py +0 -0
  275. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/pandas/api_wrapper.py +0 -0
  276. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/pandas/dataframe/__init__.py +0 -0
  277. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/pandas/dataframe/errors.py +0 -0
  278. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/pandas/dataframe/executor/__init__.py +0 -0
  279. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/pandas/dataframe/executor/code_environment.py +0 -0
  280. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/pandas/dataframe/executor/code_executor.py +0 -0
  281. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/pandas/dataframe/generator/__init__.py +0 -0
  282. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/pandas/dataframe/generator/base.py +0 -0
  283. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/pandas/dataframe/generator/code_cleaning.py +0 -0
  284. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/pandas/dataframe/generator/code_validator.py +0 -0
  285. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/pandas/dataframe/prompts.py +0 -0
  286. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/pandas/dataframe/serializer.py +0 -0
  287. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/pandas/dataframe/utils.py +0 -0
  288. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/pandas/statsmodels/__init__.py +0 -0
  289. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/pandas/statsmodels/base_stats.py +0 -0
  290. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/pandas/statsmodels/descriptive.py +0 -0
  291. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/pandas/statsmodels/hypothesis_testing.py +0 -0
  292. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/pandas/statsmodels/regression.py +0 -0
  293. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/postman/postman_analysis.py +0 -0
  294. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/pptx/__init__.py +0 -0
  295. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/pptx/pptx_wrapper.py +0 -0
  296. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/qtest/__init__.py +0 -0
  297. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/qtest/api_wrapper.py +0 -0
  298. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/qtest/tool.py +0 -0
  299. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/rally/__init__.py +0 -0
  300. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/rally/api_wrapper.py +0 -0
  301. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/report_portal/__init__.py +0 -0
  302. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/report_portal/api_wrapper.py +0 -0
  303. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/report_portal/report_portal_client.py +0 -0
  304. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/salesforce/__init__.py +0 -0
  305. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/salesforce/api_wrapper.py +0 -0
  306. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/salesforce/model.py +0 -0
  307. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/servicenow/__init__.py +0 -0
  308. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/servicenow/api_wrapper.py +0 -0
  309. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/servicenow/servicenow_client.py +0 -0
  310. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/sharepoint/__init__.py +0 -0
  311. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/sharepoint/api_wrapper.py +0 -0
  312. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/sharepoint/authorization_helper.py +0 -0
  313. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/sharepoint/utils.py +0 -0
  314. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/sql/__init__.py +0 -0
  315. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/sql/api_wrapper.py +0 -0
  316. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/sql/models.py +0 -0
  317. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/testio/__init__.py +0 -0
  318. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/testio/api_wrapper.py +0 -0
  319. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/testrail/__init__.py +0 -0
  320. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/testrail/api_wrapper.py +0 -0
  321. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/utils/__init__.py +0 -0
  322. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/utils/content_parser.py +0 -0
  323. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/xray/__init__.py +0 -0
  324. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/xray/api_wrapper.py +0 -0
  325. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/yagmail/__init__.py +0 -0
  326. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/yagmail/yagmail_wrapper.py +0 -0
  327. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/zephyr/Zephyr.py +0 -0
  328. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/zephyr/__init__.py +0 -0
  329. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/zephyr/api_wrapper.py +0 -0
  330. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/zephyr/rest_client.py +0 -0
  331. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/zephyr_enterprise/__init__.py +0 -0
  332. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/zephyr_enterprise/api_wrapper.py +0 -0
  333. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/zephyr_enterprise/zephyr_enterprise.py +0 -0
  334. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/zephyr_scale/__init__.py +0 -0
  335. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk/tools/zephyr_scale/api_wrapper.py +0 -0
  336. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk.egg-info/dependency_links.txt +0 -0
  337. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/alita_sdk.egg-info/top_level.txt +0 -0
  338. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/setup.cfg +0 -0
  339. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/tests/test_ado_analysis.py +0 -0
  340. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/tests/test_github_analysis.py +0 -0
  341. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/tests/test_gitlab_analysis.py +0 -0
  342. {alita_sdk-0.3.162 → alita_sdk-0.3.164}/tests/test_jira_analysis.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: alita_sdk
3
- Version: 0.3.162
3
+ Version: 0.3.164
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>
6
6
  License-Expression: Apache-2.0
@@ -31,8 +31,8 @@ Requires-Dist: langchain_community~=0.3.7; extra == "runtime"
31
31
  Requires-Dist: langchain-openai~=0.3.0; extra == "runtime"
32
32
  Requires-Dist: langgraph-checkpoint-sqlite~=2.0.0; extra == "runtime"
33
33
  Requires-Dist: langgraph-checkpoint-postgres~=2.0.1; extra == "runtime"
34
- Requires-Dist: langsmith==0.1.144; extra == "runtime"
35
- Requires-Dist: langgraph~=0.2.53; extra == "runtime"
34
+ Requires-Dist: langsmith>=0.3.45; extra == "runtime"
35
+ Requires-Dist: langgraph>=0.4.8; extra == "runtime"
36
36
  Requires-Dist: langchain_chroma~=0.2.2; extra == "runtime"
37
37
  Requires-Dist: langchain-unstructured~=0.1.6; extra == "runtime"
38
38
  Requires-Dist: langchain-postgres~=0.0.13; extra == "runtime"
@@ -122,6 +122,7 @@ Requires-Dist: yagmail==0.15.293; extra == "tools"
122
122
  Requires-Dist: pysnc==1.1.10; extra == "tools"
123
123
  Requires-Dist: shortuuid==1.0.13; extra == "tools"
124
124
  Requires-Dist: yarl==1.17.1; extra == "tools"
125
+ Requires-Dist: langmem==0.0.27; extra == "tools"
125
126
  Provides-Extra: community
126
127
  Requires-Dist: retry-extended==0.2.3; extra == "community"
127
128
  Requires-Dist: browser-use==0.1.43; extra == "community"
@@ -61,8 +61,8 @@ class Assistant:
61
61
  "Review toolkits configuration or use pipeline as master agent.")
62
62
 
63
63
  # configure memory store if memory tool is defined
64
- # memory_tool = next((tool for tool in data['tools'] if tool['type'] == 'memory'), None)
65
- # self._configure_store(memory_tool)
64
+ memory_tool = next((tool for tool in data['tools'] if tool['type'] == 'memory'), None)
65
+ self._configure_store(memory_tool)
66
66
 
67
67
  # Lazy import to avoid circular dependency
68
68
  from ..toolkits.tools import get_tools
@@ -1,6 +1,8 @@
1
1
  import threading
2
2
  import atexit
3
3
  import logging
4
+ from urllib.parse import urlparse, unquote
5
+
4
6
  from psycopg import Connection
5
7
  from langgraph.store.postgres import PostgresStore
6
8
 
@@ -18,11 +20,30 @@ class StoreManager:
18
20
  cls._instance._stores = {}
19
21
  return cls._instance
20
22
 
23
+ def _parse_connection_string(self, conn_str: str) -> dict:
24
+ """
25
+ Parse the connection string from SQLAlchemy style to args dict.
26
+ """
27
+ if conn_str.startswith("postgresql+psycopg://"):
28
+ url = conn_str[len("postgresql+psycopg://"):]
29
+
30
+ parsed = urlparse(f"//{url}")
31
+
32
+ return {
33
+ "user": unquote(parsed.username) if parsed.username else None,
34
+ "password": unquote(parsed.password) if parsed.password else None,
35
+ "host": parsed.hostname,
36
+ "port": parsed.port,
37
+ "dbname": parsed.path.lstrip("/") if parsed.path else None
38
+ }
39
+
21
40
  def get_store(self, conn_str: str) -> PostgresStore:
22
41
  store = self._stores.get(conn_str)
23
42
  if store is None:
24
43
  logger.info(f"Creating new PostgresStore for connection: {conn_str}")
25
- conn = Connection.connect(conn_str, autocommit=True, prepare_threshold=0)
44
+ conn_params = self._parse_connection_string(conn_str)
45
+ conn_params.update({'autocommit': True, 'prepare_threshold': 0})
46
+ conn = Connection.connect(**conn_params)
26
47
  store = PostgresStore(conn)
27
48
  store.setup()
28
49
  self._stores[conn_str] = store
@@ -95,7 +95,7 @@ def get_tools(tools_list: list, alita_client, llm, memory_store: BaseStore = Non
95
95
  # Add community tools
96
96
  tools += community_tools(tools_list, alita_client, llm)
97
97
  # Add alita tools
98
- tools += alita_tools(tools_list, alita_client, llm)
98
+ tools += alita_tools(tools_list, alita_client, llm, memory_store)
99
99
  # Add MCP tools
100
100
  tools += _mcp_tools(tools_list, alita_client)
101
101
 
@@ -1,5 +1,8 @@
1
1
  import logging
2
2
  from importlib import import_module
3
+ from typing import Optional
4
+
5
+ from langgraph.store.base import BaseStore
3
6
 
4
7
  logger = logging.getLogger(__name__)
5
8
 
@@ -74,13 +77,15 @@ _safe_import_tool('carrier', 'carrier', 'get_tools', 'AlitaCarrierToolkit')
74
77
  _safe_import_tool('ocr', 'ocr', 'get_tools', 'OCRToolkit')
75
78
  _safe_import_tool('pptx', 'pptx', 'get_tools', 'PPTXToolkit')
76
79
  _safe_import_tool('postman', 'postman', 'get_tools', 'PostmanToolkit')
80
+ _safe_import_tool('memory', 'memory', 'get_tools', 'MemoryToolkit')
81
+ _safe_import_tool('zephyr_squad', 'zephyr_squad', 'get_tools', 'ZephyrSquadToolkit')
77
82
 
78
83
  # Log import summary
79
84
  available_count = len(AVAILABLE_TOOLS)
80
85
  total_attempted = len(AVAILABLE_TOOLS) + len(FAILED_IMPORTS)
81
86
  logger.info(f"Tool imports completed: {available_count}/{total_attempted} successful")
82
87
 
83
- def get_tools(tools_list, alita, llm, *args, **kwargs):
88
+ def get_tools(tools_list, alita, llm, store: Optional[BaseStore] = None, *args, **kwargs):
84
89
  tools = []
85
90
  for tool in tools_list:
86
91
  # validate tool name syntax - it cannot be started with _
@@ -90,6 +95,7 @@ def get_tools(tools_list, alita, llm, *args, **kwargs):
90
95
 
91
96
  tool['settings']['alita'] = alita
92
97
  tool['settings']['llm'] = llm
98
+ tool['settings']['store'] = store
93
99
  tool_type = tool['type']
94
100
 
95
101
  # Check if tool is available and has get_tools function
@@ -67,6 +67,10 @@ class CarrierAPIWrapper(BaseModel):
67
67
  def run_test(self, test_id: str, json_body):
68
68
  return self._client.run_test(test_id, json_body)
69
69
 
70
+ def run_ui_test(self, test_id: str, json_body):
71
+ """Run a UI test with the given test ID and JSON body."""
72
+ return self._client.run_ui_test(test_id, json_body)
73
+
70
74
  def get_engagements_list(self) -> List[Dict[str, Any]]:
71
75
  return self._client.get_engagements_list()
72
76
 
@@ -76,17 +80,21 @@ class CarrierAPIWrapper(BaseModel):
76
80
  def get_report_file_log(self, bucket: str, file_name: str):
77
81
  return self._client.get_report_file_log(bucket, file_name)
78
82
 
79
- def upload_excel_report(self, bucket_name: str, excel_report_name: str):
80
- return self._client.upload_excel_report(bucket_name, excel_report_name)
83
+ def upload_file(self, bucket_name: str, file_name: str):
84
+ return self._client.upload_file(bucket_name, file_name)
81
85
 
82
86
  def get_ui_reports_list(self) -> List[Dict[str, Any]]:
83
87
  """Get list of UI test reports from the Carrier platform."""
84
- return self._client.get_ui_tests_list()
88
+ return self._client.get_ui_reports_list()
85
89
 
86
90
  def get_ui_tests_list(self) -> List[Dict[str, Any]]:
87
91
  """Get list of UI tests from the Carrier platform."""
88
92
  return self._client.get_ui_tests_list()
89
93
 
94
+ def get_locations(self) -> Dict[str, Any]:
95
+ """Get list of available locations/cloud settings from the Carrier platform."""
96
+ return self._client.get_locations()
97
+
90
98
  def get_ui_report_links(self, uid: str) -> list:
91
99
  """Get all unique file_names for a given UI report UID, ending with .html, without #index=*, and only unique values."""
92
100
  endpoint = f"api/v1/ui_performance/results/{self.project_id}/{uid}?sort=loop&order=asc"
@@ -120,4 +128,68 @@ class CarrierAPIWrapper(BaseModel):
120
128
  return [prefix + name for name in sorted_names]
121
129
  except Exception as e:
122
130
  logger.error(f"Failed to fetch UI report links: {e}")
123
- return []
131
+ return []
132
+
133
+ def update_ui_test(self, test_id: str, json_body) -> Dict[str, Any]:
134
+ """Update UI test configuration and schedule."""
135
+ return self._client.update_ui_test(test_id, json_body)
136
+
137
+ def get_ui_test_details(self, test_id: str) -> Dict[str, Any]:
138
+ """Get detailed UI test configuration by test ID."""
139
+ return self._client.get_ui_test_details(test_id)
140
+
141
+ def create_ui_test(self, json_body: Dict[str, Any]) -> Dict[str, Any]:
142
+ """Create a new UI test."""
143
+ return self._client.create_ui_test(json_body)
144
+
145
+ def cancel_ui_test(self, test_id: str) -> Dict[str, Any]:
146
+ """Cancel a UI test by setting its status to Canceled."""
147
+ return self._client.cancel_ui_test(test_id)
148
+
149
+ def get_ui_report_json_files(self, uid: str) -> list:
150
+ """Get all JSON file names for a given UI report UID for Excel processing."""
151
+ endpoint = f"api/v1/ui_performance/results/{self.project_id}/{uid}?sort=loop&order=asc"
152
+ try:
153
+ response = self._client.request('get', endpoint)
154
+ file_names = set()
155
+
156
+ def clean_file_name(file_name):
157
+ # Extract JSON files only and clean the names
158
+ if file_name.endswith('.json'):
159
+ return file_name
160
+ return None
161
+
162
+ # If the response is a dict with lists as values, flatten all file_names from all values
163
+ if isinstance(response, dict):
164
+ for value in response.values():
165
+ if isinstance(value, list):
166
+ for item in value:
167
+ file_name = item.get("file_name")
168
+ if file_name:
169
+ clean_name = clean_file_name(file_name)
170
+ if clean_name:
171
+ file_names.add(clean_name)
172
+ elif isinstance(response, list):
173
+ for item in response:
174
+ file_name = item.get("file_name")
175
+ if file_name:
176
+ clean_name = clean_file_name(file_name)
177
+ if clean_name:
178
+ file_names.add(clean_name)
179
+
180
+ sorted_names = sorted(file_names)
181
+ prefix = f"https://platform.getcarrier.io/api/v1/artifacts/artifact/default/{self.project_id}/reports/"
182
+ return [prefix + name for name in sorted_names]
183
+ except Exception as e:
184
+ logger.error(f"Failed to fetch UI report JSON files: {e}")
185
+ return []
186
+
187
+ def download_ui_report_json(self, bucket: str, file_name: str) -> str:
188
+ """Download UI report JSON file content."""
189
+ endpoint = f"api/v1/artifacts/artifact/default/{self.project_id}/{bucket}/{file_name}"
190
+ try:
191
+ response = self._client.request('get', endpoint)
192
+ return response
193
+ except Exception as e:
194
+ logger.error(f"Failed to download UI report JSON: {e}")
195
+ return None
@@ -1,6 +1,8 @@
1
1
  import logging
2
2
  from datetime import datetime
3
3
  import json
4
+ import zipfile
5
+ from itertools import islice
4
6
  import traceback
5
7
  from typing import Type
6
8
  from langchain_core.tools import BaseTool, ToolException
@@ -78,14 +80,31 @@ class GetReportByIDTool(BaseTool):
78
80
 
79
81
  def _run(self, report_id: str):
80
82
  try:
81
- reports = self.api_wrapper.get_reports_list()
82
- report_data = {}
83
- for report in reports:
84
- if report_id == str(report["id"]):
85
- report_data = report
86
- break
87
-
88
- return json.dumps(report_data)
83
+ report, test_log_file_path, errors_log_file_path = self.api_wrapper.get_report_file_name(report_id)
84
+ try:
85
+ with open(errors_log_file_path, mode='r') as f:
86
+ # Use islice to read up to 100 lines
87
+ errors = list(islice(f, 100))
88
+ report["errors_log"] = errors
89
+ # Archive with errors log file path
90
+ zip_file_path = f'/tmp/{report["build_id"]}_error_log_archive.zip'
91
+
92
+ # Create zip archive
93
+ with zipfile.ZipFile(zip_file_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
94
+ arcname = os.path.basename(errors_log_file_path)
95
+ zipf.write(errors_log_file_path, arcname)
96
+
97
+ bucket_name = report["name"].replace("_", "").replace(" ", "").lower()
98
+ self.api_wrapper.upload_file(bucket_name, zip_file_path)
99
+ report["link_to_errors_file"] = f"{self.api_wrapper.url.rstrip('/')}/api/v1/artifacts/artifact/default/" \
100
+ f"{self.api_wrapper.project_id}/{bucket_name}/" \
101
+ f"{zip_file_path.replace('/tmp/', '')}"
102
+ except Exception as e:
103
+ logger.error(e)
104
+ report["errors_log"] = []
105
+ report["link_to_errors_file"] = "link is not available"
106
+
107
+ return json.dumps(report)
89
108
  except Exception:
90
109
  stacktrace = traceback.format_exc()
91
110
  logger.error(f"Error downloading reports: {stacktrace}")
@@ -164,17 +183,17 @@ class CreateExcelReportTool(BaseTool):
164
183
 
165
184
  def _process_report_by_id(self, report_id, parameters):
166
185
  """Process report using report ID."""
167
- report, file_path = self.api_wrapper.get_report_file_name(report_id)
186
+ report, test_log_file_path, errors_log_file_path = self.api_wrapper.get_report_file_name(report_id)
168
187
  carrier_report = f"{self.api_wrapper.url.rstrip('/')}/-/performance/backend/results?result_id={report_id}"
169
188
  lg_type = report.get("lg_type")
170
189
  excel_report_file_name = f'/tmp/reports_test_results_{report["build_id"]}_excel_report.xlsx'
171
190
  bucket_name = report["name"].replace("_", "").replace(" ", "").lower()
172
191
 
173
- result_stats_j = self._parse_report(file_path, lg_type, parameters["think_time"], is_absolute_file_path=True)
192
+ result_stats_j = self._parse_report(test_log_file_path, lg_type, parameters["think_time"], is_absolute_file_path=True)
174
193
  calc_thr_j = self._calculate_thresholds(result_stats_j, parameters)
175
194
 
176
195
  return self._generate_and_upload_report(
177
- result_stats_j, carrier_report, calc_thr_j, parameters, excel_report_file_name, bucket_name, file_path
196
+ result_stats_j, carrier_report, calc_thr_j, parameters, excel_report_file_name, bucket_name, test_log_file_path
178
197
  )
179
198
 
180
199
  def _process_report_by_file(self, bucket, file_name, parameters):
@@ -233,7 +252,7 @@ class CreateExcelReportTool(BaseTool):
233
252
  excel_reporter_object.prepare_headers_and_titles()
234
253
  excel_reporter_object.write_to_excel(result_stats_j, carrier_report, calc_thr_j, parameters["pct"])
235
254
 
236
- self.api_wrapper.upload_excel_report(bucket_name, excel_report_file_name)
255
+ self.api_wrapper.upload_file(bucket_name, excel_report_file_name)
237
256
 
238
257
  # Clean up
239
258
  self._cleanup(file_path, excel_report_file_name)
@@ -80,22 +80,28 @@ class RunTestByIDTool(BaseTool):
80
80
  description: str = "Execute test plan from the Carrier platform."
81
81
  args_schema: Type[BaseModel] = create_model(
82
82
  "RunTestByIdInput",
83
- test_id=(str, Field(default="", description="Test id to execute")),
83
+ test_id=(str, Field(default=None, description="Test id to execute")),
84
+ name=(str, Field(default=None, description="Test name to execute")),
84
85
  test_parameters=(dict, Field(default=None, description="Test parameters to override")),
85
86
  )
86
87
 
87
- def _run(self, test_id: str, test_parameters=None):
88
+ def _run(self, test_id=None, name=None, test_parameters=None):
88
89
  try:
90
+ if not test_id and not name:
91
+ return {"message": "Please provide test id or test name to start"}
92
+
89
93
  # Fetch test data
90
94
  tests = self.api_wrapper.get_tests_list()
91
- test_data = {}
92
- for test in tests:
93
- if test_id == str(test["id"]):
94
- test_data = test
95
- break
95
+
96
+ # Find the test data based on test_id or name
97
+ test_data = next(
98
+ (test for test in tests if
99
+ (test_id and str(test["id"]) == test_id) or (name and str(test["name"]) == name)),
100
+ None
101
+ )
96
102
 
97
103
  if not test_data:
98
- raise ValueError(f"Test with id {test_id} not found.")
104
+ raise ValueError(f"Test with id {test_id} or name {name} not found.")
99
105
 
100
106
  # Default test parameters
101
107
  default_test_parameters = test_data.get("test_parameters", [])
@@ -0,0 +1,178 @@
1
+ import logging
2
+ import re
3
+ import traceback
4
+ from typing import Type
5
+ from langchain_core.tools import BaseTool, ToolException
6
+ from pydantic.fields import Field
7
+ from pydantic import create_model, BaseModel
8
+ from .api_wrapper import CarrierAPIWrapper
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+
13
+ class CancelUITestTool(BaseTool):
14
+ api_wrapper: CarrierAPIWrapper = Field(..., description="Carrier API Wrapper instance")
15
+ name: str = "cancel_ui_test"
16
+ description: str = "Cancel a UI test or show available tests to cancel in the Carrier platform."
17
+ args_schema: Type[BaseModel] = create_model(
18
+ "CancelUITestInput",
19
+ **{
20
+ "message": (str, Field(description="User input message (e.g., 'Cancel UI test' or 'Cancel UI test 12345')")),
21
+ }
22
+ )
23
+
24
+ def _run(self, message: str):
25
+ try:
26
+ # Parse the message to extract test ID if provided
27
+ test_id = self._extract_test_id(message)
28
+
29
+ if test_id:
30
+ # User provided a specific test ID to cancel
31
+ return self._cancel_specific_test(test_id)
32
+ else:
33
+ # User didn't provide ID, show available tests to cancel
34
+ return self._show_cancelable_tests()
35
+
36
+ except Exception as e:
37
+ logger.error(f"Error in cancel UI test: {e}")
38
+ raise ToolException(f"Failed to process cancel UI test request: {str(e)}")
39
+
40
+ def _extract_test_id(self, message: str) -> str:
41
+ """Extract test ID from user message if present."""
42
+ # Look for patterns like "Cancel UI test 12345" or "cancel ui test 12345"
43
+ match = re.search(r'cancel\s+ui\s+test\s+(\d+)', message.lower())
44
+ if match:
45
+ return match.group(1)
46
+ return ""
47
+
48
+ def _show_cancelable_tests(self) -> str:
49
+ """Show list of tests that can be canceled."""
50
+ try:
51
+ # Get all UI reports/tests
52
+ reports = self.api_wrapper.get_ui_reports_list()
53
+
54
+ if not reports:
55
+ return "❌ **No UI tests found.**"
56
+
57
+ # Filter tests that can be canceled (not in final states)
58
+ final_states = {"Canceled", "Finished", "Failed"}
59
+ cancelable_tests = []
60
+
61
+ for report in reports:
62
+ test_status = report.get("test_status", {})
63
+ status = test_status.get("status", "Unknown")
64
+
65
+ # Check if status is not in final states
66
+ if status not in final_states:
67
+ cancelable_tests.append({
68
+ "id": report.get("id"),
69
+ "name": report.get("name", "Unknown"),
70
+ "status": status,
71
+ "percentage": test_status.get("percentage", 0),
72
+ "description": test_status.get("description", "")
73
+ })
74
+
75
+ if not cancelable_tests:
76
+ return """# ℹ️ No Tests Available for Cancellation
77
+
78
+ All UI tests are already in final states (Canceled, Finished, or Failed).
79
+
80
+ ## 🔍 To cancel a specific test:
81
+ Use the command: `Cancel UI test <test_id>`
82
+
83
+ Example: `Cancel UI test 12345`"""
84
+
85
+ # Build the response message
86
+ response = """# 🚫 UI Tests Available for Cancellation
87
+
88
+ The following tests are currently running and can be canceled:
89
+
90
+ ## 📋 Active Tests:
91
+ """
92
+
93
+ for test in cancelable_tests:
94
+ response += f"""
95
+ ### 🔸 Test ID: `{test['id']}`
96
+ - **Name:** `{test['name']}`
97
+ - **Status:** `{test['status']}`
98
+ - **Progress:** {test['percentage']}%
99
+ - **Description:** {test['description']}
100
+ """
101
+
102
+ response += """
103
+ ## 🚫 To cancel a specific test:
104
+ Use the command: `Cancel UI test <test_id>`
105
+
106
+ Example: `Cancel UI test 12345`"""
107
+
108
+ return response
109
+
110
+ except Exception as e:
111
+ logger.error(f"Error fetching cancelable tests: {e}")
112
+ return f"❌ **Error fetching tests:** {str(e)}"
113
+
114
+ def _cancel_specific_test(self, test_id: str) -> str:
115
+ """Cancel a specific UI test by ID."""
116
+ try:
117
+ # First, get the current status of the test
118
+ reports = self.api_wrapper.get_ui_reports_list()
119
+ target_test = None
120
+
121
+ for report in reports:
122
+ if str(report.get("id")) == test_id:
123
+ target_test = report
124
+ break
125
+
126
+ if not target_test:
127
+ return f"❌ **Test with ID `{test_id}` not found.**"
128
+
129
+ # Check if test can be canceled
130
+ test_status = target_test.get("test_status", {})
131
+ current_status = test_status.get("status", "Unknown")
132
+ final_states = {"Canceled", "Finished", "Failed"}
133
+
134
+ if current_status in final_states:
135
+ return f"""# ❌ Cannot Cancel Test
136
+
137
+ ## Test Information:
138
+ - **Test ID:** `{test_id}`
139
+ - **Name:** `{target_test.get('name', 'Unknown')}`
140
+ - **Current Status:** `{current_status}`
141
+
142
+ ## 🚫 Reason:
143
+ This test cannot be canceled because it is already in a final state (`{current_status}`).
144
+
145
+ Only tests with status **not** in `Canceled`, `Finished`, or `Failed` can be canceled."""
146
+
147
+ # Attempt to cancel the test
148
+ try:
149
+ cancel_response = self.api_wrapper.cancel_ui_test(test_id)
150
+
151
+ return f"""# ✅ UI Test Canceled Successfully!
152
+
153
+ ## Test Information:
154
+ - **Test ID:** `{test_id}`
155
+ - **Name:** `{target_test.get('name', 'Unknown')}`
156
+ - **Previous Status:** `{current_status}`
157
+ - **New Status:** `Canceled`
158
+
159
+ ## 🎯 Result:
160
+ The test has been successfully canceled and will stop executing."""
161
+
162
+ except Exception as cancel_error:
163
+ logger.error(f"Error canceling test {test_id}: {cancel_error}")
164
+ return f"""# ❌ Failed to Cancel Test
165
+
166
+ ## Test Information:
167
+ - **Test ID:** `{test_id}`
168
+ - **Name:** `{target_test.get('name', 'Unknown')}`
169
+ - **Current Status:** `{current_status}`
170
+
171
+ ## 🚫 Error:
172
+ {str(cancel_error)}
173
+
174
+ Please check the test ID and try again."""
175
+
176
+ except Exception as e:
177
+ logger.error(f"Error canceling specific test {test_id}: {e}")
178
+ return f"❌ **Error processing cancellation for test `{test_id}`: {str(e)}**"