Character Prompt βοΈπ π π
NovelAI's Multi-Character Prompting, Inside ComfyUI
- option
- NAID_OPTION
Getting two characters into one image without them merging into a person-shaped blur is one of the oldest frustrations in this hobby. Local SD users fight it with regional prompting, masks, or just rolling the seed fifty times. NovelAI's V4 and later models solve it natively with multi-character prompting: each character gets their own caption, and the model handles the rest. This node is how you reach that feature from a ComfyUI graph - one CharacterPromptOptionNAID per character, chained together, feeding into GenerateNAID.
There's a sibling worth knowing about before you pick one: CharacterReferenceOptionNAID guides identity from a reference image, whereas this node works purely from text. If you have an image of the character you want, use the reference node. If you're describing someone from scratch - "white-haired fox girl, red jacket" - this is the one.
How it works
Each node builds one entry in a characters list that rides along inside the pack's internal NAID_OPTION connection. When GenerateNAID runs, it merges every character's positive and negative captions into NovelAI's char_captions fields on the request, keeping your main prompt as the global base_caption. So your positive prompt describes the scene, and each character node describes just that character - exactly the layering NovelAI's V4+ API expects.
A couple of group behaviors trip people up. The use_position and use_order toggles are "all or nothing": if any chained character enables positioning, the whole group gets pinned coordinates, not just that one character. Same for use_order - if one node enables it, chain order becomes the priority hint for the whole scene. That's how NovelAI's API is shaped, and the pack faithfully forwards it.
Inputs and outputs
Six inputs, and a beginner only really touches three of them at first:
positive/negative- the character's captions. Multiline, so go ahead and write prose; NovelAI's text model likes natural language, not just danbooru tags. Negative is where you park things like "second character" to keep the model from sneaking in extras.use_position+x/y- pin the character to a normalized spot (0.0β1.0, default0.5= center). Leave this off until you've seen where the model naturally puts everyone; pinning everything by hand fights the composition you'd otherwise get for free.use_order- treat the chain's connection order as an overlap-priority hint. Only meaningful when characters overlap.
The optional option input is the chain point - connect the previous character node's output here. The single output, NAID_OPTION, goes into GenerateNAID's option input.
Install and the catches
It ships with the ComfyUI_NAIDGenerator pack: search "ComfyUI_NAIDGenerator" in ComfyUI Manager, or git clone https://github.com/bedovyy/ComfyUI_NAIDGenerator into ComfyUI/custom_nodes, then restart. The deps are light (python-dotenv, argon2-cffi) and there are no model downloads - generation happens on NovelAI's servers, and you need a token in ComfyUI/.env (NAI_ACCESS_TOKEN=..., from User Settings > Account > Get Persistent API Token).
The big requirement is hidden in the name: this is a V4+ feature. It needs a V4, V4.5, or V5 model - the pack's default nai-diffusion-4-5-full is fine, but if you switch ModelOptionNAID down to an older model, the per-character captions silently stop doing anything. And remember you're spending Anlas per image. Multi-character prompting is a big quality win, but each iteration on a scene with several captions costs the same as any other generation, so the tab moves fast while you dial in the composition.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| positive | STRING | This character's positive caption. | |
| negative | STRING | This character's negative caption. | |
| use_position | BOOLEAN | false | Pin this character to x/y instead of letting the model place it automatically. |
| x | FLOAT | 0.500β1 | Horizontal position (0=left, 1=right). Only used when use_position is enabled. |
| y | FLOAT | 0.500β1 | Vertical position (0=top, 1=bottom). Only used when use_position is enabled. |
| use_order | BOOLEAN | false | Use the connection order of character prompt nodes as a priority when characters overlap. Applies to the whole group of chained character prompts. |
| optionopt | NAID_OPTION | β |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| NAID_OPTION | NAID_OPTION | β |