| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 | import loggingfrom typing import Anyfrom core.tools.entities.common_entities import I18nObjectfrom core.tools.entities.tool_entities import ToolParameter, ToolParameterOption, ToolProviderTypefrom core.tools.provider.tool_provider import ToolProviderControllerfrom core.tools.tool.tool import Toolfrom extensions.ext_database import dbfrom models.model import App, AppModelConfigfrom models.tools import PublishedAppToollogger = logging.getLogger(__name__)class AppToolProviderEntity(ToolProviderController):    @property    def provider_type(self) -> ToolProviderType:        return ToolProviderType.APP    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 in {"paragraph", "text-input"}:                    tool["parameters"].append(                        ToolParameter(                            name=variable_name,                            label=I18nObject(en_US=label, zh_Hans=label),                            human_description=I18nObject(en_US=label, zh_Hans=label),                            llm_description=label,                            form=ToolParameter.ToolParameterForm.FORM,                            type=ToolParameter.ToolParameterType.STRING,                            required=required,                            default=default,                        )                    )                elif form_type == "select":                    tool["parameters"].append(                        ToolParameter(                            name=variable_name,                            label=I18nObject(en_US=label, zh_Hans=label),                            human_description=I18nObject(en_US=label, zh_Hans=label),                            llm_description=label,                            form=ToolParameter.ToolParameterForm.FORM,                            type=ToolParameter.ToolParameterType.SELECT,                            required=required,                            default=default,                            options=[                                ToolParameterOption(value=option, label=I18nObject(en_US=option, zh_Hans=option))                                for option in options                            ],                        )                    )            tools.append(Tool(**tool))        return tools
 |