LZ Pipe Pack XL
The pipe that carries your XY plot config too
- model
- clip
- vae
- positive
- negative
- latent
- lz_pipe
Here's a naming trap before anything else: the "XL" in LZ Pipe Pack XL is not about SDXL checkpoints. It means extended. This node is LZ Pipe Pack with the XY plot machinery bolted on, so the one lz_pipe you send downstream carries not just your model, prompts, and geometry - it also carries the axis definitions for a grid comparison. It's the bridge between the pack's pipe system and its XY plot system.
Everything the plain LZPipePack accepts is here: model, clip, vae, positive, negative, latent, positive_text, negative_text, width, height, ckpt_name, ckpt_hash, lora_name, lora_strength. Then it adds the plot fields.
The plot inputs it bundles
x_type/y_type- each is a dropdown:none,checkpoint,lora,sampler,scheduler,positive,negative. This is what the axis varies.x_values/y_values- multiline, one value per line. Forcheckpointthat's checkpoint filenames; forlorait'sname:model_weight:clip_weight; forsampler/schedulerit's the sampler or scheduler names; forpositive/negativeit's the replacement text.x_replace_key/y_replace_key- for prompt axes, the exact placeholder in your base prompt that gets swapped out.replace_escape- on by default. When it's on, underscores become spaces and parentheses get escaped before replacement. That matters for booru-style prompts where tags are written with spaces anyway; if you're seeing literal backslashes or mangled underscores in your replacements, this toggle is the first thing to flip.
There are also x_type_str / y_type_str string inputs, which let you drive the axis type from another node rather than the dropdown - useful once a workflow gets automated.
How the pipe carries it
When you run the pack, it parses your x_values/y_values lines into lists and stores them in the pipe under underscore-prefixed keys (_x_type, _x_values, _y_values, _x_replace_key, _replace_escape, and so on). Downstream, LZXYPlot and LZXYSampler read those exact keys back out, which is why the XY system and the pipe system compose: pack the config once, sample later. The regular LZPipePack doesn't write those keys, so if you feed a plain pack into an XY sampler and it has no plot config, the sampler just runs a single image at whatever the pipe's current values are.
When to reach for it
If you're doing a systematic sweep - compare three checkpoints × two samplers, or test LoRA strengths against a prompt variation - this is the node that makes the comparison a property of the pipe rather than a tangle of extra wires. Pack the base state plus the axes, then let an XY sampler do the looping.
If you're not doing a plot, use the plain LZPipePack. The extra fields are dead weight otherwise and just give you more places to misconfigure.
Installing it
Same pack, same install as every LZNodes node:
cd ComfyUI/custom_nodes
git clone https://github.com/liz-ils/ComfyUI-LZNodes
Restart, or grab it from ComfyUI Manager by searching "ComfyUI-LZNodes". No dependencies beyond stock ComfyUI, no model files.
The trap
Because the pipe hides its contents, it's easy to forget the plot config is even in there. You'll pack axes into a pipe, later run a sampler that consumes it, and wonder why your "simple" generation is actually producing a grid - that's the XL pack's leftover config doing its thing. When you're not sweeping, keep the XL pack out of the graph or wire a plain pack in its place. And remember the stale-context rule: the pipe is a snapshot at pack time, so if you change the model after packing, re-pack.
Inputs (25)
| Name | Type | Default | Description |
|---|---|---|---|
| modelopt | MODEL | — | |
| clipopt | CLIP | — | |
| vaeopt | VAE | — | |
| positiveopt | CONDITIONING | — | |
| negativeopt | CONDITIONING | — | |
| latentopt | LATENT | — | |
| positive_textopt | STRING | — | |
| negative_textopt | STRING | — | |
| widthopt | INT | — | |
| heightopt | INT | — | |
| ckpt_nameopt | STRING | — | |
| ckpt_hashopt | STRING | — | |
| lora_nameopt | STRING | — | |
| lora_strengthopt | STRING | — | |
| lora_modelopt | STRING | — | |
| lora_weightopt | STRING | — | |
| x_typeopt | COMBO | none | 8 options: none, checkpoint, diffusion_model, lora, sampler, scheduler, +2 |
| x_valuesopt | STRING | — | |
| y_typeopt | COMBO | none | 8 options: none, checkpoint, diffusion_model, lora, sampler, scheduler, +2 |
| y_valuesopt | STRING | — | |
| x_type_stropt | STRING | — | |
| y_type_stropt | STRING | — | |
| x_replace_keyopt | STRING | — | |
| y_replace_keyopt | STRING | — | |
| replace_escapeopt | BOOLEAN | true | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| lz_pipe | LZ_PIPE | — |