# FLUX.2 Pro＋LoRAの商品画像をn8nで自動生成：ProはLoRA非対応

> FLUX.2 [pro]のAPIにLoRAの入力はありません。商品の見た目は参照画像（最大8枚）で保ち、LoRAが要るならBFLの[klein]かfalの[dev]をn8nで呼びます。

- Source: https://www.aifreeapi.com/ja/posts/flux-2-pro-lora-product-photography-n8n
- Language: ja
- Published: 2026-10-02
- Updated: 2026-10-02
- Publisher: AI Free API (https://www.aifreeapi.com)

**FLUX.2 [pro]のAPIには、LoRAを指定するフィールドがありません。** BFL（Black Forest Labs）のAPIでも、fal.aiが提供する[pro]でも同じです。商品画像を多数のシーンで同じ見た目に保ちたい場合、n8nで組める構成は次の3つに分かれます（料金と仕様は2026年10月2日時点）。

| ルート | 向いているカタログ | 一貫性を保つ手段 | 1MP出力1枚の料金 |
| --- | --- | --- | --- |
| A：BFLのFLUX.2 [pro]＋参照画像 | SKUが多く、1商品あたり数枚 | 商品写真を`input_image`で渡す（APIは最大8枚） | 参照1枚で$0.045 |
| B：BFLのFLUX.2 [klein]＋自前のLoRA | 少数の主力商品やブランドのトーンで大量に出す。請求はBFLにまとめたい | 自分で学習したLoRAを`finetune_id`で指定（1リクエスト1つ） | 9Bで$0.015 |
| C：falのFLUX.2 [dev]＋LoRA | 学習もホスティングに任せたい。LoRAを組み合わせたい | `loras`配列（最大3つ） | $0.021＋学習1回$6.40（1,000ステップ） |

どのルートでも、n8n側は「送信→待機→ポーリング→ダウンロードして保存」という同じ骨組みで動きます。違うのはエンドポイント、認証ヘッダー、リクエスト本文、そして状態を表すフィールド名だけです。

以下のノード構成とリクエスト本文は、BFL、fal、n8nの公式ドキュメントの記載を突き合わせて組んだもので、実行結果に基づくものではありません。まず1商品・1枚で最後まで通し、保存された画像を確認してから件数を増やしてください。

## FLUX.2 [pro]にLoRAは載せられるか：APIにLoRAの入力はない

載せられません。BFLの[FLUX.2 [pro]のAPIリファレンス](https://docs.bfl.ai/api-reference/models/generate-or-edit-an-image-with-flux2-%5Bpro%5D)が受け付けるのは、`prompt`、`input_image`と`input_image_2`〜`input_image_8`、`width`、`height`、`seed`、`safety_tolerance`、`output_format`、`webhook_url`、`webhook_secret`、`disable_pup`です。LoRAや`finetune_id`にあたる項目はありません。falの[`fal-ai/flux-2-pro`](https://fal.ai/models/fal-ai/flux-2-pro/api)と`fal-ai/flux-2-pro/edit`にも`loras`パラメータはありません。

BFLが「[pro]はLoRA非対応」と一文で明記しているわけではなく、根拠はスキーマに入力がないことと、後述するLoRA用エンドポイントの一覧に[klein]しか載っていないことの2点です。

「FLUX.2はLoRA対応」という説明を見かけるのは、FLUX.2というファミリーの中にLoRAを使えるモデルがあるからです。

- **BFLのAPI**：LoRAを使えるのはFLUX.2 [klein]の`-finetuned`エンドポイントだけです（Public Beta）。[pro]、[max]、[flex]用の`-finetuned`エンドポイントは一覧にありません。
- **fal.ai**：`fal-ai/flux-2/lora`はFLUX.2 [dev]をベースにしたLoRA対応のエンドポイントです。名前に`flux-2`と入っていますが、[pro]ではありません。
- **ローカル実行**：公開ウェイトがあるのは[klein]と[dev]で、LoRAの学習もこの2つが対象です。

つまり「どのモデルを、どのプラットフォームで動かすか」を決めないと、LoRAを使えるかどうかは答えが出ません。BFLは2026年10月1日にFLUX 3 Imageも公開していますが、LoRAへの対応は別に確認が必要で、ここから先はFLUX.2の話です。

## どのルートを選ぶか：SKU数と1商品あたりの枚数で決める

判断の軸は2つあります。1つは学習の手間を何枚の画像で回収できるか、もう1つは学習と請求をどこに置きたいかです。

**SKUが多く、1商品あたりの生成が数枚〜数十枚ならルートA**です。商品ごとにLoRAを学習する必要がなく、商品写真のURLを行ごとに差し替えるだけで済みます。BFLの[画像編集ガイド](https://docs.bfl.ai/flux_2/flux2_image_editing)によると、FLUX.2はAPIで最大8枚（プレイグラウンドでは10枚、[klein]は4枚）の画像を同時に参照でき、BFLは[pro]を量産向けと位置づけています。正面、側面、ラベルのアップを別々の参照として渡す使い方ができます。

**同じ商品、または同じブランドのトーンで数百枚単位を出すならLoRA**が候補になります。プロンプトだけで呼び出せるので、参照画像の分の料金がかからず、1枚あたりは安くなります。そのうえで次のように分かれます。

- 学習用のGPUを自分で用意でき、請求をBFLにまとめたい → ルートB。学習は自分で行い、できた`.safetensors`をBFLのダッシュボードにアップロードします。BFLの[学習ガイド](https://docs.bfl.ai/flux_2/flux2_klein_training)が挙げる最低要件は、[klein] 4B BaseでVRAM 12GB・RAM 32GB、9B BaseでVRAM 22GB・RAM 64GBです。
- 学習もAPIで済ませたい、または商品LoRAとスタイルLoRAを重ねたい → ルートC。falの学習エンドポイントに画像のzipを渡せばLoRAができ、推論では最大3つまで同時に指定できます。

ルートBとCは排他ではありません。BFLの`-finetuned`エンドポイントは`input_image`も受け付けるので、LoRAでトーンを固定しつつ、商品写真を参照として添える構成も取れます。

ライセンスは事前に確かめてください。[klein] 4BはApache 2.0、[klein] 9BはFLUX Non-Commercial Licenseで公開されています（[FLUX.2の概要](https://docs.bfl.ai/flux_2/flux2_overview)）。9BベースのLoRAをBFLのAPI経由で商用の画像に使う場合の扱いは、公開ドキュメントに明記がないため、BFLのライセンス窓口で確認が必要です。[dev]は、BFLが自前運用向けのウェイトを非商用としている一方、falのモデルページには商用利用のタグが付いています。条件は動かす場所で変わります。

FLUX.2以外のモデルも含めて検討している段階なら、[2026年の画像生成モデル比較](/ja/posts/nano-banana-2-vs-midjourney-vs-gpt-image-vs-flux2)で用途別の候補を先に絞れます。

## n8nの共通の骨組み：送信→Wait→ポーリング→If→ダウンロード

BFLもfalも、リクエストを送るとすぐに「受け付けた」という応答だけが返り、画像は後から取りに行く非同期のAPIです。そのためHTTP Requestノード1つでは完結せず、次の並びになります。

1. **入力**：商品ごとの行を用意します。最低限、SKU、商品写真のURL、シーンのプロンプトの3列です。Google Sheetsなどの表から読み込めば、1行が1アイテムになります。
2. **Loop Over Items**：1件ずつ（または少数ずつ）次の処理に流します。
3. **HTTP Request（送信）**：POSTで生成を依頼します。応答に結果確認用のURLが入っています。
4. **Wait**：Resumeを「After Time Interval」にして数秒待ちます。
5. **HTTP Request（状態確認）**：手順3で返ったURLにGETします。
6. **If**：状態が完了なら次へ、処理中なら手順4に戻し、失敗なら記録して次の商品へ進みます。
7. **HTTP Request（ダウンロード）**：画像のURLにGETし、Response Formatを「File」にしてバイナリとして受け取ります。
8. **保存**：自社のストレージやドライブに書き込み、ループの先頭に戻ります。

![n8nの骨組みの図。HTTP Requestで送信、Waitで待機、HTTP Requestで状態確認、Ifで分岐し、Readyなら署名付きURLを10分以内に保存、それ以外はWaitに戻り、ErrorまたはFailedは記録して次の商品へ進む](https://www.aifreeapi.com/posts/ja/flux-2-pro-lora-product-photography-n8n/img/n8n-async-loop.webp)

設定で間違えやすい点は4つあります。

**認証はヘッダーで渡します。** BFLとfalへの接続には汎用の[HTTP Requestノード](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/)を使います。Generic Credential Typeの「Header Auth」を選び、認証情報を1つ作って送信と状態確認の両方で使い回します。ヘッダー名はBFLが`x-key`、falが`Authorization`（値は`Key `に続けてAPIキー）です。

**状態確認のURLは組み立てず、応答の値をそのまま使います。** BFLは`api.bfl.ai`（および`api.eu.bfl.ai`、`api.us.bfl.ai`）を使う場合、返された`polling_url`を必ず使うよう[統合ガイド](https://docs.bfl.ai/api_integration/integration_guidelines)で求めています。ループで手順4に戻ると直前のノードの出力は状態確認の応答に置き換わるので、URLは送信ノードの出力を名前で参照します。送信ノードを「Submit」と名づけたなら`{{ $('Submit').item.json.polling_url }}`です。

**待ち時間は65秒未満にします。** n8nの[Waitノード](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.wait/)は、65秒未満の待機なら実行データをデータベースに退避せず、メモリ上で続行します。BFLの公式サンプルは0.5〜1秒間隔でポーリングしていて、最小間隔の規定は公開されていません。n8nでは5秒程度から始め、長すぎると感じたら縮めるのが扱いやすい設定です。

**ループには打ち切り条件を付けます。** 状態がいつまでも完了にならない場合に備えて、Edit Fields（Set）ノードで確認回数を数え、上限を超えたら失敗として扱う分岐を入れておくと、実行が止まらなくなる事態を避けられます。

## ルートA：FLUX.2 [pro]に参照画像を渡すHTTP Requestの設定

送信ノードは、Methodを`POST`、URLを`https://api.bfl.ai/v1/flux-2-pro`にします。`/v1/flux-2-pro`は固定スナップショット、`/v1/flux-2-pro-preview`は最新版です。商品画像のように後から同じ条件で再生成したい用途では、固定スナップショットのほうが結果を比べやすくなります。

本文はJSONで次のように指定します。`{{ }}`の中は入力の列名に合わせてください。

```json
{
  "prompt": "{{ $json.scene_prompt }}",
  "input_image": "{{ $json.product_image_url }}",
  "width": 1024,
  "height": 1024,
  "output_format": "png"
}
```

`input_image`にはURLかbase64を渡せます。角度違いやラベルのアップを足すときは`input_image_2`、`input_image_3`と続けます。プロンプトに引用符や改行が入るとJSONが壊れるので、その場合はJSONを直接書かず、フィールドごとに値を指定する方式に切り替えます。

応答には`id`と`polling_url`のほか、`cost`、`input_mp`、`output_mp`が含まれます。`cost`をシートに書き戻しておくと、バッチ全体の費用を後から実績で集計できます。

状態確認のIfノードは`{{ $json.status }}`を見ます。

| `status`の値 | 次の動作 |
| --- | --- |
| `Ready` | `{{ $json.result.sample }}`をダウンロードして保存 |
| `Error`または`Failed` | SKUと応答を記録し、次の商品へ |
| それ以外 | Waitに戻る |

`result.sample`は[10分で失効する署名付きURL](https://docs.bfl.ai/quick_start/generating_images)です。URLをシートに書いて後でまとめて取りに行く設計にすると、取りに行った時点で期限が切れています。`Ready`になった同じ実行の中でダウンロードし、自社のストレージに保存してください。このURLは`delivery.*.bfl.ai`から配信され、CORSが有効ではなく、エンドユーザーに直接見せる用途も想定されていません。

## ルートB：BFLの-finetunedエンドポイントでklein LoRAを呼ぶ

ルートAとの違いは、事前準備とURL、本文の2フィールドだけです。n8nの骨組みと`status`の判定はそのまま使えます。

事前準備は[FLUX.2 LoRA Inference](https://docs.bfl.ai/flux_2/flux2_lora_inference)の手順に沿います。

1. AI-ToolkitやDiffusersで、FLUX.2 [klein]のBaseモデルに対してLoRAを学習します。
2. BFLのダッシュボードで「Customization → Finetunes」を開き、`.safetensors`をアップロードします。ここで付けた名前（小文字の英数字、ハイフン、アンダースコアのみ）が`finetune_id`になります。トリガーフレーズも任意で設定できます。
3. アップロード時に選んだベースモデルに対応する`-finetuned`エンドポイントを呼びます。

エンドポイントは`/v1/flux-2-klein-4b-finetuned`、`/v1/flux-2-klein-9b-finetuned`、`/v1/flux-2-klein-9b-kv-finetuned`、`/v1/flux-2-klein-9b-kv-bf16-finetuned`、`/v1/flux-2-klein-base-4b-finetuned`、`/v1/flux-2-klein-base-9b-finetuned`の6つです。9B用に登録したLoRAを4Bのエンドポイントで呼ぶと失敗するので、ダッシュボードで選んだベースモデルと一致させます。

```json
{
  "prompt": "{{ $json.scene_prompt }}",
  "finetune_id": "my-product-lora",
  "finetune_strength": 1.0,
  "width": 1024,
  "height": 1024
}
```

`finetune_strength`の既定値は1.0です。どんなプロンプトでも学習画像そっくりの結果になる場合は、`seed`を固定して0.7〜0.9の範囲で下げ、商品の特徴が残りつつシーンが変わる値を探すようBFLは案内しています。トリガーフレーズを設定したLoRAは、プロンプトにそのフレーズを入れないと効きません。

この機能はPublic Betaです。BFLは料金、パラメータ、エンドポイント名が正式提供までに変わる可能性があると明記しているので、URLをワークフローに書き込む前に、ダッシュボードが自動生成するAPI例と見比べてください。

## ルートC：falでFLUX.2 [dev]のLoRAを学習して呼ぶ

falでは学習と推論の両方がAPIで、どちらも[キューAPI](https://docs.fal.ai/model-apis/model-endpoints/queue)を通します。骨組みは同じですが、フィールド名がBFLと異なります。

| 項目 | BFL | fal |
| --- | --- | --- |
| 送信先 | `https://api.bfl.ai/v1/{エンドポイント}` | `https://queue.fal.run/{モデルID}` |
| 認証ヘッダー | `x-key: APIキー` | `Authorization: Key APIキー` |
| 状態確認のURL | 応答の`polling_url` | 応答の`status_url` |
| 完了を示す値 | `status`が`Ready` | `status`が`COMPLETED` |
| 画像の場所 | 同じ応答の`result.sample` | `response_url`にGETして`images[0].url` |

falの状態は`IN_QUEUE`、`IN_PROGRESS`、`COMPLETED`の順に進みます。注意が必要なのは、失敗したリクエストも`COMPLETED`で終わり、`error`フィールドが付く点です。Ifノードでは`status`だけでなく`error`が空であることも条件に入れます。完了後は`response_url`へのGETが1回増えるので、BFL版よりHTTP Requestノードが1つ多くなります。

**学習**は[`fal-ai/flux-2-trainer`](https://fal.ai/models/fal-ai/flux-2-trainer/api)にPOSTします。

```json
{
  "image_data_url": "https://example.com/product-dataset.zip",
  "default_caption": "a photo of TOK product",
  "steps": 1000
}
```

`image_data_url`は画像をまとめたzipのURLで、falは10枚以上を目安にしています。画像ごとに同名の`.txt`でキャプションを付けられ、付けない場合は`default_caption`が必須です（どちらもないと学習が失敗します）。`steps`の既定値は1,000で、100〜10,000の範囲で指定できます。結果の`diffusers_lora_file`にLoRAファイルのURLが入ります。学習は商品ごとに1回なので、生成用とは別のワークフローに分けておくと管理しやすくなります。

**推論**は[`fal-ai/flux-2/lora`](https://fal.ai/models/fal-ai/flux-2/lora/api)です。

```json
{
  "prompt": "{{ $json.scene_prompt }}",
  "loras": [
    { "path": "{{ $json.lora_url }}", "scale": 1 }
  ],
  "image_size": { "width": 1024, "height": 1024 },
  "num_images": 1,
  "output_format": "png"
}
```

`loras`は最大3つ、`scale`は0〜4（既定1）です。`image_size`はプリセット名でも、512〜2,048pxの幅と高さでも指定できます。商品写真も参照として渡したい場合は[`fal-ai/flux-2/lora/edit`](https://fal.ai/models/fal-ai/flux-2/lora/edit/api)に切り替え、`image_urls`（最大4枚）を加えます。

## 1枚あたりの費用：[pro]＋参照1枚は$0.045、LoRAは267枚から安くなる

FLUX.2の料金はメガピクセル（MP）単位で、1MPは1,024×1,024です。BFLの[料金ページ](https://bfl.ai/pricing?category=flux.2)では、出力と参照画像のそれぞれが次のMPに切り上げられ、参照画像は1枚ごとに1MPとして数えます。出力1MPでの1枚あたりは次のとおりです。

| 構成 | 計算 | 1枚あたり |
| --- | --- | --- |
| [pro]、テキストのみ | $0.03 | $0.03 |
| [pro]＋参照1枚 | $0.03＋$0.015 | $0.045 |
| [pro]＋参照2枚 | $0.03＋$0.015×2 | $0.06 |
| [pro]、出力2MP＋参照1枚 | $0.03＋$0.015＋$0.015 | $0.06 |
| [klein] 9B LoRA、テキストのみ | $0.015 | $0.015 |
| [klein] 9B LoRA＋参照1枚 | $0.015＋$0.002 | $0.017 |
| falの[dev] LoRA、テキストのみ | $0.021 | $0.021 |
| falの[dev] LoRA＋参照1枚（edit） | $0.021×2 | $0.042 |

BFLの`-finetuned`エンドポイントは、Public Betaの間はベースのエンドポイントと同じ料金です（[BFLの料金ドキュメント](https://docs.bfl.ai/quick_start/pricing)）。falの学習費用は`0.0064×ステップ数`で、1,000ステップなら$6.40です。

500枚（すべて1MP）を出す場合の例です。

- [pro]＋参照1枚：500×$0.045＝$22.50
- [klein] 9B LoRA：500×$0.015＝$7.50（自前のGPUでの学習費用は含みません）
- falの[dev] LoRA：500×$0.021＋$6.40＝$16.90（LoRAを1つ学習した場合）

学習費用を何枚で回収できるかは、1つの不等式で出せます。falのLoRA（テキストのみ）と[pro]＋参照1枚を比べると、

```text
6.40 + 0.021 × n < 0.045 × n
6.40 < 0.024 × n
n > 266.7
```

となり、LoRA1つにつき267枚以上を生成するなら、falのLoRAのほうが安くなります。266枚では[pro]が$11.97、LoRAが$11.986で[pro]のほうが安く、267枚では[pro]が$12.015、LoRAが$12.007で逆転します。

![LoRAの学習費用を何枚で回収できるかの図。FLUX.2 proと参照1枚は$0.045×n、falのLoRAは$6.40＋$0.021×nで、266枚ではpro、267枚ではLoRAが安い。500枚の例は$22.50、$16.90、klein 9BのLoRAが$7.50](https://www.aifreeapi.com/posts/ja/flux-2-pro-lora-product-photography-n8n/img/lora-break-even-cost.webp)

この分岐点は、出力1MP、参照画像1枚、学習1,000ステップ、公表価格という前提でだけ成り立つ予算上の目安です。採用できずに捨てる画像や再生成、学習用画像を用意する人の時間は含まれておらず、解像度やステップ数を変えれば分岐点も動きます。[pro]、[klein]、[dev]の画質の違いも金額には表れないので、安いルートに決める前に同じ商品で少数を出して見比べる必要があります。

## バッチを回す前に：同時24タスクの上限と402・429の扱い

BFLのAPIは、同時に実行できるタスクが24件までです。超えると`429`が返り、先に投げたタスクのどれかが終わるまで新しい依頼は受け付けられません。クレジットが切れた場合は`402`が返ります。

n8nでは次の2点で対応します。

- **同時に投げる数を抑える**：Loop Over ItemsのBatch Sizeを1にすれば、1件が保存まで終わってから次に進むので上限には触れません。速度を上げたい場合はBatch Sizeを増やすか、HTTP RequestノードのOptions→Batchingで「Items per Batch」と「Batch Interval」（ミリ秒）を設定しますが、処理中のタスクが24件を超えない範囲に収めます。
- **`402`でバッチ全体を止める**：残高不足は待っても解決しないので、再試行せずに実行を止めて通知する分岐にします。`429`は待てば解消するため、時間を置いて同じ行を送り直します。

件数を増やす前に、上の表の単価に枚数を掛けて予算を出し、最初の数件で応答の`cost`が想定どおりかを確かめておくと、参照画像の枚数や出力サイズの設定ミスによる請求の膨らみに早く気づけます。

## 生成結果で目視確認する箇所：ロゴ、ラベル文字、細かい表記

参照画像もLoRAも、商品の形や色、質感を保つ手段であって、ラベルを一字一句再現する保証ではありません。BFLのドキュメントも、商品のロゴ、ラベル、小さな文字が正確に保たれるとは約束していません。公開前に人が確認する項目を決めておきます。

- **ロゴとブランド名**：綴り、書体、配置が実物と一致しているか。
- **ラベルの文字**：内容量、成分、注意書きなどの小さな文字が、読める別の文字列に置き換わっていないか。
- **数字と記号**：型番、容量、認証マークが実物と同じか。
- **形状と個数**：キャップ、ボタン、端子など部品の数と位置が変わっていないか。
- **色**：ブランドカラーがシーンの照明で別の色に見えていないか。

ワークフローには、生成した画像をそのまま商品ページに出す経路を作らず、保存先を「確認待ち」のフォルダにして、承認したものだけを次の工程に流す形にしておくと安全です。文字の正確さが欠かせないカットでは、実物の写真を使うか、ラベル部分を後から合成するほうが確実です。

## FLUX.2 ProとLoRA、n8n連携の補足Q&A

### FLUX.2 Proはローカルで動かせる？

動かせません。FLUX.2 [pro]はAPIなどホスティング経由でのみ提供されています。ウェイトが公開されているのはFLUX.2 [klein]（4BはApache 2.0、9BはFLUX Non-Commercial License）とFLUX.2 [dev]（非商用）で、ローカルで動かす場合やLoRAを学習する場合はこの2つが対象です。

### FLUX.2のLoRA学習は何枚の画像から始められる？

falの学習エンドポイントは、10枚以上を目安とし、多いほどよいとしています。商品向けの推奨枚数やステップ数をfalは示していません。BFLの[klein]向け学習ガイドは、1,024px以上の高解像度で品質のそろった画像を使うよう勧めています。

### 1回のリクエストでLoRAを複数重ねられる？

プラットフォームで違います。BFLの`-finetuned`エンドポイントは1リクエストにつき`finetune_id`を1つしか受け付けず、重ねがけはできません。falの`fal-ai/flux-2/lora`は`loras`配列に最大3つまで指定できます。LoRAの合計サイズが2GBを超えると料金が1GBごとに50%加算され、上限は5GBです。

### ポーリングの代わりにWebhookは使える？

使えます。BFLはリクエストに`webhook_url`（と`webhook_secret`）を指定でき、falのキューAPIもWebhookに対応しています。n8n側はWaitノードのResumeを「On Webhook Call」にして受ける形になります。ループが不要になる一方で、n8nが外部から到達できるURLを持っている必要があります。BFLでは通知を受けた後も、署名付きURLの10分の期限内に画像をダウンロードする点は変わりません。
