| 
									
										
										
										
											2024-02-01 18:11:57 +08:00
										 |  |  | import json | 
					
						
							|  |  |  | import logging | 
					
						
							|  |  |  | import mimetypes | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | from collections.abc import Generator | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | from os import listdir, path | 
					
						
							| 
									
										
										
										
											2024-10-31 00:21:01 +08:00
										 |  |  | from threading import Lock, Thread | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  | from typing import Any, Optional, Union, cast | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-17 22:26:18 +08:00
										 |  |  | from configs import dify_config | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | from core.agent.entities import AgentToolEntity | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  | from core.app.entities.app_invoke_entities import InvokeFrom | 
					
						
							| 
									
										
										
										
											2024-06-05 00:13:04 +08:00
										 |  |  | from core.helper.module_import_helper import load_single_subclass_from_source | 
					
						
							| 
									
										
										
										
											2024-08-20 23:16:43 -04:00
										 |  |  | from core.helper.position_helper import is_filtered | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | from core.model_runtime.utils.encoders import jsonable_encoder | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  | from core.tools.entities.api_entities import UserToolProvider, UserToolProviderTypeLiteral | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | from core.tools.entities.common_entities import I18nObject | 
					
						
							| 
									
										
										
										
											2024-08-20 23:16:43 -04:00
										 |  |  | from core.tools.entities.tool_entities import ApiProviderAuthType, ToolInvokeFrom, ToolParameter | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  | from core.tools.errors import ToolNotFoundError, ToolProviderNotFoundError | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  | from core.tools.provider.api_tool_provider import ApiToolProviderController | 
					
						
							| 
									
										
										
										
											2024-02-01 18:11:57 +08:00
										 |  |  | from core.tools.provider.builtin._positions import BuiltinToolProviderSort | 
					
						
							|  |  |  | from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  | from core.tools.provider.tool_provider import ToolProviderController | 
					
						
							|  |  |  | from core.tools.provider.workflow_tool_provider import WorkflowToolProviderController | 
					
						
							| 
									
										
										
										
											2024-02-01 18:11:57 +08:00
										 |  |  | from core.tools.tool.api_tool import ApiTool | 
					
						
							|  |  |  | from core.tools.tool.builtin_tool import BuiltinTool | 
					
						
							| 
									
										
										
										
											2024-03-08 20:31:13 +08:00
										 |  |  | from core.tools.tool.tool import Tool | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  | from core.tools.tool_label_manager import ToolLabelManager | 
					
						
							| 
									
										
										
										
											2024-08-20 23:16:43 -04:00
										 |  |  | from core.tools.utils.configuration import ToolConfigurationManager, ToolParameterConfigurationManager | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  | from core.workflow.nodes.tool.entities import ToolEntity | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | from extensions.ext_database import db | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  | from models.tools import ApiToolProvider, BuiltinToolProvider, WorkflowToolProvider | 
					
						
							|  |  |  | from services.tools.tools_transform_service import ToolTransformService | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | logger = logging.getLogger(__name__) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-20 23:16:43 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | class ToolManager: | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |     _builtin_provider_lock = Lock() | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |     _builtin_providers: dict[str, BuiltinToolProviderController] = {} | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |     _builtin_providers_loaded = False | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |     _builtin_tools_labels: dict[str, Union[I18nObject, None]] = {} | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |     @classmethod | 
					
						
							|  |  |  |     def get_builtin_provider(cls, provider: str) -> BuiltinToolProviderController: | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         get the builtin provider | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         :param provider: the name of the provider | 
					
						
							|  |  |  |         :return: the provider | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |         if len(cls._builtin_providers) == 0: | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  |             # init the builtin providers | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |             cls.load_builtin_providers_cache() | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |         if provider not in cls._builtin_providers: | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |             raise ToolProviderNotFoundError(f"builtin provider {provider} not found") | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return cls._builtin_providers[provider] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @classmethod | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |     def get_builtin_tool(cls, provider: str, tool_name: str) -> Union[BuiltinTool, Tool]: | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         get the builtin tool | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         :param provider: the name of the provider | 
					
						
							|  |  |  |         :param tool_name: the name of the tool | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         :return: the provider, the tool | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |         provider_controller = cls.get_builtin_provider(provider) | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  |         tool = provider_controller.get_tool(tool_name) | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |         if tool is None: | 
					
						
							|  |  |  |             raise ToolNotFoundError(f"tool {tool_name} not found") | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return tool | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     @classmethod | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |     def get_tool( | 
					
						
							| 
									
										
										
										
											2024-10-09 14:36:43 +08:00
										 |  |  |         cls, provider_type: str, provider_id: str, tool_name: str, tenant_id: Optional[str] = None | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |     ) -> Union[BuiltinTool, ApiTool, Tool]: | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         get the tool | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         :param provider_type: the type of the provider | 
					
						
							|  |  |  |         :param provider_name: the name of the provider | 
					
						
							|  |  |  |         :param tool_name: the name of the tool | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         :return: the tool | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         if provider_type == "builtin": | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |             return cls.get_builtin_tool(provider_id, tool_name) | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         elif provider_type == "api": | 
					
						
							| 
									
										
										
										
											2024-01-31 11:58:07 +08:00
										 |  |  |             if tenant_id is None: | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |                 raise ValueError("tenant id is required for api provider") | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |             api_provider, _ = cls.get_api_provider_controller(tenant_id, provider_id) | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  |             return api_provider.get_tool(tool_name) | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         elif provider_type == "app": | 
					
						
							|  |  |  |             raise NotImplementedError("app provider not implemented") | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |             raise ToolProviderNotFoundError(f"provider type {provider_type} not found") | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     @classmethod | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |     def get_tool_runtime( | 
					
						
							|  |  |  |         cls, | 
					
						
							|  |  |  |         provider_type: str, | 
					
						
							|  |  |  |         provider_id: str, | 
					
						
							|  |  |  |         tool_name: str, | 
					
						
							|  |  |  |         tenant_id: str, | 
					
						
							|  |  |  |         invoke_from: InvokeFrom = InvokeFrom.DEBUGGER, | 
					
						
							|  |  |  |         tool_invoke_from: ToolInvokeFrom = ToolInvokeFrom.AGENT, | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |     ) -> Union[BuiltinTool, ApiTool, Tool]: | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         get the tool runtime | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         :param provider_type: the type of the provider | 
					
						
							|  |  |  |         :param provider_name: the name of the provider | 
					
						
							|  |  |  |         :param tool_name: the name of the tool | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         :return: the tool | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |         controller: Union[BuiltinToolProviderController, ApiToolProviderController, WorkflowToolProviderController] | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         if provider_type == "builtin": | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  |             builtin_tool = cls.get_builtin_tool(provider_id, tool_name) | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |             # check if the builtin tool need credentials | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  |             provider_controller = cls.get_builtin_provider(provider_id) | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  |             if not provider_controller.need_credentials: | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |                 return builtin_tool.fork_tool_runtime( | 
					
						
							|  |  |  |                     runtime={ | 
					
						
							|  |  |  |                         "tenant_id": tenant_id, | 
					
						
							|  |  |  |                         "credentials": {}, | 
					
						
							|  |  |  |                         "invoke_from": invoke_from, | 
					
						
							|  |  |  |                         "tool_invoke_from": tool_invoke_from, | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 ) | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |             # get credentials | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |             builtin_provider: Optional[BuiltinToolProvider] = ( | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |                 db.session.query(BuiltinToolProvider) | 
					
						
							|  |  |  |                 .filter( | 
					
						
							|  |  |  |                     BuiltinToolProvider.tenant_id == tenant_id, | 
					
						
							|  |  |  |                     BuiltinToolProvider.provider == provider_id, | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |                 .first() | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if builtin_provider is None: | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |                 raise ToolProviderNotFoundError(f"builtin provider {provider_id} not found") | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  |             # decrypt the credentials | 
					
						
							|  |  |  |             credentials = builtin_provider.credentials | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  |             controller = cls.get_builtin_provider(provider_id) | 
					
						
							| 
									
										
										
										
											2024-03-08 20:31:13 +08:00
										 |  |  |             tool_configuration = ToolConfigurationManager(tenant_id=tenant_id, provider_controller=controller) | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 12:00:34 +08:00
										 |  |  |             decrypted_credentials = tool_configuration.decrypt_tool_credentials(credentials) | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |             return builtin_tool.fork_tool_runtime( | 
					
						
							|  |  |  |                 runtime={ | 
					
						
							|  |  |  |                     "tenant_id": tenant_id, | 
					
						
							|  |  |  |                     "credentials": decrypted_credentials, | 
					
						
							|  |  |  |                     "runtime_parameters": {}, | 
					
						
							|  |  |  |                     "invoke_from": invoke_from, | 
					
						
							|  |  |  |                     "tool_invoke_from": tool_invoke_from, | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2024-07-06 09:54:30 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         elif provider_type == "api": | 
					
						
							| 
									
										
										
										
											2024-01-31 11:58:07 +08:00
										 |  |  |             if tenant_id is None: | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |                 raise ValueError("tenant id is required for api provider") | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  |             api_provider, credentials = cls.get_api_provider_controller(tenant_id, provider_id) | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |             # decrypt the credentials | 
					
						
							| 
									
										
										
										
											2024-03-08 20:31:13 +08:00
										 |  |  |             tool_configuration = ToolConfigurationManager(tenant_id=tenant_id, provider_controller=api_provider) | 
					
						
							| 
									
										
										
										
											2024-01-24 12:00:34 +08:00
										 |  |  |             decrypted_credentials = tool_configuration.decrypt_tool_credentials(credentials) | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |             return api_provider.get_tool(tool_name).fork_tool_runtime( | 
					
						
							|  |  |  |                 runtime={ | 
					
						
							|  |  |  |                     "tenant_id": tenant_id, | 
					
						
							|  |  |  |                     "credentials": decrypted_credentials, | 
					
						
							|  |  |  |                     "invoke_from": invoke_from, | 
					
						
							|  |  |  |                     "tool_invoke_from": tool_invoke_from, | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |         elif provider_type == "workflow": | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |             workflow_provider: Optional[WorkflowToolProvider] = ( | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |                 db.session.query(WorkflowToolProvider) | 
					
						
							|  |  |  |                 .filter(WorkflowToolProvider.tenant_id == tenant_id, WorkflowToolProvider.id == provider_id) | 
					
						
							|  |  |  |                 .first() | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if workflow_provider is None: | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |                 raise ToolProviderNotFoundError(f"workflow provider {provider_id} not found") | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |             controller = ToolTransformService.workflow_provider_to_controller(db_provider=workflow_provider) | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |             controller_tools: Optional[list[Tool]] = controller.get_tools( | 
					
						
							|  |  |  |                 user_id="", tenant_id=workflow_provider.tenant_id | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |             if controller_tools is None or len(controller_tools) == 0: | 
					
						
							|  |  |  |                 raise ToolProviderNotFoundError(f"workflow provider {provider_id} not found") | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |             return controller_tools[0].fork_tool_runtime( | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |                 runtime={ | 
					
						
							|  |  |  |                     "tenant_id": tenant_id, | 
					
						
							|  |  |  |                     "credentials": {}, | 
					
						
							|  |  |  |                     "invoke_from": invoke_from, | 
					
						
							|  |  |  |                     "tool_invoke_from": tool_invoke_from, | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |         elif provider_type == "app": | 
					
						
							|  |  |  |             raise NotImplementedError("app provider not implemented") | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |             raise ToolProviderNotFoundError(f"provider type {provider_type} not found") | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |     @classmethod | 
					
						
							| 
									
										
										
										
											2024-10-21 10:43:49 +08:00
										 |  |  |     def _init_runtime_parameter(cls, parameter_rule: ToolParameter, parameters: dict): | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         init runtime parameter | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |         """
 | 
					
						
							|  |  |  |         parameter_value = parameters.get(parameter_rule.name) | 
					
						
							| 
									
										
										
										
											2024-07-06 09:54:30 +08:00
										 |  |  |         if not parameter_value and parameter_value != 0: | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |             # get default value | 
					
						
							|  |  |  |             parameter_value = parameter_rule.default | 
					
						
							|  |  |  |             if not parameter_value and parameter_rule.required: | 
					
						
							|  |  |  |                 raise ValueError(f"tool parameter {parameter_rule.name} not found in tool config") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if parameter_rule.type == ToolParameter.ToolParameterType.SELECT: | 
					
						
							|  |  |  |             # check if tool_parameter_config in options | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |             options = [x.value for x in parameter_rule.options or []] | 
					
						
							| 
									
										
										
										
											2024-06-12 17:46:53 +08:00
										 |  |  |             if parameter_value is not None and parameter_value not in options: | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |                 raise ValueError( | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |                     f"tool parameter {parameter_rule.name} value {parameter_value} not in options {options}" | 
					
						
							|  |  |  |                 ) | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-21 10:43:49 +08:00
										 |  |  |         return parameter_rule.type.cast_value(parameter_value) | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     @classmethod | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |     def get_agent_tool_runtime( | 
					
						
							|  |  |  |         cls, tenant_id: str, app_id: str, agent_tool: AgentToolEntity, invoke_from: InvokeFrom = InvokeFrom.DEBUGGER | 
					
						
							|  |  |  |     ) -> Tool: | 
					
						
							| 
									
										
										
										
											2024-03-08 20:31:13 +08:00
										 |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         get the agent tool runtime | 
					
						
							| 
									
										
										
										
											2024-03-08 20:31:13 +08:00
										 |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |         tool_entity = cls.get_tool_runtime( | 
					
						
							| 
									
										
										
										
											2024-06-05 00:13:04 +08:00
										 |  |  |             provider_type=agent_tool.provider_type, | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  |             provider_id=agent_tool.provider_id, | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |             tool_name=agent_tool.tool_name, | 
					
						
							| 
									
										
										
										
											2024-03-08 20:31:13 +08:00
										 |  |  |             tenant_id=tenant_id, | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  |             invoke_from=invoke_from, | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |             tool_invoke_from=ToolInvokeFrom.AGENT, | 
					
						
							| 
									
										
										
										
											2024-03-08 20:31:13 +08:00
										 |  |  |         ) | 
					
						
							|  |  |  |         runtime_parameters = {} | 
					
						
							|  |  |  |         parameters = tool_entity.get_all_runtime_parameters() | 
					
						
							|  |  |  |         for parameter in parameters: | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  |             # check file types | 
					
						
							| 
									
										
										
										
											2024-10-28 16:52:57 +08:00
										 |  |  |             if ( | 
					
						
							|  |  |  |                 parameter.type | 
					
						
							|  |  |  |                 in { | 
					
						
							|  |  |  |                     ToolParameter.ToolParameterType.SYSTEM_FILES, | 
					
						
							|  |  |  |                     ToolParameter.ToolParameterType.FILE, | 
					
						
							|  |  |  |                     ToolParameter.ToolParameterType.FILES, | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 and parameter.required | 
					
						
							|  |  |  |             ): | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  |                 raise ValueError(f"file type parameter {parameter.name} not supported in agent") | 
					
						
							| 
									
										
										
										
											2024-06-05 00:13:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-08 20:31:13 +08:00
										 |  |  |             if parameter.form == ToolParameter.ToolParameterForm.FORM: | 
					
						
							|  |  |  |                 # save tool parameter to tool entity memory | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |                 value = cls._init_runtime_parameter(parameter, agent_tool.tool_parameters) | 
					
						
							|  |  |  |                 runtime_parameters[parameter.name] = value | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-08 20:31:13 +08:00
										 |  |  |         # decrypt runtime parameters | 
					
						
							|  |  |  |         encryption_manager = ToolParameterConfigurationManager( | 
					
						
							|  |  |  |             tenant_id=tenant_id, | 
					
						
							|  |  |  |             tool_runtime=tool_entity, | 
					
						
							|  |  |  |             provider_name=agent_tool.provider_id, | 
					
						
							|  |  |  |             provider_type=agent_tool.provider_type, | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |             identity_id=f"AGENT.{app_id}", | 
					
						
							| 
									
										
										
										
											2024-03-08 20:31:13 +08:00
										 |  |  |         ) | 
					
						
							|  |  |  |         runtime_parameters = encryption_manager.decrypt_tool_parameters(runtime_parameters) | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |         if tool_entity.runtime is None or tool_entity.runtime.runtime_parameters is None: | 
					
						
							|  |  |  |             raise ValueError("runtime not found or runtime parameters not found") | 
					
						
							| 
									
										
										
										
											2024-03-08 20:31:13 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         tool_entity.runtime.runtime_parameters.update(runtime_parameters) | 
					
						
							|  |  |  |         return tool_entity | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |     @classmethod | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |     def get_workflow_tool_runtime( | 
					
						
							|  |  |  |         cls, | 
					
						
							|  |  |  |         tenant_id: str, | 
					
						
							|  |  |  |         app_id: str, | 
					
						
							|  |  |  |         node_id: str, | 
					
						
							|  |  |  |         workflow_tool: "ToolEntity", | 
					
						
							|  |  |  |         invoke_from: InvokeFrom = InvokeFrom.DEBUGGER, | 
					
						
							|  |  |  |     ) -> Tool: | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         get the workflow tool runtime | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |         """
 | 
					
						
							|  |  |  |         tool_entity = cls.get_tool_runtime( | 
					
						
							|  |  |  |             provider_type=workflow_tool.provider_type, | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  |             provider_id=workflow_tool.provider_id, | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |             tool_name=workflow_tool.tool_name, | 
					
						
							|  |  |  |             tenant_id=tenant_id, | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  |             invoke_from=invoke_from, | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |             tool_invoke_from=ToolInvokeFrom.WORKFLOW, | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |         ) | 
					
						
							|  |  |  |         runtime_parameters = {} | 
					
						
							|  |  |  |         parameters = tool_entity.get_all_runtime_parameters() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for parameter in parameters: | 
					
						
							|  |  |  |             # save tool parameter to tool entity memory | 
					
						
							|  |  |  |             if parameter.form == ToolParameter.ToolParameterForm.FORM: | 
					
						
							|  |  |  |                 value = cls._init_runtime_parameter(parameter, workflow_tool.tool_configurations) | 
					
						
							|  |  |  |                 runtime_parameters[parameter.name] = value | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # decrypt runtime parameters | 
					
						
							|  |  |  |         encryption_manager = ToolParameterConfigurationManager( | 
					
						
							|  |  |  |             tenant_id=tenant_id, | 
					
						
							|  |  |  |             tool_runtime=tool_entity, | 
					
						
							|  |  |  |             provider_name=workflow_tool.provider_id, | 
					
						
							|  |  |  |             provider_type=workflow_tool.provider_type, | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |             identity_id=f"WORKFLOW.{app_id}.{node_id}", | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if runtime_parameters: | 
					
						
							|  |  |  |             runtime_parameters = encryption_manager.decrypt_tool_parameters(runtime_parameters) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |         if tool_entity.runtime is None or tool_entity.runtime.runtime_parameters is None: | 
					
						
							|  |  |  |             raise ValueError("runtime not found or runtime parameters not found") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |         tool_entity.runtime.runtime_parameters.update(runtime_parameters) | 
					
						
							|  |  |  |         return tool_entity | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @classmethod | 
					
						
							|  |  |  |     def get_builtin_provider_icon(cls, provider: str) -> tuple[str, str]: | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         get the absolute path of the icon of the builtin provider | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         :param provider: the name of the provider | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         :return: the absolute path of the icon, the mime type of the icon | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  |         """
 | 
					
						
							|  |  |  |         # get provider | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |         provider_controller = cls.get_builtin_provider(provider) | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |         if provider_controller.identity is None: | 
					
						
							|  |  |  |             raise ToolProviderNotFoundError(f"builtin provider {provider} not found") | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         absolute_path = path.join( | 
					
						
							|  |  |  |             path.dirname(path.realpath(__file__)), | 
					
						
							|  |  |  |             "provider", | 
					
						
							|  |  |  |             "builtin", | 
					
						
							|  |  |  |             provider, | 
					
						
							|  |  |  |             "_assets", | 
					
						
							|  |  |  |             provider_controller.identity.icon, | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  |         # check if the icon exists | 
					
						
							|  |  |  |         if not path.exists(absolute_path): | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |             raise ToolProviderNotFoundError(f"builtin provider {provider} icon not found") | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  |         # get the mime type | 
					
						
							|  |  |  |         mime_type, _ = mimetypes.guess_type(absolute_path) | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         mime_type = mime_type or "application/octet-stream" | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return absolute_path, mime_type | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |     @classmethod | 
					
						
							|  |  |  |     def list_builtin_providers(cls) -> Generator[BuiltinToolProviderController, None, None]: | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  |         # use cache first | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |         if cls._builtin_providers_loaded: | 
					
						
							|  |  |  |             yield from list(cls._builtin_providers.values()) | 
					
						
							|  |  |  |             return | 
					
						
							| 
									
										
										
										
											2024-07-06 09:54:30 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |         with cls._builtin_provider_lock: | 
					
						
							|  |  |  |             if cls._builtin_providers_loaded: | 
					
						
							|  |  |  |                 yield from list(cls._builtin_providers.values()) | 
					
						
							|  |  |  |                 return | 
					
						
							| 
									
										
										
										
											2024-07-06 09:54:30 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |             yield from cls._list_builtin_providers() | 
					
						
							| 
									
										
										
										
											2024-07-06 09:54:30 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |     @classmethod | 
					
						
							|  |  |  |     def _list_builtin_providers(cls) -> Generator[BuiltinToolProviderController, None, None]: | 
					
						
							|  |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         list all the builtin providers | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         for provider in listdir(path.join(path.dirname(path.realpath(__file__)), "provider", "builtin")): | 
					
						
							|  |  |  |             if provider.startswith("__"): | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  |                 continue | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |             if path.isdir(path.join(path.dirname(path.realpath(__file__)), "provider", "builtin", provider)): | 
					
						
							|  |  |  |                 if provider.startswith("__"): | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  |                     continue | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 # init provider | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |                 try: | 
					
						
							|  |  |  |                     provider_class = load_single_subclass_from_source( | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |                         module_name=f"core.tools.provider.builtin.{provider}.{provider}", | 
					
						
							|  |  |  |                         script_path=path.join( | 
					
						
							|  |  |  |                             path.dirname(path.realpath(__file__)), "provider", "builtin", provider, f"{provider}.py" | 
					
						
							|  |  |  |                         ), | 
					
						
							|  |  |  |                         parent_type=BuiltinToolProviderController, | 
					
						
							|  |  |  |                     ) | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |                     provider_controller: BuiltinToolProviderController = provider_class() | 
					
						
							|  |  |  |                     if provider_controller.identity is None: | 
					
						
							|  |  |  |                         continue | 
					
						
							|  |  |  |                     cls._builtin_providers[provider_controller.identity.name] = provider_controller | 
					
						
							|  |  |  |                     for tool in provider_controller.get_tools() or []: | 
					
						
							|  |  |  |                         if tool.identity is None: | 
					
						
							|  |  |  |                             continue | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |                         cls._builtin_tools_labels[tool.identity.name] = tool.identity.label | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |                     yield provider_controller | 
					
						
							| 
									
										
										
										
											2024-03-08 15:22:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |                 except Exception as e: | 
					
						
							| 
									
										
										
										
											2024-11-15 15:41:40 +08:00
										 |  |  |                     logger.exception(f"load builtin provider {provider}") | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |                     continue | 
					
						
							|  |  |  |         # set builtin providers loaded | 
					
						
							|  |  |  |         cls._builtin_providers_loaded = True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @classmethod | 
					
						
							|  |  |  |     def load_builtin_providers_cache(cls): | 
					
						
							|  |  |  |         for _ in cls.list_builtin_providers(): | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @classmethod | 
					
						
							|  |  |  |     def clear_builtin_providers_cache(cls): | 
					
						
							|  |  |  |         cls._builtin_providers = {} | 
					
						
							|  |  |  |         cls._builtin_providers_loaded = False | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @classmethod | 
					
						
							|  |  |  |     def get_tool_label(cls, tool_name: str) -> Union[I18nObject, None]: | 
					
						
							| 
									
										
										
										
											2024-01-24 20:14:45 +08:00
										 |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         get the tool label | 
					
						
							| 
									
										
										
										
											2024-01-24 20:14:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         :param tool_name: the name of the tool | 
					
						
							| 
									
										
										
										
											2024-01-24 20:14:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         :return: the label of the tool | 
					
						
							| 
									
										
										
										
											2024-01-24 20:14:45 +08:00
										 |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |         if len(cls._builtin_tools_labels) == 0: | 
					
						
							| 
									
										
										
										
											2024-01-24 20:14:45 +08:00
										 |  |  |             # init the builtin providers | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |             cls.load_builtin_providers_cache() | 
					
						
							| 
									
										
										
										
											2024-01-24 20:14:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |         if tool_name not in cls._builtin_tools_labels: | 
					
						
							| 
									
										
										
										
											2024-01-24 20:14:45 +08:00
										 |  |  |             return None | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |         return cls._builtin_tools_labels[tool_name] | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |     @classmethod | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |     def user_list_providers( | 
					
						
							|  |  |  |         cls, user_id: str, tenant_id: str, typ: UserToolProviderTypeLiteral | 
					
						
							|  |  |  |     ) -> list[UserToolProvider]: | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |         result_providers: dict[str, UserToolProvider] = {} | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  |         filters = [] | 
					
						
							|  |  |  |         if not typ: | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |             filters.extend(["builtin", "api", "workflow"]) | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  |         else: | 
					
						
							|  |  |  |             filters.append(typ) | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         if "builtin" in filters: | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  |             # get builtin providers | 
					
						
							|  |  |  |             builtin_providers = cls.list_builtin_providers() | 
					
						
							| 
									
										
										
										
											2024-06-05 00:13:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  |             # get db builtin providers | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |             db_builtin_providers: list[BuiltinToolProvider] = ( | 
					
						
							|  |  |  |                 db.session.query(BuiltinToolProvider).filter(BuiltinToolProvider.tenant_id == tenant_id).all() | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |             find_db_builtin_provider = lambda provider: next( | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |                 (x for x in db_builtin_providers if x.provider == provider), None | 
					
						
							| 
									
										
										
										
											2024-03-08 15:22:55 +08:00
										 |  |  |             ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  |             # append builtin providers | 
					
						
							|  |  |  |             for provider in builtin_providers: | 
					
						
							| 
									
										
										
										
											2024-08-20 23:16:43 -04:00
										 |  |  |                 # handle include, exclude | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |                 if provider.identity is None: | 
					
						
							|  |  |  |                     continue | 
					
						
							| 
									
										
										
										
											2024-08-20 23:16:43 -04:00
										 |  |  |                 if is_filtered( | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |                     include_set=cast(set[str], dify_config.POSITION_TOOL_INCLUDES_SET), | 
					
						
							|  |  |  |                     exclude_set=cast(set[str], dify_config.POSITION_TOOL_EXCLUDES_SET), | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |                     data=provider, | 
					
						
							|  |  |  |                     name_func=lambda x: x.identity.name, | 
					
						
							| 
									
										
										
										
											2024-08-20 23:16:43 -04:00
										 |  |  |                 ): | 
					
						
							|  |  |  |                     continue | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  |                 user_provider = ToolTransformService.builtin_provider_to_user_provider( | 
					
						
							|  |  |  |                     provider_controller=provider, | 
					
						
							|  |  |  |                     db_provider=find_db_builtin_provider(provider.identity.name), | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |                     decrypt_credentials=False, | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  |                 ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 result_providers[provider.identity.name] = user_provider | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  |         # get db api providers | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         if "api" in filters: | 
					
						
							|  |  |  |             db_api_providers: list[ApiToolProvider] = ( | 
					
						
							|  |  |  |                 db.session.query(ApiToolProvider).filter(ApiToolProvider.tenant_id == tenant_id).all() | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2024-06-05 00:13:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |             api_provider_controllers: list[dict[str, Any]] = [ | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |                 {"provider": provider, "controller": ToolTransformService.api_provider_to_controller(provider)} | 
					
						
							|  |  |  |                 for provider in db_api_providers | 
					
						
							|  |  |  |             ] | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |             # get labels | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |             labels = ToolLabelManager.get_tools_labels([x["controller"] for x in api_provider_controllers]) | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |             for api_provider_controller in api_provider_controllers: | 
					
						
							|  |  |  |                 user_provider = ToolTransformService.api_provider_to_user_provider( | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |                     provider_controller=api_provider_controller["controller"], | 
					
						
							|  |  |  |                     db_provider=api_provider_controller["provider"], | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  |                     decrypt_credentials=False, | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |                     labels=labels.get(api_provider_controller["controller"].provider_id, []), | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  |                 ) | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |                 result_providers[f"api_provider.{user_provider.name}"] = user_provider | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         if "workflow" in filters: | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  |             # get workflow providers | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |             workflow_providers: list[WorkflowToolProvider] = ( | 
					
						
							|  |  |  |                 db.session.query(WorkflowToolProvider).filter(WorkflowToolProvider.tenant_id == tenant_id).all() | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2024-06-05 00:13:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |             workflow_provider_controllers: list[WorkflowToolProviderController] = [] | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  |             for provider in workflow_providers: | 
					
						
							|  |  |  |                 try: | 
					
						
							|  |  |  |                     workflow_provider_controllers.append( | 
					
						
							|  |  |  |                         ToolTransformService.workflow_provider_to_controller(db_provider=provider) | 
					
						
							|  |  |  |                     ) | 
					
						
							|  |  |  |                 except Exception as e: | 
					
						
							|  |  |  |                     # app has been deleted | 
					
						
							|  |  |  |                     pass | 
					
						
							| 
									
										
										
										
											2024-06-05 00:13:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |             labels = ToolLabelManager.get_tools_labels( | 
					
						
							|  |  |  |                 [cast(ToolProviderController, controller) for controller in workflow_provider_controllers] | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |             for provider_controller in workflow_provider_controllers: | 
					
						
							|  |  |  |                 user_provider = ToolTransformService.workflow_provider_to_user_provider( | 
					
						
							|  |  |  |                     provider_controller=provider_controller, | 
					
						
							|  |  |  |                     labels=labels.get(provider_controller.provider_id, []), | 
					
						
							|  |  |  |                 ) | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |                 result_providers[f"workflow_provider.{user_provider.name}"] = user_provider | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return BuiltinToolProviderSort.sort(list(result_providers.values())) | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     @classmethod | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |     def get_api_provider_controller( | 
					
						
							|  |  |  |         cls, tenant_id: str, provider_id: str | 
					
						
							|  |  |  |     ) -> tuple[ApiToolProviderController, dict[str, Any]]: | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         get the api provider | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         :param provider_name: the name of the provider | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         :return: the provider controller, the credentials | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |         provider: Optional[ApiToolProvider] = ( | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |             db.session.query(ApiToolProvider) | 
					
						
							|  |  |  |             .filter( | 
					
						
							|  |  |  |                 ApiToolProvider.id == provider_id, | 
					
						
							|  |  |  |                 ApiToolProvider.tenant_id == tenant_id, | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |             .first() | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if provider is None: | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |             raise ToolProviderNotFoundError(f"api provider {provider_id} not found") | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  |         controller = ApiToolProviderController.from_db( | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |             provider, | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |             ApiProviderAuthType.API_KEY if provider.credentials["auth_type"] == "api_key" else ApiProviderAuthType.NONE, | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  |         ) | 
					
						
							|  |  |  |         controller.load_bundled_tools(provider.tools) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return controller, provider.credentials | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     @classmethod | 
					
						
							|  |  |  |     def user_get_api_provider(cls, provider: str, tenant_id: str) -> dict: | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         get api provider | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  |         """
 | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |             get tool provider | 
					
						
							|  |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2024-11-11 21:50:32 +08:00
										 |  |  |         provider_name = provider | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |         provider_tool: Optional[ApiToolProvider] = ( | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |             db.session.query(ApiToolProvider) | 
					
						
							|  |  |  |             .filter( | 
					
						
							|  |  |  |                 ApiToolProvider.tenant_id == tenant_id, | 
					
						
							|  |  |  |                 ApiToolProvider.name == provider, | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |             .first() | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |         if provider_tool is None: | 
					
						
							| 
									
										
										
										
											2024-11-11 21:50:32 +08:00
										 |  |  |             raise ValueError(f"you have not added provider {provider_name}") | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |             credentials = json.loads(provider_tool.credentials_str) or {} | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  |         except: | 
					
						
							|  |  |  |             credentials = {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # package tool provider controller | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  |         controller = ApiToolProviderController.from_db( | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |             provider_tool, | 
					
						
							|  |  |  |             ApiProviderAuthType.API_KEY if credentials["auth_type"] == "api_key" else ApiProviderAuthType.NONE, | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  |         ) | 
					
						
							|  |  |  |         # init tool configuration | 
					
						
							| 
									
										
										
										
											2024-03-08 20:31:13 +08:00
										 |  |  |         tool_configuration = ToolConfigurationManager(tenant_id=tenant_id, provider_controller=controller) | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 12:00:34 +08:00
										 |  |  |         decrypted_credentials = tool_configuration.decrypt_tool_credentials(credentials) | 
					
						
							|  |  |  |         masked_credentials = tool_configuration.mask_tool_credentials(decrypted_credentials) | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         try: | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |             icon = json.loads(provider_tool.icon) | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  |         except: | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |             icon = {"background": "#252525", "content": "\ud83d\ude01"} | 
					
						
							| 
									
										
										
										
											2024-01-23 19:58:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  |         # add tool labels | 
					
						
							|  |  |  |         labels = ToolLabelManager.get_tool_labels(controller) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |         return cast( | 
					
						
							|  |  |  |             dict, | 
					
						
							|  |  |  |             jsonable_encoder( | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     "schema_type": provider_tool.schema_type, | 
					
						
							|  |  |  |                     "schema": provider_tool.schema, | 
					
						
							|  |  |  |                     "tools": provider_tool.tools, | 
					
						
							|  |  |  |                     "icon": icon, | 
					
						
							|  |  |  |                     "description": provider_tool.description, | 
					
						
							|  |  |  |                     "credentials": masked_credentials, | 
					
						
							|  |  |  |                     "privacy_policy": provider_tool.privacy_policy, | 
					
						
							|  |  |  |                     "custom_disclaimer": provider_tool.custom_disclaimer, | 
					
						
							|  |  |  |                     "labels": labels, | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             ), | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     @classmethod | 
					
						
							|  |  |  |     def get_tool_icon(cls, tenant_id: str, provider_type: str, provider_id: str) -> Union[str, dict]: | 
					
						
							|  |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         get the tool icon | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         :param tenant_id: the id of the tenant | 
					
						
							|  |  |  |         :param provider_type: the type of the provider | 
					
						
							|  |  |  |         :param provider_id: the id of the provider | 
					
						
							|  |  |  |         :return: | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |         """
 | 
					
						
							|  |  |  |         provider_type = provider_type | 
					
						
							|  |  |  |         provider_id = provider_id | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |         provider: Optional[Union[BuiltinToolProvider, ApiToolProvider, WorkflowToolProvider]] = None | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         if provider_type == "builtin": | 
					
						
							|  |  |  |             return ( | 
					
						
							|  |  |  |                 dify_config.CONSOLE_API_URL | 
					
						
							|  |  |  |                 + "/console/api/workspaces/current/tool-provider/builtin/" | 
					
						
							|  |  |  |                 + provider_id | 
					
						
							|  |  |  |                 + "/icon" | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |         elif provider_type == "api": | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |             try: | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |                 provider = ( | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |                     db.session.query(ApiToolProvider) | 
					
						
							|  |  |  |                     .filter(ApiToolProvider.tenant_id == tenant_id, ApiToolProvider.id == provider_id) | 
					
						
							|  |  |  |                     .first() | 
					
						
							|  |  |  |                 ) | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |                 if provider is None: | 
					
						
							|  |  |  |                     raise ToolProviderNotFoundError(f"api provider {provider_id} not found") | 
					
						
							|  |  |  |                 icon = json.loads(provider.icon) | 
					
						
							|  |  |  |                 if isinstance(icon, (str, dict)): | 
					
						
							|  |  |  |                     return icon | 
					
						
							|  |  |  |                 return {"background": "#252525", "content": "\ud83d\ude01"} | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |             except: | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |                 return {"background": "#252525", "content": "\ud83d\ude01"} | 
					
						
							|  |  |  |         elif provider_type == "workflow": | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |             provider = ( | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |                 db.session.query(WorkflowToolProvider) | 
					
						
							|  |  |  |                 .filter(WorkflowToolProvider.tenant_id == tenant_id, WorkflowToolProvider.id == provider_id) | 
					
						
							|  |  |  |                 .first() | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  |             if provider is None: | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |                 raise ToolProviderNotFoundError(f"workflow provider {provider_id} not found") | 
					
						
							| 
									
										
										
										
											2024-05-27 22:01:11 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |             try: | 
					
						
							|  |  |  |                 icon = json.loads(provider.icon) | 
					
						
							|  |  |  |                 if isinstance(icon, (str, dict)): | 
					
						
							|  |  |  |                     return icon | 
					
						
							|  |  |  |                 return {"background": "#252525", "content": "\ud83d\ude01"} | 
					
						
							|  |  |  |             except: | 
					
						
							|  |  |  |                 return {"background": "#252525", "content": "\ud83d\ude01"} | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |         else: | 
					
						
							|  |  |  |             raise ValueError(f"provider type {provider_type} not found") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-20 23:16:43 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-31 00:21:01 +08:00
										 |  |  | # preload builtin tool providers | 
					
						
							|  |  |  | Thread(target=ToolManager.load_builtin_providers_cache, name="pre_load_builtin_providers_cache", daemon=True).start() |