目录

ComfyUI API 教程:用 Python 自动化生成图片

ComfyUI 本身就是一个 HTTP 服务器,界面上的每次运行其实都是在调用它的 API。你可以通过程序提交工作流,实现以下用途:

  • 批量生成大量图片(例如为 100 个商品各生成一张图)
  • 将 ComfyUI 集成到自己的网站、聊天机器人或 n8n 自动化流程中
  • 定时自动生成内容

1. 导出 API 格式的工作流

界面中保存的工作流 JSON 包含布局信息,而 API 需要另一种精简格式:

  1. 在 ComfyUI 中创建并测试好工作流。
  2. 左上角菜单 → File → Export (API),保存为 workflow_api.json。
ComfyUI 左上角菜单
ComfyUI 左上角菜单:File 子菜单中有打开、保存、导出,也可以从这里浏览模板

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日