JK Easy HiRes Fix
A1111's two-pass upscale as one ComfyUI node
- model
- clip
- vae
- positive
- negative
- latent_image
- LATENT
If you came to ComfyUI from Automatic1111 or Forge, you've probably missed the "Hires. fix" checkbox - the one that generates small, then upscales and re-samples in a single click. ComfyUI makes you build that yourself out of an Upscale Latent By node, a second KSampler, and a noise-injection trick if you want it to actually match A1111's output. EasyHRFix is one dev's attempt to put all of that back into one node, noise quirks included.
Hi-res fix, quickly: instead of generating straight at a huge resolution (which tiles and repeats badly), you generate at native resolution, upscale the latent, and run a second, low-denoise sampling pass to add coherent detail at the bigger size. It's the standard fix for the "why does my SDXL image have three heads" problem when you push past 1024×1024 without it.
What's actually happening inside
This node is a full second KSampler wearing a trench coat. You give it the same things you'd give any sampler - model, clip, vae, seed, steps, cfg, sampler_name, scheduler, positive, negative, and a latent_image - plus the upscale-specific bits: upscale_by (default 1.5x, the sweet spot per the KB is 1.5–2x) and denoise (default 0.5, matching the "0.3–0.5 or the composition drifts" rule of thumb). latent_upscaler picks the interpolation method for the latent resize (lanczos is the default and a safe one); pixel_upscaler is a second, optional model-based upscale path populated from whatever upscale models you have installed.
The part that's specific to this node is noise_mode and inject_extra_noise. A1111 generates its second-pass noise on the GPU by default; ComfyUI's native samplers don't reproduce that exactly, which is part of why "same seed, different app" gives you a different image. Setting noise_mode to GPU(=A1111) and enabling inject_extra_noise (with extra_noise_strength, default 2.5) is this node's stab at closing that gap. Two more optional fields, extra_positive_text / extra_negative_text with a _conditioning_mode (replace / combine / concat / average), let you tweak the prompt just for the hi-res pass without rebuilding your conditioning chain - useful if you want to nudge in extra detail words ("intricate detailing, sharp focus") only on the upscale.
Output is a single LATENT - decode it with a normal VAE Decode like any other sampler output.
Installing it
This pack isn't a household name - it's a solo dev's personal toolkit that happens to be one of the ~100 packs pre-installed on comfy.icu, and it has essentially no footprint in the wider community discussion. If you're self-hosting: cd ComfyUI/custom_nodes && git clone https://github.com/kostenickj/jk-comfyui-helpers.git, restart. The README notes ComfyUI Manager registration was pending at time of writing, so the manual clone is the reliable path. git pull inside the folder to update.
Important, and easy to miss: the README states this node explicitly requires ComfyUI-Inspire-Pack and ComfyUI_Noise installed alongside it - that's where the GPU-noise-injection machinery comes from. Inspire Pack is a real, still-referenced pack (over a hundred community threads mention it in the last year and a half), so it's not a dead dependency, but it is a separate install you need to grab.
Where people get burned
- Missing Inspire Pack / ComfyUI_Noise. If those aren't installed, expect the node to fail to load or the noise-injection widgets to misbehave - this is the single most likely first error.
- Denoise too high. Above ~0.5, per the standard hi-res-fix guidance, you start changing the composition instead of just adding detail. If your upscaled image looks like a different picture, pull denoise down to 0.3–0.4.
- Chasing an exact A1111 match.
GPU(=A1111)+ extra noise gets you closer, not identical - different samplers, schedulers, and library versions between A1111 and ComfyUI mean a bit-for-bit match isn't realistic. Treat it as "in the neighborhood," not "pixel identical." - Forgetting
pixel_upscaleris optional. If you leave it unset, you're relying purely on the latent upscale (latent_upscaler) - fine for mild upscales, but a dedicated pixel upscale model can help more on bigger jumps.
If you're already using the JK context nodes, look at EasyHRFix_Context instead - same node, but it pulls model/clip/vae/positive/negative from a bundled context wire instead of six separate inputs.
Inputs (22)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| clip | CLIP | — | |
| vae | VAE | The VAE model used for decoding the latent. | |
| seed | INT | 00–18446744073709550000 | The random seed used for creating the noise. |
| steps | INT | 201–10000 | The number of steps used in the denoising process. |
| cfg | FLOAT | 8.00–100 | The Classifier-Free Guidance scale balances creativity and adherence to the prompt. Higher values result in images more closely matching the prompt however too high values will negatively impact quality. |
| sampler_name | COMBO | The algorithm used when sampling, this can affect the quality, speed, and style of the generated output. | |
| scheduler | COMBO | The scheduler controls how noise is gradually removed to form the image. | |
| positive | CONDITIONING | The conditioning describing the attributes you want to include in the image. | |
| negative | CONDITIONING | The conditioning describing the attributes you want to exclude from the image. | |
| upscale_by | FLOAT | 1.501.05–4 | — |
| latent_image | LATENT | — | |
| denoise | FLOAT | 0.500–1 | — |
| latent_upscaler | COMBO | lanczos | 6 options: nearest-exact, bilinear, area, bicubic, bislerp, lanczos |
| pixel_upscaler | COMBO | 0 options: | |
| noise_mode | COMBO | GPU(=A1111) | 2 options: GPU(=A1111), CPU |
| inject_extra_noise | COMBO | enable | 2 options: disable, enable |
| extra_noise_strength | FLOAT | 2.50–100 | — |
| extra_positive_textopt | STRING | if non empty, will be encoded and used depending on the value of extra_positive_conditioning_mode | |
| extra_positive_conditioning_modeopt | COMBO | replace | 4 options: replace, combine, concat, average |
| extra_negative_textopt | STRING | if non empty, will be encoded and used depending on the value of extra_negative_conditioning_mode | |
| extra_negative_conditioning_modeopt | COMBO | replace | 4 options: replace, combine, concat, average |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| LATENT | LATENT | — |