Recipe Relay
The adapter that turns a recipe back into a normal graph
- 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
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.
Inputs (28)
| Name | Type | Default | Description |
|---|---|---|---|
| recipe_dataopt | RECIPE_DATA | Optional recipe_data input. If omitted, bridge starts from an empty payload dict. | |
| model_slotopt | COMBO | model_a | Select which model slot to read/update in recipe_data. |
| modelopt | MODEL | Pass-through Model | |
| clipopt | CLIP | Pass-through CLIP | |
| positiveopt | CONDITIONING | Pass-through positive conditioning | |
| negativeopt | CONDITIONING | Pass-through negative conditioning | |
| vaeopt | VAE | Pass-through VAE | |
| latentopt | LATENT | Pass-through latent | |
| imageopt | IMAGE | Pass-through image | |
| maskopt | MASK | Pass-through mask | |
| extra_1opt | * | Pass-through extra data (any type) | |
| extra_2opt | * | Pass-through extra data (any type) | |
| seedopt | INT | Override sampler seed | |
| stepsopt | INT | Override sampling steps | |
| cfgopt | FLOAT | Override CFG scale | |
| sampler_nameopt | COMBO | Override sampler name | |
| scheduleropt | COMBO | Override scheduler | |
| denoiseopt | FLOAT | Override denoise | |
| pos_promptopt | STRING | Override positive prompt | |
| neg_promptopt | STRING | Override negative prompt | |
| lora_stackopt | LORA_STACK | Override LoRA stack | |
| widthopt | INT | Override width | |
| heightopt | INT | Override height | |
| batch_sizeopt | INT | Override batch size | |
| lengthopt | INT | Override video length | |
| model_nameopt | STRING | Optional model name/path. Resolves and writes recipe model field(s). | |
| familyopt | STRING | Optional model family override. Writes selected slot family in recipe_data. | |
| model_dataopt | * | Optional structured model payload from Recipe Model Picker. |
Outputs (30)
| Name | Type | Description |
|---|---|---|
| recipe_data | RECIPE_DATA | — |
| model | MODEL | — |
| clip | CLIP | — |
| positive | CONDITIONING | — |
| negative | CONDITIONING | — |
| vae | VAE | — |
| latent | LATENT | — |
| image | IMAGE | — |
| mask | MASK | — |
| extra_1 | * | — |
| extra_2 | * | — |
| seed | INT | — |
| steps | INT | — |
| cfg | FLOAT | — |
| sampler_name | euler,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 | — |
| scheduler | simple,sgm_uniform,karras,exponential,ddim_uniform,beta,normal,linear_quadratic,kl_optimal | — |
| denoise | FLOAT | — |
| pos_prompt | STRING | — |
| neg_prompt | STRING | — |
| lora_stack | LORA_STACK | — |
| width | INT | — |
| height | INT | — |
| batch_size | INT | — |
| length | INT | — |
| model_name | STRING | — |
| family | STRING | — |
| ckpt_name | — | |
| unet_name | — | |
| vae_name | pixel_space | — |
| clip_name | — |