Nodes/ComfyUI-OOP/OOP Node πŸ’«
ComfyUI Node

OOP Node πŸ’«

The node that turns the whole OOP prompt into actual conditioning

By 0xRavenBlackΒ·Created 2 years agoΒ·Updated about a year agoΒ· 15
OOP Node πŸ’«
  • 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 l and g streams - the SDXL dual text encoders - and pads one to match the other.
  • It returns conditioning with original_size / target_size / crop_coords all 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/g tokenize path expects an SDXL-style encoder. Use an SDXL checkpoint; that's what the pack was tested against.
  • "The prompt looks wrong" - read the STRING output. 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.

CategoryObject-Oriented Prompting

Inputs (7)

NameTypeDefaultDescription
ClipCLIPβ€”
StyleOOP_STYLEβ€”
ViewoptOOP_VIEWβ€”
PersonoptOOP_PERSONβ€”
AnimaloptOOP_ANIMALβ€”
LocationoptOOP_LOCATIONβ€”
EnvironmentoptOOP_ENVIRONMENTβ€”

Outputs (2)

NameTypeDescription
CONDITIONINGCONDITIONINGβ€”
STRINGSTRINGβ€”