Nodes/Easycontrol KSampler Compatible/Anima EasyControl (KSampler)
ComfyUI Node

Anima EasyControl (KSampler)

Anima has no ControlNet — this node is the reference-image workaround that still uses a stock KSampler

By sorryhyun·Created 3 months ago·Updated 6 days ago· 3
Anima EasyControl (KSampler)
  • model
  • vae
  • image
  • mask
  • model
  • latent
base_modelanima
easycontrol_lora
strength1.00
target_megapixels1.0
cond_scale_override0.00

You're on Anima, the anime DiT that finally beat Illustrious at prompt comprehension - and you just found out its one big gap: there's no real ControlNet. So when you want to colorize a manga page or regenerate a hole in a drawing, you're stuck. Except there's a second path most people don't know about: reference-image conditioning that rides on the model itself instead of a control network. That's what Anima EasyControl (KSampler) is.

EasyControl is a real published method (ByteDance, 2025), and it's a much lighter idea than ControlNet: instead of a whole copied network, you train a per-block LoRA on the frozen DiT's self-attention plus a scalar gate, and the reference image gets attended over directly. This pack is an Anima reimplementation, and its whole trick is in the name: KSampler Compatible. The upstream Flux/Qwen EasyControl nodes make you load through a dedicated loader and sample with a dedicated sampler node. This one doesn't. Drop MODEL + VAE + IMAGE in, get a MODEL plus an empty LATENT out, and wire both into the stock KSampler you already use.

The flagship use is colorization. Feed a grayscale or lineart page into image, write a normal prompt ("pink hair, blue eyes, white dress"), and the DiT fills in color while keeping the page's structure. That's the spatial-alignment job a ControlNet would normally own, done through the attention stream instead.

How it works

On apply, the reference image is VAE-encoded and mapped into the DiT's input space. On the first sampling step, the node walks the cond stream once through every block to build a per-block (cond_k, cond_v) cache - deterministic, with the cond t-embedding fixed at t=0 - then reuses it for every step and both CFG branches. Each block's forward is swapped via reversible object-patch for one that runs extended self-attention over [target tokens ; cond tokens], with the trained b_cond bias on the cond columns. Cheap, and it composes with your schedulers, ControlNet, and other LoRAs because it's just a ModelPatcher patch.

There's a subtle reason the returned LATENT matters: it's sized to the conditioning grid (aspect-preserved, ~1MP, VAE-snapped), so the KSampler generates at exactly the resolution the cond stream was encoded at. That's why the color lands on the right pixels. It also reimplements anima_lora's inference path against ComfyUI's native Anima/Cosmos backbone - no vendored code, no Python deps at all (pyproject.toml has an empty dependencies list).

The inputs that matter

You'll touch maybe four of them:

  • image - the grayscale page or lineart. Resized to at most target_megapixels, never upscaled if already under it.
  • easycontrol_lora - the checkpoint, a .safetensors trained with networks.methods.easycontrol (e.g. the colorize adapter). Lives in models/loras/.
  • strength - 1.0 is as trained. Raise to push harder toward the reference, lower to loosen.
  • mask (optional) - for the inpaint adapter. Wire the original image into image and the mask here; the white region gets filled with mid-gray and encoded as the cond, reproducing exactly what the inpaint adapter trained on. Leave it unconnected for colorize.

Outputs are two: model → KSampler's model, and latent → KSampler's latent_image. That's the whole wiring - no manual EmptyLatentImage sizing.

Installing it

Manager has it (search "Easycontrol KSampler Compatible"), or:

cd ComfyUI/custom_nodes
git clone https://github.com/sorryhyun/ComfyUI-EasyControl-KSamplerCompat

Then drop your EasyControl checkpoint into ComfyUI/models/loras/ and restart ComfyUI. No pip install - the only real dependency is the adapter checkpoint itself.

Gotchas

The loader is strict: if a checkpoint carries tensors the node doesn't implement, it errors out rather than silently dropping them (a dropped trained feature degrades output with no warning). Hit that, update the node. If you also use an Anima block-compile node, apply this one after it in the chain. And if you feed a batch to IMAGE, only the first image is used.

One honest caveat: this is a niche, fresh pack with no community track record yet, and the original EasyControl method's known weak spot is identity/face transfer. Colorization isn't that - it's structure plus color, which is exactly where the method shines. For a beginner who just wants their lineart colored, this is the Anima path that doesn't make you wait for ControlNet.

Categoryloaders

Inputs (9)

NameTypeDefaultDescription
modelMODEL
vaeVAE
imageIMAGE
base_modelCOMBOanimaBase model family this node supports. Currently Anima only — the EasyControl reimplementation targets the Anima/Cosmos DiT backbone. More families may be added later.
easycontrol_loraCOMBOEasyControl checkpoint (networks.methods.easycontrol — per-block cond LoRA + b_cond gate). Lives in ComfyUI/models/loras/.
strengthFLOAT1.000–3Conditioning strength. Scales the cond-LoRA deltas (multiplies the trained cond_scale). 1.0 = as trained; raise to push harder toward the reference, lower to loosen.
maskoptMASKOptional inpaint mask. White (selected) region is the hole to regenerate: the node fills it with mid-gray and encodes that as the conditioning image, matching the `inpaint` adapter's training (cond = original image with a gray hole). Wire the ORIGINAL image into the IMAGE socket and the mask here. Leave unconnected for adapters that take a pre-built cond image (e.g. colorize).
target_megapixelsoptFLOAT1.00–4Output size, in megapixels, for the returned LATENT (and the conditioning encode). The image is resized aspect-preserving to ~this many MP and snapped to the VAE/patch grid; the cond stream is encoded at the same resolution so it shares the target's grid (best spatial alignment for colorize). 1.0 keeps generation on the ~1MP distribution Anima was trained at. 0 = keep the input's native resolution.
cond_scale_overrideoptFLOAT0.000–4If > 0, replaces the checkpoint's trained cond_scale (before strength). 0 = use the trained value.

Outputs (2)

NameTypeDescription
modelMODEL
latentLATENT