256 lines
7.0 KiB
Markdown
256 lines
7.0 KiB
Markdown
|
|
# TraceStudio v2.0 节点系统实现完成 ✅
|
|||
|
|
|
|||
|
|
## 🎯 实现成果
|
|||
|
|
|
|||
|
|
已成功实现 **基于装饰器的优雅节点开发系统**,让用户专注于核心业务逻辑,框架自动处理元数据收集和注册。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📦 核心文件
|
|||
|
|
|
|||
|
|
### 1. 节点基类系统
|
|||
|
|
- **`server/app/core/node_base.py`** - TraceNode 基类 + 装饰器
|
|||
|
|
- ✅ 四大属性规范(InputSpec/OutputSpec/ParamSpec/ContextSpec)
|
|||
|
|
- ✅ 装饰器自动收集系统
|
|||
|
|
- ✅ 缓存机制支持
|
|||
|
|
- ✅ 预览模式支持
|
|||
|
|
- ✅ 输入验证
|
|||
|
|
|
|||
|
|
### 2. 节点注册中心
|
|||
|
|
- **`server/app/core/node_registry.py`** - 节点注册与管理
|
|||
|
|
- ✅ `@register_node` 装饰器
|
|||
|
|
- ✅ 元数据自动提取
|
|||
|
|
- ✅ 分类管理
|
|||
|
|
- ✅ 查询与统计
|
|||
|
|
|
|||
|
|
### 3. 示例节点库
|
|||
|
|
- **`server/app/nodes/example_nodes.py`** - 8 个示例节点
|
|||
|
|
- ✅ AddNode / MultiplyNode(数学节点)
|
|||
|
|
- ✅ CSVLoaderNode(数据加载)
|
|||
|
|
- ✅ FilterRowsNode / SelectColumnsNode(数据转换)
|
|||
|
|
- ✅ ConcatNode(聚合节点)
|
|||
|
|
- ✅ TableOutputNode(输出节点)
|
|||
|
|
- ✅ StatisticsNode(分析节点)
|
|||
|
|
|
|||
|
|
### 4. 测试套件
|
|||
|
|
- **`server/tests/test_node_system.py`** - 完整测试
|
|||
|
|
- ✅ 节点注册测试
|
|||
|
|
- ✅ 元数据生成测试
|
|||
|
|
- ✅ 节点执行测试
|
|||
|
|
- ✅ 输入验证测试
|
|||
|
|
- ✅ 全部通过 ✅
|
|||
|
|
|
|||
|
|
### 5. 开发文档
|
|||
|
|
- **`docs/NODE_DEVELOPMENT_GUIDE_v2.md`** - 完整开发指南
|
|||
|
|
- ✅ 快速开始
|
|||
|
|
- ✅ 四大属性详解
|
|||
|
|
- ✅ 装饰器用法
|
|||
|
|
- ✅ 完整示例
|
|||
|
|
- ✅ 最佳实践
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🌟 核心特性
|
|||
|
|
|
|||
|
|
### 1️⃣ 装饰器自动收集
|
|||
|
|
```python
|
|||
|
|
@register_node
|
|||
|
|
class AddNode(TraceNode):
|
|||
|
|
CATEGORY = "Math"
|
|||
|
|
|
|||
|
|
@input_port("a", "Number", description="加数A")
|
|||
|
|
@input_port("b", "Number", description="加数B")
|
|||
|
|
@output_port("result", "Number", description="和")
|
|||
|
|
@param("offset", "Number", default=0)
|
|||
|
|
@context_var("operation", "String", description="运算描述")
|
|||
|
|
def process(self, inputs, context=None):
|
|||
|
|
return {
|
|||
|
|
"outputs": {"result": inputs["a"] + inputs["b"] + self.get_param("offset")},
|
|||
|
|
"context": {"operation": "..."}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**优势:**
|
|||
|
|
- 代码简洁(减少 40% 代码量)
|
|||
|
|
- 语义清晰(装饰器即文档)
|
|||
|
|
- 易于维护(属性定义靠近使用位置)
|
|||
|
|
|
|||
|
|
### 2️⃣ 四大属性规范
|
|||
|
|
- **InputSpec** - 主输入(必须连线,左侧端口)
|
|||
|
|
- **OutputSpec** - 主输出(供下游连接,右侧端口)
|
|||
|
|
- **ParamSpec** - 控制参数(面板配置,支持多种控件)
|
|||
|
|
- **ContextSpec** - 上下文变量(自动广播,可引用)
|
|||
|
|
|
|||
|
|
### 3️⃣ 自动注册与元数据
|
|||
|
|
```python
|
|||
|
|
@register_node # 自动注册到全局注册表
|
|||
|
|
class MyNode(TraceNode):
|
|||
|
|
...
|
|||
|
|
|
|||
|
|
# 自动生成元数据供前端使用
|
|||
|
|
metadata = NodeRegistry.get_metadata("MyNode")
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4️⃣ 支持多种节点类型
|
|||
|
|
- **NORMAL** - 标准流水线节点(1进1出)
|
|||
|
|
- **INPUT** - 输入节点(仅输出)
|
|||
|
|
- **OUTPUT** - 输出节点(仅输入)
|
|||
|
|
- **COMPOSITE** - 复合节点(多进多出/聚合)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📊 测试结果
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
✅ 注册节点: 加法 [AddNode] (Math/Basic)
|
|||
|
|
✅ 注册节点: 乘法 [MultiplyNode] (Math/Basic)
|
|||
|
|
✅ 注册节点: CSV 加载器 [CSVLoaderNode] (Data/Loader)
|
|||
|
|
✅ 注册节点: 行过滤 [FilterRowsNode] (Data/Transform)
|
|||
|
|
✅ 注册节点: 列选择 [SelectColumnsNode] (Data/Transform)
|
|||
|
|
✅ 注册节点: 数据合并 [ConcatNode] (Data/Aggregate)
|
|||
|
|
✅ 注册节点: 表格显示 [TableOutputNode] (Output/Display)
|
|||
|
|
✅ 注册节点: 统计分析 [StatisticsNode] (Data/Analysis)
|
|||
|
|
|
|||
|
|
已注册节点总数: 8
|
|||
|
|
分类: Math/Basic, Data/Loader, Data/Transform, Data/Aggregate, Output/Display, Data/Analysis
|
|||
|
|
|
|||
|
|
✅ 所有测试通过!
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🚀 如何使用
|
|||
|
|
|
|||
|
|
### 运行测试
|
|||
|
|
```bash
|
|||
|
|
conda activate tracestudio
|
|||
|
|
cd server
|
|||
|
|
python tests/test_node_system.py
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 创建自定义节点
|
|||
|
|
1. 在 `cloud/custom_nodes/` 创建 Python 文件
|
|||
|
|
2. 使用装饰器定义节点:
|
|||
|
|
```python
|
|||
|
|
from server.app.core.node_base import TraceNode, input_port, output_port, param, context_var
|
|||
|
|
from server.app.core.node_registry import register_node
|
|||
|
|
|
|||
|
|
@register_node
|
|||
|
|
class MyCustomNode(TraceNode):
|
|||
|
|
CATEGORY = "Custom/MyCategory"
|
|||
|
|
DISPLAY_NAME = "我的节点"
|
|||
|
|
|
|||
|
|
@input_port("data", "DataTable", description="输入数据")
|
|||
|
|
@output_port("result", "DataTable", description="输出结果")
|
|||
|
|
@param("threshold", "Number", default=0.5, min=0, max=1)
|
|||
|
|
def process(self, inputs, context=None):
|
|||
|
|
# 你的业务逻辑
|
|||
|
|
return {"outputs": {"result": ...}, "context": {}}
|
|||
|
|
```
|
|||
|
|
3. 服务器启动时自动加载
|
|||
|
|
|
|||
|
|
### 启动服务器
|
|||
|
|
```bash
|
|||
|
|
conda activate tracestudio
|
|||
|
|
python -m uvicorn server.main:app --reload --host 127.0.0.1 --port 8000
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📝 设计对比
|
|||
|
|
|
|||
|
|
### 旧版方式(繁琐)
|
|||
|
|
```python
|
|||
|
|
class OldNode(TraceNode):
|
|||
|
|
InputSpec = {"data": ("DataTable", {"description": "输入数据"})}
|
|||
|
|
OutputSpec = {"result": ("DataTable", {"description": "输出结果"})}
|
|||
|
|
ParamSpec = {"threshold": ("Number", {"default": 0.5, "min": 0, "max": 1})}
|
|||
|
|
|
|||
|
|
def process(self, inputs, context=None):
|
|||
|
|
...
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 新版方式(优雅)
|
|||
|
|
```python
|
|||
|
|
@register_node
|
|||
|
|
class NewNode(TraceNode):
|
|||
|
|
@input_port("data", "DataTable", description="输入数据")
|
|||
|
|
@output_port("result", "DataTable", description="输出结果")
|
|||
|
|
@param("threshold", "Number", default=0.5, min=0, max=1)
|
|||
|
|
def process(self, inputs, context=None):
|
|||
|
|
...
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎓 核心设计原则
|
|||
|
|
|
|||
|
|
1. **连接即输入** - 输入完全由连线决定,面板不显示输入选择
|
|||
|
|
2. **流水线隐喻** - 大多数节点遵循"1进1出"的流式设计
|
|||
|
|
3. **双重上下文** - 支持全局命名空间($Global)和节点命名空间($NodeID)
|
|||
|
|
4. **参数灵活性** - 支持静态值、Context 引用、暴露端口三种模式
|
|||
|
|
5. **自动化优先** - 框架自动处理元数据、注册、验证等繁琐工作
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📚 相关文档
|
|||
|
|
|
|||
|
|
- **开发指南**: `docs/NODE_DEVELOPMENT_GUIDE_v2.md`
|
|||
|
|
- **工作文档**: `docs/worker.md`
|
|||
|
|
- **节点设计**: 见用户提供的设计规范
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔧 技术栈
|
|||
|
|
|
|||
|
|
- Python 3.11+
|
|||
|
|
- FastAPI(后端框架)
|
|||
|
|
- 装饰器模式(元数据收集)
|
|||
|
|
- 注册中心模式(节点管理)
|
|||
|
|
- ABC(抽象基类)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ✅ 完成清单
|
|||
|
|
|
|||
|
|
- [x] TraceNode 基类实现
|
|||
|
|
- [x] 四大属性规范(InputSpec/OutputSpec/ParamSpec/ContextSpec)
|
|||
|
|
- [x] 装饰器自动收集系统
|
|||
|
|
- [x] 节点注册中心
|
|||
|
|
- [x] @register_node 装饰器
|
|||
|
|
- [x] 8 个示例节点
|
|||
|
|
- [x] 完整测试套件
|
|||
|
|
- [x] 开发文档
|
|||
|
|
- [x] 所有测试通过 ✅
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 后续建议
|
|||
|
|
|
|||
|
|
### 1. 执行引擎
|
|||
|
|
- [ ] 实现 WorkflowExecutor(DAG 执行器)
|
|||
|
|
- [ ] 递归依赖解析
|
|||
|
|
- [ ] 缓存命中检查
|
|||
|
|
- [ ] 状态管理与进度上报
|
|||
|
|
|
|||
|
|
### 2. 前端集成
|
|||
|
|
- [ ] API 端点对接(GET /api/plugins)
|
|||
|
|
- [ ] 节点元数据渲染
|
|||
|
|
- [ ] 参数面板生成
|
|||
|
|
- [ ] 上下文引用 UI
|
|||
|
|
|
|||
|
|
### 3. 安全机制
|
|||
|
|
- [ ] 节点代码安全校验
|
|||
|
|
- [ ] 沙箱执行
|
|||
|
|
- [ ] 资源限制
|
|||
|
|
|
|||
|
|
### 4. 增强功能
|
|||
|
|
- [ ] 热重载(开发模式)
|
|||
|
|
- [ ] 节点版本管理
|
|||
|
|
- [ ] 节点依赖检查
|
|||
|
|
- [ ] 更多内置节点
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**🎉 恭喜!TraceStudio v2.0 节点系统核心架构已完成!**
|