Latent Noise Injection Sampler (CRT)
A KSampler with a built-in detail fix
- model
- positive
- negative
- latent_image
- image
- vae
- latent
- image
Plastic skin. Over-smoothed detail. That flat, slightly airbrushed look you get out of Flux and a few other flow-matching models at default settings. There's a known community fix for it - re-inject a bit of fresh noise partway through sampling rather than letting the whole trajectory denoise cleanly - and this node is that fix, built into the sampler itself instead of something you bolt on separately.
How it works
Under the hood this is a full custom KSampler: model, positive/negative conditioning, sampler and scheduler choice, CFG, steps, denoise, seed - the standard set. On top of that it layers two systems. First, a two-stage sigma-shaping pass (stage1_sigma_factor/stage1_sigma_start/stage1_sigma_end and the matching stage2_* fields, plus details_amount_stage1/stage2), which reshapes how aggressively detail gets resolved across two separate noise ranges - conceptually similar to the "detail daemon" style sigma tricks the community has been hand-building with third-party sampler packs. Second, and the node's namesake: at a chosen point in the sampling trajectory (injection_point), it injects a controlled amount of extra noise (injection_strength) using its own seed offset (injection_seed_offset), optionally normalized (normalize_injected_noise), and continues denoising from there. This is exactly the "use noise injection in ComfyUI" fix that's floated around as a mitigation for Flux's homogenized-face problem - this node makes it a built-in toggle instead of a separate manual step.
There's also an edit_model_flux2klein flag that enables ReferenceLatent-style conditioning specifically for edit models like Flux 2 Klein, which has largely displaced Kontext as the community's preferred local editor.
The inputs that actually matter for a first run
This node has a lot of knobs, and most of them are not what you should touch first:
model,positive, and optionalnegative,latent_image- the usual sampler wiring.sampler_name/scheduler/cfg/steps/denoise/seed- standard KSampler fields, same behavior as anywhere else.enable_noise_injection(default "enable") andinjection_strength(default 0.1) - the one dial worth adjusting if output looks too smooth: nudgeinjection_strengthup a bit, or turn injection off entirely (disable) if you want a plain sampler with none of this behavior.- Everything under
stage1_*/stage2_*/details_amount_*and the rest of the injection fields - leave these at default until you understand exactly what they're doing. They're genuinely advanced sigma-manipulation controls, not settings a first pass needs.
Optional image and vae let it run as an image-to-latent sampler too. Outputs are latent and image.
How to install it
Part of CRT-Nodes - via ComfyUI Manager, search CRT-Nodes and install; manually, git clone https://github.com/PGCRT/CRT-Nodes.git into custom_nodes, pip install -r requirements.txt, restart.
Common issues & troubleshooting
Output looks noisier or grittier than a plain KSampler, not more detailed. injection_strength is too high relative to your model and step count - back it off in small increments rather than large jumps; this parameter is sensitive.
No visible effect at all. Check enable_noise_injection is actually set to "enable" - it's an enum, not a boolean, and it's easy to assume it's on by default when toggling other fields.
Trying to use it as a plain edit-model sampler and getting odd conditioning behavior. edit_model_flux2klein changes how conditioning is applied specifically for reference-based editing - leave it off unless you're actually working with an edit model like Klein that expects that ReferenceLatent-style setup.
Inputs (26)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| positive | CONDITIONING | — | |
| sampler_name | COMBO | euler | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 |
| scheduler | COMBO | simple | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 |
| cfg | FLOAT | 1.00–100 | — |
| steps | INT | 101–10000 | — |
| denoise | FLOAT | 1.000–1 | — |
| seed | INT | 00–18446744073709550000 | — |
| edit_model_flux2klein | BOOLEAN | false | Enable ReferenceLatent-style conditioning for edit models |
| stage1_sigma_factor | FLOAT | 1.0050–100 | — |
| stage2_sigma_factor | FLOAT | 0.9950–100 | — |
| stage1_sigma_start | FLOAT | 0.3000–1 | — |
| stage1_sigma_end | FLOAT | 0.5000–1 | — |
| stage2_sigma_start | FLOAT | 0.0000–1 | — |
| stage2_sigma_end | FLOAT | 0.7000–1 | — |
| details_amount_stage1 | FLOAT | 0.50-5–5 | — |
| details_amount_stage2 | FLOAT | 0.15-5–5 | — |
| enable_noise_injection | COMBO | enable | 2 options: disable, enable |
| injection_point | FLOAT | 0.500–1 | — |
| injection_seed_offset | INT | 1-100–100 | — |
| injection_strength | FLOAT | 0.10-20–20 | — |
| normalize_injected_noise | COMBO | enable | 2 options: enable, disable |
| negativeopt | CONDITIONING | — | |
| latent_imageopt | LATENT | — | |
| imageopt | IMAGE | — | |
| vaeopt | VAE | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| latent | LATENT | — |
| image | IMAGE | — |