VariationLab: Checkpoint Explorer
Pick your model on evidence
- latent
- images
The checkpoint is the single biggest aesthetic lever you own - switch models and the same prompt becomes a different image. VariationLab: Checkpoint Explorer (class CheckpointExplorer) renders up to five checkpoints in one queue item, all on the same seed and latent, so you can finally answer "which model do I actually like" with a side-by-side instead of five separate re-rolls at five different random seeds.
What it does
Unlike the other two explorers, you don't wire in a model. The node builds its own dropdowns from whatever's in your ComfyUI/models/checkpoints folder at node creation, then for each configured checkpoint it loads the model, encodes your prompt with that checkpoint's own CLIP, samples, and decodes with that checkpoint's own VAE. Everything stacks into one images batch.
The inputs that matter:
base_positive_prompt/base_negative_prompt- the prompt shared by every model.seed,steps,cfg,denoise- defaults every checkpoint inherits.checkpoint1…checkpoint5- pick which models to render. Leave one blank and it's skipped.- Per-checkpoint:
checkpointN_positive_suffix/negative_suffix- extra prompt text appended only for that model (great when one needs ", anime style" and another doesn't), plusclip_skip,sampler,scheduler,stepsandcfgoverrides.
Two things to know before you're surprised. The clip_skip default is -1, which the code treats as "no skip" - only non-(-1) values actually change CLIP behavior, and on SDXL it often does nothing anyway since both encoders already default to the penultimate layer; it matters mostly on SD 1.5 / anime-lineage checkpoints. And there's no CONDITIONING input by design: each checkpoint has its own text encoder, so the prompts live inside the node as text, and suffixes are your tool for per-model prompt differences.
The real cost
Here's the trade you're signing up for: this node reloads every checkpoint from disk on every run, one after another. Five SDXL models is ~30 GB of loading per queue, and on a modest card the VRAM churn is brutal - expect slow runs and, on small GPUs, out-of-memory errors. Treat it as a comparison tool for a shortlist you've already narrowed to 2–3 models, not a "load everything I own" button. Same seed means it's a genuine comparison, which is exactly what the checkpoint panel's advice wants you to do - but a real model shootout needs a few runs per model to beat the luck factor, and this node gives you one run per model at a time.
Also watch the dropdowns: they're snapshotted when the node is created. Drop a new checkpoint into the folder while ComfyUI is running and you'll need to recreate the node to see it.
Install
ComfyUI Manager: search ComfyUI-VariationLab, install, restart. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/Legorobotdude/ComfyUI-VariationLab
# then restart ComfyUI
Don't copy the clone URL from the pack's README - it's a placeholder (yourusername/...) that doesn't exist. Use the repo above or Manager. Dependencies are numpy and torch, which ComfyUI already ships, so there's no pip install and no extra downloads. The node appears under "VariationLab."
Troubleshooting
If you set no checkpoints, or anything throws, you get a 64×64 black image and the real traceback only lands in your terminal - this pack swallows exceptions, so read the console when output goes black. The other failure mode is patience: five checkpoints on a small card means long queues or OOM. And if all five outputs look suspiciously similar, that's the merge problem doing its thing - many "different" models share ancestry, which is its own lesson in why picking a checkpoint is worth testing at all.
Inputs (47)
| Name | Type | Default | Description |
|---|---|---|---|
| latent | LATENT | — | |
| base_positive_prompt | STRING | a photograph of a person | — |
| base_negative_prompt | STRING | blurry, low quality | — |
| seed | INT | 00–18446744073709550000 | — |
| steps | INT | 201–10000 | — |
| cfg | FLOAT | 7.00–100 | — |
| denoise | FLOAT | 1.000–1 | — |
| checkpoint1opt | COMBO | 0 options: | |
| checkpoint1_clip_skipopt | INT | -1-24–-1 | — |
| checkpoint1_positive_suffixopt | STRING | — | |
| checkpoint1_negative_suffixopt | STRING | — | |
| checkpoint1_sampleropt | COMBO | euler | 34 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +28 |
| checkpoint1_scheduleropt | COMBO | normal | 9 options: normal, karras, exponential, sgm_uniform, simple, ddim_uniform, +3 |
| checkpoint1_stepsopt | INT | 201–10000 | — |
| checkpoint1_cfgopt | FLOAT | 7.00–100 | — |
| checkpoint2opt | COMBO | 0 options: | |
| checkpoint2_clip_skipopt | INT | -1-24–-1 | — |
| checkpoint2_positive_suffixopt | STRING | — | |
| checkpoint2_negative_suffixopt | STRING | — | |
| checkpoint2_sampleropt | COMBO | euler | 34 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +28 |
| checkpoint2_scheduleropt | COMBO | normal | 9 options: normal, karras, exponential, sgm_uniform, simple, ddim_uniform, +3 |
| checkpoint2_stepsopt | INT | 201–10000 | — |
| checkpoint2_cfgopt | FLOAT | 7.00–100 | — |
| checkpoint3opt | COMBO | 0 options: | |
| checkpoint3_clip_skipopt | INT | -1-24–-1 | — |
| checkpoint3_positive_suffixopt | STRING | — | |
| checkpoint3_negative_suffixopt | STRING | — | |
| checkpoint3_sampleropt | COMBO | euler | 34 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +28 |
| checkpoint3_scheduleropt | COMBO | normal | 9 options: normal, karras, exponential, sgm_uniform, simple, ddim_uniform, +3 |
| checkpoint3_stepsopt | INT | 201–10000 | — |
| checkpoint3_cfgopt | FLOAT | 7.00–100 | — |
| checkpoint4opt | COMBO | 0 options: | |
| checkpoint4_clip_skipopt | INT | -1-24–-1 | — |
| checkpoint4_positive_suffixopt | STRING | — | |
| checkpoint4_negative_suffixopt | STRING | — | |
| checkpoint4_sampleropt | COMBO | euler | 34 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +28 |
| checkpoint4_scheduleropt | COMBO | normal | 9 options: normal, karras, exponential, sgm_uniform, simple, ddim_uniform, +3 |
| checkpoint4_stepsopt | INT | 201–10000 | — |
| checkpoint4_cfgopt | FLOAT | 7.00–100 | — |
| checkpoint5opt | COMBO | 0 options: | |
| checkpoint5_clip_skipopt | INT | -1-24–-1 | — |
| checkpoint5_positive_suffixopt | STRING | — | |
| checkpoint5_negative_suffixopt | STRING | — | |
| checkpoint5_sampleropt | COMBO | euler | 34 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +28 |
| checkpoint5_scheduleropt | COMBO | normal | 9 options: normal, karras, exponential, sgm_uniform, simple, ddim_uniform, +3 |
| checkpoint5_stepsopt | INT | 201–10000 | — |
| checkpoint5_cfgopt | FLOAT | 7.00–100 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |