Open WebUIからComfyUIをAIエージェントで操作してみた|実際にできたこと・できなかったこと

スポンサーリンク

はじめに

前回の記事では、AIを使った副業で月5万円を目指すための第一歩として、ローカルAI環境を構築しました。

その中で、LM StudioやOpen WebUI、ComfyUIなどを組み合わせ、さらにComfyUI Agentを使ってOpen WebUIからComfyUIを操作できる環境を作っています。

今回はその続編として、前回構築したComfyUI Agentについて、実際にどんなことができるのか詳しく試してみます。

なぜComfyUI Agentを作ったのか?

ComfyUIは非常に自由度の高い画像生成ツールです。

一方で、画像を作るたびにComfyUIを開いてプロンプトを入力するのは、少し面倒に感じることがあります。

そこで、

「アニメ風の画像を作って」

とOpen WebUIに入力するだけで、AIがComfyUIを呼び出して画像を生成してくれたら便利なのでは?

と考えました。

さらに最終的には、単にプロンプトを渡すだけではなく、

「こんな画像を作りたい」

と指示するだけで、AI自身がComfyUIのWorkflowを構築して画像を生成するところまで自動化したいと考えています。

ただ、いきなりそこまで実現するのは難しそうだったため、まずはその第一歩として、

「決めておいたComfyUIのWorkflowを使い、プロンプトの入力から画像生成までをAIに任せる」

ところから試してみました。

実際に使ってみると、プロンプトの入力や内容の調整はかなり簡単にできた一方で、Workflowの変更やシード値の指定など、まだAIに任せられない部分もありました。

この記事では、実際に構築したComfyUI Agentの仕組みと、できたこと・できなかったことを紹介します。


1. 今回の構成

今回使用したのは、以下のようなローカルAI環境です。

項目使用した環境
CPURyzen 7 5700X
GPURTX 5060 Ti 16GB
メモリ16GB
LLMGemma 4
LLM実行環境LM Studio
チャットUIOpen WebUI
画像生成ComfyUI
AIからComfyUIを操作ComfyUI Agent
OSWindows11

今回のポイントは、Open WebUIとComfyUIを直接つなぐのではなく、間にComfyUI Agentを入れていることです。

構成としては、以下のようになっています。

ユーザー
   ↓
Open WebUI
   ↓
Gemma 4(ローカルLLM)
   ↓
ComfyUI Agent(自作)
   ↓
ComfyUI
   ↓
画像生成

ユーザーはOpen WebUI上で自然な文章を入力します。

例えば、

アニメスタイルの女の子の画像を生成して

と指示すると、LLMがその内容を解釈し、ComfyUI Agentのツールを呼び出してComfyUIで画像を生成します。

今回の構成では、ComfyUIそのものをAIが自由に操作するわけではありません。

あらかじめ用意しておいたWorkflowを使い、そのWorkflowで変更できるパラメータをAgentから渡す、という形になっています。


2. ComfyUI Agentとは?

今回使用したComfyUI Agentは、Open WebUIからComfyUIを操作するための橋渡し役として動かしています。

それぞれの役割を簡単にすると、以下のようになります。

  • Gemma 4:ユーザーの指示を理解する
  • Open WebUI:ユーザーがAIと会話するための画面
  • ComfyUI Agent:Open WebUIからの指示をComfyUIへ渡す
  • ComfyUI:実際に画像を生成する

イメージとしては、

「アニメスタイルの画像を作って」
          ↓
      Open WebUI
          ↓
       Gemma 4
          ↓
   ComfyUI Agent
          ↓
       ComfyUI
          ↓
       画像生成

という流れです。

ComfyUI Agentがあると何が変わる?

通常、ComfyUIで画像を生成する場合は、ComfyUIを開いてプロンプトを入力し、各種設定を確認してから生成します。

今回の環境では、その一部をAIに任せることができます。

例えばOpen WebUIで、

アニメスタイルの女の子を生成して

と入力すると、Gemma 4が指示を解釈し、ComfyUI Agentのツールを呼び出してComfyUIに画像生成を依頼します。

また、Refine Promptを有効にしているため、ユーザーの簡単な指示から画像生成用のプロンプトを調整してから生成することもできます。

実際に、

「アニメスタイルで」

と指定すると、生成される画像もアニメ調になることを確認できました。

ただし、何でもできるわけではない

「AIエージェント」と聞くと、AIがComfyUIを自由に操作して、必要なWorkflowを自分で組み立ててくれるように思えるかもしれません。

しかし、今回構築した環境ではそこまでのことはできません。

あらかじめ用意したWorkflowを使用し、そのWorkflowで受け取れるパラメータをAIから渡す

という仕組みです。
そのため、現時点では、

  • WorkflowそのものをAIが自由に変更する
  • 好きなLoRAをAIが選択する
  • ComfyUIのノード構成をAIが変更する

といった操作はできません。
今回の目的は、まず「ComfyUIへのプロンプト入力をAIに任せる」こと。

その先に、Workflowの構築や変更までAIに任せられる環境を目指しています。


3. ComfyUI側のWorkflowを用意する

まず、AIエージェントから操作するためのComfyUI Workflowを用意します。
今回使用したのは、Krea2という画像生成モデルをComfyUIで利用する際に用意されているデフォルトのWorkflowです。

今回はWorkflowそのものを一から作るのではなく、すでに用意されているWorkflowをベースにして、そこへComfyUI Agentから指示を渡す構成にしました。

そのため、ComfyUIのノードを一から組む必要はありません。

今回のポイント

今回の構成では、Krea2のデフォルトWorkflowをそのまま利用し、
WorkflowをJSONとして保存

ComfyUI Agentから必要な情報を渡す

という形にしています。

まずは通常通りComfyUIでWorkflowを読み込み、単体で画像を生成できることを確認します。ここで重要なのは、AIエージェントを組み込む前に、Workflow単体で正常に動作することを確認しておくことです。

Workflow自体に問題がある状態でAgent側の設定を始めると、どこに原因があるのか分からなくなってしまいます。

今回もまずKrea2のデフォルトWorkflowで画像が正常に生成できることを確認してから、ComfyUI Agentとの連携を進めました。


4. ComfyUI AgentをAIに作ってもらう

ここで少し補足しておきます。今回自作したのComfyUI Agentのserver.pyは、私が一からプログラムを書いたわけではありません。

AIに「Open WebUIからComfyUIを操作できるようにしたい」と相談しながらコードを作ってもらいました。

私は生成されたコードをコピーして実際の環境で動かし、

  • 起動できるか
  • Open WebUIから呼び出せるか
  • ComfyUIで画像が生成されるか
  • エラーが出ないか
  • 指定した内容が画像に反映されるか

といった部分を確認していきました。もちろん、一発で完成したわけではありません。コードを実行してみてエラーが出たら、その内容をAIに伝えて修正してもらい、もう一度実行する。

うまく動いたと思ったら、今度は別の部分で問題が発生する。そんなことを繰り返しながら、少しずつ動く形にしていきました。

ComfyUI Agentのファイル構成

最終的には、シンプルに以下のような構成になっています。

comfy-agent/
├─ server.py
└─ workflow.json

server.pyがAPIの処理を担当し、workflow.jsonにComfyUIで使用するWorkflowを保存しています。

server.py

実際に使用しているserver.pyは以下のようになっています。

import json
import uuid
from pathlib import Path

import requests
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel

COMFY_URL = "http://127.0.0.1:8188"
WORKFLOW_FILE = Path(__file__).parent / "workflow.json"

app = FastAPI(
    title="ComfyUI Agent",
    description="Open WebUIからComfyUIを操作するためのAPI"
)


class GenerateRequest(BaseModel):
    prompt: str
    seed: int | None = None
    enable_lora: bool = False
    refine_prompt: bool = True
    width: int | None = None
    height: int | None = None


@app.get("/")
def root():
    return {
        "status": "ok",
        "service": "ComfyUI Agent"
    }


@app.post("/generate_image")
def generate_image(req: GenerateRequest):
    try:
        with open(WORKFLOW_FILE, "r", encoding="utf-8") as f:
            workflow = json.load(f)
    except Exception as e:
        raise HTTPException(
            status_code=500,
            detail=f"workflow.jsonを読み込めません: {e}"
        )

    workflow["30:19"]["inputs"]["value"] = req.prompt

    workflow["30:23"]["inputs"]["value"] = req.enable_lora

    workflow["30:24"]["inputs"]["value"] = req.refine_prompt

    if req.seed is not None:
        workflow["30:3"]["inputs"]["seed"] = req.seed

    if req.width is not None:
        workflow["30:5"]["inputs"]["width"] = req.width

    if req.height is not None:
        workflow["30:5"]["inputs"]["height"] = req.height

    client_id = str(uuid.uuid4())

    try:
        response = requests.post(
            f"{COMFY_URL}/prompt",
            json={
                "prompt": workflow,
                "client_id": client_id
            },
            timeout=30
        )
    except Exception as e:
        raise HTTPException(
            status_code=500,
            detail=f"ComfyUIに接続できません: {e}"
        )

    if response.status_code != 200:
        raise HTTPException(
            status_code=response.status_code,
            detail=response.text
        )

    result = response.json()

    return {
        "status": "submitted",
        "prompt_id": result.get("prompt_id"),
        "message": "ComfyUIに生成リクエストを送信しました",
        "width": req.width,
        "height": req.height
    }

このコードを見ると少し難しく感じるかもしれません。
しかし今回のポイントは、私がこのコードを一から書いたわけではないというところです。
AIにコードを書かせ、それを実際の環境で動かして、エラーが出たらAIに修正してもらう。
今回はその繰り返しでComfyUI Agentを作りました。


5. Krea2 Workflowの仕組み

今回使用したWorkflowは、Krea2を利用するためのデフォルトWorkflowです。

Workflowには、画像生成だけでなく、プロンプトの拡張やLoRAのON/OFFなど、いくつかの機能があらかじめ組み込まれています。

プロンプトの入力

ユーザーから受け取ったプロンプトは、Workflow内の30:19というノードに設定されます。

Open WebUI
   ↓
ComfyUI Agent
   ↓
server.py
   ↓
30:19 User Prompt

ここが今回の仕組みの入り口になります。

Refine Prompt

今回のWorkflowには、入力されたプロンプトをAIによって拡張する仕組みも組み込まれています。

30:16TextGenerateノードがプロンプトの生成を担当しています。さらに30:21のスイッチによって、

  • Refine Prompt OFF → 元のプロンプトをそのまま使用
  • Refine Prompt ON → AIによって拡張したプロンプトを使用

という切り替えができます。今回のAgentではRefine Promptを有効にしているため、例えば、

「アニメスタイルの女の子」

のような比較的シンプルな指示でも、画像生成用のプロンプトに調整してからKrea2へ渡されます。

LoRAの切り替え

WorkflowにはLoRAも組み込まれています。使用されているのは、krea2_darkbrush.safetensorsというLoRAです。

30:15のLoRA Loaderで読み込み、30:23のON/OFFスイッチによって使用するかどうかを切り替えています。

ただし、今回の実験ではAgentからLoRAを指定して画像を生成するところまでは使用していません。つまり、

WorkflowにはLoRA機能がある

ものの、

今回のAgentでLoRAを自由に選択・操作できる

というわけではありません。

画像サイズ

画像サイズは30:5EmptyLatentImageに設定されます。

今回のAgentでは幅と高さを指定できるようにしているため、通常のサイズとは異なる画像サイズを指定して生成することもできました。

ただし、実際に試してみると、画像生成そのものは成功しても、サイズを変更した場合はOpen WebUI上に生成画像が正常に表示されない問題がありました。


6. Open WebUIにComfyUI Agentを登録する

ComfyUI Agent側の準備ができたら、次はOpen WebUIからAgentを呼び出せるように設定します。今回の設定は比較的シンプルです。

6-1. ComfyUI Agentを接続先として追加

Open WebUIの、

設定 → ツール → 連携 → 接続を追加

から、新しい接続を追加します。
設定した内容は以下の通りです。

今回の環境では、ComfyUI Agentをローカルで起動しているため、URLにはAgentのAPIが動作しているアドレスを指定します。

接続を追加すると、Open WebUIからComfyUI AgentのAPIをツールとして利用できるようになります。

6-2. 使用するモデルでツールを有効にする

次に、実際に使用しているLLMモデルの設定を開きます。

設定 → モデル → 使用しているLLMモデルを選択

そして、ツールの一覧から、ComfyUI_Toolにチェックを入れます。

これで、そのモデルからComfyUI Agentを呼び出せるようになります。

6-3. 設定完了

ここまで設定すると、Open WebUIのチャットからComfyUI Agentを利用できます。
あとはチャット欄からな指示するだけです。


7. 実際に画像を生成してみる

設定が終わったので、実際にOpen WebUIから画像を生成してみます。
今回はこんな感じで指示してみました。

「三毛猫が外を歩いている画像を生成して」

これまでならComfyUIを開き、プロンプトを入力して画像を生成する必要がありましたが、しかし今回の環境では、Open WebUIでAIに話しかけるだけです。Open WebUIからComfyUI Agentが呼び出されると、ComfyUI側で画像生成が開始されます。そして生成されたのがこちら。

このように、自然な文章で指示するだけでローカルのComfyUIを使った画像生成まで実行できました。


8. 実際に使ってみて分かったこと

ここまで設定できたので、実際にOpen WebUIからComfyUI Agentを使って画像を生成してみました。

実際に使ってみると、単純にプロンプトを入力するだけだったComfyUIの画像生成を、自然な文章による指示から実行できるようになりました。

実際にできたこと

今回の環境で確認できたことをまとめると、以下の通りです。

項目結果
Open WebUIから画像生成✅ できた
自然な文章で画像生成を指示✅ できた
プロンプトのRefine✅ できた
「アニメスタイル」などの指示✅ 反映された
画像サイズの指定✅ 生成自体はできた
LoRA機能△ Workflowには存在するが今回は未使用
Workflowそのものの変更❌ できない
AIにWorkflowを構築させる❌ 今回はできない

プロンプト入力の手間はかなり減った

今回一番やりたかったのが、

「ComfyUIを開いて毎回プロンプトを入力するのが面倒」

という問題の解消でした。この点については、かなり目的を達成できました。Open WebUIで普通にAIへ話しかける感覚で指示できるので、ざっくりしたイメージを入力するだけで、画像生成まで進められます。

特にRefine Promptを有効にしていることで、細かい画像生成用プロンプトを毎回自分で考えなくても済むのは便利でした。

ただし、まだ「完全なAIエージェント」ではない

一方で、今回の環境を使ってみて分かった大きな制限もあります。それは、AIがComfyUIを自由に操作しているわけではないということです。

今回の仕組みでは、あらかじめKrea2用のWorkflowを用意しておき、そのWorkflowの一部のパラメータをserver.pyから変更しています。

そのため、

新しいモデルが出たから調べてWorkflowを組んで

といった指示をして、AIがComfyUIを自由に操作することはできません。現時点では、

固定したWorkflow+変更可能なパラメータ

という範囲でAIから操作している状態です。

画像サイズを変更すると別の問題も

画像サイズについては、Agentから幅や高さを指定してComfyUIで生成すること自体はできました。しかし、デフォルトのサイズから変更すると、生成された画像がOpen WebUI上で正常に表示されないという問題が発生しました。

ComfyUI側では画像が生成されているため、画像生成そのものとOpen WebUI側での表示には別の問題があるようです。


9. まとめ

今回は、前回構築したローカルAI環境を使って、Open WebUIからComfyUIをAIエージェント経由で操作する環境を実際に試してみました。

今回できたことは、

  • Open WebUIからComfyUIで画像を生成
  • 自然な文章で画像生成を指示
  • AIによるプロンプトのRefine
  • 画像サイズの指定

などです。一方で、

  • WorkflowそのものをAIに構築させる
  • Workflowを自由に変更する
  • LoRAを自由に選択する

といったところまでは、まだ実現できませんでした。

それでも、今回の目的だった「ComfyUIに毎回プロンプトを入力する手間を減らす」という点では、十分に使えるところまで持っていくことができました。

そして何より、今回面白かったのは、ComfyUI Agentのプログラム自体をAIに書いてもらい、エラーが出たらAIに修正してもらいながら実際に動かせたことです。

AIを使えば、これまでなら自分で調べながら作っていたような小さなツールも、試行錯誤しながら形にできるようになってきました。

今回の環境はまだ第一歩です。最終的には、

「こんな画像を作って」

と指示するだけで、AI自身が必要なWorkflowを組み立て、ComfyUIで画像を生成するところまで自動化できないか試してみたいと思います。

ローカルAIでどこまで作業を自動化できるのか、今後も実際に試していきます。

今回の副業活動時間

ブログ記事執筆:40分
AIとのやり取り(サムネ作成含む):15分
合計:55分

コメント

タイトルとURLをコピーしました