目次
ComfyUI API 入門:Python で画像生成を自動化
ComfyUI は HTTP サーバーとして動作し、画面上での実行も実際には API の呼び出しです。プログラムからワークフローを送信すれば、次のことができます。
- 大量の画像を一括生成する(例:100 個の商品それぞれの画像を 1 枚ずつ生成する)
- ComfyUI を自分の Web サイト、チャットボット、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 | システムと GPU の情報 |
デプロイ時の注意
- ComfyUI の API には認証機能がありません。インターネットに直接公開しないでください。自分のバックエンドプログラムから呼び出し、バックエンド側で認証と利用量の制限を行います。
- 別のコンピューターから呼び出す場合は、ComfyUI の起動時に
--listenを付け、ファイアウォールで接続元を制限します。 - 長時間の一括生成では、
outputフォルダーを定期的に整理してください。
ComfyUI を n8n に統合することもできます。HTTP Request ノードでワークフローを送信し、Wait とループで結果を確認します。n8n の使い方は n8n チュートリアル をご覧ください。
更新日 2026年10月12日