Mirror Correction Euler Sampler
The Euler ancestral that looks before it leaps
- SAMPLER
Euler ancestral is the sampler people reach for when they want variety - it adds fresh noise every step, so it never quite settles, which is exactly what you want for exploring a seed. Its weakness is that each step only sees one slope estimate. This node spends a few extra model calls up front to actually check the curvature, then falls back to plain Euler ancestral. That's the whole pitch: smarter where it matters, cheap where it doesn't.
The mechanism is a Heun-style correction wearing a "mirror" name. In the first correction_phase fraction of steps, it computes a probe latent with x_probe = 2·D(x) − x - reflecting the current latent through its own denoised prediction - then runs the model on that probe to get a second derivative estimate. The name comes from that reflection: instead of probing somewhere random (where x terms cancel out and you learn nothing), this probe sits on the actual denoising trajectory, so the curvature estimate means something. It averages the two slopes, applies a norm limit so a wild probe derivative can't blow up the step, and you get a Heun-style midpoint correction. After the correction phase, the extra calls stop and you're just running Euler ancestral with the noise you set.
What a beginner actually sets:
- eta - ancestral noise coefficient. 0 is deterministic, 1.0 is full ancestral (the default). If you want reproducible-but-lively, drop it to 0.5–0.7.
- correction_phase - the fraction of steps that get the expensive 3-call correction, 0 to 1. The README suggests 0.3–0.5 as a starting point. 0.0 is plain Euler a, 1.0 is every step.
- smooth_phase - replaces the binary cutoff with a continuous log-sigma weight so the transition from corrected to uncorrected is gradual. Turn it on for EQ-VAE models with smooth latents; otherwise it's a matter of taste.
- adaptive_noise (optional) - lets the sampler auto-tune
s_noiseby measuring the model's behavior during a warmup phase, then restarting generation with a correction factor.
It outputs a SAMPLER socket, so it plugs straight into the sampler input of a SamplerCustom node, next to whatever scheduler's SIGMAS you're feeding. It plays well with any of this pack's schedulers - the README calls out Karras, AOS-ε, or AkashicAOS.
Where people get burned: setting correction_phase to 1.0. That phase costs three model calls per step, so you've quietly doubled your render time for gains you probably won't see past the first few steps. And don't be surprised by the 🔮 line in the console every run - every sampler in this pack prints emoji status lines, it's not an error.
Install is the standard one and there's nothing heavy hiding behind it:
cd ComfyUI/custom_nodes
git clone https://github.com/nawka12/ComfyUI-Adept-Sampler
Restart ComfyUI and it's there - no requirements.txt, no model downloads. Or use ComfyUI Manager and search "ComfyUI-Adept-Sampler". The pack is a port of nawka12's reForge extension, GPL-3.0, and the "adaptive noise" feature is shared across its samplers - note it runs a full warmup pass and restarts, so with it on, a generation isn't done when the first pass ends.
Honestly? If you're on SDXL and happy with DPM++ 2M Karras, this won't convert you. Where it earns its keep is anime work where you want Euler a's variety but the plain version smears fine lines - the corrected early steps sharpen the structure without sacrificing the creative tail.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| eta | FLOAT | 1.000–2 | — |
| s_noise | FLOAT | 1.000–2 | — |
| correction_phase | FLOAT | 0.500–1 | — |
| smooth_phase | BOOLEAN | false | — |
| adaptive_noiseopt | BOOLEAN | false | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| SAMPLER | SAMPLER | — |