Anima EasyEdit Delta (caption diff)
Edit an Anima image by editing its caption
- instruction
- additions
- removals
The whole trick of Anima's EasyEdit is that you never write a full prompt. You write the difference, and this node is the difference-finder. Drop in the reference image's caption and the caption you wish it had, and it hands you the tiny tag-delta instruction the subject_edit EasyControl adapter was trained on. It's a CPU-only string helper from the sorryhyun EasyControl KSampler pack - no GPU, no model loading, just careful string surgery - and once you've tried hand-writing an EasyEdit instruction, you'll understand why it exists. The format is easy to get subtly wrong, and the character's name is exactly the tag you must leave out.
For context: EasyEdit is the instruction-editing mode of EasyControl, the reference-image adapter for Anima - Circlestone Labs' 2B anime DiT built on NVIDIA's Cosmos-Predict2 instead of SDXL. The flagship EasyControl use is colorizing a lineart page; the subject_edit checkpoint re-renders a character with your requested changes in a single generation, no inversion pass. The prompt is a tag delta: bare additions first, then removals prefixed with -. Identity is supposed to come from the reference image, not the text - naming the character in the prompt is the failure mode the training objective was designed to starve.
How it works
The node does a set difference on two caption strings. source_caption is the reference image's caption, target_caption is your edited copy. It splits both into ordered, de-duplicated tag lists, then: tags only in the target become additions, tags only in the source become removals, and shared tags cancel. That cancellation is the feature, not a quirk - everything you left alone, including the character's name, drops out of the instruction automatically. You literally cannot accidentally leave identity in the prompt.
It's not a loose approximation of the training data, either. The implementation mirrors the pair miner (subject_edit_pairs.py::delta_caption) that generated the adapter's training prompts, and there's a test pinning the equivalence - so the output is shaped exactly like what the adapter saw. Both inputs accept comma- or newline-separated tags.
The inputs and outputs that matter
source_caption- the reference's caption. Wire the Anima Tagger node'sSTRINGoutput straight in, or paste tags yourself.target_caption- the caption you want, normally a copy ofsource_captionwith tags edited, added, or deleted.include_removals(optional, default on) - emit source-only tags as-tagremovals. Turn it off for additions-only output, which is weaker but safer when your two captions differ in ways you didn't intend.underscores_to_spaces(optional, default on) - convertsblue_eyes→blue eyes, Anima's vocabulary. Short emoticons like^_^are left alone.
Three outputs: instruction (the delta string - feed it into your positive text encode), plus additions and removals on their own. Those two extras are the quickest way to see why an edit did something you didn't ask for.
Installing it
Same install as the whole pack - ComfyUI Manager (search "Easycontrol KSampler Compatible"), or:
cd ComfyUI/custom_nodes
git clone https://github.com/sorryhyun/ComfyUI-EasyControl-KSamplerCompat
Then restart ComfyUI. For EasyEdit you also need the checkpoint anima_subject_edit_alpha.safetensors from sorryhyun/anima-easycontrol-adapters, dropped into ComfyUI/models/loras/. The pack itself has zero Python dependencies - no requirements.txt beyond the built-in ComfyUI modules. There's a ready-made workflows/easyedit.json you can drag straight into ComfyUI.
Where people get burned
- Object removals mostly fail.
-ramuneon a character holding a ramune bottle largely survives the instruction, because the text encoder reads-ramuneas plain "ramune" and a weak adapter response leaves an attractor, not a removal. Phrase the change as an addition where you can ("jacket partially removed" beats-jacket). - Check the
additions/removalsoutputs, not the settings. There's deliberately no gate knob; if an edit isn't landing, change the instruction. - No quality tags (
masterpiece,best quality) in the instruction - training saw deltas only, anything else is off-convention. Rating tags do count as ordinary tags, sonsfw, -safemoves the rating - keep that in mind when you composetarget_caption. - Remember this node only builds a string. Wire that
instructioninto the KSampler's positive and the reference image into the Anima EasyControl (KSampler) node'simagesocket, or you'll be editing nothing.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| source_caption | STRING | The REFERENCE image's caption. Wire the Anima Tagger's STRING output here, or paste the tags yourself. | |
| target_caption | STRING | The caption you WANT — normally a copy of source_caption with tags edited, added, or deleted. The node emits only the difference, so everything you left alone (including the character name) drops out of the prompt. | |
| include_removalsopt | BOOLEAN | true | Emit source-only tags as '-tag' removals. Off = additions only, which is a weaker but safer instruction when the two captions differ in ways you did not intend to change. |
| underscores_to_spacesopt | BOOLEAN | true | Convert underscored tags to the space-separated form Anima's vocabulary uses (blue_eyes -> blue eyes). Short emoticon tags (^_^, x_x) are left alone. Turn off if you are pasting tags that are already normalized. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| instruction | STRING | — |
| additions | STRING | — |
| removals | STRING | — |