目录
ComfyUI API 教程:用 Python 自动化生成图片
ComfyUI 本身就是一个 HTTP 服务器,界面上的每次运行其实都是在调用它的 API。你可以通过程序提交工作流,实现以下用途:
- 批量生成大量图片(例如为 100 个商品各生成一张图)
- 将 ComfyUI 集成到自己的网站、聊天机器人或 n8n 自动化流程中
- 定时自动生成内容
1. 导出 API 格式的工作流
界面中保存的工作流 JSON 包含布局信息,而 API 需要另一种精简格式:
- 在 ComfyUI 中创建并测试好工作流。
- 左上角菜单 → File → Export (API),保存为
workflow_api.json。

API 格式如下,每个节点以 ID 为键:
{
"3": {
"class_type": "KSampler",
"inputs": {
"seed": 123456,
"steps": 25,
"cfg": 6,
"sampler_name": "dpmpp_2m",
"scheduler": "karras",
"denoise": 1,
"model": ["4", 0],
"positive": ["6", 0],
"negative": ["7", 0],
"latent_image": ["5", 0]
}
},
"6": {
"class_type": "CLIPTextEncode",
"inputs": { "text": "a cat sitting on a windowsill", "clip": ["4", 1] }
}
}
["4", 0] 表示“节点 4 的第 0 个输出”。记下需要修改的节点 ID(例如正向提示词节点是 6,KSampler 是 3)。
2. 提交任务
curl -X POST http://127.0.0.1:8188/prompt \
-H "Content-Type: application/json" \
-d "{\"prompt\": $(cat workflow_api.json)}"
响应中的 prompt_id 用于查询结果。
3. Python 完整示例
import json
import random
import time
import urllib.parse
import urllib.request
SERVER = "http://127.0.0.1:8188"
def queue(workflow: dict) -> str:
data = json.dumps({"prompt": workflow}).encode()
req = urllib.request.Request(f"{SERVER}/prompt", data=data, headers={"Content-Type": "application/json"})
return json.load(urllib.request.urlopen(req))["prompt_id"]
def wait_for(prompt_id: str) -> dict:
while True:
history = json.load(urllib.request.urlopen(f"{SERVER}/history/{prompt_id}"))
if prompt_id in history:
return history[prompt_id]
time.sleep(1)
def download_images(result: dict, prefix: str):
for node_output in result["outputs"].values():
for i, img in enumerate(node_output.get("images", [])):
query = urllib.parse.urlencode(
{"filename": img["filename"], "subfolder": img["subfolder"], "type": img["type"]}
)
with urllib.request.urlopen(f"{SERVER}/view?{query}") as r, open(f"{prefix}_{i}.png", "wb") as f:
f.write(r.read())
workflow = json.load(open("workflow_api.json", encoding="utf-8"))
subjects = ["a red bicycle", "a vintage camera", "a cup of bubble tea"]
for n, subject in enumerate(subjects):
workflow["6"]["inputs"]["text"] = f"product photo of {subject}, white background, studio lighting"
workflow["3"]["inputs"]["seed"] = random.randint(0, 2**32 - 1)
pid = queue(workflow)
print("已提交", subject, pid)
download_images(wait_for(pid), f"product_{n}")
print("已完成", subject)
将 "6"、"3" 替换为工作流中对应的节点 ID。
上传输入图片
需要输入图片进行图生图或使用 ControlNet 时,先上传图片:
curl -X POST http://127.0.0.1:8188/upload/image -F "image=@./input.jpg"
响应会提供文件名,将它填入 Load Image 节点的 image 字段。
实时进度:WebSocket
连接到 ws://127.0.0.1:8188/ws?clientId=自定义ID(提交任务时在 JSON 中带上相同的 client_id),即可实时收到正在运行的节点、进度百分比和完成通知,适合用于制作带进度条的界面。
其他常用端点
| 端点 | 用途 |
|---|---|
GET /queue | 当前队列 |
POST /interrupt | 中断当前运行 |
GET /history | 历史记录 |
GET /object_info | 所有节点的定义(输入、输出、选项) |
GET /system_stats | 系统与显卡信息 |
部署注意事项
- ComfyUI 的 API 没有身份验证机制,不要直接暴露到互联网。通过自己的后端程序调用,并在后端做好身份验证和用量限制。
- 从其他电脑调用时,启动 ComfyUI 需要添加
--listen,并用防火墙限制来源。 - 长时间批量生成时,记得定期清理
output文件夹。
你也可以将 ComfyUI 集成到 n8n:使用 HTTP Request 节点提交工作流,再通过 Wait 和循环查询结果。n8n 的用法见 n8n 教程。
更新于 2026年10月12日