314 lines
6.7 KiB
Markdown
314 lines
6.7 KiB
Markdown
|
|
# 🎯 函数节点嵌套 - 新功能说明
|
|||
|
|
|
|||
|
|
> **新增功能发布**: 支持工作流函数化和多层嵌套编辑
|
|||
|
|
|
|||
|
|
## 📢 功能亮点
|
|||
|
|
|
|||
|
|
### 什么是函数节点嵌套?
|
|||
|
|
|
|||
|
|
将任何工作流**保存为可复用的函数节点**,并支持**无限层嵌套编辑**。
|
|||
|
|
|
|||
|
|
### 核心特性
|
|||
|
|
|
|||
|
|
| 特性 | 说明 |
|
|||
|
|
|------|------|
|
|||
|
|
| 📦 **函数封装** | 将工作流转为可复用的函数节点 |
|
|||
|
|
| 🔄 **即插即用** | 拖拽函数到其他工作流中使用 |
|
|||
|
|
| 🔍 **双击编辑** | 双击进入函数内部进行编辑 |
|
|||
|
|
| 📍 **面包屑导航** | 清晰定位当前所在层级 |
|
|||
|
|
| 🌳 **多层嵌套** | 函数中可以包含其他函数 |
|
|||
|
|
| 💾 **自动保存** | 所有修改自动保存到磁盘 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🚀 5分钟快速开始
|
|||
|
|
|
|||
|
|
### 步骤 1: 创建函数
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
1. 在画布中设计任何工作流
|
|||
|
|
2. 右键 → "保存为函数"
|
|||
|
|
3. 输入函数名: my_function
|
|||
|
|
4. 输入显示名: 我的函数
|
|||
|
|
5. ✅ 完成!
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 步骤 2: 使用函数
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
1. 从 NodePalette 找到函数
|
|||
|
|
2. 拖拽到新工作流
|
|||
|
|
3. 连接输入/输出
|
|||
|
|
4. ✅ 完成!
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 步骤 3: 编辑函数
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
1. 双击函数节点
|
|||
|
|
2. 看到面包屑: 主工作流 / my_function (L1)
|
|||
|
|
3. 编辑内部工作流
|
|||
|
|
4. 点击面包屑或返回按钮退出
|
|||
|
|
5. ✅ 完成!
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📚 详细文档
|
|||
|
|
|
|||
|
|
### 快速开始 (15 分钟)
|
|||
|
|
👉 [FUNCTION_NESTING_QUICKSTART.md](FUNCTION_NESTING_QUICKSTART.md)
|
|||
|
|
- 5分钟快速上手
|
|||
|
|
- 常见问题解答
|
|||
|
|
- 最佳实践建议
|
|||
|
|
- 命名规范说明
|
|||
|
|
|
|||
|
|
### 完整实现指南 (1 小时)
|
|||
|
|
👉 [FUNCTION_NESTING_IMPLEMENTATION.md](FUNCTION_NESTING_IMPLEMENTATION.md)
|
|||
|
|
- 完整的架构设计
|
|||
|
|
- 后端实现详解
|
|||
|
|
- 前端实现详解
|
|||
|
|
- API 文档
|
|||
|
|
- 代码示例
|
|||
|
|
- 测试场景
|
|||
|
|
- 调试指南
|
|||
|
|
|
|||
|
|
### 完成总结 (了解项目)
|
|||
|
|
👉 [COMPLETION_SUMMARY.md](COMPLETION_SUMMARY.md)
|
|||
|
|
- 交付物清单
|
|||
|
|
- 代码统计
|
|||
|
|
- 文档清单
|
|||
|
|
- 技术亮点
|
|||
|
|
- 下一步计划
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎓 使用场景
|
|||
|
|
|
|||
|
|
### 场景 1: 数据处理工厂
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
主工作流
|
|||
|
|
├─ 加载数据节点
|
|||
|
|
├─ extract_columns 函数 (可复用)
|
|||
|
|
├─ transform_data 函数 (可复用)
|
|||
|
|
└─ 保存结果节点
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**优势**:
|
|||
|
|
- 每个函数独立维护
|
|||
|
|
- 在不同工作流中复用
|
|||
|
|
- 易于测试和调试
|
|||
|
|
|
|||
|
|
### 场景 2: 业务流程编排
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
主工作流 (采购流程)
|
|||
|
|
├─ 创建订单 (函数)
|
|||
|
|
├─ 验证库存 (函数)
|
|||
|
|
│ ├─ 查询库存 (函数)
|
|||
|
|
│ └─ 计算可用量 (函数)
|
|||
|
|
├─ 生成采购单 (函数)
|
|||
|
|
└─ 发送通知 (函数)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**优势**:
|
|||
|
|
- 业务逻辑清晰
|
|||
|
|
- 功能模块化
|
|||
|
|
- 支持多层嵌套
|
|||
|
|
|
|||
|
|
### 场景 3: 数据分析管道
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
分析工作流
|
|||
|
|
├─ 数据加载 (函数)
|
|||
|
|
├─ 数据清洗 (函数)
|
|||
|
|
│ ├─ 去重 (内部函数)
|
|||
|
|
│ ├─ 填充缺失 (内部函数)
|
|||
|
|
│ └─ 异常检测 (内部函数)
|
|||
|
|
├─ 特征工程 (函数)
|
|||
|
|
└─ 模型预测 (函数)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**优势**:
|
|||
|
|
- 流程透明
|
|||
|
|
- 易于复用
|
|||
|
|
- 支持版本管理
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔧 关键技术
|
|||
|
|
|
|||
|
|
### 后端
|
|||
|
|
- **Python**: FastAPI 框架
|
|||
|
|
- **设计模式**: 工厂模式(动态创建节点类)
|
|||
|
|
- **参数传递**: Context 特殊键 (`__function_input_*`, `__function_output_*`)
|
|||
|
|
|
|||
|
|
### 前端
|
|||
|
|
- **状态管理**: Zustand (栈式结构)
|
|||
|
|
- **组件**: React Hooks
|
|||
|
|
- **交互**: 双击进入、右键保存、面包屑导航
|
|||
|
|
|
|||
|
|
### 存储
|
|||
|
|
- **格式**: JSON
|
|||
|
|
- **位置**: `cloud/custom_nodes/functions/`
|
|||
|
|
- **持久化**: 磁盘 + localStorage
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📊 API 接口
|
|||
|
|
|
|||
|
|
### 保存函数
|
|||
|
|
```
|
|||
|
|
POST /api/functions/save
|
|||
|
|
Content-Type: application/json
|
|||
|
|
|
|||
|
|
{
|
|||
|
|
"function_name": "extract_data",
|
|||
|
|
"display_name": "提取数据",
|
|||
|
|
"description": "从源数据中提取列",
|
|||
|
|
"nodes": [...],
|
|||
|
|
"edges": [...],
|
|||
|
|
"inputs": [],
|
|||
|
|
"outputs": []
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 获取函数列表
|
|||
|
|
```
|
|||
|
|
GET /api/functions/list
|
|||
|
|
|
|||
|
|
响应:
|
|||
|
|
{
|
|||
|
|
"success": true,
|
|||
|
|
"data": [
|
|||
|
|
{
|
|||
|
|
"function_name": "extract_data",
|
|||
|
|
"display_name": "提取数据",
|
|||
|
|
...
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 获取函数详情
|
|||
|
|
```
|
|||
|
|
GET /api/functions/extract_data
|
|||
|
|
|
|||
|
|
响应:
|
|||
|
|
{
|
|||
|
|
"success": true,
|
|||
|
|
"data": {
|
|||
|
|
"function_name": "extract_data",
|
|||
|
|
"nodes": [...],
|
|||
|
|
"edges": [...],
|
|||
|
|
...
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
完整 API 文档见: [FUNCTION_NESTING_IMPLEMENTATION.md](FUNCTION_NESTING_IMPLEMENTATION.md#-api-文档)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ✨ 新增内容
|
|||
|
|
|
|||
|
|
### 后端新增
|
|||
|
|
- `server/app/core/function_nodes.py` (281 行)
|
|||
|
|
- InputNode, OutputNode, FunctionNode, 工厂函数
|
|||
|
|
|
|||
|
|
- `server/app/core/node_loader.py` 修改 (67 行新增)
|
|||
|
|
- 函数节点加载器
|
|||
|
|
|
|||
|
|
- `server/app/api/endpoints_graph.py` 修改 (120 行新增)
|
|||
|
|
- 3 个 API 端点
|
|||
|
|
|
|||
|
|
- `cloud/custom_nodes/functions/` 目录
|
|||
|
|
- 函数存储目录
|
|||
|
|
|
|||
|
|
### 前端新增
|
|||
|
|
- `web/src/stores/useStore.ts` 修改 (130 行新增)
|
|||
|
|
- 函数嵌套状态管理
|
|||
|
|
|
|||
|
|
- `web/src/components/Workspace.tsx` 修改 (95 行新增)
|
|||
|
|
- 双击进入、右键保存功能
|
|||
|
|
|
|||
|
|
- `web/src/components/BreadcrumbNav.tsx` (148 行)
|
|||
|
|
- 面包屑导航组件
|
|||
|
|
|
|||
|
|
### 文档新增
|
|||
|
|
- `FUNCTION_NESTING_QUICKSTART.md` (700+ 行)
|
|||
|
|
- `FUNCTION_NESTING_IMPLEMENTATION.md` (2,300+ 行)
|
|||
|
|
- `COMPLETION_SUMMARY.md` (800+ 行)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ❓ 常见问题
|
|||
|
|
|
|||
|
|
### Q: 如何创建第一个函数?
|
|||
|
|
A: 见 [快速开始](FUNCTION_NESTING_QUICKSTART.md#第1步-创建一个函数)
|
|||
|
|
|
|||
|
|
### Q: 如何进入函数编辑?
|
|||
|
|
A: 双击函数节点即可进入。见 [双击进入](FUNCTION_NESTING_QUICKSTART.md#第3步-进入函数编辑)
|
|||
|
|
|
|||
|
|
### Q: 支持多少层嵌套?
|
|||
|
|
A: 理论无限制,建议不超过 5 层。
|
|||
|
|
|
|||
|
|
### Q: 函数修改后如何保存?
|
|||
|
|
A: 自动保存到 localStorage,可右键"保存工作流"永久保存。
|
|||
|
|
|
|||
|
|
### Q: 如何分享函数?
|
|||
|
|
A: 导出 `functions/*.json` 文件,发给其他用户。他们放入同目录即可使用。
|
|||
|
|
|
|||
|
|
更多问题见: [常见问题](FUNCTION_NESTING_QUICKSTART.md#-常见问题)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 下一步
|
|||
|
|
|
|||
|
|
### 立即体验
|
|||
|
|
1. 阅读 [快速开始](FUNCTION_NESTING_QUICKSTART.md)
|
|||
|
|
2. 创建第一个函数
|
|||
|
|
3. 尝试多层嵌套
|
|||
|
|
|
|||
|
|
### 深入学习
|
|||
|
|
1. 阅读 [完整实现指南](FUNCTION_NESTING_IMPLEMENTATION.md)
|
|||
|
|
2. 查看代码实现
|
|||
|
|
3. 理解架构设计
|
|||
|
|
|
|||
|
|
### 贡献改进
|
|||
|
|
1. 提出功能建议
|
|||
|
|
2. 报告 Bug
|
|||
|
|
3. 贡献代码
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📞 获取帮助
|
|||
|
|
|
|||
|
|
| 问题类型 | 查看文档 |
|
|||
|
|
|---------|--------|
|
|||
|
|
| 快速上手 | [快速开始](FUNCTION_NESTING_QUICKSTART.md) |
|
|||
|
|
| 常见问题 | [常见问题](FUNCTION_NESTING_QUICKSTART.md#-常见问题) |
|
|||
|
|
| 完整文档 | [实现指南](FUNCTION_NESTING_IMPLEMENTATION.md) |
|
|||
|
|
| API 接口 | [API 文档](FUNCTION_NESTING_IMPLEMENTATION.md#-api-文档) |
|
|||
|
|
| 最佳实践 | [最佳实践](FUNCTION_NESTING_QUICKSTART.md#💡-最佳实践) |
|
|||
|
|
| 项目总结 | [完成总结](COMPLETION_SUMMARY.md) |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎉 功能发布信息
|
|||
|
|
|
|||
|
|
- **版本**: v1.0.0
|
|||
|
|
- **发布日期**: 2024-01-15
|
|||
|
|
- **状态**: ✅ 生产就绪
|
|||
|
|
- **代码行数**: ~843 行
|
|||
|
|
- **文档行数**: ~3,800 行
|
|||
|
|
- **API 端点**: 3 个
|
|||
|
|
- **测试场景**: 8 个
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**开始体验新功能吧!** 🚀
|
|||
|
|
|
|||
|
|
👉 [立即开始](FUNCTION_NESTING_QUICKSTART.md)
|