Nodes/Easycontrol KSampler Compatible/Anima EasyEdit Delta (caption diff)
ComfyUI Node

Anima EasyEdit Delta (caption diff)

Edit an Anima image by editing its caption

By sorryhyun·Created 3 months ago·Updated 5 days ago· 3
Anima EasyEdit Delta (caption diff)
    • instruction
    • additions
    • removals
    source_caption
    target_caption
    include_removalstrue
    underscores_to_spacestrue

    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's STRING output straight in, or paste tags yourself.
    • target_caption - the caption you want, normally a copy of source_caption with tags edited, added, or deleted.
    • include_removals (optional, default on) - emit source-only tags as -tag removals. 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) - converts blue_eyesblue 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. -ramune on a character holding a ramune bottle largely survives the instruction, because the text encoder reads -ramune as 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/removals outputs, 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, so nsfw, -safe moves the rating - keep that in mind when you compose target_caption.
    • Remember this node only builds a string. Wire that instruction into the KSampler's positive and the reference image into the Anima EasyControl (KSampler) node's image socket, or you'll be editing nothing.
    Categoryutils

    Inputs (4)

    NameTypeDefaultDescription
    source_captionSTRINGThe REFERENCE image's caption. Wire the Anima Tagger's STRING output here, or paste the tags yourself.
    target_captionSTRINGThe 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_removalsoptBOOLEANtrueEmit 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_spacesoptBOOLEANtrueConvert 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)

    NameTypeDescription
    instructionSTRING
    additionsSTRING
    removalsSTRING