Generation Core
The all-in-one sampler that records the seed and canvas it actually used
- model
- positive_conditioning
- negative_conditioning
- samples
- vae
- seed_used
- width
- height
- generation_info
A stock ComfyUI sampling chain is four or five nodes - empty latent, KSampler, VAE, a text encoder - and none of them tell you what actually ran after the fact. SickOllie's Generation Core (Classic family, SOGenerationPipeline) collapses that whole chain into one node with a specific philosophy: it loads its own CLIP and VAE, samples, and then hands back the resolved seed, width, and height as outputs, not just the pixels. For a LoRA testing campaign, that "what really happened" record is half the point. The pack is built around Krea2-oriented defaults, though the dropdowns fall back to whatever text encoder and VAE you have installed.
How it works
One model socket in, one run_pipeline call, several things done. A seed of -1 means randomize independently each run; otherwise it clamps to the legal range. Dimensions resolve from either custom width/height or an aspect preset plus megapixels. Then it loads the CLIP internally (clip_type covers krea2, sd3, stable_diffusion, stable_cascade, pixart, flux, and default), encodes your positive_text, and uses an empty-string negative unless you supply one. The shift control applies the AuraFlow-style shift to the model before sampling - that's the parameter a lot of newer architectures care about - and a live preview callback streams samples while it runs.
The two optional CONDITIONING sockets are the escape hatch: connect positive_conditioning or negative_conditioning and they override the internal text encoding, which is what you want for image-edit or reference-image encoders that attach their own conditioning. Leave them unconnected and behavior is unchanged.
Inputs and outputs that matter
The controls you'll actually touch: model, positive_text, clip_name/clip_type/clip_device and vae_name (your encoder and VAE), resolution_mode (custom vs preset), aspect_preset + megapixels, steps, cfg, sampler_name, scheduler, denoise, shift, and seed_value. Defaults skew Krea2: 9 steps, CFG 1, euler + beta scheduler, 1.0 megapixel.
Outputs, in order: samples (LATENT) and vae go to your decoder or straight to Classic Output Core; seed_used, width, and height are the resolved values this run actually used; generation_info is a string summary for Output Core to embed. Those last four are the node's whole selling point - you never have to guess the seed.
Installing it
Part of the SickOllie pack:
cd ComfyUI/custom_nodes
git clone https://github.com/sickollie/SickOllie
or ComfyUI Manager → "SickOllie". Python 3.10+, restart, Ctrl+F5. No pip installs; the pack's dependencies are already in a normal ComfyUI environment.
Where people get burned
Seed confusion, mostly. The node's seed behavior is deliberately persistent - -1 randomizes each run, any other value stays fixed - which is saner than stock KSampler's control-after-generate dance. But if you set a fixed seed and keep getting identical images, that's not a bug: you asked for it. The other gotcha is expecting this to work with a model that wants a specific CLIP type - pick the wrong clip_type for your architecture and encoding fails; when in doubt, default matches the model's own config. And if you're feeding a reference-image workflow, remember the CONDITIONING override sockets are there precisely so you don't have to bolt on a second text encoder.
Inputs (22)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| positive_text | STRING | — | |
| clip_name | COMBO | 0 options: | |
| clip_type | COMBO | krea2 | 7 options: krea2, sd3, stable_diffusion, stable_cascade, pixart, flux, +1 |
| clip_device | COMBO | default | 3 options: default, cpu, gpu |
| vae_name | COMBO | 0 options: | |
| resolution_mode | COMBO | custom | 2 options: custom, preset |
| custom_width | INT | 144016–16384 | — |
| custom_height | INT | 192016–16384 | — |
| aspect_preset | COMBO | 3:4 (Portrait Standard) | 8 options: 1:1 (Square), 2:3 (Portrait), 3:4 (Portrait Standard), 4:5 (Portrait Tall), 9:16 (Portrait Phone), 4:3 (Landscape Standard), +2 |
| megapixels | FLOAT | 1.000.05–64 | — |
| batch_size | INT | 11–64 | — |
| steps | INT | 91–10000 | — |
| cfg | FLOAT | 1.00–100 | — |
| sampler_name | COMBO | euler | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 |
| scheduler | COMBO | beta | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 |
| denoise | FLOAT | 1.000–1 | — |
| shift | FLOAT | 1.25-100–100 | — |
| seed_value | INT | -1-1–1125899906842624 | -1 means randomize independently for each run. |
| seed_inputopt | INT | -1 | Optional external seed override. When connected, this value replaces the Generation Core seed widget for the current run. |
| positive_conditioningopt | CONDITIONING | Optional external positive conditioning. When connected, it overrides Generation Core's internal positive-text encoding. Useful for image-edit encoders that attach reference-image conditioning. | |
| negative_conditioningopt | CONDITIONING | Optional external negative conditioning. When unconnected, Generation Core keeps its existing empty-negative behavior. |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| samples | LATENT | — |
| vae | VAE | — |
| seed_used | INT | — |
| width | INT | — |
| height | INT | — |
| generation_info | STRING | — |