""" 合并节点 """ import logging from typing import Any, Dict, List from ..base import BaseNode, NodeContext, NodeResult from ..registry import NodeRegistry logger = logging.getLogger(__name__) @NodeRegistry.register class MergeNode(BaseNode): """ 合并节点 等待所有并行分支执行完成后,合并结果继续执行 """ node_type = 'merge' node_name = '合并' node_category = 'logic' node_icon = 'git-merge' node_description = '等待所有并行分支完成后合并结果' inputs = [ { 'name': 'branch_results', 'type': 'array', 'description': '各分支的执行结果', }, ] outputs = [ { 'name': 'merged_result', 'type': 'object', 'description': '合并后的结果', }, ] def execute(self, context: NodeContext) -> NodeResult: """ 执行合并节点 从上下文中获取所有并行分支的结果并合并 """ try: # 获取合并模式 merge_mode = self.config.get('merge_mode', 'object') output_variable = self.config.get('output_variable', 'merged_result') # 从上下文获取并行分支结果 # 并行执行时,每个分支的结果会存储在 _parallel_results 中 parallel_results = context.get_variable('_parallel_results', {}) if merge_mode == 'object': # 对象模式:将各分支结果合并为一个对象 merged = {} for branch_id, result in parallel_results.items(): merged[branch_id] = result elif merge_mode == 'array': # 数组模式:将各分支结果合并为数组 merged = list(parallel_results.values()) elif merge_mode == 'first': # 取第一个完成的结果 merged = list(parallel_results.values())[0] if parallel_results else None elif merge_mode == 'concat': # 字符串拼接模式 separator = self.config.get('separator', '\n') merged = separator.join(str(v) for v in parallel_results.values()) else: merged = parallel_results return NodeResult( success=True, output=merged, output_variables={ output_variable: merged, 'branch_count': len(parallel_results), }, metadata={ 'merge_mode': merge_mode, 'branch_ids': list(parallel_results.keys()), }, ) except Exception as e: logger.exception(f'合并节点执行失败: {e}') return NodeResult( success=False, error=str(e), ) @classmethod def get_config_schema(cls) -> Dict[str, Any]: """获取配置 Schema""" return { 'type': 'object', 'properties': { 'merge_mode': { 'type': 'string', 'title': '合并模式', 'description': '如何合并各分支的结果', 'enum': ['object', 'array', 'first', 'concat'], 'enumNames': ['对象(按分支ID)', '数组', '取第一个', '字符串拼接'], 'default': 'object', }, 'separator': { 'type': 'string', 'title': '分隔符', 'description': '字符串拼接模式的分隔符', 'default': '\n', }, 'output_variable': { 'type': 'string', 'title': '输出变量名', 'default': 'merged_result', }, }, }