OOP Node π«
The node that turns the whole OOP prompt into actual conditioning
- Clip
- Style
- View
- Person
- Animal
- Location
- Environment
- CONDITIONING
- STRING
Every other node in ComfyUI-OOP just builds little labeled strings. OOP Node π« is where they become a real prompt. It takes your Style, View, Person, Animal, Location and Environment fragments, assembles them into one structured text block, and CLIP-encodes it into conditioning you can feed straight to a sampler. It also hands you the raw prompt text as a string output, which is the pack's debugging window.
What it does
The inputs split into two groups. Required: Clip (a CLIP encoder from your checkpoint loader) and Style (OOP_STYLE). Optional: View, Person, Animal, Location, Environment - each a custom OOP_* type from the pack's leaf nodes. Leave one unplugged and it simply doesn't appear in the prompt.
Under the hood, the node joins whatever you gave it into blocks:
Style: PhotoRAW
Perspective: shot:FullBody, angle:Dutch Angle, background:NoBlur
Person:
* BodyShape: Athletic
* Gender: Female
* Age: 30-39Years
...
That's the structured, label-prefixed format the README demonstrates - and it matters, because block-structured prompts are one of the habits that actually transferred in modern prompting (the knowledge base's prompt-engineering notes call out "structuring the prompt in blocks" as a genuinely useful 2026-era practice). This pack was built for SDXL in early 2025, so it does that structuring with CLIP-era tools.
Then comes the encoding, and this is where you learn the pack's true colors:
- It hardcodes CLIP skip β2 (
Clip.clip_layer(-2)). - It tokenizes into the
landgstreams - the SDXL dual text encoders - and pads one to match the other. - It returns conditioning with
original_size/target_size/crop_coordsall at 1024Γ1024.
Those are SDXL-specific hooks. The node is built around the dual CLIP-L/CLIP-G encoder, which means it's really an SDXL tool: feed it an SDXL checkpoint (the demo workflow uses an SDXL empty latent at 1152Γ896, euler/karras, cfg 8, 20 steps) and it behaves. On an SD1.5 or Flux checkpoint you're outside what the author built - the l/g tokenize path and the hardcoded sizing don't match those models' encoders.
The outputs are what you'd expect from a conditioning node: CONDITIONING (wire to the positive input of a KSampler) and STRING (the assembled prompt, useful for a ShowText node or for hand-editing when the model misbehaves). Note it outputs positive conditioning only - the demo builds the negative separately with an empty CLIPTextEncode through ConditioningZeroOut.
Installing it
cd ComfyUI/custom_nodes
git clone https://github.com/0xRavenBlack/ComfyUI-OOP
Restart ComfyUI. Or use Manager - search ComfyUI-OOP in the Custom Nodes Manager. There's no requirements.txt and no model download; the node uses ComfyUI's built-in CLIP machinery.
Troubleshooting
- "KeyError / it crashes with a non-SDXL checkpoint" - the dual
l/gtokenize path expects an SDXL-style encoder. Use an SDXL checkpoint; that's what the pack was tested against. - "The prompt looks wrong" - read the
STRINGoutput. Every fragment you plugged in should appear as a labeled line; anything missing is an unplugged input. - "Negative prompt does nothing" - the node only produces the positive. On an SDXL workflow with real CFG (the demo uses cfg 8), a normal negative prompt still works; wire your own.
The pack is small, ~15 stars, dormant since March 2025. OOP Node is the payoff - all the dropdowns in the pack exist to feed this one encoding step, and it does that one job competently.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| Clip | CLIP | β | |
| Style | OOP_STYLE | β | |
| Viewopt | OOP_VIEW | β | |
| Personopt | OOP_PERSON | β | |
| Animalopt | OOP_ANIMAL | β | |
| Locationopt | OOP_LOCATION | β | |
| Environmentopt | OOP_ENVIRONMENT | β |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| CONDITIONING | CONDITIONING | β |
| STRING | STRING | β |