⬡ Polyhedron Seed
One seed for the whole graph — plus the noise it actually denoises
- seed
- seed_string
- noise
⬡ Polyhedron Seed is what you use when a workflow has more than one seed. Convert the seed widget on every sampler to an input, wire them all to this one node, and the seed is defined once instead of in five places you'll forget to keep in sync. That alone is worth the install - but the node goes further: it hands you the seed as both a number and a string, and it can generate the noise the sampler denoises, not just the number that seeds it.
The part people actually reach for is the readout. The node reports the value that was used on the last run, so the seed in the box and the seed that made the image in front of you are never in doubt again. And seed_string carries the same number as text, so a Save node's filename prefix and the graph agree on which seed produced the file on disk. No more "which of these six numbers was the good one?"
How it works
The seed widget behaves exactly like the core samplers: control_after_generate decides what happens after a run (fixed, increment, decrement, randomize). Two buttons on the node make that nicer - 🎲 Roll draws a fresh random seed and pins it to fixed, and ↺ Reuse last restores the seed of the last run. The classic ComfyUI trap applies here as much as anywhere: control fires after the run by default, so if you find a great image and flip the dropdown to fixed, you may already have lost the seed. Change Settings → "widget control mode" to Before once, and the box always shows what actually ran.
The interesting third output is noise, a NOISE source you can wire into a sampler's noise input. This is the noise the model actually denoises - and the node's tooltip makes the key point: an empty latent's contents are multiplied by zero at the start of a full schedule, so noise baked into a latent does nothing, while the sampler's own noise is the real thing. Leave noise_type at gaussian and noise_strength at 1.0 and it's bit-identical to what a sampler makes on its own - it changes nothing until you change it. The other types (pink, brown, blue, fractal…) are deliberate excursions: brown and pink push energy into low frequencies (composition), blue into high (detail). Models are trained on gaussian noise, so treat those as experiments, not upgrades. noise_character cross-fades a type back toward plain gaussian - around 0.2–0.4 the spectrally heavy types become a dosed compositional bias instead of a trip.
preview_width / preview_height are latent-grid numbers for the in-node noise preview only; they change nothing about the run.
What you set and what comes out
seed- the value. Roll, reuse, or type.noise_type,noise_strength,noise_character- only matter if you use thenoiseoutput.seed(out, INT) → samplers and other seed consumers.seed_string(out, STRING) → filename prefixes, notes, prompts.noise(out, NOISE) → the sampler's noise input, if you're steering noise character.
Installing it
Part of the ⬡ Polyhedron Suite pack: ComfyUI Manager → "Polyhedron Suite", or
cd ComfyUI/custom_nodes
git clone https://github.com/PolyhedronAI/ComfyUI-PolyhedronLoRAStack.git
# restart ComfyUI
No extra dependencies.
Gotchas
Besides the control-after-generate trap above, the main thing to remember is that the noise outputs are off by default in the sense that they don't change anything - which means they're also free to leave alone. Don't wire noise just because it exists; wire it when you specifically want noise character. And note the preview grid is latent-space: a 1024px image on a /8 model is 128 in preview_width, not 1024. The ⬡ Polyhedron Empty Latent node's latent_width/latent_height outputs were built to feed exactly these fields.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| seed | INT | 00–18446744073709550000 | Seed value. 'control after generate' behaves exactly like the core samplers. 🎲 Roll draws a fresh random seed and pins it to 'fixed'; ↺ Reuse last restores the seed of the last run. |
| noise_type | COMBO | gaussian | Character of the noise the `noise` output produces. gaussian at strength 1.0 is bit identical to what a sampler makes on its own, so it changes nothing until you change it. brown/pink push energy into low frequencies (composition), blue into high (detail), fractal is coherent multi-octave structure. NOTE: models are trained on gaussian noise -- the others are a deliberate excursion, different is not automatically better. |
| noise_strength | FLOAT | 1.000–20 | Scale in units of standard latent noise (1.0 == torch.randn scale). Leave at 1.0 unless you are deliberately experimenting; the schedule assumes unit-scale noise. |
| preview_width | INT | 648–512 | LATENT width for the in-node preview only -- it changes nothing about the run. Latent grid, not pixels: a 1024px image on a /8 model is 128, a 1440px Flux2 image on /16 is 90. |
| preview_height | INT | 648–512 | LATENT height for the in-node preview only. See preview_width. |
| noise_character | FLOAT | 1.000–1 | How much of the noise type's character survives. 1.0 = the pure type (bit-identical to earlier builds). Below 1.0 the field is cross-faded with plain gaussian -- around 0.2-0.4 the spectrally heavy types (pink, brown, fractal, pyramid) become a dosed compositional bias instead of an excursion. For offset it scales the offset amount; gaussian and zeros ignore it. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| seed | INT | The seed as INT (wire into samplers / noise nodes). |
| seed_string | STRING | The same seed as STRING (filenames, notes, prompts). |
| noise | NOISE | A NOISE source for the sampler's `noise` input -- THE noise the model actually denoises. This is where noise character belongs: an empty latent's contents are multiplied by zero at the start of a full schedule, the sampler's own noise is not. |