一般的にはおそらく直接ComfyUIでやるようなことですが、SwarmUIで用意されたAPIを用いて外部テキストのプロンプトを順に連続生成する方法です。wildcardsだとランダムになり嫌なのでAIに任せてやってみました。

SwarmUI起動後まずこれを実行しsession IDを取得
(requestsがない場合は pip install requests でPythonにインストール)

import requests

BASE_URL = "http://127.0.0.1:7801/API"

# 1. セッションIDを取得
r = requests.post(f"{BASE_URL}/GetNewSession", json={})
session_id = r.json().get("session_id")
print("Session ID:", session_id)

以下が本体、やることは
・でてきた長い16進数をsession_idのhoge1に入力。
・pyファイルと同じフォルダにprompts.txtとnegative.txtを用意する。
 (プロンプトは1行ずつ出力したい絵を記述)
・prefixに外部テキストに書いたプロンプトの前に固定で挿入するプロンプト
・suffixに後に固定で挿入するプロンプト
・共通パラメータ内の設定を任意に変える。.safetensorsとか拡張子入れないでも認識します。

import requests
import time
import os

# API設定
url = "http://127.0.0.1:7801/API/GenerateText2Image"
session_id = "hoge1"

# スクリプトのあるフォルダを基準にファイルパスを構築
script_dir = os.path.dirname(os.path.abspath(__file__))
prompt_path = os.path.join(script_dir, "prompts.txt")
negative_path = os.path.join(script_dir, "negative.txt")

# プロンプトのprefix / suffix を定義
prefix = "masterpiece, best quality"
suffix = "<lora:hoge2:0.5>, <lora:hoge3:0.8>"

# プロンプト読み込み
with open(prompt_path, "r", encoding="utf-8") as f:
    prompts = [line.strip() for line in f if line.strip()]

# ネガティブプロンプト読み込み
with open(negative_path, "r", encoding="utf-8") as f:
    negative_prompt = f.read().strip()

# 共通パラメータ
base_params = {
    "model": "hogehoge",
    "width": 1024,  "height": 1024,
    "steps": 20,    "cfg_scale": 5,
    "sampler": "euler_ancestral",   "scheduler": "normal",
    "seed": -1,
    "negative_prompt": negative_prompt,
    "LoRAs": "",
}

# 画像生成ループ
for i, prompt in enumerate(prompts, start=1):
    # prefix / suffix を挿入してプロンプト構築
    prompt_parts = [prefix.strip(), prompt.strip(), suffix.strip()]
    full_prompt = ", ".join([p for p in prompt_parts if p])

    payload = {
        "session_id": session_id,
        "images": 1,
        "prompt": full_prompt,
        **base_params
    }

    print(f"[{i}/{len(prompts)}] 生成中: {full_prompt}")
    try:
        r = requests.post(url, json=payload)
        r.raise_for_status()
        result = r.json()

        if "images" in result and result["images"]:
            print(" → 成功: 画像生成完了")
        else:
            print(" → 失敗: レスポンスに画像が含まれていません")
            print("   詳細:", result)
    except requests.exceptions.RequestException as e:
        print(" → 通信エラー:", e)
    except ValueError:
        print(" → JSON解析エラー: レスポンスがJSON形式ではありません")
    time.sleep(1)

これでprompt.txtに書いたものが一行ずつ順番に生成されるようになります。LoRAsにloraを記述しても機能するのですが、強弱の書き方がわかりませんでした。upscaleとかrefineも同時にしたかったのですがドキュメント探しても書いてないようです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です