自动布局
This commit is contained in:
233
backend/scripts/generate_test_agent.py
Executable file
233
backend/scripts/generate_test_agent.py
Executable file
@@ -0,0 +1,233 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
生成测试Agent - 演示左右连接
|
||||
这是一个测试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 datetime import datetime
|
||||
import uuid
|
||||
|
||||
|
||||
def generate_test_agent(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()
|
||||
|
||||
# 生成测试工作流配置
|
||||
# 工作流结构(横向排列,使用左右连接):
|
||||
# 开始 → 处理1 → 处理2 → 处理3 → 结束
|
||||
|
||||
nodes = []
|
||||
edges = []
|
||||
|
||||
# 节点横向排列,Y坐标相同,X坐标递增
|
||||
base_y = 300
|
||||
x_spacing = 250
|
||||
|
||||
# 1. 开始节点
|
||||
start_node = {
|
||||
"id": "start-1",
|
||||
"type": "start",
|
||||
"position": {"x": 50, "y": base_y},
|
||||
"data": {
|
||||
"label": "开始",
|
||||
"output_format": "json"
|
||||
}
|
||||
}
|
||||
nodes.append(start_node)
|
||||
|
||||
# 2. 处理节点1(LLM)
|
||||
process1_node = {
|
||||
"id": "llm-process1",
|
||||
"type": "llm",
|
||||
"position": {"x": 50 + x_spacing, "y": base_y},
|
||||
"data": {
|
||||
"label": "处理1",
|
||||
"provider": "deepseek",
|
||||
"model": "deepseek-chat",
|
||||
"temperature": "0.3",
|
||||
"max_tokens": "1000",
|
||||
"prompt": """你是一个测试助手。请简单处理用户输入。
|
||||
|
||||
用户输入:{{query}}
|
||||
|
||||
请输出:已处理用户输入:"{{query}}"
|
||||
"""
|
||||
}
|
||||
}
|
||||
nodes.append(process1_node)
|
||||
|
||||
# 3. 处理节点2(Transform)
|
||||
process2_node = {
|
||||
"id": "transform-process2",
|
||||
"type": "transform",
|
||||
"position": {"x": 50 + x_spacing * 2, "y": base_y},
|
||||
"data": {
|
||||
"label": "处理2",
|
||||
"mode": "merge",
|
||||
"mapping": {
|
||||
"original_input": "{{query}}",
|
||||
"processed_result": "{{output}}"
|
||||
}
|
||||
}
|
||||
}
|
||||
nodes.append(process2_node)
|
||||
|
||||
# 4. 处理节点3(LLM)
|
||||
process3_node = {
|
||||
"id": "llm-process3",
|
||||
"type": "llm",
|
||||
"position": {"x": 50 + x_spacing * 3, "y": base_y},
|
||||
"data": {
|
||||
"label": "处理3",
|
||||
"provider": "deepseek",
|
||||
"model": "deepseek-chat",
|
||||
"temperature": "0.3",
|
||||
"max_tokens": "1000",
|
||||
"prompt": """请对处理结果进行总结。
|
||||
|
||||
原始输入:{{original_input}}
|
||||
处理结果:{{processed_result}}
|
||||
|
||||
请输出一个简洁的总结。"""
|
||||
}
|
||||
}
|
||||
nodes.append(process3_node)
|
||||
|
||||
# 5. 结束节点
|
||||
end_node = {
|
||||
"id": "end-1",
|
||||
"type": "end",
|
||||
"position": {"x": 50 + x_spacing * 4, "y": base_y},
|
||||
"data": {
|
||||
"label": "结束",
|
||||
"description": "返回最终结果"
|
||||
}
|
||||
}
|
||||
nodes.append(end_node)
|
||||
|
||||
# 创建连接(使用左右连接)
|
||||
# 注意:使用 sourceHandle='right' 和 targetHandle='left' 来指定左右连接
|
||||
edges.append({
|
||||
"id": "e1",
|
||||
"source": "start-1",
|
||||
"target": "llm-process1",
|
||||
"sourceHandle": "right", # 从开始节点的右侧连接
|
||||
"targetHandle": "left" # 连接到处理1节点的左侧
|
||||
})
|
||||
|
||||
edges.append({
|
||||
"id": "e2",
|
||||
"source": "llm-process1",
|
||||
"target": "transform-process2",
|
||||
"sourceHandle": "right", # 从处理1节点的右侧连接
|
||||
"targetHandle": "left" # 连接到处理2节点的左侧
|
||||
})
|
||||
|
||||
edges.append({
|
||||
"id": "e3",
|
||||
"source": "transform-process2",
|
||||
"target": "llm-process3",
|
||||
"sourceHandle": "right", # 从处理2节点的右侧连接
|
||||
"targetHandle": "left" # 连接到处理3节点的左侧
|
||||
})
|
||||
|
||||
edges.append({
|
||||
"id": "e4",
|
||||
"source": "llm-process3",
|
||||
"target": "end-1",
|
||||
"sourceHandle": "right", # 从处理3节点的右侧连接
|
||||
"targetHandle": "left" # 连接到结束节点的左侧
|
||||
})
|
||||
|
||||
# 创建或更新Agent
|
||||
workflow_config = {
|
||||
"nodes": nodes,
|
||||
"edges": edges
|
||||
}
|
||||
|
||||
agent = db.query(Agent).filter(
|
||||
Agent.name == "测试Agent(左右连接)",
|
||||
Agent.user_id == user.id
|
||||
).first()
|
||||
|
||||
if agent:
|
||||
agent.workflow_config = workflow_config
|
||||
agent.description = "测试Agent,演示节点左右连接功能。工作流横向排列,使用左右连接点。"
|
||||
agent.updated_at = datetime.now()
|
||||
agent.status = "published"
|
||||
print("⚠️ Agent '测试Agent(左右连接)' 已存在,将更新它...")
|
||||
else:
|
||||
agent = Agent(
|
||||
id=str(uuid.uuid4()),
|
||||
name="测试Agent(左右连接)",
|
||||
description="测试Agent,演示节点左右连接功能。工作流横向排列,使用左右连接点。",
|
||||
workflow_config=workflow_config,
|
||||
status="published",
|
||||
user_id=user.id,
|
||||
version=1
|
||||
)
|
||||
db.add(agent)
|
||||
|
||||
try:
|
||||
db.commit()
|
||||
db.refresh(agent)
|
||||
print()
|
||||
print("✅ Agent创建/更新成功!")
|
||||
print()
|
||||
print(f"📋 Agent信息:")
|
||||
print(f" - ID: {agent.id}")
|
||||
print(f" - 名称: {agent.name}")
|
||||
print(f" - 状态: {agent.status} (已发布,可直接使用)")
|
||||
print(f" - 版本: {agent.version}")
|
||||
print(f" - 节点数: {len(nodes)}")
|
||||
print(f" - 连接数: {len(edges)}")
|
||||
print()
|
||||
print("🎯 工作流特点:")
|
||||
print(" ✅ 节点横向排列")
|
||||
print(" ✅ 使用左右连接点(sourceHandle='right', targetHandle='left')")
|
||||
print(" ✅ 工作流:开始 → 处理1 → 处理2 → 处理3 → 结束")
|
||||
print()
|
||||
print("💡 使用提示:")
|
||||
print(" 1. 在Agent管理页面找到 '测试Agent(左右连接)'")
|
||||
print(" 2. 点击 '使用' 按钮开始使用")
|
||||
print(" 3. 输入任意文本进行测试")
|
||||
print(" 4. 在工作流设计器中查看左右连接的视觉效果")
|
||||
print()
|
||||
return agent
|
||||
except Exception as e:
|
||||
db.rollback()
|
||||
print(f"❌ 创建Agent失败: {str(e)}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
return None
|
||||
|
||||
|
||||
def main():
|
||||
"""主函数"""
|
||||
db = SessionLocal()
|
||||
try:
|
||||
generate_test_agent(db, username="admin")
|
||||
finally:
|
||||
db.close()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user