ComfyUI Node

Recipe Relay

The adapter that turns a recipe back into a normal graph

By FranckyB·Created 12 months ago·Updated 2 days ago· 164
Recipe Relay
  • recipe_data
  • model
  • clip
  • positive
  • negative
  • vae
  • latent
  • image
  • mask
  • extra_1
  • extra_2
  • lora_stack
  • model_data
  • recipe_data
  • model
  • clip
  • positive
  • negative
  • vae
  • latent
  • image
  • mask
  • extra_1
  • extra_2
  • seed
  • steps
  • cfg
  • sampler_name
  • scheduler
  • denoise
  • pos_prompt
  • neg_prompt
  • lora_stack
  • width
  • height
  • batch_size
  • length
  • model_name
  • family
  • ckpt_name
  • unet_name
  • vae_name
  • clip_name
◄model_slotmodel_a►
◄seed—►
◄steps—►
◄cfg—►
◄sampler_name▾►
◄scheduler▾►
◄denoise—►
◄pos_prompt—►
◄neg_prompt—►
◄width—►
◄height—►
◄batch_size—►
◄length—►
◄model_name—►
◄family—►

Recipe Relay (class RecipeRelay) is the bridge between the pack's recipe format and ordinary ComfyUI. A recipe is one RECIPE_DATA payload - prompts, LoRAs, sampler settings, resolution, model slot - and Relay unpacks it into individual typed outputs, plus lets you override anything on the way through. It's what you use when you want a recipe's convenience but your own graph's freedom: load a recipe, let it drive a workflow you built by hand instead of the fixed Recipe Renderer template.

How it works

It reads the recipe_data input and splits it into typed outputs: model, clip, positive, negative, vae, latent, image, mask, plus the sampler knobs - seed, steps, cfg, sampler_name, scheduler, denoise - and the geometry ones - width, height, batch_size, length - along with pos_prompt, neg_prompt, and lora_stack. Every one of those outputs also has a matching optional input, and here's the trick: any input you connect overrides the corresponding recipe value. Connect a seed INT and it replaces the recipe's seed; leave it unconnected and the recipe's value flows out. It's a pure passthrough bridge - nothing is modified or cached in the payload unless you use the dedicated override fields.

The model_slot selector (model_a–model_d) chooses which of the recipe's up to four model blocks you're reading and updating. The recipe-side writer inputs matter too:

  • model_name - resolve a model name and write it into the recipe's model fields.
  • family - override the slot's model family in the recipe data.
  • model_data - take a structured payload from Recipe Model Picker and use it.

Models, CLIPs, and VAEs passed through are cached on the selected model block, so a hand-loaded model can be reused by the recipe without re-loading.

Why it exists

Two philosophies live in this pack. The Recipe Renderer says "give me a recipe, I'll handle everything." Recipe Relay says "give me a recipe, I'll give you all the parts, you assemble." Relay's audience is people who want recipes for reproducibility but refuse to give up their custom graphs - your own KSampler chain, your own upscaling, your own ControlNet. You extract a recipe, wire Relay to your existing graph, and the recipe fills in all the settings you used to set by hand.

Installing

Part of the pack:

cd ComfyUI/custom_nodes
git clone https://github.com/FranckyB/ComfyUI-Prompt-Manager.git
cd ComfyUI-Prompt-Manager
pip install -r requirements.txt

Or ComfyUI Manager → search "Prompt Manager", then restart.

Gotchas

The biggest confusion is the override behavior: unconnected inputs mean "use the recipe value," so if you want an override to apply, you must connect something to that input - a typed widget or a constant. And because nearly everything is optional, a recipe with empty slots will happily flow through and produce empty outputs; check that the recipe actually has the data you expect. Finally, don't confuse this with the Renderer: Relay does no sampling or decoding itself. If you wire it up and get no image out, that's working as designed - it's a plumbing node, not a renderer.

CategoryPrompt Manager

Inputs (28)

NameTypeDefaultDescription
recipe_dataoptRECIPE_DATAOptional recipe_data input. If omitted, bridge starts from an empty payload dict.
model_slotoptCOMBOmodel_aSelect which model slot to read/update in recipe_data.
modeloptMODELPass-through Model
clipoptCLIPPass-through CLIP
positiveoptCONDITIONINGPass-through positive conditioning
negativeoptCONDITIONINGPass-through negative conditioning
vaeoptVAEPass-through VAE
latentoptLATENTPass-through latent
imageoptIMAGEPass-through image
maskoptMASKPass-through mask
extra_1opt*Pass-through extra data (any type)
extra_2opt*Pass-through extra data (any type)
seedoptINTOverride sampler seed
stepsoptINTOverride sampling steps
cfgoptFLOATOverride CFG scale
sampler_nameoptCOMBOOverride sampler name
scheduleroptCOMBOOverride scheduler
denoiseoptFLOATOverride denoise
pos_promptoptSTRINGOverride positive prompt
neg_promptoptSTRINGOverride negative prompt
lora_stackoptLORA_STACKOverride LoRA stack
widthoptINTOverride width
heightoptINTOverride height
batch_sizeoptINTOverride batch size
lengthoptINTOverride video length
model_nameoptSTRINGOptional model name/path. Resolves and writes recipe model field(s).
familyoptSTRINGOptional model family override. Writes selected slot family in recipe_data.
model_dataopt*Optional structured model payload from Recipe Model Picker.

Outputs (30)

NameTypeDescription
recipe_dataRECIPE_DATA—
modelMODEL—
clipCLIP—
positiveCONDITIONING—
negativeCONDITIONING—
vaeVAE—
latentLATENT—
imageIMAGE—
maskMASK—
extra_1*—
extra_2*—
seedINT—
stepsINT—
cfgFLOAT—
sampler_nameeuler,euler_cfg_pp,euler_ancestral,euler_ancestral_cfg_pp,heun,heunpp2,exp_heun_2_x0,exp_heun_2_x0_sde,dpm_2,dpm_2_ancestral,lms,dpm_fast,dpm_adaptive,dpmpp_2s_ancestral,dpmpp_2s_ancestral_cfg_pp,dpmpp_sde,dpmpp_sde_gpu,dpmpp_2m,dpmpp_2m_cfg_pp,dpmpp_2m_sde,dpmpp_2m_sde_gpu,dpmpp_2m_sde_heun,dpmpp_2m_sde_heun_gpu,dpmpp_3m_sde,dpmpp_3m_sde_gpu,ddpm,lcm,ipndm,ipndm_v,deis,res_multistep,res_multistep_cfg_pp,res_multistep_ancestral,res_multistep_ancestral_cfg_pp,gradient_estimation,gradient_estimation_cfg_pp,er_sde,seeds_2,seeds_3,sa_solver,sa_solver_pece,ddim,uni_pc,uni_pc_bh2—
schedulersimple,sgm_uniform,karras,exponential,ddim_uniform,beta,normal,linear_quadratic,kl_optimal—
denoiseFLOAT—
pos_promptSTRING—
neg_promptSTRING—
lora_stackLORA_STACK—
widthINT—
heightINT—
batch_sizeINT—
lengthINT—
model_nameSTRING—
familySTRING—
ckpt_name—
unet_name—
vae_namepixel_space—
clip_name—