alita-sdk 0.3.185__tar.gz → 0.3.187__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 (313) hide show
  1. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/PKG-INFO +1 -1
  2. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/ado/repos/__init__.py +6 -5
  3. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/ado/test_plan/__init__.py +5 -3
  4. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/ado/test_plan/test_plan_wrapper.py +26 -35
  5. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/ado/wiki/__init__.py +6 -9
  6. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/ado/work_item/__init__.py +6 -9
  7. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/bitbucket/api_wrapper.py +63 -0
  8. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/bitbucket/cloud_api_wrapper.py +143 -2
  9. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/bitbucket/tools.py +78 -2
  10. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk.egg-info/PKG-INFO +1 -1
  11. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/pyproject.toml +1 -1
  12. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/LICENSE +0 -0
  13. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/README.md +0 -0
  14. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/__init__.py +0 -0
  15. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/community/__init__.py +0 -0
  16. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/community/analysis/__init__.py +0 -0
  17. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/community/analysis/ado_analyse/__init__.py +0 -0
  18. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/community/analysis/ado_analyse/api_wrapper.py +0 -0
  19. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/community/analysis/github_analyse/__init__.py +0 -0
  20. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/community/analysis/github_analyse/api_wrapper.py +0 -0
  21. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/community/analysis/gitlab_analyse/__init__.py +0 -0
  22. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/community/analysis/gitlab_analyse/api_wrapper.py +0 -0
  23. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/community/analysis/jira_analyse/__init__.py +0 -0
  24. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/community/analysis/jira_analyse/api_wrapper.py +0 -0
  25. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/community/utils.py +0 -0
  26. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/__init__.py +0 -0
  27. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/clients/__init__.py +0 -0
  28. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/clients/artifact.py +0 -0
  29. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/clients/client.py +0 -0
  30. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/clients/datasource.py +0 -0
  31. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/clients/prompt.py +0 -0
  32. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/__init__.py +0 -0
  33. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/agents/__init__.py +0 -0
  34. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/agents/xml_chat.py +0 -0
  35. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/assistant.py +0 -0
  36. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/chat_message_template.py +0 -0
  37. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/constants.py +0 -0
  38. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/document_loaders/AlitaBDDScenariosLoader.py +0 -0
  39. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/document_loaders/AlitaCSVLoader.py +0 -0
  40. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/document_loaders/AlitaConfluenceLoader.py +0 -0
  41. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/document_loaders/AlitaDirectoryLoader.py +0 -0
  42. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/document_loaders/AlitaDocxMammothLoader.py +0 -0
  43. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/document_loaders/AlitaExcelLoader.py +0 -0
  44. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/document_loaders/AlitaGitRepoLoader.py +0 -0
  45. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/document_loaders/AlitaImageLoader.py +0 -0
  46. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/document_loaders/AlitaJiraLoader.py +0 -0
  47. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/document_loaders/AlitaQtestLoader.py +0 -0
  48. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/document_loaders/AlitaTableLoader.py +0 -0
  49. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/document_loaders/__init__.py +0 -0
  50. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/document_loaders/constants.py +0 -0
  51. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/document_loaders/utils.py +0 -0
  52. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/indexer.py +0 -0
  53. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/interfaces/__init__.py +0 -0
  54. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/interfaces/kwextractor.py +0 -0
  55. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/interfaces/llm_processor.py +0 -0
  56. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/interfaces/loaders.py +0 -0
  57. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/interfaces/splitters.py +0 -0
  58. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/langraph_agent.py +0 -0
  59. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/mixedAgentParser.py +0 -0
  60. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/mixedAgentRenderes.py +0 -0
  61. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/retrievers/AlitaRetriever.py +0 -0
  62. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/retrievers/VectorstoreRetriever.py +0 -0
  63. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/retrievers/__init__.py +0 -0
  64. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/store_manager.py +0 -0
  65. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/tools/__init__.py +0 -0
  66. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/tools/bdd_parser/__init__.py +0 -0
  67. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/tools/bdd_parser/bdd_exceptions.py +0 -0
  68. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/tools/bdd_parser/bdd_parser.py +0 -0
  69. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/tools/bdd_parser/feature_types.py +0 -0
  70. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/tools/bdd_parser/parser.py +0 -0
  71. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/tools/git.py +0 -0
  72. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/tools/log.py +0 -0
  73. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/tools/quota.py +0 -0
  74. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/tools/state.py +0 -0
  75. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/tools/utils.py +0 -0
  76. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/tools/vector.py +0 -0
  77. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/langchain/utils.py +0 -0
  78. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/llms/__init__.py +0 -0
  79. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/llms/alita.py +0 -0
  80. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/llms/preloaded.py +0 -0
  81. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/toolkits/__init__.py +0 -0
  82. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/toolkits/application.py +0 -0
  83. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/toolkits/artifact.py +0 -0
  84. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/toolkits/datasource.py +0 -0
  85. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/toolkits/prompt.py +0 -0
  86. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/toolkits/subgraph.py +0 -0
  87. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/toolkits/tools.py +0 -0
  88. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/toolkits/vectorstore.py +0 -0
  89. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/tools/__init__.py +0 -0
  90. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/tools/agent.py +0 -0
  91. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/tools/application.py +0 -0
  92. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/tools/artifact.py +0 -0
  93. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/tools/datasource.py +0 -0
  94. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/tools/echo.py +0 -0
  95. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/tools/function.py +0 -0
  96. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/tools/indexer_tool.py +0 -0
  97. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/tools/llm.py +0 -0
  98. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/tools/loop.py +0 -0
  99. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/tools/loop_output.py +0 -0
  100. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/tools/mcp_server_tool.py +0 -0
  101. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/tools/pgvector_search.py +0 -0
  102. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/tools/prompt.py +0 -0
  103. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/tools/router.py +0 -0
  104. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/tools/tool.py +0 -0
  105. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/tools/vectorstore.py +0 -0
  106. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/utils/AlitaCallback.py +0 -0
  107. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/utils/__init__.py +0 -0
  108. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/utils/constants.py +0 -0
  109. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/utils/evaluate.py +0 -0
  110. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/utils/logging.py +0 -0
  111. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/utils/save_dataframe.py +0 -0
  112. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/utils/streamlit.py +0 -0
  113. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/runtime/utils/utils.py +0 -0
  114. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/__init__.py +0 -0
  115. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/ado/__init__.py +0 -0
  116. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/ado/repos/repos_wrapper.py +0 -0
  117. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/ado/utils.py +0 -0
  118. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/ado/wiki/ado_wrapper.py +0 -0
  119. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/ado/work_item/ado_wrapper.py +0 -0
  120. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/advanced_jira_mining/__init__.py +0 -0
  121. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/advanced_jira_mining/data_mining_wrapper.py +0 -0
  122. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/azure_ai/__init__.py +0 -0
  123. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/azure_ai/search/__init__.py +0 -0
  124. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/azure_ai/search/api_wrapper.py +0 -0
  125. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/base/__init__.py +0 -0
  126. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/base/tool.py +0 -0
  127. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/bitbucket/__init__.py +0 -0
  128. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/bitbucket/bitbucket_constants.py +0 -0
  129. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/browser/__init__.py +0 -0
  130. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/browser/crawler.py +0 -0
  131. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/browser/duck_duck_go_search.py +0 -0
  132. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/browser/google_search_rag.py +0 -0
  133. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/browser/utils.py +0 -0
  134. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/browser/wiki.py +0 -0
  135. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/carrier/__init__.py +0 -0
  136. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/carrier/api_wrapper.py +0 -0
  137. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/carrier/backend_reports_tool.py +0 -0
  138. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/carrier/backend_tests_tool.py +0 -0
  139. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/carrier/cancel_ui_test_tool.py +0 -0
  140. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/carrier/carrier_sdk.py +0 -0
  141. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/carrier/create_ui_excel_report_tool.py +0 -0
  142. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/carrier/create_ui_test_tool.py +0 -0
  143. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/carrier/excel_reporter.py +0 -0
  144. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/carrier/lighthouse_excel_reporter.py +0 -0
  145. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/carrier/run_ui_test_tool.py +0 -0
  146. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/carrier/tickets_tool.py +0 -0
  147. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/carrier/tools.py +0 -0
  148. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/carrier/ui_reports_tool.py +0 -0
  149. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/carrier/update_ui_test_schedule_tool.py +0 -0
  150. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/carrier/utils.py +0 -0
  151. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/chunkers/__init__.py +0 -0
  152. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/chunkers/code/__init__.py +0 -0
  153. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/chunkers/code/codeparser.py +0 -0
  154. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/chunkers/code/constants.py +0 -0
  155. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/chunkers/code/treesitter/__init__.py +0 -0
  156. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/chunkers/code/treesitter/treesitter.py +0 -0
  157. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/chunkers/code/treesitter/treesitter_c.py +0 -0
  158. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/chunkers/code/treesitter/treesitter_cpp.py +0 -0
  159. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/chunkers/code/treesitter/treesitter_cs.py +0 -0
  160. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/chunkers/code/treesitter/treesitter_go.py +0 -0
  161. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/chunkers/code/treesitter/treesitter_hs.py +0 -0
  162. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/chunkers/code/treesitter/treesitter_java.py +0 -0
  163. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/chunkers/code/treesitter/treesitter_js.py +0 -0
  164. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/chunkers/code/treesitter/treesitter_kt.py +0 -0
  165. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/chunkers/code/treesitter/treesitter_py.py +0 -0
  166. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/chunkers/code/treesitter/treesitter_rb.py +0 -0
  167. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/chunkers/code/treesitter/treesitter_registry.py +0 -0
  168. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/chunkers/code/treesitter/treesitter_rs.py +0 -0
  169. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/chunkers/code/treesitter/treesitter_ts.py +0 -0
  170. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/chunkers/models.py +0 -0
  171. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/chunkers/sematic/__init__.py +0 -0
  172. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/chunkers/sematic/base.py +0 -0
  173. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/chunkers/sematic/markdown_chunker.py +0 -0
  174. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/chunkers/sematic/proposal_chunker.py +0 -0
  175. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/chunkers/sematic/statistical_chunker.py +0 -0
  176. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/chunkers/utils.py +0 -0
  177. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/cloud/__init__.py +0 -0
  178. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/cloud/aws/__init__.py +0 -0
  179. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/cloud/aws/api_wrapper.py +0 -0
  180. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/cloud/azure/__init__.py +0 -0
  181. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/cloud/azure/api_wrapper.py +0 -0
  182. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/cloud/gcp/__init__.py +0 -0
  183. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/cloud/gcp/api_wrapper.py +0 -0
  184. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/cloud/k8s/__init__.py +0 -0
  185. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/cloud/k8s/api_wrapper.py +0 -0
  186. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/code/__init__.py +0 -0
  187. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/code/linter/__init__.py +0 -0
  188. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/code/linter/api_wrapper.py +0 -0
  189. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/code/loaders/codesearcher.py +0 -0
  190. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/code/sonar/__init__.py +0 -0
  191. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/code/sonar/api_wrapper.py +0 -0
  192. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/confluence/__init__.py +0 -0
  193. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/confluence/api_wrapper.py +0 -0
  194. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/confluence/loader.py +0 -0
  195. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/confluence/utils.py +0 -0
  196. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/custom_open_api/__init__.py +0 -0
  197. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/custom_open_api/api_wrapper.py +0 -0
  198. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/elastic/__init__.py +0 -0
  199. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/elastic/api_wrapper.py +0 -0
  200. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/elitea_base.py +0 -0
  201. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/figma/__init__.py +0 -0
  202. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/figma/api_wrapper.py +0 -0
  203. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/github/__init__.py +0 -0
  204. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/github/api_wrapper.py +0 -0
  205. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/github/github_client.py +0 -0
  206. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/github/graphql_client_wrapper.py +0 -0
  207. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/github/schemas.py +0 -0
  208. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/github/tool.py +0 -0
  209. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/github/tool_prompts.py +0 -0
  210. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/gitlab/__init__.py +0 -0
  211. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/gitlab/api_wrapper.py +0 -0
  212. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/gitlab/tools.py +0 -0
  213. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/gitlab/utils.py +0 -0
  214. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/gitlab_org/__init__.py +0 -0
  215. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/gitlab_org/api_wrapper.py +0 -0
  216. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/gmail/__init__.py +0 -0
  217. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/gmail/gmail_wrapper.py +0 -0
  218. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/gmail/utils.py +0 -0
  219. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/google_places/__init__.py +0 -0
  220. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/google_places/api_wrapper.py +0 -0
  221. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/jira/__init__.py +0 -0
  222. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/jira/api_wrapper.py +0 -0
  223. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/keycloak/__init__.py +0 -0
  224. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/keycloak/api_wrapper.py +0 -0
  225. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/llm/__init__.py +0 -0
  226. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/llm/img_utils.py +0 -0
  227. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/llm/llm_utils.py +0 -0
  228. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/localgit/__init__.py +0 -0
  229. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/localgit/local_git.py +0 -0
  230. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/localgit/tool.py +0 -0
  231. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/memory/__init__.py +0 -0
  232. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/ocr/__init__.py +0 -0
  233. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/ocr/api_wrapper.py +0 -0
  234. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/ocr/text_detection.py +0 -0
  235. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/openapi/__init__.py +0 -0
  236. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/pandas/__init__.py +0 -0
  237. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/pandas/api_wrapper.py +0 -0
  238. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/pandas/dataframe/__init__.py +0 -0
  239. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/pandas/dataframe/errors.py +0 -0
  240. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/pandas/dataframe/executor/__init__.py +0 -0
  241. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/pandas/dataframe/executor/code_environment.py +0 -0
  242. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/pandas/dataframe/executor/code_executor.py +0 -0
  243. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/pandas/dataframe/generator/__init__.py +0 -0
  244. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/pandas/dataframe/generator/base.py +0 -0
  245. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/pandas/dataframe/generator/code_cleaning.py +0 -0
  246. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/pandas/dataframe/generator/code_validator.py +0 -0
  247. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/pandas/dataframe/prompts.py +0 -0
  248. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/pandas/dataframe/serializer.py +0 -0
  249. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/pandas/dataframe/utils.py +0 -0
  250. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/pandas/statsmodels/__init__.py +0 -0
  251. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/pandas/statsmodels/base_stats.py +0 -0
  252. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/pandas/statsmodels/descriptive.py +0 -0
  253. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/pandas/statsmodels/hypothesis_testing.py +0 -0
  254. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/pandas/statsmodels/regression.py +0 -0
  255. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/postman/__init__.py +0 -0
  256. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/postman/api_wrapper.py +0 -0
  257. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/postman/postman_analysis.py +0 -0
  258. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/pptx/__init__.py +0 -0
  259. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/pptx/pptx_wrapper.py +0 -0
  260. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/qtest/__init__.py +0 -0
  261. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/qtest/api_wrapper.py +0 -0
  262. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/qtest/tool.py +0 -0
  263. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/rally/__init__.py +0 -0
  264. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/rally/api_wrapper.py +0 -0
  265. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/report_portal/__init__.py +0 -0
  266. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/report_portal/api_wrapper.py +0 -0
  267. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/report_portal/report_portal_client.py +0 -0
  268. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/salesforce/__init__.py +0 -0
  269. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/salesforce/api_wrapper.py +0 -0
  270. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/salesforce/model.py +0 -0
  271. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/servicenow/__init__.py +0 -0
  272. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/servicenow/api_wrapper.py +0 -0
  273. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/servicenow/servicenow_client.py +0 -0
  274. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/sharepoint/__init__.py +0 -0
  275. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/sharepoint/api_wrapper.py +0 -0
  276. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/sharepoint/authorization_helper.py +0 -0
  277. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/sharepoint/utils.py +0 -0
  278. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/slack/__init__.py +0 -0
  279. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/slack/api_wrapper.py +0 -0
  280. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/sql/__init__.py +0 -0
  281. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/sql/api_wrapper.py +0 -0
  282. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/sql/models.py +0 -0
  283. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/testio/__init__.py +0 -0
  284. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/testio/api_wrapper.py +0 -0
  285. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/testrail/__init__.py +0 -0
  286. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/testrail/api_wrapper.py +0 -0
  287. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/utils/__init__.py +0 -0
  288. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/utils/content_parser.py +0 -0
  289. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/xray/__init__.py +0 -0
  290. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/xray/api_wrapper.py +0 -0
  291. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/yagmail/__init__.py +0 -0
  292. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/yagmail/yagmail_wrapper.py +0 -0
  293. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/zephyr/Zephyr.py +0 -0
  294. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/zephyr/__init__.py +0 -0
  295. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/zephyr/api_wrapper.py +0 -0
  296. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/zephyr/rest_client.py +0 -0
  297. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/zephyr_enterprise/__init__.py +0 -0
  298. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/zephyr_enterprise/api_wrapper.py +0 -0
  299. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/zephyr_enterprise/zephyr_enterprise.py +0 -0
  300. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/zephyr_scale/__init__.py +0 -0
  301. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/zephyr_scale/api_wrapper.py +0 -0
  302. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/zephyr_squad/__init__.py +0 -0
  303. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/zephyr_squad/api_wrapper.py +0 -0
  304. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk/tools/zephyr_squad/zephyr_squad_cloud_client.py +0 -0
  305. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk.egg-info/SOURCES.txt +0 -0
  306. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk.egg-info/dependency_links.txt +0 -0
  307. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk.egg-info/requires.txt +0 -0
  308. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/alita_sdk.egg-info/top_level.txt +0 -0
  309. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/setup.cfg +0 -0
  310. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/tests/test_ado_analysis.py +0 -0
  311. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/tests/test_github_analysis.py +0 -0
  312. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/tests/test_gitlab_analysis.py +0 -0
  313. {alita_sdk-0.3.185 → alita_sdk-0.3.187}/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.185
3
+ Version: 0.3.187
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
@@ -46,19 +46,19 @@ class AzureDevOpsReposToolkit(BaseToolkit):
46
46
  AzureDevOpsReposToolkit.toolkit_max_length = get_max_toolkit_length(selected_tools)
47
47
  m = create_model(
48
48
  name,
49
- organization_url=(Optional[str], Field(default="", title="Organization URL",
49
+ organization_url=(str, Field(title="Organization URL",
50
50
  description="ADO organization url",
51
51
  json_schema_extra={
52
52
  'configuration': True,
53
53
  "configuration_title": True
54
54
  })),
55
- project=(Optional[str], Field(default="", title="Project", description="ADO project", json_schema_extra={'configuration': True})),
56
- repository_id=(Optional[str], Field(default="", title="Repository ID", description="ADO repository ID",
55
+ project=(str, Field(title="Project", description="ADO project", json_schema_extra={'configuration': True})),
56
+ repository_id=(str, Field(title="Repository ID", description="ADO repository ID",
57
57
  json_schema_extra={
58
58
  'toolkit_name': True,
59
59
  'max_toolkit_length': AzureDevOpsReposToolkit.toolkit_max_length,
60
60
  'configuration': True})),
61
- token=(Optional[SecretStr], Field(default="", title="Token", description="ADO token", json_schema_extra={'secret': True, 'configuration': True})),
61
+ token=(SecretStr, Field(title="Token", description="ADO token", json_schema_extra={'secret': True, 'configuration': True})),
62
62
  base_branch=(Optional[str], Field(default="", title="Base branch", description="ADO base branch (e.g., main)")),
63
63
  active_branch=(Optional[str], Field(default="", title="Active branch", description="ADO active branch (e.g., main)")),
64
64
 
@@ -84,7 +84,8 @@ class AzureDevOpsReposToolkit(BaseToolkit):
84
84
  }
85
85
  },
86
86
  "categories": ["code repositories"],
87
- "extra_categories": ["code", "repository", "version control"]
87
+ "extra_categories": ["code", "repository", "version control"],
88
+ "configuration_group": "ado_repos",
88
89
  }}}
89
90
  )
90
91
 
@@ -24,12 +24,13 @@ class AzureDevOpsPlansToolkit(BaseToolkit):
24
24
  m = create_model(
25
25
  name_alias,
26
26
  name=(str, Field(description="Toolkit name", json_schema_extra={'toolkit_name': True, 'max_toolkit_length': AzureDevOpsPlansToolkit.toolkit_max_length})),
27
- organization_url=(str, Field(default="", title="Organization URL",
27
+ organization_url=(str, Field(title="Organization URL",
28
28
  description="ADO organization url",
29
29
  json_schema_extra={
30
30
  'configuration': True,
31
- "configuration_title": True
31
+ 'configuration_title': True
32
32
  })),
33
+ project=(str, Field(title="Project", description="ADO project", json_schema_extra={'configuration': True})),
33
34
  limit=(Optional[int], Field(description="ADO plans limit used for limitation of the list with results", default=5)),
34
35
  token=(SecretStr, Field(description="ADO token", json_schema_extra={'secret': True, 'configuration': True})),
35
36
  selected_tools=(List[Literal[tuple(selected_tools)]], Field(default=[], json_schema_extra={'args_schemas': selected_tools})),
@@ -49,7 +50,8 @@ class AzureDevOpsPlansToolkit(BaseToolkit):
49
50
  }
50
51
  ]
51
52
  }
52
- }
53
+ },
54
+ "configuration_group": "ado",
53
55
  }
54
56
  }
55
57
  }
@@ -20,19 +20,16 @@ logger = logging.getLogger(__name__)
20
20
  # Input models for Test Plan operations
21
21
  TestPlanCreateModel = create_model(
22
22
  "TestPlanCreateModel",
23
- test_plan_create_params=(str, Field(description="JSON of the test plan create parameters")),
24
- project=(str, Field(description="Project ID or project name"))
23
+ test_plan_create_params=(str, Field(description="JSON of the test plan create parameters"))
25
24
  )
26
25
 
27
26
  TestPlanDeleteModel = create_model(
28
27
  "TestPlanDeleteModel",
29
- project=(str, Field(description="Project ID or project name")),
30
28
  plan_id=(int, Field(description="ID of the test plan to be deleted"))
31
29
  )
32
30
 
33
31
  TestPlanGetModel = create_model(
34
32
  "TestPlanGetModel",
35
- project=(str, Field(description="Project ID or project name")),
36
33
  plan_id=(Optional[int], Field(description="ID of the test plan to get", default=None))
37
34
  )
38
35
 
@@ -77,20 +74,17 @@ TestSuiteCreateModel = create_model(
77
74
  'name':'str'
78
75
  }
79
76
  """)),
80
- project=(str, Field(description="Project ID or project name")),
81
77
  plan_id=(int, Field(description="ID of the test plan that contains the suites"))
82
78
  )
83
79
 
84
80
  TestSuiteDeleteModel = create_model(
85
81
  "TestSuiteDeleteModel",
86
- project=(str, Field(description="Project ID or project name")),
87
82
  plan_id=(int, Field(description="ID of the test plan that contains the suite")),
88
83
  suite_id=(int, Field(description="ID of the test suite to delete"))
89
84
  )
90
85
 
91
86
  TestSuiteGetModel = create_model(
92
87
  "TestSuiteGetModel",
93
- project=(str, Field(description="Project ID or project name")),
94
88
  plan_id=(int, Field(description="ID of the test plan that contains the suites")),
95
89
  suite_id=(Optional[int], Field(description="ID of the suite to get", default=None))
96
90
  )
@@ -98,14 +92,12 @@ TestSuiteGetModel = create_model(
98
92
  TestCaseAddModel = create_model(
99
93
  "TestCaseAddModel",
100
94
  suite_test_case_create_update_parameters=(str, Field(description='JSON array of the suite test case create update parameters. Example: \"[{"work_item":{"id":"23"}}]\"')),
101
- project=(str, Field(description="Project ID or project name")),
102
95
  plan_id=(int, Field(description="ID of the test plan to which test cases are to be added")),
103
96
  suite_id=(int, Field(description="ID of the test suite to which test cases are to be added"))
104
97
  )
105
98
 
106
99
  TestCaseCreateModel = create_model(
107
100
  "TestCaseCreateModel",
108
- project=(str, Field(description="Project ID or project name")),
109
101
  plan_id=(int, Field(description="ID of the test plan to which test cases are to be added")),
110
102
  suite_id=(int, Field(description="ID of the test suite to which test cases are to be added")),
111
103
  title=(str, Field(description="Test case title")),
@@ -115,7 +107,6 @@ TestCaseCreateModel = create_model(
115
107
 
116
108
  TestCaseGetModel = create_model(
117
109
  "TestCaseGetModel",
118
- project=(str, Field(description="Project ID or project name")),
119
110
  plan_id=(int, Field(description="ID of the test plan for which test cases are requested")),
120
111
  suite_id=(int, Field(description="ID of the test suite for which test cases are requested")),
121
112
  test_case_id=(str, Field(description="Test Case Id to be fetched"))
@@ -123,7 +114,6 @@ TestCaseGetModel = create_model(
123
114
 
124
115
  TestCasesGetModel = create_model(
125
116
  "TestCasesGetModel",
126
- project=(str, Field(description="Project ID or project name")),
127
117
  plan_id=(int, Field(description="ID of the test plan for which test cases are requested")),
128
118
  suite_id=(int, Field(description="ID of the test suite for which test cases are requested"))
129
119
  )
@@ -131,6 +121,7 @@ TestCasesGetModel = create_model(
131
121
  class TestPlanApiWrapper(BaseToolApiWrapper):
132
122
  __test__ = False
133
123
  organization_url: str
124
+ project: str
134
125
  token: SecretStr
135
126
  limit: Optional[int] = 5
136
127
  _client: Optional[TestPlanClient] = PrivateAttr()
@@ -148,90 +139,90 @@ class TestPlanApiWrapper(BaseToolApiWrapper):
148
139
  raise ImportError(f"Failed to connect to Azure DevOps: {e}")
149
140
  return values
150
141
 
151
- def create_test_plan(self, test_plan_create_params: str, project: str):
142
+ def create_test_plan(self, test_plan_create_params: str):
152
143
  """Create a test plan in Azure DevOps."""
153
144
  try:
154
145
  params = json.loads(test_plan_create_params)
155
146
  test_plan_create_params_obj = TestPlanCreateParams(**params)
156
- test_plan = self._client.create_test_plan(test_plan_create_params_obj, project)
147
+ test_plan = self._client.create_test_plan(test_plan_create_params_obj, self.project)
157
148
  return f"Test plan {test_plan.id} created successfully."
158
149
  except Exception as e:
159
150
  logger.error(f"Error creating test plan: {e}")
160
151
  return ToolException(f"Error creating test plan: {e}")
161
152
 
162
- def delete_test_plan(self, project: str, plan_id: int):
153
+ def delete_test_plan(self, plan_id: int):
163
154
  """Delete a test plan in Azure DevOps."""
164
155
  try:
165
- self._client.delete_test_plan(project, plan_id)
156
+ self._client.delete_test_plan(self.project, plan_id)
166
157
  return f"Test plan {plan_id} deleted successfully."
167
158
  except Exception as e:
168
159
  logger.error(f"Error deleting test plan: {e}")
169
160
  return ToolException(f"Error deleting test plan: {e}")
170
161
 
171
- def get_test_plan(self, project: str, plan_id: Optional[int] = None):
162
+ def get_test_plan(self, plan_id: Optional[int] = None):
172
163
  """Get a test plan or list of test plans in Azure DevOps."""
173
164
  try:
174
165
  if plan_id:
175
- test_plan = self._client.get_test_plan_by_id(project, plan_id)
166
+ test_plan = self._client.get_test_plan_by_id(self.project, plan_id)
176
167
  return test_plan.as_dict()
177
168
  else:
178
- test_plans = self._client.get_test_plans(project)
169
+ test_plans = self._client.get_test_plans(self.project)
179
170
  return [plan.as_dict() for plan in test_plans]
180
171
  except Exception as e:
181
172
  logger.error(f"Error getting test plan(s): {e}")
182
173
  return ToolException(f"Error getting test plan(s): {e}")
183
174
 
184
- def create_test_suite(self, test_suite_create_params: str, project: str, plan_id: int):
175
+ def create_test_suite(self, test_suite_create_params: str, plan_id: int):
185
176
  """Create a test suite in Azure DevOps."""
186
177
  try:
187
178
  params = json.loads(test_suite_create_params)
188
179
  test_suite_create_params_obj = TestSuiteCreateParams(**params)
189
- test_suite = self._client.create_test_suite(test_suite_create_params_obj, project, plan_id)
180
+ test_suite = self._client.create_test_suite(test_suite_create_params_obj, self.project, plan_id)
190
181
  return f"Test suite {test_suite.id} created successfully."
191
182
  except Exception as e:
192
183
  logger.error(f"Error creating test suite: {e}")
193
184
  return ToolException(f"Error creating test suite: {e}")
194
185
 
195
- def delete_test_suite(self, project: str, plan_id: int, suite_id: int):
186
+ def delete_test_suite(self, plan_id: int, suite_id: int):
196
187
  """Delete a test suite in Azure DevOps."""
197
188
  try:
198
- self._client.delete_test_suite(project, plan_id, suite_id)
189
+ self._client.delete_test_suite(self.project, plan_id, suite_id)
199
190
  return f"Test suite {suite_id} deleted successfully."
200
191
  except Exception as e:
201
192
  logger.error(f"Error deleting test suite: {e}")
202
193
  return ToolException(f"Error deleting test suite: {e}")
203
194
 
204
- def get_test_suite(self, project: str, plan_id: int, suite_id: Optional[int] = None):
195
+ def get_test_suite(self, plan_id: int, suite_id: Optional[int] = None):
205
196
  """Get a test suite or list of test suites in Azure DevOps."""
206
197
  try:
207
198
  if suite_id:
208
- test_suite = self._client.get_test_suite_by_id(project, plan_id, suite_id)
199
+ test_suite = self._client.get_test_suite_by_id(self.project, plan_id, suite_id)
209
200
  return test_suite.as_dict()
210
201
  else:
211
- test_suites = self._client.get_test_suites_for_plan(project, plan_id)
202
+ test_suites = self._client.get_test_suites_for_plan(self.project, plan_id)
212
203
  return [suite.as_dict() for suite in test_suites]
213
204
  except Exception as e:
214
205
  logger.error(f"Error getting test suite(s): {e}")
215
206
  return ToolException(f"Error getting test suite(s): {e}")
216
207
 
217
- def add_test_case(self, suite_test_case_create_update_parameters, project: str, plan_id: int, suite_id: int):
208
+ def add_test_case(self, suite_test_case_create_update_parameters, plan_id: int, suite_id: int):
218
209
  """Add a test case to a suite in Azure DevOps."""
219
210
  try:
220
211
  if isinstance(suite_test_case_create_update_parameters, str):
221
212
  suite_test_case_create_update_parameters = json.loads(suite_test_case_create_update_parameters)
222
213
  suite_test_case_create_update_params_obj = [SuiteTestCaseCreateUpdateParameters(**param) for param in suite_test_case_create_update_parameters]
223
- test_cases = self._client.add_test_cases_to_suite(suite_test_case_create_update_params_obj, project, plan_id, suite_id)
214
+ test_cases = self._client.add_test_cases_to_suite(suite_test_case_create_update_params_obj, self.project, plan_id, suite_id)
224
215
  return [test_case.as_dict() for test_case in test_cases]
225
216
  except Exception as e:
226
217
  logger.error(f"Error adding test case: {e}")
227
218
  return ToolException(f"Error adding test case: {e}")
228
219
 
229
- def create_test_case(self, project: str, plan_id: int, suite_id: int, title: str, description: str, test_steps: str):
220
+ def create_test_case(self, plan_id: int, suite_id: int, title: str, description: str, test_steps: str):
230
221
  """Creates a new test case in specified suite in Azure DevOps."""
231
- work_item_wrapper = AzureDevOpsApiWrapper(organization_url=self.organization_url, token=self.token.get_secret_value(), project=project)
222
+ work_item_wrapper = AzureDevOpsApiWrapper(organization_url=self.organization_url, token=self.token.get_secret_value(), project=self.project)
232
223
  work_item_json = self.build_ado_test_case(title, description, json.loads(test_steps))
233
224
  created_work_item_id = work_item_wrapper.create_work_item(work_item_json=json.dumps(work_item_json), wi_type="Test Case")['id']
234
- return self.add_test_case([{"work_item":{"id":created_work_item_id}}], project, plan_id, suite_id)
225
+ return self.add_test_case([{"work_item":{"id":created_work_item_id}}], plan_id, suite_id)
235
226
 
236
227
  def build_ado_test_case(self, title, description, steps):
237
228
  """
@@ -259,23 +250,23 @@ class TestPlanApiWrapper(BaseToolApiWrapper):
259
250
  }
260
251
  }
261
252
 
262
- def get_test_case(self, project: str, plan_id: int, suite_id: int, test_case_id: str):
253
+ def get_test_case(self, plan_id: int, suite_id: int, test_case_id: str):
263
254
  """Get a test case from a suite in Azure DevOps."""
264
255
  try:
265
- test_cases = self._client.get_test_case(project, plan_id, suite_id, test_case_id)
256
+ test_cases = self._client.get_test_case(self.project, plan_id, suite_id, test_case_id)
266
257
  if test_cases: # This checks if the list is not empty
267
258
  test_case = test_cases[0]
268
259
  return test_case.as_dict()
269
260
  else:
270
- return f"No test cases found per given criteria: project {project}, plan {plan_id}, suite {suite_id}, test case id {test_case_id}"
261
+ return f"No test cases found per given criteria: project {self.project}, plan {plan_id}, suite {suite_id}, test case id {test_case_id}"
271
262
  except Exception as e:
272
263
  logger.error(f"Error getting test case: {e}")
273
264
  return ToolException(f"Error getting test case: {e}")
274
265
 
275
- def get_test_cases(self, project: str, plan_id: int, suite_id: int):
266
+ def get_test_cases(self, plan_id: int, suite_id: int):
276
267
  """Get test cases from a suite in Azure DevOps."""
277
268
  try:
278
- test_cases = self._client.get_test_case_list(project, plan_id, suite_id)
269
+ test_cases = self._client.get_test_case_list(self.project, plan_id, suite_id)
279
270
  return [test_case.as_dict() for test_case in test_cases]
280
271
  except Exception as e:
281
272
  logger.error(f"Error getting test cases: {e}")
@@ -25,14 +25,10 @@ class AzureDevOpsWikiToolkit(BaseToolkit):
25
25
  'toolkit_name': True,
26
26
  'max_toolkit_length': AzureDevOpsWikiToolkit.toolkit_max_length})
27
27
  ),
28
- organization_url=(str, Field(default="", title="Organization URL",
29
- description="ADO organization url",
30
- json_schema_extra={
31
- 'configuration': True,
32
- "configuration_title": True
33
- })),
34
- project=(str, Field(description="ADO project", json_schema_extra={'toolkit_name': True, 'max_toolkit_length': AzureDevOpsWikiToolkit.toolkit_max_length, 'configuration': True})),
35
- token=(SecretStr, Field(description="ADO token", json_schema_extra={'secret': True, 'configuration': True})),
28
+ organization_url=(str, Field(title="Organization URL",
29
+ description="ADO organization url")),
30
+ project=(str, Field(description="ADO project", json_schema_extra={'toolkit_name': True, 'max_toolkit_length': AzureDevOpsWikiToolkit.toolkit_max_length})),
31
+ token=(SecretStr, Field(description="ADO token", json_schema_extra={'secret': True})),
36
32
  selected_tools=(List[Literal[tuple(selected_tools)]],
37
33
  Field(default=[], json_schema_extra={'args_schemas': selected_tools})),
38
34
  __config__={
@@ -52,7 +48,8 @@ class AzureDevOpsWikiToolkit(BaseToolkit):
52
48
  }
53
49
  ]
54
50
  }
55
- }
51
+ },
52
+ "configuration_group": "ado",
56
53
  }
57
54
  }
58
55
  }
@@ -24,14 +24,10 @@ class AzureDevOpsWorkItemsToolkit(BaseToolkit):
24
24
  'toolkit_name': True,
25
25
  'max_toolkit_length': AzureDevOpsWorkItemsToolkit.toolkit_max_length})
26
26
  ),
27
- organization_url=(str, Field(default="", title="Organization URL",
28
- description="ADO organization url",
29
- json_schema_extra={
30
- 'configuration': True,
31
- "configuration_title": True
32
- })),
33
- project=(str, Field(description="ADO project", json_schema_extra={'toolkit_name': True, 'max_toolkit_length': AzureDevOpsWorkItemsToolkit.toolkit_max_length, 'configuration': True})),
34
- token=(SecretStr, Field(description="ADO token", json_schema_extra={'secret': True, 'configuration': True})),
27
+ organization_url=(str, Field(title="Organization URL",
28
+ description="ADO organization url")),
29
+ project=(str, Field(description="ADO project", json_schema_extra={'toolkit_name': True, 'max_toolkit_length': AzureDevOpsWorkItemsToolkit.toolkit_max_length})),
30
+ token=(SecretStr, Field(description="ADO token", json_schema_extra={'secret': True})),
35
31
  limit=(Optional[int], Field(description="ADO plans limit used for limitation of the list with results", default=5)),
36
32
  selected_tools=(List[Literal[tuple(selected_tools)]], Field(default=[], json_schema_extra={'args_schemas': selected_tools})),
37
33
  __config__={
@@ -51,7 +47,8 @@ class AzureDevOpsWorkItemsToolkit(BaseToolkit):
51
47
  }
52
48
  ]
53
49
  }
54
- }
50
+ },
51
+ "configuration_group": "ado",
55
52
  }
56
53
  }
57
54
  }
@@ -149,6 +149,69 @@ class BitbucketAPIWrapper(BaseCodeToolApiWrapper):
149
149
  return result if isinstance(result, ToolException) else f"File has been updated: {file_path}."
150
150
  except Exception as e:
151
151
  return ToolException(f"File was not updated due to error: {str(e)}")
152
+
153
+ def get_pull_requests_commits(self, pr_id: str) -> List[Dict[str, Any]]:
154
+ """
155
+ Get commits from a pull request
156
+ Parameters:
157
+ pr_id(str): the pull request ID
158
+ Returns:
159
+ List[Dict[str, Any]]: List of commits in the pull request
160
+ """
161
+ try:
162
+ result = self._bitbucket.get_pull_request_commits(pr_id=pr_id)
163
+ return result
164
+ except Exception as e:
165
+ return ToolException(f"Can't get commits from pull request `{pr_id}` due to error:\n{str(e)}")
166
+
167
+ def get_pull_requests(self) -> List[Dict[str, Any]]:
168
+ """
169
+ Get pull requests from the repository
170
+ Returns:
171
+ List[Dict[str, Any]]: List of pull requests in the repository
172
+ """
173
+ return self._bitbucket.get_pull_requests()
174
+
175
+ def get_pull_request(self, pr_id: str) -> Any:
176
+ """
177
+ Get details of a pull request
178
+ Parameters:
179
+ pr_id(str): the pull request ID
180
+ Returns:
181
+ Any: Details of the pull request
182
+ """
183
+ try:
184
+ return self._bitbucket.get_pull_request(pr_id=pr_id)
185
+ except Exception as e:
186
+ return ToolException(f"Can't get pull request `{pr_id}` due to error:\n{str(e)}")
187
+
188
+ def get_pull_requests_changes(self, pr_id: str) -> Any:
189
+ """
190
+ Get changes of a pull request
191
+ Parameters:
192
+ pr_id(str): the pull request ID
193
+ Returns:
194
+ Any: Changes of the pull request
195
+ """
196
+ try:
197
+ return self._bitbucket.get_pull_requests_changes(pr_id=pr_id)
198
+ except Exception as e:
199
+ return ToolException(f"Can't get changes from pull request `{pr_id}` due to error:\n{str(e)}")
200
+
201
+ def add_pull_request_comment(self, pr_id: str, content, inline=None) -> str:
202
+ """
203
+ Add a comment to a pull request. Supports multiple content types and inline comments.
204
+ Parameters:
205
+ pr_id (str): the pull request ID
206
+ content (str or dict): The comment content. Can be a string (raw text) or a dict with keys 'raw', 'markup', 'html'.
207
+ inline (dict, optional): Inline comment details. Example: {"from": 57, "to": 122, "path": "<string>"}
208
+ Returns:
209
+ str: A success or failure message
210
+ """
211
+ try:
212
+ return self._bitbucket.add_pull_request_comment(pr_id=pr_id, content=content, inline=inline)
213
+ except Exception as e:
214
+ return ToolException(f"Can't add comment to pull request `{pr_id}` due to error:\n{str(e)}")
152
215
 
153
216
  def _get_files(self, file_path: str, branch: str) -> str:
154
217
  """
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import json
4
4
  import logging
5
5
  from abc import ABC, abstractmethod
6
- from typing import TYPE_CHECKING, Any
6
+ from typing import TYPE_CHECKING, Any, Dict, List
7
7
 
8
8
  from atlassian.bitbucket import Bitbucket, Cloud
9
9
  from langchain_core.tools import ToolException
@@ -43,6 +43,22 @@ class BitbucketApiAbstract(ABC):
43
43
  def create_file(self, file_path: str, file_contents: str, branch: str) -> str:
44
44
  pass
45
45
 
46
+ @abstractmethod
47
+ def get_pull_request_commits(self, pr_id: str) -> List[Dict[str, Any]]:
48
+ pass
49
+
50
+ @abstractmethod
51
+ def get_pull_request(self, pr_id: str) -> Any:
52
+ pass
53
+
54
+ @abstractmethod
55
+ def get_pull_requests_changes(self, pr_id: str) -> Any:
56
+ pass
57
+
58
+ @abstractmethod
59
+ def add_pull_request_comment(self, pr_id: str, text: str) -> str:
60
+ pass
61
+
46
62
 
47
63
  class BitbucketServerApi(BitbucketApiAbstract):
48
64
  api_client: Bitbucket
@@ -122,6 +138,71 @@ class BitbucketServerApi(BitbucketApiAbstract):
122
138
  filename=file_path,
123
139
  source_commit_id=source_commit['id']
124
140
  )
141
+
142
+ def get_pull_request_commits(self, pr_id: str) -> List[Dict[str, Any]]:
143
+ """
144
+ Get commits from a pull request
145
+ Parameters:
146
+ pr_id(str): the pull request ID
147
+ Returns:
148
+ List[Dict[str, Any]]: List of commits in the pull request
149
+ """
150
+ return self.api_client.get_pull_requests_commits(project_key=self.project, repository_slug=self.repository, pull_request_id=pr_id)
151
+
152
+ def get_pull_request(self, pr_id):
153
+ """ Get details of a pull request
154
+ Parameters:
155
+ pr_id(str): the pull request ID
156
+ Returns:
157
+ Any: Details of the pull request
158
+ """
159
+ return self.api_client.get_pull_request(project_key=self.project, repository_slug=self.repository, pull_request_id=pr_id)
160
+
161
+ def get_pull_requests_changes(self, pr_id: str) -> Any:
162
+ """
163
+ Get changes of a pull request
164
+ Parameters:
165
+ pr_id(str): the pull request ID
166
+ Returns:
167
+ Any: Changes of the pull request
168
+ """
169
+ return self.api_client.get_pull_requests_changes(project_key=self.project, repository_slug=self.repository, pull_request_id=pr_id)
170
+
171
+ def add_pull_request_comment(self, pr_id, content, inline=None):
172
+ """
173
+ Add a comment to a pull request. Supports multiple content types and inline comments.
174
+ Parameters:
175
+ pr_id (str): the pull request ID
176
+ content (dict or str): The comment content. If str, will be used as raw text. If dict, can include 'raw', 'markup', 'html'.
177
+ inline (dict, optional): Inline comment details. Example: {"from": 57, "to": 122, "path": "<string>"}
178
+ Returns:
179
+ str: The API response or created comment URL
180
+ """
181
+ # Build the comment data
182
+ if isinstance(content, str):
183
+ comment_data = {"text": content}
184
+ elif isinstance(content, dict):
185
+ # Bitbucket Server API expects 'text' (raw), and optionally 'markup' and 'html' in a 'content' field
186
+ if 'raw' in content or 'markup' in content or 'html' in content:
187
+ comment_data = {"text": content.get("raw", "")}
188
+ if 'markup' in content:
189
+ comment_data["markup"] = content["markup"]
190
+ if 'html' in content:
191
+ comment_data["html"] = content["html"]
192
+ else:
193
+ comment_data = {"text": str(content)}
194
+ else:
195
+ comment_data = {"text": str(content)}
196
+
197
+ if inline:
198
+ comment_data["inline"] = inline
199
+
200
+ return self.api_client.add_pull_request_comment(
201
+ project_key=self.project,
202
+ repository_slug=self.repository,
203
+ pull_request_id=pr_id,
204
+ **comment_data
205
+ )
125
206
 
126
207
  class BitbucketCloudApi(BitbucketApiAbstract):
127
208
  api_client: Cloud
@@ -195,4 +276,64 @@ class BitbucketCloudApi(BitbucketApiAbstract):
195
276
  "It may be helpful to use the read_file action to get "
196
277
  "the current file contents."
197
278
  )
198
- return self.create_file(file_path, updated_file_content, branch)
279
+ return self.create_file(file_path, updated_file_content, branch)
280
+
281
+ def get_pull_request_commits(self, pr_id: str) -> List[Dict[str, Any]]:
282
+ """
283
+ Get commits from a pull request
284
+ Parameters:
285
+ pr_id(str): the pull request ID
286
+ Returns:
287
+ List[Dict[str, Any]]: List of commits in the pull request
288
+ """
289
+ commits = self.repository.pullrequests.get(pr_id).get('commits', [])
290
+ if not isinstance(commits, list):
291
+ commits = list(commits)
292
+ return commits
293
+
294
+ def get_pull_request(self, pr_id: str) -> Any:
295
+ """ Get details of a pull request
296
+ Parameters:
297
+ pr_id(str): the pull request ID
298
+ Returns:
299
+ Any: Details of the pull request
300
+ """
301
+ return self.repository.pullrequests.get(pr_id)
302
+
303
+ def get_pull_requests_changes(self, pr_id: str) -> Any:
304
+ """
305
+ Get changes of a pull request
306
+ Parameters:
307
+ pr_id(str): the pull request ID
308
+ Returns:
309
+ Any: Changes of the pull request
310
+ """
311
+ return self.repository.pullrequests.get(pr_id).get('diff', {})
312
+
313
+ def add_pull_request_comment(self, pr_id: str, content, inline=None) -> str:
314
+ """
315
+ Add a comment to a pull request. Supports multiple content types and inline comments.
316
+ Parameters:
317
+ pr_id (str): the pull request ID
318
+ content (dict or str): The comment content. If str, will be used as raw text. If dict, can include 'raw', 'markup', 'html'.
319
+ inline (dict, optional): Inline comment details. Example: {"from": 57, "to": 122, "path": "<string>"}
320
+ Returns:
321
+ str: The URL of the created comment
322
+ """
323
+ # Build the content dict for Bitbucket Cloud
324
+ if isinstance(content, str):
325
+ content_dict = {"raw": content}
326
+ elif isinstance(content, dict):
327
+ # Only include allowed keys
328
+ content_dict = {k: v for k, v in content.items() if k in ("raw", "markup", "html")}
329
+ if not content_dict:
330
+ content_dict = {"raw": str(content)}
331
+ else:
332
+ content_dict = {"raw": str(content)}
333
+
334
+ data = {"content": content_dict}
335
+ if inline:
336
+ data["inline"] = inline
337
+
338
+ response = self.repository.pullrequests.comments.post(pr_id, data=data)
339
+ return response['links']['self']['href']