创建新工作流节点指南(后端)
概述
本指南将帮助您快速创建新的工作流节点。基于SpringBoot3 + LangGraph4j + Hutool技术栈,新的节点系统采用了标准化的结构设计,使得创建节点变得非常简单和规范。节点创建步骤
1. 创建节点文件夹
在langchat-workflow/langchat-workflow-core/src/main/java/cn/langchat/workflow/core/node/ 目录下创建新的文件夹,文件夹名称使用小写格式:
2. 创建必需的三个Java文件
每个节点都必须包含以下三个文件:2.1 节点主类 (XxxNode.java)
这是节点的核心实现类,必须实现WorkflowNode<T> 接口:
2.2 节点上下文类 (XxxContext.java)
这是节点的上下文类,继承自BaseContext:
2.3 节点参数字段枚举 (XxxParamFields.java)
这是节点参数的字段定义,使用枚举形式:3. 核心接口和基类说明
3.1 WorkflowNode<T> 接口
所有节点都必须实现这个接口:
3.2 BaseContext 基类
提供通用的上下文功能:- 参数验证
- 参数值获取
- 变量替换
- 基础数据管理
getAlias()- 获取节点别名,用于变量输出
3.3 CommonParamFields 通用字段
定义所有节点共享的参数字段:4. 节点输出管理
节点输出通过WorkflowMessagePusher 统一处理,这是所有消息推送和变量输出的单一入口:
4.1 单变量输出(推荐)
大多数节点只输出一个text 字段,使用 WorkflowMessagePusher.addNodeOutput():
4.2 多变量输出
对于需要输出多个变量的节点,使用WorkflowMessagePusher.addNodeOutputs():
4.3 推送消息流给前端
对于需要流式推送消息的节点(如LLM、代码执行等),使用WorkflowMessagePusher.pushMessageFlux() 或 pushSingleEvent():
4.4 动态输出(用户定义字段)
对于参数提取器等节点,用户在前端定义的字段会存储在 params 中。业务代码直接使用这些字段:8. 开发规范
8.1 输出处理原则
- ✅ 使用
WorkflowMessagePusher.addNodeOutput()- 用于单个 text 字段输出(推荐) - ✅ 使用
WorkflowMessagePusher.addNodeOutputs()- 用于多个字段输出 - ✅ 使用
WorkflowMessagePusher.pushMessageFlux()- 用于推送消息流给前端 - ✅ 直接生成输出数据 - 不依赖于框架级别的 OutputConfig,让业务代码决定输出结构
- ✅ 对于动态输出 - 在业务代码中直接解析前端配置的字段
- ❌ 直接调用
WorkflowState.addBusinessMessageFlux()- 改用 WorkflowMessagePusher - ❌ 直接调用
OutputResolver- 改用 WorkflowMessagePusher - ❌ 手动构建 Flux 对象 - WorkflowMessagePusher 已经封装了这些细节
8.2 参数获取和验证
8.3 输出同步
{{#llm_a1b2.text#}}- 引用 LLM 节点的 text 输出{{#extract_7c9d.name#}}- 引用参数提取器节点的 name 字段{{#sys.message#}}- 引用系统消息
9. 高级功能
9.1 自定义参数获取
在Context类中添加自定义方法,简化参数获取:9.2 类型转换
系统自动处理前端组件类型到Java类型的转换:- Input/TextArea → String
- InputNumber → Integer
- Switch/Checkbox → Boolean
- Select → String
9.3 变量替换
支持在工作流状态中进行变量替换:9.4 解析前端配置的动态字段
对于参数提取器等节点,前端发送的动态字段配置存储在 params 中,业务代码直接解析:10. 完整示例
文件结构
节点主类 (MyCustomNode.java)
11. 测试和验证
确保节点正确注册并能够被工作流引擎调用:- 检查是否添加了
@Component注解 - 确认包路径正确
- 验证 Spring 容器是否正确扫描
12. 注意事项
- 命名规范: 类名使用PascalCase,文件夹使用小写下划线
- 继承关系: Context类必须继承BaseContext
- 接口实现: Node类必须实现WorkflowNode接口
- 参数验证: 始终进行参数验证
- 异常处理: 合理处理异常情况
- 日志记录: 使用日志记录关键操作
- 类型安全: 使用泛型确保类型安全
- 输出统一: 使用
WorkflowMessagePusher处理节点输出(单一职责入口) - 不要过度设计: 直接在业务代码中处理动态输出,不依赖复杂的框架
- 不要直接调用 WorkflowState: 改用
WorkflowMessagePusher,让它处理所有消息和变量操作
13. 故障排除
节点不生效
- 检查是否正确添加了
@Component注解 - 确认包路径是否正确
- 验证Spring容器是否正确扫描
参数获取失败
- 检查ParamFields枚举定义
- 确认参数名称匹配
- 验证参数类型转换
输出变量无法引用
- 检查是否使用了
WorkflowMessagePusher.addNodeOutput()或WorkflowMessagePusher.addNodeOutputs() - 确认
context.getAlias()返回正确的节点别名 - 验证变量引用格式:
{{#alias.field#}}
消息推送失败
- 检查是否使用了
WorkflowMessagePusher(不要直接调用WorkflowState.addBusinessMessageFlux()) - 确认 Flux 对象正确构建
- 验证 StreamEvent 中包含了正确的数据
更多资源
- 查看现有节点实现作为参考:
llm/LlmNode.java- LLM调用示例reply_node/ReplyNode.java- 简单输出示例code/CodeNode.java- 复杂输出示例form_generator_node/FormGeneratorNode.java- 消息推送示例
- 阅读WorkflowMessagePusher文档了解完整API
- 参考Spring Boot文档了解依赖注入
- 查看Hutool工具类文档

