Nodes/ComfyUI-NunchakuFluxLoraStacker/ControlAltAI: Advanced Sampler
ComfyUI Node

ControlAltAI: Advanced Sampler

A whole sampling chain in one node, with CFG welded to 1

By ussoewwin·Created about a year ago·Updated 5 days ago· 23
ControlAltAI: Advanced Sampler
  • model
  • conditioning
  • latent_image
  • latent
◄sampler_nameeuler►
◄schedulerbeta►
◄steps30►
◄denoise1.00►
◄noise_seed143220275975594►

It's a KSampler with the plumbing pre-wired: the noise node, the seed, the guider and the sampler all folded into one box whose only output is a latent. You plug a model, a positive conditioning and an empty latent in, set a sampler, a scheduler, a step count - and get a finished latent out.

Before you get annoyed that it's "just a KSampler with fewer options," note what it actually bakes in. CFG is fixed at 1.0 and the negative conditioning is an empty list. That's not laziness; that's the correct shape of a Flux sampler, and it's worth understanding why.

Why CFG 1 and no negative prompt

Flux.1 [dev] is guidance-distilled - the classifier-free guidance is baked into the weights rather than applied at sampling time. Or to put it the way the model's own lineage does: there's no true negative prompt in Flux, which is the mechanical reason "flux hates negative prompts" is repeated everywhere, and why de-distilled community variants like OpenFlux.1 exist to restore real CFG. Running Flux at CFG 1 with a single positive conditioning isn't a downgrade; it's the intended path. (The numbers here are worth internalising: community defaults for Flux run 20–30 steps with a guidance value around 3.5, and the same-face "Fluxmaxxed" look is usually blamed on that guidance default being too high.)

Where the helpfully-named guidance slider lives with Flux is upstream of this node - in a Flux Guidance node applied to the conditioning - not on the sampler. So the node isn't hiding a control you need.

How it works

Under the hood it builds a comfy.samplers.KSampler with your sampler, scheduler, steps and denoise, prepares noise from the latent and noise_seed, then calls the sampler with cfg=1.0, the empty negative list, and the latent's own noise_mask if one is present. It also installs ComfyUI's latent preview callback, so you get step-by-step previews in the UI like a stock KSampler. Output is a copy of your latent dict with the sampled tensor in samples - the same structure everything else in ComfyUI expects, so a VAE Decode takes it directly.

Inputs and outputs

Required, all of them: model, conditioning, latent_image, sampler_name (14 Flux-appropriate options - euler, heun, heunpp2, dpm_2, lms, dpm_adaptive, dpmpp_2s_ancestral, dpmpp_2m, ipndm, ipndm_v, deis, ddim, uni_pc, uni_pc_bh2), scheduler (simple, normal, sgm_uniform, ddim_uniform, beta), steps (default 30), denoise (default 1.0), noise_seed (a big integer default).

Output: one latent socket.

The three things that matter

latent_image must be a 16-channel Flux latent. The stock Empty Latent Image node emits 4 channels and will not work here. Use an SD3-style empty latent - this pack's own Nunchaku Resolution Selector emits exactly the right 16-channel empty latent, which is the tidiest way to do it if you're already installed.

scheduler is set to beta, and the community default is simple or normal. Flux's standard advice is Euler with a Simple/Normal scheduler, with the standing warning that the wrong scheduler produces muddy, blurred output - there are threads where "change your sampling to euler/simple" was the entire fix for a blurry Flux workflow. beta isn't wrong, but if your first results look soft, that's the first knob to move.

noise_seed is a widget, so it can be driven. Convert it to an input and feed one primitive into every sampler in the graph if you want reproducible comparisons across models - ComfyUI's seeded random is uniform, so the same seed and latent produce comparable results across samplers.

Two smaller notes: denoise under 1.0 with an image-derived latent gets you img2img/refinement behaviour; and since there's no negative socket at all, you can't "just add a negative prompt" - that's a design decision of Flux, not of this node.

Installing it

Part of ussoewwin/ComfyUI-NunchakuFluxLoraStacker - one repo that bundles a Nunchaku FLUX LoRA stacker, the Florence-2 captioning nodes, a TensorRT CCSR upscaler and the ControlAltAI utility set (a Python 3.13 fork of gseth/ControlAltAI-Nodes, which is why the classes carry hswq_). ComfyUI Manager: search ComfyUI-NunchakuFluxLoraStacker. Manual:

cd ComfyUI/custom_nodes
git clone https://github.com/ussoewwin/ComfyUI-NunchakuFluxLoraStacker.git
pip install -r requirements.txt

Restart. This node itself needs no model files, but the pack's requirements are heavy because it also ships a whole CCSR TensorRT upscaler stack and a VLM suite. Install all of it - the pack imports its CCSR dependencies at load time, and a missing pytorch-lightning or taming-transformers takes down every node in the pack, not just the upscaler.

If something's off

Shape mismatch on the latent. You used a 4-channel empty latent. Swap it for an SD3/Flux 16-channel one.

Soft, mushy output. Try simple or normal for the scheduler and look at your guidance upstream - 3.5 is the widely-cited culprit for the "Fluxmaxxed" same-face look, and people run 1.8–2.0 for portraits.

Nothing changes when you alter a setting. The widget values have to be committed before the run; if you're on the default widget control mode that fires after, click off the field first. The long-standing fix is to set widget control mode to Before once, in settings.

If you're on stock ComfyUI and want the same result with more knobs visible, KSampler with CFG 1 and an empty negative does the identical thing - this node's value is that it folds the noise/seed/guider layer into one box, which is a genuinely nicer canvas when you're comparing five sampler settings by hand.

CategoryControlAltAI Nodes/Flux

Inputs (8)

NameTypeDefaultDescription
modelMODEL—
conditioningCONDITIONING—
latent_imageLATENT—
sampler_nameCOMBOeuler14 options: euler, heun, heunpp2, dpm_2, lms, dpm_adaptive, +8
schedulerCOMBObeta5 options: simple, normal, sgm_uniform, ddim_uniform, beta
stepsINT301–10000—
denoiseFLOAT1.000–1—
noise_seedINT1432202759755940–18446744073709550000—

Outputs (1)

NameTypeDescription
latentLATENT—