Nodes/ComfyUI_RS_MultiCharacter_Sampler/RS MultiCharacter Sampler (Giyeok Fix)
ComfyUI Node

RS MultiCharacter Sampler (Giyeok Fix)

Ten characters, ten prompts, no ControlNet

By raspie10032·Created 3 days ago·Updated 2 days ago· 1
RS MultiCharacter Sampler (Giyeok Fix)
  • model
  • clip
  • vae
  • character_pipe
  • image
  • latent
  • character_pipe
  • generation_info
◄promptmasterpiece, best quality, 5girls, university campus►
◄negative_promptlow quality, bad anatomy, text, watermark►
◄width1536►
◄height768►
◄seed0►
◄steps30►
◄cfg4.0►
◄sampler_nameeuler_ancestral►
◄schedulersgm_uniform►
◄autosavetrue►
◄save_formatPNG►
◄webp_quality90►
◄prompt_syntaxComfyUI►
◄use_image_settingsfalse►
◄region_feather0.04►
◄initial_common_prior0.05►
◄common_after_step3_boost0.10►
◄initial_character_gain1.7►
◄initial_spatial_separation0.90►
◄boundary_hold_steps3►
◄boundary_decrement0.20►
◄layout_methodregional►

You want two specific people in one frame, each with their own hair colour, outfit and face, and you want them to stay themselves. A single prompt describing both gets you the classic texture soup where her red hair ends up on him. Regional prompting is the standing answer to that, and it's been re-implemented roughly once per architecture shift since Latent Couple in 2023.

This node is one of those re-implementations, and the name oversells nothing: it's a KSampler replacement that takes a pipe of up to ten character descriptions with coordinates attached, and samples so each region only reads its own character's text.

What it actually is

First, what it isn't. Despite the "RS" name, this needs no API key, no NovelAI subscription, no ControlNet and no second extension - it's local text-to-image on your own checkpoint. The pack ships no root requirements.txt either; the sampler runs on the PyTorch, NumPy and Pillow your ComfyUI already has, at Python 3.11+.

Supported families, per the author's own validation: Anima, SDXL (tested on Illustrious XL v1.0 and NoobAI XL epsilon-pred 1.1), Krea 2 Turbo, MOSS-Image SFT, and SD1.5 as explicitly experimental and unstable. Not Flux, not SD2, not refiner or inpainting checkpoints, and it rejects models that already carry attention patches. Every family gets its own attention path, from Anima's text adapter to SDXL's attn1/attn2 callbacks.

How the routing works

The mechanism explains every weird result you'll get. Your common prompt, the common negative and each character's text are encoded separately. The X/Y centre you give each character builds a nearest-centre partition of the canvas, so every image token gets exactly one owner. For positive cross-attention, a token reads the common text plus its own character's text and nothing from the other characters.

On top of that sit two dials people confuse with CFG. The common prior biases the shared softmax toward the scene prompt, and character gain scales the character value vectors. At the tested 30-step Anima defaults the prior ramps from 0.05 early to 1.0 by mid-sampling, while self-attention separation starts high at 0.9 and decays to zero around step 9. That schedule is the whole trick: hard region walls while composition forms, then release so the image integrates instead of looking collaged.

The inputs you'll actually touch

Wire model, clip and vae from your loader, then character_pipe from the multi-character prompts node (or from RS Multi Character Load Image). Then:

  • prompt / negative_prompt - the scene and the shared negative. Put the total person count and setting here.
  • width / height / seed / steps / cfg - ordinary sampler values. Steps accept 2–100; Anima and SDXL default to 30, Krea 2 Turbo wants 8 with CFG 1, MOSS wants 50.
  • sampler_name / scheduler - every sampler in your install is selectable. The author ran the entire 45 × 9 grid on one Anima scene; most completed, several badly. Default is euler_ancestral + sgm_uniform; euler + linear_quadratic followed requested seating better.
  • autosave / save_format / webp_quality - writes into output/RS_MultiCharacter/.

The optional block is where the tuning lives: layout_method (regional, or MOSS's native layout JSON), prompt_syntax, use_image_settings to replay settings off a loaded image, plus initial_common_prior, initial_character_gain, initial_spatial_separation, boundary_hold_steps, boundary_decrement, common_after_step3_boost and region_feather. Leave those for later - they're the author's experimental controls, not universal quality knobs.

Outputs: image (also goes straight into ComfyUI's Save Image or a detailer), latent, character_pipe (feed it to RS MultiCharacter Detailer) and generation_info, a text report worth reading when a run looks wrong.

Install

Through ComfyUI Manager, search RS MultiCharacter Sampler. Or clone it - and only one of the two, because a second copy alongside a Git checkout is a documented way to break your node list:

cd ComfyUI/custom_nodes
git clone https://github.com/raspie10032/ComfyUI_RS_MultiCharacter_Sampler.git

Restart ComfyUI. Then load examples/two-characters-anima.json (or drop the workflow PNG on the canvas), point the loaders at your model, and hit the Model family preset → Apply preset button on the sampler to copy the tested starting values for your family.

Where people get burned

Coordinates place prompt regions, not bodies. Moving one character's centre does not move that person, and a request for four people in a 2×2 layout became twelve in the author's own test. Two characters across a wide canvas is the reliable case; six is a dice roll. Also: per-character negative captions get preserved in metadata but rejected by this sampler - nonempty ones throw an explicit error, so use the common negative. And autosave writes metadata, not a workflow; use Save Image if you want workflow embedding.

CategoryRS MultiCharacter

Inputs (26)

NameTypeDefaultDescription
modelMODEL—
clipCLIP—
vaeVAE—
character_pipeRS_MC_CHARACTER_PIPE—
promptSTRINGmasterpiece, best quality, 5girls, university campus—
negative_promptSTRINGlow quality, bad anatomy, text, watermark—
widthINT153664–4096—
heightINT76864–4096—
seedINT00–18446744073709550000—
stepsINT302–100Anima/SDXL: 30; Krea2 Turbo: 8; MOSS: 50. Common weight rises every 3 scheduled steps. Boundary hold uses sampling steps and is capped by the selected step count.
cfgFLOAT4.01–20—
sampler_nameCOMBOeuler_ancestralAll installed samplers are selectable. Anima starting points: euler_ancestral + sgm_uniform; euler + linear_quadratic; dpmpp_2m_sde_gpu + beta. Compared at 30 steps / CFG 4, one two-character scene and seed; quality varies. SDXL: euler_ancestral + normal. Krea2 Turbo / MOSS: euler + simple, with the matching example settings.
schedulerCOMBOsgm_uniformAll installed schedulers are selectable. Anima: try sgm_uniform with euler_ancestral, linear_quadratic with euler, or beta with dpmpp_2m_sde_gpu. SDXL: normal with euler_ancestral. Krea2 Turbo / MOSS: simple with euler. Choose the pair manually; changing a sampler does not reset this value.
autosaveBOOLEANtrue—
save_formatCOMBOPNG3 options: PNG, WebP lossless, WebP lossy
webp_qualityINT901–100—
prompt_syntaxoptCOMBOComfyUI2 options: ComfyUI, NovelAI
use_image_settingsoptBOOLEANfalseAn image pipe always supplies its prompts/characters. Enable to also restore dimensions, seed, sampling and routing settings. Connected model/LoRA/CLIP/VAE remain your choice; check the image loader report.
region_featheroptFLOAT0.040–0.25Softens point partitions only. Boxes use fractional cell coverage and ignore this setting.
initial_common_prioroptFLOAT0.050–1—
common_after_step3_boostoptFLOAT0.100–1—
initial_character_gainoptFLOAT1.71–3—
initial_spatial_separationoptFLOAT0.900–0.99—
boundary_hold_stepsoptINT31–30—
boundary_decrementoptFLOAT0.200.01–1—
layout_methodoptCOMBOregionalRegional routes attention for all supported models. MOSS native sends one official layout JSON prompt, requires boxes and MOSS, and ignores regional strength/boundary/feather settings. Experimental: exact object bounds are not guaranteed.

Outputs (4)

NameTypeDescription
imageIMAGE—
latentLATENT—
character_pipeRS_MC_CHARACTER_PIPE—
generation_infoSTRING—