AsymFLUX2 Oklab Decode
No VAE here — this is how AsymFLUX2 turns latents back into pictures
- latent
- image
This is the node at the end of every AsymFLUX2 graph: the counterpart to VAE Decode, except there's no VAE. It takes the 3-channel Oklab pixel latent coming out of your KSampler and converts it back to a normal ComfyUI IMAGE you can drop into Save Image or Preview Image. One node, one job, and it's the only thing standing between your sampler output and a viewable picture.
The mechanism is the reverse of Oklab Encode, and it's all deterministic math. Un-normalize by the affine mean/std (defaults mean_l 0.56, mean_a 0.0, mean_b 0.01, std 0.16 - the exact settings the model was trained with), then go Oklab → LMS → linear RGB → sRGB, clamp to the [-1, 1] color range, and map to ComfyUI's usual 0-to-1 IMAGE tensor. There's a guard worth knowing: the node refuses to run on anything that isn't a 4D tensor with exactly 3 channels, and it raises a clear ValueError rather than producing garbage. If you feed it a 16-channel stock Flux latent or a 4-channel SDXL one, you get told, not corrupted.
The inputs and where it sits
latent comes from one of two places: the KSampler output (the normal t2i path) or the output of Oklab Encode (a round-trip or img2img-style start). The four floats - mean_l, mean_a, mean_b, std - must match whatever the encode side used. If you left both nodes at defaults, you're golden and you never think about them again. The output is image, wired straight into Save Image.
The graph shape you want:
Empty Pixel Latent → KSampler → Oklab Decode → Save Image
Oklab Decode replaces VAE Decode; there is no VAE in the stack, so if your muscle memory goes looking for one, you'll find nothing and that's correct. The community's most common encounter with a no-VAE model is a workflow that "looks broken" because there's no VAE loader - this whole pack is deliberately structured that way.
Where people trip
- Double decode. Don't run
Oklab Decodeand then aVAE Decodeafter it - the first already gives you a real image and the second will smear it into noise. Decode once. - Mismatched mean/std. If you changed them on Encode and forget to mirror them here, your output shifts color. Keep the pair in lockstep, or just leave both at defaults.
- Wrong latent shape. The 3-channel guard catches this. If you're seeing the
ValueError, you fed it a latent from the wrong model family. - Updating ComfyUI. This pack runs on the newer native-node API, so on a stale install the node simply won't appear.
Install is the pack's one-liner with no extra dependencies:
cd ComfyUI/custom_nodes
git clone https://github.com/Nynxz/ComfyUI-AsymFLUX2
Behind it you need FLUX.2-klein-base-9B in models/diffusion_models/, the AsymFLUX.2 adapter in models/loras/, and the Qwen3 8B encoder via CLIPLoader (type=flux2), plus both HF licenses accepted. One last honest note: the model's authors now maintain the official Lakonik/ComfyUI-piFlow pack, which this repo's own README suggests installing instead. This one remains a working alternative - and if you're already running it, this node is your endpoint: sample, decode, save.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| latent | LATENT | — | |
| mean_l | FLOAT | 0.560-1–1 | — |
| mean_a | FLOAT | 0.000-1–1 | — |
| mean_b | FLOAT | 0.010-1–1 | — |
| std | FLOAT | 0.1600.001–1 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |