Nodes/MiniMax H3 Image Gen - SatoDive/H3 Refine Winner - SatoDive
ComfyUI Node

H3 Refine Winner - SatoDive

Pay for the draft you liked, not for all eight of them

By SatoDive·Created 6 days ago·Updated 2 days ago· 21
H3 Refine Winner - SatoDive
  • model
  • vae
  • positive
  • drafts
  • IMAGE
◄pick0►
◄seed0►
◄refine_scale1.50►
◄refine_steps10►
◄refine_strength0.00►
◄sampler_nameer_sde►
◄schedulersimple►
◄upscale_model▾►
◄upscale_to_mpnative►
◄auto_pick—►

This is the back half of the pack's two-stage workflow: H3 Draft Grid renders several cheap candidates, you (or its sharpness score) pick one, and H3 Refine Winner upscales that single draft's latent, re-samples it briefly, decodes it, and can hand the result to a pixel upscaler.

The economics are the whole idea. Cheapest possible drafts, one expensive pass. That's a much better use of a GPU than eight full-quality samples where you keep one.

What the refine actually does

Two steps, and it's worth knowing where each one lives.

Latent upscale. The draft's spatial grid is scaled up by refine_scale (1.0–2.5) with bicubic interpolation, staying on the 32-grid so the model can still patchify it. At 1.5 you're asking the second pass to work on 2.25× the pixels.

A short re-sample from partway up the noise schedule. The key parameter is refine_strength - "the noise level (sigma) the refine pass starts from." Not a denoise number. Under a flow shift those two things diverge badly (denoise 0.45 can correspond to a sigma north of 0.9), so the node generates a full sigma schedule, finds where it drops below your value, and keeps the tail. 0 = auto, derived from refine_scale - roughly 0.40 + 0.30 × (scale − 1), capped at 0.85, which is about 0.55 at the default 1.5. Low values keep more of the draft's composition; high values give the sampler room to invent detail, and risk redrawing the face you liked.

The refine pass samples on seed + 1 internally, so you're not fighting the draft's noise - but changing seed here does change the refine result, which is the cheap knob to nudge before you touch anything else.

refine_steps is separate from your draft steps and defaults to 10. Ten steps at a higher resolution is the normal shape of a second pass; you don't need 20.

Inputs and outputs

model, vae, positive and drafts come off your loader and H3 Draft Grid - pass Draft Grid's model output straight in, since it already has your LoRA applied. Then:

  • pick - 1-based draft to refine. 0 means "use the auto-picked sharpest".
  • auto_pick (optional input) - wire Draft Grid's best INT here.
  • refine_scale, refine_steps, refine_strength, seed, sampler_name (default er_sde), scheduler (default simple).
  • upscale_model and upscale_to_mp - an optional ESRGAN-style pixel upscale after decode. native uses the model's own factor; otherwise the result is resized to roughly the megapixel target.

Output is a single IMAGE.

The workflow this is built for

Draft Grid → Refine Winner. Change pick and only this node re-runs, because ComfyUI caches the drafts upstream - the node's own docstring makes that point. So flipping between drafts 2 and 5 is seconds, not minutes. That's the payoff for splitting drafting and refining into two nodes instead of one.

Install

cd ComfyUI/custom_nodes
git clone https://github.com/SatoDive/ComfyUI-H3-IMG-Gen-SatoDive

Or ComfyUI Manager → ComfyUI-H3-IMG-Gen-SatoDive (MiniMax H3 Image Gen - SatoDive), restart. No pip dependencies; you need the native MiniMax H3 nodes in your ComfyUI build, and an upscale model in models/upscale_models for the optional pixel stage.

Gotchas

pick = 0 without auto_pick wired refines draft 1. There's no warning - it just falls back. If you meant "auto" and forgot the wire, you're looking at a refine of the first draft and wondering why best didn't matter.

pick tops out at 8, which matches the draft node's maximum, so the ranges line up. Just remember both are 1-based.

Latent upscale multiplies the cost of the second pass twice over - more pixels, and a resample from noise. If the refine looks worse than the draft, that's usually refine_strength too high rather than the upscale being a bad idea. Step it down toward 0.45 and compare.

Seriously, that upscale model. A 4× ESRGAN on a 3 MP image builds a ~48 MP intermediate in VRAM. upscale_to_mp exists precisely so you can cap that. On anything under 16 GB, set it to 8 or 12 rather than leaving native.

The refine pass sharpens, it doesn't reimagine. An upscale model adds texture and cleans up edges; it will not fix a bad face or a wrong hand. If a draft is compositionally right but the face is wrong, the answer is another draft - that's the whole reason the draft stage exists.

CategorySatoDive/H3

Inputs (14)

NameTypeDefaultDescription
modelMODEL—
vaeVAE—
positiveCONDITIONING—
draftsLATENT—
pickINT00–81-based draft to refine. 0 = use the auto-picked sharpest.
seedINT00–18446744073709550000—
refine_scaleFLOAT1.501–2.5—
refine_stepsINT101–100—
refine_strengthFLOAT0.000–0.950 = auto (from refine_scale).
sampler_nameCOMBOer_sde44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38
schedulerCOMBOsimple9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3
upscale_modelCOMBO1 options: None
upscale_to_mpCOMBOnative6 options: native, 4, 6, 8, 12, 16
auto_pickoptINT—

Outputs (1)

NameTypeDescription
IMAGEIMAGE—