LoraManager Recipe Runner (WAN 2.2)
Wan 2.2 runs two experts. This node splits your LoRA recipe across both.
- received_loras
- positive
- negative
- steps
- cfg
- sampler_name
- scheduler
- seed
- high_end_step
- shift
- frames
- fps
- high_loras
- low_loras
- summary
Wan 2.2's 14B models are two models wearing a trenchcoat. The high-noise expert does motion and scene composition, the low-noise expert refines detail, and anything you want to influence has to go into both, which is why every Wan 2.2 help thread asks how to stack several LoRAs per expert without building the same loader twice.
ComfyUI-Lora-Manager's recipes solved the saving half: a LoRA combination with its weights, importable from any Civitai image URL, trigger words attached. What a recipe can't do is drive a Wan run - its steps, CFG and prompt sit in a JSON file you'd otherwise retype.
What it does
Feed it a recipe and it returns a whole two-expert run: prompt and negative, steps, CFG, sampler, scheduler, seed, shift, frames, fps - plus the recipe's LoRAs pre-sorted into a high_loras stack and a low_loras stack. That split is the whole point: Wan 2.2 LoRAs ship as a high/low pair, and the usual workaround is two Power Lora Loaders and bookkeeping.
How it picks a recipe
Dropdown. Every *.recipe.json in your recipes folder shows up as abcd1234 | Some title, newest first. Pick one and the node resolves the recipe's LoRAs against your local library itself; nothing has to be sent from LoraManager. It reads the same folder LoraManager does and prints it in the summary - check there first if your recipes don't appear.
auto: match the LoRAs sent from LoraManager. Wire a LoraManager stack node into received_loras, then hit Send to Workflow on a recipe in the sidebar. Send only carries the LoRA list, so the node reads the Civitai version ids off those LoRAs and picks the highest-overlap recipe, shown as a percentage in the summary. With exactly one LoraManager stack in the workflow, Send doesn't ask which node to fill. And the sent stack wins over the recipe's own list, strengths included - tweak a weight in the stack and the recipe only supplies what you didn't send.
The inputs you actually touch
recipeandreceived_loras- the two that matter. The rest is override or fallback.prompt_override/negative_override- empty means use the recipe's; filled in, they win.style_tokenprepends text instead (a checkpoint's style trigger) without doubling up.seedis used only when the recipe has none.fallback_steps/fallback_cfg/fallback_sampler/fallback_scheduler/fallback_shift- the "recipe didn't say" values. Defaults (8 steps, CFG 1, euler/simple, shift 5) are the lightx2v-flavoured shape of Wan 2.2 generation.frames/fps- recipes never record these, so they're plain widgets (81 at 16 fps) the node hands back out.
Outputs, and where they go
steps, cfg, sampler_name and scheduler go to both KSamplerAdvanced nodes. high_end_step is a computed steps // 2 - where the high-noise sampler stops and the low-noise one starts. shift feeds ModelSamplingSD3; positive / negative into your text encoders; frames / fps into your latent and video nodes; high_loras / low_loras into a stack loader on each expert.
Wire summary into a text display first. It's the debug window: which recipe matched and how, which folder it read, every LoRA with its strength, and each setting tagged as recipe or fallback.
Install
One node, no pip dependencies - stdlib plus folder_paths, so nothing to break on a torch upgrade. ComfyUI Manager, search "LoraManager Recipe Runner", or:
cd ComfyUI/custom_nodes
git clone https://github.com/mikesimone/ComfyUI-LoraManager-RecipeRunner
# restart ComfyUI
You'll also need ComfyUI-Lora-Manager for the recipes, the stack node that fills received_loras, and the .metadata.json files this reads. No model downloads.
Where people get burned
The high/low guess is a loose filename regex. It matches high / HN / _H / -H and low / LN / _L / -L as plain substrings, so slomo_flow_v2.safetensors gets filed low-noise-only and highlight... goes high. Check the summary's two lists.
A LoRA that isn't in the library gets skipped. Resolution runs through LoraManager's .metadata.json sidecars (same basename as the safetensors), so a LoRA you downloaded by hand has no sidecar and can't be matched by Civitai version, and is reported as missing.
New recipes need a refresh. The dropdown is built at load time - press R after saving one.
Speed LoRAs are your problem, not the node's. It doesn't inject a lightx2v/Lightning LoRA, so a recipe made without one that records CFG above 1 will fight the 4-step speed LoRA in your own loaders. Drop the speed LoRA or set fallback_cfg.
Who it's for
If you use LoraManager recipes and run Wan 2.2 14B, this deletes a pile of manual wiring. It's brand new - version 0.1.0, first release 2026-10-01, MIT, from an author with no prior pack reputation to lean on; the source is 309 readable lines and does what it says. If you don't use recipes, skip it.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| recipe | COMBO | 1 options: auto: match the LoRAs sent from LoraManager | |
| seed | INT | 00–18446744073709550000 | Used when the recipe has no seed. |
| prompt_override | STRING | Leave empty to use the recipe's prompt. | |
| negative_override | STRING | Leave empty to use the recipe's negative. | |
| style_token | STRING | Optional text prepended to the positive (e.g. a checkpoint's style trigger). Empty adds nothing. | |
| fallback_steps | INT | 81–200 | Used when the recipe has no steps. |
| fallback_cfg | FLOAT | 1.00–30 | Used when the recipe has no CFG. |
| fallback_sampler | COMBO | euler | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 |
| fallback_scheduler | COMBO | simple | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 |
| fallback_shift | FLOAT | 5.00–100 | Used when the recipe has no shift (recipes rarely record it). |
| frames | INT | 811–1000 | Recipes never record frame count. |
| fps | FLOAT | 16.001–120 | Recipes never record fps. |
| received_lorasopt | LORA_STACK | The LoraManager stack that Send to Workflow fills. |
Outputs (14)
| Name | Type | Description |
|---|---|---|
| positive | STRING | — |
| negative | STRING | — |
| 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 | — |
| seed | INT | — |
| high_end_step | INT | — |
| shift | FLOAT | — |
| frames | INT | — |
| fps | FLOAT | — |
| high_loras | LORA_STACK | — |
| low_loras | LORA_STACK | — |
| summary | STRING | — |