LZ Anima Artist Options (Advanced)
The advanced controls cabinet for the Anima artist mixer
- advanced_options
If LZAnimaArtistNode is the knob, LZ Anima Artist Options is the entire control room. It's an options bundle node: one ANIMA_OPTS output that plugs into the advanced_options socket on the Pack/CrossAttn/combined nodes and unlocks block-level layer selection, sampling-progress windows, EMA smoothing, low-rank consensus, static capture, and the anchor-Q experiment. Nothing to generate on its own - it's pure configuration that rides along with the injection.
What you're actually tuning
The full list is long, so here's the map, roughly from "you'll touch this" to "rarely":
- start_block / end_block - which cross-attention layers get patched, by index (0 = first layer, −1 = last). Restricting injection to mid/high blocks is the single most effective lever for "the style is bleeding into the composition." A
layer_filterstring (0,3,5-10,-1) overrides both if you want a non-contiguous set. - start_percent / end_percent - window the injection across sampling progress (0.0 → 1.0). Style early, let structure settle late, or vice versa.
- normalize_weights - whether the per-artist weights act as relative proportions (on) or independent strengths (off). Auto-disabled if you used
::weightsyntax in the artist chain. - artist_ema_alpha - cross-step EMA smoothing of the injected attention (interpolate fusion only). 0.3–0.5 is light, 0.8+ heavy; it removes flicker-style instability across steps at the cost of lag. Auto-resets each sampling run.
- lowrank_k - only for
combine_mode: lowrank_avg. The low-rank projection dimension: k=1 forces all artists along a single consensus style direction, k=2–3 keeps the main directions (recommended), k≥N degenerates to plain output averaging. - artist_static_capture + static_capture_k - accumulate the artist attention over the first K steps, then freeze it. K=6 is the recommended default; the tooltip calls K=1 the "v18 single-point cache."
- artist_anchor_q + anchor_seeds_count / anchor_user_blend / anchor_deep_layer_threshold - the experiment: fix the query hidden state to a precomputed anchor (from a fixed-seed forward pass, ~1s overhead on first use) instead of letting it follow the user seed.
anchor_user_blendmixes between pure-anchor and pure-user x;anchor_deep_layer_thresholdrestricts anchoring to shallow layers. Decoupling style from seed noise.
The pack is upfront that some of these are experimental, and the code actively guards the combinations: static capture + concat_with_base is incompatible (static auto-ignored with a warning), anchor_q + static capture are mutually exclusive, and anchor_q + concat_with_base disables anchor_q.
How to use it
Add the Options node, set the few knobs you care about, wire its advanced_options into the injection node's socket. Leave everything at defaults and it's a no-op - the injection runs exactly as if you hadn't connected it.
Installing it
cd ComfyUI/custom_nodes
git clone https://github.com/liz-ils/ComfyUI-LZNodes
restart → LZNodes/Anima. ComfyUI Manager: ComfyUI-LZNodes. No extra dependencies.
The honest take
This is the "we ran out of room on the main node" node. Ninety percent of users should never touch it - the defaults are sensible and the strength/combine/fusion trio on the injection node gets you 95% of the results. The remaining 5% (layer targeting, EMA, low-rank consensus) is real but requires patience and a willingness to grid-test. Where it genuinely shines: if you've dialed in a combination that works, the Options node is how you save that recipe as a reusable config. Just don't start here - start with the combined node and one artist, then graduate.
One thing the docs don't scream loud enough: because all of this rides on model patching, every sampling run pays whatever cost your options impose (the anchor pre-run, the EMA state, the accumulation steps). Fiddly options mean slower generations. Budget accordingly.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| start_block | INT | 00–63 | Starting block (inclusive). 0 = first layer |
| end_block | INT | -1-1–63 | Ending block (inclusive). -1 = last layer |
| start_percent | FLOAT | 0.0000–1 | Sampling progress start. 0.0 = sampling start |
| end_percent | FLOAT | 1.0000–1 | Sampling progress end. 1.0 = sampling end |
| normalize_weights | BOOLEAN | true | True: weights normalized to relative proportions. False: weights used as independent strengths. If ::weight syntax is used in artist_chain, this switch is automatically disabled. |
| artist_ema_alpha | FLOAT | 0.000–0.95 | Cross-step EMA smoothing coefficient (only effective for fusion=interpolate). 0.0: off (default) 0.3-0.5: light smoothing 0.5-0.8: medium-heavy smoothing >0.8: strong smoothing Auto-reset on new sampling (sigma rising). |
| lowrank_k | INT | 11–32 | LoRA-style low-rank injection dimension (only effective for combine_mode=lowrank_avg). k=1: all artists along a single consensus direction k=2-3: retain main style directions (recommended) k>=N: equivalent to output_avg (no projection) |
| artist_static_capture | BOOLEAN | false | H' cross-step temporal averaging: first K steps accumulate artist attention, then freeze from step K onwards. |
| static_capture_k | INT | 61–12 | H' accumulation steps (only when artist_static_capture=True). K=1: v18 single-point cache K=6: recommended default |
| artist_anchor_q | BOOLEAN | false | Use fixed-seed anchor hidden state for artist cross-attn Q, fully decoupling from user seed. Pre-runs one model forward on first use (~1s overhead). |
| anchor_seeds_count | INT | 11–4 | Number of fixed seeds for anchor pre-run (only when anchor_q=True). More seeds = less systematic bias, more overhead. |
| anchor_user_blend | FLOAT | 0.000–1 | Anchor/user x blend ratio (only when anchor_q=True). Q = blend * user_x + (1-blend) * anchor_x 0.0: pure anchor; 1.0: pure user x. |
| anchor_deep_layer_threshold | INT | -1-1–64 | Only use anchor in shallow layers (only when anchor_q=True). -1: all layers use anchor (default) N>=0: layer idx < N uses anchor, idx >= N uses user x |
| layer_filteropt | STRING | Advanced layer selection (optional). Comma-separated block indices, supports ranges and negative indices. Example: '0,3,5-10,-1' Overrides start_block/end_block when set. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| advanced_options | ANIMA_OPTS | — |