From c0eb0db78e15690e9153cdd0a9c31e4d12cdc446 Mon Sep 17 00:00:00 2001 From: shaohuzhang1 <80892890+shaohuzhang1@users.noreply.github.com> Date: Mon, 29 Dec 2025 14:06:51 +0800 Subject: [PATCH] fix: The import method was used to create the intelligent agent, but the MCP and tool referenced by the AI dialogue node were not successfully created (#4574) --- apps/application/flow/tools.py | 20 +++++++++++++++++++ apps/application/serializers/application.py | 19 ++++++++++-------- .../serializers/knowledge_workflow.py | 19 +++++++++--------- 3 files changed, 41 insertions(+), 17 deletions(-) diff --git a/apps/application/flow/tools.py b/apps/application/flow/tools.py index 9762c75a4..889dc1fed 100644 --- a/apps/application/flow/tools.py +++ b/apps/application/flow/tools.py @@ -506,3 +506,23 @@ def save_workflow_mapping(workflow, source_type, source_id, other_resource_mappi resource_mapping_list += other_resource_mapping QuerySet(ResourceMapping).bulk_create( {(str(item.target_type) + str(item.target_id)): item for item in resource_mapping_list}.values()) + + +def get_tool_id_list(workflow): + _result = [] + for node in workflow.get('nodes', []): + if node.get('type') == 'tool-lib-node': + tool_id = node.get('properties', {}).get('node_data', {}).get('tool_lib_id') + if tool_id: + _result.append(tool_id) + elif node.get('type') == 'loop-node': + r = get_tool_id_list(node.get('properties', {}).get('node_data', {}).get('loop_body', {})) + for item in r: + _result.append(item) + elif node.get('type') == 'ai-chat-node': + node_data = node.get('properties', {}).get('node_data', {}) + mcp_tool_ids = node_data.get('mcp_tool_ids') or [] + tool_ids = node_data.get('tool_ids') or [] + for _id in mcp_tool_ids + tool_ids: + _result.append(_id) + return _result diff --git a/apps/application/serializers/application.py b/apps/application/serializers/application.py index a48c3f95a..137169384 100644 --- a/apps/application/serializers/application.py +++ b/apps/application/serializers/application.py @@ -71,6 +71,14 @@ def hand_node(node, update_tool_map): tool_lib_id) if node.get('type') == 'search-knowledge-node': node.get('properties', {}).get('node_data', {})['knowledge_id_list'] = [] + if node.get('type') == 'ai-chat-node': + node_data = node.get('properties', {}).get('node_data', {}) + mcp_tool_ids = node_data.get('mcp_tool_ids') or [] + node_data['mcp_tool_ids'] = [update_tool_map.get(tool_id, + tool_id) for tool_id in mcp_tool_ids] + tool_ids = node_data.get('tool_ids') or [] + node_data['tool_ids'] = [update_tool_map.get(tool_id, + tool_id) for tool_id in tool_ids] class MKInstance: @@ -781,13 +789,8 @@ class ApplicationOperateSerializer(serializers.Serializer): self.is_valid() application_id = self.data.get('application_id') application = QuerySet(Application).filter(id=application_id).first() - tool_id_list = [node.get('properties', {}).get('node_data', {}).get('tool_lib_id') for node - in - application.work_flow.get('nodes', []) + reduce(lambda x, y: [*x, *y], [ - n.get('properties', {}).get('node_data', {}).get('loop_body', {}).get('nodes', []) for n - in - application.work_flow.get('nodes', []) if n.get('type') == 'loop-node'], []) if - node.get('type') == 'tool-lib-node'] + from application.flow.tools import get_tool_id_list + tool_id_list = get_tool_id_list(application.work_flow) tool_list = [] if len(tool_id_list) > 0: tool_list = QuerySet(Tool).filter(id__in=tool_id_list).exclude(scope=ToolScope.SHARED) @@ -863,7 +866,7 @@ class ApplicationOperateSerializer(serializers.Serializer): work_flow_version.save() access_token = hashlib.md5( str(uuid.uuid7()).encode()).hexdigest()[ - 8:24] + 8:24] application_access_token = QuerySet(ApplicationAccessToken).filter( application_id=application.id).first() if application_access_token is None: diff --git a/apps/knowledge/serializers/knowledge_workflow.py b/apps/knowledge/serializers/knowledge_workflow.py index 8c1803f5e..9af67b445 100644 --- a/apps/knowledge/serializers/knowledge_workflow.py +++ b/apps/knowledge/serializers/knowledge_workflow.py @@ -52,6 +52,14 @@ def hand_node(node, update_tool_map): if node.get('type') == 'search-knowledge-node': node.get('properties', {}).get('node_data', {})['knowledge_id_list'] = [] + if node.get('type') == 'ai-chat-node': + node_data = node.get('properties', {}).get('node_data', {}) + mcp_tool_ids = node_data.get('mcp_tool_ids') or [] + node_data['mcp_tool_ids'] = [update_tool_map.get(tool_id, + tool_id) for tool_id in mcp_tool_ids] + tool_ids = node_data.get('tool_ids') or [] + node_data['tool_ids'] = [update_tool_map.get(tool_id, + tool_id) for tool_id in tool_ids] class KnowledgeWorkflowModelSerializer(serializers.ModelSerializer): @@ -372,15 +380,8 @@ class KnowledgeWorkflowSerializer(serializers.Serializer): knowledge_id = self.data.get('knowledge_id') knowledge_workflow = QuerySet(KnowledgeWorkflow).filter(knowledge_id=knowledge_id).first() knowledge = QuerySet(Knowledge).filter(id=knowledge_id).first() - tool_id_list = [node.get('properties', {}).get('node_data', {}).get('tool_lib_id') for node - in - knowledge_workflow.work_flow.get('nodes', []) + reduce(lambda x, y: [*x, *y], [ - n.get('properties', {}).get('node_data', {}).get('loop_body', {}).get('nodes', []) - for n - in - knowledge_workflow.work_flow.get('nodes', []) if n.get('type') == 'loop-node'], []) - if - node.get('type') == 'tool-lib-node'] + from application.flow.tools import get_tool_id_list + tool_id_list = get_tool_id_list(knowledge_workflow.work_flow) tool_list = [] if len(tool_id_list) > 0: tool_list = QuerySet(Tool).filter(id__in=tool_id_list).exclude(scope=ToolScope.SHARED)