ComfyUI Node

Recipe Relay

The adapter that turns a recipe back into a normal graph

By FranckyB·Created 10 months ago·Updated 8 days ago· 147
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