How to Fine-Tune FLUX With an API: When It Pays, Which Model, What It Costs

Why teams fine-tune FLUX, when reference images suffice, which FLUX to train on (FLUX 3 Image Klein, FLUX.2, FLUX.1) and what 1,000 images cost after training.

Jim Cai12 min read
How to Fine-Tune FLUX With an API: When It Pays, Which Model, What It Costs

Fine-tune when a subject, face or look must stay identical across hundreds of images and text-only prompts; for a handful of images, reference-image editing on FLUX.2 [dev] or FLUX 3 Image Klein needs no training. For a new project, train on FLUX 3 Image Klein with blackforestlabs/flux-3/klein/base/trainer ($4.30 for 1,000 steps) and serve the LoRA on the Klein LoRA endpoints ($0.012 per megapixel distilled, $0.035 base). Choose FLUX.1 [dev] when you need its large LoRA ecosystem, and FLUX.2 [dev] for the largest open FLUX model.

Generating one good image is solved. Generating the same product, the same face or the same illustration style in the five-hundredth image is not. A text prompt describes a subject in words, and words leave room: the label shifts, the jawline changes, the brand's flat pastel style drifts toward the model's own default look. Consistency is where generative imagery stops being a demo and becomes a production system, and it is the problem fine-tuning solves.

This guide covers why teams fine-tune an image model, when they don't need to, why FLUX is the usual base, which FLUX version to train on, and the data, cost and code for doing it through an API.

The problems fine-tuning solves

Teams that ship images at volume need one subject or look held fixed while everything else changes. Photoshoots and manual retouching hold it fixed, but they cost the same for the hundredth image as for the first. Reference images help, but they are another input to manage on every call, and the result can still drift. Fine-tuning moves the subject into the model, so a short text prompt is enough to bring it back.

The patterns that come up most:

  • Product catalogs. A retailer needs each product in lifestyle scenes, seasonal backdrops and every ad format, with the label, shape and colour exact.
  • Brand style. A marketing team wants every campaign asset in the house illustration style, whoever writes the prompt.
  • Characters. A game studio or a children's-book app needs the same character in hundreds of scenes, poses and expressions.
  • Personalized avatars. A consumer app trains one small adapter per user from a few selfies and generates that person in new settings.
  • Repeatable edits. A marketplace needs every seller photo cut out and placed on the brand's backdrop, with the same light, every time.
  • House photo look. A real-estate or food platform wants all generated imagery to share one grade, lens feel and composition.

What a LoRA is, in plain words

Full fine-tuning rewrites every weight of the base model and produces a new multi-gigabyte model you then have to host. A LoRA (low-rank adaptation) instead trains a small set of extra weights that sit beside the frozen base model and nudge its output toward your subject or style.

That makes it the practical form of fine-tuning:

  • Small. The result is a single .safetensors file, a fraction of the base model's size.
  • Cheap. A run on a hosted trainer costs a few dollars and finishes without you managing a GPU.
  • Swappable per request. The LoRA endpoints in this guide take the file's URL on each call, so one endpoint can serve a different LoRA per customer, brand or campaign. The FLUX 3 Image Klein LoRA endpoints accept up to three at once, each with its own strength from 0 to 4.1
  • Base model unchanged. You keep the base model's general skills and switch the LoRA off for everything else.

The limit is that a LoRA only works on the base model it was trained against. Choosing that base model is the decision that lasts.

Do you need to fine-tune at all?

Not always. Recent FLUX models can hold a subject from a reference image with no training. Black Forest Labs describes FLUX.2 [dev] as doing "character, object and style reference without additional training in one model",2 and FLUX.1 Kontext [dev] as able to "have character, style and object reference without any finetuning".3 FLUX 3 Image Klein takes up to 10 reference images per request.4

A practical rule:

  • Start with reference-image editing for a few images, a one-off campaign, or a subject that changes every week. Pass the reference to an edit endpoint and iterate on the prompt.
  • Fine-tune when one of these holds:
    • The same identity or style must stay locked across hundreds or thousands of images.
    • You need it from text-only prompts, with no reference image to manage per call.
    • Exact product details matter: label text, logo placement, stitching, proportions.
    • Reference editing drifts after a few generations or across scene changes.

The two also combine. An edit LoRA trained on your before-and-after pairs makes a reference-image workflow repeatable.

Why FLUX is the usual base

  • Open weights you can adapt. Black Forest Labs publishes the weights. FLUX.1 [dev] is a 12-billion-parameter rectified flow transformer for text-to-image.5 FLUX.2 [dev] is 32 billion parameters and handles generation plus single- and multi-reference editing.2 FLUX.1 Kontext [dev] is a 12-billion-parameter model for instruction editing.3 FLUX 3 Image Klein is a 5.6-billion-parameter model for generation and editing, with a separate undistilled base checkpoint for "fine-tuning, LoRA training and research".4
  • A large LoRA ecosystem. Hugging Face lists more than 40,000 adapters built on FLUX.1 [dev].5 Black Forest Labs calls it "the most popular open image model globally".6 Training tools and ComfyUI workflows already target it.
  • Capabilities that brand work needs. Black Forest Labs designed FLUX.2 for "reading and writing complex text, adhering to brand guidelines, and reliably handling lighting, layouts, and logos".6 In its own evaluations, FLUX 3 Image Klein ranks first among open-weights models in text-to-image, multi-reference generation and editing, with 91 Elo over FLUX.2 [klein] 9B in text-to-image.7
  • Hosted trainers and LoRA endpoints. On fal, every FLUX generation in this guide has a trainer and a matching LoRA inference endpoint, so the whole loop is two API calls.

When another base model fits better: if your product already serves another open model, train on that one, because the LoRA has to match it. fal also hosts trainers for Qwen-Image and Z-Image Turbo. For video, see How to fine-tune Wan with the API.

Which FLUX to train on

The names overlap, so first the map. "FLUX 3" on its own is Black Forest Labs' video model, which fal serves at endpoints such as blackforestlabs/flux-3/text-to-video. FLUX 3 Image Klein is the open 5.6B image model released in October 2026, shipped as a distilled checkpoint for fast generation and a base checkpoint for training.47 FLUX.2 [klein] is the earlier 4B and 9B FLUX.2 family. They are different models, and their LoRAs are not interchangeable.

If you needTrain onWhy
A new project, cost per image mattersFLUX 3 Image KleinNewest open FLUX image model, lowest per-image LoRA price
Existing FLUX.1 LoRAs, workflows or community toolingFLUX.1 [dev]The largest LoRA ecosystem
The largest open FLUX model, multi-reference editingFLUX.2 [dev]32B parameters
A repeatable edit with several inputs per exampleFLUX 3 Image Klein editUp to 10 input images per training pair
A repeatable single-image edit on an existing Kontext stackFLUX.1 Kontext [dev]Matches what you already serve

Our recommendation: start new work on FLUX 3 Image Klein. Stay on FLUX.1 [dev] if your product already depends on its LoRAs or tools. Use FLUX.2 [dev] when Klein's quality is not enough for your subject and the higher per-image price is acceptable.

The trainers, their LoRA endpoints and default prices:

GoalTrainer endpointServe withDefault stepsPrice at default
Subject, product or style on FLUX 3 Image Kleinblackforestlabs/flux-3/klein/base/trainerblackforestlabs/flux-3/klein/base/text-to-image/lora or blackforestlabs/flux-3/klein/text-to-image/lora1,000$4.30
An edit on FLUX 3 Image Kleinblackforestlabs/flux-3/klein/base/trainer/editblackforestlabs/flux-3/klein/base/edit-image/lora or blackforestlabs/flux-3/klein/edit-image/lora1,000$4.22 with one input image
Style, product or character on FLUX.1 [dev]fal-ai/flux-lora-fast-trainingfal-ai/flux-lora1,000$2.00
A person's face on FLUX.1 [dev]fal-ai/flux-lora-portrait-trainerfal-ai/flux-lora2,500$6.00
Style, product or character on FLUX.2 [dev]fal-ai/flux-2-trainer-v2fal-ai/flux-2/lora1,000$6.40
An edit on FLUX.1 Kontext [dev]fal-ai/flux-kontext-trainerfal-ai/flux-kontext-lora1,000$2.50
An edit on FLUX.2 [dev]fal-ai/flux-2-trainer-v2/editfal-ai/flux-2/lora/edit1,000$11.82 with one reference image

Prices are from each trainer's model page.891011121314 FLUX.2 [klein] trainers also exist, fal-ai/flux-2-klein-9b-base-trainer and fal-ai/flux-2-klein-4b-base-trainer.15

Each FLUX 3 Image Klein LoRA has two serving options. The base endpoints run the undistilled model with guidance, which the trainer page recommends. The distilled endpoints are step-distilled for speed and cost about a third as much.114 Generate the same test prompts on both, and serve distilled if your subject holds.

Prepare a dataset the trainer can read

Every trainer takes one zip file by URL. The naming rules decide whether the job runs at all.

TrainerFiles in the zipCaptionsIf a caption is missing
FLUX 3 Image Kleinphoto.jpg (PNG, JPG or WebP), optional photo.txtCaptions as writtentrigger_phrase is used; it is required if any image lacks a caption
FLUX 3 Image Klein edititem_start.jpg, item_start2.jpg and so on, up to 10 inputs; item_end.jpg; optional item.txtThe .txt file holds the edit instructiontrigger_phrase is used
FLUX.1 fast trainingphoto.jpg, optional photo.txt, optional photo_mask.jpgtrigger_word is used only when you supply no captionsThe trainer captions the image, unless is_style is on
FLUX.1 portraitphoto.jpg, optional photo.txt[trigger] in a caption is replaced by trigger_phrasetrigger_phrase is used
FLUX.2 [dev]photo.png, photo.txtPut your trigger token in the captionsdefault_caption is used; with neither, training fails
Kontext and FLUX.2 edititem_start.jpg, item_end.jpg, item.txtThe .txt file holds the edit instructiondefault_caption is used; with neither, training fails

Pairs on the Klein edit trainer may have different numbers of inputs, and the price multiplier rises with the inputs per pair.13 The FLUX 3 Image Klein trainers also take a resolution of 512, 768 or 1024 (the default), keeping each image's aspect ratio.14

What changes the result:

  • Count. The FLUX.1 fast trainer needs at least 4 images; the portrait and FLUX.2 trainers ask for 10 or more.8910 For a style, 9 to 50 images is typical.10 Consistency matters more than volume.
  • Resolution. Use 1024x1024 or larger, with no compression artifacts.810 Crop out watermarks and borders, or the LoRA learns them.
  • Vary what you do not want learned. If every product shot has the same backdrop, the LoRA reproduces the backdrop.
  • Caption the parts that change. Describe setting, pose and light, and name the subject only by its trigger token, so the token binds to what stays constant. FLUX 3 Image Klein is trained on detailed captions, so write full sentences.1
  • Pick a token that means nothing yet, such as ACMEBOTTLE.

Price the steps before you run

All these trainers bill per step, so you can price a run before you submit it.

StepsFLUX 3 Image KleinFLUX.1 fastFLUX.1 portraitKontextFLUX.2 [dev]
500$2.15$1.00$2.40 (minimum)$1.25 (minimum)$3.20
1,000$4.30$2.00$2.40$2.50$6.40
2,000$8.60$4.00$4.80$5.00$12.80
2,500$10.75$5.00$6.00$6.25$16.00

FLUX 3 Image Klein bills $0.0043 per step with a 100-step minimum.14 Its edit trainer bills $0.002 per step times a multiplier for the inputs per pair: 2.11 with one, 6.95 with four, up to 23.44 with ten.13 The portrait trainer charges a $2.40 minimum and Kontext requires at least 500 steps.911

Because runs are cheap, train three step counts in parallel and compare, rather than iterating one run at a time. A 500 / 1,000 / 2,000 sweep costs $15.05 on FLUX 3 Image Klein, $7.00 on the FLUX.1 fast trainer and $22.40 on FLUX.2 [dev]. Too few steps and the subject does not stick; too many and outputs copy the training set.

Train and generate in Python

Install the client and set your key:

bash
pip install fal-client
export FAL_KEY="your-api-key"

Training is a queued job. Submit it, store the request ID so a restart does not lose the job, and fetch the result when the status is Completed.

python
import time
import fal_client

TRAINER = "blackforestlabs/flux-3/klein/base/trainer"

# 1. Upload the dataset to fal storage
dataset_url = fal_client.upload_file("dataset.zip")

# 2. Submit the training job
handle = fal_client.submit(
    TRAINER,
    arguments={
        "images_data_url": dataset_url,
        "trigger_phrase": "a photo of ACMEBOTTLE",
        "steps": 1000,
    },
)
request_id = handle.request_id
print("training request:", request_id)

# 3. Poll until the job completes
while True:
    status = fal_client.status(TRAINER, request_id, with_logs=True)
    if isinstance(status, fal_client.InProgress) and status.logs:
        print(status.logs[-1]["message"])
    if isinstance(status, fal_client.Completed):
        break
    time.sleep(15)

training = fal_client.result(TRAINER, request_id)
lora_url = training["lora_file"]["url"]
print("LoRA:", lora_url)

# 4. Generate with the LoRA
image = fal_client.subscribe(
    "blackforestlabs/flux-3/klein/base/text-to-image/lora",
    arguments={
        "prompt": "ACMEBOTTLE on a marble kitchen counter, morning light from a window on the left, shallow depth of field, product photo",
        "loras": [{"path": lora_url, "scale": 1.0}],
        "image_size": {"width": 1024, "height": 768},
        "seed": 42,
    },
)
print(image["images"][0]["url"])

In production, replace the polling loop with a webhook: pass webhook_url to fal_client.submit and fal calls your server when training ends.16 The trainer returns lora_file, the weights, and config_file, the training configuration.14

The Klein endpoints expand short prompts into a full caption by default (enable_prompt_expansion). If outputs lose the subject, write the full caption yourself, with the trigger token in it, and set enable_prompt_expansion to false.1

To train on another FLUX, the field names change:

BaseTrainerDataset fieldTriggerWeights in the output
FLUX 3 Image Kleinblackforestlabs/flux-3/klein/base/trainerimages_data_urltrigger_phraselora_file
FLUX.1 [dev]fal-ai/flux-lora-fast-trainingimages_data_urltrigger_worddiffusers_lora_file
FLUX.2 [dev]fal-ai/flux-2-trainer-v2image_data_urlIn captions, or default_captiondiffusers_lora_file

Serve FLUX.1 LoRAs with fal-ai/flux-lora and FLUX.2 LoRAs with fal-ai/flux-2/lora, which takes up to three LoRAs per request and also accepts a Hugging Face repo ID as the path.1718 The FLUX.2 and Kontext trainers can write ComfyUI key names: set output_lora_format to comfy.1011

The same calls from Node

javascript
import { readFile } from "node:fs/promises";
import { fal } from "@fal-ai/client";

const TRAINER = "blackforestlabs/flux-3/klein/base/trainer";

const zip = new File([await readFile("dataset.zip")], "dataset.zip", {
  type: "application/zip",
});
const datasetUrl = await fal.storage.upload(zip);

const { request_id } = await fal.queue.submit(TRAINER, {
  input: { images_data_url: datasetUrl, trigger_phrase: "a photo of ACMEBOTTLE", steps: 1000 },
  webhookUrl: "https://your-app.example.com/fal/training-done",
});

// Later, in your webhook handler or a status check:
const training = await fal.queue.result(TRAINER, { requestId: request_id });
const loraUrl = training.data.lora_file.url;

const image = await fal.subscribe("blackforestlabs/flux-3/klein/text-to-image/lora", {
  input: {
    prompt: "ACMEBOTTLE on a marble kitchen counter, morning light from a window on the left, product photo",
    loras: [{ path: loraUrl, scale: 1.0 }],
  },
});
console.log(image.data.images[0].url);

Call fal from your server, not from the browser, so your key stays private.

What training plus 1,000 images costs

Training is paid once. Inference is paid on every image. This table prices one default training run plus 1,000 images at one megapixel each.

PathTraining1,000 imagesTotal
FLUX 3 Image Klein, distilled LoRA endpoint at $0.012/MP$4.30$12.00$16.30
FLUX 3 Image Klein, base LoRA endpoint at $0.035/MP$4.30$35.00$39.30
FLUX.2 [dev] + fal-ai/flux-2/lora at $0.021/MP$6.40$21.00$27.40
FLUX.1 fast training + fal-ai/flux-lora at $0.035/MP$2.00$35.00$37.00
FLUX.1 portrait + fal-ai/flux-lora at $0.035/MP$6.00$35.00$41.00

Inference prices are from the endpoint pages.11718 Klein on the distilled endpoint costs $2.30 more to train than the FLUX.1 fast trainer and $0.023 less per image, so it is the cheaper path from 100 images on. Against FLUX.2 [dev] it is cheaper on both lines. If you expect volume, choose the base model by its per-image price and output quality, not by its training price.

Three details move the inference bill:

  • The Klein LoRA endpoints count any image up to 1024x1024 as one megapixel and a 2048x2048 image as 1.56, so large outputs cost less per pixel.1
  • fal-ai/flux-lora rounds each image up to the nearest megapixel. An image a little over 1 MP bills as 2 MP, which doubles its cost.18
  • On fal-ai/flux-2/lora, LoRAs larger than 2 GB in total add 50% per extra GB, up to a 5 GB limit.17

Where the LoRA goes next

A trained FLUX LoRA is a file URL, not an endpoint. The hosted LoRA endpoints above load it on each request, so you can serve a different LoRA per customer or brand with nothing to deploy. When you need your own code around the model, many adapters behind one endpoint, or a base model fal does not host a trainer for, see How to Deploy a LoRA as an API.

FAQ

Is FLUX 3 Image Klein the same as FLUX.2 [klein]?

No. FLUX.2 [klein] is the earlier 4B and 9B family. FLUX 3 Image Klein is a separate 5.6B model, and a LoRA trained on one does not work on the other.4

What is the cheapest way to fine-tune FLUX through an API?

The FLUX.1 fast trainer has the lowest training price, $2.00 for 1,000 steps.8 Over a production run, FLUX 3 Image Klein on its distilled LoRA endpoint costs less from about 100 images on, at $0.012 per megapixel.1

Why did my training job fail at once?

Most often, captions are missing. The FLUX.2 trainers need a .txt caption per image or a default_caption, and the FLUX 3 Image Klein trainers need trigger_phrase when any image lacks a caption.1014 Also check the dataset field: FLUX.2 uses image_data_url; the others use images_data_url.

Can I reuse a FLUX.1 LoRA on FLUX.2 or FLUX 3 Image Klein?

No. A LoRA changes the weights of one model. Train again on the new base with the same dataset.

References

References

  1. FLUX 3 Klein LoRA endpoints, fal: text-to-image, base text-to-image, edit and base edit. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7

  2. FLUX.2 [dev] model card, Black Forest Labs. ↩ ↩2

  3. FLUX.1 Kontext [dev] model card, Black Forest Labs. ↩ ↩2

  4. FLUX 3 Image Klein and FLUX 3 Image Klein Base model cards, Black Forest Labs. ↩ ↩2 ↩3 ↩4

  5. FLUX.1 [dev] model card, Black Forest Labs. ↩ ↩2

  6. FLUX.2: Frontier Visual Intelligence, Black Forest Labs. ↩ ↩2

  7. FLUX 3 Image Klein, Black Forest Labs. ↩ ↩2

  8. FLUX LoRA fast training and API, fal. ↩ ↩2 ↩3 ↩4

  9. FLUX LoRA portrait trainer, fal. ↩ ↩2 ↩3

  10. FLUX.2 [dev] Trainer V2 and API, fal. ↩ ↩2 ↩3 ↩4 ↩5 ↩6

  11. FLUX.1 Kontext trainer, fal. ↩ ↩2 ↩3

  12. FLUX.2 [dev] edit trainer API, fal. ↩

  13. FLUX 3 Klein Edit LoRA Trainer and API, fal. ↩ ↩2 ↩3

  14. FLUX 3 Klein LoRA Trainer and API, fal. ↩ ↩2 ↩3 ↩4 ↩5 ↩6

  15. FLUX.2 [klein] 9B base trainer and 4B base trainer, fal. ↩

  16. fal Docs: fal_client Python reference. ↩

  17. FLUX.2 [dev] with LoRAs, fal. ↩ ↩2 ↩3

  18. FLUX.1 [dev] with LoRAs and API, fal. ↩ ↩2 ↩3

Build with generative media on fal

Hundreds of production-ready image, video, and audio models behind one API.