5.4 KiB
5.4 KiB
工作流验证功能说明
✅ 已完成
已实现完整的工作流验证功能,确保工作流的正确性和完整性。
功能特性
1. 工作流验证器 (backend/app/services/workflow_validator.py)
- 节点验证:检查节点ID唯一性、节点类型
- 边验证:检查边的源节点和目标节点是否存在
- 结构验证:检查是否有开始节点、结束节点
- 循环检测:使用DFS算法检测工作流中的循环
- 可达性验证:检查所有节点是否从开始节点可达
- 连接验证:验证节点连接的正确性
- 配置验证:验证节点配置的完整性
2. 验证规则
错误(会导致验证失败)
- 缺少节点:工作流必须包含至少一个节点
- 节点ID重复:节点ID必须唯一
- 缺少开始节点:工作流必须包含至少一个开始节点
- 循环检测:工作流中不能存在循环
- 边连接错误:边的源节点或目标节点不存在
- 自环检测:节点不能连接到自身
警告(不会导致验证失败)
- 多个开始节点:工作流包含多个开始节点
- 缺少结束节点:工作流建议包含至少一个结束节点
- 不可达节点:存在从开始节点不可达的节点
- 开始节点入边:开始节点不应该有入边
- 结束节点出边:结束节点不应该有出边
- 条件节点分支:条件节点缺少True或False分支
- 节点配置不完整:LLM节点缺少提示词或模型配置
使用方法
1. 后端API
验证工作流(不保存)
POST /api/v1/workflows/validate
Content-Type: application/json
Authorization: Bearer {token}
{
"name": "测试工作流",
"nodes": [...],
"edges": [...]
}
响应:
{
"valid": true,
"errors": [],
"warnings": ["工作流建议包含至少一个结束节点"]
}
创建/更新工作流时自动验证
创建或更新工作流时,系统会自动验证工作流。如果验证失败,会返回错误信息。
2. 验证结果格式
{
"valid": true, // 是否有效
"errors": [], // 错误列表(会导致验证失败)
"warnings": [] // 警告列表(不会导致验证失败)
}
验证示例
示例1: 有效的工作流
{
"nodes": [
{"id": "start-1", "type": "start", "data": {"label": "开始"}},
{"id": "llm-1", "type": "llm", "data": {"label": "LLM", "prompt": "测试"}},
{"id": "end-1", "type": "end", "data": {"label": "结束"}}
],
"edges": [
{"id": "e1", "source": "start-1", "target": "llm-1"},
{"id": "e2", "source": "llm-1", "target": "end-1"}
]
}
验证结果: ✅ 通过
示例2: 缺少开始节点
{
"nodes": [
{"id": "llm-1", "type": "llm", "data": {"label": "LLM"}},
{"id": "end-1", "type": "end", "data": {"label": "结束"}}
],
"edges": [
{"id": "e1", "source": "llm-1", "target": "end-1"}
]
}
验证结果: ❌ 失败
- 错误:
["工作流必须包含至少一个开始节点"]
示例3: 循环检测
{
"nodes": [
{"id": "start-1", "type": "start", "data": {"label": "开始"}},
{"id": "node-1", "type": "default", "data": {"label": "节点1"}},
{"id": "node-2", "type": "default", "data": {"label": "节点2"}}
],
"edges": [
{"id": "e1", "source": "start-1", "target": "node-1"},
{"id": "e2", "source": "node-1", "target": "node-2"},
{"id": "e3", "source": "node-2", "target": "node-1"} // 形成循环
]
}
验证结果: ❌ 失败
- 错误:
["检测到循环: node-2 -> node-1"]
示例4: 条件节点分支验证
{
"nodes": [
{"id": "start-1", "type": "start", "data": {"label": "开始"}},
{"id": "condition-1", "type": "condition", "data": {"label": "条件", "condition": "{value} > 10"}},
{"id": "end-1", "type": "end", "data": {"label": "结束"}}
],
"edges": [
{"id": "e1", "source": "start-1", "target": "condition-1"},
{"id": "e2", "source": "condition-1", "target": "end-1", "sourceHandle": "true"}
// 缺少false分支
]
}
验证结果: ✅ 通过(但有警告)
- 警告:
["条件节点 condition-1 缺少False分支"]
测试结果
测试覆盖
- ✅ 有效工作流验证 (通过)
- ✅ 缺少开始节点检测 (通过)
- ✅ 循环检测 (通过)
- ✅ 不可达节点检测 (通过)
- ✅ 条件节点分支验证 (通过)
测试用例
- 有效工作流: 正常通过验证 ✅
- 缺少开始节点: 正确检测错误 ✅
- 循环检测: 正确检测循环 ✅
- 不可达节点: 正确生成警告 ✅
- 条件节点: 正确检测分支缺失 ✅
集成说明
自动验证
- 创建工作流时自动验证
- 更新工作流时自动验证
- 验证失败时阻止保存
手动验证
- 通过
/api/v1/workflows/validate端点手动验证 - 不保存工作流,只返回验证结果
优势
- 提前发现问题:在保存前发现工作流问题
- 详细错误信息:提供清晰的错误和警告信息
- 多种验证规则:覆盖节点、边、结构、配置等多个方面
- 区分错误和警告:错误阻止保存,警告仅提示
后续计划
- 前端集成验证提示
- 实时验证(编辑时)
- 更多验证规则(数据流验证、类型检查等)
- 验证规则自定义
状态: ✅ 已完成 时间: 2024年