目次

ComfyUI API 入門:Python で画像生成を自動化

ComfyUI は HTTP サーバーとして動作し、画面上での実行も実際には API の呼び出しです。プログラムからワークフローを送信すれば、次のことができます。

  • 大量の画像を一括生成する(例:100 個の商品それぞれの画像を 1 枚ずつ生成する)
  • ComfyUI を自分の Web サイト、チャットボット、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システムと GPU の情報

デプロイ時の注意

  • ComfyUI の API には認証機能がありません。インターネットに直接公開しないでください。自分のバックエンドプログラムから呼び出し、バックエンド側で認証と利用量の制限を行います。
  • 別のコンピューターから呼び出す場合は、ComfyUI の起動時に --listen を付け、ファイアウォールで接続元を制限します。
  • 長時間の一括生成では、output フォルダーを定期的に整理してください。

ComfyUI を n8n に統合することもできます。HTTP Request ノードでワークフローを送信し、Wait とループで結果を確認します。n8n の使い方は n8n チュートリアル をご覧ください。

更新日 2026年10月12日