创建新节点指南(前端)
概述
本指南将帮助您快速创建新的工作流节点。前端节点系统采用动态注册机制,只需按照标准结构创建文件即可自动注册。核心概念
架构设计
每个节点包含三个核心文件:数据流
创建步骤
1. 创建节点文件夹
在langchat-ui/apps/langchat/src/views/workflows/node/ 目录下创建新文件夹:
2. 创建节点配置 (config.ts)
基础结构
paramSchemas 字段定义
paramSchemas 是表单的 JSON Schema 定义,每个字段包含:
| 组件类型 | 说明 | 常用属性 |
|---|---|---|
Input | 输入框 | placeholder, type |
Select | 下拉选择 | placeholder, options |
Switch | 开关 | - |
InputNumber | 数字输入 | placeholder, min, max |
DatePicker | 日期选择 | - |
RadioGroup | 单选组 | options |
CheckboxGroup | 多选组 | options |
InputPassword | 密码输入 | placeholder |
表单字段联动(dependencies)
当需要实现表单字段的动态显示、禁用、必填等联动效果时,使用dependencies 字段配置:
| 属性 | 类型 | 说明 | 返回值 |
|---|---|---|---|
show | 函数 | 控制字段显示/隐藏 | true 显示,false 隐藏 |
disabled | 函数 | 控制字段禁用状态 | true 禁用,false 启用 |
required | 函数 | 控制字段是否必填 | true 必填,false 非必填 |
rules | 函数 | 动态修改验证规则 | 验证规则字符串或对象 |
componentProps | 函数 | 动态修改组件属性 | 属性对象(会与默认属性合并) |
triggerFields | 数组 | 指定触发重新计算的字段 | 字段名数组 |
- triggerFields:只有指定的字段变化时才会触发 dependencies 重新计算,提高性能
- 函数参数
values:当前表单所有字段的值对象 - show vs 添加条件:使用
show控制显示隐藏,效果为完全移除 DOM - disabled vs required:精细控制字段的禁用和必填状态
params 默认值
params 对象定义了表单的默认值,字段名必须与 paramSchemas 中的 fieldName 一致:
完整示例
3. 创建表单组件 (FormComponent.vue)
基础模板
插槽自定义渲染
当需要自定义某个字段的渲染时,使用插槽:4. 常用插槽类型
4.1 模型选择器 (modelId)
用于选择 AI 模型:| 属性 | 类型 | 说明 | 默认值 |
|---|---|---|---|
modelValue / v-model | string | 选中的模型ID | - |
type | ModelTypeEnum | 模型类型过滤 | text2text |
provider | string | 供应商过滤 | - |
showConfig | boolean | 是否显示参数配置面板 | true |
config / v-model:config | ModelConfig | 模型参数配置 | - |
4.2 变量引用输入 (input)
用于引用其他节点的输出变量:4.3 提示词选择器 (promptText)
支持选择预设提示词或手动输入:4.4 自定义复杂组件
当需要处理复杂的数据结构(如动态列表、嵌套对象)时,创建独立组件:- 必须支持
v-model双向绑定(通过modelValue和update:modelValue) - 接收
nodeprop 以访问节点数据 - 使用
v-bind="field"传递表单字段属性
5. 创建节点主组件 (index.vue)
节点主组件在画布上展示,结构固定:完整示例
基础节点参考: 查看llm-node 了解简单节点的完整实现
字段联动示例: 参考 form-generator-node/FormComponent.vue(演示 dependencies 用法)
字段联动(dependencies)的常见场景:
- 条件显示:根据其他字段值决定是否显示某个字段
- 条件必填:根据其他字段值动态修改必填状态
- 条件禁用:根据其他字段值控制字段是否禁用
- 动态选项:根据其他字段值改变下拉选择的可选项
配置参考
节点分类 (nodeType)
| 值 | 说明 |
|---|---|
NodeTypeEnum.Common | 普通节点 |
NodeTypeEnum.Start | 开始节点 |
NodeTypeEnum.End | 结束节点 |
NodeTypeEnum.IF | 条件节点 |
节点分组 (group)
| 值 | 说明 |
|---|---|
GroupEnum.AI | AI能力 |
GroupEnum.Base | 基础节点 |
GroupEnum.Tool | 工具 |
GroupEnum.Model | 多模态 |
GroupEnum.Output | 输入&输出 |
GroupEnum.Message | 消息渠道 |
验证规则 (rules)
| 规则 | 说明 |
|---|---|
'required' | 必填 |
z.string().email() | 邮箱格式 |
z.string().min(6) | 最小长度 |
z.number().min(0).max(100) | 数字范围 |
开发规范
1. 命名规范
- 文件夹:kebab-case(如
my-custom-node) - 节点类型:PascalCase + Node(如
MyCustomNode) - 文件名:PascalCase(如
FormComponent.vue)
2. 必须规则
- ✅
paramSchemas定义表单字段 - ✅
params定义默认值(字段名必须与 paramSchemas 一致) - ✅
FormComponent.vue使用useVbenForm - ✅ 通过
handleValuesChange自动同步数据 - ✅ 使用插槽自定义复杂组件
- ✅ 包裹在
NodeValidationMixin中进行验证
3. 禁止事项
- ❌ 不要在 FormComponent 中直接使用 NaiveUI 表单组件(应通过 paramSchemas 定义)
- ❌ 不要手动同步表单值(应使用 handleValuesChange)
- ❌ 不要在 params 中定义 paramSchemas 没有的字段
- ❌ 不要忘记在 onMounted 中初始化表单值
4. 插槽命名
插槽名称 必须 与paramSchemas 中的 fieldName 完全一致:
测试与验证
1. 检查节点注册
- 刷新页面,节点应该自动出现在节点面板中
- 检查节点的分组、颜色、图标是否正确
2. 测试表单功能
- 拖拽节点到画布
- 测试表单字段的输入、验证
- 检查
node.data.params是否正确更新 - 测试保存和加载功能
3. 调试技巧
常见问题
Q: 表单值没有同步到 node.data.params?
A: 检查handleValuesChange 是否正确配置,确保 props.node.data.params = values
Q: 插槽不生效?
A: 检查插槽名称是否与paramSchemas 中的 fieldName 完全一致
Q: 表单验证失败?
A: 检查paramSchemas 中的 rules 配置,确保必填字段有默认值
Q: 自定义组件数据不同步?
A: 确保自定义组件支持v-model(实现 modelValue prop 和 update:modelValue emit)
节点输出配置
输出类型概述
节点输出分为两种类型:| 类型 | 说明 | 使用场景 |
|---|---|---|
| 静态输出 | 输出字段固定不变 | LLM 节点始终输出 text;始终输出相同的多个字段 |
| 动态输出 | 输出字段由用户配置决定 | 参数提取器节点、表单生成器节点等 |
静态输出配置
在config.ts 中使用 data.outputs 定义固定的输出字段:
动态输出配置
当输出字段由用户在表单中配置时,在业务代码中直接操作node.data.outputs 数组:
参考实现:
form-generator-node/FormComponent.vue- 在updateDynamicOutputs()函数中直接操作 outputs 数组parameter-extractor-node/ExtractionVariables.vue- 在syncOutputs()函数中直接操作 outputs 数组
变量引用格式
前端通过以下格式引用节点输出变量:{{#llm_a1b2.text#}}- 引用 LLM 节点的 text 输出{{#extract_7c9d.age#}}- 引用参数提取器节点的 age 字段{{#sys.message#}}- 引用系统消息
参考资源
- 示例节点:
llm-node、code-node、variable-update-node - 动态输出示例:
parameter-extractor-node - 公共组件:
#/views/workflows/common/ - 输出解析器:
#/views/workflows/utils/outputResolver.ts - 表单适配器:
#/adapter/form - Vue Flow 文档:https://vueflow.dev
总结
前端节点创建的核心流程:- config.ts:定义
paramSchemas(表单结构)、params(默认值)和data.outputs(输出字段) - FormComponent.vue:使用
useVbenForm渲染表单,通过handleValuesChange自动同步数据到node.data.params - 插槽自定义:通过
#fieldName插槽自定义复杂组件(模型选择、变量引用、动态列表等) - 动态输出:当用户配置的字段影响输出时,在自定义组件中直接修改
node.data.outputs数组 - index.vue:使用
NodeLayout和NodeArgInfoCard展示节点及其输出变量
快速参考
| 场景 | 参考文件 |
|---|---|
| 基础节点 | llm-node/config.ts、llm-node/FormComponent.vue |
| 字段联动 | form-generator-node/FormComponent.vue(dependencies 用法) |
| 动态输出 | form-generator-node/FormComponent.vue、parameter-extractor-node/ExtractionVariables.vue |
| 模型选择 | 参考 llm-node 中的 ModelSelector 插槽 |
| 变量引用 | 参考 llm-node 中的 VarReferenceInput 插槽 |

