Modly如何处理多节点扩展?复合节点ID设计全解析
【免费下载链接】modlyDesktop app to generate 3D models from images or prompt using local AI — runs entirely on your GPU项目地址: https://gitcode.com/GitHub_Trending/mo/modly
Modly 是一款可在本地 GPU 上运行的 3D 模型生成桌面应用,支持从图片或文字提示词生成 3D 模型。它的可视化工作流系统允许用户安装各种扩展(Extension),而一个扩展往往包含多个节点。为了让这些节点在画布上互不冲突地被识别、执行和展示,Modly 采用了一套简洁的复合节点 ID(extension_id/node_id)设计。本文带你轻松看懂这套机制的来龙去脉。
先搞懂:一个扩展可以包含多个节点
Modly 的每个扩展都带有一份manifest.json清单文件,其中的nodes数组声明了该扩展向工作流提供的所有节点。以内置的网格平滑扩展为例,它声明了一个smooth节点:
- 扩展 ID:
mesh-smoother - 节点 ID:
smooth - 输入 / 输出:
mesh → mesh - 参数:迭代次数、平滑强度、模式(Taubin / Laplacian)
清单定义见 src/areas/workflows/nodes/mesh-smoother/manifest.json。
也就是说,扩展是"安装包",节点才是工作流画布上真正被拖拽和连线的基本单位。一个扩展装进去后,可能同时带来好几个节点。
核心设计:扩展ID/节点ID复合标识
如果只用节点 ID(比如smooth),不同扩展里同名的节点就会打架。Modly 的解法是在构建扩展列表时,把两者拼成一个斜杠分隔的复合 ID:
mesh-smoother / smooth ├─ 扩展 ID(extensionId) └─ 节点 ID(nodeId)这一拼接逻辑位于 src/areas/workflows/mockExtensions.ts 的buildAllWorkflowExtensions函数中:它遍历所有流程类和模型类扩展的nodes,为每个节点生成一条WorkflowExtension记录。每条记录同时保留三层信息:
| 字段 | 含义 | 示例 |
|---|---|---|
id | 复合 ID,画布节点用它做唯一键 | mesh-smoother/smooth |
extensionId | 父扩展 ID,用于 IPC 调用 | mesh-smoother |
nodeId | 节点在扩展内的 ID | smooth |
接口定义见 src/areas/workflows/mockExtensions.ts。这样设计的好处很直接:复合 ID 保证全局唯一,拆开后又能分别拿到"该调哪个扩展"和"该调哪个节点",一份数据满足所有场景。
运行时如何拆解复合 ID 并执行?
当工作流运行到某个扩展节点时,执行器会把复合 ID 按斜杠拆开,前半部分定位扩展进程,后半部分告诉扩展"执行哪个节点":
parts[0]→extId(扩展 ID)parts[1]→nid(节点 ID,作为nodeId传给扩展)
这个拆解与调用的关键逻辑在 src/areas/workflows/workflowRunStore.ts 中,最终通过window.electron.extensions.runProcess把扩展 ID、节点 ID、输入文件和参数一起交给扩展执行。整个过程中,节点的实际标识(React Flow 画布上的node.id)与扩展的复合 ID 是相互独立的——画布 ID 只负责布局与连线,复合 ID 才负责"我是谁、我该跑什么"。
画布上如何呈现:按扩展分组展示
在节点面板里,内置节点平铺展示,而第三方扩展则按父扩展 ID 分组折叠,同属一个扩展的多个节点被收纳在同一组下,方便查找与拖拽。分组逻辑见 src/areas/workflows/WorkflowsPage.tsx。
节点被拖入画布后,会以extensionId字段保存它引用的复合 ID,再由 src/areas/workflows/nodes/ExtensionNode.tsx 反查对应的扩展定义,渲染出输入/输出端口、参数表单和执行状态。多输入扩展还支持按端口索引(input-0、input-1)区分不同类型的数据线。
小结:三层 ID 各司其职
Modly 的多节点扩展体系可以用一句话概括:扩展 ID 负责定位安装包,节点 ID 负责定位具体功能,复合 ID 负责全局唯一寻址。
- 声明层:
manifest.json的nodes数组定义扩展包含哪些节点 - 构建层:
buildAllWorkflowExtensions拼出扩展ID/节点ID复合标识 - 执行层:
workflowRunStore拆解复合 ID,把扩展 ID 和节点 ID 分别传给扩展进程 - 展示层:节点面板按扩展分组,
ExtensionNode按复合 ID 反查定义并渲染
这套设计简单却非常实用,也是 Modly 工作流系统能够稳定运行多扩展、多节点协作的关键。想深入了解,可从 src/areas/workflows/ 目录下的源码入手。
【免费下载链接】modlyDesktop app to generate 3D models from images or prompt using local AI — runs entirely on your GPU项目地址: https://gitcode.com/GitHub_Trending/mo/modly
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考