目錄
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日