alita-sdk 0.3.257__py3-none-any.whl → 0.3.584__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (281) hide show
  1. alita_sdk/cli/__init__.py +10 -0
  2. alita_sdk/cli/__main__.py +17 -0
  3. alita_sdk/cli/agent/__init__.py +5 -0
  4. alita_sdk/cli/agent/default.py +258 -0
  5. alita_sdk/cli/agent_executor.py +155 -0
  6. alita_sdk/cli/agent_loader.py +215 -0
  7. alita_sdk/cli/agent_ui.py +228 -0
  8. alita_sdk/cli/agents.py +3794 -0
  9. alita_sdk/cli/callbacks.py +647 -0
  10. alita_sdk/cli/cli.py +168 -0
  11. alita_sdk/cli/config.py +306 -0
  12. alita_sdk/cli/context/__init__.py +30 -0
  13. alita_sdk/cli/context/cleanup.py +198 -0
  14. alita_sdk/cli/context/manager.py +731 -0
  15. alita_sdk/cli/context/message.py +285 -0
  16. alita_sdk/cli/context/strategies.py +289 -0
  17. alita_sdk/cli/context/token_estimation.py +127 -0
  18. alita_sdk/cli/formatting.py +182 -0
  19. alita_sdk/cli/input_handler.py +419 -0
  20. alita_sdk/cli/inventory.py +1073 -0
  21. alita_sdk/cli/mcp_loader.py +315 -0
  22. alita_sdk/cli/toolkit.py +327 -0
  23. alita_sdk/cli/toolkit_loader.py +85 -0
  24. alita_sdk/cli/tools/__init__.py +43 -0
  25. alita_sdk/cli/tools/approval.py +224 -0
  26. alita_sdk/cli/tools/filesystem.py +1751 -0
  27. alita_sdk/cli/tools/planning.py +389 -0
  28. alita_sdk/cli/tools/terminal.py +414 -0
  29. alita_sdk/community/__init__.py +72 -12
  30. alita_sdk/community/inventory/__init__.py +236 -0
  31. alita_sdk/community/inventory/config.py +257 -0
  32. alita_sdk/community/inventory/enrichment.py +2137 -0
  33. alita_sdk/community/inventory/extractors.py +1469 -0
  34. alita_sdk/community/inventory/ingestion.py +3172 -0
  35. alita_sdk/community/inventory/knowledge_graph.py +1457 -0
  36. alita_sdk/community/inventory/parsers/__init__.py +218 -0
  37. alita_sdk/community/inventory/parsers/base.py +295 -0
  38. alita_sdk/community/inventory/parsers/csharp_parser.py +907 -0
  39. alita_sdk/community/inventory/parsers/go_parser.py +851 -0
  40. alita_sdk/community/inventory/parsers/html_parser.py +389 -0
  41. alita_sdk/community/inventory/parsers/java_parser.py +593 -0
  42. alita_sdk/community/inventory/parsers/javascript_parser.py +629 -0
  43. alita_sdk/community/inventory/parsers/kotlin_parser.py +768 -0
  44. alita_sdk/community/inventory/parsers/markdown_parser.py +362 -0
  45. alita_sdk/community/inventory/parsers/python_parser.py +604 -0
  46. alita_sdk/community/inventory/parsers/rust_parser.py +858 -0
  47. alita_sdk/community/inventory/parsers/swift_parser.py +832 -0
  48. alita_sdk/community/inventory/parsers/text_parser.py +322 -0
  49. alita_sdk/community/inventory/parsers/yaml_parser.py +370 -0
  50. alita_sdk/community/inventory/patterns/__init__.py +61 -0
  51. alita_sdk/community/inventory/patterns/ast_adapter.py +380 -0
  52. alita_sdk/community/inventory/patterns/loader.py +348 -0
  53. alita_sdk/community/inventory/patterns/registry.py +198 -0
  54. alita_sdk/community/inventory/presets.py +535 -0
  55. alita_sdk/community/inventory/retrieval.py +1403 -0
  56. alita_sdk/community/inventory/toolkit.py +173 -0
  57. alita_sdk/community/inventory/toolkit_utils.py +176 -0
  58. alita_sdk/community/inventory/visualize.py +1370 -0
  59. alita_sdk/configurations/__init__.py +11 -0
  60. alita_sdk/configurations/ado.py +148 -2
  61. alita_sdk/configurations/azure_search.py +1 -1
  62. alita_sdk/configurations/bigquery.py +1 -1
  63. alita_sdk/configurations/bitbucket.py +94 -2
  64. alita_sdk/configurations/browser.py +18 -0
  65. alita_sdk/configurations/carrier.py +19 -0
  66. alita_sdk/configurations/confluence.py +130 -1
  67. alita_sdk/configurations/delta_lake.py +1 -1
  68. alita_sdk/configurations/figma.py +76 -5
  69. alita_sdk/configurations/github.py +65 -1
  70. alita_sdk/configurations/gitlab.py +81 -0
  71. alita_sdk/configurations/google_places.py +17 -0
  72. alita_sdk/configurations/jira.py +103 -0
  73. alita_sdk/configurations/openapi.py +323 -0
  74. alita_sdk/configurations/postman.py +1 -1
  75. alita_sdk/configurations/qtest.py +72 -3
  76. alita_sdk/configurations/report_portal.py +115 -0
  77. alita_sdk/configurations/salesforce.py +19 -0
  78. alita_sdk/configurations/service_now.py +1 -12
  79. alita_sdk/configurations/sharepoint.py +167 -0
  80. alita_sdk/configurations/sonar.py +18 -0
  81. alita_sdk/configurations/sql.py +20 -0
  82. alita_sdk/configurations/testio.py +101 -0
  83. alita_sdk/configurations/testrail.py +88 -0
  84. alita_sdk/configurations/xray.py +94 -1
  85. alita_sdk/configurations/zephyr_enterprise.py +94 -1
  86. alita_sdk/configurations/zephyr_essential.py +95 -0
  87. alita_sdk/runtime/clients/artifact.py +21 -4
  88. alita_sdk/runtime/clients/client.py +458 -67
  89. alita_sdk/runtime/clients/mcp_discovery.py +342 -0
  90. alita_sdk/runtime/clients/mcp_manager.py +262 -0
  91. alita_sdk/runtime/clients/sandbox_client.py +352 -0
  92. alita_sdk/runtime/langchain/_constants_bkup.py +1318 -0
  93. alita_sdk/runtime/langchain/assistant.py +183 -43
  94. alita_sdk/runtime/langchain/constants.py +647 -1
  95. alita_sdk/runtime/langchain/document_loaders/AlitaDocxMammothLoader.py +315 -3
  96. alita_sdk/runtime/langchain/document_loaders/AlitaExcelLoader.py +209 -31
  97. alita_sdk/runtime/langchain/document_loaders/AlitaImageLoader.py +1 -1
  98. alita_sdk/runtime/langchain/document_loaders/AlitaJSONLinesLoader.py +77 -0
  99. alita_sdk/runtime/langchain/document_loaders/AlitaJSONLoader.py +10 -3
  100. alita_sdk/runtime/langchain/document_loaders/AlitaMarkdownLoader.py +66 -0
  101. alita_sdk/runtime/langchain/document_loaders/AlitaPDFLoader.py +79 -10
  102. alita_sdk/runtime/langchain/document_loaders/AlitaPowerPointLoader.py +52 -15
  103. alita_sdk/runtime/langchain/document_loaders/AlitaPythonLoader.py +9 -0
  104. alita_sdk/runtime/langchain/document_loaders/AlitaTableLoader.py +1 -4
  105. alita_sdk/runtime/langchain/document_loaders/AlitaTextLoader.py +15 -2
  106. alita_sdk/runtime/langchain/document_loaders/ImageParser.py +30 -0
  107. alita_sdk/runtime/langchain/document_loaders/constants.py +189 -41
  108. alita_sdk/runtime/langchain/interfaces/llm_processor.py +4 -2
  109. alita_sdk/runtime/langchain/langraph_agent.py +493 -105
  110. alita_sdk/runtime/langchain/utils.py +118 -8
  111. alita_sdk/runtime/llms/preloaded.py +2 -6
  112. alita_sdk/runtime/models/mcp_models.py +61 -0
  113. alita_sdk/runtime/skills/__init__.py +91 -0
  114. alita_sdk/runtime/skills/callbacks.py +498 -0
  115. alita_sdk/runtime/skills/discovery.py +540 -0
  116. alita_sdk/runtime/skills/executor.py +610 -0
  117. alita_sdk/runtime/skills/input_builder.py +371 -0
  118. alita_sdk/runtime/skills/models.py +330 -0
  119. alita_sdk/runtime/skills/registry.py +355 -0
  120. alita_sdk/runtime/skills/skill_runner.py +330 -0
  121. alita_sdk/runtime/toolkits/__init__.py +28 -0
  122. alita_sdk/runtime/toolkits/application.py +14 -4
  123. alita_sdk/runtime/toolkits/artifact.py +25 -9
  124. alita_sdk/runtime/toolkits/datasource.py +13 -6
  125. alita_sdk/runtime/toolkits/mcp.py +782 -0
  126. alita_sdk/runtime/toolkits/planning.py +178 -0
  127. alita_sdk/runtime/toolkits/skill_router.py +238 -0
  128. alita_sdk/runtime/toolkits/subgraph.py +11 -6
  129. alita_sdk/runtime/toolkits/tools.py +314 -70
  130. alita_sdk/runtime/toolkits/vectorstore.py +11 -5
  131. alita_sdk/runtime/tools/__init__.py +24 -0
  132. alita_sdk/runtime/tools/application.py +16 -4
  133. alita_sdk/runtime/tools/artifact.py +367 -33
  134. alita_sdk/runtime/tools/data_analysis.py +183 -0
  135. alita_sdk/runtime/tools/function.py +100 -4
  136. alita_sdk/runtime/tools/graph.py +81 -0
  137. alita_sdk/runtime/tools/image_generation.py +218 -0
  138. alita_sdk/runtime/tools/llm.py +1032 -177
  139. alita_sdk/runtime/tools/loop.py +3 -1
  140. alita_sdk/runtime/tools/loop_output.py +3 -1
  141. alita_sdk/runtime/tools/mcp_inspect_tool.py +284 -0
  142. alita_sdk/runtime/tools/mcp_remote_tool.py +181 -0
  143. alita_sdk/runtime/tools/mcp_server_tool.py +3 -1
  144. alita_sdk/runtime/tools/planning/__init__.py +36 -0
  145. alita_sdk/runtime/tools/planning/models.py +246 -0
  146. alita_sdk/runtime/tools/planning/wrapper.py +607 -0
  147. alita_sdk/runtime/tools/router.py +2 -1
  148. alita_sdk/runtime/tools/sandbox.py +375 -0
  149. alita_sdk/runtime/tools/skill_router.py +776 -0
  150. alita_sdk/runtime/tools/tool.py +3 -1
  151. alita_sdk/runtime/tools/vectorstore.py +69 -65
  152. alita_sdk/runtime/tools/vectorstore_base.py +163 -90
  153. alita_sdk/runtime/utils/AlitaCallback.py +137 -21
  154. alita_sdk/runtime/utils/constants.py +5 -1
  155. alita_sdk/runtime/utils/mcp_client.py +492 -0
  156. alita_sdk/runtime/utils/mcp_oauth.py +361 -0
  157. alita_sdk/runtime/utils/mcp_sse_client.py +434 -0
  158. alita_sdk/runtime/utils/mcp_tools_discovery.py +124 -0
  159. alita_sdk/runtime/utils/streamlit.py +41 -14
  160. alita_sdk/runtime/utils/toolkit_utils.py +28 -9
  161. alita_sdk/runtime/utils/utils.py +48 -0
  162. alita_sdk/tools/__init__.py +135 -37
  163. alita_sdk/tools/ado/__init__.py +2 -2
  164. alita_sdk/tools/ado/repos/__init__.py +16 -19
  165. alita_sdk/tools/ado/repos/repos_wrapper.py +12 -20
  166. alita_sdk/tools/ado/test_plan/__init__.py +27 -8
  167. alita_sdk/tools/ado/test_plan/test_plan_wrapper.py +56 -28
  168. alita_sdk/tools/ado/wiki/__init__.py +28 -12
  169. alita_sdk/tools/ado/wiki/ado_wrapper.py +114 -40
  170. alita_sdk/tools/ado/work_item/__init__.py +28 -12
  171. alita_sdk/tools/ado/work_item/ado_wrapper.py +95 -11
  172. alita_sdk/tools/advanced_jira_mining/__init__.py +13 -8
  173. alita_sdk/tools/aws/delta_lake/__init__.py +15 -11
  174. alita_sdk/tools/aws/delta_lake/tool.py +5 -1
  175. alita_sdk/tools/azure_ai/search/__init__.py +14 -8
  176. alita_sdk/tools/base/tool.py +5 -1
  177. alita_sdk/tools/base_indexer_toolkit.py +454 -110
  178. alita_sdk/tools/bitbucket/__init__.py +28 -19
  179. alita_sdk/tools/bitbucket/api_wrapper.py +285 -27
  180. alita_sdk/tools/bitbucket/cloud_api_wrapper.py +5 -5
  181. alita_sdk/tools/browser/__init__.py +41 -16
  182. alita_sdk/tools/browser/crawler.py +3 -1
  183. alita_sdk/tools/browser/utils.py +15 -6
  184. alita_sdk/tools/carrier/__init__.py +18 -17
  185. alita_sdk/tools/carrier/backend_reports_tool.py +8 -4
  186. alita_sdk/tools/carrier/excel_reporter.py +8 -4
  187. alita_sdk/tools/chunkers/__init__.py +3 -1
  188. alita_sdk/tools/chunkers/code/codeparser.py +1 -1
  189. alita_sdk/tools/chunkers/sematic/json_chunker.py +2 -1
  190. alita_sdk/tools/chunkers/sematic/markdown_chunker.py +97 -6
  191. alita_sdk/tools/chunkers/sematic/proposal_chunker.py +1 -1
  192. alita_sdk/tools/chunkers/universal_chunker.py +270 -0
  193. alita_sdk/tools/cloud/aws/__init__.py +12 -7
  194. alita_sdk/tools/cloud/azure/__init__.py +12 -7
  195. alita_sdk/tools/cloud/gcp/__init__.py +12 -7
  196. alita_sdk/tools/cloud/k8s/__init__.py +12 -7
  197. alita_sdk/tools/code/linter/__init__.py +10 -8
  198. alita_sdk/tools/code/loaders/codesearcher.py +3 -2
  199. alita_sdk/tools/code/sonar/__init__.py +21 -13
  200. alita_sdk/tools/code_indexer_toolkit.py +199 -0
  201. alita_sdk/tools/confluence/__init__.py +22 -14
  202. alita_sdk/tools/confluence/api_wrapper.py +197 -58
  203. alita_sdk/tools/confluence/loader.py +14 -2
  204. alita_sdk/tools/custom_open_api/__init__.py +12 -5
  205. alita_sdk/tools/elastic/__init__.py +11 -8
  206. alita_sdk/tools/elitea_base.py +546 -64
  207. alita_sdk/tools/figma/__init__.py +60 -11
  208. alita_sdk/tools/figma/api_wrapper.py +1400 -167
  209. alita_sdk/tools/figma/figma_client.py +73 -0
  210. alita_sdk/tools/figma/toon_tools.py +2748 -0
  211. alita_sdk/tools/github/__init__.py +18 -17
  212. alita_sdk/tools/github/api_wrapper.py +9 -26
  213. alita_sdk/tools/github/github_client.py +81 -12
  214. alita_sdk/tools/github/schemas.py +2 -1
  215. alita_sdk/tools/github/tool.py +5 -1
  216. alita_sdk/tools/gitlab/__init__.py +19 -13
  217. alita_sdk/tools/gitlab/api_wrapper.py +256 -80
  218. alita_sdk/tools/gitlab_org/__init__.py +14 -10
  219. alita_sdk/tools/google/bigquery/__init__.py +14 -13
  220. alita_sdk/tools/google/bigquery/tool.py +5 -1
  221. alita_sdk/tools/google_places/__init__.py +21 -11
  222. alita_sdk/tools/jira/__init__.py +22 -11
  223. alita_sdk/tools/jira/api_wrapper.py +315 -168
  224. alita_sdk/tools/keycloak/__init__.py +11 -8
  225. alita_sdk/tools/localgit/__init__.py +9 -3
  226. alita_sdk/tools/localgit/local_git.py +62 -54
  227. alita_sdk/tools/localgit/tool.py +5 -1
  228. alita_sdk/tools/memory/__init__.py +38 -14
  229. alita_sdk/tools/non_code_indexer_toolkit.py +7 -2
  230. alita_sdk/tools/ocr/__init__.py +11 -8
  231. alita_sdk/tools/openapi/__init__.py +491 -106
  232. alita_sdk/tools/openapi/api_wrapper.py +1357 -0
  233. alita_sdk/tools/openapi/tool.py +20 -0
  234. alita_sdk/tools/pandas/__init__.py +20 -12
  235. alita_sdk/tools/pandas/api_wrapper.py +40 -45
  236. alita_sdk/tools/pandas/dataframe/generator/base.py +3 -1
  237. alita_sdk/tools/postman/__init__.py +11 -11
  238. alita_sdk/tools/postman/api_wrapper.py +19 -8
  239. alita_sdk/tools/postman/postman_analysis.py +8 -1
  240. alita_sdk/tools/pptx/__init__.py +11 -10
  241. alita_sdk/tools/qtest/__init__.py +22 -14
  242. alita_sdk/tools/qtest/api_wrapper.py +1784 -88
  243. alita_sdk/tools/rally/__init__.py +13 -10
  244. alita_sdk/tools/report_portal/__init__.py +23 -16
  245. alita_sdk/tools/salesforce/__init__.py +22 -16
  246. alita_sdk/tools/servicenow/__init__.py +21 -16
  247. alita_sdk/tools/servicenow/api_wrapper.py +1 -1
  248. alita_sdk/tools/sharepoint/__init__.py +17 -14
  249. alita_sdk/tools/sharepoint/api_wrapper.py +179 -39
  250. alita_sdk/tools/sharepoint/authorization_helper.py +191 -1
  251. alita_sdk/tools/sharepoint/utils.py +8 -2
  252. alita_sdk/tools/slack/__init__.py +13 -8
  253. alita_sdk/tools/sql/__init__.py +22 -19
  254. alita_sdk/tools/sql/api_wrapper.py +71 -23
  255. alita_sdk/tools/testio/__init__.py +21 -13
  256. alita_sdk/tools/testrail/__init__.py +13 -11
  257. alita_sdk/tools/testrail/api_wrapper.py +214 -46
  258. alita_sdk/tools/utils/__init__.py +28 -4
  259. alita_sdk/tools/utils/content_parser.py +241 -55
  260. alita_sdk/tools/utils/text_operations.py +254 -0
  261. alita_sdk/tools/vector_adapters/VectorStoreAdapter.py +83 -27
  262. alita_sdk/tools/xray/__init__.py +18 -14
  263. alita_sdk/tools/xray/api_wrapper.py +58 -113
  264. alita_sdk/tools/yagmail/__init__.py +9 -3
  265. alita_sdk/tools/zephyr/__init__.py +12 -7
  266. alita_sdk/tools/zephyr_enterprise/__init__.py +16 -9
  267. alita_sdk/tools/zephyr_enterprise/api_wrapper.py +30 -15
  268. alita_sdk/tools/zephyr_essential/__init__.py +16 -10
  269. alita_sdk/tools/zephyr_essential/api_wrapper.py +297 -54
  270. alita_sdk/tools/zephyr_essential/client.py +6 -4
  271. alita_sdk/tools/zephyr_scale/__init__.py +13 -8
  272. alita_sdk/tools/zephyr_scale/api_wrapper.py +39 -31
  273. alita_sdk/tools/zephyr_squad/__init__.py +12 -7
  274. {alita_sdk-0.3.257.dist-info → alita_sdk-0.3.584.dist-info}/METADATA +184 -37
  275. alita_sdk-0.3.584.dist-info/RECORD +452 -0
  276. alita_sdk-0.3.584.dist-info/entry_points.txt +2 -0
  277. alita_sdk/tools/bitbucket/tools.py +0 -304
  278. alita_sdk-0.3.257.dist-info/RECORD +0 -343
  279. {alita_sdk-0.3.257.dist-info → alita_sdk-0.3.584.dist-info}/WHEEL +0 -0
  280. {alita_sdk-0.3.257.dist-info → alita_sdk-0.3.584.dist-info}/licenses/LICENSE +0 -0
  281. {alita_sdk-0.3.257.dist-info → alita_sdk-0.3.584.dist-info}/top_level.txt +0 -0
@@ -4,8 +4,10 @@ from pydantic import BaseModel, ConfigDict, Field, create_model, SecretStr
4
4
  from .api_wrapper import RallyApiWrapper
5
5
  from langchain_core.tools import BaseTool
6
6
  from ..base.tool import BaseAction
7
- from ..utils import clean_string, TOOLKIT_SPLITTER, get_max_toolkit_length
7
+ from ..elitea_base import filter_missconfigured_index_tools
8
+ from ..utils import clean_string, get_max_toolkit_length
8
9
  from ...configurations.rally import RallyConfiguration
10
+ from ...runtime.utils.constants import TOOLKIT_NAME_META, TOOL_NAME_META, TOOLKIT_TYPE_META
9
11
 
10
12
  name = "rally"
11
13
 
@@ -20,17 +22,13 @@ def get_tools(tool):
20
22
 
21
23
  class RallyToolkit(BaseToolkit):
22
24
  tools: List[BaseTool] = []
23
- toolkit_max_length: int = 0
24
25
 
25
26
  @staticmethod
26
27
  def toolkit_config_schema() -> BaseModel:
27
28
  selected_tools = {x['name']: x['args_schema'].schema() for x in RallyApiWrapper.model_construct().get_available_tools()}
28
- RallyToolkit.toolkit_max_length = get_max_toolkit_length(selected_tools)
29
29
  return create_model(
30
30
  name,
31
- name=(str, Field(description="Toolkit name", json_schema_extra={'toolkit_name': True,
32
- 'max_toolkit_length': RallyToolkit.toolkit_max_length})),
33
- rally_configuration=(Optional[RallyConfiguration], Field(description="Rally configuration", json_schema_extra={'configuration_types': ['rally']})),
31
+ rally_configuration=(RallyConfiguration, Field(description="Rally configuration", json_schema_extra={'configuration_types': ['rally']})),
34
32
  workspace=(Optional[str], Field(default=None, description="Rally workspace")),
35
33
  project=(Optional[str], Field(default=None, description="Rally project")),
36
34
  selected_tools=(List[Literal[tuple(selected_tools)]], Field(default=[], json_schema_extra={'args_schemas': selected_tools})),
@@ -45,6 +43,7 @@ class RallyToolkit(BaseToolkit):
45
43
  )
46
44
 
47
45
  @classmethod
46
+ @filter_missconfigured_index_tools
48
47
  def get_toolkit(cls, selected_tools: list[str] | None = None, toolkit_name: Optional[str] = None, **kwargs):
49
48
  if selected_tools is None:
50
49
  selected_tools = []
@@ -53,18 +52,22 @@ class RallyToolkit(BaseToolkit):
53
52
  **kwargs.get('rally_configuration'),
54
53
  }
55
54
  rally_api_wrapper = RallyApiWrapper(**wrapper_payload)
56
- prefix = clean_string(toolkit_name, cls.toolkit_max_length) + TOOLKIT_SPLITTER if toolkit_name else ''
57
55
  available_tools = rally_api_wrapper.get_available_tools()
58
56
  tools = []
59
57
  for tool in available_tools:
60
58
  if selected_tools:
61
59
  if tool["name"] not in selected_tools:
62
60
  continue
61
+ description = f"{tool['description']}\nWorkspace: {rally_api_wrapper.workspace}. Project: {rally_api_wrapper.project}"
62
+ if toolkit_name:
63
+ description = f"{description}\nToolkit: {toolkit_name}"
64
+ description = description[:1000]
63
65
  tools.append(BaseAction(
64
66
  api_wrapper=rally_api_wrapper,
65
- name=prefix + tool["name"],
66
- description=f"{tool['description']}\nWorkspace: {rally_api_wrapper.workspace}. Project: {rally_api_wrapper.project}",
67
- args_schema=tool["args_schema"]
67
+ name=tool["name"],
68
+ description=description,
69
+ args_schema=tool["args_schema"],
70
+ metadata={TOOLKIT_NAME_META: toolkit_name, TOOLKIT_TYPE_META: name, TOOL_NAME_META: tool["name"]} if toolkit_name else {TOOL_NAME_META: tool["name"]}
68
71
  ))
69
72
  return cls(tools=tools)
70
73
 
@@ -2,37 +2,34 @@ from typing import List, Literal, Optional
2
2
 
3
3
  from langchain_core.tools import BaseToolkit, BaseTool
4
4
 
5
- from pydantic import create_model, BaseModel, ConfigDict, Field, SecretStr
5
+ from pydantic import create_model, BaseModel, ConfigDict, Field
6
6
 
7
7
  from .api_wrapper import ReportPortalApiWrapper
8
8
  from ..base.tool import BaseAction
9
- from ..utils import clean_string, TOOLKIT_SPLITTER, get_max_toolkit_length
9
+ from ..elitea_base import filter_missconfigured_index_tools
10
+ from ..utils import clean_string, get_max_toolkit_length
11
+ from ...configurations.report_portal import ReportPortalConfiguration
12
+ from ...runtime.utils.constants import TOOLKIT_NAME_META, TOOL_NAME_META, TOOLKIT_TYPE_META
10
13
 
11
14
  name = "report_portal"
12
15
 
13
16
  def get_tools(tool):
14
17
  return ReportPortalToolkit().get_toolkit(
15
18
  selected_tools=tool['settings'].get('selected_tools', []),
16
- endpoint=tool['settings']['endpoint'],
17
- api_key=tool['settings']['api_key'],
18
- project=tool['settings']['project'],
19
+ report_portal_configuration=tool['settings']['report_portal_configuration'],
19
20
  toolkit_name=tool.get('toolkit_name')
20
21
  ).get_tools()
21
22
 
22
23
 
23
24
  class ReportPortalToolkit(BaseToolkit):
24
- tools: list[BaseTool] = []
25
- toolkit_max_length: int = 0
25
+ tools: List[BaseTool] = []
26
26
 
27
27
  @staticmethod
28
28
  def toolkit_config_schema() -> BaseModel:
29
29
  selected_tools = {x['name']: x['args_schema'].schema() for x in ReportPortalApiWrapper.model_construct().get_available_tools()}
30
- ReportPortalToolkit.toolkit_max_length = get_max_toolkit_length(selected_tools)
31
30
  return create_model(
32
31
  name,
33
- endpoint=(str, Field(description="Report Portal endpoint", json_schema_extra={'toolkit_name': True, 'max_toolkit_length': ReportPortalToolkit.toolkit_max_length})),
34
- project=(str, Field(description="Report Portal project")),
35
- api_key=(SecretStr, Field(description="User API key", json_schema_extra={'secret': True})),
32
+ report_portal_configuration=(ReportPortalConfiguration, Field(description="Report Portal Configuration", json_schema_extra={'configuration_types': ['report_portal']})),
36
33
  selected_tools=(List[Literal[tuple(selected_tools)]], Field(default=[], json_schema_extra={'args_schemas': selected_tools})),
37
34
  __config__=ConfigDict(json_schema_extra={'metadata': {"label": "Report Portal", "icon_url": "reportportal-icon.svg",
38
35
  "categories": ["testing"],
@@ -40,21 +37,31 @@ class ReportPortalToolkit(BaseToolkit):
40
37
  )
41
38
 
42
39
  @classmethod
40
+ @filter_missconfigured_index_tools
43
41
  def get_toolkit(cls, selected_tools: list[str] | None = None, toolkit_name: Optional[str] = None, **kwargs):
44
42
  if selected_tools is None:
45
43
  selected_tools = []
46
- report_portal_api_wrapper = ReportPortalApiWrapper(**kwargs)
47
- prefix = clean_string(toolkit_name, cls.toolkit_max_length) + TOOLKIT_SPLITTER if toolkit_name else ''
44
+ wrapper_payload = {
45
+ **kwargs,
46
+ **kwargs.get('report_portal_configuration', {}),
47
+ }
48
+ report_portal_api_wrapper = ReportPortalApiWrapper(**wrapper_payload)
48
49
  available_tools = report_portal_api_wrapper.get_available_tools()
49
50
  tools = []
50
51
  for tool in available_tools:
51
52
  if selected_tools and tool["name"] not in selected_tools:
52
53
  continue
54
+ description = tool['description']
55
+ if toolkit_name:
56
+ description = f"Toolkit: {toolkit_name}\n{description}"
57
+ description = f"{description}\nReport portal configuration: 'url - {report_portal_api_wrapper.endpoint}, project - {report_portal_api_wrapper.project}'"
58
+ description = description[:1000]
53
59
  tools.append(BaseAction(
54
60
  api_wrapper=report_portal_api_wrapper,
55
- name=prefix + tool["name"],
56
- description=f"{tool['description']}\nReport portal configuration: 'url - {report_portal_api_wrapper.endpoint}, project - {report_portal_api_wrapper.project}'",
57
- args_schema=tool["args_schema"]
61
+ name=tool["name"],
62
+ description=description,
63
+ args_schema=tool["args_schema"],
64
+ metadata={TOOLKIT_NAME_META: toolkit_name, TOOLKIT_TYPE_META: name, TOOL_NAME_META: tool["name"]} if toolkit_name else {TOOL_NAME_META: tool["name"]}
58
65
  ))
59
66
  return cls(tools=tools)
60
67
 
@@ -2,33 +2,31 @@ from typing import List, Optional, Literal
2
2
  from .api_wrapper import SalesforceApiWrapper
3
3
  from langchain_core.tools import BaseTool, BaseToolkit
4
4
  from ..base.tool import BaseAction
5
- from pydantic import create_model, BaseModel, ConfigDict, Field, SecretStr
6
- from ..utils import clean_string, TOOLKIT_SPLITTER,get_max_toolkit_length
5
+ from pydantic import create_model, BaseModel, ConfigDict, Field
6
+
7
+ from ..elitea_base import filter_missconfigured_index_tools
8
+ from ..utils import clean_string, get_max_toolkit_length
9
+ from ...configurations.salesforce import SalesforceConfiguration
10
+ from ...runtime.utils.constants import TOOLKIT_NAME_META, TOOL_NAME_META, TOOLKIT_TYPE_META
7
11
 
8
12
  name = "salesforce"
9
13
 
10
14
  def get_tools(tool):
11
15
  return SalesforceToolkit().get_toolkit(
12
16
  selected_tools=tool['settings'].get('selected_tools', []),
13
- base_url=tool['settings'].get('base_url'),
14
- client_id=tool['settings'].get('client_id'),
15
- client_secret=tool['settings'].get('client_secret'),
17
+ salesforce_configuration=tool['settings']['salesforce_configuration'],
16
18
  api_version=tool['settings'].get('api_version', 'v59.0')
17
19
  ).get_tools()
18
20
 
19
21
  class SalesforceToolkit(BaseToolkit):
20
22
  tools: List[BaseTool] = []
21
- toolkit_max_length: int = 0
22
23
  @staticmethod
23
24
  def toolkit_config_schema() -> BaseModel:
24
25
  available_tools = {x['name']: x['args_schema'].schema() for x in SalesforceApiWrapper.model_construct().get_available_tools()}
25
- SalesforceToolkit.toolkit_max_length = get_max_toolkit_length(available_tools)
26
26
  return create_model(
27
27
  name,
28
- base_url=(str, Field(description="Salesforce instance URL", json_schema_extra={'toolkit_name': True})),
29
- client_id=(str, Field(description="Salesforce Connected App Client ID")),
30
- client_secret=(SecretStr, Field(description="Salesforce Connected App Client Secret", json_schema_extra={'secret': True})),
31
28
  api_version=(str, Field(description="Salesforce API Version", default='v59.0')),
29
+ salesforce_configuration=(SalesforceConfiguration, Field(description="Salesforce Configuration", json_schema_extra={'configuration_types': ['salesforce']})),
32
30
  selected_tools=(List[Literal[tuple(available_tools)]], Field(default=[], json_schema_extra={'args_schemas': available_tools})),
33
31
  __config__=ConfigDict(json_schema_extra={'metadata': {
34
32
  "label": "Salesforce", "icon_url": "salesforce-icon.svg",
@@ -38,23 +36,31 @@ class SalesforceToolkit(BaseToolkit):
38
36
  )
39
37
 
40
38
  @classmethod
39
+ @filter_missconfigured_index_tools
41
40
  def get_toolkit(cls, selected_tools: list[str] | None = None, toolkit_name: Optional[str] = None, **kwargs):
42
41
  if selected_tools is None:
43
42
  selected_tools = []
44
43
 
45
- api_wrapper = SalesforceApiWrapper(**kwargs)
46
- prefix = clean_string(toolkit_name, cls.toolkit_max_length) + TOOLKIT_SPLITTER if toolkit_name else ''
44
+ wrapper_payload = {
45
+ **kwargs,
46
+ **kwargs.get('salesforce_configuration', {}),
47
+ }
48
+ api_wrapper = SalesforceApiWrapper(**wrapper_payload)
47
49
  tools = []
48
50
 
49
51
  for tool in api_wrapper.get_available_tools():
50
52
  if selected_tools and tool["name"] not in selected_tools:
51
53
  continue
52
-
54
+ description = f"Salesforce Tool: {tool['description']}"
55
+ if toolkit_name:
56
+ description = f"{description}\nToolkit: {toolkit_name}"
57
+ description = description[:1000]
53
58
  tools.append(BaseAction(
54
59
  api_wrapper=api_wrapper,
55
- name=prefix + tool["name"],
56
- description=f"Salesforce Tool: {tool['description']}",
57
- args_schema=tool["args_schema"]
60
+ name=tool["name"],
61
+ description=description,
62
+ args_schema=tool["args_schema"],
63
+ metadata={TOOLKIT_NAME_META: toolkit_name, TOOLKIT_TYPE_META: name, TOOL_NAME_META: tool["name"]} if toolkit_name else {TOOL_NAME_META: tool["name"]}
58
64
  ))
59
65
 
60
66
  return cls(tools=tools)
@@ -5,39 +5,37 @@ from .api_wrapper import ServiceNowAPIWrapper
5
5
  from langchain_core.tools import BaseTool
6
6
  from ..base.tool import BaseAction
7
7
  from pydantic import create_model, BaseModel, ConfigDict, Field
8
- from ..utils import clean_string, TOOLKIT_SPLITTER, get_max_toolkit_length
8
+
9
+ from ..elitea_base import filter_missconfigured_index_tools
9
10
  from ...configurations.service_now import ServiceNowConfiguration
11
+ from ...runtime.utils.constants import TOOLKIT_NAME_META, TOOL_NAME_META, TOOLKIT_TYPE_META
10
12
 
11
13
 
12
14
  name = "service_now"
13
15
 
14
16
  def get_tools(tool):
17
+ settings = tool.get('settings') or {}
18
+
15
19
  return ServiceNowToolkit().get_toolkit(
16
- selected_tools=tool['settings'].get('selected_tools', []),
17
- instance_alias=tool['settings'].get('instance_alias', None),
18
- base_url=tool['settings']['base_url'],
19
- servicenow_configuration=tool['settings']['servicenow_configuration'],
20
- response_fields=tool['settings'].get('response_fields', None),
20
+ selected_tools=settings.get('selected_tools', []),
21
+ instance_alias=settings.get('instance_alias', None),
22
+ servicenow_configuration=settings.get('servicenow_configuration', None),
23
+ response_fields=settings.get('response_fields', None),
21
24
  toolkit_name=tool.get('toolkit_name')
22
25
  ).get_tools()
23
26
 
24
27
 
25
28
  class ServiceNowToolkit(BaseToolkit):
26
29
  tools: List[BaseTool] = []
27
- toolkit_max_length: int = 0
28
30
 
29
31
  @staticmethod
30
32
  def toolkit_config_schema() -> BaseModel:
31
33
  selected_tools = {x['name']: x['args_schema'].schema() for x in
32
34
  ServiceNowAPIWrapper.model_construct().get_available_tools()}
33
- ServiceNowToolkit.toolkit_max_length = get_max_toolkit_length(selected_tools)
34
35
  return create_model(
35
36
  name,
36
- name=(str, Field(description="Toolkit name",
37
- json_schema_extra={
38
- 'toolkit_name': True, 'max_toolkit_length': ServiceNowToolkit.toolkit_max_length})),
39
37
  response_fields=(Optional[str], Field(description="Response fields", default=None)),
40
- servicenow_configuration=(Optional[ServiceNowConfiguration], Field(description="ServiceNow Configuration",
38
+ servicenow_configuration=(ServiceNowConfiguration, Field(description="ServiceNow Configuration",
41
39
  json_schema_extra={
42
40
  'configuration_types': [
43
41
  'service_now']})),
@@ -66,6 +64,7 @@ class ServiceNowToolkit(BaseToolkit):
66
64
  )
67
65
 
68
66
  @classmethod
67
+ @filter_missconfigured_index_tools
69
68
  def get_toolkit(cls, selected_tools: list[str] | None = None, toolkit_name: Optional[str] = None, **kwargs):
70
69
  if selected_tools is None:
71
70
  selected_tools = []
@@ -77,18 +76,24 @@ class ServiceNowToolkit(BaseToolkit):
77
76
  **kwargs['servicenow_configuration'],
78
77
  }
79
78
  servicenow_api_wrapper = ServiceNowAPIWrapper(**wrapper_payload)
80
- prefix = clean_string(toolkit_name, cls.toolkit_max_length) + TOOLKIT_SPLITTER if toolkit_name else ''
81
79
  available_tools = servicenow_api_wrapper.get_available_tools()
82
80
  tools = []
83
81
  for tool in available_tools:
84
82
  if selected_tools:
85
83
  if tool["name"] not in selected_tools:
86
84
  continue
85
+ base_url = getattr(servicenow_api_wrapper, "base_url", "") or ""
86
+ description = tool.get("description", "") if isinstance(tool, dict) else ""
87
+ if toolkit_name:
88
+ description = f"Toolkit: {toolkit_name}\n{description}"
89
+ description = f"ServiceNow: {base_url}\n{description}".strip()
90
+ description = description[:1000]
87
91
  tools.append(BaseAction(
88
92
  api_wrapper=servicenow_api_wrapper,
89
- name=prefix + tool["name"],
90
- description=f"ServiceNow: {servicenow_api_wrapper.base_url} " + tool["description"],
91
- args_schema=tool["args_schema"]
93
+ name=tool["name"],
94
+ description=description,
95
+ args_schema=tool["args_schema"],
96
+ metadata={TOOLKIT_NAME_META: toolkit_name, TOOLKIT_TYPE_META: name, TOOL_NAME_META: tool["name"]} if toolkit_name else {TOOL_NAME_META: tool["name"]}
92
97
  ))
93
98
  return cls(tools=tools)
94
99
 
@@ -58,7 +58,7 @@ class ServiceNowAPIWrapper(BaseToolApiWrapper):
58
58
  password = SecretStr(values['password'])
59
59
  username = values['username']
60
60
  cls.fields = values.get('fields', ['sys_id', 'number', 'state', 'short_description', 'description', 'priority', 'category', 'urgency', 'impact', 'creation_date'])
61
- cls.client = ServiceNowClient(base_url, (username, password.get_secret_value()))
61
+ cls.client = ServiceNowClient(instance=base_url, auth=(username, password.get_secret_value()))
62
62
  return values
63
63
 
64
64
  def get_incidents(self, data: Optional[Dict[str, Any]] = None) -> ToolException | str:
@@ -1,11 +1,14 @@
1
1
  from typing import List, Literal, Optional
2
2
 
3
3
  from langchain_core.tools import BaseToolkit, BaseTool
4
- from pydantic import create_model, BaseModel, ConfigDict, Field, SecretStr
4
+ from pydantic import create_model, BaseModel, ConfigDict, Field
5
5
  from .api_wrapper import SharepointApiWrapper
6
6
  from ..base.tool import BaseAction
7
- from ..utils import clean_string, TOOLKIT_SPLITTER, get_max_toolkit_length
7
+ from ..elitea_base import filter_missconfigured_index_tools
8
+ from ..utils import clean_string, get_max_toolkit_length
8
9
  from ...configurations.pgvector import PgVectorConfiguration
10
+ from ...configurations.sharepoint import SharepointConfiguration
11
+ from ...runtime.utils.constants import TOOLKIT_NAME_META, TOOL_NAME_META, TOOLKIT_TYPE_META
9
12
 
10
13
  name = "sharepoint"
11
14
 
@@ -13,9 +16,7 @@ def get_tools(tool):
13
16
  return (SharepointToolkit()
14
17
  .get_toolkit(
15
18
  selected_tools=tool['settings'].get('selected_tools', []),
16
- site_url=tool['settings'].get('site_url', None),
17
- client_id=tool['settings'].get('client_id', None),
18
- client_secret=tool['settings'].get('client_secret', None),
19
+ sharepoint_configuration=tool['settings']['sharepoint_configuration'],
19
20
  toolkit_name=tool.get('toolkit_name'),
20
21
  llm=tool['settings'].get('llm'),
21
22
  alita=tool['settings'].get('alita', None),
@@ -29,17 +30,13 @@ def get_tools(tool):
29
30
 
30
31
  class SharepointToolkit(BaseToolkit):
31
32
  tools: List[BaseTool] = []
32
- toolkit_max_length: int = 0
33
33
 
34
34
  @staticmethod
35
35
  def toolkit_config_schema() -> BaseModel:
36
36
  selected_tools = {x['name']: x['args_schema'].schema() for x in SharepointApiWrapper.model_construct().get_available_tools()}
37
- SharepointToolkit.toolkit_max_length = get_max_toolkit_length(selected_tools)
38
37
  return create_model(
39
38
  name,
40
- site_url=(str, Field(description="Sharepoint site's URL", json_schema_extra={'toolkit_name': True, 'max_toolkit_length': SharepointToolkit.toolkit_max_length})),
41
- client_id=(str, Field(description="Client ID")),
42
- client_secret=(SecretStr, Field(description="Client Secret", json_schema_extra={'secret': True})),
39
+ sharepoint_configuration=(SharepointConfiguration, Field(description="SharePoint Configuration", json_schema_extra={'configuration_types': ['sharepoint']})),
43
40
  selected_tools=(List[Literal[tuple(selected_tools)]], Field(default=[], json_schema_extra={'args_schemas': selected_tools})),
44
41
  # indexer settings
45
42
  pgvector_configuration=(Optional[PgVectorConfiguration], Field(default=None,
@@ -56,26 +53,32 @@ class SharepointToolkit(BaseToolkit):
56
53
  )
57
54
 
58
55
  @classmethod
56
+ @filter_missconfigured_index_tools
59
57
  def get_toolkit(cls, selected_tools: list[str] | None = None, toolkit_name: Optional[str] = None, **kwargs):
60
58
  if selected_tools is None:
61
59
  selected_tools = []
62
60
  wrapper_payload = {
63
61
  **kwargs,
62
+ **kwargs.get('sharepoint_configuration', {}),
64
63
  **(kwargs.get('pgvector_configuration') or {}),
65
64
  }
66
65
  sharepoint_api_wrapper = SharepointApiWrapper(**wrapper_payload)
67
- prefix = clean_string(toolkit_name, cls.toolkit_max_length) + TOOLKIT_SPLITTER if toolkit_name else ''
68
66
  available_tools = sharepoint_api_wrapper.get_available_tools()
69
67
  tools = []
70
68
  for tool in available_tools:
71
69
  if selected_tools:
72
70
  if tool["name"] not in selected_tools:
73
71
  continue
72
+ description = f"Sharepoint {sharepoint_api_wrapper.site_url}\n{tool['description']}"
73
+ if toolkit_name:
74
+ description = f"{description}\nToolkit: {toolkit_name}"
75
+ description = description[:1000]
74
76
  tools.append(BaseAction(
75
77
  api_wrapper=sharepoint_api_wrapper,
76
- name=prefix + tool["name"],
77
- description=f"Sharepoint {sharepoint_api_wrapper.site_url}\n{tool['description']}",
78
- args_schema=tool["args_schema"]
78
+ name=tool["name"],
79
+ description=description,
80
+ args_schema=tool["args_schema"],
81
+ metadata={TOOLKIT_NAME_META: toolkit_name, TOOLKIT_TYPE_META: name, TOOL_NAME_META: tool["name"]} if toolkit_name else {TOOL_NAME_META: tool["name"]}
79
82
  ))
80
83
  return cls(tools=tools)
81
84