KSampler - Extra Outputs
One KSampler That Also Upscales Your Latent and Hands Back the Seed
- model
- positive
- negative
- latent_image
- MODEL
- POSITIVE
- NEGATIVE
- SEED
- LATENT
- UPSCALED_LATENT
The standard KSampler node is a dead end: it only outputs a latent, so after sampling you have to re-wire your model, conditioning, and seed from scratch if you want a second pass. This node is the "extra outputs" variant - it passes your model, both conditionings, and the seed straight through, and adds a latent upscaler on top. It's a one-node home for the first half of a hires-fix workflow.
Why you'd reach for it
Two reasons. First, the pass-throughs: model, positive, negative, and the seed you actually used all come out on wires, which makes daisy-chaining a second sampler trivial - you don't redraw anything, you just take the LATENT output and the pass-throughs and go. Second, the built-in latent upscale: with upscale_latent set to Yes, it samples at your current resolution, then upscales the resulting latent by a ratio (default 1.5x) and hands you that as a separate UPSCALED_LATENT output. Feed that into a second sampler at low denoise and you've got a classic two-pass upscale without any extra nodes.
How it works
Under the hood it's the stock ComfyUI sampler - same comfy.sample.sample call the core node uses, same samplers and schedulers. The difference is purely in what it returns. On the upscale side it uses common_upscale on the sampled latent with your chosen method (bicubic is the sensible default for latent upscaling). Note the seed output: it's the seed input passed back out, so you can reuse the exact same seed for the second pass and keep a chain of samples on one track.
Inputs and outputs
The ones that matter:
- seed, steps, cfg, sampler_name, scheduler - the usual sampling controls.
- positive / negative - your conditioning.
- latent_image - where the noise starts.
- denoise - 1.0 for a full txt2img run; 0.3–0.5 is the sweet spot for an img2img second pass (see the KB's upscaling essay on why low denoise is the whole trick).
- upscale_latent -
Yes/Notoggle for the latent upscale. - upscale_method and ratio - optional, only used when upscale is on.
Outputs: MODEL, POSITIVE, NEGATIVE, SEED (pass-throughs), LATENT (the sample), and UPSCALED_LATENT (the upscaled version, if enabled - otherwise it's the same latent).
Installing it
Part of "quadmoon's ComfyUI nodes". ComfyUI Manager: search the pack title or Install via GIT URL with https://github.com/traugdor/ComfyUI-quadMoons-nodes.git. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/traugdor/ComfyUI-quadMoons-nodes.git
Restart ComfyUI. No model downloads.
Common issues
The main trap is using it at full denoise for the second pass - that's how you get a second pass that ignores your first one. The whole point of UPSCALED_LATENT is a low-denoise refinement, so keep the second sampler at 0.3–0.5. Also, if upscale_latent is off, UPSCALED_LATENT just echoes the regular latent - easy to wire up and wonder why nothing upscaled.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| seed | INT | 00–18446744073709550000 | — |
| steps | INT | 201–10000 | — |
| cfg | FLOAT | 8.00–100 | — |
| 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 | |
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| latent_image | LATENT | — | |
| denoise | FLOAT | 1.000–1 | — |
| upscale_latent | COMBO | 2 options: Yes, No | |
| upscale_methodopt | COMBO | 5 options: nearest-exact, bilinear, area, bicubic, bislerp | |
| ratioopt | FLOAT | 1.500.01–8 | — |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| MODEL | MODEL | — |
| POSITIVE | CONDITIONING | — |
| NEGATIVE | CONDITIONING | — |
| SEED | INT | — |
| LATENT | LATENT | — |
| UPSCALED_LATENT | LATENT | — |