Nodes/Comfyg Queue/ComfygQueue
ComfyUI Node

ComfygQueue

ComfygQueue

By guerreiro·Created about a year ago·Updated about a year ago· 1
ComfygQueue
  • model
  • positive
  • negative
  • latent
  • vae
  • save_info
  • file_list
res_presets1024x1024,1152x896,896x1152
save_prefixCQGen_
batch_seed-1
image_formatpng
incremental_seedfalse
steps20
cfg7.00
sampler_nameeuler
schedulernormal
denoise1.00
output_subdir

Every new checkpoint comes with the same question: which resolution does it actually sing at? Square 1024, the 1152×896 landscape, the tall 896×1152? The default answer is tedium - edit the EmptyLatentImage, run, edit it again, run, squint at three images side by side. ComfygQueue is the node that runs that loop for you: one run, every resolution you list, each saved and named so you can actually tell them apart. The author built it for exactly this - his words: "it's boring to stay changing resolutions, to test which one is the best for each model."

Ignore the name for a second. It calls no API, needs no key, and the "comfyg" is just ComfyUI + queue with a typo you'll never unsee. It's a single node that replaces the whole EmptyLatentImage → KSampler → VAEDecode → SaveImage chain with a self-contained pipeline that loops over a list of resolutions. It's an output node - it saves the files itself, so there's no SaveImage after it.

How it works

You type a comma-separated list of WxH pairs into res_presets - "1024x1024,1152x896,896x1152" is the default. The node parses that into width/height pairs, then for each one: generates an empty latent, samples it with your steps, cfg, sampler_name, scheduler, and denoise, decodes with your VAE, and writes the result to ComfyUI/output/ (or output/<output_subdir>). Under the hood it's calling the exact same core nodes you'd wire yourself, so the results behave like your normal pipeline.

The seed logic is where it earns its keep. batch_seed: -1 rolls a random base seed for the run. Set a fixed number and every resolution shares that one seed - which is the whole point: resolution becomes the only variable, so the differences you see are resolution, not luck. incremental_seed bumps +1 per resolution, with one quirk worth knowing: it increments at the top of the loop, so the first image is actually batch_seed + 1. And the README warns you the seed is not recovered from the PNG on import - it lives in the filename (CQGen_20260827_120000_1024x1024_12345.png), so if you find a keeper, copy the seed down while it's in front of you.

Feed a latent input and the multi-resolution loop is skipped entirely - it just samples that latent. Minor gotcha: the filename still uses the (0, 0) resolution placeholder, so expect files literally named ..._0x0_... in that mode. Amusing, harmless.

The inputs that actually matter

  • res_presets - your list of WxH pairs, comma-separated. Spaces tolerated.
  • batch_seed - -1 for random, a fixed number to lock, incremental_seed to step it.
  • image_format - png (default), avif, or webp.
  • save_prefix - the filename prefix. Everything else (model, positive, negative, vae, latent, sampler settings, output_subdir) is optional.

The image_format choice is the storage motivation showing through - the author added AVIF/WebP after running low on disk, and they really are roughly half a PNG's size. The tradeoff is metadata. PNG embeds the full prompt/workflow into text chunks, so drag-the-image-back-in and CivitAI's auto-parse still work. AVIF/WebP fall back to EXIF strings instead, which means the node graph does not survive - the general rule applies: PNG is your master, the small formats are your derivatives. One caveat: AVIF saving needs a Pillow built with AVIF support (Pillow 10+ with libavif); on an older build the save fails into a console warning, not a crash.

Outputs

Both outputs are plain STRING. save_info is a human summary - which resolutions succeeded, which seeds, and the file list. file_list is a JSON array of absolute saved paths, handy to pipe into a text/JSON parser or a note node for your own records.

Installing it

ComfyUI Manager: search "comfyg-queue" and install (it's on the Comfy Registry, so one click works), then restart. Or the manual way:

cd ComfyUI/custom_nodes
git clone https://github.com/guerreiro/comfyg-queue

Then restart ComfyUI. That's it - there's no requirements.txt and no pip dependencies. It's pure numpy, Pillow, torch, and ComfyUI core, so nothing extra to install.

Where people get burned

If you forget to wire model, positive, negative, or vae, you get a clean "Missing required connections" message instead of a crash - handy, but the node otherwise has no error surfacing in the graph. A malformed res_presets returns "No valid resolutions found". And because each resolution runs in the loop, a size that blows VRAM mid-way logs the error and keeps going - you get partial results, not a hard stop. For comparing a checkpoint across sizes it's hard to beat; just remember where the seed actually lives.

CategoryWorkflow/Batch

Inputs (16)

NameTypeDefaultDescription
res_presetsSTRING1024x1024,1152x896,896x1152
save_prefixSTRINGCQGen_
batch_seedINT-1-1–18446744073709550000
image_formatCOMBOpng3 options: png, avif, webp
incremental_seedoptBOOLEANfalse
modeloptMODEL
positiveoptCONDITIONING
negativeoptCONDITIONING
latentoptLATENT
vaeoptVAE
stepsoptINT201–10000
cfgoptFLOAT7.000–100
sampler_nameoptCOMBOeuler44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38
scheduleroptCOMBOnormal9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3
denoiseoptFLOAT1.000–1
output_subdiroptSTRING

Outputs (2)

NameTypeDescription
save_infoSTRING
file_listSTRING