ワンクリックで
deprecate-workflow-node
// 当用户需要弃用一个工作流节点(保留向后兼容、隐藏出模板面板)时触发该 skill。FastGPT 工作流节点的弃用流程标准化封装,覆盖模板、Dispatcher、UI 引用等所有需要改动的位置。
// 当用户需要弃用一个工作流节点(保留向后兼容、隐藏出模板面板)时触发该 skill。FastGPT 工作流节点的弃用流程标准化封装,覆盖模板、Dispatcher、UI 引用等所有需要改动的位置。
当用户请求对本地未提交的代码(或本地分支特定 commit 等)进行代码审查时触发该 skill,对本地变更进行审查。
当用户传入一个 review 的 pr 链接时候,触发该 skill,对 pr 进行代码审查。
当用户需要编写一个单元测试时,触发该 skill,编写单元测试。
当用户需要编写一个单元测试时,触发该 skill,编写单元测试。
当用户请求对本地未提交的代码(或本地分支特定 commit 等)进行代码审查时触发该 skill,对本地变更进行审查。
当用户传入一个 review 的 pr 链接时候,触发该 skill,对 pr 进行代码审查。
| name | deprecate-workflow-node |
| description | 当用户需要弃用一个工作流节点(保留向后兼容、隐藏出模板面板)时触发该 skill。FastGPT 工作流节点的弃用流程标准化封装,覆盖模板、Dispatcher、UI 引用等所有需要改动的位置。 |
当用户需要"弃用 / 废弃 / 下线 / 不再推荐使用"某个工作流节点(例如 LoopNode、RunAppModule 等)时触发。
弃用的目标:
弃用 ≠ 删除。只断"新增入口",不断"运行通路"。
| 维度 | 处理方式 |
|---|---|
| 类型枚举值 | 保留(旧工作流引用) |
| 模板定义 | 移到 abandoned/ 目录,从模板面板列表中移除 |
| Dispatcher | 移到 abandoned/ 目录,添加 @deprecated 注释 |
| moduleTemplatesFlat | 必须保留,否则节点无法在画布上渲染 |
| 节点级 UI 徽章 | 模板加 status: PluginStatusEnum.SoonOffline,节点头部出现黄色"即将下线"标签 + tooltip"请尽快替换" |
| 子节点 / 关联节点 | 仅当确认无其他节点共享时才一并弃用 |
| i18n key | 不动(旧工作流仍会读取 name/intro 文案) |
ℹ️ 字段级
deprecated: true(FlowNodeInputItemType.deprecated/FlowNodeOutputItemType.deprecated)是独立机制,用于在保留节点的前提下淘汰单个字段(旧字段保留兼容、新字段替代)。整节点弃用时不要用它 —— 节点级徽章已经足够指示,再加字段级会让信号过度冗余。
仓库内已有一个完整的弃用案例可参考:FlowNodeTypeEnum.runApp。可通过对比 git log --diff-filter=R -- "**/abandoned/runApp/**" 找到当时的迁移 commit。
操作目标:弃用
<NodeTemplateName>(FlowNodeTypeEnum.<enumKey>)
template/constants.ts:从 systemNodes 移除,确保留在 moduleTemplatesFlatdispatch/constants.ts:加 @deprecated 注释,移到 callbackMap 末尾status: PluginStatusEnum.SoonOffline(节点头部显示"即将下线"黄色标签)在动手之前,先用 grep/Explore 全局搜索节点的所有引用,确认改动范围。需要查的关键字:
# 类型枚举使用点
grep -rn "FlowNodeTypeEnum\.<enumKey>\b" packages/ projects/ --include="*.ts" --include="*.tsx"
# 模板对象(如 LoopNode)
grep -rn "<TemplateExport>\b" packages/ projects/ --include="*.ts"
# 子节点是否被其他容器复用(重要!)
grep -rn "FlowNodeTypeEnum\.<childEnum>" packages/ projects/
输出一份"需要改动 / 无需改动"分类清单。通常无需改动:
useWorkflow.tsx 里嵌入到 PARENT_NODE_TYPES / unsupportedInLoop 这种"运行时识别"列表 —— 旧实例仍要工作。Flow/index.tsx 的 nodeTypes 映射 —— 旧实例需要 UI 渲染。源路径:packages/global/core/workflow/template/system/<dir>/
目标路径:packages/global/core/workflow/template/system/abandoned/<dir>/
操作:
git mv(或 Bash mv)整个目录或仅 parent 节点的 index.ts/type.ts。../)。loopStart/loopEnd 仍被 parallelRun 共用),只移动 parent 节点文件,子节点留在原位置。源路径:packages/service/core/workflow/dispatch/<dir>/<file>.ts
目标路径:packages/service/core/workflow/dispatch/abandoned/<file>.ts
操作:
git mv 文件。/* Abandoned */ 注释(与 dispatch/abandoned/runApp.ts 一致)。packages/global/core/workflow/template/constants.ts// 旧
import { LoopNode } from './system/loop/loop';
// 新
import { LoopNode } from './system/abandoned/loop/index';
// 从 systemNodes 移除(这是模板面板的来源)
const systemNodes: FlowNodeTemplateType[] = [
...
// LoopNode, ← 删除这一行
...
];
// 在 moduleTemplatesFlat 中保留 / 添加(保证旧工作流能解析)
export const moduleTemplatesFlat: FlowNodeTemplateType[] = [
...,
LoopNode, // ← 这里要有
];
⚠️ 验证点:
moduleTemplatesFlat是节点 ID → 模板对象的查找源。必须留,否则旧工作流加载时会找不到节点,画布报错。
packages/service/core/workflow/dispatch/constants.ts// 把 import 路径改成 abandoned 子目录
import { dispatchLoop } from './abandoned/runLoop';
把对应的 callbackMap 条目移到对象末尾,并加 /** @deprecated */ 注释:
export const callbackMap: Record<FlowNodeTypeEnum, Function> = {
// ...其他正常节点...
/** @deprecated */
[FlowNodeTypeEnum.loop]: dispatchLoop
};
status: PluginStatusEnum.SoonOfflineFlowNodeTemplateTypeSchema.status 是节点级的弃用 UI 信号,挂在 NodeCard.tsx 头部由 <NodeStatusBadge /> 渲染:
| 值 | 标签 | 颜色 | tooltip | 适用场景 |
|---|---|---|---|---|
Normal = 1 | 正常 | 蓝 | — | 不弃用 |
SoonOffline = 2 | 即将下线 | 黄 | "请尽快替换" | 弃用但仍可运行(推荐用这个) |
Offline = 3 | 已下线 | 红 | "已无法使用,将中断应用运行,请立即替换" | 强制下线(运行时报错) |
由于弃用的核心理念是"运行通路保留",应当用 SoonOffline;只有当节点被改成"运行时直接抛错"时才用 Offline。
import { PluginStatusEnum } from '../../../../../plugin/type';
export const FooNode: FlowNodeTemplateType = {
id: FlowNodeTypeEnum.foo,
// ...
status: PluginStatusEnum.SoonOffline, // ← 加这个
// ...
};
⚠️ 注意:这字段挂在
FlowNodeTemplateTypeSchema(即system模板的扩展)上,不在FlowNodeCommonTypeSchema上。意思是只对系统节点模板生效,store 里保存的 nodeData 不带 status,每次打开通过moduleTemplatesFlat.find(...)从模板查到。所以只需改模板,不需要数据迁移。
⚠️ schema 上还有一个看似相关的
abandon: z.boolean().optional()(FlowNodeCommonTypeSchema:72)—— 不要用它,整个仓库没有任何 UI/runtime 代码读取它,是死字段。
通常以下文件保持原样(运行时兼容需要):
projects/app/src/pageComponents/app/detail/WorkflowComponents/Flow/index.tsx — nodeTypes 中的 React 渲染映射。projects/app/src/pageComponents/app/detail/WorkflowComponents/Flow/hooks/useWorkflow.tsx — PARENT_NODE_TYPES、unSupportedInLoop 等运行时校验。如果该节点在前端有"添加按钮"快捷入口(不通过模板面板触发),那种入口可以删除。
# typescript 检查
pnpm lint
# 跑相关单测(按改动文件局部跑)
cd packages/service && pnpm test ...
不要全量跑测试,只跑改动相关的。
弃用完成后,确认以下场景:
pnpm lint 通过。Record<FlowNodeTypeEnum, Function> 完整覆盖(不能删 key,否则 TS 报错)。FlowNodeTypeEnum.<enumKey> —— 旧工作流的 JSON 仍写着这个值。moduleTemplatesFlat 移除 —— 旧工作流加载时找不到模板。dispatch/constants.ts 的 callbackMap 删条目 —— 运行时报"unknown node type"。Flow/index.tsx 的 nodeTypes 映射)—— 画布渲染崩。nestedStart/nestedEnd 同时被多个容器使用)。deprecated: true —— 节点级徽章已足够,字段级是独立机制(用于"留住节点、淘汰单个字段"的场景)。