Z-Image LoRA Auto Strength
Stop Guessing LoRA Strength — This Node Reads the File and Sets Every Layer for You
- layer_strengths
- analysis_report
- global_strength
- lora_name
Every Z-Image LoRA user hits the same wall: what strength do I use? Too low and the likeness evaporates, too high and everything comes out blown-out and plasticky. And on Z-Image it's worse than on SDXL, because the community keeps finding that LoRAs trained on Z-Image Base need strength 2.0+ when applied to Turbo. On top of all that, a single flat strength is a lie anyway - real LoRAs train unevenly, with some layers soaking up way more signal than others. The Z-Image LoRA Auto Strength node's whole pitch is: don't guess, read the file.
It's a pure analysis node. No model input. It opens your LoRA, looks at the actual weight tensors, and computes a per-layer strength map. One knob: global_strength (default 0.75, range 0–2), with the author's own tooltip summing it up: "All per-layer values are auto-computed from ΔW forensics."
How it works
For every layer pair in the file it reconstructs the low-rank update ΔW = lora_B @ lora_A, scales it by alpha / rank, then maps each layer's norm to a strength:
strength = clamp(global × mean_norm / layer_norm, floor 0.30, ceiling 1.50)
High-signal layers get pulled back, low-signal layers get nudged up, and the mean lands on your global_strength. Layer discovery is dynamic - no hardcoded 30-layer range, it just reports the layers that actually exist in the file.
The outputs - this is the part people wire wrong
- layer_strengths (STRING) - JSON in the exact format the Z-Image Turbo LoRA Loader expects. This is what you wire forward.
- analysis_report (STRING) - a readable forensic breakdown: rank, alpha, and per-layer ΔW before → strength after, with ★ marking the hot layers. Send it into a Show Text node and you get a genuinely useful look at how your LoRA was trained.
- global_strength (FLOAT) and lora_name (STRING) - passthroughs so you don't have to re-set them on the loader.
The intended workflow: feed this node's layer_strengths into the Turbo Loader's hidden layer_strengths input. The loader bakes the per-layer values in and still does its QKV fusion on top. The author is emphatic about this in the pack's release thread: use the auto-strength node instead of hand-dragging the graph widget - "100% recommend," his words. If you'd rather skip the two-node wiring entirely, the sibling Z-Image LoRA Auto Loader does this same analysis and the loading in one node.
Installing and troubleshooting
cd ComfyUI/custom_nodes
git clone https://github.com/capitan01R/Comfyui-ZiT-Lora-loader
Restart ComfyUI. ComfyUI Manager works too - search the pack title Comfyui-ZiT-Lora-loader. No dependencies beyond numpy, no downloads.
Two things worth knowing before you trust it blindly. First, the floor and ceiling are real: this node will never push a layer below 0.30 or above 1.50, so global_strength 0 doesn't mean "off" - it floors everything at 0.30. If you genuinely want a layer at zero, that's the loader's graph widget's job. Second, it's architecture-agnostic on the analysis side but built for Z-Image keys, so the report is only as meaningful as the file's naming - a LoRA trained against a different architecture will produce a layer map that does nothing useful downstream.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| lora_name | COMBO | 0 options: | |
| global_strength | FLOAT | 0.750–2 | Master strength. All per-layer values are auto-computed from ΔW forensics. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| layer_strengths | STRING | — |
| analysis_report | STRING | — |
| global_strength | FLOAT | — |
| lora_name | STRING | — |