KSampler Refiner (Arctenox's Essentials)
The hi-res fix node that keeps your composition honest
- model
- positive
- negative
- latent
- vae
- model
- positive
- negative
- latent
- vae
- image
Hi-res fix is the oldest trick in the book: generate small, upscale, re-denoise - and get detail that a single big generation often misses. KSampler Refiner is this pack's version of that second pass, packaged so it slots in directly after the pack's main KSampler: it takes the first pass's latent, optionally upscales it, runs a refiner pass, and can decode the result to an image before it's even past the node.
The workflow it's built for, straight from the node's own description: sample at 512×768 with denoise 1.0, feed the LATENT into the refiner with upscale_method=bilinear, scale_factor=1.5, denoise=0.45, and the same seed - out comes a refined image at ~768×1152. Same composition, more detail.
The inputs that matter:
- latent - the first pass output. Plus
model,positive,negative, passed straight through from your KSampler. - upscale_method -
None(skip upscaling),nearest,bilinear,bicubic,bislerp. For hi-res fix,bilinearorbicubicon the latent is the standard move; don't overthink it. - scale_factor (default 1.5) - ignored if you set target_width/target_height above 0. The pack's
VAE Encode + Dimensionsnode exists precisely to hand you those target values as INTs so you can hit exact resolutions instead of fractions. - denoise (default 0.45) - the one dial that controls everything. The node's own guide is the right one: 0.3–0.5 is a subtle fix that adds crisp detail and keeps composition; 0.5–0.7 allows some layout shift; 0.7–1.0 is basically a fresh generation. Start at 0.4-ish and climb only if you want the image to change.
- seed and sonar - use the same seed as your first pass for coherent variation.
sonaris this pack's golden-ratio seed offset (φ⁻¹ ≈ 0.618, with 0 = no effect); matching it to your main KSampler keeps the two passes dancing to the same tune. - steps, cfg, sampler_name, scheduler - refiner sampling settings; the pack's defaults (20 steps, cfg 4) are reasonable starting points, not laws.
- vae_decode (default true) - decode inside the node. If you're doing further latent work (another upscale, a second refine), flip it to false.
Outputs are the full pass-through set - model, positive, negative, latent, vae - plus image when decode is on. All six come out regardless, so you can keep the refined latent and get a preview image without a separate VAE decode node.
Mechanically it's a proper two-phase node: extract the latent tensor, upscale via the chosen interpolation, run ComfyUI's sampler with the sonar-transformed seed, then optionally decode. One honest gotcha the README flags: cancelling a running sampler prints "Sampling failed: ." in the console - that's expected and safe to ignore; it can't be suppressed. Don't go hunting for a bug that isn't there.
The wider take: hi-res fix via latent upscale is a well-trodden path in the KB's upscaling lore - it's the cheap, fast way to add detail vs. pixel-space upscale-then-denoise, and it's where most people should start before they buy into a big upscaler. This node is a competent, slightly opinionated take on it. If you're already comfortable chaining a stock KSampler + LatentUpscale + another KSampler, you gain one node and the dimension pass-through; the value is in the convenience, not new math.
Install. Part of Arctenox's Essentials - ComfyUI Manager → search "Arctenox's Essentials", or:
cd ComfyUI/custom_nodes/
git clone https://github.com/Arctenox/Arctenoxs-Essentials_ComfyUI
Restart ComfyUI. No model downloads; deps are just torch, numpy, optional psutil. The README marks the pack deprecated while the author remasters it - this node's logic (upscale → refine → decode) maps cleanly onto any successor, so nothing you learn here goes to waste.
Inputs (17)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| latent | LATENT | — | |
| upscale_method | COMBO | bilinear | Latent upscale interpolation method. 'None' skips upscaling. |
| scale_factor | FLOAT | 1.500.25–8 | Upscale multiplier. Ignored if target_width/height > 0. |
| target_width | INT | 00–8192 | Target pixel width after upscale. 0 = use scale_factor instead. |
| target_height | INT | 00–8192 | Target pixel height after upscale. 0 = use scale_factor instead. |
| seed | INT | 0-9223372036854776000–18446744073709550000 | Seed for refiner pass. Use the same seed as the main KSampler for consistency. |
| sonar | INT | 0-18446744073709550000–18446744073709550000 | Golden-ratio sonar offset. Match to main KSampler for coherent variation. |
| steps | INT | 201–10000 | Refiner sampling steps. |
| cfg | FLOAT | 4.000–100 | CFG scale for refiner pass. |
| sampler_name | COMBO | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 | |
| scheduler | COMBO | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 | |
| denoise | FLOAT | 0.450–1 | How much the refiner changes the latent. 0.3–0.5 = subtle hi-res fix (adds detail, preserves composition) 0.5–0.7 = moderate rework 0.7–1.0 = heavy rework (similar to full generation) |
| vae_decode | COMBO | true | Decode the refined latent to an IMAGE inside this node. |
| vaeopt | VAE | — |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |
| positive | CONDITIONING | — |
| negative | CONDITIONING | — |
| latent | LATENT | — |
| vae | VAE | — |
| image | IMAGE | — |