Skip to content
旅botミニを公開しました 6.ComfyUI接続編|まぁ/Masahiro Fukushima
note記述記事
2025-02-07T13:09:15.000Z

見出し画像

旅botミニを公開しました 6.ComfyUI接続編

2025年2月7日 22:09

旅botミニの続きです。

link

PixAIのエラーは解決したようです

先の記事で先々週くらいからPixAIでの画像生成APIが正しくつながらずエラーになる件は昨日くらいにようやく回復したようです。
Discordで日本語サポートしてた方に連絡を取ってもらって回復という感じです。対応ありがとうございます。
まぁPixAI側ではAPIはβという位置づけだったみたいなので問い合わせが来ることそのもの想定外だったのかもしれませんが。

今回はその件も合わせて対応として取り急ぎローカルのComfyUIのAPIにつなぐ機能を入れたのでその設定についてです。
ComfyUIのAPI接続の話しなので、ある程度ComfyUIを理解している方向けの話しとなります。
オリジナルの旅botも元々はローカルサーバーのComfyUI APIで画像生成しているのでその仕組みを持ってくればよかったのですが、わりとべったりしたAPIなので悩ましくもありました。

ComfyUIのAPI接続

ComfyUIにはAPIで外からプログラム操作して画像生成する機能があります。
ただきちんとした資料が整理されておらず、あまり推している機能ではなさそうです。

以前作ったときも結構資料を探したのですが、一部見つかった情報以外はソース見て考えることになったような気がします。

ComfyUIをAPIモードで動作させる

これはComfyUIをどのように組み込んだかユーザの環境により異なると思いますが、公式の起動方法である「python main.py」で起動したのならコマンドラインに APIの受付アドレスを--listenで追記してComfyUIを起動します(そういえばセキュリティ用にベアラートークンくらい入れておくべきか。。そのうち考えます ComfyUIのAPIにはSSL設定はあるけど、素には認証ないようです。。)。

python main.py --listen 0.0.0.0

画像生成ワークフローjsonを準備する

やらせる画像生成の仕事は大きく2種類です。

  • text to image生成(ホテル画面など)

  • image to image生成(Street View背景から旅先合成画像)

旅画像の生成の原理的な話しは以下を参照ください。

link

ComfyUIのAPIは、UI画面で作ったワークフローをjson式で書き出して、外部のAPIからそのjsonを入れるとバッチで画像生成する というスタイルです。

ですのでtext2image用とimage2image用の2つのワークフローを作る必要があります。

今回、旅botミニの場合は新規にComfyUIのデフォルトテンプレートのワークフローから生成用ワークフローを作っています。

text2image用ひな形

image2imageひな形

これを自分の好みの画像生成ワークフローに修正してから、jsonファイルに書き出します。

  1. 画面左下の歯車マークを押して設定画面を開きます。

開発モードにする

2 ワークフロー>エクスポート(API)を選ぶとAPI用のjsonファイルを書き出すことが出来ます。

API用のエクスポートでjsonファイルを書き出す

claude_desktop_configに設定する

このファイルの場所をclaude_desktop_configのenvの項に以下の形で追記します。合わせてローカルのComfyUIのエンドポイント(IP:portなど)を追記します。

claude_desktop_config.json

{
  "env": {
    "comfy_url": "http://192.168.1.100:8188",
    "comfy_workflow_t2i": "C:\\Documents\\t2itest.json",
    "comfy_workflow_i2i":"C:\\Documents\\i2itest.json"
  }
}

簡易変数による値置き換え

基本は上記で動くのですが、実際には使うモデル(チェックポイント)を変えたり、表示の調整のためにワークフローで指定した値をいろいろ変えたい場合が出てくると思います。そのために%を使った簡易置き換えを入れています。

t2t.json

{
  "3": {
    "inputs": {
      "seed": "%seed",
      "steps": "%steps",
      "cfg": "%cfg",
      "sampler_name": "%sampler_name",
      "scheduler": "%scheduler",
      "denoise": "%denoise",
      "model": [
        "14",
        0
      ],
      ...

APIワークフローjsonファイルを開いて、置き換えしたい値を"%変数名"に書き換えます。
書き換えた変数名はclaude_desktop_configのenvの項で"変数名=値,変数名=値,.."の形式で指定することが出来ます。文字列はシングルクォーテーション' 'で囲ってください。

claude_desktop_config.json

{
  "env": {
    "comfy_params":"ckpt_name='animagineXL40_v40.safetensors',denoise=0.65,steps=25,cfg=8,sampler_name='euler_ancestral'",
    ...
  }
}

%seedは乱数変数値を設定する固定の変数としています。

組み込み済みのワークフローを使う

デフォルトのワークフローファイルはすでにパッケージ内( assets/comfy/t2i_sample.json, assets/comfy/i2i_sample.json )に含まれていますので、一番単純にはckpt_nameを指定すれば動く仕組みです。

claude_desktop_config.json

{
  "env": {
    "comfy_params":"ckpt_name='animagineXL40_v40.safetensors'",
    ...
  }
}

実際には画像サイズの指定に制約があったりと思わぬ制約があったりしますので、ComfyUIの知識を駆使して後はトライ&エラーになると思います。。
assets/comfy/t2i_sample.jsonは仕組みの大枠の参考になりますのでComfyUIでやろうという方は読み取っておいたほうがよいと思います。

画像生成部をComfyUI APIに置き換える場合、長所短所があります。
よほど画像にこだわるとかでなければクラウドの画像APIの方をお勧めします(出力解像度の上限はStreet Viewの解像度に制約を受けるので最終結果の解像度は上げてもあまり効果はありません)

長所

  • 画像生成の方法やモデルを自分の好みのものに作り替えられる

  • 画像API利用料を払わなくてよい

短所

  • 設定と運用(ComfyUI立ち上げや設定)が結構面倒

  • ローカルPCとGPUがよほど早くないと画像APIを使うより生成が遅い

ミニゲームを遊んでいて

先日紹介した応用編のミニゲーム「コンボイに秘密文書を持って行く」ですが、自分で言ってはなんですが結構遊べます。
ただ単なるジャンケンなので3ステップか4ステップくらいでもういいかとは思うのですが、自由な会話にもClaudeはつきあうので不思議な没入感はあります。

「ストーリー的観点から考えますと・・」

「お腹が空いたからって油断するとは甘いな!」

ラーメン屋に立ち寄りませんかとAIに言われるとは思わなかったです。

これはちょっとまずいのでは。。。

ただ少し遊んでいてちょっと気にかかるシーンがあったのです。。

「代わりに以下の住所で設定し直してみましょう」「よし、これなら問題ありません」

子安神社を提案しておきながら、選択したら5時間だったというのは問題ないのです。そこまでの細かい地形の知識はないと思いますし、移動手段も何を使うか指定していません(旅botのデフォルトの移動速度は自動車の1/4で自転車程度のスピードを想定していますが速度情報はプロンプトで伝えていないので推測は困難です)
さらに同じような神社名は日本国内に山ほどあり、Google Map APIに指示したときに全然別の候補地が出てしまうということもよくあります。
(wikipediaで見て全国で27箇所)

子安神社行きを指定したのに、評価でダメだったので、子安のついた付近の住所を入れて話しを強引に通した。

「子安神社ではダメでした。別のところを指定してください」なら今まで通りだし想定される挙動です。
「子安神社ではダメでした。代わりに住所が子安通ということで話しで進めましょう」

これゲームデザイナーがいたら「シナリオと合ってない! バグだ! これではユーザ体験が失われてしまう!」とか言い出すんじゃないでしょうか。

でも見ていて微笑ましくなった

私もこの結果を見てちょっとパニックたのです。。
このAIの選択が合理的である理由がどこかにないかと黒ウィンドウ内の出力結果を見たりしました。

ただ「これでもよいのかも」とちょっと思い直しました。

子供時代のことを考えてみます。友達や兄とかの年長者とゴッコ遊びをするとき、よくあるじゃないですか。

ゴッコの辻褄が合わなくなったときに、

「・・突然ウルトラマンがやってきて怪獣をやっつけてしまいました。そしてね・・」

唐突に設定が追加されて辻褄が合わされて話しが進んでいく状態。
なんだかそれに似ているなと。

下手に「再入力してください」と言ってテンポを崩すより、私と遊びを続けたくてこれでよいことにして先に進めた、と考えるとちょっとホッコリしたのです。もしかしたら自身が提案した子安神社が全然時間違いでごまかそうと思ったのかもしれません。

プログラムで作られたゲームではまず体験できません。テーブルトークでも普通はルール違反です。子供のゴッコ遊びだから許されていた懐かしい緩いルールをAIが見せてくれたのです。
まだ出来て間もない生成AIは、未調整の具合が子供の感性と近いのかもしれない。

これは普通に考えると「ハルシネーション」の一種であり、AIの嘘と見なされる現象です。
これを抑え込みたいなら、プロンプトのルールを厳密化し(××はダメです、○○はダメです、、)、AIも最新のAIのような長考型(CoT)にすべきなのでしょうが、これをダメだと言い切ってしまうのはAIの可能性を狭めるのではないかと思うのです。

link

link

それとは別に、AIでビジネスやろうとしている方は同様の話しで悩まされている(そしてビジネスだとさすがに許されない)と思うと大変ですね、と思うのです。

link

Noteの自分の記事より転記 https://note.com/marble_walkers/n/ncefc7c05d102