Character Prompt Manager
Same Character, Ten Variations, One Queue Run
- text
- seed
You've dialed in a character you like - hair, eyes, outfit - and now you want to see them in a dozen situations: night scene, rain, a different framing. Normally that means retyping the full prompt twelve times, or babysitting the queue and hand-editing between runs. Character Prompt Manager is the node that collapses that into one queue run. It takes a fixed prompt skeleton, slaps a list of variations onto it, and emits one complete prompt per variation - plus a matching seed for each.
The name oversells it a little. There's no management happening, no state, no API call. It's a text template joiner with a seed generator bolted on, and that's exactly the right scope for a batch-variation node.
How it works
Three of the inputs are constants. base holds your quality tags, style and shot type; character is the character description; others is background, lighting, atmosphere. The fourth input, variations, is a list. For every item in that list the node builds one prompt:
{base},
{character},
{variation},
{others}
Then it pairs each prompt with a seed: with randomize_seed on, a fresh random integer per variation; with it off, your manual_seed repeated for the whole batch.
The sneaky part is hidden in the code: when randomize_seed is on, the node's IS_CHANGED always returns a random value, so ComfyUI re-executes it every run and draws new seeds. That's why one queue run gives you new results instead of ComfyUI caching the node's output and replaying the same seeds. Flip randomize_seed off and the node reports "unchanged" - which is exactly what you want when you're trying to reproduce a specific image.
The inputs and outputs that matter
The three multiline boxes are what you'll actually type into - and the pack's front-end makes them tall and labels them Base / Character / Others so you stop confusing them. variations gets wired from the Variation Buffer. The outputs do what the README says: text → CLIP Text Encode (positive prompt), seed → the seed input on your KSampler.
Where people get burned:
- The varying part goes in
variations, notcharacter. The character box is constant across the whole batch. If the outfit or pose should differ between images, that lives inside each variation string - think "fixed identity + a list of what changes." - Empty variations mean nothing renders. Feed the node an empty or blank list and it returns empty lists; downstream silently produces nothing. No error, you'll just wonder why the queue finished instantly.
- Seeds only match variations if the wiring is right. Randomize on = every execution draws new seeds, which is what you want for exploration. Found a keeper? Turn it off and set
manual_seed, and the whole batch becomes reproducible. - Blank or whitespace-only variation lines are stripped, so sloppy pastes don't break the batch.
Installing
ComfyUI Manager → search ComfyUI-CharacterPromptBuffer, or:
cd ComfyUI/custom_nodes
git clone https://github.com/Kyreo/ComfyUI-CharacterPromptBuffer
Restart, and both nodes of the pack show up under conditioning → Character Prompt Manager. There are no dependencies and no model downloads - this is pure Python text juggling, so it can't break your environment.
What it doesn't do
Be clear-eyed about this: it won't keep your character consistent on its own. Same prompt skeleton, different seeds and variations still means the model re-invents the face every time - that's the whole character-consistency problem, and a text node isn't a solution to it. What it does do is make the "same person, ten scenes" exploration cheap, so you can throw a stack of variations at a character LoRA or a reference workflow and cherry-pick the winners. For a zero-dependency utility, that's a fair deal.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| base | STRING | masterpiece, best quality, vibe light | — |
| character | STRING | old man sitting on a couch, grey hair, casual clothes | — |
| others | STRING | simple background | — |
| variations | STRING | — | |
| randomize_seed | BOOLEAN | true | — |
| manual_seedopt | INT | 00–4294967295 | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| text | STRING | — |
| seed | INT | — |