Nodes/Z-FUSE: Surgical LoRA Orchestrator/Z-FUSE: Visual Layer Tuner
ComfyUI Node

Z-FUSE: Visual Layer Tuner

Find out which layers a Z-Image LoRA actually touches — then dial them by hand

By destinyfaux·Created 8 months ago·Updated 6 months ago· 10
Z-FUSE: Visual Layer Tuner
  • lora_stack
  • LORA_STACK
  • ANALYSIS_REPORT
lora_name
base_strength1.00
block_01.00
block_11.00
block_21.00
block_31.00
block_41.00
block_51.00
block_61.00
block_71.00
block_81.00
block_91.00
block_101.00
block_111.00
block_121.00
block_131.00
block_141.00
block_151.00
block_161.00
block_171.00
block_181.00
block_191.00
block_201.00
block_211.00
block_221.00
block_231.00
block_241.00
block_251.00
block_261.00
block_271.00
block_281.00
block_291.00

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.

CategoryZ-Image/Fusion

Inputs (33)

NameTypeDefaultDescription
lora_nameCOMBOLoRA to analyze and tune per-block
base_strengthFLOAT1.00-10–10Global strength multiplier
block_0FLOAT1.000–5Block 0 multiplier (1.0=neutral, 0.0=off)
block_1FLOAT1.000–5Block 1 multiplier (1.0=neutral, 0.0=off)
block_2FLOAT1.000–5Block 2 multiplier (1.0=neutral, 0.0=off)
block_3FLOAT1.000–5Block 3 multiplier (1.0=neutral, 0.0=off)
block_4FLOAT1.000–5Block 4 multiplier (1.0=neutral, 0.0=off)
block_5FLOAT1.000–5Block 5 multiplier (1.0=neutral, 0.0=off)
block_6FLOAT1.000–5Block 6 multiplier (1.0=neutral, 0.0=off)
block_7FLOAT1.000–5Block 7 multiplier (1.0=neutral, 0.0=off)
block_8FLOAT1.000–5Block 8 multiplier (1.0=neutral, 0.0=off)
block_9FLOAT1.000–5Block 9 multiplier (1.0=neutral, 0.0=off)
block_10FLOAT1.000–5Block 10 multiplier (1.0=neutral, 0.0=off)
block_11FLOAT1.000–5Block 11 multiplier (1.0=neutral, 0.0=off)
block_12FLOAT1.000–5Block 12 multiplier (1.0=neutral, 0.0=off)
block_13FLOAT1.000–5Block 13 multiplier (1.0=neutral, 0.0=off)
block_14FLOAT1.000–5Block 14 multiplier (1.0=neutral, 0.0=off)
block_15FLOAT1.000–5Block 15 multiplier (1.0=neutral, 0.0=off)
block_16FLOAT1.000–5Block 16 multiplier (1.0=neutral, 0.0=off)
block_17FLOAT1.000–5Block 17 multiplier (1.0=neutral, 0.0=off)
block_18FLOAT1.000–5Block 18 multiplier (1.0=neutral, 0.0=off)
block_19FLOAT1.000–5Block 19 multiplier (1.0=neutral, 0.0=off)
block_20FLOAT1.000–5Block 20 multiplier (1.0=neutral, 0.0=off)
block_21FLOAT1.000–5Block 21 multiplier (1.0=neutral, 0.0=off)
block_22FLOAT1.000–5Block 22 multiplier (1.0=neutral, 0.0=off)
block_23FLOAT1.000–5Block 23 multiplier (1.0=neutral, 0.0=off)
block_24FLOAT1.000–5Block 24 multiplier (1.0=neutral, 0.0=off)
block_25FLOAT1.000–5Block 25 multiplier (1.0=neutral, 0.0=off)
block_26FLOAT1.000–5Block 26 multiplier (1.0=neutral, 0.0=off)
block_27FLOAT1.000–5Block 27 multiplier (1.0=neutral, 0.0=off)
block_28FLOAT1.000–5Block 28 multiplier (1.0=neutral, 0.0=off)
block_29FLOAT1.000–5Block 29 multiplier (1.0=neutral, 0.0=off)
lora_stackoptLORA_STACKChain from previous stack

Outputs (2)

NameTypeDescription
LORA_STACKLORA_STACK
ANALYSIS_REPORTSTRING