Power Automate Stability AI 最新API (SD3.5) をPower Appsから叩く方法|multipart/form-data対応

キャンバスアプリからStability AIの最新モデル「Stable Diffusion 3.5」のAPIを叩いて画像を生成してみたので、メモ。

以前、SDXL 1.0のAPIを使う記事を書いたんだけど、実はStability AIのAPI仕様が新しくなっていて、古い方法は非推奨になりつつ。
今回のv2beta APIからは、送信フォーマットが単純なJSONじゃなくて「multipart/form-data」必須になってたりと、Power Automateでやるにはちょっと一癖あったので、そのあたりを中心に共有。

スポンサーリンク

Stability 3.5系とは

「Stable Diffusion 3.5 (SD3.5)」は、Stability AIがリリースした最新の画像生成モデル。
以前のモデルと比べて、プロンプト(指示文)の理解力が格段に上がっていて、特に文字の描画や、複雑な指示の再現性がめちゃくちゃ高くなってるのが特徴。

API経由で使えるモデルは主に以下の4種類。

  • Stable Diffusion 3.5 Large: 最高品質。プロンプトへの忠実度が一番高い。
  • Stable Diffusion 3.5 Large Turbo: 高品質だけど生成速度を重視したモデル。
  • Stable Diffusion 3.5 Medium: 画質と速度のバランスが良い標準モデル。PCなどのコンシューマー向けGPUでも動かしやすいサイズ感で設計されてる。
  • Stable Diffusion 3.5 Flash: 一番軽量で高速。コストも安いのでテストやアプリへの組み込みに最適。

今回の検証では、レスポンスが爆速でコストも安い「Stable Diffusion 3.5 Flash」を使ってみることにする。

Power Automateの構築

まずはStability AIのAPIをコールするPower Automateの構築から。全体像はこんな感じ。
トリガーで引数としてPower Apps側から画像生成用のプロンプトを取得する。
続いてAPIキーを定義し、
※本当はこんなに無防備に置かないこと。
リクエストを送る際のBody(multi-part)を定義する。呼び出したいモデル(今回は3.5-flash)や、作成したい画像の拡張子やアスペクト比を変えたい場合はここで設定する。
※文字列「——WebKitFormBoundary7MA4YWxkTrZu0gW」についての説明はこのあとで。
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="prompt"

@{triggerBody()?['text']}
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="model"

sd3.5-flash
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="mode"

text-to-image
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="aspect_ratio"

1:1
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="output_format"

png
------WebKitFormBoundary7MA4YWxkTrZu0gW--
■指定できるモデル
sd3.5-large
sd3.5-large-turbo
sd3.5-medium
sd3.5-flash

■指定できる拡張子
jpeg
png
webp

そして、HTTPリクエストアクションでStability AIに対してリクエストを送る。
URL : https://api.stability.ai/v2beta/stable-image/generate/sd3
Method : POST
Header : 
  Authorization : Bearer @{outputs('作成:APIキー')}
  Accept : application/json
  Content-Type : multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
boundary(バウンダリ)って何?
Power AutomateでAPIを叩くとき、普段はJSON形式を使うことが多いですが、今回のようにファイルを送信する可能性がある場合(multipart/form-data)は、「boundary(バウンダリ)」というルールに従う必要がある。

💡 boundary = 「データの仕切り線」
multipart(マルチパート)という名前の通り、複数のデータ(プロンプト、モデル名、画像など)をひとまとめにして送るため、「ここからここまでが1つのデータ」という仕切り線が必要になる。それがboundary。

・Headerでの宣言:
「今から送るデータの仕切り線は、MyBoundary123 という文字列を使うよ」とサーバーに伝える。
Content-Type: multipart/form-data; boundary=MyBoundary123

・Bodyでの使用:
実際にデータの間を、その文字列(の前にハイフン2つ — を付けたもの)で区切る。
–MyBoundary123

📝 文字列は何でもいいの?
基本的には何でもOK。
ただし、送るデータの中身(プロンプトの文章など)と同じ文字列を使ってしまうと、そこでデータが途切れたと誤解されてエラーになる。
そのため、絶対に被らないような「長くて複雑なランダム文字列」を使うのが一般的。
※今回はブラウザの通信でよく見かける形式(WebKitFormBoundary〜)を使っていますが、これはおまじないのようなものだと思ってもらえれば。

最後に、「JSONの解析アクション」で戻り値を解析して、
{
    "type": "object",
    "properties": {
        "image": {
            "type": "string"
        },
        "seed": {
            "type": "integer"
        },
        "finish_reason": {
            "type": "string"
        }
    }
}
Power Apps側に画像(base64データ)を戻せば、Power Automateは完成。※seed値はおまけ。

Power Appsの構築

Power Apps側は受け取った画像(base64データ)を表示するための「画像コントロール」を配置して、
// Imageプロパティ
"data:content/type;base64,"&ret.base64
「送る」ボタンでPower Automateを呼び出して、戻り値を変数に入れれば完成。

動作確認

実行するとこんな感じで画像を生成し、キャンバス上に表示できる。

あまりPower AppsからStable Diffusionを呼ぶことは少ないと思うけど、どなたかの参考になれば。

おまけ:SD3.5系は「英語」プロンプトのみ対応

SD3.5系は英語プロンプトにのみ対応しているようで、こんな感じで日本語のプロンプトを送ると、
エラーが発生してしまうので、注意。

必要であればAI Builderを入れて、「英語以外の言語の場合は翻訳」とかしてあげると親切かも。

関連記事

参考

コメント

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