Z-FUSE: Visual Layer Tuner
Find out which layers a Z-Image LoRA actually touches — then dial them by hand
- lora_stack
- LORA_STACK
- ANALYSIS_REPORT
Stacking LoRAs on Z-Image is usually a trust exercise. You load three, you hope they don't fight, and if the render turns to soup you blame the combo and try something else. This node ends the guessing: it tells you, block by block, how much of a LoRA's influence lives in each of Z-Image's 30 transformer blocks - and then lets you reshape it.
ZFuseVisualLayerTuner (Visual Layer Tuner in the menu) is one node per LoRA. You feed it a lora_name, a global base_strength, and thirty sliders named block_0 through block_29. Each slider is a multiplier: 1.0 is neutral, 0.0 switches that block off entirely, up to 5.0 to amplify. That's the surgical control the whole pack is named after - you can keep a character LoRA's face blocks and kill the style it drags along, or isolate a texture LoRA to the late blocks where Z-Image decides skin and lighting.
How it works
When the queue runs, the tuner does two things. First it loads the LoRA's .safetensors on CPU and sums the per-block norms of its lora_up matrices - a cheap, dependency-free way of measuring where the LoRA's weight actually lives. The result goes to the ANALYSIS_REPORT output as an ASCII bar chart: Block 14: ████████ (15.89) and so on, plus the architecture's special tensors (Context, Noise, X-Embed, Final) if they're present. It's a rough proxy for visual impact, not a ground truth, but for ranking "hot" vs "cold" layers it's genuinely useful.
Second, it appends the LoRA and your block map to the LORA_STACK output. Blocks set to 0.0 are skipped during fusion entirely - the author's own guidance is to zero out every weak block in the report, because skipped blocks save RAM and let the strong ones shine without a fight. base_strength multiplies whatever the sliders say afterward, so it's a master volume, not a per-block tool.
Chain tuners through their optional lora_stack input to build a stack of several tuned LoRAs, then send the final stack to ZFuseOrchestrator, which is where the merging actually happens.
Install
No dependencies beyond what ComfyUI already has (safetensors, torch), no models to download:
cd ComfyUI/custom_nodes
git clone https://github.com/destinyfaux/Z-Fuse.git
restart, or search Z-Fuse in ComfyUI Manager. Then add a tuner per LoRA.
Where people get burned
- It's a big node. Thirty sliders plus inputs takes up real estate on the canvas. If you only need a uniform block range, the pack's other node -
ZFuseLoRAStack, the Bus - is the compact version with a text override (12:1.5) instead of a slider wall. The README even pitches them that way: mass movement vs. granular control. - The report is generated at queue time, not when you add the node. If you wire up the sliders before ever running, there's no report to look at. Run once, read the bars, then tune.
- Sliders cap at 5.0. A few comments in the wild suggest −10…+10, but the shipped node's range is 0.0–5.0 per block; use negative base_strength if you want to subtract influence globally.
- "Low impact" / "File not found" means the LoRA path is wrong or it isn't a Z-Image LoRA. LoRAs are architecture-bound - an SDXL LoRA won't map onto Z-Image's S3-DiT blocks and this node is honest about finding nothing.
Honestly, the report alone is worth the install. For the first time you can look at a Z-Image LoRA and know why it fights the others - usually because two of them both hammer blocks 17–24. Zero one, and suddenly your stack plays nice without a single reroll.
Inputs (33)
| Name | Type | Default | Description |
|---|---|---|---|
| lora_name | COMBO | LoRA to analyze and tune per-block | |
| base_strength | FLOAT | 1.00-10–10 | Global strength multiplier |
| block_0 | FLOAT | 1.000–5 | Block 0 multiplier (1.0=neutral, 0.0=off) |
| block_1 | FLOAT | 1.000–5 | Block 1 multiplier (1.0=neutral, 0.0=off) |
| block_2 | FLOAT | 1.000–5 | Block 2 multiplier (1.0=neutral, 0.0=off) |
| block_3 | FLOAT | 1.000–5 | Block 3 multiplier (1.0=neutral, 0.0=off) |
| block_4 | FLOAT | 1.000–5 | Block 4 multiplier (1.0=neutral, 0.0=off) |
| block_5 | FLOAT | 1.000–5 | Block 5 multiplier (1.0=neutral, 0.0=off) |
| block_6 | FLOAT | 1.000–5 | Block 6 multiplier (1.0=neutral, 0.0=off) |
| block_7 | FLOAT | 1.000–5 | Block 7 multiplier (1.0=neutral, 0.0=off) |
| block_8 | FLOAT | 1.000–5 | Block 8 multiplier (1.0=neutral, 0.0=off) |
| block_9 | FLOAT | 1.000–5 | Block 9 multiplier (1.0=neutral, 0.0=off) |
| block_10 | FLOAT | 1.000–5 | Block 10 multiplier (1.0=neutral, 0.0=off) |
| block_11 | FLOAT | 1.000–5 | Block 11 multiplier (1.0=neutral, 0.0=off) |
| block_12 | FLOAT | 1.000–5 | Block 12 multiplier (1.0=neutral, 0.0=off) |
| block_13 | FLOAT | 1.000–5 | Block 13 multiplier (1.0=neutral, 0.0=off) |
| block_14 | FLOAT | 1.000–5 | Block 14 multiplier (1.0=neutral, 0.0=off) |
| block_15 | FLOAT | 1.000–5 | Block 15 multiplier (1.0=neutral, 0.0=off) |
| block_16 | FLOAT | 1.000–5 | Block 16 multiplier (1.0=neutral, 0.0=off) |
| block_17 | FLOAT | 1.000–5 | Block 17 multiplier (1.0=neutral, 0.0=off) |
| block_18 | FLOAT | 1.000–5 | Block 18 multiplier (1.0=neutral, 0.0=off) |
| block_19 | FLOAT | 1.000–5 | Block 19 multiplier (1.0=neutral, 0.0=off) |
| block_20 | FLOAT | 1.000–5 | Block 20 multiplier (1.0=neutral, 0.0=off) |
| block_21 | FLOAT | 1.000–5 | Block 21 multiplier (1.0=neutral, 0.0=off) |
| block_22 | FLOAT | 1.000–5 | Block 22 multiplier (1.0=neutral, 0.0=off) |
| block_23 | FLOAT | 1.000–5 | Block 23 multiplier (1.0=neutral, 0.0=off) |
| block_24 | FLOAT | 1.000–5 | Block 24 multiplier (1.0=neutral, 0.0=off) |
| block_25 | FLOAT | 1.000–5 | Block 25 multiplier (1.0=neutral, 0.0=off) |
| block_26 | FLOAT | 1.000–5 | Block 26 multiplier (1.0=neutral, 0.0=off) |
| block_27 | FLOAT | 1.000–5 | Block 27 multiplier (1.0=neutral, 0.0=off) |
| block_28 | FLOAT | 1.000–5 | Block 28 multiplier (1.0=neutral, 0.0=off) |
| block_29 | FLOAT | 1.000–5 | Block 29 multiplier (1.0=neutral, 0.0=off) |
| lora_stackopt | LORA_STACK | Chain from previous stack |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| LORA_STACK | LORA_STACK | — |
| ANALYSIS_REPORT | STRING | — |