跳转至

ComfyUI 进阶节点

为什么要学 ComfyUI 进阶节点

ComfyUI 通过节点式工作流提供了最灵活的 Stable Diffusion 操作方式。进阶节点的掌握意味着你能构建复杂的图像生成管线:多模型切换、条件分支、循环处理、批量生成、视频生成等。理解节点系统的工作原理,可以让你创建其他工具无法实现的创作流程,并将工作流保存和分享给他人。


核心概念

概念白话解释用途
Workflow工作流节点连线构成的完整处理管线
Node节点单个处理步骤
Widget控件节点上的参数设置
Link连线节点间的数据传递
Custom Node自定义节点社区开发的扩展功能
Group节点组将多个节点组合管理

安装配置

基础安装

git clone https://github.com/comfyanonymous/ComfyUI.git
cd ComfyUI
pip install -r requirements.txt

# 启动
python main.py --listen 0.0.0.0 --port 8188

# 低显存
python main.py --lowvram

自定义节点管理器(必装)

cd ComfyUI/custom_nodes
git clone https://github.com/ltdrdata/ComfyUI-Manager.git

# 重启 ComfyUI 后在界面中使用 Manager 安装其他节点

推荐自定义节点

ComfyUI-Manager            # 节点管理器
ComfyUI-Impact-Pack         # 检测、分割、修复
ComfyUI-Inspire-Pack        # 创意工具集
ComfyUI_IPAdapter_plus      # IP-Adapter 风格迁移
ComfyUI-AnimateDiff-Evolved # 视频生成
ComfyUI_Comfyroll           # 实用工具节点
ComfyUI-KJNodes             # 高级流程控制
efficiency-nodes-comfyui    # 效率节点
ComfyUI-Advanced-ControlNet # 高级 ControlNet
rgthree-comfy               # 便捷工具

快速上手

基础工作流

基本 txt2img 工作流节点连接:

CheckpointLoader → MODEL/CLIP/VAE
CLIPTextEncode (positive) → CONDITIONING
CLIPTextEncode (negative) → CONDITIONING
EmptyLatentImage → LATENT
KSampler (model, positive, negative, latent) → LATENT
VAEDecode → IMAGE
SaveImage

常用核心节点

模型加载:
- CheckpointLoaderSimple: 加载 Checkpoint
- LoraLoader: 加载 LoRA
- ControlNetLoader: 加载 ControlNet
- VAELoader: 加载 VAE

编码:
- CLIPTextEncode: 文本编码
- CLIPVisionEncode: 图像编码
- VAEEncode: 图像→潜空间
- VAEDecode: 潜空间→图像

采样:
- KSampler: 标准采样器
- KSamplerAdvanced: 高级采样(更多参数控制)
- SamplerCustom: 完全自定义采样

图像处理:
- ImageScale: 缩放
- ImageComposite: 合成
- ImageBlend: 混合
- ImageBatch: 批量处理

进阶用法

IP-Adapter 风格迁移

工作流:
1. IPAdapterModelLoader → 加载 IP-Adapter 模型
2. CLIPVisionLoader → 加载 CLIP Vision
3. LoadImage → 参考风格图片
4. CLIPVisionEncode → 编码参考图片
5. IPAdapterApply → 应用到模型
6. 正常 KSampler 流程

参数调优:
- weight: 0.5-1.0(风格强度)
- noise: 0.0-0.5(增加变化性)
- weight_type: standard/prompt_is_more_important

ControlNet 多条件控制

同时使用 OpenPose + Depth:

ControlNetLoader (openpose) → ControlNet Model 1
ControlNetLoader (depth)    → ControlNet Model 2

ControlNetApply:
  conditioning → positive
  control_net  → ControlNet Model 1
  image        → OpenPose 图
  strength     → 0.8
ControlNetApply:
  conditioning → 上一个输出
  control_net  → ControlNet Model 2
  image        → Depth 图
  strength     → 0.5
KSampler

Inpaint 修复工作流

1. LoadImage → 原始图像
2. LoadImage → 遮罩(黑白图,白色=修复区域)
3. VAEEncodeForInpaint:
   - pixels: 原始图像
   - mask: 遮罩
   - grow_mask_by: 6  # 遮罩扩展像素
4. KSampler → 采样
5. VAEDecode → 输出

高清放大工作流

两阶段放大(Hires Fix):

第一阶段:正常生成 512x512
  EmptyLatentImage(512,512) → KSampler → VAEDecode → IMAGE

第二阶段:放大到 1024x1024
  ImageScale(2x) → VAEEncode → KSampler(denoise=0.5) → VAEDecode

或使用 Ultimate SD Upscale 节点:
  IMAGE → UltimateSDUpscale → 自动切片放大拼接

批量生成与循环

# 通过 API 批量生成
import json
import requests
from pathlib import Path

# 加载工作流
workflow = json.loads(Path("workflow.json").read_text())

# 修改提示词批量生成
prompts = ["a cat", "a dog", "a bird", "a fish"]

for prompt in prompts:
    # 找到 CLIPTextEncode 节点并修改
    for node_id, node in workflow.items():
        if node.get("class_type") == "CLIPTextEncode":
            if "positive" in str(node.get("_meta", {}).get("title", "")):
                node["inputs"]["text"] = prompt

    # 提交到 ComfyUI
    response = requests.post(
        "http://localhost:8188/prompt",
        json={"prompt": workflow}
    )

视频生成(AnimateDiff)

AnimateDiff 工作流:

1. CheckpointLoader → MODEL
2. AnimateDiffLoader:
   - model: AnimateDiff motion module
   - model_name: v3_adapter_sd15
3. AnimateDiffCombine → 合并为视频
4. 正常 KSampler 流程
5. VideoCombine → 输出 MP4/GIF

关键参数:
- frames: 16-32(帧数)
- fps: 8-12
- motion_scale: 0.5-1.0

API 集成

import websocket
import json
import uuid

def queue_prompt(prompt, server="127.0.0.1:8188"):
    """提交工作流到 ComfyUI"""
    client_id = str(uuid.uuid4())

    # 通过 WebSocket 监控进度
    ws = websocket.WebSocket()
    ws.connect(f"ws://{server}/ws?clientId={client_id}")

    # 提交
    response = requests.post(
        f"http://{server}/prompt",
        json={"prompt": prompt, "client_id": client_id}
    )
    prompt_id = response.json()["prompt_id"]

    # 等待完成
    while True:
        msg = json.loads(ws.recv())
        if msg["type"] == "executing" and msg["data"]["node"] is None:
            break

    # 获取结果
    history = requests.get(f"http://{server}/history/{prompt_id}").json()
    return history[prompt_id]["outputs"]

常见问题

Q: 工作流导入报错"节点未找到"?

通过 ComfyUI-Manager 安装缺失的自定义节点。Manager 可以自动检测工作流需要的节点并一键安装。

Q: 如何分享工作流?

  1. 在界面中 Save 为 JSON
  2. 或使用 Save (API Format) 导出
  3. 分享 JSON 文件,其他人 Load 即可使用

Q: 与 WebUI 相比的优势?

  • 节点系统更灵活,可构建任意复杂流程
  • 内存管理更高效
  • 工作流可复现和分享
  • 更适合批量生产和集成

Q: 显存不足怎么办?

  • --lowvram--novram 参数
  • 减少批量大小
  • 使用更小的模型
  • 分步骤生成(先小图后放大)

参考资源

  • GitHub:https://github.com/comfyanonymous/ComfyUI
  • 自定义节点列表:https://github.com/WASasquatch/comfyui-plugins
  • ComfyUI Manager:https://github.com/ltdrdata/ComfyUI-Manager
  • 工作流分享:https://comfyworkflows.com/
  • 教程:https://comfyanonymous.github.io/ComfyUI_examples/