キャンバスアプリから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がリリースした最新の画像生成モデル。
以前のモデルと比べて、プロンプト(指示文)の理解力が格段に上がっていて、特に文字の描画や、複雑な指示の再現性がめちゃくちゃ高くなってるのが特徴。
- 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の構築


※本当はこんなに無防備に置かないこと。

※文字列「——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

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
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〜)を使っていますが、これはおまじないのようなものだと思ってもらえれば。

{
"type": "object",
"properties": {
"image": {
"type": "string"
},
"seed": {
"type": "integer"
},
"finish_reason": {
"type": "string"
}
}
}

Power Appsの構築

// Imageプロパティ "data:content/type;base64,"&ret.base64

動作確認

あまりPower AppsからStable Diffusionを呼ぶことは少ないと思うけど、どなたかの参考になれば。
おまけ:SD3.5系は「英語」プロンプトのみ対応


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



コメント