KSampler (Umbra Lab)
A KSampler that tells the truth about what it ran
- model
- positive
- negative
- latent_image
- samples
- model_name
- seed
- steps
- cfg
- sampler_name
- scheduler
KSampler (Umbra Lab) is a stock-compatible sampler wrapper with one genuinely useful upgrade: it hands you back everything it actually did. Beyond the samples latent, it outputs model_name, seed, steps, cfg, sampler_name, and scheduler as typed values. Wire those into Umbra's Save Image node and the PNG's metadata matches reality - no more opening an image and finding "euler, normal" recorded while the graph was actually running dpmpp_2m with Karras.
How it works
Under the hood it calls ComfyUI's own common_ksampler, so the sampling math is identical to the core node - this is not a reimplementation, it's a wrapper with better plumbing. The extras:
- Metadata passthrough. The model name is discovered from your graph (it walks the workflow to find what checkpoint feeds the model input), and the seed/steps/cfg/sampler/scheduler you set come back out as typed outputs. This is the piece that makes the save nodes' self-documenting PNGs work, and it's genuinely handy even if you never use the save node - you can show the seed on a Note widget or log it somewhere.
- Seed management for batches and repeats. The optional
seed_mode,seed_step,repeat_behavior, andrepeat_stepinputs let one sampler run a batch with per-image seeds, and control what happens across queue runs. The defaultseed_modeisincrement_per_image, so a 4-image batch with seed 10 samples at 10, 11, 12, 13.repeat_behaviordefaults toinherit, which is smart: it checks where the seed came from - if an upstreamUmbraSeedValuealready owns repeat progression, this node stands down; if the seed is a plain static widget, it increments per repeat so you get variation on re-run. style_seed_behavior- thesame_seed_style_cyclemode ties into Umbra's Power Prompter prompt-card system: style-expanded jobs reuse the base seed instead of advancing, so you iterate on style without churning the seed.
The inputs that matter
Required set is the familiar one - model, positive, negative, latent_image, seed, steps, cfg, sampler_name, scheduler, denoise. For a beginner, denoise is the dial that separates txt2img (1.0) from img2img (lower = keep more of the source), and seed/seed_mode is where you get per-image variation in a batch. The repeat_* inputs are worth leaving alone until you're comfortable with the seed node, because both nodes cooperating is the design - configure one owner, not two.
Installing it
Part of Umbra-Nodes, the ComfyUI companion pack for Umbra Studio (NocturneLabs' open-source, local-first AI creation suite). Install via ComfyUI Manager (search "Umbra Nodes") or:
cd ComfyUI/custom_nodes
git clone https://github.com/Nocturne-Ai-Labs/Umbra-Nodes
Restart ComfyUI. The pack declares no pip dependencies and this node needs nothing beyond stock ComfyUI.
Gotchas
The always-recompute behavior: when a seed mode or repeat behavior is set to vary per run, the node deliberately marks itself as changed every execution (the NaN trick the plumbing docs describe), so ComfyUI re-runs the whole branch each time. That's by design - a sampler that varies seeds can't cache. If your graph suddenly feels like it re-runs everything on every queue, this is why. Second: it's easy to wire an upstream seed with its own control_after_generate and also set repeat_behavior here - then the seed advances twice. The node tries to detect this, but the clean rule is: one seed owner per graph.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| latent_image | LATENT | — | |
| seed | INT | 00–18446744073709550000 | — |
| steps | INT | 201–10000 | — |
| cfg | FLOAT | 7.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 | |
| denoise | FLOAT | 1.000–1 | — |
| seed_modeopt | COMBO | increment_per_image | 3 options: fixed, increment_per_image, random_per_image |
| seed_stepopt | INT | 11–18446744073709550000 | — |
| repeat_behavioropt | COMBO | inherit | 4 options: inherit, increment_per_repeat, random_per_repeat, none |
| repeat_stepopt | INT | 11–18446744073709550000 | — |
| style_seed_behavioropt | COMBO | normal | 2 options: normal, same_seed_style_cycle |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| samples | LATENT | — |
| model_name | STRING | — |
| seed | INT | — |
| steps | INT | — |
| cfg | FLOAT | — |
| sampler_name | STRING | — |
| scheduler | STRING | — |