# n8n + FLUX.2 Pro 产品图工作流：Pro 不支持 LoRA，三条路线怎么选

> 截至 2026 年 10 月 2 日，FLUX.2 [pro] 没有 LoRA 字段，商品一致性靠最多 8 张参考图；要用 LoRA 得走 BFL 的 [klein] 微调端点或 fal 的 [dev]。

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

**FLUX.2 [pro] 挂不了 LoRA。** 截至 2026 年 10 月 2 日，它在 BFL 官方 API 和 fal 上的请求参数里都没有 LoRA 字段，让同一件商品在不同场景里保持一致，靠的是参考图：API 一次最多传 8 张。想用 LoRA，有两条别的路：BFL 自己的 FLUX.2 [klein] 微调端点（公测，LoRA 要自己训练后上传），或者 fal 上基于 FLUX.2 [dev] 的托管训练加 LoRA 推理。

三条路线在 n8n 里的接法几乎一样，都是“提交任务 → 等待 → 轮询状态 → 下载保存”，区别只在端点、鉴权头和请求体里的几个字段。先按自己的情况对号入座：

| 你的情况 | 路线 | 一致性靠什么 | 1 MP 单张标价 | 前期投入 |
| --- | --- | --- | --- | --- |
| SKU 多，每款只出几张 | BFL：FLUX.2 [pro] + 参考图 | 每次请求带商品图，最多 8 张 | $0.03，每张参考图加 $0.015 | 无 |
| 少量主打款或统一品牌风格，出图量大，账单想留在 BFL | BFL：FLUX.2 [klein] `-finetuned` 端点 | 自己训练的 LoRA，每次请求 1 个 | 9B 为 $0.015 | 自备显卡训练并上传 |
| 同样是大批量，但不想自己搭训练环境 | fal：FLUX.2 [dev] LoRA | 托管训练的 LoRA，最多叠 3 个 | $0.021 | 每个 LoRA 训练费 $6.40（1,000 步） |

价格分别来自 [BFL 价目表](https://bfl.ai/pricing?category=flux.2)和 fal 的模型页，都是美元标价，会变动。下面的节点设置按 BFL、fal 和 n8n 的官方文档整理，没有经过实际运行和付费调用，接批量之前先用一条商品数据单独跑通。

## FLUX.2 [pro] 能挂 LoRA 吗：BFL 和 fal 的端点都没有这个字段

不能。BFL 的 [FLUX.2 [pro] 接口文档](https://docs.bfl.ai/api-reference/models/generate-or-edit-an-image-with-flux2-%5Bpro%5D)列出的字段是 `prompt`、`input_image` 到 `input_image_8`、`width`、`height`、`seed`、`safety_tolerance`、`output_format`、`webhook_url`、`webhook_secret`、`disable_pup`，里面没有 `finetune_id`，也没有任何 LoRA 相关参数。fal 上的 [`fal-ai/flux-2-pro`](https://fal.ai/models/fal-ai/flux-2-pro/api) 同样没有 `loras` 参数。BFL 没有写过“[pro] 不支持 LoRA”这句话，这个结论来自两处参数表里都找不到入口，加上 BFL 的 LoRA 文档只列了 [klein] 系列。

让人以为可以，主要有三个原因：

- “FLUX.2 支持 LoRA”这句话对整个家族成立，对 [pro] 不成立。BFL 的 [FLUX.2 LoRA 推理文档](https://docs.bfl.ai/flux_2/flux2_lora_inference)只提供 [klein] 的 `-finetuned` 端点，没有 [pro]、[max]、[flex] 的对应端点。
- fal 的 LoRA 端点 ID 是 `fal-ai/flux-2/lora`，名字里不带型号，页面说明才写明它跑的是 FLUX.2 [dev]。
- 一些第三方介绍页把“FLUX 2 Pro 支持 LoRA 微调”当成卖点，这和上面两份第一方参数表对不上。

BFL 在 2026 年 10 月 1 日又发布了 FLUX 3 Image。这里的结论只针对 FLUX.2，新模型能不能用 LoRA 要看它自己的文档；FLUX.2 各端点仍在价目表上照常计价。

## 三条路线怎么选：先看 SKU 数量和每款出图量

每款商品只出几张图时，LoRA 的训练成本摊不下来，用 [pro] 加参考图；同一个对象要出几百张以上时，LoRA 的单张价格更低，才值得训练。

**SKU 多、每款几张**：选 FLUX.2 [pro] + 参考图。不用训练，新品上架当天就能进工作流，商品图直接从表格里的图片链接传进去。以 100 个 SKU、每款 5 张为例，500 张 × $0.045 = $22.50；同样的量如果每款都在 fal 上训练一个 LoRA，光训练费就是 100 × $6.40 = $640。

**少量主打款，或者要统一的品牌风格**：LoRA 更合适。一个 LoRA 学的可以是一件商品，也可以是一种拍摄风格（固定的布光、背景、色调），后者能跨 SKU 复用，摊薄得更快。

**用 LoRA 时选 BFL 还是 fal**：

- 想把充值、账单、密钥都留在 BFL 一处，并且手头有显卡，走 [klein] `-finetuned` 端点。它在公测期，BFL 明确说价格、参数和端点名在正式发布前都可能调整；每次请求只能用 1 个 LoRA。
- 不想自己搭训练环境，或者需要同时叠加“商品 LoRA + 风格 LoRA”，走 fal：训练和推理都是 API 调用，`loras` 数组最多放 3 个。

三条路线跑的是三个不同的模型，价格表比不出画质。换路线之前，用同一款商品在两边各出一小批对比，再决定。

## n8n 工作流骨架：提交、等待、轮询、下载四步通用

BFL 和 fal 的图片接口都是异步的：提交请求只返回一个任务地址，图片要稍后去取。所以 n8n 里不能只放一个 HTTP Request 节点，需要下面这条链路。

![n8n 调用 FLUX.2 的四个节点：提交任务、Wait 等待、查询状态不是 Ready 就回到等待、下载保存，BFL 并发上限 24 个](https://www.aifreeapi.com/posts/zh/flux-2-pro-lora-product-photography-n8n/img/n8n-flux2-async-workflow.webp)

| 顺序 | 节点 | 作用 | 关键设置 |
| --- | --- | --- | --- |
| 1 | 表格或触发器 | 读入商品行 | 每行至少有商品图链接、场景提示词、SKU 编号 |
| 2 | Loop Over Items | 分批处理 | Batch Size 先设 1，跑通后再加大 |
| 3 | HTTP Request（提交任务） | POST 到生成端点 | Header Auth 凭证，JSON 请求体 |
| 4 | Wait | 暂停几秒 | Resume 选 After Time Interval |
| 5 | HTTP Request（查询状态） | GET 任务地址 | 地址取自第 3 步的返回值 |
| 6 | If | 判断是否完成 | 未完成回到 Wait，失败走错误分支 |
| 7 | HTTP Request（下载图片） | GET 图片地址 | Response Format 选 File |
| 8 | 存储节点 | 写入网盘或对象存储，回填表格 | 文件名带 SKU 编号 |

### 凭证：BFL 用 `x-key`，fal 用 `Authorization: Key`

BFL 和 fal 都用请求头传密钥。在 HTTP Request 节点的 Authentication 里选 Generic Credential Type，再选 Header Auth，新建两个凭证：

- BFL：Name 填 `x-key`，Value 填 API Key。
- fal：Name 填 `Authorization`，Value 填 `Key ` 加上你的 FAL Key（`Key` 后面有一个空格）。

把密钥放在凭证里而不是写进请求头字段，导出或分享工作流时才不会泄露。

### 提交任务：POST 之后拿到的是轮询地址

以 BFL 为例，提交节点的 Method 选 POST，URL 填 `https://api.bfl.ai/v1/flux-2-pro`，打开 Send Body，Body Content Type 选 JSON。成功后返回的 JSON 里有 `id`、`polling_url`，以及这次请求的 `cost`、`input_mp`、`output_mp`。把 `cost` 一并写回表格，对账时用得上（1 个 credit 等于 $0.01）。

BFL 的[接入说明](https://docs.bfl.ai/api_integration/integration_guidelines)要求：用 `api.bfl.ai`、`api.eu.bfl.ai` 或 `api.us.bfl.ai` 提交时，必须用返回的 `polling_url` 去查状态，不要自己拼地址。

### Wait、查询状态与 If：循环到 `Ready` 为止

Wait 节点的 Resume 选 After Time Interval。[n8n 的 Wait 文档](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.wait/)说明，等待时间少于 65 秒时执行数据留在内存里、不落库，轮询用的几秒间隔正好落在这个范围。BFL 的示例代码每 0.5 到 1 秒查一次，文档没有规定最小间隔；在 n8n 里可以先从 3 到 5 秒起步，按实际排队情况再调。

查询状态的节点用 GET，同一个 `x-key` 凭证，URL 用表达式引用提交节点的输出：

```text
{{ $('提交任务').item.json.polling_url }}
```

这里不能写成 `{{ $json.polling_url }}`：循环回来之后，进入这个节点的数据是上一次查询的结果，里面没有 `polling_url`。`'提交任务'` 换成你给提交节点起的名字。

If 节点判断 `{{ $json.status }}`：

- 等于 `Ready`：走下载分支，图片地址在 `result.sample`。
- 等于 `Error` 或 `Failed`：走错误分支，把 SKU 编号和返回内容记到表格里，不要重新回到 Wait。
- 其他状态：连回 Wait 节点，继续等。

再加一个轮询次数上限（例如用 Edit Fields 节点累加计数，超过若干次就走错误分支），避免某个任务卡住时工作流无限循环。

### 下载保存：BFL 的图片地址 10 分钟后失效

`result.sample` 是带签名的临时地址，[BFL 文档](https://docs.bfl.ai/quick_start/generating_images)写明有效期只有 10 分钟，不开启 CORS，也不建议直接给终端用户访问。所以表格里不能只存这个链接，必须在同一次执行里把文件下载下来：

- HTTP Request 节点，GET `{{ $json.result.sample }}`，不需要带凭证。
- Options 里的 Response Format 选 File，Put Output in Field 保持 `data`。
- 后面接你的存储节点（网盘、对象存储或自建服务器），再把自己的文件地址回填到商品行。

如果 n8n 部署在有出站限制的网络里，放行 `delivery.*.bfl.ai` 这个通配域名，BFL 说明区域前缀会变。

### 批量：BFL 最多 24 个任务同时进行

BFL 账号同时进行的任务上限是 24 个，超过会返回 429，要等前面的任务结束；余额用完返回 402。Loop Over Items 的 Batch Size 不要超过 24，建议先设为 1，让每个商品完整走完“提交到保存”再处理下一个，确认循环和节点引用都正确后再提高。HTTP Request 节点的 Options → Batching 里还有 Items per Batch 和 Batch Interval（毫秒）可以控制发请求的节奏。

n8n 有公网地址时，也可以不轮询：BFL 请求体支持 `webhook_url`，fal 的队列接口同样支持回调，Wait 节点的 Resume 选 On Webhook Call 即可。轮询的好处是自建在内网的 n8n 也能用。

## 路线一：FLUX.2 [pro] 加参考图的请求体

端点 `POST https://api.bfl.ai/v1/flux-2-pro`。这是固定快照，适合要求结果可复现的批量流程；`/v1/flux-2-pro-preview` 指向最新版本。请求体：

```json
{
  "prompt": "把图中的保温杯放在浅色木质餐桌上，早晨侧逆光，背景是虚化的厨房，杯身颜色、形状和标签保持不变",
  "input_image": "{{ $json.product_image_url }}",
  "width": 1024,
  "height": 1024,
  "output_format": "jpeg"
}
```

- `input_image` 可以是图片 URL 或 base64；多角度或细节图依次放进 `input_image_2` 到 `input_image_8`。[BFL 的图像编辑文档](https://docs.bfl.ai/flux_2/flux2_image_editing)写的上限是 API 8 张、Playground 10 张，输出最大 4 MP。
- 计费按百万像素向上取整，参考图和输出分别计算，1 MP = 1024 × 1024。把白底商品图控制在 1024 × 1024 以内，一张参考图就只算 1 MP。
- 同一款商品要出多个场景时，只换 `prompt`，参考图不变；需要复现某张图时把 `seed` 固定下来。

## 路线二：BFL 的 [klein] `-finetuned` 微调端点（公测）

这条路线的 LoRA 要自己准备：按 BFL 的[训练指南](https://docs.bfl.ai/flux_2/flux2_klein_training)，用 AI-Toolkit 或 Diffusers 针对 FLUX.2 [klein] Base 模型训练，最低配置是 4B Base 12 GB 显存、32 GB 内存，9B Base 22 GB 显存、64 GB 内存。训练完成后：

1. 在 BFL Dashboard 的 Customization → Finetunes 里点 Add Finetune，选择对应的基础模型，上传 `.safetensors` 文件。
2. Name 只能用小写字母、数字、连字符和下划线，这个名字就是请求里的 `finetune_id`；可以顺便设一个触发词。
3. 在 n8n 的提交节点里把 URL 换成与基础模型对应的端点，例如 `https://api.bfl.ai/v1/flux-2-klein-9b-finetuned`。

```json
{
  "prompt": "ohwx 保温杯放在露营桌上，傍晚暖光，浅景深",
  "finetune_id": "my-thermos-lora",
  "finetune_strength": 1.0,
  "width": 1024,
  "height": 1024
}
```

要注意的限制都写在 [LoRA 推理文档](https://docs.bfl.ai/flux_2/flux2_lora_inference)里：

- 端点必须和 LoRA 的基础模型一致。给 9B 训练的 LoRA 调 `flux-2-klein-4b-finetuned` 会直接失败。可选端点有 `flux-2-klein-4b-finetuned`、`flux-2-klein-9b-finetuned`、`flux-2-klein-9b-kv-finetuned`、`flux-2-klein-9b-kv-bf16-finetuned`、`flux-2-klein-base-4b-finetuned`、`flux-2-klein-base-9b-finetuned`。
- 每次请求只接受一个 `finetune_id`，不能叠加多个 LoRA。
- `finetune_strength` 默认 1.0。如果不管提示词写什么，出图都像训练集，固定 `seed` 在 0.7 到 0.9 之间试。设了触发词就要写进 `prompt`，光调强度不会生效。
- 其他参数和基础端点相同，包括 `input_image`，所以 LoRA 和参考图可以一起用；[klein] 的参考图上限是 4 张。
- 公测期间按基础端点同价计费，轮询方式、10 分钟签名地址和 24 个并发任务的限制也都一样，n8n 骨架不用改。

许可要单独确认：[klein] 4B 的开放权重是 Apache 2.0，9B 是 FLUX Non-Commercial License。基于 9B 训练的 LoRA 通过 BFL API 出图后能否商用，公开文档里没有写明，商用前向 BFL 确认授权条款。

## 路线三：fal 托管训练，加 FLUX.2 [dev] 的 LoRA 推理

fal 把训练也做成了 API，整条路线不需要显卡。它的[队列接口](https://docs.fal.ai/model-apis/model-endpoints/queue)和 BFL 的流程是同一个形状，字段名不同：

| 步骤 | BFL | fal |
| --- | --- | --- |
| 提交 | `POST https://api.bfl.ai/v1/{端点}` | `POST https://queue.fal.run/{模型 ID}` |
| 鉴权头 | `x-key` | `Authorization: Key …` |
| 提交后返回 | `id`、`polling_url` | `request_id`、`status_url`、`response_url` |
| 查询状态 | GET `polling_url` | GET `status_url` |
| 完成标志 | `status` 为 `Ready` | `status` 为 `COMPLETED` 且没有 `error` 字段 |
| 取图 | `result.sample` | 再 GET 一次 `response_url`，取 `images[0].url` |

fal 多一步：状态到 `COMPLETED` 之后，结果要再请求一次 `response_url` 才拿得到。另外失败的请求最终状态也是 `COMPLETED`，只是多了 `error` 字段，If 节点要同时判断这两个条件。

**训练**（每个 LoRA 做一次，可以单独建一个工作流）：POST 到 `https://queue.fal.run/fal-ai/flux-2-trainer`。

```json
{
  "image_data_url": "https://your-storage.example.com/thermos-dataset.zip",
  "default_caption": "a photo of ohwx thermos bottle",
  "steps": 1000
}
```

[训练端点文档](https://fal.ai/models/fal-ai/flux-2-trainer/api)的要求是：`image_data_url` 指向一个图片压缩包，建议至少 10 张、越多越好；每张图可以配一个同名 `.txt` 描述，没有配的话必须给 `default_caption`，否则训练失败。`steps` 默认 1,000，可设 100 到 10,000，费用是 0.0064 × 步数，1,000 步即 $6.40。结果里的 `diffusers_lora_file.url` 就是 LoRA 文件地址。fal 没有给出针对商品的数据集或步数建议。

**推理**：POST 到 `https://queue.fal.run/fal-ai/flux-2/lora`。

```json
{
  "prompt": "ohwx thermos bottle on a camping table, warm evening light, shallow depth of field",
  "loras": [
    { "path": "{{ $json.lora_url }}", "scale": 1 }
  ],
  "image_size": { "width": 1024, "height": 1024 },
  "num_images": 1,
  "output_format": "jpeg"
}
```

- [`fal-ai/flux-2/lora`](https://fal.ai/models/fal-ai/flux-2/lora/api) 的 `loras` 最多 3 个，`scale` 范围 0 到 4、默认 1；`image_size` 用预设值或 512 到 2048 像素的自定义宽高；`num_images` 可以一次出 1 到 4 张。
- 既要 LoRA 又要带商品参考图，用 `fal-ai/flux-2/lora/edit`，多一个 `image_urls` 字段，最多 4 张；输入图会缩到 1 MP 并按 $0.021/MP 另计。
- LoRA 文件总大小超过 2 GB 后每多 1 GB 加价 50%，上限 5 GB。
- 许可同样因平台而异：fal 的模型页给这个端点标了 Commercial use，而 BFL 对 [dev] 权重自部署的许可是非商用。在哪里跑，就看哪里的条款。

## 单张多少钱：1 MP 下 $0.015 到 $0.06，LoRA 的分界在 267 张

按标价算，1 MP 输出、参考图不超过 1 MP 时，三条路线的单张成本在 $0.015 到 $0.06 之间；fal 的 LoRA 要到同一个 LoRA 出图 267 张以上，才比 [pro] 加一张参考图便宜。

| 路线与配置（输出 1 MP） | 单张 | 500 张 |
| --- | --- | --- |
| BFL [pro]，纯文字 | $0.03 | $15.00 |
| BFL [pro] + 1 张参考图 | $0.03 + $0.015 = $0.045 | $22.50 |
| BFL [pro] + 2 张参考图 | $0.06 | $30.00 |
| BFL [klein] 9B `-finetuned`，纯文字 | $0.015 | $7.50（不含自己训练的硬件和电费） |
| BFL [klein] 9B `-finetuned` + 1 张参考图 | $0.015 + $0.002 = $0.017 | $8.50 |
| fal [dev] LoRA，纯文字 | $0.021 | $10.50，另加每个 LoRA $6.40 训练费 |
| fal [dev] LoRA + 1 张参考图 | $0.021 × 2 = $0.042 | $21.00，另加训练费 |

![FLUX.2 Pro 加一张参考图与 fal LoRA 的成本公式对比：同一个 LoRA 出图 267 张起更便宜，500 张时为 $22.50 对 $16.90](https://www.aifreeapi.com/posts/zh/flux-2-pro-lora-product-photography-n8n/img/flux2-lora-cost-break-even.webp)

分界线这样算。设同一个 LoRA 一共出 n 张图：

```text
fal LoRA 总成本    = 6.40 + 0.021 × n
[pro] + 1 张参考图 = 0.045 × n

6.40 + 0.021n < 0.045n  →  n > 6.40 ÷ 0.024 ≈ 266.7
```

两侧代入核对：n = 266 时，LoRA 是 $11.986，[pro] 是 $11.97，[pro] 便宜；n = 267 时，LoRA 是 $12.007，[pro] 是 $12.015，LoRA 便宜。所以分界在每个 LoRA 267 张。

这个数只在所列前提下成立：1 MP 输出、一张不超过 1 MP 的参考图、训练 1,000 步、双方现行标价。步数加到 2,000，训练费变成 $12.80，分界升到 534 张（12.80 ÷ 0.024 ≈ 533.3）；输出分辨率、参考图数量变了，也要重新代入。它也没有计入废片重跑、准备数据集的人工，以及三个模型之间的画质差异，只能用来做预算，不能当成“超过 267 张就该换路线”的结论。

跑批量之前，把计划张数乘以对应单价，再和 BFL 返回的 `cost` 字段核对头几条，数字对得上再放开批量。

## 哪些结果不能直接上架：logo、标签文字和小字要人工抽检

参考图和 LoRA 都只是让模型尽量贴近你的商品。BFL 的文档没有承诺 logo、标签文字、配料表这类小字能和原图逐字一致，生成结果在这些地方出错时，一眼扫过去往往看不出来。

在工作流里留一个人工环节，比事后撤图便宜：

- 存储节点之后，把表格里的状态写成“待审核”，而不是直接推到店铺或投放平台。
- 抽检时对着原图看四处：logo 的字形和位置、标签上的文字、颜色、商品的形状和比例（瓶盖、把手、接口这类细节）。
- 带法规信息的包装（成分、规格、认证标志）不要用生成图替代实拍，生成图只用来做场景和氛围。
- 不合格的图换 `seed` 重跑，或者增加一张细节参考图；用 LoRA 的路线可以再把 `finetune_strength` 或 `scale` 调一档。

## 相邻的几个问题

### FLUX.2 [pro] 不用 LoRA，怎么让商品保持一致？

用参考图。把商品的白底图放进 `input_image`，需要时再加不同角度或细节图，API 最多 8 张，在提示词里写明哪些特征保持不变。每多一张不超过 1 MP 的参考图，BFL 多收 $0.015。

### n8n 调用 FLUX.2 需要专门的 BFL 节点吗？

不需要专用节点。三条路线都用 n8n 自带的 HTTP Request 节点加 Header Auth 凭证实现，配合 Wait、If 和 Loop Over Items 完成轮询；BFL 和 fal 的接口都是普通的 HTTPS 请求。

### 不想调 API，想在本地 ComfyUI 里跑 FLUX 和 LoRA，可以吗？

可以，但那是另一种部署方式：模型和 LoRA 都在自己的显卡上运行，n8n 调的是你的 ComfyUI 服务而不是 BFL 或 fal。本地环境的搭建可以参考[ComfyUI FLUX 完整指南：8GB显存也能运行的AI绘画神器（2025最新）](/zh/posts/comfyui-flux)，注意那篇写的是 FLUX.1 时期的模型。

### 产品图一定要用 FLUX.2 吗？

不一定。如果还没定模型，先按任务比较几家的编辑能力、文字渲染和价格，见[2026 图片模型怎么选：GPT Image 2、Nano Banana、Midjourney、FLUX.2 与 Seedream](/zh/posts/nano-banana-2-vs-midjourney-vs-gpt-image-vs-flux2)。
