当用户需要弃用一个工作流节点(保留向后兼容、隐藏出模板面板)时触发该 skill。FastGPT 工作流节点的弃用流程标准化封装,覆盖模板、Dispatcher、UI 引用等所有需要改动的位置。
68
81%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
当用户需要"弃用 / 废弃 / 下线 / 不再推荐使用"某个工作流节点(例如 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 —— 节点级徽章已足够,字段级是独立机制(用于"留住节点、淘汰单个字段"的场景)。dc97c08
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.