RS Character Prompt
One STRING per slot, and why the kind switch stops breaking it
- building_pipe
- building_pipe
Regional prompting in ComfyUI has a plumbing problem that nobody warns you about: the moment you want dynamic text - a string from a primitive, a wildcard node, an LLM captioner - you're wiring STRING sockets, and the moment you change what that slot means, the wire drops. This node exists because of exactly that, and its release note is refreshingly specific about it.
The Giyeok fix, explained plainly
RS Character Prompt is the first of the modular character-input nodes: it holds the prompts for all your slots and outputs a building_pipe. Each row 1–10 has an enable checkbox, a kind dropdown (character or text), and one optional STRING input named characterN.
One STRING, two jobs. When kind is character, that string is the positive prompt for one person. When kind is text, the same string is the literal words you want drawn on the canvas. Because there's only one socket, switching kind keeps the connection intact - which is the "Giyeok Fix" in the pack version you're looking at. Old workflows from before the fix had a second characterN_text socket for literal text; it still exists as a legacy input and gets migrated to the shared one.
If you've ever rebuilt a half-dozen wires after flipping a dropdown, you get why this is the headline feature rather than a footnote.
There's also no per-character negative field here. The regional sampler supports one common negative, full stop, so the plumbing doesn't pretend otherwise.
What you wire, and in what order
character_count sets how many rows are live, and it's the field that decides your character count for the whole pipe - its tooltip says it outright: prompt count determines the active regions, while the LoRA and Position nodes only decide which settings get supplied to those regions. Hidden rows are excluded even if something is still connected to them, which is the sane behaviour and also why a "disappeared" third character is almost always a character_count value of 2.
Then the STRING inputs. Anything that produces text works: a text primitive, a prompt-combine node, a wildcard picker, a caption from an LLM. This is the whole reason to prefer the modular nodes over the all-in-one prompt table - the modular prompt node takes real connections, not just typed literals.
The building_pipe is optional as an input and required as an output. That's the trick that makes the assembly order-independent: connect Prompt → LoRA → Position → Finalize, or Position → Prompt → Finalize, or Prompt straight into Finalize. Each node reads whatever's already on the pipe, replaces only its own role's fields, and hands back a new immutable pipe.
What it feeds
building_pipe goes into RS Character LoRA, RS Character Position, or straight into RS Finalize Character Pipe - which validates the whole thing and emits the character_pipe the sampler and detailer consume. Finalize is where the errors surface, so expect messages like "connect a nonempty STRING to the matching Prompt row, or disable that row" if you enabled a slot and left it blank. That's not a bug, it's the node refusing to sample a character with no description.
Install
ComfyUI Manager, search RS MultiCharacter Sampler - the whole pack installs as one unit. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/raspie10032/ComfyUI_RS_MultiCharacter_Sampler.git
Restart. Nothing else to install: the sampler uses ComfyUI's existing torch/NumPy/Pillow, and only the detailer and tagger paths need extra packages. Don't keep a Manager copy and a Git checkout side by side; that's a documented way to get duplicate or broken nodes.
The author ships examples/modular/two-characters-anima.json if you'd rather read a working graph than build one. Which, honestly, is the fastest way to understand the pipe - drop it on the canvas and follow the wires.
Small gotchas
Text slots need a box. If you set kind to text and leave the Position node in point mode, Finalize tells you the text region needs box geometry - a point has no area to write in. Text slots also refuse character LoRAs, so set those to None. And the person-count tag still belongs in the sampler's common prompt or per-row; this node is only moving strings around.
Inputs (42)
| Name | Type | Default | Description |
|---|---|---|---|
| character_count | INT | 21–10 | Show all slots 1–N together. Prompt count determines the active regions; LoRA/Position counts determine which settings they supply. / 1~N번 설정을 함께 표시합니다. 최종 인원수는 프롬프트 노드 기준입니다. |
| character1_enable | BOOLEAN | true | — |
| character1_kind | COMBO | character | 2 options: character, text |
| character2_enable | BOOLEAN | true | — |
| character2_kind | COMBO | character | 2 options: character, text |
| character3_enable | BOOLEAN | true | — |
| character3_kind | COMBO | character | 2 options: character, text |
| character4_enable | BOOLEAN | true | — |
| character4_kind | COMBO | character | 2 options: character, text |
| character5_enable | BOOLEAN | true | — |
| character5_kind | COMBO | character | 2 options: character, text |
| character6_enable | BOOLEAN | true | — |
| character6_kind | COMBO | character | 2 options: character, text |
| character7_enable | BOOLEAN | true | — |
| character7_kind | COMBO | character | 2 options: character, text |
| character8_enable | BOOLEAN | true | — |
| character8_kind | COMBO | character | 2 options: character, text |
| character9_enable | BOOLEAN | true | — |
| character9_kind | COMBO | character | 2 options: character, text |
| character10_enable | BOOLEAN | true | — |
| character10_kind | COMBO | character | 2 options: character, text |
| building_pipeopt | RS_MC_BUILD_PIPE | — | |
| character1opt | STRING | Slot 1: character = positive prompt; text = exact words to draw. The same connection is kept when switching kind. Text needs a box Position. | |
| character1_textopt | STRING | Legacy literal-text connection; migrated to the shared STRING input. | |
| character2opt | STRING | Slot 2: character = positive prompt; text = exact words to draw. The same connection is kept when switching kind. Text needs a box Position. | |
| character2_textopt | STRING | Legacy literal-text connection; migrated to the shared STRING input. | |
| character3opt | STRING | Slot 3: character = positive prompt; text = exact words to draw. The same connection is kept when switching kind. Text needs a box Position. | |
| character3_textopt | STRING | Legacy literal-text connection; migrated to the shared STRING input. | |
| character4opt | STRING | Slot 4: character = positive prompt; text = exact words to draw. The same connection is kept when switching kind. Text needs a box Position. | |
| character4_textopt | STRING | Legacy literal-text connection; migrated to the shared STRING input. | |
| character5opt | STRING | Slot 5: character = positive prompt; text = exact words to draw. The same connection is kept when switching kind. Text needs a box Position. | |
| character5_textopt | STRING | Legacy literal-text connection; migrated to the shared STRING input. | |
| character6opt | STRING | Slot 6: character = positive prompt; text = exact words to draw. The same connection is kept when switching kind. Text needs a box Position. | |
| character6_textopt | STRING | Legacy literal-text connection; migrated to the shared STRING input. | |
| character7opt | STRING | Slot 7: character = positive prompt; text = exact words to draw. The same connection is kept when switching kind. Text needs a box Position. | |
| character7_textopt | STRING | Legacy literal-text connection; migrated to the shared STRING input. | |
| character8opt | STRING | Slot 8: character = positive prompt; text = exact words to draw. The same connection is kept when switching kind. Text needs a box Position. | |
| character8_textopt | STRING | Legacy literal-text connection; migrated to the shared STRING input. | |
| character9opt | STRING | Slot 9: character = positive prompt; text = exact words to draw. The same connection is kept when switching kind. Text needs a box Position. | |
| character9_textopt | STRING | Legacy literal-text connection; migrated to the shared STRING input. | |
| character10opt | STRING | Slot 10: character = positive prompt; text = exact words to draw. The same connection is kept when switching kind. Text needs a box Position. | |
| character10_textopt | STRING | Legacy literal-text connection; migrated to the shared STRING input. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| building_pipe | RS_MC_BUILD_PIPE | — |