ComfyUI Node

RS Character Prompt

One STRING per slot, and why the kind switch stops breaking it

By raspie10032·Created 3 days ago·Updated 2 days ago· 1
RS Character Prompt
  • building_pipe
  • building_pipe
◄character_count2►
◄character1_enabletrue►
◄character1_kindcharacter►
◄character2_enabletrue►
◄character2_kindcharacter►
◄character3_enabletrue►
◄character3_kindcharacter►
◄character4_enabletrue►
◄character4_kindcharacter►
◄character5_enabletrue►
◄character5_kindcharacter►
◄character6_enabletrue►
◄character6_kindcharacter►
◄character7_enabletrue►
◄character7_kindcharacter►
◄character8_enabletrue►
◄character8_kindcharacter►
◄character9_enabletrue►
◄character9_kindcharacter►
◄character10_enabletrue►
◄character10_kindcharacter►
◄character1—►
◄character1_text—►
◄character2—►
◄character2_text—►
◄character3—►
◄character3_text—►
◄character4—►
◄character4_text—►
◄character5—►
◄character5_text—►
◄character6—►
◄character6_text—►
◄character7—►
◄character7_text—►
◄character8—►
◄character8_text—►
◄character9—►
◄character9_text—►
◄character10—►
◄character10_text—►

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.

CategoryRS MultiCharacter/Characters

Inputs (42)

NameTypeDefaultDescription
character_countINT21–10Show all slots 1–N together. Prompt count determines the active regions; LoRA/Position counts determine which settings they supply. / 1~N번 설정을 함께 표시합니다. 최종 인원수는 프롬프트 노드 기준입니다.
character1_enableBOOLEANtrue—
character1_kindCOMBOcharacter2 options: character, text
character2_enableBOOLEANtrue—
character2_kindCOMBOcharacter2 options: character, text
character3_enableBOOLEANtrue—
character3_kindCOMBOcharacter2 options: character, text
character4_enableBOOLEANtrue—
character4_kindCOMBOcharacter2 options: character, text
character5_enableBOOLEANtrue—
character5_kindCOMBOcharacter2 options: character, text
character6_enableBOOLEANtrue—
character6_kindCOMBOcharacter2 options: character, text
character7_enableBOOLEANtrue—
character7_kindCOMBOcharacter2 options: character, text
character8_enableBOOLEANtrue—
character8_kindCOMBOcharacter2 options: character, text
character9_enableBOOLEANtrue—
character9_kindCOMBOcharacter2 options: character, text
character10_enableBOOLEANtrue—
character10_kindCOMBOcharacter2 options: character, text
building_pipeoptRS_MC_BUILD_PIPE—
character1optSTRINGSlot 1: character = positive prompt; text = exact words to draw. The same connection is kept when switching kind. Text needs a box Position.
character1_textoptSTRINGLegacy literal-text connection; migrated to the shared STRING input.
character2optSTRINGSlot 2: character = positive prompt; text = exact words to draw. The same connection is kept when switching kind. Text needs a box Position.
character2_textoptSTRINGLegacy literal-text connection; migrated to the shared STRING input.
character3optSTRINGSlot 3: character = positive prompt; text = exact words to draw. The same connection is kept when switching kind. Text needs a box Position.
character3_textoptSTRINGLegacy literal-text connection; migrated to the shared STRING input.
character4optSTRINGSlot 4: character = positive prompt; text = exact words to draw. The same connection is kept when switching kind. Text needs a box Position.
character4_textoptSTRINGLegacy literal-text connection; migrated to the shared STRING input.
character5optSTRINGSlot 5: character = positive prompt; text = exact words to draw. The same connection is kept when switching kind. Text needs a box Position.
character5_textoptSTRINGLegacy literal-text connection; migrated to the shared STRING input.
character6optSTRINGSlot 6: character = positive prompt; text = exact words to draw. The same connection is kept when switching kind. Text needs a box Position.
character6_textoptSTRINGLegacy literal-text connection; migrated to the shared STRING input.
character7optSTRINGSlot 7: character = positive prompt; text = exact words to draw. The same connection is kept when switching kind. Text needs a box Position.
character7_textoptSTRINGLegacy literal-text connection; migrated to the shared STRING input.
character8optSTRINGSlot 8: character = positive prompt; text = exact words to draw. The same connection is kept when switching kind. Text needs a box Position.
character8_textoptSTRINGLegacy literal-text connection; migrated to the shared STRING input.
character9optSTRINGSlot 9: character = positive prompt; text = exact words to draw. The same connection is kept when switching kind. Text needs a box Position.
character9_textoptSTRINGLegacy literal-text connection; migrated to the shared STRING input.
character10optSTRINGSlot 10: character = positive prompt; text = exact words to draw. The same connection is kept when switching kind. Text needs a box Position.
character10_textoptSTRINGLegacy literal-text connection; migrated to the shared STRING input.

Outputs (1)

NameTypeDescription
building_pipeRS_MC_BUILD_PIPE—