""" 节点参数默认配置工具 """ from typing import Dict, List from th_agenter.schemas.workflow import NodeInputOutput, NodeParameter, ParameterType, NodeType def get_default_node_parameters(node_type: NodeType) -> NodeInputOutput: """获取节点类型的默认输入输出参数""" if node_type == NodeType.START: return NodeInputOutput( inputs=[ NodeParameter( name="workflow_input", type=ParameterType.OBJECT, description="工作流初始输入数据", required=False, source="input" ) ], outputs=[ NodeParameter( name="data", type=ParameterType.OBJECT, description="开始节点输出数据" ) ] ) elif node_type == NodeType.END: return NodeInputOutput( inputs=[ NodeParameter( name="final_result", type=ParameterType.OBJECT, description="最终结果数据", required=False, source="node" ) ], outputs=[ NodeParameter( name="workflow_result", type=ParameterType.OBJECT, description="工作流最终输出" ) ] ) elif node_type == NodeType.LLM: return NodeInputOutput( inputs=[ NodeParameter( name="prompt_variables", type=ParameterType.OBJECT, description="Prompt中使用的变量", required=False, source="node" ), NodeParameter( name="user_input", type=ParameterType.STRING, description="用户输入文本", required=False, source="input" ) ], outputs=[ NodeParameter( name="response", type=ParameterType.STRING, description="LLM生成的回复" ), NodeParameter( name="tokens_used", type=ParameterType.NUMBER, description="使用的token数量" ) ] ) elif node_type == NodeType.CODE: return NodeInputOutput( inputs=[ NodeParameter( name="input_data", type=ParameterType.OBJECT, description="代码执行的输入数据", required=False, source="node" ) ], outputs=[ NodeParameter( name="result", type=ParameterType.OBJECT, description="代码执行结果" ), NodeParameter( name="output", type=ParameterType.STRING, description="代码输出内容" ) ] ) elif node_type == NodeType.HTTP: return NodeInputOutput( inputs=[ NodeParameter( name="url_params", type=ParameterType.OBJECT, description="URL参数", required=False, source="node" ), NodeParameter( name="request_body", type=ParameterType.OBJECT, description="请求体数据", required=False, source="node" ) ], outputs=[ NodeParameter( name="response_data", type=ParameterType.OBJECT, description="HTTP响应数据" ), NodeParameter( name="status_code", type=ParameterType.NUMBER, description="HTTP状态码" ) ] ) elif node_type == NodeType.CONDITION: return NodeInputOutput( inputs=[ NodeParameter( name="condition_data", type=ParameterType.OBJECT, description="条件判断的输入数据", required=True, source="node" ) ], outputs=[ NodeParameter( name="result", type=ParameterType.BOOLEAN, description="条件判断结果" ), NodeParameter( name="branch", type=ParameterType.STRING, description="执行分支(true/false)" ) ] ) else: # 默认参数 return NodeInputOutput( inputs=[ NodeParameter( name="input", type=ParameterType.OBJECT, description="节点输入数据", required=False, source="node" ) ], outputs=[ NodeParameter( name="output", type=ParameterType.OBJECT, description="节点输出数据" ) ] ) def validate_parameter_connections(nodes: List[Dict], connections: List[Dict]) -> List[str]: """验证节点参数连接的有效性""" errors = [] node_dict = {node['id']: node for node in nodes} for node in nodes: if 'parameters' not in node or not node['parameters']: continue for input_param in node['parameters'].get('inputs', []): if input_param.get('source') == 'node': source_node_id = input_param.get('source_node_id') source_field = input_param.get('source_field') if not source_node_id: errors.append(f"节点 {node['name']} 的输入参数 {input_param['name']} 缺少来源节点ID") continue if source_node_id not in node_dict: errors.append(f"节点 {node['name']} 的输入参数 {input_param['name']} 引用了不存在的节点 {source_node_id}") continue source_node = node_dict[source_node_id] if 'parameters' in source_node and source_node['parameters']: source_outputs = source_node['parameters'].get('outputs', []) output_fields = [output['name'] for output in source_outputs] if source_field and source_field not in output_fields: errors.append(f"节点 {node['name']} 的输入参数 {input_param['name']} 引用了节点 {source_node['name']} 不存在的输出字段 {source_field}") return errors