| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 | from typing import Any, Dict, Listfrom core.tools.entities.tool_entities import ToolProviderType, ToolParamter, ToolParamterOptionfrom core.tools.tool.tool import Toolfrom core.tools.entities.common_entities import I18nObjectfrom core.tools.provider.tool_provider import ToolProviderControllerfrom extensions.ext_database import dbfrom models.tools import PublishedAppToolfrom models.model import App, AppModelConfigimport logginglogger = logging.getLogger(__name__)class AppBasedToolProviderEntity(ToolProviderController):    @property    def app_type(self) -> ToolProviderType:        return ToolProviderType.APP_BASED        def _validate_credentials(self, tool_name: str, credentials: Dict[str, Any]) -> None:        pass    def validate_parameters(self, tool_name: str, tool_parameters: Dict[str, Any]) -> None:        pass    def get_tools(self, user_id: str) -> List[Tool]:        db_tools: List[PublishedAppTool] = db.session.query(PublishedAppTool).filter(            PublishedAppTool.user_id == user_id,        ).all()        if not db_tools or len(db_tools) == 0:            return []        tools: List[Tool] = []        for db_tool in db_tools:            tool = {                'identity': {                    'author': db_tool.author,                    'name': db_tool.tool_name,                    'label': {                        'en_US': db_tool.tool_name,                        'zh_Hans': db_tool.tool_name                    },                    'icon': ''                },                'description': {                    'human': {                        'en_US': db_tool.description_i18n.en_US,                        'zh_Hans': db_tool.description_i18n.zh_Hans                    },                    'llm': db_tool.llm_description                },                'parameters': []            }            # get app from db            app: App = db_tool.app            if not app:                logger.error(f"app {db_tool.app_id} not found")                continue            app_model_config: AppModelConfig = app.app_model_config            user_input_form_list = app_model_config.user_input_form_list            for input_form in user_input_form_list:                # get type                form_type = input_form.keys()[0]                default = input_form[form_type]['default']                required = input_form[form_type]['required']                label = input_form[form_type]['label']                variable_name = input_form[form_type]['variable_name']                options = input_form[form_type].get('options', [])                if form_type == 'paragraph' or form_type == 'text-input':                    tool['parameters'].append(ToolParamter(                        name=variable_name,                        label=I18nObject(                            en_US=label,                            zh_Hans=label                        ),                        human_description=I18nObject(                            en_US=label,                            zh_Hans=label                        ),                        llm_description=label,                        form=ToolParamter.ToolParameterForm.FORM,                        type=ToolParamter.ToolParameterType.STRING,                        required=required,                        default=default                    ))                elif form_type == 'select':                    tool['parameters'].append(ToolParamter(                        name=variable_name,                        label=I18nObject(                            en_US=label,                            zh_Hans=label                        ),                        human_description=I18nObject(                            en_US=label,                            zh_Hans=label                        ),                        llm_description=label,                        form=ToolParamter.ToolParameterForm.FORM,                        type=ToolParamter.ToolParameterType.SELECT,                        required=required,                        default=default,                        options=[ToolParamterOption(                            value=option,                            label=I18nObject(                                en_US=option,                                zh_Hans=option                            )                        ) for option in options]                    ))            tools.append(Tool(**tool))        return tools
 |