Hypnodes Conditioner
Turns your character stack into ten CLIP conditionings in one node
- clip
- char_stack
- hn_config
- char_1_pos_cond
- char_2_pos_cond
- char_3_pos_cond
- char_4_pos_cond
- char_5_pos_cond
- char_6_pos_cond
- char_7_pos_cond
- char_8_pos_cond
- char_9_pos_cond
- char_10_pos_cond
- char_1_text
Raw text is just data; a diffusion model can't paint pixels from it until a CLIP model has turned it into conditioning. Normally that means one CLIP Text Encode node per character, and a five-character scene turns into a wall of nearly identical nodes. The Hypnodes Conditioner does the whole batch in one compact block - it takes your character stack, encodes every prompt, and hands you one conditioning output per slot.
What it needs
Three inputs, all required:
- clip - from your checkpoint or CLIP loader.
- char_stack - the output of the Hypnodes Character Stacker.
- hn_config - the Control Hub's bus, so it knows the global context and character count.
How it works
Internally it instantiates a plain CLIPTextEncode and runs it for each character. The detail worth understanding: it takes the global_prompt_start from the Hub (that's the global positive prompt) and prepends it to every character's prompt, then encodes the combined string. So character 1's conditioning is effectively global positive + character 1's box. That's the "global context + regional detail" design on purpose - the scene, lighting, and quality live in the Hub, and the per-character boxes only need to describe the character.
The second detail is that empty slots don't error out - they get encoded as empty conditioning, so a coupler downstream doesn't receive a hole in its mask-to-conditioning mapping. The pack would rather give you a blank region than a broken wire.
The outputs
- char_1_pos_cond through char_10_pos_cond - one CONDITIONING per slot, ready to pair with the matching mask from the Mask Generator.
- char_1_text - a bonus STRING containing character 1's full combined prompt (global + local). Handy for debugging what the node actually encoded, or routing to a text display.
There are no negative conditioning outputs here. This node handles the per-character positives; the global negative lives in the Hub and is encoded by the Hypnodes Prompt Encoder (HN_PromptEncoder), which you feed to the sampler alongside these.
Where this fits
The outputs are designed to plug straight into a regional mechanism - Attention Coupler, Regional Prompter, or ConditioningSetMask with the matching masks. The whole point of the pack is that mask 3 and conditioning 3 stay locked together, so you never manually match a prompt to a region. If you're building this by hand with stock nodes, count how many encode nodes and wire pairs you're saving; that's the pitch.
One honest caveat: the global-prompt prefix means each character's conditioning carries the full scene description. On models with weaker prompt adherence that can reinforce the "every character describes the whole scene" failure mode - but that's exactly the problem the regional masking downstream is there to fix.
Install
ComfyUI Manager (search Hypnodes), or:
cd ComfyUI/custom_nodes
git clone https://github.com/hypnichorse/ComfyUI-Hypnodes
Restart ComfyUI. No model downloads; dependencies are just numpy and pillow, already present in ComfyUI.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| clip | CLIP | — | |
| char_stack | HN_CHAR_STACK | — | |
| hn_config | HN_CONFIG | — |
Outputs (11)
| Name | Type | Description |
|---|---|---|
| char_1_pos_cond | CONDITIONING | — |
| char_2_pos_cond | CONDITIONING | — |
| char_3_pos_cond | CONDITIONING | — |
| char_4_pos_cond | CONDITIONING | — |
| char_5_pos_cond | CONDITIONING | — |
| char_6_pos_cond | CONDITIONING | — |
| char_7_pos_cond | CONDITIONING | — |
| char_8_pos_cond | CONDITIONING | — |
| char_9_pos_cond | CONDITIONING | — |
| char_10_pos_cond | CONDITIONING | — |
| char_1_text | STRING | — |