Anima Artist Options (Expert)
Stabilizers, VRAM controls, and norm locks for Anima mixing
- advanced_options
This is the basement. AnimaArtistOptions (Expert) is where the pack's real machinery lives: cross-seed style stabilizers, norm locking, VRAM limits, and the A/B switches the presets deliberately keep off by default. If AnimaArtistPreset is "pick a mode", this node is "build a mode from parts". Most people should not be here - the README's own advice is that SimpleOptions handles the common tweaks and this panel is for stabilizer A/B and debugging. But if your mixes keep flip-flopping between dominant artists across seeds, this is where the fix is.
The layout basics
start_block/end_block and start_percent/end_percent bound where (DiT blocks) and when (sampling progress) the patch applies. normalize_weights toggles relative-vs-absolute weights. layer_filter overrides the block range with a list like 0,3,5-10,-1.
The stabilizers, light to heavy
match_base_norm(+norm_lock_modetoken/row,norm_lock_scopeper_artist/mixed/both) - rescales the mixed artist attention output to the base's RMS energy. Stops one seed-specific artist spike from dominating. The "v26 norm-lock" path.artist_ema_alpha(0–0.95) - temporal EMA smoothing across sampling steps. 0.3–0.5 is light; past 0.8 style starts lagging content.lowrank_k- only matters withcombine_mode=lowrank_avg. k=1 gives one consensus direction (most stable, most homogeneous); k≥N equals plain output_avg.artist_static_capture+static_capture_k(default 6) +static_capture_mode- freezes artist attention after K warmup steps. Also a 30–50% speedup. Incompatible with concat_with_base (auto-ignored) and with EMA.artist_anchor_q+anchor_seeds_count+anchor_user_blend+anchor_deep_layer_threshold+anchor_refresh_each_step- the heaviest stabilizer: artist attention uses a fixed-seed anchor hidden state as Q, decoupling style from your seed. Costs one extra forward on first generation, then caches. Mutually exclusive with static_capture (anchor wins).stabilizer_end_percent- lets EMA/static/anchor stop early in sampling; try 0.4–0.6 when late-step samplers need dynamic motion.
VRAM and safety
max_batch_artists caps how many artists run per batched forward (0 = auto, adapting to free VRAM on GPU). low_vram_cache pushes the static/anchor caches into system RAM. compatibility_mode forces the tolerant concat path for regional-prompt setups. The experimental artist_q_reuse (reuse Q across artists) is off by default for a reason - it shifts same-seed renders and bypasses TeaCache-style patches.
Outputs
One output: advanced_options (ANIMA_OPTS) → AnimaArtistPresetApply.advanced_options or AnimaArtistCrossAttn.advanced_options.
Install
Manager → search "Anima Artist Mixer Forge", or:
cd ComfyUI/custom_nodes
git clone https://github.com/peter119lee/Anima-Artist-Mixer-Forge
then restart. No extra deps; Anima files + Anima-compatible CLIP loader required. Don't run alongside the original Anima-Artist-Mixer.
My take
If I had to pick two things to try first here, it's match_base_norm with token/per_artist locking for seed-to-seed drift, then artist_ema_alpha around 0.4. artist_anchor_q is a sledgehammer - it stabilizes style hard but strokes can stop tracking the current image; that's what anchor_user_blend is for. And note the honest signal in the README: artist_static_capture used to be a default and got pulled back because multi-artist evidence showed it over-constrains style. When the authors demote their own stabilizer, listen.
Inputs (30)
| Name | Type | Default | Description |
|---|---|---|---|
| start_block | INT | 00–63 | First patched block (inclusive). 0 = first layer. |
| end_block | INT | -1-1–63 | Last patched block (inclusive). -1 = last layer. |
| start_percent | FLOAT | 0.0000–1 | Sampling-progress start. 0.0 = beginning. |
| end_percent | FLOAT | 1.0000–1 | Sampling-progress end. 1.0 = end of sampling. |
| normalize_weights | BOOLEAN | true | True: weights become relative proportions. False: weights act as independent strengths. If the artist_chain uses ::weight syntax, this switch is bypassed at runtime (explicit weights stay absolute). |
| artist_ema_alpha | FLOAT | 0.000–0.95 | Cross-step EMA smoothing (fusion interpolate/base_preserve). Smooths each layer's artist_total across steps to reduce cross-seed dominant-artist flips. 0.0: off (default) 0.3-0.5: light smoothing 0.5-0.8: medium-heavy >0.8: strong; style may lag behind base content A new sampling run (sigma jump) resets the cache. |
| lowrank_k | INT | 11–32 | LoRA-style low-rank dimension (combine_mode=lowrank_avg only). Projects N artist deltas onto the top-k principal directions. k=1: single consensus direction, most stable, most homogeneous k=2-3: keeps main directions, allows some per-artist variety k>=N: equivalent to output_avg (no projection) Falls back to output_avg automatically when N=1. |
| artist_static_capture | BOOLEAN | false | H' temporal average: accumulate artist attention over the first K steps, then freeze and reuse the average (also a 30-50% speedup). K set by static_capture_k. Compatible: output_avg / lowrank_avg + interpolate / base_preserve. Incompatible: fusion=concat_with_base (ignored automatically). Mutually exclusive with EMA (EMA is ignored when on). |
| static_capture_k | INT | 61–12 | Steps accumulated before freezing (artist_static_capture only). K=1: single-point cache (fastest, most cross-seed drift) K=6: recommended default K=8-12: stronger drift suppression, more warmup cost If total steps < K it keeps averaging without freezing. |
| static_capture_mode | COMBO | output | What static_capture freezes. output: freeze the full artist attention output (legacy, strongest lock) delta: freeze artist-base delta and add it to the current base output (less content smearing, weaker lock) blend: interpolate output and delta paths using static_capture_blend_alpha blend_perp: like blend, but only reintroduces base motion perpendicular to the frozen style delta. Advanced A/B mode; not the stable_seed default. |
| static_capture_blend_alpha | FLOAT | 0.250–1 | Used by static_capture mode blend / blend_perp. 0 = legacy output freeze, 1 = maximum base-motion return. Lower values keep the style lock stronger; higher values protect content motion but can reintroduce drift. |
| artist_anchor_q | BOOLEAN | false | Anchor-Q: artist cross-attention uses a fixed-seed anchor hidden state as Q, decoupling style mixing from the user seed. The strongest built-in stabilizer, but not a full seed lock. Cost: one extra full forward on the first generation; same prompt across seeds then hits the cache for free. Mutually exclusive with static_capture (anchor wins). Incompatible with fusion=concat_with_base. Risk: stroke placement may track the current image less closely; raise anchor_user_blend if that bothers you. |
| anchor_seeds_count | INT | 11–4 | Number of fixed seeds for the anchor pre-run (anchor_q only). 1: single seed 2-4: average several anchors to reduce single-seed bias. Pre-run time scales with the count; cached afterwards. |
| anchor_user_blend | FLOAT | 0.000–1 | Anchor / user-x blend (anchor_q only). Q = blend * user_x + (1-blend) * anchor_x 0.0: pure anchor (most stable across seeds) 0.3-0.5: balanced stability vs stroke fit 1.0: pure user x (equivalent to anchor_q off) |
| anchor_deep_layer_threshold | INT | -1-1–64 | Use the anchor only in shallow layers (anchor_q only). -1: every layer uses the anchor N>=0: layers < N use the anchor, layers >= N use user x. Shallow layers set style direction; deep layers fit strokes. Example: 28-block model with N=14 anchors the first half. |
| anchor_refresh_each_step | BOOLEAN | false | Refresh the fixed-seed anchor at every sampling step instead of only the first step. This gives the anchor a timestep-matched Q reference and can reduce drift further, but costs extra forwards every step. Advanced A/B option. |
| stabilizer_end_percent | FLOAT | 1.000–1 | Sampling progress where cache-based stabilizers stop. Applies to EMA, static_capture, and anchor_q. 1.0: stabilizers run for the whole sampling pass. 0.4-0.6: useful when late-step samplers need dynamic step-to-step motion. |
| layer_filteropt | STRING | Advanced layer selection. Comma-separated block indices, ranges and negative indices supported. Example: '0,3,5-10,-1'. Overrides start_block/end_block. Empty = inactive. | |
| compatibility_modeopt | BOOLEAN | false | Compatibility-safe mode. Forces concat + concat_with_base and disables EMA / static_capture / anchor_q to minimize conflicts with regional prompting, Forge Couple-style routing, and other attention patch nodes. |
| max_batch_artistsopt | INT | 00–32 | Cap on how many artists run in one batched forward. 0 = automatic: on GPU the chunk size adapts to free VRAM (v27.5); elsewhere no cap. Set 2-8 to force a fixed cap with many artists at high resolution. |
| artist_q_reuseopt | BOOLEAN | false | Experimental speed-up: project attention Q once per step and reuse it for every artist K/V (numerically validated on first use). OFF by default: the fp16 kernel difference shifts same-seed renders (~17% of pixels in live A/B) and it bypasses TeaCache-style attention patches. |
| low_vram_cacheopt | BOOLEAN | false | Store static-capture and anchor caches in system RAM instead of VRAM. Saves hundreds of MB at high resolution for a small per-step transfer cost. |
| match_base_normopt | BOOLEAN | false | Rescale the mixed artist attention output to the base output's RMS energy (clamped to 0.5-2.0x). Keeps the style direction but stops activation-energy mismatch from compounding across layers. Enable this explicitly when you want v26 norm-lock stabilization. |
| anchor_base_norm_refopt | BOOLEAN | false | When anchor_q and match_base_norm are both enabled, match artist RMS against the fixed-seed anchor base output instead of the current seed's base output. This reduces cross-seed style-strength drift more than standard match_base_norm, but may make strokes follow the anchor reference more. |
| norm_lock_modeopt | COMBO | token | Granularity for match_base_norm. token: match each image token's RMS to base (strongest local style-strength stability) row: legacy whole-row RMS matching |
| norm_lock_scopeopt | COMBO | per_artist | Where to apply norm locking. per_artist: normalize each artist output before mixing, so one seed-specific artist spike cannot dominate mixed: normalize only the final mixed output (legacy) both: strongest clamp, highest chance of over-uniform style |
| contribution_balanceopt | BOOLEAN | false | Balance each artist's measured delta against the base before mixing. Optional guard for seed-specific artist dominance flips. |
| contribution_balance_alphaopt | FLOAT | 1.000–1 | Strength of contribution_balance. 0 = off, 1 = full per-token delta balancing. |
| mixed_delta_capopt | BOOLEAN | false | Inference-time guard for style drift. Limits the final mixed artist delta relative to the base attention energy before fusion. Default off for A/B testing. |
| mixed_delta_cap_ratioopt | FLOAT | 1.000–4 | Maximum final artist-delta RMS as a multiple of base RMS. Lower values preserve composition more; higher values allow stronger style changes. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| advanced_options | ANIMA_OPTS | — |