219 lines
4.8 KiB
Markdown
219 lines
4.8 KiB
Markdown
|
|
# 条件节点功能说明
|
|||
|
|
|
|||
|
|
## ✅ 已完成
|
|||
|
|
|
|||
|
|
已实现强大的条件节点表达式解析功能,支持复杂的条件判断。
|
|||
|
|
|
|||
|
|
## 功能特性
|
|||
|
|
|
|||
|
|
### 1. 条件表达式解析器 (`backend/app/services/condition_parser.py`)
|
|||
|
|
|
|||
|
|
- 支持多种比较运算符
|
|||
|
|
- 支持逻辑运算符(and, or, not)
|
|||
|
|
- 支持括号分组
|
|||
|
|
- 支持嵌套路径访问
|
|||
|
|
- 安全的表达式评估
|
|||
|
|
|
|||
|
|
### 2. 支持的运算符
|
|||
|
|
|
|||
|
|
#### 比较运算符
|
|||
|
|
- `==`: 等于
|
|||
|
|
- `!=`: 不等于
|
|||
|
|
- `>`: 大于
|
|||
|
|
- `>=`: 大于等于
|
|||
|
|
- `<`: 小于
|
|||
|
|
- `<=`: 小于等于
|
|||
|
|
- `in`: 包含
|
|||
|
|
- `not in`: 不包含
|
|||
|
|
- `contains`: 字符串包含
|
|||
|
|
- `not contains`: 字符串不包含
|
|||
|
|
|
|||
|
|
#### 逻辑运算符
|
|||
|
|
- `and`: 逻辑与
|
|||
|
|
- `or`: 逻辑或
|
|||
|
|
- `not`: 逻辑非
|
|||
|
|
|
|||
|
|
### 3. 工作流引擎集成
|
|||
|
|
|
|||
|
|
- 条件节点根据表达式结果选择分支
|
|||
|
|
- 动态过滤执行路径
|
|||
|
|
- 只执行符合条件的分支节点
|
|||
|
|
|
|||
|
|
## 使用方法
|
|||
|
|
|
|||
|
|
### 1. 在工作流中添加条件节点
|
|||
|
|
|
|||
|
|
1. 打开工作流设计器
|
|||
|
|
2. 从节点工具箱拖拽"条件"节点到画布
|
|||
|
|
3. 配置条件表达式
|
|||
|
|
|
|||
|
|
### 2. 配置条件表达式
|
|||
|
|
|
|||
|
|
在节点配置面板中,输入条件表达式:
|
|||
|
|
|
|||
|
|
#### 简单条件
|
|||
|
|
```
|
|||
|
|
{value} > 10
|
|||
|
|
{status} == 'active'
|
|||
|
|
{count} >= 0
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 逻辑组合
|
|||
|
|
```
|
|||
|
|
{value} > 10 and {value} < 20
|
|||
|
|
{status} == 'active' or {status} == 'pending'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 复杂条件(括号分组)
|
|||
|
|
```
|
|||
|
|
({value} > 10 and {value} < 20) and {status} == 'active'
|
|||
|
|
({status} == 'a' or {status} == 'b') and {count} > 0
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. 连接分支
|
|||
|
|
|
|||
|
|
条件节点有两个输出:
|
|||
|
|
- **True分支**(绿色):条件为真时执行
|
|||
|
|
- **False分支**(红色):条件为假时执行
|
|||
|
|
|
|||
|
|
连接方式:
|
|||
|
|
1. 从条件节点的底部连接点拖出
|
|||
|
|
2. 选择True或False分支
|
|||
|
|
3. 连接到目标节点
|
|||
|
|
|
|||
|
|
## 表达式语法
|
|||
|
|
|
|||
|
|
### 变量引用
|
|||
|
|
|
|||
|
|
使用 `{key}` 引用输入数据中的字段:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
{value} > 10
|
|||
|
|
{user.name} == 'admin'
|
|||
|
|
{items[0].price} > 100
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 值类型
|
|||
|
|
|
|||
|
|
支持多种值类型:
|
|||
|
|
- **数字**: `10`, `3.14`
|
|||
|
|
- **字符串**: `'active'`, `"pending"`
|
|||
|
|
- **布尔值**: `true`, `false`
|
|||
|
|
- **None**: `null`, `None`
|
|||
|
|
|
|||
|
|
### 嵌套路径
|
|||
|
|
|
|||
|
|
支持访问嵌套数据:
|
|||
|
|
- `{user.name}`: 访问 `user.name`
|
|||
|
|
- `{items[0]}`: 访问数组第一个元素
|
|||
|
|
- `{items[0].price}`: 访问嵌套对象
|
|||
|
|
|
|||
|
|
## 示例
|
|||
|
|
|
|||
|
|
### 示例1: 数值范围判断
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
条件表达式: {value} > 10 and {value} < 20
|
|||
|
|
|
|||
|
|
输入: {"value": 15}
|
|||
|
|
结果: True → 走True分支
|
|||
|
|
|
|||
|
|
输入: {"value": 5}
|
|||
|
|
结果: False → 走False分支
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 示例2: 状态判断
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
条件表达式: {status} == 'active' or {status} == 'pending'
|
|||
|
|
|
|||
|
|
输入: {"status": "active"}
|
|||
|
|
结果: True → 走True分支
|
|||
|
|
|
|||
|
|
输入: {"status": "inactive"}
|
|||
|
|
结果: False → 走False分支
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 示例3: 复杂条件
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
条件表达式: ({value} > 10 and {value} < 20) and {status} == 'active'
|
|||
|
|
|
|||
|
|
输入: {"value": 15, "status": "active"}
|
|||
|
|
结果: True → 走True分支
|
|||
|
|
|
|||
|
|
输入: {"value": 15, "status": "inactive"}
|
|||
|
|
结果: False → 走False分支
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 示例4: 字符串包含
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
条件表达式: {message} contains 'error'
|
|||
|
|
|
|||
|
|
输入: {"message": "发生错误"}
|
|||
|
|
结果: True → 走True分支
|
|||
|
|
|
|||
|
|
输入: {"message": "成功"}
|
|||
|
|
结果: False → 走False分支
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 工作流示例
|
|||
|
|
|
|||
|
|
### 示例工作流:条件分支处理
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
开始 → LLM节点(分析) → 条件节点(判断) → [True] → 输出节点1
|
|||
|
|
→ [False] → 输出节点2
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**配置**:
|
|||
|
|
1. LLM节点: 分析输入数据,返回结果
|
|||
|
|
2. 条件节点: `{result} contains 'error'`
|
|||
|
|
3. True分支: 处理错误情况
|
|||
|
|
4. False分支: 处理正常情况
|
|||
|
|
|
|||
|
|
## 测试结果
|
|||
|
|
|
|||
|
|
### 测试覆盖
|
|||
|
|
|
|||
|
|
- ✅ 简单条件表达式 (8/8通过)
|
|||
|
|
- ✅ 逻辑组合条件 (6/6通过)
|
|||
|
|
- ✅ 复杂条件表达式 (4/4通过)
|
|||
|
|
- ✅ 工作流中的条件节点 (通过)
|
|||
|
|
|
|||
|
|
### 测试用例
|
|||
|
|
|
|||
|
|
1. **数值比较**: `{value} > 10`, `{value} == 10`
|
|||
|
|
2. **字符串比较**: `{status} == 'active'`
|
|||
|
|
3. **逻辑组合**: `{value} > 10 and {value} < 20`
|
|||
|
|
4. **或运算**: `{status} == 'active' or {status} == 'pending'`
|
|||
|
|
5. **括号分组**: `({value} > 10 and {value} < 20) and {status} == 'active'`
|
|||
|
|
|
|||
|
|
## 注意事项
|
|||
|
|
|
|||
|
|
1. **变量名**: 使用 `{key}` 格式,key必须存在于输入数据中
|
|||
|
|
2. **字符串值**: 字符串值需要用引号包裹:`'active'` 或 `"active"`
|
|||
|
|
3. **运算符优先级**: `not` > `and` > `or`,可以使用括号改变优先级
|
|||
|
|
4. **分支选择**: 条件节点会根据表达式结果自动选择True或False分支
|
|||
|
|
5. **错误处理**: 如果表达式评估失败,默认返回False
|
|||
|
|
|
|||
|
|
## 安全特性
|
|||
|
|
|
|||
|
|
- 使用安全的表达式评估(限制可用的内置函数)
|
|||
|
|
- 不支持危险的Python操作
|
|||
|
|
- 只允许访问输入数据中的字段
|
|||
|
|
- 自动处理类型转换
|
|||
|
|
|
|||
|
|
## 后续计划
|
|||
|
|
|
|||
|
|
- [ ] 支持更多运算符(如正则匹配)
|
|||
|
|
- [ ] 支持函数调用(如 `len({items}) > 0`)
|
|||
|
|
- [ ] 支持数组操作(如 `{items}.length > 0`)
|
|||
|
|
- [ ] 可视化条件表达式编辑器
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**状态**: ✅ 已完成
|
|||
|
|
**时间**: 2024年
|