Forge Compat Noise
This is the node that fixes that
- spec
- model
- input_latent
- latent
- noise
- report
Here's the thing nobody tells you when you switch UIs: seed 424011486 in Forge and seed 424011486 in ComfyUI are different pictures. The seed is only an index into a noise generator, and Forge generates its initial noise with its own rule - CPU/GPU/NV source, its own Philox path, its own ENSD and variation-seed arithmetic. Same number, different tensor, different image. Forge Compat Noise is the node that reproduces Forge's side of that arithmetic, and it's the reason a bridged regeneration looks like the original instead of like a sibling.
Inputs and outputs
Required: spec (the FORGE_GENERATION_SPEC from Forge Compat Import / Spec) and model (a MODEL, so the node can read the family and latent format before it does anything). Optional: input_latent, which is what makes img2img work - pass your loaded image's latent and the node copies it and checks it matches the expected shape; txt2img runs without it and expects an empty latent.
Outputs are three: latent (goes to the sampler), noise (a FORGE_NOISE_BUNDLE, also goes to the sampler, and is not the same thing), and report.
That split is the design. The initial noise is not added into the latent's samples; it travels as its own bundle. Which matters more than it sounds.
What's actually in the bundle
The seed, subseed, subseed strength and ENSD rules from the spec, plus the generated initial noise tensor, its hash, the input latent's hash, and - the interesting part - a snapshot of every private RNG stream after the initial draw. The sampler rebuilds a fresh private generator from that snapshot each time it runs.
Why bother? Because a live torch.Generator is a cursor. Share one across a cached node, a second branch off the same bundle, a re-queue, or a cancel-and-retry, and the cursor has moved on: the same seed quietly gives you a different noise on the second run. Snapshotting makes the noise replayable. It also means this pack never touches torch.manual_seed or the global numpy/torch RNG, which is the same reason the author claims it can coexist with video packs like MiniMax H3 and LTX that lean on shared RNG state. The CPU-side of that claim is tested; end-to-end GPU coexistence with those packs is explicitly not verified, so don't treat it as a guarantee.
The refusals
Every one of these produces a specific error instead of a shrug:
- Video and NestedTensor latents are rejected here. Anima image latents at T=1 are fine; a video model wrongly wired into this node gets refused rather than coerced. Notably, the pack does not rewrite the workflow you didn't ask it to touch.
RNG_DEVICE_UNAVAILABLEif the spec saysGPUnoise and you have no CUDA device. There's no silent CPU fallback - a fallback would change the noise, which is exactly what this node exists to prevent.- Seeds past the uint64 ceiling fail before execution, including when the batch offset or active ENSD would push the last seed over. Forgotten in most UIs; this one catches it.
LATENT_MISMATCHwhen a "txt2img" run is handed a non-empty latent, or when the shape doesn't match the model's expected latent format.
One nuance worth knowing: ENSD only reaches the RNG when the spec counts sampling adjustments as active (ensd is read as 0 otherwise). So a saved ENSD value sitting in your spec that appears to do nothing is usually behaving as documented, not broken - the report tells you which parameters were applied and which were retained-but-inactive.
Install and wiring
cd ComfyUI/custom_nodes
git clone https://github.com/ukr8b3g-cmyk/ComfyUI-ForgeNeo-Bridge.git
Restart ComfyUI and refresh with F5. No startup pip, no model downloads, no patching of ComfyUI's sampler or RNG functions. Update with git pull --ff-only.
In the legacy chain, one spec feeds three nodes:
Forge Compat Import / Spec ──spec──> Forge Compat Noise (model from your loader)
│ latent + noise
▼
Forge Compat Sampler ──> VAEDecode ──> Save Image
If you're not hand-wiring, you'll rarely see this node: dropping a Forge image builds the newer ForgeNeo Bridge KSampler, which handles noise internally. The Compat nodes stick around for older saved workflows and for people who want the bundle split out where they can inspect it.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| spec | FORGE_GENERATION_SPEC | — | |
| model | MODEL | — | |
| input_latentopt | LATENT | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| latent | LATENT | — |
| noise | FORGE_NOISE_BUNDLE | — |
| report | STRING | — |