From 1b0acdbe632eac022a47f4c106791845fb8e7c9b Mon Sep 17 00:00:00 2001 From: takatost Date: Mon, 18 Mar 2024 21:22:49 +0800 Subject: [PATCH 1/2] fix message resign url --- api/models/model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/models/model.py b/api/models/model.py index 25a6ec0afe..f5a87fd3bc 100644 --- a/api/models/model.py +++ b/api/models/model.py @@ -621,7 +621,7 @@ class Message(db.Model): if not self.answer: return self.answer - pattern = r'\[!?.*?\]\((((http|https):\/\/[\w.-]+)?\/files\/(tools\/)?[\w-]+.*?timestamp=.*&nonce=.*&sign=.*)\)' + pattern = r'\[!?.*?\]\((((http|https):\/\/.+)?\/files\/(tools\/)?[\w-]+.*?timestamp=.*&nonce=.*&sign=.*)\)' matches = re.findall(pattern, self.answer) if not matches: From 587ba27f8cd3f6b57664809aef5b8f4a5727a133 Mon Sep 17 00:00:00 2001 From: takatost Date: Mon, 18 Mar 2024 21:42:45 +0800 Subject: [PATCH 2/2] fix bugs --- api/controllers/console/explore/parameter.py | 48 ++------------ api/controllers/service_api/app/app.py | 41 +----------- api/controllers/web/app.py | 37 +---------- api/services/app_service.py | 68 ++++++++++++++++++++ 4 files changed, 78 insertions(+), 116 deletions(-) diff --git a/api/controllers/console/explore/parameter.py b/api/controllers/console/explore/parameter.py index 9c0fca57f2..6eae6bafc9 100644 --- a/api/controllers/console/explore/parameter.py +++ b/api/controllers/console/explore/parameter.py @@ -1,4 +1,3 @@ -import json from flask import current_app from flask_restful import fields, marshal_with @@ -6,9 +5,8 @@ from flask_restful import fields, marshal_with from controllers.console import api from controllers.console.app.error import AppUnavailableError from controllers.console.explore.wraps import InstalledAppResource -from extensions.ext_database import db -from models.model import AppMode, AppModelConfig, InstalledApp -from models.tools import ApiToolProvider +from models.model import AppMode, InstalledApp +from services.app_service import AppService class AppParameterApi(InstalledAppResource): @@ -53,7 +51,7 @@ class AppParameterApi(InstalledAppResource): raise AppUnavailableError() features_dict = workflow.features_dict - user_input_form = workflow.user_input_form + user_input_form = workflow.user_input_form() else: app_model_config = app_model.app_model_config features_dict = app_model_config.to_dict() @@ -88,44 +86,8 @@ class AppParameterApi(InstalledAppResource): class ExploreAppMetaApi(InstalledAppResource): def get(self, installed_app: InstalledApp): """Get app meta""" - app_model_config: AppModelConfig = installed_app.app.app_model_config - - if not app_model_config: - return { - 'tool_icons': {} - } - - agent_config = app_model_config.agent_mode_dict or {} - meta = { - 'tool_icons': {} - } - - # get all tools - tools = agent_config.get('tools', []) - url_prefix = (current_app.config.get("CONSOLE_API_URL") - + "/console/api/workspaces/current/tool-provider/builtin/") - for tool in tools: - keys = list(tool.keys()) - if len(keys) >= 4: - # current tool standard - provider_type = tool.get('provider_type') - provider_id = tool.get('provider_id') - tool_name = tool.get('tool_name') - if provider_type == 'builtin': - meta['tool_icons'][tool_name] = url_prefix + provider_id + '/icon' - elif provider_type == 'api': - try: - provider: ApiToolProvider = db.session.query(ApiToolProvider).filter( - ApiToolProvider.id == provider_id - ) - meta['tool_icons'][tool_name] = json.loads(provider.icon) - except: - meta['tool_icons'][tool_name] = { - "background": "#252525", - "content": "\ud83d\ude01" - } - - return meta + app_model = installed_app.app + return AppService().get_app_meta(app_model) api.add_resource(AppParameterApi, '/installed-apps//parameters', diff --git a/api/controllers/service_api/app/app.py b/api/controllers/service_api/app/app.py index 76708716c2..1e52b9e75d 100644 --- a/api/controllers/service_api/app/app.py +++ b/api/controllers/service_api/app/app.py @@ -9,6 +9,7 @@ from controllers.service_api.wraps import validate_app_token from extensions.ext_database import db from models.model import App, AppModelConfig, AppMode from models.tools import ApiToolProvider +from services.app_service import AppService class AppParameterApi(Resource): @@ -53,7 +54,7 @@ class AppParameterApi(Resource): raise AppUnavailableError() features_dict = workflow.features_dict - user_input_form = workflow.user_input_form + user_input_form = workflow.user_input_form() else: app_model_config = app_model.app_model_config features_dict = app_model_config.to_dict() @@ -89,44 +90,8 @@ class AppMetaApi(Resource): @validate_app_token def get(self, app_model: App): """Get app meta""" - app_model_config: AppModelConfig = app_model.app_model_config + return AppService().get_app_meta(app_model) - if not app_model_config: - return { - 'tool_icons': {} - } - - agent_config = app_model_config.agent_mode_dict or {} - meta = { - 'tool_icons': {} - } - - # get all tools - tools = agent_config.get('tools', []) - url_prefix = (current_app.config.get("CONSOLE_API_URL") - + "/console/api/workspaces/current/tool-provider/builtin/") - for tool in tools: - keys = list(tool.keys()) - if len(keys) >= 4: - # current tool standard - provider_type = tool.get('provider_type') - provider_id = tool.get('provider_id') - tool_name = tool.get('tool_name') - if provider_type == 'builtin': - meta['tool_icons'][tool_name] = url_prefix + provider_id + '/icon' - elif provider_type == 'api': - try: - provider: ApiToolProvider = db.session.query(ApiToolProvider).filter( - ApiToolProvider.id == provider_id - ) - meta['tool_icons'][tool_name] = json.loads(provider.icon) - except: - meta['tool_icons'][tool_name] = { - "background": "#252525", - "content": "\ud83d\ude01" - } - - return meta api.add_resource(AppParameterApi, '/parameters') api.add_resource(AppMetaApi, '/meta') diff --git a/api/controllers/web/app.py b/api/controllers/web/app.py index fb2a3676d8..dc173508e6 100644 --- a/api/controllers/web/app.py +++ b/api/controllers/web/app.py @@ -9,6 +9,7 @@ from controllers.web.wraps import WebApiResource from extensions.ext_database import db from models.model import App, AppModelConfig, AppMode from models.tools import ApiToolProvider +from services.app_service import AppService class AppParameterApi(WebApiResource): @@ -86,42 +87,8 @@ class AppParameterApi(WebApiResource): class AppMeta(WebApiResource): def get(self, app_model: App, end_user): """Get app meta""" - app_model_config: AppModelConfig = app_model.app_model_config + return AppService().get_app_meta(app_model) - if not app_model_config: - raise AppUnavailableError() - - agent_config = app_model_config.agent_mode_dict or {} - meta = { - 'tool_icons': {} - } - - # get all tools - tools = agent_config.get('tools', []) - url_prefix = (current_app.config.get("CONSOLE_API_URL") - + "/console/api/workspaces/current/tool-provider/builtin/") - for tool in tools: - keys = list(tool.keys()) - if len(keys) >= 4: - # current tool standard - provider_type = tool.get('provider_type') - provider_id = tool.get('provider_id') - tool_name = tool.get('tool_name') - if provider_type == 'builtin': - meta['tool_icons'][tool_name] = url_prefix + provider_id + '/icon' - elif provider_type == 'api': - try: - provider: ApiToolProvider = db.session.query(ApiToolProvider).filter( - ApiToolProvider.id == provider_id - ) - meta['tool_icons'][tool_name] = json.loads(provider.icon) - except: - meta['tool_icons'][tool_name] = { - "background": "#252525", - "content": "\ud83d\ude01" - } - - return meta api.add_resource(AppParameterApi, '/parameters') api.add_resource(AppMeta, '/meta') \ No newline at end of file diff --git a/api/services/app_service.py b/api/services/app_service.py index 940d4eac6c..4d93a010f9 100644 --- a/api/services/app_service.py +++ b/api/services/app_service.py @@ -4,6 +4,7 @@ from datetime import datetime from typing import cast import yaml +from flask import current_app from flask_sqlalchemy.pagination import Pagination from constants.model_template import default_app_templates @@ -15,6 +16,7 @@ from events.app_event import app_model_config_was_updated, app_was_created, app_ from extensions.ext_database import db from models.account import Account from models.model import App, AppMode, AppModelConfig +from models.tools import ApiToolProvider from services.workflow_service import WorkflowService @@ -337,3 +339,69 @@ class AppService: # conversations, pinned_conversations, messages BY app # message_feedbacks, message_annotations, message_chains BY message # message_agent_thoughts, message_files, saved_messages BY message + + def get_app_meta(self, app_model: App) -> dict: + """ + Get app meta info + :param app_model: app model + :return: + """ + app_mode = AppMode.value_of(app_model.mode) + + meta = { + 'tool_icons': {} + } + + if app_mode in [AppMode.ADVANCED_CHAT, AppMode.WORKFLOW]: + workflow = app_model.workflow + if workflow is None: + return meta + + graph = workflow.graph_dict + nodes = graph.get('nodes', []) + tools = [] + for node in nodes: + if node.get('data', {}).get('type') == 'tool': + node_data = node.get('data', {}) + tools.append({ + 'provider_type': node_data.get('provider_type'), + 'provider_id': node_data.get('provider_id'), + 'tool_name': node_data.get('tool_name'), + 'tool_parameters': {} + }) + else: + app_model_config: AppModelConfig = app_model.app_model_config + + if not app_model_config: + return meta + + agent_config = app_model_config.agent_mode_dict or {} + + # get all tools + tools = agent_config.get('tools', []) + + url_prefix = (current_app.config.get("CONSOLE_API_URL") + + "/console/api/workspaces/current/tool-provider/builtin/") + + for tool in tools: + keys = list(tool.keys()) + if len(keys) >= 4: + # current tool standard + provider_type = tool.get('provider_type') + provider_id = tool.get('provider_id') + tool_name = tool.get('tool_name') + if provider_type == 'builtin': + meta['tool_icons'][tool_name] = url_prefix + provider_id + '/icon' + elif provider_type == 'api': + try: + provider: ApiToolProvider = db.session.query(ApiToolProvider).filter( + ApiToolProvider.id == provider_id + ) + meta['tool_icons'][tool_name] = json.loads(provider.icon) + except: + meta['tool_icons'][tool_name] = { + "background": "#252525", + "content": "\ud83d\ude01" + } + + return meta