Nodes/SDXL Auto Prompter/APNext H3 Characters
ComfyUI Node

APNext H3 Characters

Pick a cast from a list, don't describe one from scratch

By dagthomas·Created 3 years ago·Updated 11 days ago· 290
APNext H3 Characters
  • image
  • character
  • actor
  • franchise
  • file_path
  • cast
  • wardrobe
  • image
characterCaitlyn — Katie Leung (Arcane)
franchise_filter(all)
seed0
custom_character
wardrobe
cast_in

The name undersells it. APNext H3 Characters looks like a dropdown, but it's the difference between "write me a crossover with these two" and "write me a crossover with Caitlyn from Arcane, played by Katie Leung." It's the cast-sheet node for the pack's MiniMax-H3 writers: instead of describing a character in words and hoping the model keeps her consistent, you hand the writer a pre-built cast line that pins character, actor and franchise together.

The pack ships a lookup table at data/h3/characters.tsv - over 340 entries, each mapping a character name to its real actor and the show they're from (Caitlyn, Jinx, Vi, Silco from Arcane; Black Widow, Thor, Bruce Banner from the Avengers films; plus 150+ franchises). This node is the front door to that table, and it does exactly what the character-consistency problem needs: it gets the identity right before a single word is written, so the writer never has to reinvent a face. Community consensus on this has been brutal - you can't prompt your way to the same character twice, so you stop generating and start referencing. A lookup node is the cheap, reliable version of that.

The inputs that matter

Most of the surface is one dropdown: character gives you every unique Character - Actor (Franchise) entry, plus 🎲 random (a seeded random pick, optionally narrowed by franchise_filter) and ✏️ custom, which turns the job over to custom_character - type Lena: a middle-aged woman with a limp and a silver bob and the writers will treat Lena as her name everywhere, including in the {characterN} template variables. The seed input keeps the random draw stable across queues, which matters more than it sounds when you're rendering a batch.

The two optional sockets are where it gets clever. wardrobe is a character-level wardrobe lock (3–5 exact anchors, like dark-brown corduroy jacket, forest-green cotton T-shirt, small silver ring in the LEFT nostril). It rides along inside the cast line and the Crossover / Music Video writers merge it into their lock and copy it word-for-word into every shot - the outfit lives with the character, not the writer. cast_in takes the cast output of an upstream Characters node and appends this node's line after it, so several nodes chain into one cast list: A → cast_in of B → B's cast → the writer's cast_1.

Outputs and wiring

You get the pieces separately - character, actor, franchise - plus file_path (the relative path of the rendered reference clip for that character) and the ready-made cast line in the Character (played by Actor) from Show form the H3 writers expect. Wire cast into the Crossover Writer's cast_1..4 or the Music Video Writer's cast_1, or into any context_N socket if you want the {character1} variables to resolve in your text boxes. wardrobe passes through as its own output too.

Installing

This pack is dagthomas/comfyui_dagthomas ("SDXL Auto Prompter"). In ComfyUI Manager search for comfyui_dagthomas, or:

cd ComfyUI/custom_nodes
git clone https://github.com/dagthomas/comfyui_dagthomas
cd comfyui_dagthomas
pip install -r requirements.txt

Then restart ComfyUI. The H3 nodes live under APNext → H3. No API key or model download is needed just to use this node - it's a pure lookup.

Gotchas

Want to add or remove characters? Edit the TSV directly, one file path / character / actor / franchise per line; duplicate character-actor-franchise triples are collapsed automatically. Two small traps: a wardrobe line typed into the writer's own wardrobe box wins over the one that travels with the character for the same name, and {characterN} numbering follows socket order (cast sockets first, then context), so chain characters in the order you want them numbered. If a cast line shows up in subject_definitions with a | wardrobe: … suffix, that's the lock doing its job - leave it alone.

Categorycomfyui_dagthomas/H3

Inputs (7)

NameTypeDefaultDescription
characterCOMBOCaitlyn — Katie Leung (Arcane)Pick a character, 🎲 random (seeded), or ✏️ custom to describe your own in custom_character.
franchise_filterCOMBO(all)Only used when character is random: limits the draw to one show. Picking a named character snaps this to their show, so switching to random afterwards draws a castmate.
seedINT00–18446744073709550000
custom_characteroptSTRINGYour own character, used when character = ✏️ custom (or whenever this is filled in). `Lena: a middle-aged woman with a limp and a silver bob` keeps `Lena` as the name the writers and {characterN} use; `Name (played by Actor) from Show` also works.
wardrobeoptSTRINGThis character's wardrobe lock: 3-5 exact anchors, comma separated (`dark-brown corduroy jacket, forest-green cotton T-shirt, khaki chinos, small silver ring in the LEFT nostril`). Travels with the cast line into the Crossover / Music Video writers, which copy it word-for-word into every shot. Empty = the writer designs a scene-fitting outfit itself (matched to the concept's genre, era and setting) and locks it.
cast_inoptSTRINGCast lines from an upstream H3 Characters node. This node's cast line is appended, so several can be chained into one cast list.
imageoptIMAGEThis character's reference picture (their face photo). Passed through unchanged on the `image` output, so the character and their picture travel together: wire `cast` to a writer's cast_N and `image` to the matching image_N.

Outputs (7)

NameTypeDescription
characterSTRING
actorSTRING
franchiseSTRING
file_pathSTRING
castSTRING
wardrobeSTRING
imageIMAGE