alita-sdk 0.3.346__tar.gz → 0.3.348__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.

Potentially problematic release.


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

Files changed (367) hide show
  1. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/PKG-INFO +1 -1
  2. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/clients/artifact.py +11 -1
  3. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/clients/client.py +8 -1
  4. alita_sdk-0.3.348/alita_sdk/runtime/langchain/document_loaders/AlitaExcelLoader.py +222 -0
  5. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/tools/artifact.py +1 -0
  6. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/tools/vectorstore.py +1 -1
  7. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/tools/vectorstore_base.py +1 -1
  8. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/figma/api_wrapper.py +1 -1
  9. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/testrail/api_wrapper.py +138 -55
  10. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk.egg-info/PKG-INFO +1 -1
  11. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/pyproject.toml +1 -1
  12. alita_sdk-0.3.346/alita_sdk/runtime/langchain/document_loaders/AlitaExcelLoader.py +0 -136
  13. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/LICENSE +0 -0
  14. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/README.md +0 -0
  15. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/__init__.py +0 -0
  16. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/community/__init__.py +0 -0
  17. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/community/utils.py +0 -0
  18. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/configurations/__init__.py +0 -0
  19. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/configurations/ado.py +0 -0
  20. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/configurations/azure_search.py +0 -0
  21. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/configurations/bigquery.py +0 -0
  22. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/configurations/bitbucket.py +0 -0
  23. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/configurations/browser.py +0 -0
  24. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/configurations/carrier.py +0 -0
  25. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/configurations/confluence.py +0 -0
  26. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/configurations/delta_lake.py +0 -0
  27. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/configurations/embedding.py +0 -0
  28. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/configurations/figma.py +0 -0
  29. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/configurations/github.py +0 -0
  30. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/configurations/gitlab.py +0 -0
  31. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/configurations/google_places.py +0 -0
  32. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/configurations/jira.py +0 -0
  33. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/configurations/pgvector.py +0 -0
  34. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/configurations/postman.py +0 -0
  35. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/configurations/qtest.py +0 -0
  36. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/configurations/rally.py +0 -0
  37. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/configurations/report_portal.py +0 -0
  38. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/configurations/salesforce.py +0 -0
  39. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/configurations/service_now.py +0 -0
  40. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/configurations/sharepoint.py +0 -0
  41. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/configurations/slack.py +0 -0
  42. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/configurations/sonar.py +0 -0
  43. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/configurations/sql.py +0 -0
  44. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/configurations/testio.py +0 -0
  45. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/configurations/testrail.py +0 -0
  46. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/configurations/xray.py +0 -0
  47. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/configurations/zephyr.py +0 -0
  48. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/configurations/zephyr_enterprise.py +0 -0
  49. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/configurations/zephyr_essential.py +0 -0
  50. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/__init__.py +0 -0
  51. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/clients/__init__.py +0 -0
  52. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/clients/datasource.py +0 -0
  53. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/clients/prompt.py +0 -0
  54. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/__init__.py +0 -0
  55. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/agents/__init__.py +0 -0
  56. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/agents/xml_chat.py +0 -0
  57. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/assistant.py +0 -0
  58. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/chat_message_template.py +0 -0
  59. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/constants.py +0 -0
  60. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/document_loaders/AlitaBDDScenariosLoader.py +0 -0
  61. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/document_loaders/AlitaCSVLoader.py +0 -0
  62. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/document_loaders/AlitaConfluenceLoader.py +0 -0
  63. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/document_loaders/AlitaDirectoryLoader.py +0 -0
  64. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/document_loaders/AlitaDocxMammothLoader.py +0 -0
  65. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/document_loaders/AlitaGitRepoLoader.py +0 -0
  66. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/document_loaders/AlitaImageLoader.py +0 -0
  67. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/document_loaders/AlitaJSONLoader.py +0 -0
  68. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/document_loaders/AlitaJiraLoader.py +0 -0
  69. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/document_loaders/AlitaMarkdownLoader.py +0 -0
  70. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/document_loaders/AlitaPDFLoader.py +0 -0
  71. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/document_loaders/AlitaPowerPointLoader.py +0 -0
  72. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/document_loaders/AlitaPythonLoader.py +0 -0
  73. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/document_loaders/AlitaQtestLoader.py +0 -0
  74. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/document_loaders/AlitaTableLoader.py +0 -0
  75. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/document_loaders/AlitaTextLoader.py +0 -0
  76. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/document_loaders/ImageParser.py +0 -0
  77. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/document_loaders/__init__.py +0 -0
  78. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/document_loaders/constants.py +0 -0
  79. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/document_loaders/utils.py +0 -0
  80. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/indexer.py +0 -0
  81. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/interfaces/__init__.py +0 -0
  82. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/interfaces/kwextractor.py +0 -0
  83. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/interfaces/llm_processor.py +0 -0
  84. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/interfaces/loaders.py +0 -0
  85. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/interfaces/splitters.py +0 -0
  86. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/langraph_agent.py +0 -0
  87. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/mixedAgentParser.py +0 -0
  88. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/mixedAgentRenderes.py +0 -0
  89. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/retrievers/AlitaRetriever.py +0 -0
  90. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/retrievers/VectorstoreRetriever.py +0 -0
  91. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/retrievers/__init__.py +0 -0
  92. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/store_manager.py +0 -0
  93. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/tools/__init__.py +0 -0
  94. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/tools/bdd_parser/__init__.py +0 -0
  95. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/tools/bdd_parser/bdd_exceptions.py +0 -0
  96. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/tools/bdd_parser/bdd_parser.py +0 -0
  97. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/tools/bdd_parser/feature_types.py +0 -0
  98. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/tools/bdd_parser/parser.py +0 -0
  99. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/tools/git.py +0 -0
  100. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/tools/log.py +0 -0
  101. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/tools/quota.py +0 -0
  102. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/tools/state.py +0 -0
  103. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/tools/utils.py +0 -0
  104. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/tools/vector.py +0 -0
  105. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/langchain/utils.py +0 -0
  106. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/llms/__init__.py +0 -0
  107. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/llms/preloaded.py +0 -0
  108. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/toolkits/__init__.py +0 -0
  109. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/toolkits/application.py +0 -0
  110. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/toolkits/artifact.py +0 -0
  111. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/toolkits/configurations.py +0 -0
  112. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/toolkits/datasource.py +0 -0
  113. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/toolkits/prompt.py +0 -0
  114. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/toolkits/subgraph.py +0 -0
  115. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/toolkits/tools.py +0 -0
  116. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/toolkits/vectorstore.py +0 -0
  117. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/tools/__init__.py +0 -0
  118. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/tools/agent.py +0 -0
  119. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/tools/application.py +0 -0
  120. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/tools/datasource.py +0 -0
  121. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/tools/echo.py +0 -0
  122. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/tools/function.py +0 -0
  123. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/tools/graph.py +0 -0
  124. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/tools/indexer_tool.py +0 -0
  125. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/tools/llm.py +0 -0
  126. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/tools/loop.py +0 -0
  127. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/tools/loop_output.py +0 -0
  128. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/tools/mcp_server_tool.py +0 -0
  129. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/tools/pgvector_search.py +0 -0
  130. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/tools/prompt.py +0 -0
  131. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/tools/router.py +0 -0
  132. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/tools/sandbox.py +0 -0
  133. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/tools/tool.py +0 -0
  134. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/utils/AlitaCallback.py +0 -0
  135. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/utils/__init__.py +0 -0
  136. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/utils/constants.py +0 -0
  137. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/utils/evaluate.py +0 -0
  138. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/utils/logging.py +0 -0
  139. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/utils/save_dataframe.py +0 -0
  140. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/utils/streamlit.py +0 -0
  141. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/utils/toolkit_runtime.py +0 -0
  142. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/utils/toolkit_utils.py +0 -0
  143. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/runtime/utils/utils.py +0 -0
  144. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/__init__.py +0 -0
  145. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/ado/__init__.py +0 -0
  146. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/ado/repos/__init__.py +0 -0
  147. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/ado/repos/repos_wrapper.py +0 -0
  148. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/ado/test_plan/__init__.py +0 -0
  149. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/ado/test_plan/test_plan_wrapper.py +0 -0
  150. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/ado/utils.py +0 -0
  151. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/ado/wiki/__init__.py +0 -0
  152. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/ado/wiki/ado_wrapper.py +0 -0
  153. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/ado/work_item/__init__.py +0 -0
  154. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/ado/work_item/ado_wrapper.py +0 -0
  155. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/advanced_jira_mining/__init__.py +0 -0
  156. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/advanced_jira_mining/data_mining_wrapper.py +0 -0
  157. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/aws/__init__.py +0 -0
  158. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/aws/delta_lake/__init__.py +0 -0
  159. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/aws/delta_lake/api_wrapper.py +0 -0
  160. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/aws/delta_lake/schemas.py +0 -0
  161. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/aws/delta_lake/tool.py +0 -0
  162. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/azure_ai/__init__.py +0 -0
  163. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/azure_ai/search/__init__.py +0 -0
  164. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/azure_ai/search/api_wrapper.py +0 -0
  165. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/base/__init__.py +0 -0
  166. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/base/tool.py +0 -0
  167. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/base_indexer_toolkit.py +0 -0
  168. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/bitbucket/__init__.py +0 -0
  169. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/bitbucket/api_wrapper.py +0 -0
  170. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/bitbucket/bitbucket_constants.py +0 -0
  171. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/bitbucket/cloud_api_wrapper.py +0 -0
  172. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/browser/__init__.py +0 -0
  173. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/browser/crawler.py +0 -0
  174. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/browser/duck_duck_go_search.py +0 -0
  175. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/browser/google_search_rag.py +0 -0
  176. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/browser/utils.py +0 -0
  177. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/browser/wiki.py +0 -0
  178. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/carrier/__init__.py +0 -0
  179. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/carrier/api_wrapper.py +0 -0
  180. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/carrier/backend_reports_tool.py +0 -0
  181. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/carrier/backend_tests_tool.py +0 -0
  182. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/carrier/cancel_ui_test_tool.py +0 -0
  183. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/carrier/carrier_sdk.py +0 -0
  184. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/carrier/create_ui_excel_report_tool.py +0 -0
  185. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/carrier/create_ui_test_tool.py +0 -0
  186. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/carrier/excel_reporter.py +0 -0
  187. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/carrier/lighthouse_excel_reporter.py +0 -0
  188. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/carrier/run_ui_test_tool.py +0 -0
  189. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/carrier/tickets_tool.py +0 -0
  190. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/carrier/tools.py +0 -0
  191. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/carrier/ui_reports_tool.py +0 -0
  192. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/carrier/update_ui_test_schedule_tool.py +0 -0
  193. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/carrier/utils.py +0 -0
  194. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/chunkers/__init__.py +0 -0
  195. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/chunkers/code/__init__.py +0 -0
  196. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/chunkers/code/codeparser.py +0 -0
  197. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/chunkers/code/constants.py +0 -0
  198. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/chunkers/code/treesitter/__init__.py +0 -0
  199. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/chunkers/code/treesitter/treesitter.py +0 -0
  200. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/chunkers/code/treesitter/treesitter_c.py +0 -0
  201. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/chunkers/code/treesitter/treesitter_cpp.py +0 -0
  202. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/chunkers/code/treesitter/treesitter_cs.py +0 -0
  203. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/chunkers/code/treesitter/treesitter_go.py +0 -0
  204. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/chunkers/code/treesitter/treesitter_hs.py +0 -0
  205. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/chunkers/code/treesitter/treesitter_java.py +0 -0
  206. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/chunkers/code/treesitter/treesitter_js.py +0 -0
  207. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/chunkers/code/treesitter/treesitter_kt.py +0 -0
  208. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/chunkers/code/treesitter/treesitter_py.py +0 -0
  209. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/chunkers/code/treesitter/treesitter_rb.py +0 -0
  210. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/chunkers/code/treesitter/treesitter_registry.py +0 -0
  211. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/chunkers/code/treesitter/treesitter_rs.py +0 -0
  212. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/chunkers/code/treesitter/treesitter_ts.py +0 -0
  213. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/chunkers/models.py +0 -0
  214. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/chunkers/sematic/__init__.py +0 -0
  215. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/chunkers/sematic/base.py +0 -0
  216. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/chunkers/sematic/json_chunker.py +0 -0
  217. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/chunkers/sematic/markdown_chunker.py +0 -0
  218. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/chunkers/sematic/proposal_chunker.py +0 -0
  219. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/chunkers/sematic/statistical_chunker.py +0 -0
  220. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/chunkers/utils.py +0 -0
  221. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/cloud/__init__.py +0 -0
  222. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/cloud/aws/__init__.py +0 -0
  223. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/cloud/aws/api_wrapper.py +0 -0
  224. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/cloud/azure/__init__.py +0 -0
  225. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/cloud/azure/api_wrapper.py +0 -0
  226. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/cloud/gcp/__init__.py +0 -0
  227. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/cloud/gcp/api_wrapper.py +0 -0
  228. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/cloud/k8s/__init__.py +0 -0
  229. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/cloud/k8s/api_wrapper.py +0 -0
  230. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/code/__init__.py +0 -0
  231. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/code/linter/__init__.py +0 -0
  232. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/code/linter/api_wrapper.py +0 -0
  233. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/code/loaders/codesearcher.py +0 -0
  234. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/code/sonar/__init__.py +0 -0
  235. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/code/sonar/api_wrapper.py +0 -0
  236. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/confluence/__init__.py +0 -0
  237. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/confluence/api_wrapper.py +0 -0
  238. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/confluence/loader.py +0 -0
  239. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/confluence/utils.py +0 -0
  240. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/custom_open_api/__init__.py +0 -0
  241. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/custom_open_api/api_wrapper.py +0 -0
  242. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/elastic/__init__.py +0 -0
  243. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/elastic/api_wrapper.py +0 -0
  244. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/elitea_base.py +0 -0
  245. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/figma/__init__.py +0 -0
  246. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/github/__init__.py +0 -0
  247. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/github/api_wrapper.py +0 -0
  248. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/github/github_client.py +0 -0
  249. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/github/graphql_client_wrapper.py +0 -0
  250. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/github/schemas.py +0 -0
  251. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/github/tool.py +0 -0
  252. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/github/tool_prompts.py +0 -0
  253. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/gitlab/__init__.py +0 -0
  254. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/gitlab/api_wrapper.py +0 -0
  255. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/gitlab/tools.py +0 -0
  256. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/gitlab/utils.py +0 -0
  257. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/gitlab_org/__init__.py +0 -0
  258. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/gitlab_org/api_wrapper.py +0 -0
  259. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/gmail/__init__.py +0 -0
  260. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/gmail/gmail_wrapper.py +0 -0
  261. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/gmail/utils.py +0 -0
  262. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/google/__init__.py +0 -0
  263. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/google/bigquery/__init__.py +0 -0
  264. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/google/bigquery/api_wrapper.py +0 -0
  265. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/google/bigquery/schemas.py +0 -0
  266. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/google/bigquery/tool.py +0 -0
  267. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/google_places/__init__.py +0 -0
  268. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/google_places/api_wrapper.py +0 -0
  269. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/jira/__init__.py +0 -0
  270. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/jira/api_wrapper.py +0 -0
  271. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/keycloak/__init__.py +0 -0
  272. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/keycloak/api_wrapper.py +0 -0
  273. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/llm/__init__.py +0 -0
  274. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/llm/img_utils.py +0 -0
  275. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/llm/llm_utils.py +0 -0
  276. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/localgit/__init__.py +0 -0
  277. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/localgit/local_git.py +0 -0
  278. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/localgit/tool.py +0 -0
  279. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/memory/__init__.py +0 -0
  280. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/non_code_indexer_toolkit.py +0 -0
  281. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/ocr/__init__.py +0 -0
  282. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/ocr/api_wrapper.py +0 -0
  283. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/ocr/text_detection.py +0 -0
  284. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/openapi/__init__.py +0 -0
  285. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/pandas/__init__.py +0 -0
  286. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/pandas/api_wrapper.py +0 -0
  287. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/pandas/dataframe/__init__.py +0 -0
  288. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/pandas/dataframe/errors.py +0 -0
  289. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/pandas/dataframe/executor/__init__.py +0 -0
  290. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/pandas/dataframe/executor/code_environment.py +0 -0
  291. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/pandas/dataframe/executor/code_executor.py +0 -0
  292. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/pandas/dataframe/generator/__init__.py +0 -0
  293. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/pandas/dataframe/generator/base.py +0 -0
  294. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/pandas/dataframe/generator/code_cleaning.py +0 -0
  295. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/pandas/dataframe/generator/code_validator.py +0 -0
  296. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/pandas/dataframe/prompts.py +0 -0
  297. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/pandas/dataframe/serializer.py +0 -0
  298. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/pandas/dataframe/utils.py +0 -0
  299. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/pandas/statsmodels/__init__.py +0 -0
  300. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/pandas/statsmodels/base_stats.py +0 -0
  301. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/pandas/statsmodels/descriptive.py +0 -0
  302. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/pandas/statsmodels/hypothesis_testing.py +0 -0
  303. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/pandas/statsmodels/regression.py +0 -0
  304. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/postman/__init__.py +0 -0
  305. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/postman/api_wrapper.py +0 -0
  306. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/postman/postman_analysis.py +0 -0
  307. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/pptx/__init__.py +0 -0
  308. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/pptx/pptx_wrapper.py +0 -0
  309. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/qtest/__init__.py +0 -0
  310. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/qtest/api_wrapper.py +0 -0
  311. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/qtest/tool.py +0 -0
  312. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/rally/__init__.py +0 -0
  313. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/rally/api_wrapper.py +0 -0
  314. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/report_portal/__init__.py +0 -0
  315. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/report_portal/api_wrapper.py +0 -0
  316. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/report_portal/report_portal_client.py +0 -0
  317. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/salesforce/__init__.py +0 -0
  318. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/salesforce/api_wrapper.py +0 -0
  319. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/salesforce/model.py +0 -0
  320. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/servicenow/__init__.py +0 -0
  321. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/servicenow/api_wrapper.py +0 -0
  322. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/servicenow/servicenow_client.py +0 -0
  323. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/sharepoint/__init__.py +0 -0
  324. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/sharepoint/api_wrapper.py +0 -0
  325. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/sharepoint/authorization_helper.py +0 -0
  326. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/sharepoint/utils.py +0 -0
  327. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/slack/__init__.py +0 -0
  328. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/slack/api_wrapper.py +0 -0
  329. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/sql/__init__.py +0 -0
  330. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/sql/api_wrapper.py +0 -0
  331. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/sql/models.py +0 -0
  332. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/testio/__init__.py +0 -0
  333. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/testio/api_wrapper.py +0 -0
  334. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/testrail/__init__.py +0 -0
  335. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/utils/__init__.py +0 -0
  336. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/utils/available_tools_decorator.py +0 -0
  337. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/utils/content_parser.py +0 -0
  338. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/vector_adapters/VectorStoreAdapter.py +0 -0
  339. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/vector_adapters/__init__.py +0 -0
  340. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/xray/__init__.py +0 -0
  341. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/xray/api_wrapper.py +0 -0
  342. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/yagmail/__init__.py +0 -0
  343. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/yagmail/yagmail_wrapper.py +0 -0
  344. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/zephyr/Zephyr.py +0 -0
  345. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/zephyr/__init__.py +0 -0
  346. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/zephyr/api_wrapper.py +0 -0
  347. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/zephyr/rest_client.py +0 -0
  348. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/zephyr_enterprise/__init__.py +0 -0
  349. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/zephyr_enterprise/api_wrapper.py +0 -0
  350. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/zephyr_enterprise/zephyr_enterprise.py +0 -0
  351. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/zephyr_essential/__init__.py +0 -0
  352. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/zephyr_essential/api_wrapper.py +0 -0
  353. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/zephyr_essential/client.py +0 -0
  354. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/zephyr_scale/__init__.py +0 -0
  355. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/zephyr_scale/api_wrapper.py +0 -0
  356. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/zephyr_squad/__init__.py +0 -0
  357. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/zephyr_squad/api_wrapper.py +0 -0
  358. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk/tools/zephyr_squad/zephyr_squad_cloud_client.py +0 -0
  359. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk.egg-info/SOURCES.txt +0 -0
  360. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk.egg-info/dependency_links.txt +0 -0
  361. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk.egg-info/requires.txt +0 -0
  362. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/alita_sdk.egg-info/top_level.txt +0 -0
  363. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/setup.cfg +0 -0
  364. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/tests/test_ado_analysis.py +0 -0
  365. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/tests/test_github_analysis.py +0 -0
  366. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/tests/test_gitlab_analysis.py +0 -0
  367. {alita_sdk-0.3.346 → alita_sdk-0.3.348}/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.346
3
+ Version: 0.3.348
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
@@ -42,7 +42,17 @@ class Artifact:
42
42
  return f"{data['error']}. {data['content'] if data['content'] else ''}"
43
43
  detected = chardet.detect(data)
44
44
  if detected['encoding'] is not None:
45
- return data.decode(detected['encoding'])
45
+ try:
46
+ return data.decode(detected['encoding'])
47
+ except Exception:
48
+ logger.error("Error while default encoding")
49
+ return parse_file_content(file_name=artifact_name,
50
+ file_content=data,
51
+ is_capture_image=is_capture_image,
52
+ page_number=page_number,
53
+ sheet_name=sheet_name,
54
+ excel_by_sheets=excel_by_sheets,
55
+ llm=llm)
46
56
  else:
47
57
  return parse_file_content(file_name=artifact_name,
48
58
  file_content=data,
@@ -69,6 +69,7 @@ class AlitaClient:
69
69
  self.configurations_url = f'{self.base_url}{self.api_path}/integrations/integrations/default/{self.project_id}?section=configurations&unsecret=true'
70
70
  self.ai_section_url = f'{self.base_url}{self.api_path}/integrations/integrations/default/{self.project_id}?section=ai'
71
71
  self.configurations: list = configurations or []
72
+ self.model_timeout = kwargs.get('model_timeout', 120)
72
73
 
73
74
  def get_mcp_toolkits(self):
74
75
  if user_id := self._get_real_user_id():
@@ -85,7 +86,12 @@ class AlitaClient:
85
86
  # This loop iterates over each key-value pair in the arguments dictionary,
86
87
  # and if a value is a Pydantic object, it replaces it with its dictionary representation using .dict().
87
88
  for arg_name, arg_value in params.get('params', {}).get('arguments', {}).items():
88
- if hasattr(arg_value, "dict") and callable(arg_value.dict):
89
+ if isinstance(arg_value, list):
90
+ params['params']['arguments'][arg_name] = [
91
+ item.dict() if hasattr(item, "dict") and callable(item.dict) else item
92
+ for item in arg_value
93
+ ]
94
+ elif hasattr(arg_value, "dict") and callable(arg_value.dict):
89
95
  params['params']['arguments'][arg_name] = arg_value.dict()
90
96
  #
91
97
  response = requests.post(url, headers=self.headers, json=params, verify=False)
@@ -179,6 +185,7 @@ class AlitaClient:
179
185
  model=embedding_model,
180
186
  api_key=self.auth_token,
181
187
  openai_organization=str(self.project_id),
188
+ request_timeout=self.model_timeout
182
189
  )
183
190
 
184
191
  def get_llm(self, model_name: str, model_config: dict) -> ChatOpenAI:
@@ -0,0 +1,222 @@
1
+ # Copyright (c) 2023 Artem Rozumenko
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ import io
15
+ import os
16
+ from typing import Iterator
17
+ import pandas as pd
18
+ from json import loads
19
+
20
+ from openpyxl import load_workbook
21
+ from xlrd import open_workbook
22
+ from langchain_core.documents import Document
23
+ from .AlitaTableLoader import AlitaTableLoader
24
+
25
+ cell_delimiter = " | "
26
+
27
+ class AlitaExcelLoader(AlitaTableLoader):
28
+ excel_by_sheets: bool = False
29
+ sheet_name: str = None
30
+ return_type: str = 'str'
31
+ file_name: str = None
32
+
33
+ def __init__(self, **kwargs):
34
+ if not kwargs.get('file_path'):
35
+ file_content = kwargs.get('file_content')
36
+ if file_content:
37
+ self.file_name = kwargs.get('file_name')
38
+ kwargs['file_path'] = io.BytesIO(file_content)
39
+ else:
40
+ self.file_name = kwargs.get('file_path')
41
+ super().__init__(**kwargs)
42
+ self.excel_by_sheets = kwargs.get('excel_by_sheets')
43
+ self.return_type = kwargs.get('return_type')
44
+ self.sheet_name = kwargs.get('sheet_name')
45
+
46
+ def get_content(self):
47
+ try:
48
+ # Determine file extension
49
+ file_extension = os.path.splitext(self.file_name)[-1].lower()
50
+
51
+ if file_extension == '.xlsx':
52
+ # Use openpyxl for .xlsx files
53
+ return self._read_xlsx()
54
+ elif file_extension == '.xls':
55
+ # Use xlrd for .xls files
56
+ return self._read_xls()
57
+ else:
58
+ raise ValueError(f"Unsupported file format: {file_extension}")
59
+ except Exception as e:
60
+ return f"Error reading Excel file: {e}"
61
+
62
+ def _read_xlsx(self):
63
+ """
64
+ Reads .xlsx files using openpyxl.
65
+ """
66
+ workbook = load_workbook(self.file_path, data_only=True) # `data_only=True` ensures we get cell values, not formulas
67
+
68
+ if self.sheet_name:
69
+ # If a specific sheet name is provided, parse only that sheet
70
+ if self.sheet_name in workbook.sheetnames:
71
+ sheet_content = self.parse_sheet(workbook[self.sheet_name])
72
+ return sheet_content
73
+ else:
74
+ raise ValueError(f"Sheet '{self.sheet_name}' does not exist in the workbook.")
75
+ elif self.excel_by_sheets:
76
+ # Parse each sheet individually and return as a dictionary
77
+ result = {}
78
+ for sheet_name in workbook.sheetnames:
79
+ sheet_content = self.parse_sheet(workbook[sheet_name])
80
+ result[sheet_name] = sheet_content
81
+ return result
82
+ else:
83
+ # Combine all sheets into a single string result
84
+ result = []
85
+ for sheet_name in workbook.sheetnames:
86
+ sheet_content = self.parse_sheet(workbook[sheet_name])
87
+ result.append(f"====== Sheet name: {sheet_name} ======\n{sheet_content}")
88
+ return "\n\n".join(result)
89
+
90
+ def _read_xls(self):
91
+ """
92
+ Reads .xls files using xlrd.
93
+ """
94
+ workbook = open_workbook(filename=self.file_name, file_contents=self.file_content)
95
+
96
+ if self.sheet_name:
97
+ # If a specific sheet name is provided, parse only that sheet
98
+ if self.sheet_name in workbook.sheet_names():
99
+ sheet = workbook.sheet_by_name(self.sheet_name)
100
+ sheet_content = self.parse_sheet_xls(sheet)
101
+ return sheet_content
102
+ else:
103
+ raise ValueError(f"Sheet '{self.sheet_name}' does not exist in the workbook.")
104
+ elif self.excel_by_sheets:
105
+ # Parse each sheet individually and return as a dictionary
106
+ result = {}
107
+ for sheet_name in workbook.sheet_names():
108
+ sheet = workbook.sheet_by_name(sheet_name)
109
+ sheet_content = self.parse_sheet_xls(sheet)
110
+ result[sheet_name] = sheet_content
111
+ return result
112
+ else:
113
+ # Combine all sheets into a single string result
114
+ result = []
115
+ for sheet_name in workbook.sheet_names():
116
+ sheet = workbook.sheet_by_name(sheet_name)
117
+ sheet_content = self.parse_sheet_xls(sheet)
118
+ result.append(f"====== Sheet name: {sheet_name} ======\n{sheet_content}")
119
+ return "\n\n".join(result)
120
+
121
+ def parse_sheet(self, sheet):
122
+ """
123
+ Parses a single .xlsx sheet, extracting text and hyperlinks, and formats them.
124
+ """
125
+ sheet_content = []
126
+
127
+ for row in sheet.iter_rows():
128
+ row_content = []
129
+ for cell in row:
130
+ if cell.hyperlink:
131
+ # If the cell has a hyperlink, format it as Markdown
132
+ hyperlink = cell.hyperlink.target
133
+ cell_value = cell.value or '' # Use cell value or empty string
134
+ row_content.append(f"[{cell_value}]({hyperlink})")
135
+ else:
136
+ # If no hyperlink, use the cell value (computed value if formula)
137
+ row_content.append(str(cell.value) if cell.value is not None else "")
138
+ # Join the row content into a single line using `|` as the delimiter
139
+ sheet_content.append(cell_delimiter.join(row_content))
140
+
141
+ # Format the sheet content based on the return type
142
+ return self._format_sheet_content(sheet_content)
143
+
144
+ def parse_sheet_xls(self, sheet):
145
+ """
146
+ Parses a single .xls sheet using xlrd, extracting text and hyperlinks, and formats them.
147
+ """
148
+ sheet_content = []
149
+
150
+ # Extract hyperlink map (if available)
151
+ hyperlink_map = getattr(sheet, 'hyperlink_map', {})
152
+
153
+ for row_idx in range(sheet.nrows):
154
+ row_content = []
155
+ for col_idx in range(sheet.ncols):
156
+ cell = sheet.cell(row_idx, col_idx)
157
+ cell_value = cell.value
158
+
159
+ # Check if the cell has a hyperlink
160
+ cell_address = (row_idx, col_idx)
161
+ if cell_address in hyperlink_map:
162
+ hyperlink = hyperlink_map[cell_address].url_or_path
163
+ if cell_value:
164
+ row_content.append(f"[{cell_value}]({hyperlink})")
165
+ else:
166
+ row_content.append(str(cell_value) if cell_value is not None else "")
167
+ # Join the row content into a single line using `|` as the delimiter
168
+ sheet_content.append(cell_delimiter.join(row_content))
169
+
170
+ # Format the sheet content based on the return type
171
+ return self._format_sheet_content(sheet_content)
172
+
173
+ def _format_sheet_content(self, sheet_content):
174
+ """
175
+ Formats the sheet content based on the return type.
176
+ """
177
+ if self.return_type == 'dict':
178
+ # Convert to a list of dictionaries (each row is a dictionary)
179
+ headers = sheet_content[0].split(cell_delimiter) if sheet_content else []
180
+ data_rows = sheet_content[1:] if len(sheet_content) > 1 else []
181
+ return [dict(zip(headers, row.split(cell_delimiter))) for row in data_rows]
182
+ elif self.return_type == 'csv':
183
+ # Return as CSV (newline-separated rows, comma-separated values)
184
+ return "\n".join([",".join(row.split(cell_delimiter)) for row in sheet_content])
185
+ else:
186
+ # Default: Return as plain text (newline-separated rows, pipe-separated values)
187
+ return "\n".join(sheet_content)
188
+
189
+ def load(self) -> list:
190
+ docs = []
191
+ content_per_sheet = self.get_content()
192
+ for sheet_name, content in content_per_sheet.items():
193
+ metadata = {
194
+ "source": f'{self.file_path}:{sheet_name}',
195
+ "sheet_name": sheet_name,
196
+ "file_type": "excel",
197
+ "excel_by_sheets": self.excel_by_sheets,
198
+ "return_type": self.return_type,
199
+ }
200
+ docs.append(Document(page_content=f"Sheet: {sheet_name}\n {str(content)}", metadata=metadata))
201
+ return docs
202
+
203
+ def read(self, lazy: bool = False):
204
+ df = pd.read_excel(self.file_path, sheet_name=None)
205
+ docs = []
206
+ for key in df.keys():
207
+ if self.raw_content:
208
+ docs.append(df[key].to_string())
209
+ else:
210
+ for record in loads(df[key].to_json(orient='records')):
211
+ docs.append(record)
212
+ return docs
213
+
214
+ def read_lazy(self) -> Iterator[dict]:
215
+ df = pd.read_excel(self.file_path, sheet_name=None)
216
+ for key in df.keys():
217
+ if self.raw_content:
218
+ yield df[key].to_string()
219
+ else:
220
+ for record in loads(df[key].to_json(orient='records')):
221
+ yield record
222
+ return
@@ -71,6 +71,7 @@ class ArtifactWrapper(NonCodeIndexerToolkit):
71
71
  }
72
72
 
73
73
  def _base_loader(self, **kwargs) -> Generator[Document, None, None]:
74
+ self._log_tool_event(message=f"Loading the files from artifact's bucket. {kwargs=}", tool_name="loader")
74
75
  try:
75
76
  all_files = self.list_files(self.bucket, False)['rows']
76
77
  except Exception as e:
@@ -137,7 +137,7 @@ class VectorStoreWrapper(BaseToolApiWrapper):
137
137
  embedding_model_params: dict
138
138
  vectorstore_type: str
139
139
  vectorstore_params: dict
140
- max_docs_per_add: int = 100
140
+ max_docs_per_add: int = 20
141
141
  dataset: str = None
142
142
  embedding: Any = None
143
143
  vectorstore: Any = None
@@ -135,7 +135,7 @@ class VectorStoreWrapperBase(BaseToolApiWrapper):
135
135
  embedding_model: Optional[str] = None
136
136
  vectorstore_type: Optional[str] = None
137
137
  vectorstore_params: Optional[dict] = None
138
- max_docs_per_add: int = 100
138
+ max_docs_per_add: int = 20
139
139
  dataset: Optional[str] = None
140
140
  vectorstore: Any = None
141
141
  pg_helper: Any = None
@@ -22,7 +22,7 @@ GLOBAL_REMOVE = []
22
22
  GLOBAL_DEPTH_START = 4
23
23
  GLOBAL_DEPTH_END = 6
24
24
  EXTRA_PARAMS = (
25
- Optional[Dict[str, Union[str, int, None]]],
25
+ Optional[Dict[str, Union[str, int, List, None]]],
26
26
  Field(
27
27
  description=(
28
28
  "Additional parameters for customizing response processing:\n"
@@ -298,6 +298,18 @@ updateCase = create_model(
298
298
  ),
299
299
  )
300
300
 
301
+ getSuites = create_model(
302
+ "getSuites",
303
+ project_id=(str, Field(description="Project id")),
304
+ output_format=(
305
+ str,
306
+ Field(
307
+ default="json",
308
+ description="Desired output format. Supported values: 'json', 'csv', 'markdown'. Defaults to 'json'.",
309
+ ),
310
+ ),
311
+ )
312
+
301
313
  SUPPORTED_KEYS = {
302
314
  "id", "title", "section_id", "template_id", "type_id", "priority_id", "milestone_id",
303
315
  "refs", "created_by", "created_on", "updated_by", "updated_on", "estimate",
@@ -330,29 +342,74 @@ class TestrailAPIWrapper(NonCodeIndexerToolkit):
330
342
  cls._client = TestRailAPI(url, email, password)
331
343
  return super().validate_toolkit(values)
332
344
 
333
- def _validate_suite_mode_requirements(self, project_id: str, suite_id: Optional[str] = None) -> None:
345
+ def _is_suite_id_required(self, project_id: str) -> bool:
334
346
  """
335
- Validate if project requires suite_id when in multiple suite mode.
336
-
347
+ Returns True if project requires suite_id (multiple suite or baselines mode), otherwise False.
337
348
  Args:
338
349
  project_id: The TestRail project ID to check
339
- suite_id: The suite ID if provided (optional)
340
- custom_error_msg: Custom error message to use (optional)
341
-
342
- Raises:
343
- ToolException: If project is in multiple suite mode and no suite_id is provided
344
350
  """
345
- if suite_id:
346
- return # No validation needed if suite_id is already provided
347
-
348
351
  try:
349
352
  project = self._client.projects.get_project(project_id=project_id)
350
353
  # 1 for single suite mode, 2 for single suite + baselines, 3 for multiple suites
351
354
  suite_mode = project.get('suite_mode', 1)
352
- if suite_mode == 3:
353
- raise ToolException("Project is in multiple suite mode, please provide suite_id to extract test cases.")
354
- except StatusCodeError as e:
355
- logger.warning(f"Unable to check project suite mode: {e}")
355
+ return suite_mode == 2 or suite_mode == 3
356
+ except StatusCodeError:
357
+ return False
358
+
359
+ def _fetch_cases_with_suite_handling(
360
+ self,
361
+ project_id: str,
362
+ suite_id: Optional[str] = None,
363
+ **api_params
364
+ ) -> List[Dict]:
365
+ """
366
+ Unified method to fetch test cases with proper TestRail suite mode handling.
367
+
368
+ Args:
369
+ project_id: The TestRail project ID
370
+ suite_id: Optional suite ID to filter by
371
+ **api_params: Additional parameters to pass to the get_cases API call
372
+
373
+ Returns:
374
+ List of test case dictionaries
375
+ """
376
+ def _extract_cases_from_response(response):
377
+ """Extract cases from API response, supporting both old and new testrail_api versions."""
378
+ return response.get('cases', []) if isinstance(response, dict) else response
379
+
380
+ suite_required = self._is_suite_id_required(project_id=project_id)
381
+ all_cases = []
382
+
383
+ if suite_required:
384
+ # Suite modes 2 & 3: Require suite_id parameter
385
+ if suite_id:
386
+ response = self._client.cases.get_cases(
387
+ project_id=project_id, suite_id=int(suite_id), **api_params
388
+ )
389
+ cases_from_suite = _extract_cases_from_response(response)
390
+ all_cases.extend(cases_from_suite)
391
+ else:
392
+ suites = self._get_raw_suites(project_id)
393
+ suite_ids = [suite['id'] for suite in suites if 'id' in suite]
394
+ for current_suite_id in suite_ids:
395
+ try:
396
+ response = self._client.cases.get_cases(
397
+ project_id=project_id, suite_id=int(current_suite_id), **api_params
398
+ )
399
+ cases_from_suite = _extract_cases_from_response(response)
400
+ all_cases.extend(cases_from_suite)
401
+ except StatusCodeError:
402
+ continue
403
+ else:
404
+ # Suite mode 1: Can fetch all cases directly without suite_id
405
+ try:
406
+ response = self._client.cases.get_cases(project_id=project_id, **api_params)
407
+ cases_from_project = _extract_cases_from_response(response)
408
+ all_cases.extend(cases_from_project)
409
+ except StatusCodeError as e:
410
+ logger.warning(f"Unable to fetch cases at project level: {e}")
411
+
412
+ return all_cases
356
413
 
357
414
  def add_cases(self, add_test_cases_data: str):
358
415
  """Adds new test cases into Testrail per defined parameters.
@@ -442,17 +499,10 @@ class TestrailAPIWrapper(NonCodeIndexerToolkit):
442
499
  invalid_keys = [key for key in keys if key not in SUPPORTED_KEYS]
443
500
 
444
501
  try:
445
- # Check if project requires suite_id for multiple suite mode
446
- self._validate_suite_mode_requirements(
447
- project_id=project_id,
448
- suite_id=suite_id
449
- )
450
-
451
- extracted_cases = self._client.cases.get_cases(project_id=project_id, suite_id=suite_id)
452
- # support old versions of testrail_api
453
- cases = extracted_cases.get("cases") if isinstance(extracted_cases, dict) else extracted_cases
502
+ # Use unified suite handling method
503
+ cases = self._fetch_cases_with_suite_handling(project_id=project_id, suite_id=suite_id)
454
504
 
455
- if cases is None:
505
+ if not cases:
456
506
  return ToolException("No test cases found in the extracted data.")
457
507
 
458
508
  extracted_cases_data = [
@@ -506,31 +556,35 @@ class TestrailAPIWrapper(NonCodeIndexerToolkit):
506
556
  )
507
557
  self._log_tool_event(message=f"Extract test cases per filter {params}", tool_name='get_cases_by_filter')
508
558
 
509
- # Check if project requires suite_id when not provided in params
510
- suite_id_in_params = params.get('suite_id', None)
511
- self._validate_suite_mode_requirements(
512
- project_id=project_id,
513
- suite_id=str(suite_id_in_params) if suite_id_in_params else None
514
- )
559
+ # Extract suite_id from params for unified handling
560
+ suite_id_in_params = params.pop('suite_id', None)
561
+ suite_id = str(suite_id_in_params) if suite_id_in_params else None
515
562
 
516
- extracted_cases = self._client.cases.get_cases(
517
- project_id=project_id, **params
563
+ # Use unified suite handling method with remaining filter parameters
564
+ cases = self._fetch_cases_with_suite_handling(
565
+ project_id=project_id,
566
+ suite_id=suite_id,
567
+ **params
518
568
  )
569
+
519
570
  self._log_tool_event(message="Test cases were extracted", tool_name='get_cases_by_filter')
520
- # support old versions of testrail_api
521
- cases = extracted_cases.get("cases") if isinstance(extracted_cases, dict) else extracted_cases
522
571
 
523
- if cases is None:
572
+ if not cases:
524
573
  return ToolException("No test cases found in the extracted data.")
525
574
 
526
575
  if keys is None:
527
576
  return self._to_markup(cases, output_format)
528
577
 
529
- extracted_cases_data = [
530
- {key: case.get(key, "N/A") for key in keys} for case in cases
531
- ]
578
+ extracted_cases_data = []
579
+ for case in cases:
580
+ case_dict = {}
581
+ for key in keys:
582
+ if key in case:
583
+ case_dict[key] = case[key]
584
+ if case_dict:
585
+ extracted_cases_data.append(case_dict)
532
586
 
533
- if extracted_cases_data is None:
587
+ if not extracted_cases_data:
534
588
  return ToolException("No valid test case data found to format.")
535
589
 
536
590
  result = self._to_markup(extracted_cases_data, output_format)
@@ -578,6 +632,40 @@ class TestrailAPIWrapper(NonCodeIndexerToolkit):
578
632
  return (
579
633
  f"Test case #{case_id} has been updated at '{updated_case['updated_on']}')"
580
634
  )
635
+
636
+ def _get_raw_suites(self, project_id: str) -> List[Dict]:
637
+ """
638
+ Internal helper to get raw suite data from TestRail API.
639
+ Handles both old and new testrail_api response formats.
640
+ """
641
+ suites_response = self._client.suites.get_suites(project_id=project_id)
642
+ if isinstance(suites_response, dict) and 'suites' in suites_response:
643
+ return suites_response['suites']
644
+ else:
645
+ return suites_response if isinstance(suites_response, list) else []
646
+
647
+ def get_suites(self, project_id: str, output_format: str = "json",) -> Union[str, ToolException]:
648
+ """Extracts a list of test suites for a given project from Testrail"""
649
+ try:
650
+ suites = self._get_raw_suites(project_id)
651
+
652
+ if not suites:
653
+ return ToolException("No test suites found for the specified project.")
654
+
655
+ suite_dicts = []
656
+ for suite in suites:
657
+ if isinstance(suite, dict):
658
+ suite_dict = {}
659
+ for field in ["id", "name", "description", "project_id", "is_baseline",
660
+ "completed_on", "url", "is_master", "is_completed"]:
661
+ if field in suite:
662
+ suite_dict[field] = suite[field]
663
+ suite_dicts.append(suite_dict)
664
+ else:
665
+ suite_dicts.append({"suite": str(suite)})
666
+ return self._to_markup(suite_dicts, output_format)
667
+ except StatusCodeError as e:
668
+ return ToolException(f"Unable to extract test suites: {e}")
581
669
 
582
670
  def _base_loader(self, project_id: str,
583
671
  suite_id: Optional[str] = None,
@@ -589,24 +677,13 @@ class TestrailAPIWrapper(NonCodeIndexerToolkit):
589
677
  self._include_attachments = kwargs.get('include_attachments', False)
590
678
  self._skip_attachment_extensions = kwargs.get('skip_attachment_extensions', [])
591
679
 
592
- def _extract_cases_from_response(response):
593
- """Extract cases from API response, supporting both old and new testrail_api versions."""
594
- return response.get('cases', []) if isinstance(response, dict) else response
595
-
596
680
  try:
597
- # Check if project requires suite_id when not provided
598
- self._validate_suite_mode_requirements(project_id=project_id, suite_id=suite_id)
599
-
600
- if suite_id:
601
- resp = self._client.cases.get_cases(project_id=project_id, suite_id=int(suite_id))
602
- else:
603
- resp = self._client.cases.get_cases(project_id=project_id)
604
-
605
- cases = _extract_cases_from_response(resp)
606
-
681
+ # Use unified suite handling method
682
+ cases = self._fetch_cases_with_suite_handling(project_id=project_id, suite_id=suite_id)
607
683
  except StatusCodeError as e:
608
684
  raise ToolException(f"Unable to extract test cases: {e}")
609
- # Apply filters
685
+
686
+ # Apply filters
610
687
  if section_id is not None:
611
688
  cases = [case for case in cases if case.get('section_id') == section_id]
612
689
  if title_keyword is not None:
@@ -810,6 +887,12 @@ class TestrailAPIWrapper(NonCodeIndexerToolkit):
810
887
  "ref": self.update_case,
811
888
  "description": self.update_case.__doc__,
812
889
  "args_schema": updateCase,
890
+ },
891
+ {
892
+ "name": "get_suites",
893
+ "ref": self.get_suites,
894
+ "description": self.get_suites.__doc__,
895
+ "args_schema": getSuites,
813
896
  }
814
897
  ]
815
898
  return tools
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: alita_sdk
3
- Version: 0.3.346
3
+ Version: 0.3.348
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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "alita_sdk"
7
- version = "0.3.346"
7
+ version = "0.3.348"
8
8
  description = "SDK for building langchain agents using resources from Alita"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"