FLUX.2 Klein Color Anchor
Fixing Klein's warm color shift on edits
- model
- conditioning
- MODEL
Klein has a well-documented habit on edits: the output drifts a bit warmer than the input, independent of quantization - people see it on fp8 and on fp16 alike. It's one of the model's most reported gripes, and the community's usual fix has been a hacky low-denoise DDPM pass tacked on after the main sampler. Color Anchor is a cleaner, purpose-built answer to the same problem.
What it actually corrects
This is not an identity-transfer node, and it's worth being precise about that distinction because it looks superficially similar. It reads one reference latent already sitting in your conditioning, then applies a post-CFG correction to the denoised latent's per-channel spatial mean at every sampling step - nudging the overall color statistics of your output back toward the reference. Spatial detail, structure, everything else about the image is untouched. This is color-statistic anchoring only: it fixes "the whole image looks too orange" without touching "does the face look like the reference," which is what the identity-transfer nodes are for.
The inputs that matter
strength- the ceiling on how much correction gets applied.0disables the node entirely;1applies the full scheduled correction. The author's own guidance is 0.3–0.6 as a starting range - push it too high and you're overriding the model's color decisions outright rather than nudging them.ramp_curve(optional) - shapes when the correction kicks in across the schedule, viaprogress^(1/curve).1.0is linear. Above 1 front-loads the correction and tapers off; below 1 holds back early and gets aggressive late. For short, few-step schedules (the 4–8 step territory Klein's distilled checkpoints live in), values of 2–4 are recommended because they reach useful strength quickly instead of running out of steps before the correction lands.ref_index(optional) - which reference latent to anchor colors from, when more than one is connected.channel_weights(optional) -uniformcorrects every channel equally;by_variancetrusts low-variance reference channels more, on the logic that a channel whose mean barely moves across the reference is a more reliable color signal than a noisy one.
Output is a patched MODEL - this is a sampler-time correction, not a conditioning transform, so it goes right before your KSampler.
Installing it
ComfyUI Manager: search ComfyUI-Flux2Klein-Enhancer, install, restart. Manual clone:
cd ComfyUI/custom_nodes
git clone https://github.com/capitan01R/ComfyUI-Flux2Klein-Enhancer.git
No extra dependencies.
Where people get burned
The color drift this node targets is a real, reported Klein behavior, not a rare edge case - expect to reach for this on i2i edit workflows more than on pure text-to-image. If you're not seeing the correction take effect, check that a reference latent is actually present in your conditioning (via Multi ReferenceLatent) and that ref_index points at the right one when you have more than one connected.
Strength above the recommended 0.3–0.6 band is the most common way this goes wrong - it stops looking like a fix and starts looking like the whole image got color-graded toward the reference, flattening lighting differences you actually wanted to keep. If your output looks color-locked rather than color-corrected, back the strength off before touching anything else. And if you're on a short 4-step distilled run, a linear ramp_curve of 1.0 may simply not have time to apply much correction before the schedule ends - that's exactly the case the higher ramp_curve values exist for.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| conditioning | CONDITIONING | — | |
| strength | FLOAT | 0.500–1 | Maximum correction strength. 0.3-0.6 is a good starting range. Too high and you override the model's color decisions entirely. |
| ramp_curveopt | FLOAT | 1.50.5–8 | Controls the shape of the correction ramp. Formula: progress^(1/curve). 1.0 = linear. >1 = fast start, tapers off (e.g. sqrt for curve=2). <1 = slow start, aggressive late (e.g. squared for curve=0.5). For few-step schedules (4-8 steps) values of 2-4 work well because they reach useful strength quickly. |
| ref_indexopt | INT | 00–63 | Which reference latent to anchor colors from. |
| channel_weightsopt | COMBO | uniform | uniform: correct all channels equally. by_variance: weight correction by how stable each channel's mean is in the reference (low-variance channels trusted more). |
| debugopt | BOOLEAN | false | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| MODEL | MODEL | — |