Team Ai
Apppublic

Underground-Digital/Workflow-Engine

sourceHugging Faceupdated 2y agoView on Hugging Face
0likes
tools_transform_service.py276 linesDownload Raw Back to tools
1import json2import logging3from typing import Optional, Union4 5from configs import dify_config6from core.tools.entities.api_entities import UserTool, UserToolProvider7from core.tools.entities.common_entities import I18nObject8from core.tools.entities.tool_bundle import ApiToolBundle9from core.tools.entities.tool_entities import (10    ApiProviderAuthType,11    ToolParameter,12    ToolProviderCredentials,13    ToolProviderType,14)15from core.tools.provider.api_tool_provider import ApiToolProviderController16from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController17from core.tools.provider.workflow_tool_provider import WorkflowToolProviderController18from core.tools.tool.tool import Tool19from core.tools.tool.workflow_tool import WorkflowTool20from core.tools.utils.configuration import ToolConfigurationManager21from models.tools import ApiToolProvider, BuiltinToolProvider, WorkflowToolProvider22 23logger = logging.getLogger(__name__)24 25 26class ToolTransformService:27    @staticmethod28    def get_tool_provider_icon_url(provider_type: str, provider_name: str, icon: str) -> Union[str, dict]:29        """30        get tool provider icon url31        """32        url_prefix = dify_config.CONSOLE_API_URL + "/console/api/workspaces/current/tool-provider/"33 34        if provider_type == ToolProviderType.BUILT_IN.value:35            return url_prefix + "builtin/" + provider_name + "/icon"36        elif provider_type in {ToolProviderType.API.value, ToolProviderType.WORKFLOW.value}:37            try:38                return json.loads(icon)39            except:40                return {"background": "#252525", "content": "\ud83d\ude01"}41 42        return ""43 44    @staticmethod45    def repack_provider(provider: Union[dict, UserToolProvider]):46        """47        repack provider48 49        :param provider: the provider dict50        """51        if isinstance(provider, dict) and "icon" in provider:52            provider["icon"] = ToolTransformService.get_tool_provider_icon_url(53                provider_type=provider["type"], provider_name=provider["name"], icon=provider["icon"]54            )55        elif isinstance(provider, UserToolProvider):56            provider.icon = ToolTransformService.get_tool_provider_icon_url(57                provider_type=provider.type.value, provider_name=provider.name, icon=provider.icon58            )59 60    @staticmethod61    def builtin_provider_to_user_provider(62        provider_controller: BuiltinToolProviderController,63        db_provider: Optional[BuiltinToolProvider],64        decrypt_credentials: bool = True,65    ) -> UserToolProvider:66        """67        convert provider controller to user provider68        """69        result = UserToolProvider(70            id=provider_controller.identity.name,71            author=provider_controller.identity.author,72            name=provider_controller.identity.name,73            description=I18nObject(74                en_US=provider_controller.identity.description.en_US,75                zh_Hans=provider_controller.identity.description.zh_Hans,76                pt_BR=provider_controller.identity.description.pt_BR,77                ja_JP=provider_controller.identity.description.ja_JP,78            ),79            icon=provider_controller.identity.icon,80            label=I18nObject(81                en_US=provider_controller.identity.label.en_US,82                zh_Hans=provider_controller.identity.label.zh_Hans,83                pt_BR=provider_controller.identity.label.pt_BR,84                ja_JP=provider_controller.identity.label.ja_JP,85            ),86            type=ToolProviderType.BUILT_IN,87            masked_credentials={},88            is_team_authorization=False,89            tools=[],90            labels=provider_controller.tool_labels,91        )92 93        # get credentials schema94        schema = provider_controller.get_credentials_schema()95        for name, value in schema.items():96            result.masked_credentials[name] = ToolProviderCredentials.CredentialsType.default(value.type)97 98        # check if the provider need credentials99        if not provider_controller.need_credentials:100            result.is_team_authorization = True101            result.allow_delete = False102        elif db_provider:103            result.is_team_authorization = True104 105            if decrypt_credentials:106                credentials = db_provider.credentials107 108                # init tool configuration109                tool_configuration = ToolConfigurationManager(110                    tenant_id=db_provider.tenant_id, provider_controller=provider_controller111                )112                # decrypt the credentials and mask the credentials113                decrypted_credentials = tool_configuration.decrypt_tool_credentials(credentials=credentials)114                masked_credentials = tool_configuration.mask_tool_credentials(credentials=decrypted_credentials)115 116                result.masked_credentials = masked_credentials117                result.original_credentials = decrypted_credentials118 119        return result120 121    @staticmethod122    def api_provider_to_controller(123        db_provider: ApiToolProvider,124    ) -> ApiToolProviderController:125        """126        convert provider controller to user provider127        """128        # package tool provider controller129        controller = ApiToolProviderController.from_db(130            db_provider=db_provider,131            auth_type=ApiProviderAuthType.API_KEY132            if db_provider.credentials["auth_type"] == "api_key"133            else ApiProviderAuthType.NONE,134        )135 136        return controller137 138    @staticmethod139    def workflow_provider_to_controller(db_provider: WorkflowToolProvider) -> WorkflowToolProviderController:140        """141        convert provider controller to provider142        """143        return WorkflowToolProviderController.from_db(db_provider)144 145    @staticmethod146    def workflow_provider_to_user_provider(147        provider_controller: WorkflowToolProviderController, labels: Optional[list[str]] = None148    ):149        """150        convert provider controller to user provider151        """152        return UserToolProvider(153            id=provider_controller.provider_id,154            author=provider_controller.identity.author,155            name=provider_controller.identity.name,156            description=I18nObject(157                en_US=provider_controller.identity.description.en_US,158                zh_Hans=provider_controller.identity.description.zh_Hans,159            ),160            icon=provider_controller.identity.icon,161            label=I18nObject(162                en_US=provider_controller.identity.label.en_US,163                zh_Hans=provider_controller.identity.label.zh_Hans,164            ),165            type=ToolProviderType.WORKFLOW,166            masked_credentials={},167            is_team_authorization=True,168            tools=[],169            labels=labels or [],170        )171 172    @staticmethod173    def api_provider_to_user_provider(174        provider_controller: ApiToolProviderController,175        db_provider: ApiToolProvider,176        decrypt_credentials: bool = True,177        labels: Optional[list[str]] = None,178    ) -> UserToolProvider:179        """180        convert provider controller to user provider181        """182        username = "Anonymous"183        try:184            username = db_provider.user.name185        except Exception as e:186            logger.error(f"failed to get user name for api provider {db_provider.id}: {str(e)}")187        # add provider into providers188        credentials = db_provider.credentials189        result = UserToolProvider(190            id=db_provider.id,191            author=username,192            name=db_provider.name,193            description=I18nObject(194                en_US=db_provider.description,195                zh_Hans=db_provider.description,196            ),197            icon=db_provider.icon,198            label=I18nObject(199                en_US=db_provider.name,200                zh_Hans=db_provider.name,201            ),202            type=ToolProviderType.API,203            masked_credentials={},204            is_team_authorization=True,205            tools=[],206            labels=labels or [],207        )208 209        if decrypt_credentials:210            # init tool configuration211            tool_configuration = ToolConfigurationManager(212                tenant_id=db_provider.tenant_id, provider_controller=provider_controller213            )214 215            # decrypt the credentials and mask the credentials216            decrypted_credentials = tool_configuration.decrypt_tool_credentials(credentials=credentials)217            masked_credentials = tool_configuration.mask_tool_credentials(credentials=decrypted_credentials)218 219            result.masked_credentials = masked_credentials220 221        return result222 223    @staticmethod224    def tool_to_user_tool(225        tool: Union[ApiToolBundle, WorkflowTool, Tool],226        credentials: Optional[dict] = None,227        tenant_id: Optional[str] = None,228        labels: Optional[list[str]] = None,229    ) -> UserTool:230        """231        convert tool to user tool232        """233        if isinstance(tool, Tool):234            # fork tool runtime235            tool = tool.fork_tool_runtime(236                runtime={237                    "credentials": credentials,238                    "tenant_id": tenant_id,239                }240            )241 242            # get tool parameters243            parameters = tool.parameters or []244            # get tool runtime parameters245            runtime_parameters = tool.get_runtime_parameters() or []246            # override parameters247            current_parameters = parameters.copy()248            for runtime_parameter in runtime_parameters:249                found = False250                for index, parameter in enumerate(current_parameters):251                    if parameter.name == runtime_parameter.name and parameter.form == runtime_parameter.form:252                        current_parameters[index] = runtime_parameter253                        found = True254                        break255 256                if not found and runtime_parameter.form == ToolParameter.ToolParameterForm.FORM:257                    current_parameters.append(runtime_parameter)258 259            return UserTool(260                author=tool.identity.author,261                name=tool.identity.name,262                label=tool.identity.label,263                description=tool.description.human,264                parameters=current_parameters,265                labels=labels,266            )267        if isinstance(tool, ApiToolBundle):268            return UserTool(269                author=tool.author,270                name=tool.operation_id,271                label=I18nObject(en_US=tool.operation_id, zh_Hans=tool.operation_id),272                description=I18nObject(en_US=tool.summary or "", zh_Hans=tool.summary or ""),273                parameters=tool.parameters,274                labels=labels,275            )276