>_ DevTrendszh

语言

首页

语言

板块

前端 后端 移动端 DevOps AI / ML 游戏开发 区块链 嵌入式 安全
Python

深入理解 ComfyUI 模板工厂的内部工作原理

如果你使用过 ComfyUI,你可能记得这种感觉:打开别人的工作流后,看到的却是一堆红色节点报错。缺少几个节点,模型放错了文件夹,完全不知道从哪里开始整理流程图。为了解决这个问题,ComfyUI 团队创建了 workflow_templates 仓库。

这不仅仅是 JSON 方案文件的简单堆砌。开发者构建了一个 monorepo,将现成的场景和子图转换为 Python 包库,自动更新模板展示,并直接从 Hugging Face 拉取所需的神经网络模型到应用界面中。

仓库内部结构

Comfy-Org/workflow_templates 官方仓库解决了两个需求:提供现成的生成模板(图像、视频、音频)和可复用的节点块,即 Subgraph Blueprints。

项目架构采用按媒体类型分离包的方式:

  • templates/packages/media_* 包含 JSON 格式的工作流文件和选择界面的预览图。
  • blueprints/packages/blueprints 存储现成的组合节点(子图),显示在节点面板中。
  • packages/core 提供辅助加载器 comfyui-workflow-templates-core。
  • site/ 包含基于 Astro 的网站(templates.comfy.org),支持搜索、11 种语言和描述生成。

整个项目通过 PyPI 分发,包名为 comfyui-workflow-templates。当你更新 ComfyUI 时,新模板会从这里自动进入界面。

标准 ComfyUI 模板的组成

项目最有趣的部分是模板组装要求。开发者不仅仅是导出流程图,而是将其转换为独立的功能包。

以添加基于 Wan 2.1 模型的视频生成模板为例。一个工作流要成为官方模板,作者需要经过几个必要步骤。

首先,清理方案。使用 --disable-all-custom-nodes 标志运行 ComfyUI。这确保第三方扩展不会在 JSON 中添加额外的元数据。

然后准备预览。为模板创建图片、WebP 动画或视频。调整尺寸使文件尽可能小。通常使用压缩,质量降至 65%。

接下来,将模型绑定直接嵌入节点。用户无需手动搜索需要下载哪个 VAE 或 CLIP 模型。直接从 Hugging Face 获取的直链、SHA256 哈希值和目标目录被直接添加到节点属性中(properties.models)。

以下是将 VAE 模型元数据嵌入工作流 JSON 文件的样子:

{
  "id": 39,
  "type": "VAELoader",
  "properties": {
    "Node name for S&R": "VAELoader",
    "models": [
      {
        "name": "wan_2.1_vae.safetensors",
        "url": "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/vae/wan_2.1_vae.safetensors?download=true",
        "hash": "2fc39d31359a4b0a64f55876d8ff7fa8d780956ae2cb13463b0223e15148976b",
        "hash_type": "SHA256",
        "directory": "vae"
      }
    ]
  },
  "widgets_values": ["wan_2.1_vae.safetensors"]
}

通过此条目,ComfyUI 知道缺少哪个文件,验证其校验和,并自动将权重下载到 models/vae 文件夹。

哈希值和链接直接从 Hugging Face 上的文件页面获取。

除了模型,你还可以将最低 ComfyUI 核心版本或特定自定义节点版本嵌入节点属性。例如,节点 SaveWEBM 设置了 "ver": "0.3.26",这样如果用户的客户端版本过旧,就会看到警告。

所有模板都注册在单一配置文件 index.json 中。

这些 Subgraph Blueprints 是什么

除了完整的场景,ComfyUI 还使用子图。十几个节点的复杂组合被打包成具有清晰输入和输出的单个块。

在仓库中,这类块的蓝图存储在 blueprints/ 文件夹中。蓝图文件包含接口描述和内部连接结构:

{
  "id": "workflow-uuid",
  "nodes": [{"id": -1, "type": "subgraph-uuid"}],
  "definitions": {
    "subgraphs": [{
      "id": "subgraph-uuid",
      "name": "Text to Image (Flux.1 Dev)",
      "inputs": [
        {"name": "text", "type": "STRING"},
        {"name": "width", "type": "INT"}
      ],
      "outputs": [
        {"name": "IMAGE", "type": "IMAGE"}
      ],
      "nodes": [],
      "links": []
    }]
  }
}

开发者通过图形界面中的"Create Subgraph"创建这样的节点,导出 JSON,然后运行规范化脚本 import_blueprints.py。之后,该块对所有用户在标准 ComfyUI 节点面板中可用。

构建和本地化自动化

内容工作流程很有意思。每次模板更改都需要同步清单并翻译成 11 种语言。

来自 scripts/sync/ 目录的 Python 脚本处理同步:

  • sync_bundles.py 将模板分发到各个媒体包并组装公共清单。
  • sync_data.py 将更改的字符串拉取到单一翻译文件 i18n.json 并分发本地化文件,如 index.zh.jsonindex.ja.json

位于 site/ 文件夹中的目录站点使用 Astro 构建。在构建期间,它会查询模板中心 API。环境变量 PUBLIC_APPROVED_ONLY 过滤掉未批准用于生产环境的社区工作流,但会将其保留在测试预览环境中。

部署与 GitHub Actions 绑定。每天 00:00 UTC 自动触发测试环境的重建。当根目录 pyproject.toml 中的版本号增加时,CI 会确定哪些子包发生了变化,并向 PyPI 发布新版本。

交互式预览选项

对于目录中的每个模板,定义的是交互元素而非静态图片。仓库支持多种卡片显示选项:

  • 标准图片或 GIF。
  • 前后对比滑块,用于 ControlNet 等处理效果评估。
  • 用于演示生成视频或音频的播放器。
  • 悬停效果,带缩放或平滑帧过渡。

谁会发现这个仓库有用

如果你为 ComfyUI 编写自定义节点或为生成任务构建管道,你应该看看 workflow_templates。

首先,它是 ComfyUI JSON 格式规范的参考指南。从仓库代码中,你可以了解如何正确格式化清单、链接模型依赖项和指定权重哈希值。

其次,你可以提交自己的 Pull Request,包含你的工作流或子图。如果方案通过自动化验证和节点兼容性检查(npm run validate:comfyui-nodes),它将被包含在标准 ComfyUI 发行版中。

要在本地探索结构,只需克隆仓库并运行包生成命令 python scripts/sync/sync_bundles.py

相关项目