Nodes/Anima-Artist-Mixer/Anima Artist Adapter Mixer (Experimental)
ComfyUI Node

Anima Artist Adapter Mixer (Experimental)

Anima's LLM Encoder Blends Artist Tags Badly — This Node Mixes Them in Embedding Space, ~2x Faster

By An1X3R·Created 3 months ago·Updated 8 days ago· 119
Anima Artist Adapter Mixer (Experimental)
  • model
  • artist_pack
  • advanced_options
  • model
  • base_prompt
strength1.00
normalize_weightstrue
alignment_modebase_anchored
enabledtrue
apply_to_uncondfalse
uncond_strength0.00

Here's the problem this node exists for, in one sentence: Anima's text encoder is an LLM (Qwen3-0.6B), and when you drop wlop, sakimichan into one prompt it contextualizes them together - the styles blur, one eats the other, or the mix is just unpredictable. On SDXL anime models artist tags blend the way you'd expect; on Anima they interfere, because the encoder reads the prompt as a sentence, not a list.

The parent pack's older answer, Anima Artist Cross-Attn, encodes each artist separately against the base prompt and mixes the outputs inside every patched cross-attention layer. It works, but it's slow - the more artists you add, the slower it gets. Anima Artist Adapter Mixer (Experimental) is the alternative that does the mixing once, in the LLMAdapter embedding space, instead of patching per-layer attention - and the author measured close to double the generation throughput while keeping visual quality close. "Experimental" is an honest label: if the Cross-Attn node has you waiting, this is the path to test.

How it works

Feed it the artist_pack from Anima Artist Pack (Split + Encode) and it computes a per-token mix:

mixed = base + strength * perpendicular(sum(weight_i * artist_i) - base, base)

Read that as: average your artists, subtract the base to get the "artist delta", keep only the part perpendicular to the base, and add it back at strength. The perpendicular projection is what stops the base prompt's structure from being dragged along with the style. strength=1.0 is a normal mix; past 1.2 you're extrapolating style at the cost of structure.

The clever part is alignment_mode=base_anchored (the default). Each artist was encoded with its own full prompt, so their embedding rows don't line up. After the Adapter the node finds the base prompt's T5 token sequence inside each artist sequence, anchors matching rows, and slots unmatched artist rows into gap positions (exact suffix match, LCS fallback for tokenizer drift). Nothing gets pooled, truncated, or overwritten. shared_base_ids is the older A/B mode that hands every artist the same T5 target grid - simpler to reason about, but it replaces each artist's original target sequence and keeps less information.

The inputs you'll actually touch

  • model - your Anima checkpoint. The node checks for Anima's preprocess_text_embeds adapter interface and rejects anything else.
  • artist_pack - from Anima Artist Pack (Split + Encode). All the encoding happens there; this node does no prompting itself.
  • strength - default 1.0. 0 is pure base.
  • normalize_weights - keep on, so 1::wlop, 2::sakimichan is a 1:2 ratio, not 3x amplification.
  • alignment_mode - base_anchored is the default and what you want.
  • apply_to_uncond / uncond_strength - leave off. In base_anchored mode uncond is always preserved anyway; the wrapper never sees the negative prompt's T5 IDs to align against.

Optionally wire Anima Artist Options (Advanced) into advanced_options. That's where the Q-only anchor lives: enable artist_anchor_q, leave anchor_seed_list empty and anchor_seeds_count generates fresh style-reference seeds every run, or pin seeds like 42,12345 for repeatable cross-seed stabilization. warm_cache and adaptive_q reuse cached Q keyframes across sampler seeds - faster later runs, but the CPU cache can eat several GiB at 1024-class resolutions with the default 8 keyframes, so keep anchor_cache_points modest.

The node outputs model (to KSampler) and base_prompt (to KSampler positive). That's the whole workflow:

Anima Artist Pack -> Anima Artist Adapter Mixer -> KSampler model
                                  |
                                  +-> base_prompt -> KSampler positive

Two hard rules: use Anima's own CLIP/text loader (the same one its normal workflow uses), and never chain this with Anima Artist Cross-Attn - they're alternative algorithms, and chaining injects the artists twice. There's also an enabled toggle for A/B testing the patch.

Install

Via ComfyUI Manager (search "Anima Artist Mixer") or:

cd ComfyUI/custom_nodes
git clone https://github.com/An1X3R/Anima-Artist-Mixer

then restart ComfyUI. That's the whole install - zero Python dependencies, no model files to fetch; just an Anima checkpoint and its usual loader. It's inference-only.

Troubleshooting

The 26.8.3 release fixed a black-image/noise failure seen on RTX 50-series cards combined with dynamic VRAM/offload, interrupted sampling, and LoRA changes - if that sequence gives you blank frames, update the pack and re-run. Otherwise, expect the "Experimental" tax: warm_cache makes the first complete run slower, and first-run cost grows with how many anchor seeds you average. And keep expectations honest: Anima's encoder and adapter are highly non-linear, so no mixing path here is lossless like an SDXL artist chain. This node makes the tradeoff controllable and, on speed, substantially cheaper - that's the whole argument for it.

CategoryAnima/Adapter

Inputs (9)

NameTypeDefaultDescription
modelMODEL
artist_packANIMA_PACK
strengthFLOAT1.000–4Strength of the perpendicular artist delta in post-adapter embedding space.
normalize_weightsBOOLEANtrueNormalize ::weights to relative artist ratios.
alignment_modeCOMBObase_anchoredbase_anchored keeps every artist's own Adapter input and aligns post-Adapter rows by T5 token IDs. shared_base_ids is the older common-target-grid mode.
enabledBOOLEANtrue
apply_to_uncondBOOLEANfalseExperimental uncond mixing for shared_base_ids. base_anchored always preserves uncond because negative T5 IDs are unavailable for token alignment.
uncond_strengthFLOAT0.000–1
advanced_optionsoptANIMA_OPTS

Outputs (2)

NameTypeDescription
modelMODEL
base_promptCONDITIONING