APNext H3 Characters
Pick a cast from a list, don't describe one from scratch
- character
- actor
- franchise
- file_path
- cast
- wardrobe
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.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| character | COMBO | Caitlyn — Katie Leung (Arcane) | Pick a character, 🎲 random (seeded), or ✏️ custom to describe your own in custom_character. |
| franchise_filter | COMBO | (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. |
| seed | INT | 00–18446744073709550000 | — |
| custom_characteropt | STRING | Your 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. | |
| wardrobeopt | STRING | This 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 invents one. | |
| cast_inopt | STRING | Cast lines from an upstream H3 Characters node. This node's cast line is appended, so several can be chained into one cast list. |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| character | STRING | — |
| actor | STRING | — |
| franchise | STRING | — |
| file_path | STRING | — |
| cast | STRING | — |
| wardrobe | STRING | — |