# 工作流验证功能说明

## ✅ 已完成

已实现完整的工作流验证功能，确保工作流的正确性和完整性。

## 功能特性

### 1. 工作流验证器 (`backend/app/services/workflow_validator.py`)

- 节点验证：检查节点ID唯一性、节点类型
- 边验证：检查边的源节点和目标节点是否存在
- 结构验证：检查是否有开始节点、结束节点
- 循环检测：使用DFS算法检测工作流中的循环
- 可达性验证：检查所有节点是否从开始节点可达
- 连接验证：验证节点连接的正确性
- 配置验证：验证节点配置的完整性

### 2. 验证规则

#### 错误（会导致验证失败）

1. **缺少节点**：工作流必须包含至少一个节点
2. **节点ID重复**：节点ID必须唯一
3. **缺少开始节点**：工作流必须包含至少一个开始节点
4. **循环检测**：工作流中不能存在循环
5. **边连接错误**：边的源节点或目标节点不存在
6. **自环检测**：节点不能连接到自身

#### 警告（不会导致验证失败）

1. **多个开始节点**：工作流包含多个开始节点
2. **缺少结束节点**：工作流建议包含至少一个结束节点
3. **不可达节点**：存在从开始节点不可达的节点
4. **开始节点入边**：开始节点不应该有入边
5. **结束节点出边**：结束节点不应该有出边
6. **条件节点分支**：条件节点缺少True或False分支
7. **节点配置不完整**：LLM节点缺少提示词或模型配置

## 使用方法

### 1. 后端API

#### 验证工作流（不保存）

```http
POST /api/v1/workflows/validate
Content-Type: application/json
Authorization: Bearer {token}

{
  "name": "测试工作流",
  "nodes": [...],
  "edges": [...]
}
```

**响应**:
```json
{
  "valid": true,
  "errors": [],
  "warnings": ["工作流建议包含至少一个结束节点"]
}
```

#### 创建/更新工作流时自动验证

创建或更新工作流时，系统会自动验证工作流。如果验证失败，会返回错误信息。

### 2. 验证结果格式

```json
{
  "valid": true,           // 是否有效
  "errors": [],            // 错误列表（会导致验证失败）
  "warnings": []          // 警告列表（不会导致验证失败）
}
```

## 验证示例

### 示例1: 有效的工作流

```json
{
  "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: 缺少开始节点

```json
{
  "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: 循环检测

```json
{
  "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: 条件节点分支验证

```json
{
  "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分支"]`

## 测试结果

### 测试覆盖

- ✅ 有效工作流验证 (通过)
- ✅ 缺少开始节点检测 (通过)
- ✅ 循环检测 (通过)
- ✅ 不可达节点检测 (通过)
- ✅ 条件节点分支验证 (通过)

### 测试用例

1. **有效工作流**: 正常通过验证 ✅
2. **缺少开始节点**: 正确检测错误 ✅
3. **循环检测**: 正确检测循环 ✅
4. **不可达节点**: 正确生成警告 ✅
5. **条件节点**: 正确检测分支缺失 ✅

## 集成说明

### 自动验证

- 创建工作流时自动验证
- 更新工作流时自动验证
- 验证失败时阻止保存

### 手动验证

- 通过 `/api/v1/workflows/validate` 端点手动验证
- 不保存工作流，只返回验证结果

## 优势

1. **提前发现问题**：在保存前发现工作流问题
2. **详细错误信息**：提供清晰的错误和警告信息
3. **多种验证规则**：覆盖节点、边、结构、配置等多个方面
4. **区分错误和警告**：错误阻止保存，警告仅提示

## 后续计划

- [ ] 前端集成验证提示
- [ ] 实时验证（编辑时）
- [ ] 更多验证规则（数据流验证、类型检查等）
- [ ] 验证规则自定义

---

**状态**: ✅ 已完成
**时间**: 2024年
