ComfyUI Node

Generation Core

The all-in-one sampler that records the seed and canvas it actually used

By sickollie·Created 2 months ago·Updated 27 days ago· 30
Generation Core
  • model
  • positive_conditioning
  • negative_conditioning
  • samples
  • vae
  • seed_used
  • width
  • height
  • generation_info
◄positive_text►
◄clip_name►
◄clip_typekrea2►
◄clip_devicedefault►
◄vae_name►
◄resolution_modecustom►
◄custom_width1440►
◄custom_height1920►
◄aspect_preset3:4 (Portrait Standard)►
◄megapixels1.00►
◄batch_size1►
◄steps9►
◄cfg1.0►
◄sampler_nameeuler►
◄schedulerbeta►
◄denoise1.00►
◄shift1.25►
◄seed_value-1►
◄seed_input-1►

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.

CategorySick Ollie/Classic

Inputs (22)

NameTypeDefaultDescription
modelMODEL—
positive_textSTRING—
clip_nameCOMBO0 options:
clip_typeCOMBOkrea27 options: krea2, sd3, stable_diffusion, stable_cascade, pixart, flux, +1
clip_deviceCOMBOdefault3 options: default, cpu, gpu
vae_nameCOMBO0 options:
resolution_modeCOMBOcustom2 options: custom, preset
custom_widthINT144016–16384—
custom_heightINT192016–16384—
aspect_presetCOMBO3: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
megapixelsFLOAT1.000.05–64—
batch_sizeINT11–64—
stepsINT91–10000—
cfgFLOAT1.00–100—
sampler_nameCOMBOeuler44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38
schedulerCOMBObeta9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3
denoiseFLOAT1.000–1—
shiftFLOAT1.25-100–100—
seed_valueINT-1-1–1125899906842624-1 means randomize independently for each run.
seed_inputoptINT-1Optional external seed override. When connected, this value replaces the Generation Core seed widget for the current run.
positive_conditioningoptCONDITIONINGOptional 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_conditioningoptCONDITIONINGOptional external negative conditioning. When unconnected, Generation Core keeps its existing empty-negative behavior.

Outputs (6)

NameTypeDescription
samplesLATENT—
vaeVAE—
seed_usedINT—
widthINT—
heightINT—
generation_infoSTRING—