第一次提交
This commit is contained in:
359
backend/scripts/generate_test_workflow.py
Normal file
359
backend/scripts/generate_test_workflow.py
Normal file
@@ -0,0 +1,359 @@
|
||||
"""
|
||||
生成测试工作流 - 包含多个节点的完整工作流
|
||||
用于验证工作流功能
|
||||
"""
|
||||
import sys
|
||||
import os
|
||||
from pathlib import Path
|
||||
import json
|
||||
from datetime import datetime
|
||||
|
||||
# 添加项目根目录到路径
|
||||
sys.path.insert(0, str(Path(__file__).parent.parent))
|
||||
|
||||
from sqlalchemy import create_engine
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
from app.core.config import settings
|
||||
from app.models.workflow import Workflow
|
||||
from app.models.user import User
|
||||
|
||||
def generate_test_workflow():
|
||||
"""生成测试工作流"""
|
||||
# 创建数据库连接
|
||||
engine = create_engine(settings.DATABASE_URL)
|
||||
Session = sessionmaker(bind=engine)
|
||||
session = Session()
|
||||
|
||||
try:
|
||||
# 获取第一个用户
|
||||
user = session.query(User).first()
|
||||
if not user:
|
||||
print("❌ 错误:数据库中没有用户,请先创建用户")
|
||||
return
|
||||
|
||||
print(f"✅ 使用用户: {user.username} (ID: {user.id})")
|
||||
|
||||
# 定义测试工作流的节点
|
||||
nodes = [
|
||||
{
|
||||
"id": "start-1",
|
||||
"type": "start",
|
||||
"position": {"x": 100, "y": 100},
|
||||
"data": {
|
||||
"label": "开始",
|
||||
"description": "工作流开始节点"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "llm-1",
|
||||
"type": "llm",
|
||||
"position": {"x": 300, "y": 100},
|
||||
"data": {
|
||||
"label": "LLM处理",
|
||||
"provider": "deepseek",
|
||||
"model": "deepseek-chat",
|
||||
"prompt": "请分析用户输入的内容:{input}\n\n要求:\n1. 提取关键信息\n2. 判断内容类型\n3. 返回JSON格式:{\"type\": \"类型\", \"keywords\": [\"关键词1\", \"关键词2\"], \"sentiment\": \"情感\"}",
|
||||
"temperature": 0.7,
|
||||
"max_tokens": 1500
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "condition-1",
|
||||
"type": "condition",
|
||||
"position": {"x": 500, "y": 100},
|
||||
"data": {
|
||||
"label": "判断类型",
|
||||
"condition": "JSON.parse(input).type === 'question'"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "llm-2",
|
||||
"type": "llm",
|
||||
"position": {"x": 700, "y": 50},
|
||||
"data": {
|
||||
"label": "回答问题",
|
||||
"provider": "deepseek",
|
||||
"model": "deepseek-chat",
|
||||
"prompt": "用户提出了一个问题,请提供详细、准确的回答。\n\n问题:{input}\n\n要求:\n1. 回答要准确、专业\n2. 如果涉及技术问题,提供代码示例\n3. 回答要友好、易懂",
|
||||
"temperature": 0.7,
|
||||
"max_tokens": 2000
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "llm-3",
|
||||
"type": "llm",
|
||||
"position": {"x": 700, "y": 150},
|
||||
"data": {
|
||||
"label": "处理其他",
|
||||
"provider": "deepseek",
|
||||
"model": "deepseek-chat",
|
||||
"prompt": "用户输入了其他类型的内容,请进行适当的处理。\n\n内容:{input}\n\n要求:\n1. 理解用户意图\n2. 提供合适的响应\n3. 保持友好和专业",
|
||||
"temperature": 0.7,
|
||||
"max_tokens": 1500
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "transform-1",
|
||||
"type": "transform",
|
||||
"position": {"x": 900, "y": 100},
|
||||
"data": {
|
||||
"label": "格式化输出",
|
||||
"transform": "const data = typeof input === 'string' ? JSON.parse(input) : input;\nreturn JSON.stringify({\n success: true,\n result: data,\n timestamp: new Date().toISOString()\n}, null, 2);"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "end-1",
|
||||
"type": "end",
|
||||
"position": {"x": 1100, "y": 100},
|
||||
"data": {
|
||||
"label": "结束",
|
||||
"description": "工作流结束节点"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
# 定义边(连接)
|
||||
edges = [
|
||||
{
|
||||
"id": "edge-start-llm1",
|
||||
"source": "start-1",
|
||||
"target": "llm-1",
|
||||
"sourceHandle": "bottom",
|
||||
"targetHandle": "top",
|
||||
"type": "smoothstep"
|
||||
},
|
||||
{
|
||||
"id": "edge-llm1-condition",
|
||||
"source": "llm-1",
|
||||
"target": "condition-1",
|
||||
"sourceHandle": "bottom",
|
||||
"targetHandle": "top",
|
||||
"type": "smoothstep"
|
||||
},
|
||||
{
|
||||
"id": "edge-condition-llm2",
|
||||
"source": "condition-1",
|
||||
"target": "llm-2",
|
||||
"sourceHandle": "top",
|
||||
"targetHandle": "left",
|
||||
"type": "smoothstep",
|
||||
"label": "是问题"
|
||||
},
|
||||
{
|
||||
"id": "edge-condition-llm3",
|
||||
"source": "condition-1",
|
||||
"target": "llm-3",
|
||||
"sourceHandle": "bottom",
|
||||
"targetHandle": "left",
|
||||
"type": "smoothstep",
|
||||
"label": "其他"
|
||||
},
|
||||
{
|
||||
"id": "edge-llm2-transform",
|
||||
"source": "llm-2",
|
||||
"target": "transform-1",
|
||||
"sourceHandle": "right",
|
||||
"targetHandle": "left",
|
||||
"type": "smoothstep"
|
||||
},
|
||||
{
|
||||
"id": "edge-llm3-transform",
|
||||
"source": "llm-3",
|
||||
"target": "transform-1",
|
||||
"sourceHandle": "right",
|
||||
"targetHandle": "left",
|
||||
"type": "smoothstep"
|
||||
},
|
||||
{
|
||||
"id": "edge-transform-end",
|
||||
"source": "transform-1",
|
||||
"target": "end-1",
|
||||
"sourceHandle": "right",
|
||||
"targetHandle": "left",
|
||||
"type": "smoothstep"
|
||||
}
|
||||
]
|
||||
|
||||
# 检查是否已存在同名工作流
|
||||
existing = session.query(Workflow).filter(
|
||||
Workflow.name == "智能问答工作流(测试)",
|
||||
Workflow.user_id == user.id
|
||||
).first()
|
||||
|
||||
if existing:
|
||||
print(f"⏭️ 工作流已存在,更新现有工作流...")
|
||||
existing.nodes = nodes
|
||||
existing.edges = edges
|
||||
existing.description = "一个包含多个节点的测试工作流,用于验证工作流功能。包含:开始节点、LLM节点、条件判断、数据转换、结束节点"
|
||||
existing.status = "draft"
|
||||
existing.updated_at = datetime.now()
|
||||
workflow = existing
|
||||
else:
|
||||
# 创建新工作流
|
||||
workflow = Workflow(
|
||||
name="智能问答工作流(测试)",
|
||||
description="一个包含多个节点的测试工作流,用于验证工作流功能。包含:开始节点、LLM节点、条件判断、数据转换、结束节点",
|
||||
nodes=nodes,
|
||||
edges=edges,
|
||||
status="draft",
|
||||
user_id=user.id
|
||||
)
|
||||
session.add(workflow)
|
||||
|
||||
session.commit()
|
||||
session.refresh(workflow)
|
||||
|
||||
print(f"\n✅ 测试工作流创建成功!")
|
||||
print(f" - 工作流ID: {workflow.id}")
|
||||
print(f" - 工作流名称: {workflow.name}")
|
||||
print(f" - 节点数量: {len(nodes)} 个")
|
||||
print(f" - 连接数量: {len(edges)} 个")
|
||||
print(f"\n📋 节点列表:")
|
||||
for i, node in enumerate(nodes, 1):
|
||||
print(f" {i}. {node['data']['label']} ({node['type']})")
|
||||
print(f"\n🔗 连接关系:")
|
||||
for i, edge in enumerate(edges, 1):
|
||||
source_node = next(n for n in nodes if n['id'] == edge['source'])
|
||||
target_node = next(n for n in nodes if n['id'] == edge['target'])
|
||||
label = edge.get('label', '')
|
||||
print(f" {i}. {source_node['data']['label']} → {target_node['data']['label']} {label}")
|
||||
print(f"\n💡 使用说明:")
|
||||
print(f" 1. 在工作流列表中点击'编辑'按钮")
|
||||
print(f" 2. 可以查看和修改工作流配置")
|
||||
print(f" 3. 点击'运行'按钮测试工作流")
|
||||
print(f" 4. 输入测试数据,例如:'什么是Python?'")
|
||||
|
||||
except Exception as e:
|
||||
session.rollback()
|
||||
print(f"❌ 创建失败: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
finally:
|
||||
session.close()
|
||||
|
||||
|
||||
def generate_simple_test_workflow():
|
||||
"""生成简单的测试工作流(仅包含基本节点)"""
|
||||
# 创建数据库连接
|
||||
engine = create_engine(settings.DATABASE_URL)
|
||||
Session = sessionmaker(bind=engine)
|
||||
session = Session()
|
||||
|
||||
try:
|
||||
# 获取第一个用户
|
||||
user = session.query(User).first()
|
||||
if not user:
|
||||
print("❌ 错误:数据库中没有用户,请先创建用户")
|
||||
return
|
||||
|
||||
print(f"✅ 使用用户: {user.username} (ID: {user.id})")
|
||||
|
||||
# 定义简单工作流的节点
|
||||
nodes = [
|
||||
{
|
||||
"id": "start-1",
|
||||
"type": "start",
|
||||
"position": {"x": 100, "y": 100},
|
||||
"data": {
|
||||
"label": "开始",
|
||||
"description": "工作流开始"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "llm-1",
|
||||
"type": "llm",
|
||||
"position": {"x": 300, "y": 100},
|
||||
"data": {
|
||||
"label": "LLM处理",
|
||||
"provider": "deepseek",
|
||||
"model": "deepseek-chat",
|
||||
"prompt": "请回答用户的问题:{input}\n\n要求:\n1. 回答要准确、专业\n2. 语言要友好、易懂\n3. 如果问题不清楚,可以询问更多信息",
|
||||
"temperature": 0.7,
|
||||
"max_tokens": 1500
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "end-1",
|
||||
"type": "end",
|
||||
"position": {"x": 500, "y": 100},
|
||||
"data": {
|
||||
"label": "结束",
|
||||
"description": "工作流结束"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
# 定义边(连接)
|
||||
edges = [
|
||||
{
|
||||
"id": "edge-start-llm",
|
||||
"source": "start-1",
|
||||
"target": "llm-1",
|
||||
"sourceHandle": "bottom",
|
||||
"targetHandle": "top",
|
||||
"type": "smoothstep"
|
||||
},
|
||||
{
|
||||
"id": "edge-llm-end",
|
||||
"source": "llm-1",
|
||||
"target": "end-1",
|
||||
"sourceHandle": "right",
|
||||
"targetHandle": "left",
|
||||
"type": "smoothstep"
|
||||
}
|
||||
]
|
||||
|
||||
# 检查是否已存在同名工作流
|
||||
existing = session.query(Workflow).filter(
|
||||
Workflow.name == "简单问答工作流(测试)",
|
||||
Workflow.user_id == user.id
|
||||
).first()
|
||||
|
||||
if existing:
|
||||
print(f"⏭️ 工作流已存在,更新现有工作流...")
|
||||
existing.nodes = nodes
|
||||
existing.edges = edges
|
||||
existing.description = "一个简单的测试工作流,包含开始、LLM处理、结束三个节点"
|
||||
existing.status = "draft"
|
||||
existing.updated_at = datetime.now()
|
||||
workflow = existing
|
||||
else:
|
||||
# 创建新工作流
|
||||
workflow = Workflow(
|
||||
name="简单问答工作流(测试)",
|
||||
description="一个简单的测试工作流,包含开始、LLM处理、结束三个节点",
|
||||
nodes=nodes,
|
||||
edges=edges,
|
||||
status="draft",
|
||||
user_id=user.id
|
||||
)
|
||||
session.add(workflow)
|
||||
|
||||
session.commit()
|
||||
session.refresh(workflow)
|
||||
|
||||
print(f"\n✅ 简单测试工作流创建成功!")
|
||||
print(f" - 工作流ID: {workflow.id}")
|
||||
print(f" - 工作流名称: {workflow.name}")
|
||||
print(f" - 节点数量: {len(nodes)} 个")
|
||||
print(f" - 连接数量: {len(edges)} 个")
|
||||
|
||||
except Exception as e:
|
||||
session.rollback()
|
||||
print(f"❌ 创建失败: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
finally:
|
||||
session.close()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("=" * 60)
|
||||
print("生成复杂测试工作流(包含条件判断)")
|
||||
print("=" * 60)
|
||||
generate_test_workflow()
|
||||
|
||||
print("\n" + "=" * 60)
|
||||
print("生成简单测试工作流(仅基本节点)")
|
||||
print("=" * 60)
|
||||
generate_simple_test_workflow()
|
||||
Reference in New Issue
Block a user