Nodes/ComfyUI-Benripack/Benri Character Pipe
ComfyUI Node

Benri Character Pipe

Keep your whole character — face, poses, prompts, model — on one wire

By blackcodetavern·Created 2 years ago·Updated 2 years ago· 15
Benri Character Pipe
  • character_pipe
  • face_image
  • pose_image
  • add_positive_master_prompt
  • add_negative_master_prompt
  • add_positive_char_prompt
  • add_negative_char_prompt
  • model
  • clip
  • vae
  • ipadapter
  • character_pipe
  • face_image
  • pose_image
  • positive_master_prompt
  • negative_master_prompt
  • positive_char_prompt
  • negative_char_prompt
  • model
  • clip
  • vae
  • ipadapter

If you've built a character workflow, you know the mess: every node downstream wants the checkpoint, the CLIP, the VAE, the IPAdapter, a couple of CONDITIONINGs, and two reference images - all dragged across the canvas in a rat's nest of wires. Benri Character Pipe is the "bundle it up" node. Everything about a character goes in one side, and comes out the other as a tidy pipe you can tap at any point. It's not a flashy node; it's an organization habit with one genuinely useful trick hidden inside.

How it works

All eleven inputs are optional, and the node is a merge, not a replace. Feed it an existing character_pipe and it mutates that object, only overwriting the fields you actually supplied. That lets you build a character kit incrementally: one CharacterPipe holding the model, CLIP, VAE and IPAdapter, another upstream of the scene adding prompts, both feeding the same pipe object.

The interesting part is the prompts. The four add_* CONDITIONING inputs don't set a prompt - they append to whatever's already in the pipe, concatenating token sequences onto the existing conditioning. So you can keep a master prompt that defines the character and layer a per-scene prompt on top without retyping anything. If the pipe has a clip but no prompts yet, the node seeds all four slots with a tokenized "image," - a minimal placeholder condition so the first append has something to stick to.

One gotcha buried in the code: the whole prompt-append block only runs if the pipe holds a CLIP. Feed an add_positive_master_prompt into a chain with no clip anywhere and the append silently never happens. Don't expect it to error; it just won't merge.

The inputs that matter

  • character_pipe - an existing pipe to merge into (chain nodes to layer more onto it).
  • face_image / pose_image - the reference images that define who the character is.
  • add_positive_master_prompt / add_negative_master_prompt - scene-level conditioning.
  • add_positive_char_prompt / add_negative_char_prompt - character-level conditioning, appended separately from the master.
  • model, clip, vae, ipadapter - the models you'd otherwise drag across half the graph.

Every input also passes straight through as a named output - character_pipe, face_image, pose_image, all four prompts, and model/clip/vae/ipadapter. That's the point: all eleven outputs fan out from one tidy node, so downstream nodes grab whichever tap they need. The node is also marked always-changed, so it re-executes every run rather than caching - that's what lets prompt merges stay live, and it costs you nothing on a node this cheap.

The honest take

The CHARACTER_PIPE type is defined by this pack, and nothing else in the pack consumes it. The pipe output is for chaining another CharacterPipe (layer prompts, swap models, build up), or for some future pack that speaks the type - not for something that will read it today. So the real value is organization plus conditional prompt merging, not a magic character bundle.

If you don't need the prompt appending, rgthree's reroute and context nodes tidy wiring with less ceremony. Where CharacterPipe earns its keep is as a reusable "character kit" subgraph: drop one into any workflow, feed it your character's face and LoRA-era kit, and append scene prompts downstream. And it pairs naturally with the pack's other half - while Benri Animation Extractor generates the pose tilesets, CharacterPipe is the half that keeps the identity straight. Both are halves of the same character-consistency problem.

Install

Search "ComfyUI-Benripack" in ComfyUI Manager, or clone it:

cd ComfyUI/custom_nodes
git clone https://github.com/blackcodetavern/ComfyUI-Benripack

then restart ComfyUI. No model downloads, no heavy dependencies - the requirements.txt is just torch, numpy, and Pillow, which any stock ComfyUI already has. It's a lightweight node that behaves like one.

Categorysd

Inputs (11)

NameTypeDefaultDescription
character_pipeoptCHARACTER_PIPE
face_imageoptIMAGE
pose_imageoptIMAGE
add_positive_master_promptoptCONDITIONING
add_negative_master_promptoptCONDITIONING
add_positive_char_promptoptCONDITIONING
add_negative_char_promptoptCONDITIONING
modeloptMODEL
clipoptCLIP
vaeoptVAE
ipadapteroptIPADAPTER

Outputs (11)

NameTypeDescription
character_pipeCHARACTER_PIPE
face_imageIMAGE
pose_imageIMAGE
positive_master_promptCONDITIONING
negative_master_promptCONDITIONING
positive_char_promptCONDITIONING
negative_char_promptCONDITIONING
modelMODEL
clipCLIP
vaeVAE
ipadapterIPADAPTER