目錄

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日