본문으로 건너뛰기

FLUX.2 pro LoRA 제품 사진 n8n 자동화: pro엔 LoRA 입력이 없다

SKU가 많고 제품당 몇 장이면 FLUX.2 [pro] + 참조 이미지, 한 제품으로 267장 이상이면 fal의 dev LoRA가 정가 기준 더 쌉니다. n8n 뼈대는 세 경로가 같습니다.

A
••10 분 분량•AI 이미지 생성
발광 받침대 위의 큰 FLUX.2 [pro] 블록과 LoRA를 받는 [klein], [dev] 작은 블록 두 개를 그린 2.5D 일러스트

FLUX.2 [pro]에는 LoRA를 붙일 수 없습니다. 2026년 10월 2일 기준 BFL의 FLUX.2 [pro] API 레퍼런스에는 LoRA나 finetune_id를 받는 필드가 없고, fal의 fal-ai/flux-2-pro에도 loras 파라미터가 없습니다. 같은 제품을 여러 장면에서 똑같이 보이게 하려는 목적이라면 선택지는 세 가지입니다.

경로제품을 고정하는 방법호출하는 곳1MP 한 장 정가
A. FLUX.2 [pro] + 참조 이미지제품 사진을 input_image로 전달(API 최대 8장)BFL /v1/flux-2-pro$0.045(참조 1장 포함)
B. FLUX.2 [klein] + LoRA직접 학습한 LoRA를 대시보드에 올리고 finetune_id로 호출BFL /v1/flux-2-klein-9b-finetuned 등$0.015
C. FLUX.2 [dev] + LoRAfal에서 학습하고 loras 배열로 호출(최대 3개)fal fal-ai/flux-2/lora$0.021 + 학습 $6.40

SKU가 많고 제품당 몇 장만 필요하면 A, 주력 제품 몇 개나 브랜드 톤 하나로 수백 장을 뽑는다면 B나 C가 맞습니다. 세 경로 모두 비동기 API라서 n8n 워크플로의 뼈대는 같고, 바뀌는 것은 URL, 인증 헤더, 요청 본문 세 가지입니다.

아래 n8n 설정은 BFL, fal, n8n 공식 문서의 필드와 응답 형식을 맞춰 구성한 것이며 실제 계정에서 실행한 결과가 아닙니다. 처음에는 한 건만 넣어 응답 필드를 확인한 뒤 배치로 늘리십시오.

FLUX.2 [pro]에 LoRA를 붙일 수 있나: 요청 스키마에 LoRA 필드가 없다

붙일 수 없습니다. BFL API의 POST https://api.bfl.ai/v1/flux-2-pro가 받는 필드는 prompt, input_image부터 input_image_8까지, width, height, seed, safety_tolerance, output_format, webhook_url, webhook_secret, disable_pup입니다. BFL이 "[pro]는 LoRA를 지원하지 않는다"고 문장으로 밝힌 것은 아니고, 스키마에 해당 필드가 없으며 LoRA용 엔드포인트 목록에 [pro]가 없다는 뜻입니다.

"FLUX.2가 LoRA를 지원한다"는 말이 틀린 것은 아닙니다. 다만 대상 모델이 다릅니다.

  • BFL API: FLUX.2 LoRA Inference 문서에 나오는 -finetuned 엔드포인트 여섯 개는 모두 FLUX.2 [klein] 계열입니다. [pro], [max], [flex]용은 없습니다. Public Beta라서 BFL은 가격, 파라미터, 엔드포인트 이름이 정식 출시 전에 바뀔 수 있다고 적어 두었습니다.
  • fal: fal-ai/flux-2/lora는 FLUX.2 [dev]에 LoRA를 얹는 엔드포인트입니다.

"FLUX.2 Pro가 LoRA 파인튜닝을 지원한다"는 식의 소개가 돌아다니는 까닭은 [pro], [klein], [dev]가 모두 FLUX.2라는 이름을 쓰기 때문입니다. 요청을 보낼 때는 모델과 플랫폼을 함께 확인해야 합니다. [pro]가 제품 일관성에 쓰라고 내놓은 수단은 참조 이미지이며, FLUX.2 이미지 편집 가이드에 따르면 API에서 최대 8장, 플레이그라운드에서 최대 10장을 한 번에 참조하고 출력은 최대 4MP입니다.

BFL은 2026년 10월 1일 FLUX 3 Image를 내놓았지만 FLUX.2 엔드포인트와 가격은 그대로 올라 있습니다.

어느 경로를 고를까: SKU 수와 제품당 장수로 정한다

LoRA는 제품 하나(또는 스타일 하나)마다 학습 비용과 준비 시간이 따로 듭니다. 참조 이미지는 준비 비용이 없는 대신 매 요청마다 참조 요금이 붙습니다. 그래서 기준은 카탈로그 모양입니다.

상황맞는 경로이유감수할 점
SKU 수십수백 개, 제품당 310장A. [pro] + 참조 이미지SKU마다 학습할 필요가 없고 제품 사진 URL만 있으면 됨장당 요금이 가장 높음
주력 제품 몇 개로 수백 장, GPU가 있고 결제를 BFL 한 곳으로 모으고 싶음B. [klein] + LoRA장당 요금이 가장 낮고 학습 비용이 API 요금에 없음학습을 직접 해야 함, 요청당 LoRA 1개, Public Beta
주력 제품이나 브랜드 톤으로 수백 장, 학습 환경이 없음C. fal [dev] + LoRA학습과 추론을 모두 호스팅으로 처리, LoRA 3개까지 조합LoRA 하나당 학습비, 결제처가 fal로 나뉨

B를 고를 때 확인할 것이 두 가지 더 있습니다. BFL의 klein 학습 가이드는 최소 사양으로 klein 4B Base에 VRAM 12GB와 RAM 32GB, 9B Base에 VRAM 22GB와 RAM 64GB를 적고 있습니다. 그리고 오픈 웨이트의 라이선스가 4B는 Apache 2.0, 9B는 FLUX Non-Commercial License입니다. 9B 기반 LoRA를 BFL API로 상업 서비스에 쓸 때의 조건은 공개 문서에 구체적으로 적혀 있지 않으므로 9B를 쓸 계획이면 BFL에 라이선스를 먼저 확인하십시오.

C에도 라이선스 메모가 하나 있습니다. BFL은 [dev] 웨이트를 로컬 전용, 비상업용으로 안내하지만 fal의 해당 모델 페이지에는 상업 이용 표시가 붙어 있습니다. 같은 모델이라도 어디에서 실행하느냐에 따라 조건이 달라집니다.

경로 사이의 화질 차이는 요금표로는 알 수 없습니다. [pro], [klein], [dev]는 서로 다른 모델이므로 자기 제품 3~5개로 같은 장면을 뽑아 직접 비교한 뒤 정하는 편이 안전합니다. FLUX.2 외의 모델까지 후보에 넣는다면 2026 이미지 생성 모델 비교: GPT Image 2, Nano Banana, Midjourney, FLUX.2 선택법에서 용도별 기준을 볼 수 있습니다.

장당 비용: [pro] + 참조 1장 $0.045, klein LoRA $0.015, dev LoRA $0.021

2026년 10월 2일 기준 정가이며 모두 미국 달러입니다. BFL 요금은 BFL 가격표, fal 요금은 각 모델 페이지에서 가져왔습니다.

요청계산장당
[pro], 텍스트만, 1MP첫 1MP $0.03$0.03
[pro], 참조 1장, 1MP$0.03 + 참조 $0.015$0.045
[pro], 참조 2장, 1MP$0.03 + $0.015 × 2$0.06
[pro], 참조 1장, 2MP 출력$0.03 + 추가 1MP $0.015 + 참조 $0.015$0.06
[klein] 9B LoRA, 텍스트만, 1MP첫 1MP $0.015$0.015
[klein] 9B LoRA, 참조 1장, 1MP$0.015 + 참조 $0.002$0.017
fal [dev] LoRA, 텍스트만, 1MPMP당 $0.021$0.021
fal [dev] LoRA 편집, 참조 1장, 1MP입력 1MP + 출력 1MP, 각 $0.021$0.042

계산 전제는 세 가지입니다. BFL은 1MP를 1024×1024로 보고, 출력과 참조 이미지 각각의 해상도를 다음 MP로 올림합니다. 그래서 1024×1024보다 큰 참조 이미지를 넣으면 위 금액보다 비싸집니다. -finetuned 엔드포인트는 Public Beta 동안 기반 엔드포인트와 같은 요금이고, 정식 출시 때 바뀔 수 있습니다. fal의 [dev] LoRA는 LoRA 파일 합계가 2GB를 넘으면 GB당 50%씩 할증됩니다.

500장 배치와 LoRA 분기점 267장

1MP로 500장을 만든다고 하면 다음과 같습니다.

  • A. [pro] + 참조 1장: 500 × $0.045 = $22.50
  • B. [klein] 9B LoRA: 500 × $0.015 = $7.50(자체 GPU 학습 비용 제외)
  • C. fal [dev] LoRA: 500 × $0.021 = $10.50, 여기에 LoRA 하나당 학습비 $6.40. LoRA 하나로 500장을 모두 뽑으면 합계 $16.90
1MP 500장 예시에서 세 경로의 비용 계산: pro와 참조 1장 $22.50, klein 9B LoRA $7.50, fal dev LoRA는 학습비 $6.40 포함 $16.90

C의 학습비는 fal-ai/flux-2-trainer의 공식인 0.0064 × steps에서 나옵니다. 기본값 1,000 steps면 $6.40입니다.

제품 하나를 기준으로 A와 C가 갈리는 지점은 이렇게 구합니다. 한 제품으로 n장을 만들 때 C가 더 싸려면 6.40 + 0.021n < 0.045n이어야 하고, 풀면 n > 266.7입니다. 266장이면 C가 $11.986, A가 $11.97로 A가 쌉니다. 267장이면 C가 $12.007, A가 $12.015로 C가 쌉니다. 즉 LoRA 하나로 267장 이상 뽑을 때부터 C가 유리합니다.

이 분기점은 전제에 따라 크게 움직입니다.

  • C에서도 참조 이미지를 한 장 넣으면 장당 $0.042가 되어 A와의 차이가 $0.003으로 줄어듭니다. 6.40 + 0.042n < 0.045n을 풀면 n > 2,133.3이므로 2,134장부터 C가 쌉니다.
  • SKU 100개에 5장씩이면 총 500장으로 같지만 C는 LoRA가 100개 필요합니다. 학습비만 100 × $6.40 = $640이고 추론 $10.50을 더하면 $650.50입니다. A는 $22.50입니다.
  • 학습 steps를 늘리거나 출력 해상도를 올리면 양쪽 금액이 모두 바뀝니다.

위 계산은 정가만 놓고 본 예산 산수입니다. 버리는 컷, 재시도, 모델 간 품질 차이, 학습용 사진을 준비하는 사람의 시간은 들어 있지 않습니다.

n8n 워크플로 뼈대: 제출, Wait, 폴링, If, 다운로드 순서

BFL과 fal 모두 요청을 보내면 이미지 대신 작업 ID와 조회용 URL을 돌려줍니다. 그래서 HTTP Request 노드 하나로는 끝나지 않고 다음 순서가 필요합니다.

  1. 입력: Google Sheets나 Airtable 등에서 행을 읽습니다. 열은 sku, reference_url(제품 사진 URL), scene_prompt(장면 설명) 정도면 됩니다.
  2. Loop Over Items: Batch Size를 1로 두고 한 행씩 처리합니다.
  3. 제출(HTTP Request, POST): 경로별 URL과 본문으로 생성 요청을 보냅니다.
  4. Wait: Resume를 After Time Interval로 두고 몇 초 기다립니다.
  5. 폴링(HTTP Request, GET): 제출 응답에 들어 있던 조회 URL을 호출합니다.
  6. If: 상태가 완료면 다음으로, 실패면 오류 기록으로, 그 외에는 4번 Wait로 되돌립니다.
  7. 다운로드(HTTP Request, GET): 결과 URL을 Response Format File로 받아 바이너리 필드에 담습니다.
  8. 저장: Google Drive, S3 같은 자체 저장소에 올리고 시트에 최종 URL과 상태를 기록한 뒤 Loop Over Items로 돌아갑니다.

호출은 HTTP Request 노드로 하고, 인증은 Generic Credential Type의 Header Auth로 넣습니다. 자격 증명은 플랫폼별로 하나씩 만듭니다.

항목BFL(경로 A, B)fal(경로 C)
Header Auth의 Namex-keyAuthorization
Header Auth의 ValueBFL API 키Key 뒤에 fal 키
제출 응답에서 쓸 값polling_urlstatus_url, response_url
완료 상태status가 Readystatus가 COMPLETED
실패 판별status가 Error 또는 FailedCOMPLETED인데 error 필드가 있음
결과 이미지 URLresult.sampleresponse_url 응답의 images[0].url
n8n 비동기 워크플로의 네 단계인 제출, 대기와 폴링, 상태 판별, 다운로드와 저장, 그리고 BFL과 fal에서 달라지는 헤더와 응답 필드

Wait 간격은 35초 정도로 시작하면 됩니다. BFL 공식 예제는 0.51초마다 조회하지만 문서에 최소 간격 규정은 없고, n8n의 Wait 노드는 65초 미만 대기를 실행 데이터를 데이터베이스로 넘기지 않고 처리합니다. If에서 Wait로 되돌아가는 반복에는 횟수 상한을 두십시오. 상한이 없으면 상태가 바뀌지 않는 작업 하나가 워크플로 전체를 붙잡습니다.

경로 A: FLUX.2 [pro]에 제품 사진을 참조 이미지로 넣기

제출 노드의 URL은 https://api.bfl.ai/v1/flux-2-pro입니다. flux-2-pro는 고정 스냅숏이고 flux-2-pro-preview는 최신 버전을 가리킵니다. 카탈로그 전체의 톤이 중간에 달라지면 곤란한 배치 작업에는 고정 스냅숏이 맞습니다.

본문은 JSON으로 보냅니다. 프롬프트에 따옴표나 줄바꿈이 들어가도 JSON이 깨지지 않도록 JSON.stringify로 감쌉니다.

json
{
  "prompt": {{ JSON.stringify($json.scene_prompt) }},
  "input_image": {{ JSON.stringify($json.reference_url) }},
  "width": 1024,
  "height": 1024,
  "output_format": "jpeg"
}

input_image에는 URL이나 base64를 넣을 수 있고, 다른 각도의 사진을 더 주려면 input_image_2부터 input_image_8까지 이어서 씁니다. 참조 이미지가 한 장 늘 때마다 1MP 기준 $0.015가 더해집니다.

제출 응답에는 id, polling_url과 함께 cost, input_mp, output_mp가 들어 있습니다. cost를 시트에 같이 기록해 두면 배치가 끝난 뒤 예상 금액과 대조할 수 있습니다.

폴링 노드의 URL에는 제출 노드의 응답을 참조하는 식을 넣습니다. 제출 노드 이름이 BFL 제출이라면 다음과 같습니다.

text
{{ $('BFL 제출').item.json.polling_url }}

BFL 통합 가이드는 api.bfl.ai를 쓸 때 반드시 응답으로 받은 polling_url을 쓰라고 안내합니다. 조회 주소를 직접 조립하지 마십시오. 폴링에도 같은 x-key 자격 증명이 필요합니다.

If 노드는 {{ $json.status }}가 Ready와 같은지 봅니다. 참이면 다운로드 노드에서 {{ $json.result.sample }}을 GET으로 받고 Response Format을 File로 지정합니다.

경로 B: klein -finetuned 엔드포인트에 finetune_id 넣기

n8n에서 바뀌는 것은 URL과 본문의 두 필드뿐입니다. 인증, 폴링, 다운로드는 경로 A와 같습니다. 그 전에 n8n 밖에서 할 일이 있습니다.

  1. AI-Toolkit이나 Diffusers로 FLUX.2 [klein] Base 모델에 맞춰 LoRA를 학습합니다. BFL API는 학습을 대신해 주지 않습니다.
  2. BFL 대시보드의 Customization → Finetunes에서 .safetensors 파일을 올리고 기반 모델을 고릅니다. 이때 정한 이름이 finetune_id가 됩니다. 이름에는 영문 소문자, 숫자, 하이픈, 밑줄만 쓸 수 있습니다.
  3. 트리거 문구를 설정했다면 프롬프트에 그 문구를 반드시 넣습니다.
json
{
  "prompt": {{ JSON.stringify($json.scene_prompt) }},
  "finetune_id": "my-product-lora",
  "finetune_strength": 1.0,
  "width": 1024,
  "height": 1024,
  "output_format": "jpeg"
}

URL은 LoRA의 기반 모델과 일치해야 합니다. 9B로 올린 LoRA는 https://api.bfl.ai/v1/flux-2-klein-9b-finetuned로, 4B로 올린 LoRA는 /v1/flux-2-klein-4b-finetuned로 호출합니다. 어긋나면 요청이 실패합니다.

finetune_strength의 기본값은 1.0입니다. 어떤 장면을 요청해도 학습 사진과 비슷한 결과만 나온다면 같은 seed로 0.7~0.9 사이를 바꿔 가며 맞추라는 것이 BFL 문서의 안내입니다. 요청 하나에는 LoRA를 하나만 쓸 수 있으므로 제품 LoRA와 스타일 LoRA를 겹치는 스태킹은 이 경로에서 되지 않습니다. 대신 -finetuned 엔드포인트도 input_image 계열 필드를 받으므로 LoRA와 참조 이미지를 함께 쓸 수는 있습니다.

경로 C: fal에서 LoRA를 학습하고 fal-ai/flux-2/lora 호출하기

학습은 제품마다 한 번이므로 별도 워크플로로 떼어 두는 편이 깔끔합니다. fal-ai/flux-2-trainer에 제품 사진을 zip으로 묶은 URL을 image_data_url로 보냅니다. fal은 최소 10장을 권하고 많을수록 좋다고 적고 있습니다. 이미지마다 같은 이름의 .txt 캡션을 넣지 않을 경우 default_caption을 지정해야 하며, 둘 다 없으면 학습이 실패합니다. 결과로 받는 diffusers_lora_file의 URL이 추론 요청의 path가 됩니다.

추론 워크플로의 제출 노드 URL은 https://queue.fal.run/fal-ai/flux-2/lora입니다.

json
{
  "prompt": {{ JSON.stringify($json.scene_prompt) }},
  "loras": [
    { "path": {{ JSON.stringify($json.lora_url) }}, "scale": 1 }
  ],
  "image_size": { "width": 1024, "height": 1024 },
  "num_images": 1,
  "output_format": "jpeg"
}

loras에는 최대 3개까지 넣을 수 있고 scale의 범위는 04, 기본값은 1입니다. image_size의 가로와 세로는 5122,048px 사이여야 합니다.

fal의 큐 API는 제출 응답으로 request_id, status_url, response_url, cancel_url을 돌려줍니다. 폴링 노드는 status_url을 호출하고, 상태는 IN_QUEUE, IN_PROGRESS, COMPLETED 순으로 바뀝니다. BFL과 다른 점은 두 가지입니다.

  • 실패한 요청도 COMPLETED로 끝납니다. If 노드에서 status만 보지 말고 error 필드가 비어 있는지도 함께 확인해야 합니다.
  • COMPLETED 뒤에 response_url을 한 번 더 GET으로 호출해야 결과가 나옵니다. 이미지 주소는 그 응답의 images[0].url입니다.

제품 사진을 참조로 함께 넣으려면 fal-ai/flux-2/lora/edit를 쓰고 image_urls에 최대 4장을 넣습니다. 이 경우 입력과 출력 MP가 모두 과금되어 1MP 기준 장당 $0.042입니다.

배치를 돌릴 때 걸리는 제한: 서명 URL 10분, 동시 작업 24개

BFL의 result.sample은 10분 동안만 유효한 서명 URL입니다. delivery.*.bfl.ai에서 제공되고 CORS가 꺼져 있으며, BFL은 이 주소를 최종 사용자에게 직접 내보내지 말고 내려받아 자체 인프라에서 제공하라고 안내합니다. 워크플로에 미치는 영향은 분명합니다.

  • 시트에 result.sample을 그대로 저장하지 마십시오. 10분 뒤에는 열리지 않습니다. 다운로드와 저장소 업로드까지 끝낸 뒤 자체 URL을 기록합니다.
  • 다운로드 노드를 사람이 승인하는 단계 뒤에 두지 마십시오. 검수는 자체 저장소에 올린 파일을 대상으로 합니다.
  • 방화벽으로 나가는 주소를 제한하는 환경이라면 개별 리전 호스트가 아니라 delivery.*.bfl.ai 와일드카드를 허용합니다.

BFL API는 동시에 진행 중인 작업을 24개까지 허용하고, 넘으면 429를 돌려줍니다. Loop Over Items의 Batch Size가 1이면 한 번에 한 작업만 돌기 때문에 이 제한에 닿지 않습니다. 속도를 올리려고 묶음 크기를 키우거나 워크플로를 여러 개 동시에 돌린다면 합계가 24를 넘지 않게 잡아야 합니다. HTTP Request 노드의 Options → Batching에 있는 Items per Batch와 Batch Interval(밀리초)로 제출 속도를 늦출 수 있습니다.

402는 크레딧이 떨어졌다는 뜻입니다. 재시도해도 해결되지 않으므로 429와 구분해서 처리하고, 402가 나오면 루프를 멈추고 알림을 보내는 쪽이 낫습니다. 배치를 시작하기 전에 장수 × 장당 요금으로 필요한 크레딧을 먼저 계산해 두십시오. BFL 크레딧은 1크레딧이 $0.01입니다.

생성 결과에서 사람이 확인할 것: 로고, 라벨 문구, 작은 글씨

참조 이미지든 LoRA든 제품이 원본과 똑같이 나온다는 보장은 없습니다. BFL 문서는 다중 참조로 일관성을 유지할 수 있다고 설명하지만 로고, 라벨, 작은 글씨가 정확히 재현된다고 약속하지는 않습니다. 상세페이지 이미지로 쓰기 전에 다음을 원본과 나란히 놓고 확인하십시오.

  • 로고의 형태와 철자
  • 라벨에 적힌 문구, 용량, 성분, 인증 마크
  • 제품의 색, 비율, 뚜껑이나 버튼 같은 부품의 개수와 위치
  • 패키지의 작은 글씨가 읽을 수 있는 실제 문구인지

표시 사항이 정확해야 하는 대표 이미지는 실제 촬영본을 쓰고, 생성 이미지는 연출 컷과 배너 배경에 쓰는 식으로 역할을 나누면 위험이 줄어듭니다. n8n에서는 저장 단계 뒤에 시트의 상태 열을 검수 대기로 기록해 두고, 사람이 승인한 행만 쇼핑몰에 올리는 두 번째 워크플로로 넘기면 됩니다.

자주 묻는 질문

FLUX.2 [pro]에서 LoRA 스태킹을 할 수 있나요?

할 수 없습니다. [pro]는 LoRA 입력 자체가 없습니다. 여러 LoRA를 겹치려면 fal의 fal-ai/flux-2/lora(FLUX.2 [dev])에서 loras 배열에 최대 3개를 넣습니다. BFL의 klein -finetuned 엔드포인트는 요청당 LoRA 1개만 받습니다.

BFL API만으로 LoRA 학습까지 할 수 있나요?

추론만 됩니다. BFL의 LoRA 기능은 직접 학습한 .safetensors 파일을 대시보드에 올린 뒤 -finetuned 엔드포인트로 호출하는 방식입니다. 학습까지 API로 처리하려면 fal의 fal-ai/flux-2-trainer를 쓰고, 그 결과물은 FLUX.2 [dev]용 LoRA이므로 fal에서 추론합니다.

n8n에서 폴링 대신 웹훅을 써도 되나요?

됩니다. BFL은 요청 본문의 webhook_url로, fal은 큐 API의 웹훅으로 완료 알림을 보낼 수 있고, n8n의 Wait 노드에는 On Webhook Call로 재개하는 옵션이 있습니다. 다만 BFL의 서명 URL은 웹훅으로 받아도 10분 안에 내려받아야 한다는 점은 같습니다. 처음 연결할 때는 폴링 쪽이 응답을 눈으로 확인하기 쉽습니다.