ForgeNeo Bridge KSampler
The node that actually runs it
- model
- positive
- negative
- settings
- input_latent
- latent
This is the node you'll actually look at. Drag a Forge Neo PNG onto the ComfyUI canvas and the pack builds you a graph; the thing sitting at the centre of it, with a real seed and steps box you can change, is ForgeNeo Bridge KSampler.
What it replaces
Forge and ComfyUI agree on what a diffusion model is and disagree on almost everything downstream: how initial noise is generated, how prompts are parsed and scheduled, how CFG runs, what a sigma column looks like. That's why moving an image between the two by hand gives you a cousin, not a copy. This node is the bridge in one place: it reads the Forge parameters saved in that PNG's parameters chunk, then samples with Forge's text handling and initial-noise rules instead of ComfyUI's.
The pleasant surprise is that it stays editable. After the import you can change seed, steps, CFG, sampler, scheduler and denoise like any other KSampler - the source values are kept as provenance, they don't snap back.
Inputs and outputs
Required: model, positive and negative (both FORGE_TEXT_INPUT, from ForgeNeo Bridge Text Encode), settings (FORGE_SETTINGS, from ForgeNeo Bridge Settings), seed, steps (1–10000, default 20), cfg (0–1000, default 7), sampler_name (45 choices), scheduler (17 choices), denoise (default 1.0).
Optional: input_latent - connect a latent and it controls the base dimensions and batch; for img2img it's required.
Output: latent. One output, and it's not an image, which trips people up. Wire it to VAEDecode and then to Save Image. There's no sampler-side image preview.
Two details worth noticing. seed is a string, not an integer - Forge seeds go past the signed 64-bit range, so the pack takes the digits as text and checks the uint64 ceiling itself; batch offsets and active ENSD are validated against that limit before execution rather than blowing up mid-run. And the frontend adds control after generate on that field: fixed, increment, decrement, randomize. Fresh imports default to fixed, so re-queuing a dropped Forge image reproduces it instead of rolling a new seed at you.
The sampler_name list is the pack's own registry plus whatever your ComfyUI install exposes, so the dropdown grows with your version. Three CFG++ entries - Euler CFG++, Euler a CFG++, DPM++ 2M CFG++ - compute the negative condition even at CFG 1. Correct for those solvers, surprising if you're not expecting it.
The switch that decides everything
ForgeNeo Bridge Settings carries forge_compatibility, ON by default. On: this node builds its run spec from the current widget values plus the connected loader and LoRA chain, and samples the Forge way. Off: it calls ComfyUI's own CLIPTextEncode, CLIPSetLastLayer (when clip skip is explicit) and KSampler with the same model, prompts and numbers.
Off is not "convert to standard nodes". The pack still has to be installed, the node is still this node, and the two modes are not promised to produce matching pixels. It's an escape hatch for when you'd rather be on the boring path. Note also what happens inside: text encoding is performed here, after settings are known - which is why the Text Encode node you wired in has no CLIP-skip or weight widgets of its own.
Refusals are specific rather than clever. A video model wired into this sampler gets rejected, not coerced. Out of memory produces an error: it will not silently tile, reduce resolution, or downgrade precision to fit. And prompt text containing <lora:...> tags loads nothing - LoRAs come from the loader chain. A feature, if you've ever debugged a LoRA tag that quietly did nothing.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/ukr8b3g-cmyk/ComfyUI-ForgeNeo-Bridge.git
Restart ComfyUI, then F5. Manager install works too - search the pack title "ForgeNeo Bridge". There's no requirements.txt to install and no model auto-download; the pack leans on the torch/numpy/scipy/Pillow/tqdm already in your ComfyUI environment, vendors its Lark parser privately, and doesn't rewrite global sampler or RNG functions. Update with git pull --ff-only inside the repo, then restart and reload.
Where people get burned
"It ran and the image isn't close." Expected sometimes. Hires.fix is the usual culprit - upscaling, VAE re-encoding and the second pass's sampling all differ between the two UIs, and the author's own docs say composition and detail can diverge noticeably. Use the original image file, not a resized copy.
"Import saved the wrong model." It doesn't guess. Missing or ambiguous filenames stay as the original name with a warning, and you fix the Loader. Same for VAE and text encoder files you don't have - read the import warning instead of queueing.
"My old workflow behaves differently from a fresh drop." Legacy workflows without the adjustments field load with sampling_adjustments ON to preserve prior behaviour; new imports default OFF.
Coexistence: the pack is built not to disturb shared runtime state, and CPU tests check that, but end-to-end GPU coexistence with MiniMax H3 or LTX is unverified - and it won't undo global changes other extensions already made. Test with those disabled first.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| positive | FORGE_TEXT_INPUT | — | |
| negative | FORGE_TEXT_INPUT | — | |
| settings | FORGE_SETTINGS | — | |
| seed | STRING | 0 | — |
| steps | INT | 201–10000 | — |
| cfg | FLOAT | 7.00–1000 | — |
| sampler_name | COMBO | 45 options: euler, euler_ancestral, er_sde, dpmpp_2m, dpmpp_2m_sde, dpm_2, +39 | |
| scheduler | COMBO | 17 options: automatic, simple, beta, karras, exponential, polyexponential, +11 | |
| denoise | FLOAT | 1.000–1 | — |
| input_latentopt | LATENT | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| latent | LATENT | — |