基本的にやっていること

API経由で、ComfyUIのworkflowを「外から」実行してみます。

やることはシンプルで、API形式JSON(= prompt)を http://127.0.0.1:8188/prompt にPOSTする だけです。

これでComfyUIサーバは「そのworkflowを実行して」と命令を受け取り、キューに積んで実行し、prompt_id(実行ID)を返します。

少しややこしいのですが、ここで出てくる「prompt」はテキストプロンプトではなく、ワークフロー全体(実行グラフ) のことです。
テキストはその一部で、たとえば CLIPTextEncodeinputs.text などが該当します。

今回は、Pythonから実行してみましょう。


ComfyUIを起動しておく

APIは「ComfyUIを起動しなくてよくなる仕組み」ではありません。
Pythonは、起動中のComfyUIサーバに対して命令を送ります。

  • ComfyUIを起動しておきます
  • ブラウザで http://127.0.0.1:8188 を開ける状態にします

API用のworkflowを用意する

今回使うworkflow(SD1.5 text2image)

ひとまず、最もシンプルなStable Diffusion 1.5のtext2imageを使います。

SD1.5_text2image_vae-ft-mse-840000.json

モデルのダウンロード

📂ComfyUI/
  └── 📂models/
      ├── 📂checkpoints/
      │   └── v1-5-pruned-emaonly-fp16.safetensors
      └── 📂vae/
          └── vae-ft-mse-840000-ema-pruned.safetensors

API用のworkflowを取得

    1. ComfyUIのノードUIで、上のworkflowを開く
    1. メニューから FileExport (API) を選ぶ
    1. わかりやすい名前で保存(例:SD1.5_text2image_API.json)

サンプル

SD1.5_text2image_API.json

通常のworkflow JSONとの違い

通常のJSONは「UIで編集・共有しやすい情報」も含んでいます。
APIのworkflow は、そのような余分な情報を削ぎ落とし、サーバに渡して実行するのに都合が良い形になっています。


まず動かす

Python環境準備

仮想環境を作り、HTTP通信用に requests を入れます。

python -m venv venv
# Windows:
venv\Scripts\activate
# macOS / Linux:
# source venv/bin/activate

pip install requests

run_min.py

SD1.5_text2image_API.json を読み込み、/prompt に投げるだけの最小コードです。
ノードUIで ▷Run を押すのと、基本的には同じです。

import json
import requests

BASE = "http://127.0.0.1:8188"

prompt = json.load(open("SD1.5_text2image_API.json", encoding="utf-8"))

res = requests.post(f"{BASE}/prompt", json={"prompt": prompt}).json()
print(res)  # {"prompt_id": "...", "number": ..., "node_errors": {...}}

ファイル配置

your_project/
  ├── run_min.py
  └── SD1.5_text2image_API.json

実行する

ターミナルで run_min.py を実行します。

cd path\to\your_project
venv\Scripts\activate
python run_min.py

実行できたか確認してみましょう。

  • Python側で {"prompt_id": "...", ...} が返ってくる(これが実行IDです。)
  • ComfyUI側のターミナルに実行ログが出る
  • ComfyUI/output/ に画像ファイルが増える
    • ノードUIで実行するときと同じ場所に保存されているはずです

ここまでできれば、API経由で実行できています。


CLIからプロンプトを変える

API用JSONを直接編集しても、もちろんパラメータは変更できます。
ただし、元ファイルを汚さずに連続実行したいなら Pythonで差し替える ほうが扱いやすいです。

どこを書き換えるのか(今回のJSONの場合)

今回は「プロンプトだけ」を変更します。

  • Positive prompt:ノード 6inputs.text

注:ノードIDは固定ではない

このページの例では 6 を使いますが、これは この配布JSONの中でそうなっているだけです。
自分のworkflowでやる場合は、JSONを開いて以下を探すのが確実です。

e.g. SD1.5_text2image_API.json

  "6": { //これがID
    "inputs": {
      "text": "beautiful scenery nature glass bottle landscape, , purple galaxy bottle,",
      "clip": [
        "4",
        1
      ]
    },
    "class_type": "CLIPTextEncode",
    "_meta": {
      "title": "CLIP Text Encode (Prompt)"
    }
  },

run.py(プロンプト入力)

import json
import requests

BASE = "http://127.0.0.1:8188"
prompt = json.load(open("SD1.5_text2image_API.json", encoding="utf-8"))

pos = input("positive prompt: ").strip()

# このページの配布JSON前提:6=positive
if pos:
    prompt["6"]["inputs"]["text"] = pos

res = requests.post(f"{BASE}/prompt", json={"prompt": prompt}).json()
print(res)
print("done (check ComfyUI/output)")

実行する

先ほどと同様に実行します。

cd path\to\your_project
venv\Scripts\activate
python run.py

今回は途中でパラメータの入力を求められます。

positive prompt: 好きなプロンプトを入力

そのプロンプトで画像が ComfyUI/output/ に保存されていればOKです。


雰囲気が掴めたら、あとは作るだけ

今回は「実行する」だけのAPIしか使っていませんが、APIには他にも色々あります。

  • 進捗をリアルタイムに受け取る(WebSocket)
  • キューの制御(停止・割り込みなど)
  • 画像アップロード(i2iの入力に渡す)
  • ノードの入力仕様の取得(workflow編集を自動化する足がかり)

このページでは「外からworkflowを実行できる」雰囲気さえ掴めれば十分です。

あとはvibe codingでも何でも、欲しいものを実際に作ってみてください!