alita-sdk 0.3.208__tar.gz → 0.3.210__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 (316) hide show
  1. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/PKG-INFO +1 -1
  2. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/clients/artifact.py +18 -4
  3. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/document_loaders/AlitaCSVLoader.py +2 -1
  4. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/document_loaders/AlitaDocxMammothLoader.py +3 -3
  5. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/document_loaders/AlitaImageLoader.py +8 -4
  6. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/document_loaders/AlitaTableLoader.py +1 -1
  7. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/langraph_agent.py +9 -6
  8. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/toolkits/artifact.py +7 -3
  9. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/toolkits/tools.py +8 -1
  10. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/tools/application.py +2 -0
  11. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/tools/artifact.py +65 -8
  12. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/tools/vectorstore.py +125 -42
  13. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/utils/utils.py +3 -0
  14. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/ado/__init__.py +8 -0
  15. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/ado/repos/repos_wrapper.py +37 -0
  16. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/ado/test_plan/test_plan_wrapper.py +0 -7
  17. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/ado/work_item/__init__.py +4 -0
  18. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/ado/work_item/ado_wrapper.py +37 -4
  19. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/aws/delta_lake/__init__.py +1 -1
  20. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/bitbucket/__init__.py +13 -1
  21. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/bitbucket/api_wrapper.py +31 -4
  22. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/bitbucket/cloud_api_wrapper.py +31 -0
  23. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/chunkers/code/codeparser.py +18 -10
  24. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/confluence/api_wrapper.py +35 -134
  25. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/confluence/loader.py +30 -28
  26. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/elitea_base.py +112 -11
  27. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/figma/__init__.py +13 -1
  28. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/figma/api_wrapper.py +47 -3
  29. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/github/api_wrapper.py +8 -0
  30. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/github/github_client.py +18 -0
  31. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/gitlab/__init__.py +4 -0
  32. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/gitlab/api_wrapper.py +10 -0
  33. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/google/bigquery/__init__.py +1 -1
  34. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/jira/__init__.py +21 -13
  35. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/jira/api_wrapper.py +285 -5
  36. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/sharepoint/__init__.py +11 -1
  37. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/sharepoint/api_wrapper.py +23 -53
  38. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/testrail/__init__.py +4 -0
  39. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/testrail/api_wrapper.py +28 -56
  40. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/utils/content_parser.py +123 -9
  41. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/xray/__init__.py +8 -1
  42. alita_sdk-0.3.210/alita_sdk/tools/xray/api_wrapper.py +717 -0
  43. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/zephyr_scale/api_wrapper.py +5 -5
  44. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk.egg-info/PKG-INFO +1 -1
  45. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/pyproject.toml +1 -1
  46. alita_sdk-0.3.208/alita_sdk/tools/xray/api_wrapper.py +0 -226
  47. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/LICENSE +0 -0
  48. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/README.md +0 -0
  49. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/__init__.py +0 -0
  50. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/community/__init__.py +0 -0
  51. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/community/utils.py +0 -0
  52. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/__init__.py +0 -0
  53. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/clients/__init__.py +0 -0
  54. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/clients/client.py +0 -0
  55. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/clients/datasource.py +0 -0
  56. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/clients/prompt.py +0 -0
  57. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/__init__.py +0 -0
  58. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/agents/__init__.py +0 -0
  59. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/agents/xml_chat.py +0 -0
  60. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/assistant.py +0 -0
  61. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/chat_message_template.py +0 -0
  62. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/constants.py +0 -0
  63. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/document_loaders/AlitaBDDScenariosLoader.py +0 -0
  64. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/document_loaders/AlitaConfluenceLoader.py +0 -0
  65. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/document_loaders/AlitaDirectoryLoader.py +0 -0
  66. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/document_loaders/AlitaExcelLoader.py +0 -0
  67. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/document_loaders/AlitaGitRepoLoader.py +0 -0
  68. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/document_loaders/AlitaJiraLoader.py +0 -0
  69. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/document_loaders/AlitaQtestLoader.py +0 -0
  70. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/document_loaders/__init__.py +0 -0
  71. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/document_loaders/constants.py +0 -0
  72. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/document_loaders/utils.py +0 -0
  73. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/indexer.py +0 -0
  74. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/interfaces/__init__.py +0 -0
  75. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/interfaces/kwextractor.py +0 -0
  76. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/interfaces/llm_processor.py +0 -0
  77. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/interfaces/loaders.py +0 -0
  78. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/interfaces/splitters.py +0 -0
  79. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/mixedAgentParser.py +0 -0
  80. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/mixedAgentRenderes.py +0 -0
  81. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/retrievers/AlitaRetriever.py +0 -0
  82. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/retrievers/VectorstoreRetriever.py +0 -0
  83. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/retrievers/__init__.py +0 -0
  84. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/store_manager.py +0 -0
  85. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/tools/__init__.py +0 -0
  86. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/tools/bdd_parser/__init__.py +0 -0
  87. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/tools/bdd_parser/bdd_exceptions.py +0 -0
  88. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/tools/bdd_parser/bdd_parser.py +0 -0
  89. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/tools/bdd_parser/feature_types.py +0 -0
  90. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/tools/bdd_parser/parser.py +0 -0
  91. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/tools/git.py +0 -0
  92. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/tools/log.py +0 -0
  93. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/tools/quota.py +0 -0
  94. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/tools/state.py +0 -0
  95. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/tools/utils.py +0 -0
  96. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/tools/vector.py +0 -0
  97. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/langchain/utils.py +0 -0
  98. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/llms/__init__.py +0 -0
  99. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/llms/preloaded.py +0 -0
  100. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/toolkits/__init__.py +0 -0
  101. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/toolkits/application.py +0 -0
  102. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/toolkits/datasource.py +0 -0
  103. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/toolkits/prompt.py +0 -0
  104. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/toolkits/subgraph.py +0 -0
  105. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/toolkits/vectorstore.py +0 -0
  106. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/tools/__init__.py +0 -0
  107. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/tools/agent.py +0 -0
  108. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/tools/datasource.py +0 -0
  109. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/tools/echo.py +0 -0
  110. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/tools/function.py +0 -0
  111. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/tools/indexer_tool.py +0 -0
  112. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/tools/llm.py +0 -0
  113. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/tools/loop.py +0 -0
  114. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/tools/loop_output.py +0 -0
  115. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/tools/mcp_server_tool.py +0 -0
  116. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/tools/pgvector_search.py +0 -0
  117. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/tools/prompt.py +0 -0
  118. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/tools/router.py +0 -0
  119. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/tools/tool.py +0 -0
  120. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/utils/AlitaCallback.py +0 -0
  121. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/utils/__init__.py +0 -0
  122. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/utils/constants.py +0 -0
  123. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/utils/evaluate.py +0 -0
  124. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/utils/logging.py +0 -0
  125. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/utils/save_dataframe.py +0 -0
  126. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/utils/streamlit.py +0 -0
  127. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/utils/toolkit_runtime.py +0 -0
  128. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/runtime/utils/toolkit_utils.py +0 -0
  129. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/__init__.py +0 -0
  130. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/ado/repos/__init__.py +0 -0
  131. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/ado/test_plan/__init__.py +0 -0
  132. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/ado/utils.py +0 -0
  133. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/ado/wiki/__init__.py +0 -0
  134. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/ado/wiki/ado_wrapper.py +0 -0
  135. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/advanced_jira_mining/__init__.py +0 -0
  136. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/advanced_jira_mining/data_mining_wrapper.py +0 -0
  137. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/aws/__init__.py +0 -0
  138. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/aws/delta_lake/api_wrapper.py +0 -0
  139. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/aws/delta_lake/schemas.py +0 -0
  140. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/aws/delta_lake/tool.py +0 -0
  141. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/azure_ai/__init__.py +0 -0
  142. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/azure_ai/search/__init__.py +0 -0
  143. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/azure_ai/search/api_wrapper.py +0 -0
  144. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/base/__init__.py +0 -0
  145. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/base/tool.py +0 -0
  146. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/bitbucket/bitbucket_constants.py +0 -0
  147. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/bitbucket/tools.py +0 -0
  148. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/browser/__init__.py +0 -0
  149. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/browser/crawler.py +0 -0
  150. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/browser/duck_duck_go_search.py +0 -0
  151. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/browser/google_search_rag.py +0 -0
  152. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/browser/utils.py +0 -0
  153. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/browser/wiki.py +0 -0
  154. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/carrier/__init__.py +0 -0
  155. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/carrier/api_wrapper.py +0 -0
  156. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/carrier/backend_reports_tool.py +0 -0
  157. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/carrier/backend_tests_tool.py +0 -0
  158. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/carrier/cancel_ui_test_tool.py +0 -0
  159. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/carrier/carrier_sdk.py +0 -0
  160. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/carrier/create_ui_excel_report_tool.py +0 -0
  161. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/carrier/create_ui_test_tool.py +0 -0
  162. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/carrier/excel_reporter.py +0 -0
  163. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/carrier/lighthouse_excel_reporter.py +0 -0
  164. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/carrier/run_ui_test_tool.py +0 -0
  165. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/carrier/tickets_tool.py +0 -0
  166. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/carrier/tools.py +0 -0
  167. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/carrier/ui_reports_tool.py +0 -0
  168. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/carrier/update_ui_test_schedule_tool.py +0 -0
  169. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/carrier/utils.py +0 -0
  170. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/chunkers/__init__.py +0 -0
  171. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/chunkers/code/__init__.py +0 -0
  172. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/chunkers/code/constants.py +0 -0
  173. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/chunkers/code/treesitter/__init__.py +0 -0
  174. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/chunkers/code/treesitter/treesitter.py +0 -0
  175. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/chunkers/code/treesitter/treesitter_c.py +0 -0
  176. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/chunkers/code/treesitter/treesitter_cpp.py +0 -0
  177. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/chunkers/code/treesitter/treesitter_cs.py +0 -0
  178. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/chunkers/code/treesitter/treesitter_go.py +0 -0
  179. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/chunkers/code/treesitter/treesitter_hs.py +0 -0
  180. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/chunkers/code/treesitter/treesitter_java.py +0 -0
  181. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/chunkers/code/treesitter/treesitter_js.py +0 -0
  182. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/chunkers/code/treesitter/treesitter_kt.py +0 -0
  183. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/chunkers/code/treesitter/treesitter_py.py +0 -0
  184. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/chunkers/code/treesitter/treesitter_rb.py +0 -0
  185. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/chunkers/code/treesitter/treesitter_registry.py +0 -0
  186. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/chunkers/code/treesitter/treesitter_rs.py +0 -0
  187. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/chunkers/code/treesitter/treesitter_ts.py +0 -0
  188. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/chunkers/models.py +0 -0
  189. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/chunkers/sematic/__init__.py +0 -0
  190. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/chunkers/sematic/base.py +0 -0
  191. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/chunkers/sematic/markdown_chunker.py +0 -0
  192. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/chunkers/sematic/proposal_chunker.py +0 -0
  193. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/chunkers/sematic/statistical_chunker.py +0 -0
  194. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/chunkers/utils.py +0 -0
  195. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/cloud/__init__.py +0 -0
  196. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/cloud/aws/__init__.py +0 -0
  197. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/cloud/aws/api_wrapper.py +0 -0
  198. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/cloud/azure/__init__.py +0 -0
  199. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/cloud/azure/api_wrapper.py +0 -0
  200. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/cloud/gcp/__init__.py +0 -0
  201. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/cloud/gcp/api_wrapper.py +0 -0
  202. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/cloud/k8s/__init__.py +0 -0
  203. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/cloud/k8s/api_wrapper.py +0 -0
  204. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/code/__init__.py +0 -0
  205. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/code/linter/__init__.py +0 -0
  206. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/code/linter/api_wrapper.py +0 -0
  207. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/code/loaders/codesearcher.py +0 -0
  208. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/code/sonar/__init__.py +0 -0
  209. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/code/sonar/api_wrapper.py +0 -0
  210. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/confluence/__init__.py +0 -0
  211. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/confluence/utils.py +0 -0
  212. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/custom_open_api/__init__.py +0 -0
  213. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/custom_open_api/api_wrapper.py +0 -0
  214. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/elastic/__init__.py +0 -0
  215. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/elastic/api_wrapper.py +0 -0
  216. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/github/__init__.py +0 -0
  217. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/github/graphql_client_wrapper.py +0 -0
  218. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/github/schemas.py +0 -0
  219. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/github/tool.py +0 -0
  220. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/github/tool_prompts.py +0 -0
  221. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/gitlab/tools.py +0 -0
  222. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/gitlab/utils.py +0 -0
  223. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/gitlab_org/__init__.py +0 -0
  224. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/gitlab_org/api_wrapper.py +0 -0
  225. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/gmail/__init__.py +0 -0
  226. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/gmail/gmail_wrapper.py +0 -0
  227. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/gmail/utils.py +0 -0
  228. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/google/__init__.py +0 -0
  229. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/google/bigquery/api_wrapper.py +0 -0
  230. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/google/bigquery/schemas.py +0 -0
  231. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/google/bigquery/tool.py +0 -0
  232. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/google_places/__init__.py +0 -0
  233. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/google_places/api_wrapper.py +0 -0
  234. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/keycloak/__init__.py +0 -0
  235. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/keycloak/api_wrapper.py +0 -0
  236. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/llm/__init__.py +0 -0
  237. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/llm/img_utils.py +0 -0
  238. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/llm/llm_utils.py +0 -0
  239. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/localgit/__init__.py +0 -0
  240. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/localgit/local_git.py +0 -0
  241. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/localgit/tool.py +0 -0
  242. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/memory/__init__.py +0 -0
  243. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/ocr/__init__.py +0 -0
  244. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/ocr/api_wrapper.py +0 -0
  245. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/ocr/text_detection.py +0 -0
  246. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/openapi/__init__.py +0 -0
  247. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/pandas/__init__.py +0 -0
  248. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/pandas/api_wrapper.py +0 -0
  249. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/pandas/dataframe/__init__.py +0 -0
  250. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/pandas/dataframe/errors.py +0 -0
  251. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/pandas/dataframe/executor/__init__.py +0 -0
  252. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/pandas/dataframe/executor/code_environment.py +0 -0
  253. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/pandas/dataframe/executor/code_executor.py +0 -0
  254. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/pandas/dataframe/generator/__init__.py +0 -0
  255. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/pandas/dataframe/generator/base.py +0 -0
  256. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/pandas/dataframe/generator/code_cleaning.py +0 -0
  257. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/pandas/dataframe/generator/code_validator.py +0 -0
  258. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/pandas/dataframe/prompts.py +0 -0
  259. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/pandas/dataframe/serializer.py +0 -0
  260. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/pandas/dataframe/utils.py +0 -0
  261. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/pandas/statsmodels/__init__.py +0 -0
  262. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/pandas/statsmodels/base_stats.py +0 -0
  263. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/pandas/statsmodels/descriptive.py +0 -0
  264. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/pandas/statsmodels/hypothesis_testing.py +0 -0
  265. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/pandas/statsmodels/regression.py +0 -0
  266. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/postman/__init__.py +0 -0
  267. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/postman/api_wrapper.py +0 -0
  268. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/postman/postman_analysis.py +0 -0
  269. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/pptx/__init__.py +0 -0
  270. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/pptx/pptx_wrapper.py +0 -0
  271. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/qtest/__init__.py +0 -0
  272. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/qtest/api_wrapper.py +0 -0
  273. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/qtest/tool.py +0 -0
  274. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/rally/__init__.py +0 -0
  275. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/rally/api_wrapper.py +0 -0
  276. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/report_portal/__init__.py +0 -0
  277. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/report_portal/api_wrapper.py +0 -0
  278. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/report_portal/report_portal_client.py +0 -0
  279. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/salesforce/__init__.py +0 -0
  280. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/salesforce/api_wrapper.py +0 -0
  281. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/salesforce/model.py +0 -0
  282. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/servicenow/__init__.py +0 -0
  283. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/servicenow/api_wrapper.py +0 -0
  284. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/servicenow/servicenow_client.py +0 -0
  285. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/sharepoint/authorization_helper.py +0 -0
  286. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/sharepoint/utils.py +0 -0
  287. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/slack/__init__.py +0 -0
  288. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/slack/api_wrapper.py +0 -0
  289. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/sql/__init__.py +0 -0
  290. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/sql/api_wrapper.py +0 -0
  291. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/sql/models.py +0 -0
  292. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/testio/__init__.py +0 -0
  293. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/testio/api_wrapper.py +0 -0
  294. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/utils/__init__.py +0 -0
  295. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/yagmail/__init__.py +0 -0
  296. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/yagmail/yagmail_wrapper.py +0 -0
  297. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/zephyr/Zephyr.py +0 -0
  298. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/zephyr/__init__.py +0 -0
  299. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/zephyr/api_wrapper.py +0 -0
  300. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/zephyr/rest_client.py +0 -0
  301. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/zephyr_enterprise/__init__.py +0 -0
  302. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/zephyr_enterprise/api_wrapper.py +0 -0
  303. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/zephyr_enterprise/zephyr_enterprise.py +0 -0
  304. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/zephyr_scale/__init__.py +0 -0
  305. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/zephyr_squad/__init__.py +0 -0
  306. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/zephyr_squad/api_wrapper.py +0 -0
  307. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk/tools/zephyr_squad/zephyr_squad_cloud_client.py +0 -0
  308. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk.egg-info/SOURCES.txt +0 -0
  309. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk.egg-info/dependency_links.txt +0 -0
  310. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk.egg-info/requires.txt +0 -0
  311. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/alita_sdk.egg-info/top_level.txt +0 -0
  312. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/setup.cfg +0 -0
  313. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/tests/test_ado_analysis.py +0 -0
  314. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/tests/test_github_analysis.py +0 -0
  315. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/tests/test_gitlab_analysis.py +0 -0
  316. {alita_sdk-0.3.208 → alita_sdk-0.3.210}/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.208
3
+ Version: 0.3.210
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>, Artem Dubrovskiy <ad13box@gmail.com>
6
6
  License-Expression: Apache-2.0
@@ -24,7 +24,14 @@ class Artifact:
24
24
  logger.error(f"Error: {e}")
25
25
  return f"Error: {e}"
26
26
 
27
- def get(self, artifact_name: str, bucket_name: str = None, is_capture_image: bool = False, page_number: int = None, sheet_name: str = None):
27
+ def get(self,
28
+ artifact_name: str,
29
+ bucket_name: str = None,
30
+ is_capture_image: bool = False,
31
+ page_number: int = None,
32
+ sheet_name: str = None,
33
+ excel_by_sheets: bool = False,
34
+ llm = None):
28
35
  if not bucket_name:
29
36
  bucket_name = self.bucket_name
30
37
  data = self.client.download_artifact(bucket_name, artifact_name)
@@ -37,17 +44,24 @@ class Artifact:
37
44
  if detected['encoding'] is not None:
38
45
  return data.decode(detected['encoding'])
39
46
  else:
40
- return parse_file_content(artifact_name, data, is_capture_image, page_number, sheet_name)
47
+ return parse_file_content(file_name=artifact_name,
48
+ file_content=data,
49
+ is_capture_image=is_capture_image,
50
+ page_number=page_number,
51
+ sheet_name=sheet_name,
52
+ excel_by_sheets=excel_by_sheets,
53
+ llm=llm)
41
54
 
42
55
  def delete(self, artifact_name: str, bucket_name = None):
43
56
  if not bucket_name:
44
57
  bucket_name = self.bucket_name
45
58
  self.client.delete_artifact(bucket_name, artifact_name)
46
59
 
47
- def list(self, bucket_name: str = None) -> str:
60
+ def list(self, bucket_name: str = None, return_as_string = True) -> str|dict:
48
61
  if not bucket_name:
49
62
  bucket_name = self.bucket_name
50
- return str(self.client.list_artifacts(bucket_name))
63
+ artifacts = self.client.list_artifacts(bucket_name)
64
+ return str(artifacts) if return_as_string else artifacts
51
65
 
52
66
  def append(self, artifact_name: str, additional_data: Any, bucket_name: str = None):
53
67
  if not bucket_name:
@@ -26,7 +26,8 @@ class AlitaCSVLoader(AlitaTableLoader):
26
26
  json_documents: bool = True,
27
27
  raw_content: bool = False,
28
28
  columns: Optional[List[str]] = None,
29
- cleanse: bool = True):
29
+ cleanse: bool = True,
30
+ **kwargs):
30
31
  super().__init__(file_path=file_path, json_documents=json_documents, columns=columns, raw_content=raw_content, cleanse=cleanse)
31
32
  self.encoding = encoding
32
33
  self.autodetect_encoding = autodetect_encoding
@@ -18,19 +18,19 @@ class AlitaDocxMammothLoader(BaseLoader):
18
18
  Loader for Docx files using Mammoth to convert to HTML, with image handling,
19
19
  and then Markdownify to convert HTML to markdown.
20
20
  """
21
- def __init__(self, path: str, **kwargs):
21
+ def __init__(self, file_path: str, **kwargs):
22
22
  """
23
23
  Initializes AlitaDocxMammothLoader.
24
24
 
25
25
  Args:
26
26
  **kwargs: Keyword arguments, including:
27
- path (str): Path to the Docx file. Required.
27
+ file_path (str): Path to the Docx file. Required.
28
28
  llm (LLM, optional): Language model for processing images.
29
29
  prompt (str, optional): Prompt for the language model.
30
30
  Raises:
31
31
  ValueError: If the 'path' parameter is not provided.
32
32
  """
33
- self.path = path
33
+ self.path = file_path
34
34
  self.llm = kwargs.get("llm")
35
35
  self.prompt = kwargs.get("prompt")
36
36
 
@@ -19,11 +19,15 @@ Image.MAX_IMAGE_PIXELS = 300_000_000
19
19
  class AlitaImageLoader(BaseLoader):
20
20
  """Loads image files using pytesseract for OCR or optionally LLM for advanced analysis, including SVG support."""
21
21
 
22
- def __init__(self, **kwargs):
23
- if not kwargs.get('path'):
24
- raise ValueError("Path parameter 'path' is required")
25
- else:
22
+ def __init__(self, file_path=None, **kwargs):
23
+ # Handle both positional and keyword arguments for file_path
24
+ if file_path is not None:
25
+ self.file_path = file_path
26
+ elif kwargs.get('path'):
26
27
  self.file_path = kwargs['path']
28
+ else:
29
+ raise ValueError(
30
+ "Path parameter is required (either as 'file_path' positional argument or 'path' keyword argument)")
27
31
  self.llm = kwargs.get('llm', None)
28
32
  self.ocr_language = kwargs.get('ocr_language', None)
29
33
  self.prompt = kwargs.get('prompt') if kwargs.get(
@@ -26,7 +26,7 @@ class AlitaTableLoader(BaseLoader):
26
26
  json_documents: bool = True,
27
27
  raw_content: bool = False,
28
28
  columns: Optional[List[str]] = None,
29
- cleanse: bool = True):
29
+ cleanse: bool = True, **kwargs):
30
30
 
31
31
  self.raw_content = raw_content
32
32
  self.file_path = file_path
@@ -9,7 +9,7 @@ from langchain_core.callbacks import dispatch_custom_event
9
9
  from langchain_core.messages import HumanMessage, AIMessage, SystemMessage, BaseMessage
10
10
  from langchain_core.runnables import Runnable
11
11
  from langchain_core.runnables import RunnableConfig
12
- from langchain_core.tools import BaseTool
12
+ from langchain_core.tools import BaseTool, ToolException
13
13
  from langgraph.channels.ephemeral_value import EphemeralValue
14
14
  from langgraph.graph import StateGraph
15
15
  from langgraph.graph.graph import END, START
@@ -505,11 +505,11 @@ def create_graph(
505
505
  if isinstance(connected_tools, dict):
506
506
  for toolkit, selected_tools in connected_tools.items():
507
507
  for tool in selected_tools:
508
- tool_names.append(f"{toolkit}___{tool}")
508
+ tool_names.append(f"{toolkit}{TOOLKIT_SPLITTER}{tool}")
509
+ elif isinstance(connected_tools, list):
510
+ # for cases when tools are provided as a list of names with already bound toolkit_name
511
+ tool_names = connected_tools
509
512
 
510
- # Filter tools if specific tool names are provided
511
- available_tools = []
512
-
513
513
  if tool_names:
514
514
  # Filter tools by name
515
515
  tool_dict = {tool.name: tool for tool in tools if isinstance(tool, BaseTool)}
@@ -580,7 +580,10 @@ def create_graph(
580
580
  default_output=node['condition'].get('default_output', 'END')))
581
581
 
582
582
  # set default value for state variable at START
583
- entry_point = clean_string(schema['entry_point'])
583
+ try:
584
+ entry_point = clean_string(schema['entry_point'])
585
+ except KeyError:
586
+ raise ToolException("Entry point is not defined in the schema. Please define 'entry_point' in the schema.")
584
587
  for key, value in state.items():
585
588
  if 'type' in value and 'value' in value:
586
589
  # set default value for state variable if it is defined in the schema
@@ -3,7 +3,7 @@ from typing import List, Any, Literal, Optional
3
3
  from alita_sdk.tools.utils import clean_string, TOOLKIT_SPLITTER, get_max_toolkit_length
4
4
  from langchain_community.agent_toolkits.base import BaseToolkit
5
5
  from langchain_core.tools import BaseTool
6
- from pydantic import create_model, BaseModel, ConfigDict, Field
6
+ from pydantic import create_model, BaseModel, ConfigDict, Field, SecretStr
7
7
  from pydantic.fields import FieldInfo
8
8
  from ..tools.artifact import ArtifactWrapper
9
9
  from alita_sdk.tools.base.tool import BaseAction
@@ -22,15 +22,19 @@ class ArtifactToolkit(BaseToolkit):
22
22
  # client = (Any, FieldInfo(description="Client object", required=True, autopopulate=True)),
23
23
  bucket = (str, FieldInfo(description="Bucket name", json_schema_extra={'toolkit_name': True, 'max_toolkit_length': ArtifactToolkit.toolkit_max_length})),
24
24
  selected_tools=(List[Literal[tuple(selected_tools)]], Field(default=[], json_schema_extra={'args_schemas': selected_tools})),
25
+ # indexer settings
26
+ connection_string = (Optional[SecretStr], Field(description="Connection string for vectorstore",
27
+ default=None,
28
+ json_schema_extra={'secret': True})),
25
29
  __config__=ConfigDict(json_schema_extra={'metadata': {"label": "Artifact", "icon_url": None}})
26
30
  )
27
31
 
28
32
  @classmethod
29
- def get_toolkit(cls, client: Any, bucket: str, toolkit_name: Optional[str] = None, selected_tools: list[str] = []):
33
+ def get_toolkit(cls, client: Any, bucket: str, toolkit_name: Optional[str] = None, selected_tools: list[str] = [], **kwargs):
30
34
  if selected_tools is None:
31
35
  selected_tools = []
32
36
  tools = []
33
- artifact_wrapper = ArtifactWrapper(client=client, bucket=bucket)
37
+ artifact_wrapper = ArtifactWrapper(client=client, bucket=bucket, **kwargs)
34
38
  prefix = clean_string(toolkit_name, cls.toolkit_max_length) + TOOLKIT_SPLITTER if toolkit_name else ''
35
39
  available_tools = artifact_wrapper.get_available_tools()
36
40
  for tool in available_tools:
@@ -71,7 +71,14 @@ def get_tools(tools_list: list, alita_client, llm, memory_store: BaseStore = Non
71
71
  client=alita_client,
72
72
  bucket=tool['settings']['bucket'],
73
73
  toolkit_name=tool.get('toolkit_name', ''),
74
- selected_tools=tool['settings'].get('selected_tools', [])
74
+ selected_tools=tool['settings'].get('selected_tools', []),
75
+ llm=tool['settings'].get('llm'),
76
+ # indexer settings
77
+ connection_string=tool['settings'].get('connection_string', None),
78
+ collection_name=f"{tool.get('toolkit_name')}_{str(tool['id'])}",
79
+ embedding_model="HuggingFaceEmbeddings",
80
+ embedding_model_params={"model_name": "sentence-transformers/all-MiniLM-L6-v2"},
81
+ vectorstore_type="PGVector"
75
82
  ).get_tools())
76
83
  elif tool['type'] == 'vectorstore':
77
84
  tools.extend(VectorStoreToolkit.get_toolkit(
@@ -56,6 +56,8 @@ class Application(BaseTool):
56
56
  schema_values = self.args_schema(**input).model_dump() if self.args_schema else {}
57
57
  extras = {k: v for k, v in input.items() if k not in schema_values}
58
58
  all_kwargs = {**kwargs, **extras, **schema_values}
59
+ if config is None:
60
+ config = {}
59
61
  return self._run(*config, **all_kwargs)
60
62
 
61
63
  def _run(self, *args, **kwargs):
@@ -1,8 +1,19 @@
1
- from alita_sdk.tools.elitea_base import BaseToolApiWrapper
2
- from typing import Any, Optional
1
+ import hashlib
2
+ import json
3
+ from typing import Any, Optional, Generator, List
4
+
5
+ from langchain_core.documents import Document
6
+ from langchain_core.tools import ToolException
3
7
  from pydantic import create_model, Field, model_validator
4
8
 
5
- class ArtifactWrapper(BaseToolApiWrapper):
9
+ from alita_sdk.tools.elitea_base import BaseVectorStoreToolApiWrapper, extend_with_vector_tools
10
+
11
+ try:
12
+ from alita_sdk.runtime.langchain.interfaces.llm_processor import get_embeddings
13
+ except ImportError:
14
+ from alita_sdk.langchain.interfaces.llm_processor import get_embeddings
15
+
16
+ class ArtifactWrapper(BaseVectorStoreToolApiWrapper):
6
17
  client: Any
7
18
  bucket: str
8
19
  artifact: Optional[Any] = None
@@ -17,14 +28,26 @@ class ArtifactWrapper(BaseToolApiWrapper):
17
28
  values["artifact"] = values['client'].artifact(values['bucket'])
18
29
  return values
19
30
 
20
- def list_files(self, bucket_name = None):
21
- return self.artifact.list(bucket_name)
31
+ def list_files(self, bucket_name = None, return_as_string = True):
32
+ return self.artifact.list(bucket_name, return_as_string)
22
33
 
23
34
  def create_file(self, filename: str, filedata: str, bucket_name = None):
24
35
  return self.artifact.create(filename, filedata, bucket_name)
25
36
 
26
- def read_file(self, filename: str, bucket_name = None, is_capture_image: bool = False, page_number: int = None, sheet_name: str = None):
27
- return self.artifact.get(filename, bucket_name, is_capture_image, page_number, sheet_name)
37
+ def read_file(self,
38
+ filename: str,
39
+ bucket_name = None,
40
+ is_capture_image: bool = False,
41
+ page_number: int = None,
42
+ sheet_name: str = None,
43
+ excel_by_sheets: bool = False):
44
+ return self.artifact.get(artifact_name=filename,
45
+ bucket_name=bucket_name,
46
+ is_capture_image=is_capture_image,
47
+ page_number=page_number,
48
+ sheet_name=sheet_name,
49
+ excel_by_sheets=excel_by_sheets,
50
+ llm=self.llm)
28
51
 
29
52
  def delete_file(self, filename: str, bucket_name = None):
30
53
  return self.artifact.delete(filename, bucket_name)
@@ -38,6 +61,40 @@ class ArtifactWrapper(BaseToolApiWrapper):
38
61
  def create_new_bucket(self, bucket_name: str, expiration_measure = "weeks", expiration_value = 1):
39
62
  return self.artifact.client.create_bucket(bucket_name, expiration_measure, expiration_value)
40
63
 
64
+ def _base_loader(self, **kwargs) -> List[Document]:
65
+ try:
66
+ all_files = self.list_files(self.bucket, False)
67
+ except Exception as e:
68
+ raise ToolException(f"Unable to extract files: {e}")
69
+
70
+ docs: List[Document] = []
71
+ for file in all_files['rows']:
72
+ metadata = {
73
+ ("updated_on" if k == "modified" else k): str(v)
74
+ for k, v in file.items()
75
+ }
76
+ metadata['id'] = self.get_hash_from_bucket_and_file_name(self.bucket, file['name'])
77
+ docs.append(Document(page_content="", metadata=metadata))
78
+ return docs
79
+
80
+ def get_hash_from_bucket_and_file_name(self, bucket, file_name):
81
+ hasher = hashlib.sha256()
82
+ hasher.update(bucket.encode('utf-8'))
83
+ hasher.update(file_name.encode('utf-8'))
84
+ return hasher.hexdigest()
85
+
86
+ def _process_document(self, document: Document) -> Generator[Document, None, None]:
87
+ page_content = self.read_file(document.metadata['name'], is_capture_image=True, excel_by_sheets=True)
88
+ if isinstance(page_content, dict):
89
+ for key, value in page_content.items():
90
+ metadata = document.metadata
91
+ metadata['page'] = key
92
+ yield Document(page_content=str(value), metadata=metadata)
93
+ else:
94
+ document.page_content = json.dumps(str(page_content))
95
+ yield document
96
+
97
+ @extend_with_vector_tools
41
98
  def get_available_tools(self):
42
99
  bucket_name = (Optional[str], Field(description="Name of the bucket to work with."
43
100
  "If bucket is not specified by user directly, the name should be taken from chat history."
@@ -125,5 +182,5 @@ class ArtifactWrapper(BaseToolApiWrapper):
125
182
  default="weeks")),
126
183
  expiration_value=(Optional[int], Field(description="Expiration time values.", default=1))
127
184
  )
128
- },
185
+ }
129
186
  ]
@@ -188,63 +188,108 @@ class VectorStoreWrapper(BaseToolApiWrapper):
188
188
  except Exception as e:
189
189
  logger.error(f"Failed to initialize PGVectorSearch: {str(e)}")
190
190
 
191
+ def _clean_collection(self):
192
+ """
193
+ Clean the vectorstore collection by deleting all indexed data.
194
+ """
195
+ self._log_data(
196
+ f"Cleaning collection '{self.dataset}'",
197
+ tool_name="_clean_collection"
198
+ )
199
+ data = self.vectoradapter.vectorstore.get(include=['metadatas'])
200
+ self.vectoradapter.vectorstore.delete(ids=data['ids'])
201
+ self._log_data(
202
+ f"Collection '{self.dataset}' has been cleaned. ",
203
+ tool_name="_clean_collection"
204
+ )
205
+
191
206
  def _get_indexed_data(self, store):
192
- """ Get all indexed data from vectorstore """
207
+ """ Get all indexed data from vectorstore for non-code content """
193
208
 
194
209
  # get already indexed data
195
210
  result = {}
196
211
  try:
197
212
  self._log_data("Retrieving already indexed data from vectorstore",
198
213
  tool_name="index_documents")
199
- data = store.get(include=['documents', 'metadatas'])
214
+ data = store.get(include=['metadatas'])
200
215
  # re-structure data to be more usable
201
- for doc_str, meta, db_id in zip(data['documents'], data['metadatas'], data['ids']):
202
- doc = json.loads(doc_str)
216
+ for meta, db_id in zip(data['metadatas'], data['ids']):
217
+ # get document id from metadata
203
218
  doc_id = str(meta['id'])
204
219
  dependent_docs = meta.get(IndexerKeywords.DEPENDENT_DOCS.value, [])
220
+ if dependent_docs:
221
+ dependent_docs = [d.strip() for d in dependent_docs.split(';') if d.strip()]
205
222
  parent_id = meta.get(IndexerKeywords.PARENT.value, -1)
206
- result[doc_id] = {
207
- 'metadata': meta,
208
- 'document': doc,
209
- 'id': db_id,
210
- IndexerKeywords.DEPENDENT_DOCS.value: dependent_docs,
211
- IndexerKeywords.PARENT.value: parent_id
212
- }
223
+ #
224
+ chunk_id = meta.get('chunk_id')
225
+ if doc_id in result and chunk_id:
226
+ # if document with the same id already saved, add db_id fof current one as chunk
227
+ result[doc_id]['all_chunks'].append(db_id)
228
+ else:
229
+ result[doc_id] = {
230
+ 'metadata': meta,
231
+ 'id': db_id,
232
+ 'all_chunks': [db_id],
233
+ IndexerKeywords.DEPENDENT_DOCS.value: dependent_docs,
234
+ IndexerKeywords.PARENT.value: parent_id
235
+ }
213
236
  except Exception as e:
214
237
  logger.error(f"Failed to get indexed data from vectorstore: {str(e)}. Continuing with empty index.")
215
238
  return result
216
239
 
217
- def _reduce_duplicates(self, documents: Generator[Document, None, None], store) -> List[Any]:
218
- """Remove documents already indexed in the vectorstore based on metadata 'id' and 'updated_on' fields."""
240
+ def _get_code_indexed_data(self, store) -> Dict[str, Dict[str, Any]]:
241
+ """ Get all indexed data from vectorstore for code content """
219
242
 
220
- self._log_data("Verification of documents to index started", tool_name="index_documents")
243
+ # get already indexed data
244
+ result = {}
245
+ try:
246
+ self._log_data("Retrieving already indexed code data from vectorstore",
247
+ tool_name="index_documents")
248
+ data = store.get(include=['metadatas'])
249
+ # re-structure data to be more usable
250
+ for meta, db_id in zip(data['metadatas'], data['ids']):
251
+ filename = meta['filename']
252
+ commit_hash = meta.get('commit_hash')
253
+ if filename not in result:
254
+ result[filename] = {
255
+ 'commit_hashes': [],
256
+ 'ids': []
257
+ }
258
+ if commit_hash is not None:
259
+ result[filename]['commit_hashes'].append(commit_hash)
260
+ result[filename]['ids'].append(db_id)
261
+ except Exception as e:
262
+ logger.error(f"Failed to get indexed code data from vectorstore: {str(e)}. Continuing with empty index.")
263
+ return result
221
264
 
222
- indexed_data = self._get_indexed_data(store)
223
- indexed_ids = set(indexed_data.keys())
224
- if not indexed_ids:
265
+ def _reduce_duplicates(
266
+ self,
267
+ documents: Generator[Any, None, None],
268
+ store,
269
+ get_indexed_data: Callable,
270
+ key_fn: Callable,
271
+ compare_fn: Callable,
272
+ remove_ids_fn: Callable,
273
+ log_msg: str = "Verification of documents to index started"
274
+ ) -> List[Any]:
275
+ """Generic duplicate reduction logic for documents."""
276
+ self._log_data(log_msg, tool_name="index_documents")
277
+ indexed_data = get_indexed_data(store)
278
+ indexed_keys = set(indexed_data.keys())
279
+ if not indexed_keys:
225
280
  self._log_data("Vectorstore is empty, indexing all incoming documents", tool_name="index_documents")
226
281
  return list(documents)
227
282
 
228
283
  final_docs = []
229
- docs_to_remove = []
284
+ docs_to_remove = set()
230
285
 
231
286
  for document in documents:
232
- doc_id = document.metadata.get('id')
233
- # get document's metadata and id and check if already indexed
234
- if doc_id in indexed_ids:
235
- # document has been indexed already, then verify `updated_on`
236
- to_index_updated_on = document.metadata.get('updated_on')
237
- indexed_meta = indexed_data[doc_id]['metadata']
238
- indexed_updated_on = indexed_meta.get('updated_on')
239
- if to_index_updated_on and indexed_updated_on and to_index_updated_on == indexed_updated_on:
240
- # same updated_on, skip indexing
287
+ key = key_fn(document)
288
+ if key in indexed_keys:
289
+ if compare_fn(document, indexed_data[key]):
241
290
  continue
242
- # if updated_on is missing or different, we will re-index the document and remove old one
243
- # parent doc removal
244
- docs_to_remove.append(indexed_data[doc_id]['id'])
245
- # mark dependent docs for removal
246
- for dependent_doc_id in indexed_data[doc_id][IndexerKeywords.DEPENDENT_DOCS.value]:
247
- docs_to_remove.append(indexed_data[dependent_doc_id]['id'])
291
+ final_docs.append(document)
292
+ docs_to_remove.update(remove_ids_fn(indexed_data, key))
248
293
  else:
249
294
  final_docs.append(document)
250
295
 
@@ -253,16 +298,50 @@ class VectorStoreWrapper(BaseToolApiWrapper):
253
298
  f"Removing {len(docs_to_remove)} documents from vectorstore that are already indexed with different updated_on.",
254
299
  tool_name="index_documents"
255
300
  )
256
- store.delete(ids=docs_to_remove)
301
+ store.delete(ids=list(docs_to_remove))
257
302
 
258
303
  return final_docs
259
304
 
260
- def index_documents(self, documents: Generator[Document, None, None], progress_step: int = 20, clean_index: bool = True):
305
+ def _reduce_non_code_duplicates(self, documents: Generator[Any, None, None], store) -> List[Any]:
306
+ return self._reduce_duplicates(
307
+ documents,
308
+ store,
309
+ self._get_indexed_data,
310
+ lambda doc: doc.metadata.get('id'),
311
+ lambda doc, idx: (
312
+ doc.metadata.get('updated_on') and
313
+ idx['metadata'].get('updated_on') and
314
+ doc.metadata.get('updated_on') == idx['metadata'].get('updated_on')
315
+ ),
316
+ lambda idx_data, key: (
317
+ idx_data[key]['all_chunks'] +
318
+ [idx_data[dep_id]['id'] for dep_id in idx_data[key][IndexerKeywords.DEPENDENT_DOCS.value]] +
319
+ [chunk_db_id for dep_id in idx_data[key][IndexerKeywords.DEPENDENT_DOCS.value]
320
+ for chunk_db_id in idx_data[dep_id]['all_chunks']]
321
+ ),
322
+ log_msg="Verification of documents to index started"
323
+ )
324
+
325
+ def _reduce_code_duplicates(self, documents: Generator[Any, None, None], store) -> List[Any]:
326
+ return self._reduce_duplicates(
327
+ documents,
328
+ store,
329
+ self._get_code_indexed_data,
330
+ lambda doc: doc.metadata.get('filename'),
331
+ lambda doc, idx: (
332
+ doc.metadata.get('commit_hash') and
333
+ idx.get('commit_hashes') and
334
+ doc.metadata.get('commit_hash') in idx.get('commit_hashes')
335
+ ),
336
+ lambda idx_data, key: idx_data[key]['ids'],
337
+ log_msg="Verification of code documents to index started"
338
+ )
339
+
340
+ def index_documents(self, documents: Generator[Document, None, None], progress_step: int = 20, clean_index: bool = True, is_code: bool = False):
261
341
  """ Index documents in the vectorstore.
262
342
 
263
343
  Args:
264
344
  documents (Any): Generator or list of documents to index.
265
- document_processing_func (Optional[Callable]): Function to process documents after duplicates removal and before indexing.
266
345
  progress_step (int): Step for progress reporting, default is 20.
267
346
  clean_index (bool): If True, clean the index before re-indexing all documents.
268
347
  """
@@ -274,7 +353,7 @@ class VectorStoreWrapper(BaseToolApiWrapper):
274
353
  logger.info("Cleaning index before re-indexing all documents.")
275
354
  self._log_data("Cleaning index before re-indexing all documents. Previous index will be removed", tool_name="index_documents")
276
355
  try:
277
- self.vectoradapter.delete_dataset(self.dataset)
356
+ self._clean_collection()
278
357
  self.vectoradapter.persist()
279
358
  self.vectoradapter.vacuum()
280
359
  self._log_data("Previous index has been removed",
@@ -284,9 +363,9 @@ class VectorStoreWrapper(BaseToolApiWrapper):
284
363
  if isinstance(documents, types.GeneratorType):
285
364
  documents = list(documents)
286
365
  else:
287
- # remove duplicates based on metadata 'id' and 'updated_on' fields
288
- documents = self._reduce_duplicates(documents, self.vectoradapter.vectorstore)
289
-
366
+ # remove duplicates based on metadata 'id' and 'updated_on' or 'commit_hash' fields
367
+ documents = self._reduce_code_duplicates(documents, self.vectoradapter.vectorstore) if is_code \
368
+ else self._reduce_non_code_duplicates(documents, self.vectoradapter.vectorstore)
290
369
 
291
370
  if not documents or len(documents) == 0:
292
371
  logger.info("No new documents to index after duplicate check.")
@@ -456,8 +535,12 @@ class VectorStoreWrapper(BaseToolApiWrapper):
456
535
  )
457
536
 
458
537
  # Initialize document map for tracking by ID
459
- doc_map = {doc.metadata.get('id', f"idx_{i}"): (doc, score)
460
- for i, (doc, score) in enumerate(vector_items)}
538
+ doc_map = {
539
+ f"{doc.metadata.get('id', f'idx_{i}')}_{doc.metadata['chunk_id']}"
540
+ if 'chunk_id' in doc.metadata
541
+ else doc.metadata.get('id', f"idx_{i}"): (doc, score)
542
+ for i, (doc, score) in enumerate(vector_items)
543
+ }
461
544
 
462
545
  # Process full-text search if configured
463
546
  if full_text_search and full_text_search.get('enabled') and full_text_search.get('fields'):
@@ -4,8 +4,11 @@ from enum import Enum
4
4
  TOOLKIT_SPLITTER = "___"
5
5
 
6
6
  class IndexerKeywords(Enum):
7
+ # TODO: remove these fields when the indexer is updated
7
8
  DEPENDENT_DOCS = 'dependent_docs'
8
9
  PARENT = 'parent_id'
10
+ # DEPENDENCY_ID = 'dependency_id'
11
+ UPDATED_ON = 'updated_on'
9
12
 
10
13
  # This pattern matches characters that are NOT alphanumeric, underscores, or hyphens
11
14
  clean_string_pattern = re.compile(r'[^a-zA-Z0-9_.-]')
@@ -14,6 +14,14 @@ def get_tools(tool_type, tool):
14
14
  "token": tool['settings'].get('token', None),
15
15
  "limit": tool['settings'].get('limit', 5),
16
16
  "toolkit_name": tool.get('toolkit_name', ''),
17
+ # indexer settings
18
+ "llm":tool['settings'].get('llm', None),
19
+ "connection_string":tool['settings'].get('connection_string', None),
20
+ "collection_name":str(tool['id']),
21
+ "doctype":'doc',
22
+ "embedding_model":"HuggingFaceEmbeddings",
23
+ "embedding_model_params":{"model_name": "sentence-transformers/all-MiniLM-L6-v2"},
24
+ "vectorstore_type":"PGVector"
17
25
  }
18
26
  if tool_type == 'ado_plans':
19
27
  return AzureDevOpsPlansToolkit().get_toolkit(**config_dict).get_tools()
@@ -302,6 +302,43 @@ class ReposApiWrapper(BaseCodeToolApiWrapper):
302
302
 
303
303
  return values
304
304
 
305
+ def _get_commits(self, file_path: str, branch: str, top: int = None) -> List[GitCommitRef]:
306
+ """
307
+ Get commits for a specific file in a specific branch.
308
+
309
+ Args:
310
+ file_path (str): Path to the file in the repository.
311
+ branch (str): Branch name to get commits from.
312
+ top (int, optional): Maximum number of commits to return. Defaults to None.
313
+
314
+ Returns:
315
+ List[GitCommitRef]: List of commit references.
316
+ """
317
+ try:
318
+ version_descriptor = GitVersionDescriptor(
319
+ version=branch, version_type="branch"
320
+ )
321
+ commits = self._client.get_commits(
322
+ repository_id=self.repository_id,
323
+ project=self.project,
324
+ search_criteria=GitQueryCommitsCriteria(item_path=file_path,
325
+ item_version=version_descriptor, top=top if top else 100),
326
+ )
327
+ return commits
328
+ except Exception as e:
329
+ msg = f"Failed to get commits for file '{file_path}' on branch '{branch}': {str(e)}"
330
+ logger.error(msg)
331
+ return ToolException(msg)
332
+
333
+ def _file_commit_hash(self, file_path: str, branch: str) -> str:
334
+ """Get the commit hash of the last commit that modified a file in a specific branch."""
335
+
336
+ commits = self._get_commits(file_path, branch, top=1)
337
+ if commits:
338
+ return commits[0].commit_id
339
+ else:
340
+ return None
341
+
305
342
  def _get_files(
306
343
  self,
307
344
  path: str = "",
@@ -184,13 +184,6 @@ class TestPlanApiWrapper(BaseVectorStoreToolApiWrapper):
184
184
  limit: Optional[int] = 5
185
185
  _client: Optional[TestPlanClient] = PrivateAttr()
186
186
 
187
- llm: Any = None
188
- connection_string: Optional[SecretStr] = None
189
- collection_name: Optional[str] = None
190
- embedding_model: Optional[str] = "HuggingFaceEmbeddings"
191
- embedding_model_params: Optional[Dict[str, Any]] = {"model_name": "sentence-transformers/all-MiniLM-L6-v2"}
192
- vectorstore_type: Optional[str] = "PGVector"
193
-
194
187
  class Config:
195
188
  arbitrary_types_allowed = True
196
189