Flux 3 Flow Map Patch
The distilled look, with a working CFG dial
- model
- model
The problem this node solves
FLUX 3 Image Klein ships as a pair: a base model and a distilled one (flux3_image_klein_sd_bf16.safetensors, or the int8_convrot variant). The distilled model is the one you want for speed - short schedules, CFG 1, done. But at CFG 1 there is no unconditional pass, so negatives do nothing and there's no contrast dial to turn. Same wall people hit on Klein 9B and Z-Image Turbo.
The base doesn't have that problem, because nobody baked guidance into it. So the move runs backwards from what you'd expect: take the base, drop on one of the distill LoRAs from WAS/flux3_klein (r256, r64, r32 or r16), then patch on the one piece a LoRA structurally cannot carry.
That piece is the target-time branch. The distill LoRA is the distilled checkpoint minus the base - but the base has no ref_time_in module, so nothing can attach a low-rank delta to it. It has to be transplanted as two dense weights. Skip it and you get what the pack's notes warn about: a fine stripe every 4 pixels down the rows, and a blue cast. Not subtle, not fixable in the prompt.
Patch it and you get the distilled picture at CFG 1 from the same seed, plus real CFG to lean on: 2.5 to 3.5 adds contrast and colour the distilled model genuinely cannot produce.
How it works
The branch is a ref_time_in embedder: two bias-free linear layers that embed the sigma each step lands on and add the result to every modulation. The node opens the safetensors file on CPU, reads only the two tensors it needs (ref_time_in.in_layer.weight, ref_time_in.out_layer.weight), checks their shapes against your base's own time embedder, builds the module with ComfyUI's manual_cast ops, then clones your model and object-patches the branch in. It also sets a flow_map flag so a second copy knows to bail. modules/model/flux3_flow_map.py is ~150 readable lines if you want the gory version.
The patch is cheap - two small matrices, no sampling math changed, no VRAM worth mentioning - and picky: it type-checks the transformer and refuses anything that isn't ComfyUI's Flux3 class, which is why half the errors below are "wrong model".
The inputs that matter
model - your base FLUX 3 Image model, from Load Diffusion Model on the bf16 file. The tooltip says it can be before or after the distillation LoRA; the shipped example puts it after (UNETLoader → LoraLoaderModelOnly → this node). Either way it lands before the sampler.
checkpoint - a dropdown over ComfyUI's diffusion_models folder, and note it is not filtered to distilled files. It defaults to flux3_image_klein_sd_bf16.safetensors when present, else the first _sd_ file it finds. Both _sd_bf16 and _sd_int8_convrot hold the same bf16 branch, so either makes a donor; a file with no _sd_ holds none.
Output: one model socket, straight into KSampler. The example graph runs 16 steps at euler / simple, denoise 1, twice - CFG 1 and CFG 2.5, same fixed seed - then shows both side by side.
Install
ComfyUI Manager, search WAS Node Suite v3. Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/WASasquatch/was-node-suite-comfyui.git
Requires ComfyUI 0.14.0 or newer and Python 3.10+. The pack installs zero packages and downloads nothing, ever - unusual for a 519-node suite, and why it doesn't fight your other packs.
The heavy part is the models: the base (11.1 GB) in diffusion_models, one distilled _sd_ checkpoint (11.1 GB) in the same folder, a distill LoRA in loras, qwen3vl_4b_int8_convrot.safetensors in text_encoders (CLIPLoader type flux3), flux2-vae.safetensors in vae. The BFL files sit behind a signed-in download.
Older tutorials calling this pack dormant since 2023 are out of date: v3 is 519 nodes, and it renamed its labels (KSampler → KSampler (Seed Socket)) so nothing shadows a core node - a genuine hazard in the v2 era.
Common issues
Stripes and a blue cast. The LoRA is on the base and this node isn't in the graph. It belongs between the LoRA and the sampler.
holds no ref_time_in weights. You picked a base file from the checkpoint menu - it lists the whole folder, so the base sits right there looking selectable. Pick something with _sd_ in the name.
takes a FLUX 3 Image model, and this one is X. You wired another architecture - a Flux 2 Klein 9B, a FLUX.1. It names the class it got, so the mistake is usually obvious.
ComfyUI's diffusion_models folder holds no ... Reload the page after putting it there. The file list is a snapshot from page load. Drop the file in, then refresh - or press R on the canvas.
It silently does nothing. The log says "the model already samples with a target-time branch": an already-patched transformer is returned untouched rather than stacked twice.
The disk cost is the real tax. 11.1 GB on hand to harvest two matrices - you can't hand it the LoRA instead.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | The FLUX 3 Image Klein base model, before or after the distillation LoRA: Load Diffusion Model on flux3_image_klein_bf16, then Load LoRA on flux3_image_klein_distill_r256, r64, r32 or r16. | |
| checkpoint | COMBO | The distilled checkpoint the branch is read from: flux3_image_klein_sd_bf16 or flux3_image_klein_sd_int8_convrot. Both hold the same bf16 branch. A file with no _sd_ holds none. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| model | MODEL | The model with the branch, for a KSampler at 16 steps: CFG 1 for the distilled picture, 2.5 to 3.5 for more contrast and colour. |