alita-sdk 0.3.257__py3-none-any.whl → 0.3.562__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.
Files changed (278) 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 +3601 -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 +111 -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 +407 -92
  110. alita_sdk/runtime/langchain/utils.py +102 -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 +24 -9
  124. alita_sdk/runtime/toolkits/datasource.py +13 -6
  125. alita_sdk/runtime/toolkits/mcp.py +780 -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 +1013 -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/mcp_client.py +492 -0
  155. alita_sdk/runtime/utils/mcp_oauth.py +361 -0
  156. alita_sdk/runtime/utils/mcp_sse_client.py +434 -0
  157. alita_sdk/runtime/utils/mcp_tools_discovery.py +124 -0
  158. alita_sdk/runtime/utils/streamlit.py +41 -14
  159. alita_sdk/runtime/utils/toolkit_utils.py +28 -9
  160. alita_sdk/runtime/utils/utils.py +48 -0
  161. alita_sdk/tools/__init__.py +135 -37
  162. alita_sdk/tools/ado/__init__.py +2 -2
  163. alita_sdk/tools/ado/repos/__init__.py +15 -19
  164. alita_sdk/tools/ado/repos/repos_wrapper.py +12 -20
  165. alita_sdk/tools/ado/test_plan/__init__.py +26 -8
  166. alita_sdk/tools/ado/test_plan/test_plan_wrapper.py +56 -28
  167. alita_sdk/tools/ado/wiki/__init__.py +27 -12
  168. alita_sdk/tools/ado/wiki/ado_wrapper.py +114 -40
  169. alita_sdk/tools/ado/work_item/__init__.py +27 -12
  170. alita_sdk/tools/ado/work_item/ado_wrapper.py +95 -11
  171. alita_sdk/tools/advanced_jira_mining/__init__.py +12 -8
  172. alita_sdk/tools/aws/delta_lake/__init__.py +14 -11
  173. alita_sdk/tools/aws/delta_lake/tool.py +5 -1
  174. alita_sdk/tools/azure_ai/search/__init__.py +13 -8
  175. alita_sdk/tools/base/tool.py +5 -1
  176. alita_sdk/tools/base_indexer_toolkit.py +454 -110
  177. alita_sdk/tools/bitbucket/__init__.py +27 -19
  178. alita_sdk/tools/bitbucket/api_wrapper.py +285 -27
  179. alita_sdk/tools/bitbucket/cloud_api_wrapper.py +5 -5
  180. alita_sdk/tools/browser/__init__.py +41 -16
  181. alita_sdk/tools/browser/crawler.py +3 -1
  182. alita_sdk/tools/browser/utils.py +15 -6
  183. alita_sdk/tools/carrier/__init__.py +18 -17
  184. alita_sdk/tools/carrier/backend_reports_tool.py +8 -4
  185. alita_sdk/tools/carrier/excel_reporter.py +8 -4
  186. alita_sdk/tools/chunkers/__init__.py +3 -1
  187. alita_sdk/tools/chunkers/code/codeparser.py +1 -1
  188. alita_sdk/tools/chunkers/sematic/json_chunker.py +2 -1
  189. alita_sdk/tools/chunkers/sematic/markdown_chunker.py +97 -6
  190. alita_sdk/tools/chunkers/sematic/proposal_chunker.py +1 -1
  191. alita_sdk/tools/chunkers/universal_chunker.py +270 -0
  192. alita_sdk/tools/cloud/aws/__init__.py +11 -7
  193. alita_sdk/tools/cloud/azure/__init__.py +11 -7
  194. alita_sdk/tools/cloud/gcp/__init__.py +11 -7
  195. alita_sdk/tools/cloud/k8s/__init__.py +11 -7
  196. alita_sdk/tools/code/linter/__init__.py +9 -8
  197. alita_sdk/tools/code/loaders/codesearcher.py +3 -2
  198. alita_sdk/tools/code/sonar/__init__.py +20 -13
  199. alita_sdk/tools/code_indexer_toolkit.py +199 -0
  200. alita_sdk/tools/confluence/__init__.py +21 -14
  201. alita_sdk/tools/confluence/api_wrapper.py +197 -58
  202. alita_sdk/tools/confluence/loader.py +14 -2
  203. alita_sdk/tools/custom_open_api/__init__.py +11 -5
  204. alita_sdk/tools/elastic/__init__.py +10 -8
  205. alita_sdk/tools/elitea_base.py +546 -64
  206. alita_sdk/tools/figma/__init__.py +11 -8
  207. alita_sdk/tools/figma/api_wrapper.py +352 -153
  208. alita_sdk/tools/github/__init__.py +17 -17
  209. alita_sdk/tools/github/api_wrapper.py +9 -26
  210. alita_sdk/tools/github/github_client.py +81 -12
  211. alita_sdk/tools/github/schemas.py +2 -1
  212. alita_sdk/tools/github/tool.py +5 -1
  213. alita_sdk/tools/gitlab/__init__.py +18 -13
  214. alita_sdk/tools/gitlab/api_wrapper.py +224 -80
  215. alita_sdk/tools/gitlab_org/__init__.py +13 -10
  216. alita_sdk/tools/google/bigquery/__init__.py +13 -13
  217. alita_sdk/tools/google/bigquery/tool.py +5 -1
  218. alita_sdk/tools/google_places/__init__.py +20 -11
  219. alita_sdk/tools/jira/__init__.py +21 -11
  220. alita_sdk/tools/jira/api_wrapper.py +315 -168
  221. alita_sdk/tools/keycloak/__init__.py +10 -8
  222. alita_sdk/tools/localgit/__init__.py +8 -3
  223. alita_sdk/tools/localgit/local_git.py +62 -54
  224. alita_sdk/tools/localgit/tool.py +5 -1
  225. alita_sdk/tools/memory/__init__.py +38 -14
  226. alita_sdk/tools/non_code_indexer_toolkit.py +7 -2
  227. alita_sdk/tools/ocr/__init__.py +10 -8
  228. alita_sdk/tools/openapi/__init__.py +281 -108
  229. alita_sdk/tools/openapi/api_wrapper.py +883 -0
  230. alita_sdk/tools/openapi/tool.py +20 -0
  231. alita_sdk/tools/pandas/__init__.py +18 -11
  232. alita_sdk/tools/pandas/api_wrapper.py +40 -45
  233. alita_sdk/tools/pandas/dataframe/generator/base.py +3 -1
  234. alita_sdk/tools/postman/__init__.py +10 -11
  235. alita_sdk/tools/postman/api_wrapper.py +19 -8
  236. alita_sdk/tools/postman/postman_analysis.py +8 -1
  237. alita_sdk/tools/pptx/__init__.py +10 -10
  238. alita_sdk/tools/qtest/__init__.py +21 -14
  239. alita_sdk/tools/qtest/api_wrapper.py +1784 -88
  240. alita_sdk/tools/rally/__init__.py +12 -10
  241. alita_sdk/tools/report_portal/__init__.py +22 -16
  242. alita_sdk/tools/salesforce/__init__.py +21 -16
  243. alita_sdk/tools/servicenow/__init__.py +20 -16
  244. alita_sdk/tools/servicenow/api_wrapper.py +1 -1
  245. alita_sdk/tools/sharepoint/__init__.py +16 -14
  246. alita_sdk/tools/sharepoint/api_wrapper.py +179 -39
  247. alita_sdk/tools/sharepoint/authorization_helper.py +191 -1
  248. alita_sdk/tools/sharepoint/utils.py +8 -2
  249. alita_sdk/tools/slack/__init__.py +11 -7
  250. alita_sdk/tools/sql/__init__.py +21 -19
  251. alita_sdk/tools/sql/api_wrapper.py +71 -23
  252. alita_sdk/tools/testio/__init__.py +20 -13
  253. alita_sdk/tools/testrail/__init__.py +12 -11
  254. alita_sdk/tools/testrail/api_wrapper.py +214 -46
  255. alita_sdk/tools/utils/__init__.py +28 -4
  256. alita_sdk/tools/utils/content_parser.py +182 -62
  257. alita_sdk/tools/utils/text_operations.py +254 -0
  258. alita_sdk/tools/vector_adapters/VectorStoreAdapter.py +83 -27
  259. alita_sdk/tools/xray/__init__.py +17 -14
  260. alita_sdk/tools/xray/api_wrapper.py +58 -113
  261. alita_sdk/tools/yagmail/__init__.py +8 -3
  262. alita_sdk/tools/zephyr/__init__.py +11 -7
  263. alita_sdk/tools/zephyr_enterprise/__init__.py +15 -9
  264. alita_sdk/tools/zephyr_enterprise/api_wrapper.py +30 -15
  265. alita_sdk/tools/zephyr_essential/__init__.py +15 -10
  266. alita_sdk/tools/zephyr_essential/api_wrapper.py +297 -54
  267. alita_sdk/tools/zephyr_essential/client.py +6 -4
  268. alita_sdk/tools/zephyr_scale/__init__.py +12 -8
  269. alita_sdk/tools/zephyr_scale/api_wrapper.py +39 -31
  270. alita_sdk/tools/zephyr_squad/__init__.py +11 -7
  271. {alita_sdk-0.3.257.dist-info → alita_sdk-0.3.562.dist-info}/METADATA +184 -37
  272. alita_sdk-0.3.562.dist-info/RECORD +450 -0
  273. alita_sdk-0.3.562.dist-info/entry_points.txt +2 -0
  274. alita_sdk/tools/bitbucket/tools.py +0 -304
  275. alita_sdk-0.3.257.dist-info/RECORD +0 -343
  276. {alita_sdk-0.3.257.dist-info → alita_sdk-0.3.562.dist-info}/WHEEL +0 -0
  277. {alita_sdk-0.3.257.dist-info → alita_sdk-0.3.562.dist-info}/licenses/LICENSE +0 -0
  278. {alita_sdk-0.3.257.dist-info → alita_sdk-0.3.562.dist-info}/top_level.txt +0 -0
@@ -4,7 +4,8 @@ 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
9
10
 
10
11
  name = "rally"
@@ -20,17 +21,13 @@ def get_tools(tool):
20
21
 
21
22
  class RallyToolkit(BaseToolkit):
22
23
  tools: List[BaseTool] = []
23
- toolkit_max_length: int = 0
24
24
 
25
25
  @staticmethod
26
26
  def toolkit_config_schema() -> BaseModel:
27
27
  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
28
  return create_model(
30
29
  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']})),
30
+ rally_configuration=(RallyConfiguration, Field(description="Rally configuration", json_schema_extra={'configuration_types': ['rally']})),
34
31
  workspace=(Optional[str], Field(default=None, description="Rally workspace")),
35
32
  project=(Optional[str], Field(default=None, description="Rally project")),
36
33
  selected_tools=(List[Literal[tuple(selected_tools)]], Field(default=[], json_schema_extra={'args_schemas': selected_tools})),
@@ -45,6 +42,7 @@ class RallyToolkit(BaseToolkit):
45
42
  )
46
43
 
47
44
  @classmethod
45
+ @filter_missconfigured_index_tools
48
46
  def get_toolkit(cls, selected_tools: list[str] | None = None, toolkit_name: Optional[str] = None, **kwargs):
49
47
  if selected_tools is None:
50
48
  selected_tools = []
@@ -53,18 +51,22 @@ class RallyToolkit(BaseToolkit):
53
51
  **kwargs.get('rally_configuration'),
54
52
  }
55
53
  rally_api_wrapper = RallyApiWrapper(**wrapper_payload)
56
- prefix = clean_string(toolkit_name, cls.toolkit_max_length) + TOOLKIT_SPLITTER if toolkit_name else ''
57
54
  available_tools = rally_api_wrapper.get_available_tools()
58
55
  tools = []
59
56
  for tool in available_tools:
60
57
  if selected_tools:
61
58
  if tool["name"] not in selected_tools:
62
59
  continue
60
+ description = f"{tool['description']}\nWorkspace: {rally_api_wrapper.workspace}. Project: {rally_api_wrapper.project}"
61
+ if toolkit_name:
62
+ description = f"{description}\nToolkit: {toolkit_name}"
63
+ description = description[:1000]
63
64
  tools.append(BaseAction(
64
65
  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"]
66
+ name=tool["name"],
67
+ description=description,
68
+ args_schema=tool["args_schema"],
69
+ metadata={"toolkit_name": toolkit_name} if toolkit_name else {}
68
70
  ))
69
71
  return cls(tools=tools)
70
72
 
@@ -2,37 +2,33 @@ 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
10
12
 
11
13
  name = "report_portal"
12
14
 
13
15
  def get_tools(tool):
14
16
  return ReportPortalToolkit().get_toolkit(
15
17
  selected_tools=tool['settings'].get('selected_tools', []),
16
- endpoint=tool['settings']['endpoint'],
17
- api_key=tool['settings']['api_key'],
18
- project=tool['settings']['project'],
18
+ report_portal_configuration=tool['settings']['report_portal_configuration'],
19
19
  toolkit_name=tool.get('toolkit_name')
20
20
  ).get_tools()
21
21
 
22
22
 
23
23
  class ReportPortalToolkit(BaseToolkit):
24
- tools: list[BaseTool] = []
25
- toolkit_max_length: int = 0
24
+ tools: List[BaseTool] = []
26
25
 
27
26
  @staticmethod
28
27
  def toolkit_config_schema() -> BaseModel:
29
28
  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
29
  return create_model(
32
30
  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})),
31
+ report_portal_configuration=(ReportPortalConfiguration, Field(description="Report Portal Configuration", json_schema_extra={'configuration_types': ['report_portal']})),
36
32
  selected_tools=(List[Literal[tuple(selected_tools)]], Field(default=[], json_schema_extra={'args_schemas': selected_tools})),
37
33
  __config__=ConfigDict(json_schema_extra={'metadata': {"label": "Report Portal", "icon_url": "reportportal-icon.svg",
38
34
  "categories": ["testing"],
@@ -40,21 +36,31 @@ class ReportPortalToolkit(BaseToolkit):
40
36
  )
41
37
 
42
38
  @classmethod
39
+ @filter_missconfigured_index_tools
43
40
  def get_toolkit(cls, selected_tools: list[str] | None = None, toolkit_name: Optional[str] = None, **kwargs):
44
41
  if selected_tools is None:
45
42
  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 ''
43
+ wrapper_payload = {
44
+ **kwargs,
45
+ **kwargs.get('report_portal_configuration', {}),
46
+ }
47
+ report_portal_api_wrapper = ReportPortalApiWrapper(**wrapper_payload)
48
48
  available_tools = report_portal_api_wrapper.get_available_tools()
49
49
  tools = []
50
50
  for tool in available_tools:
51
51
  if selected_tools and tool["name"] not in selected_tools:
52
52
  continue
53
+ description = tool['description']
54
+ if toolkit_name:
55
+ description = f"Toolkit: {toolkit_name}\n{description}"
56
+ description = f"{description}\nReport portal configuration: 'url - {report_portal_api_wrapper.endpoint}, project - {report_portal_api_wrapper.project}'"
57
+ description = description[:1000]
53
58
  tools.append(BaseAction(
54
59
  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"]
60
+ name=tool["name"],
61
+ description=description,
62
+ args_schema=tool["args_schema"],
63
+ metadata={"toolkit_name": toolkit_name} if toolkit_name else {}
58
64
  ))
59
65
  return cls(tools=tools)
60
66
 
@@ -2,33 +2,30 @@ 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
7
10
 
8
11
  name = "salesforce"
9
12
 
10
13
  def get_tools(tool):
11
14
  return SalesforceToolkit().get_toolkit(
12
15
  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'),
16
+ salesforce_configuration=tool['settings']['salesforce_configuration'],
16
17
  api_version=tool['settings'].get('api_version', 'v59.0')
17
18
  ).get_tools()
18
19
 
19
20
  class SalesforceToolkit(BaseToolkit):
20
21
  tools: List[BaseTool] = []
21
- toolkit_max_length: int = 0
22
22
  @staticmethod
23
23
  def toolkit_config_schema() -> BaseModel:
24
24
  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
25
  return create_model(
27
26
  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
27
  api_version=(str, Field(description="Salesforce API Version", default='v59.0')),
28
+ salesforce_configuration=(SalesforceConfiguration, Field(description="Salesforce Configuration", json_schema_extra={'configuration_types': ['salesforce']})),
32
29
  selected_tools=(List[Literal[tuple(available_tools)]], Field(default=[], json_schema_extra={'args_schemas': available_tools})),
33
30
  __config__=ConfigDict(json_schema_extra={'metadata': {
34
31
  "label": "Salesforce", "icon_url": "salesforce-icon.svg",
@@ -38,23 +35,31 @@ class SalesforceToolkit(BaseToolkit):
38
35
  )
39
36
 
40
37
  @classmethod
38
+ @filter_missconfigured_index_tools
41
39
  def get_toolkit(cls, selected_tools: list[str] | None = None, toolkit_name: Optional[str] = None, **kwargs):
42
40
  if selected_tools is None:
43
41
  selected_tools = []
44
42
 
45
- api_wrapper = SalesforceApiWrapper(**kwargs)
46
- prefix = clean_string(toolkit_name, cls.toolkit_max_length) + TOOLKIT_SPLITTER if toolkit_name else ''
43
+ wrapper_payload = {
44
+ **kwargs,
45
+ **kwargs.get('salesforce_configuration', {}),
46
+ }
47
+ api_wrapper = SalesforceApiWrapper(**wrapper_payload)
47
48
  tools = []
48
49
 
49
50
  for tool in api_wrapper.get_available_tools():
50
51
  if selected_tools and tool["name"] not in selected_tools:
51
52
  continue
52
-
53
+ description = f"Salesforce Tool: {tool['description']}"
54
+ if toolkit_name:
55
+ description = f"{description}\nToolkit: {toolkit_name}"
56
+ description = description[:1000]
53
57
  tools.append(BaseAction(
54
58
  api_wrapper=api_wrapper,
55
- name=prefix + tool["name"],
56
- description=f"Salesforce Tool: {tool['description']}",
57
- args_schema=tool["args_schema"]
59
+ name=tool["name"],
60
+ description=description,
61
+ args_schema=tool["args_schema"],
62
+ metadata={"toolkit_name": toolkit_name} if toolkit_name else {}
58
63
  ))
59
64
 
60
65
  return cls(tools=tools)
@@ -5,39 +5,36 @@ 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
10
11
 
11
12
 
12
13
  name = "service_now"
13
14
 
14
15
  def get_tools(tool):
16
+ settings = tool.get('settings') or {}
17
+
15
18
  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),
19
+ selected_tools=settings.get('selected_tools', []),
20
+ instance_alias=settings.get('instance_alias', None),
21
+ servicenow_configuration=settings.get('servicenow_configuration', None),
22
+ response_fields=settings.get('response_fields', None),
21
23
  toolkit_name=tool.get('toolkit_name')
22
24
  ).get_tools()
23
25
 
24
26
 
25
27
  class ServiceNowToolkit(BaseToolkit):
26
28
  tools: List[BaseTool] = []
27
- toolkit_max_length: int = 0
28
29
 
29
30
  @staticmethod
30
31
  def toolkit_config_schema() -> BaseModel:
31
32
  selected_tools = {x['name']: x['args_schema'].schema() for x in
32
33
  ServiceNowAPIWrapper.model_construct().get_available_tools()}
33
- ServiceNowToolkit.toolkit_max_length = get_max_toolkit_length(selected_tools)
34
34
  return create_model(
35
35
  name,
36
- name=(str, Field(description="Toolkit name",
37
- json_schema_extra={
38
- 'toolkit_name': True, 'max_toolkit_length': ServiceNowToolkit.toolkit_max_length})),
39
36
  response_fields=(Optional[str], Field(description="Response fields", default=None)),
40
- servicenow_configuration=(Optional[ServiceNowConfiguration], Field(description="ServiceNow Configuration",
37
+ servicenow_configuration=(ServiceNowConfiguration, Field(description="ServiceNow Configuration",
41
38
  json_schema_extra={
42
39
  'configuration_types': [
43
40
  'service_now']})),
@@ -66,6 +63,7 @@ class ServiceNowToolkit(BaseToolkit):
66
63
  )
67
64
 
68
65
  @classmethod
66
+ @filter_missconfigured_index_tools
69
67
  def get_toolkit(cls, selected_tools: list[str] | None = None, toolkit_name: Optional[str] = None, **kwargs):
70
68
  if selected_tools is None:
71
69
  selected_tools = []
@@ -77,18 +75,24 @@ class ServiceNowToolkit(BaseToolkit):
77
75
  **kwargs['servicenow_configuration'],
78
76
  }
79
77
  servicenow_api_wrapper = ServiceNowAPIWrapper(**wrapper_payload)
80
- prefix = clean_string(toolkit_name, cls.toolkit_max_length) + TOOLKIT_SPLITTER if toolkit_name else ''
81
78
  available_tools = servicenow_api_wrapper.get_available_tools()
82
79
  tools = []
83
80
  for tool in available_tools:
84
81
  if selected_tools:
85
82
  if tool["name"] not in selected_tools:
86
83
  continue
84
+ base_url = getattr(servicenow_api_wrapper, "base_url", "") or ""
85
+ description = tool.get("description", "") if isinstance(tool, dict) else ""
86
+ if toolkit_name:
87
+ description = f"Toolkit: {toolkit_name}\n{description}"
88
+ description = f"ServiceNow: {base_url}\n{description}".strip()
89
+ description = description[:1000]
87
90
  tools.append(BaseAction(
88
91
  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"]
92
+ name=tool["name"],
93
+ description=description,
94
+ args_schema=tool["args_schema"],
95
+ metadata={"toolkit_name": toolkit_name} if toolkit_name else {}
92
96
  ))
93
97
  return cls(tools=tools)
94
98
 
@@ -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,13 @@
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
9
11
 
10
12
  name = "sharepoint"
11
13
 
@@ -13,9 +15,7 @@ def get_tools(tool):
13
15
  return (SharepointToolkit()
14
16
  .get_toolkit(
15
17
  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),
18
+ sharepoint_configuration=tool['settings']['sharepoint_configuration'],
19
19
  toolkit_name=tool.get('toolkit_name'),
20
20
  llm=tool['settings'].get('llm'),
21
21
  alita=tool['settings'].get('alita', None),
@@ -29,17 +29,13 @@ def get_tools(tool):
29
29
 
30
30
  class SharepointToolkit(BaseToolkit):
31
31
  tools: List[BaseTool] = []
32
- toolkit_max_length: int = 0
33
32
 
34
33
  @staticmethod
35
34
  def toolkit_config_schema() -> BaseModel:
36
35
  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
36
  return create_model(
39
37
  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})),
38
+ sharepoint_configuration=(SharepointConfiguration, Field(description="SharePoint Configuration", json_schema_extra={'configuration_types': ['sharepoint']})),
43
39
  selected_tools=(List[Literal[tuple(selected_tools)]], Field(default=[], json_schema_extra={'args_schemas': selected_tools})),
44
40
  # indexer settings
45
41
  pgvector_configuration=(Optional[PgVectorConfiguration], Field(default=None,
@@ -56,26 +52,32 @@ class SharepointToolkit(BaseToolkit):
56
52
  )
57
53
 
58
54
  @classmethod
55
+ @filter_missconfigured_index_tools
59
56
  def get_toolkit(cls, selected_tools: list[str] | None = None, toolkit_name: Optional[str] = None, **kwargs):
60
57
  if selected_tools is None:
61
58
  selected_tools = []
62
59
  wrapper_payload = {
63
60
  **kwargs,
61
+ **kwargs.get('sharepoint_configuration', {}),
64
62
  **(kwargs.get('pgvector_configuration') or {}),
65
63
  }
66
64
  sharepoint_api_wrapper = SharepointApiWrapper(**wrapper_payload)
67
- prefix = clean_string(toolkit_name, cls.toolkit_max_length) + TOOLKIT_SPLITTER if toolkit_name else ''
68
65
  available_tools = sharepoint_api_wrapper.get_available_tools()
69
66
  tools = []
70
67
  for tool in available_tools:
71
68
  if selected_tools:
72
69
  if tool["name"] not in selected_tools:
73
70
  continue
71
+ description = f"Sharepoint {sharepoint_api_wrapper.site_url}\n{tool['description']}"
72
+ if toolkit_name:
73
+ description = f"{description}\nToolkit: {toolkit_name}"
74
+ description = description[:1000]
74
75
  tools.append(BaseAction(
75
76
  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"]
77
+ name=tool["name"],
78
+ description=description,
79
+ args_schema=tool["args_schema"],
80
+ metadata={"toolkit_name": toolkit_name} if toolkit_name else {}
79
81
  ))
80
82
  return cls(tools=tools)
81
83