Z Image Trainer
general trainerfal-ai/z-image-trainer
Trains Z-Image Turbo — not the base model, despite the plain name.
Don't let the generic name fool you: this trains on Z-Image Turbo, Tongyi-MAI's fast 6B text-to-image model, not the base model. What you train against is exactly what the turbo inference endpoint serves. Its training_type switch picks whether the LoRA absorbs content, style or both. For the undistilled base model, use z-image-base-trainer instead.
What goes in the zip
Flat zip of at least 10 images with optional name.txt captions. Uncaptioned images use default_caption; with neither set the run fails.
Good starting point
steps: 1000learning_rate: 0.0001Parameters
Schema facts come straight from the fal API; the notes are ours.
Required
image_data_urlstringrequiredURL to a zip archive of your training images, optionally with matching .txt caption files.
In the atelier: The album you hand the painter. It is the single biggest factor in what the LoRA becomes.
Tip: 15 to 30 sharp, varied images beat 200 sloppy ones. Vary angle, lighting and background; keep the subject consistent.
Watch out: Duplicate or near-duplicate images push the LoRA toward memorizing instead of learning.
Raw schema description
URL to zip archive with images of a consistent style. Try to use at least 10 images, although more is better. The zip can also contain a text file for each image. The text file should be named: ROOT.txt For example: photo.txt This text file can be used to specify the edit instructions for the image pair. If no text file is provided, the default_caption will be used. If no default_caption is provided, the training will fail.
Optional
stepsintegerdefault: 1000100 – 10000How many training iterations the model runs on your dataset. More steps means the LoRA sees your images more times.
In the atelier: Practice repetitions. Too few and the painter never picks up the skill. Too many and he stops learning and starts memorizing your exact photos.
Tip: Around 1000 is a solid default for a 15 to 30 image subject dataset. Small datasets need fewer steps, not more.
Watch out: If outputs start reproducing your training photos almost exactly (same pose, same background), you overtrained. Go back down.
Raw schema description
Total number of training steps.
learning_ratenumberdefault: 1e-4How big each learning update is. Controls how aggressively the model changes per step.
In the atelier: The painter's eagerness. A high rate is frantic practice: fast but sloppy, and it can wreck habits he already had. A low rate is careful practice: slow, but precise.
Tip: Stay near the trainer's default unless you have a reason. If results look fried or oversaturated, lower it. If the subject barely shows after many steps, raise it slightly or add steps.
Watch out: Learning rate and steps trade off against each other. Doubling both at once is how datasets get burned.
Raw schema description
Learning rate applied to trainable parameters.
default_captionstringCaption used for any image that has no .txt caption file in the zip.
In the atelier: The note the painter assumes when a photo in the album has no note attached.
Tip: For edit trainers this often carries the whole instruction, like 'turn this sketch into a finished painting'.
Raw schema description
Default caption to use when caption files are missing. If None, missing captions will cause an error.
training_typeenumdefault: balancedcontent | style | balancedPicks what the LoRA absorbs: 'content' learns what is in the images, 'style' learns how they look, 'balanced' splits the difference.
Tip: Start balanced. Switch to style for art styles, content for subjects and objects.
Raw schema description
Type of training to perform. Use 'content' to focus on the content of the images, 'style' to focus on the style of the images, and 'balanced' to focus on a combination of both.
Call it
import { fal } from "@fal-ai/client";
const result = await fal.subscribe("fal-ai/z-image-trainer", {
input: {
"image_data_url": "https://your-cdn.com/dataset.zip",
"steps": 1000,
"learning_rate": 0.0001
},
logs: true,
});
console.log(result.data);