DEV Community

AI-KSK
AI-KSK

Posted on Edited on Originally published at bilibili.com

FLUX 3 Klein Tested: 5.6B Open Weights, Native 4K, and Seven ComfyUI Workflows

A source-based look at Black Forest Labs' newest open image model and the seven ComfyUI graphs that ship with our walkthrough — what each graph connects, what the video claims, and where the two stop agreeing.


The short version

FLUX 3 Image Klein is an open-weights image model: 5.6B parameters, text-to-image, image editing, multi-reference generation, and bounding-box layout prompting, with native high-resolution output.

The companion video reports the numbers most people care about: 16 steps on the distilled checkpoint, 50 on the base checkpoint, roughly 4 seconds for a 1-megapixel image on an RTX 5090, and a theoretical 8 GB VRAM floor. Those are the creator's measurements and the model card's figures. This article did not re-run them, and you should treat them as reported, not reproduced.

What this article does do is read the seven distributed JSON files node by node. That turns out to matter, because three things people repeat about this release — "ten reference images", "a 28-run benchmark in the workflow", "boxes that keep everything else pixel-identical" — are not what the files contain.


Base or distilled? What the video tested, and what the files contain

BFL shipped two checkpoints. Our graphs select them by filename:

Checkpoint Steps CFG Where it appears
flux3_image_klein_base_int8_convrot.safetensors 50 3.5 workflows 01, 03, 07
flux3_image_klein_sd_int8_convrot.safetensors (step-distilled) 16 1.0 workflows 02, 04, 05, 06, 07

In the video, from 05:33, the creator reports 28 comparison tests between the two checkpoints and walks through the pairs on screen: portraits, full-body figures, product text, interior architecture, a two-person scene with a red bicycle and a coffee cup, a black dress recoloured to green, an earring swap, and a standing-to-sitting pose change. The summary is that editing results are close, text-to-image differences are small, and the distilled model occasionally edges ahead — which is why the recommendation is to default to distilled.

That account comes from the video. Workflow 07, the A/B graph, contains no test data at all — it is a two-branch comparison graph you run yourself. Its absence proves the export does not include the test series; it does not disprove the tests in the video. If you want to verify the count of 28, check the video frames, not the JSON.

What the JSON does confirm is the configuration the comparison ran on: the base branch samples at 25 steps, CFG 3.5, the distilled branch at 16 steps, CFG 1.0, sharing one prompt, one zeroed negative conditioning, one empty latent and one VAE. Note that 25 is not 50 — the shipped A/B graph deliberately uses a cheaper base setting, so a like-for-like comparison against the video needs that step count raised.


What is actually in the seven files

# File Top-level nodes Nested What it is
01 image_flux3_klein_t2i.json 8 14 Base text-to-image, wrapped in a subgraph
02 image_flux3_klein_distilled_t2i.json 9 14 Distilled text-to-image, separate subgraph definition
03 image_flux3_klein_image_edit.json 25 0 Base image editing, box + reference image
04 image_flux3_klein_distilled_image_edit.json 25 0 Distilled image editing, different negative path
05 05_F05_Distilled_MultiReference_1to10.json 12 0 Reference composition — two connected inputs
06 06_F06_Distilled_BoundingBox_Layout_Edit.json 13 0 Bounding-box layout request
07 07_F07_Base_vs_Distilled_A_B.json 14 0 Two-branch output comparison

106 top-level nodes and 28 nodes inside two subgraph definitions. The two text-to-image files share a subgraph identifier but store different definitions — do not deduplicate them by name.


The seven graphs

01 — Base text-to-image, in a subgraph

Eight top-level nodes hide a fourteen-node definition: loaders, prompt generation and switching, conditioning, latent, sampling, decoding. The outer resolution selector at node 19 drives width and height, and the subgraph's latent node is linked to those inputs — so the stored 1024×1024 widget values inside are not the effective resolution.

The prompt switch takes its boolean from an outer enable_prompt_upsampler input; the inner switch's saved false does not tell you which branch is selected. Same for the sampler: its stored array is not a recipe.

One trap worth naming: the top-level box helper feeds a layout-text preview only. It is not connected to the generation prompt. Editing those boxes changes nothing downstream.

02 — Distilled text-to-image

Same shape, different definition, distilled checkpoint. The box helper again reaches only a preview. The source note suggests trying 4–16 steps; that is a suggestion, not a measurement.

03 — Base image editing

Base loader is node 59; the reference image at 54 feeds the box background, the reference-latent input, the comparer, and the prompt-expansion image batch. Switch 51 takes generated text on on_false and layout text on on_true, with false saved. Negative conditioning comes from encoder 58.

Two things to ignore: node 44 (EmptyFlux2LatentImage) is not on the sampler path, so changing it does not resize anything; node 60 is a disconnected text encoder. And the save prefix still says distilled although the loader selects the base file — trust the loader, not the prefix.

04 — Distilled image editing

SD loader at node 1, reference image at 11, same switch arrangement as 03 but a different negative path: ConditioningZeroOut at node 32 instead of a negative text encoder. The saved edit request concerns an earring; it is a request, not an observed result.

05 — Multi-reference: two inputs are connected

The filename says 1to10. The file connects two LoadImage nodes, 4 and 5, into images.image0 and images.image1 of reference node 8. The prompt at node 6 assigns the person to <ref_image_0> and the clothing to <ref_image_1>.

That matches what the creator says in the video around 05:02: one or two reference images work well, and four or more degrade. The "1 to 10" label describes the model's reference mechanism, not the shipped configuration — and it is why the collection's cover for this workflow was rewritten. If you want more inputs, check the installed node's interface yourself; nothing in this export demonstrates a tested ten-image run.

ConditioningZeroOut at node 7 sits on the negative path. It does not switch off a reference slot, and it does not disconnect either image input — an easy misreading because the node sits right next to the reference wiring.

06 — Bounding-box layout

Image 4 supplies the background for CreateBoundingBoxes at 6. Box elements feed Flux3LayoutPrompt at 7, whose string connects to the text input of encoder 5. Saved canvas is 1024×1024 with the main-subject box at x=320, y=100, w=360, h=800. Unlike 01 and 02, this path is genuinely connected to conditioning.

What it is not: a mask. There is no dedicated mask input here, the saved rectangle does not prove regional isolation, and the file gives no evidence for a universal 0–1000 coordinate protocol or particular src_bbox/tgt_bbox semantics. The creator says the same thing at around 04:31 — "this technique is not a hard mask, it cannot keep everything outside the box unchanged" — and describes it as a stronger attention hint. If you need pixel-exact preservation, this is the wrong tool.

07 — Base vs distilled comparison

Two model branches share prompt 3, zeroed negative conditioning 4, empty latent 5 and VAE 2. There is no LoadImage in the graph: the comparer receives the two saved-image outputs (AIKSK_F07_Base, AIKSK_F07_Distilled), not an original photograph plus two results.

So this graph produces a pair per prompt. The 28-test series in the video is a set of runs someone made with it — not something bundled in the file.


What I checked, and what I did not

Checked, by reading the JSON: node counts, connections on both ends, selected model filenames, sampler step and CFG values, box coordinates, save prefixes, and which previews are actually wired in.

Not checked here: whether the graphs run on your machine, actual VRAM use, speed, output quality, model licensing for commercial use, or the accuracy of any benchmark number. No inference was run for this article. Where the video gives a measurement, it is labelled as the video's.

One inherited claim I removed rather than repeated: an earlier version of this post cited a specific composite benchmark score against Qwen Image 2.1. I could not trace that number to the video or the model card, so it is gone. The video's own framing — that BFL claims three first-place results among open-weight models and that this is the vendor's own evaluation — is the honest version.


Getting the files

Everything below is published by this channel. The graphs are free to download; the model weights are separate and carry their own licence.


Verdict

Klein's selling point is not that it beats everything. It is that open weights, high-resolution output, editing and reference composition arrive in one 5.6B model that fits on consumer hardware — and the distilled checkpoint is fast enough to explore with.

The caveats are the ones this article spent its length on: reference counts in the shipped graphs are two, not ten; the A/B graph holds no test series; boxes bias layout without masking; and ConditioningZeroOut is not a reference-slot switch. None of that makes the model worse. It just changes what you should expect when you press queue.


Written from a static read of the seven distributed JSON files, the episode subtitles, and the published video metadata. The 28-run comparison is the creator's test series shown in the video; no inference was run while preparing this article. Weights are distributed by Black Forest Labs under their own licence — check it before commercial use.

Resource entry points

Top comments (0)