Nodes/ComfyUI-Prompto/Prompto Character
ComfyUI Node

Prompto Character

One cast member, every outfit, zero retyping

By EY4O·Created 7 days ago·Updated 3 days ago· 0
Prompto Character
    • text
    • outfit
    ◄character▾►
    ◄outfit▾►
    ◄format▾►
    ◄seed0►

    Here's the unglamorous truth about character consistency: most of it is bookkeeping. The model doesn't know who your character is - it knows whatever tags you typed - and the reason the same character drifts between renders is usually that you typed slightly different tags.

    Prompto Character is a bookkeeping node. You define a cast member once, with their tags, an optional prose description, and a set of outfits, and the node spits out the right text for whichever one you pick.

    What it is

    Part of ComfyUI-Prompto, the ComfyUI side of the Prompto Chrome extension. Your cast lives in the extension - Prompto can even draft a cast card from a booru post and file it - and syncs down to ComfyUI as a read-only snapshot. The node exposes one cast member as text.

    That's the whole pitch, and it's a good one for anyone running the same two or three characters through a hundred scenes. Character consistency is a solved-ish problem at the LoRA level and a miserable one at the prompt level, because prompt-level consistency is you remembering that it was silver hair, hair ribbon, blue eyes and not silver hair, blue ribbon, blue eyes.

    How it works

    Four inputs, two outputs, and the mechanism is mostly in how carefully the outfit list is built.

    The outfit dropdown is the union of every outfit name on every character in your library, with (none) and (random) in front. That's a design choice with a consequence: you can pick an outfit that belongs to somebody else, and the author's own tooltip says what happens - "An outfit name that this character doesn't have is treated as (none)". No error, no warning, just the base tags. If a character suddenly renders in their default clothes, that's the first thing to check.

    Outfits carry their own tags and prose, and the node merges them with the character's. format picks the shape:

    • tags - comma-joined tags, character first, then outfit.
    • prose - the character's prose plus the outfit's, tidied into a sentence (capital first letter, full stop). If a cast member has no prose at all, you get their tags instead rather than an empty string.
    • tags + prose - both, separated by a blank line. On a model whose text encoder reads sentences (Anima's Qwen3, Flux's T5), that blank-line split is doing real work: it's the tag-block-then-paragraph structure people keep arriving at by hand, done for you.

    seed only exists to pick the outfit when outfit is (random). Same seed, same outfit - so (random) with a fixed seed is a stable choice, and (random) with the seed widget on randomize is a different look every queue.

    Outputs are text (wire it into your text encoder, or into a Concatenate Text if you're assembling a prompt) and outfit, the name of the outfit that was actually used - empty string when it was (none). That second output is more useful than it looks: send it to a note node and your output PNG's metadata tells you which outfit produced the image.

    Install

    cd ComfyUI/custom_nodes
    git clone https://github.com/EY4O/ComfyUI-Prompto.git
    

    Restart ComfyUI. Nothing else - no Python dependencies beyond ComfyUI, no models to download, no requirements.txt. ComfyUI Manager → search Prompto also works now that the pack is on the registry, but the clone is the route the README recommends because it can't half-install.

    The nodes are under the Prompto category. With nothing synced you get three sample cast members, so you can wire the node up and see what it does before you've built a library.

    Where people get burned

    Wildcards in a character's tags don't roll. Prompto Character emits its text as-is - {silver|black} hair sitting in a cast member's tags comes out with the braces intact. Feed that text through a Prompto Profile or Prompto Wildcards node and it gets rolled there. This is the kind of thing that looks like a bug and is really just scope: the character node's job is composition, not variation.

    The dropdown is a snapshot. Options are built when ComfyUI loads node definitions, so anything you add in Chrome needs an R in the ComfyUI tab before it shows up. If the node was already on the canvas with an old name selected, it keeps working - Prompto remembers earlier labels and resolves them - but the label in the widget won't refresh until you press R.

    Nothing here is a LoRA. You're improving consistency by not retyping tags, which is cheap and gets you maybe most of the way for an established booru-style character. For an original character you'll want the cast member's LoRA applied too, which is what Prompto LoRAs is for.

    CategoryPrompto

    Inputs (4)

    NameTypeDefaultDescription
    characterCOMBO3 options: Rin Aozora, Captain Vale, Hatsune Miku
    outfitCOMBOAn outfit name that this character doesn't have is treated as (none)
    formatCOMBO3 options: tags, prose, tags + prose
    seedINT00–4294967295Picks the outfit when outfit is (random)

    Outputs (2)

    NameTypeDescription
    textSTRING—
    outfitSTRING—