ComfyUI 使用方式与典型场景
使用方式与典型场景
示例一:最小可用的 txt2img 工作流
这是所有人第一张图都要连的六节点链路,连完就能出图:
- Load Checkpoint 加载一个 checkpoint,它输出 MODEL、CLIP、VAE 三路。
- 第一个 CLIP Text Encode 接 CLIP,text 写正向提示词;第二个 CLIP Text Encode 接同一个 CLIP,text 写负向提示词。
- Empty Latent Image 设置宽高与 batch_size,得到一张全噪声的 latent。
- KSampler 的 model 接 Load Checkpoint 的 MODEL,positive 接正向文案节点,negative 接负向文案节点,latent_image 接 Empty Latent Image。
- VAE Decode 的 samples 接 KSampler 输出,vae 接 Load Checkpoint 的 VAE。
- Save Image 接 VAE Decode 的 IMAGE,填一个 filename_prefix,点 Queue Prompt。
关键节点的参数大致这样设:
| 节点 | 参数 | 常用值 |
|---|---|---|
| Empty Latent Image | width / height / batch_size | 按出图比例设置,如 512x768 或 832x1216;batch_size 从 1 开始 |
| KSampler | steps | 20 到 30 之间起步 |
| KSampler | cfg | 5 到 8 之间起步 |
| KSampler | sampler_name / scheduler | 先用 dpmpp_2m 配 karras,再横向对比 |
| KSampler | denoise | 1.0(纯文生图) |
| KSampler | seed | 先固定一个数,便于排查问题 |
调好之后,用界面上的 Save 把工作流存成 JSON;也可以在设置里打开开发者模式选项,用「Save (API Format)」导出 API 格式,这是下一步自动化的输入文件。
示例二:用 API 模式批量提交
ComfyUI 的队列接口是 POST /prompt,请求体结构是 {"prompt": {...}, "client_id": "..."}。其中 prompt 的每个键是节点 id,值是带 class_type 与 inputs 的对象,节点之间的连线用「节点 id 加输出序号」的数组表示,例如 ["4", 0] 表示取第 4 号节点的第 0 路输出。
{
"prompt": {
"3": {
"class_type": "KSampler",
"inputs": {
"seed": 12345,
"steps": 25,
"cfg": 7,
"sampler_name": "dpmpp_2m",
"scheduler": "karras",
"denoise": 1.0,
"model": ["4", 0],
"positive": ["6", 0],
"negative": ["7", 0],
"latent_image": ["5", 0]
}
},
"4": {
"class_type": "CheckpointLoaderSimple",
"inputs": { "ckpt_name": "your_model.safetensors" }
},
"5": {
"class_type": "EmptyLatentImage",
"inputs": { "width": 832, "height": 1216, "batch_size": 1 }
},
"6": {
"class_type": "CLIPTextEncode",
"inputs": { "text": "a calm classroom, soft light", "clip": ["4", 1] }
},
"7": {
"class_type": "CLIPTextEncode",
"inputs": { "text": "low quality, blurry, watermark", "clip": ["4", 1] }
},
"8": {
"class_type": "VAEDecode",
"inputs": { "samples": ["3", 0], "vae": ["4", 2] }
},
"9": {
"class_type": "SaveImage",
"inputs": { "filename_prefix": "batch_job", "images": ["8", 0] }
}
},
"client_id": "my-script"
}
用 cURL 提交:
curl -X POST http://127.0.0.1:8188/prompt \
-H "Content-Type: application/json" \
-d @workflow_api.json
用 Python 循环改参数、批量提交:
import json
import requests
API = "http://127.0.0.1:8188"
with open("workflow_api.json", "r", encoding="utf-8") as f:
wf = json.load(f)
for i, seed in enumerate(range(1000, 1010)):
wf["prompt"]["3"]["inputs"]["seed"] = seed
wf["prompt"]["9"]["inputs"]["filename_prefix"] = f"job_{i:03d}"
r = requests.post(f"{API}/prompt", json=wf, timeout=30)
print(r.status_code, r.json().get("prompt_id"))
几个配套接口:GET /history/{prompt_id} 查任务结果与输出文件名,GET /view?filename=...&subfolder=...&type=output 下载图片,GET /queue 看队列,POST /interrupt 中断当前任务。需要实时进度可以连 WebSocket /ws?clientId=...,采样进度会推送过来。更稳的做法是导出 API 格式的工作流当模板,脚本只负责替换提示词、seed 与输出前缀,不改图结构。
适合与不适合的场景
| 适合 | 不适合 |
|---|---|
| 需要固定流程反复出图,要求结果可复现 | 只想随手试几个词看效果,节点图反而是负担 |
| 要同时挂 LoRA、ControlNet、IPAdapter 组合控制 | 完全不想碰命令行和依赖安装 |
| 要接进已有系统批量出图、按排期跑任务 | 只需要一两张图,用更简单的工具更快 |
| 团队协作,工作流需要交接与版本管理 | 图里需要准确的中文长文本,扩散模型普遍不稳 |
