#!/usr/bin/env python3 """ 生成包含多个节点模板的复杂Agent """ import sys import os sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from sqlalchemy.orm import Session from app.core.database import SessionLocal from app.models.agent import Agent from app.models.user import User from app.models.node_template import NodeTemplate from datetime import datetime import uuid def generate_complex_agent_with_templates(db: Session, username: str = "admin"): """生成包含多个节点模板的复杂Agent""" print("=" * 60) print("生成复杂Agent(包含多个节点模板)") print("=" * 60) print() # 查找用户 user = db.query(User).filter(User.username == username).first() if not user: print(f"❌ 未找到用户 '{username}',请先创建该用户") return print(f"✅ 找到用户: {user.username} (ID: {user.id})") print() # 查找可用的节点模板(公开的或用户自己的) templates = db.query(NodeTemplate).filter( (NodeTemplate.is_public == True) | (NodeTemplate.user_id == user.id) ).limit(10).all() if len(templates) < 3: print(f"⚠️ 警告: 只找到 {len(templates)} 个节点模板,建议至少3个") if len(templates) == 0: print("❌ 没有可用的节点模板,请先创建节点模板") return print(f"📋 找到 {len(templates)} 个可用节点模板:") for i, template in enumerate(templates[:5], 1): print(f" {i}. {template.name} (ID: {template.id})") print() # 选择3-5个模板用于创建复杂Agent selected_templates = templates[:min(5, len(templates))] template_ids = [t.id for t in selected_templates] # 生成复杂的工作流配置 # 工作流结构:开始 -> 模板1 -> 条件判断 -> 模板2/模板3 -> 转换 -> 模板4 -> 结束 nodes = [] edges = [] # 开始节点 start_node = { "id": "start-1", "type": "start", "position": {"x": 100, "y": 200}, "data": {"label": "开始"} } nodes.append(start_node) # 第一个模板节点 if len(template_ids) > 0: template1_node = { "id": "template-1", "type": "template", "position": {"x": 300, "y": 200}, "data": { "label": selected_templates[0].name, "template_id": template_ids[0], "provider": selected_templates[0].provider, "model": selected_templates[0].model, "temperature": selected_templates[0].temperature, "max_tokens": selected_templates[0].max_tokens, "prompt": selected_templates[0].prompt } } nodes.append(template1_node) edges.append({ "id": "e1", "source": "start-1", "target": "template-1" }) # 条件判断节点 condition_node = { "id": "condition-1", "type": "condition", "position": {"x": 500, "y": 200}, "data": { "label": "判断处理结果", "condition": "{{result}} contains '需要' or {{result}} contains '重要'" } } nodes.append(condition_node) if len(template_ids) > 0: edges.append({ "id": "e2", "source": "template-1", "target": "condition-1" }) # 条件分支:如果满足条件,使用模板2;否则使用模板3 if len(template_ids) > 1: template2_node = { "id": "template-2", "type": "template", "position": {"x": 700, "y": 100}, "data": { "label": selected_templates[1].name, "template_id": template_ids[1], "provider": selected_templates[1].provider, "model": selected_templates[1].model, "temperature": selected_templates[1].temperature, "max_tokens": selected_templates[1].max_tokens, "prompt": selected_templates[1].prompt } } nodes.append(template2_node) edges.append({ "id": "e3", "source": "condition-1", "target": "template-2", "sourceHandle": "true" }) if len(template_ids) > 2: template3_node = { "id": "template-3", "type": "template", "position": {"x": 700, "y": 300}, "data": { "label": selected_templates[2].name, "template_id": template_ids[2], "provider": selected_templates[2].provider, "model": selected_templates[2].model, "temperature": selected_templates[2].temperature, "max_tokens": selected_templates[2].max_tokens, "prompt": selected_templates[2].prompt } } nodes.append(template3_node) edges.append({ "id": "e4", "source": "condition-1", "target": "template-3", "sourceHandle": "false" }) # 数据转换节点 transform_node = { "id": "transform-1", "type": "transform", "position": {"x": 900, "y": 200}, "data": { "label": "数据转换", "mode": "mapping", "mapping": { "final_result": "{{result}}", "processed": "true" } } } nodes.append(transform_node) # 连接条件分支到转换节点 if len(template_ids) > 1: edges.append({ "id": "e5", "source": "template-2", "target": "transform-1" }) if len(template_ids) > 2: edges.append({ "id": "e6", "source": "template-3", "target": "transform-1" }) # 最后一个模板节点(如果还有模板) if len(template_ids) > 3: template4_node = { "id": "template-4", "type": "template", "position": {"x": 1100, "y": 200}, "data": { "label": selected_templates[3].name, "template_id": template_ids[3], "provider": selected_templates[3].provider, "model": selected_templates[3].model, "temperature": selected_templates[3].temperature, "max_tokens": selected_templates[3].max_tokens, "prompt": selected_templates[3].prompt } } nodes.append(template4_node) edges.append({ "id": "e7", "source": "transform-1", "target": "template-4" }) # 结束节点连接到最后一个模板 end_node = { "id": "end-1", "type": "end", "position": {"x": 1300, "y": 200}, "data": {"label": "结束"} } nodes.append(end_node) edges.append({ "id": "e8", "source": "template-4", "target": "end-1" }) else: # 如果没有更多模板,转换节点直接连接到结束节点 end_node = { "id": "end-1", "type": "end", "position": {"x": 1100, "y": 200}, "data": {"label": "结束"} } nodes.append(end_node) edges.append({ "id": "e7", "source": "transform-1", "target": "end-1" }) # 检查是否已存在同名Agent agent_name = "复杂模板Agent(多节点)" existing = db.query(Agent).filter( Agent.name == agent_name, Agent.user_id == user.id ).first() if existing: print(f"⚠️ Agent '{agent_name}' 已存在,将更新它...") existing.workflow_config = {"nodes": nodes, "edges": edges} existing.description = f"包含 {len(selected_templates)} 个节点模板的复杂Agent,支持条件分支和数据转换" existing.updated_at = datetime.now() agent = existing else: # 创建Agent agent = Agent( name=agent_name, description=f"包含 {len(selected_templates)} 个节点模板的复杂Agent,支持条件分支和数据转换", workflow_config={"nodes": nodes, "edges": edges}, status="published", user_id=user.id, version=1 ) db.add(agent) try: db.commit() db.refresh(agent) print() print("=" * 60) print(f"✅ 成功创建/更新复杂Agent: {agent.name}") print(f" ID: {agent.id}") print(f" 状态: {agent.status}") print(f" 节点数量: {len(nodes)}") print(f" 连接数量: {len(edges)}") print(f" 使用的模板节点: {len(selected_templates)}") print("=" * 60) print() print("工作流结构:") print(" 开始 -> 模板1 -> 条件判断 -> 模板2/模板3 -> 数据转换 -> 模板4 -> 结束") print() return agent except Exception as e: db.rollback() print() print("=" * 60) print(f"❌ 创建失败: {e}") print("=" * 60) import traceback traceback.print_exc() raise if __name__ == "__main__": import argparse parser = argparse.ArgumentParser(description="生成包含多个节点模板的复杂Agent") parser.add_argument( "--username", type=str, default="admin", help="创建Agent的用户名(默认: admin)" ) args = parser.parse_args() db = SessionLocal() try: generate_complex_agent_with_templates(db, username=args.username) except Exception as e: print(f"❌ 发生错误: {e}") import traceback traceback.print_exc() finally: db.close()