π¦ PRO Set Node
Stash a model, image, or text under a name and read it anywhere
- MODEL
- CLIP
- VAE
- CONTROL_NET
- CLIP_VISION
- STYLE_MODEL
- UPSCALE_MODEL
- LATENT
- IMAGE
- MASK
- CONDITIONING
- SAMPLER
- SIGMAS
- NOISE
- GUIDER
- star
- star
Every large ComfyUI workflow eventually turns into a plate of spaghetti, and the standard fork is a Set/Get pair: one node stores a value under a name, another fetches it later by that name, no wire needed across the canvas. PRO_SetNode is the write side. Give it any value it recognizes - a model, an image, a latent, a conditioning - and it stashes it in a shared in-memory store where PRO_GetNode can pull it back out. It's the same trick rgthree's Set/Get made famous; this one is this pack's version, and the two cache stores are designed to be compatible.
What it's for
The payoff is workflow hygiene. You compute a CLIP or a conditioning once, store it under clip_main, and reference it in three different sampler sections without dragging a wire the length of the screen. You keep a seed as a named value so every run is reproducible. You tuck a reference image away for later comparison. Because the value is stored by name rather than by connection, editing the graph stops being a game of "which of these ten wires did I just unplug."
How it works
The node exposes a stack of optional inputs - MODEL, CLIP, VAE, CONTROL_NET, CLIP_VISION, STYLE_MODEL, UPSCALE_MODEL, LATENT, IMAGE, MASK, CONDITIONING, SAMPLER, SIGMAS, NOISE, GUIDER, plus a wildcard * catch-all. It takes the first input that isn't None, detects its ComfyUI type (from the class name or tensor shape), and writes it into the cache under a variable name. That name comes from the name widget if it exists, or from the node title if you title it like Set_myvar. The node also passes the value straight through its * output, so it can live inline in a graph as well as acting as a store.
Inputs and outputs that matter
- The type inputs (MODEL, IMAGE, LATENT, etc.) - connect whatever you want to remember. Most people use exactly one per Set node, and there's no point wiring several since only the first non-empty wins.
*output - the value passes through untouched, so you can use the node without it being a dead end.- It's an output node by default (
OUTPUT_NODE = True), so ComfyUI treats it as a place the queue can end - keep that in mind when it appears in the "will run" list.
Installing it
Ships in COMFYUI_PROMPTMODELS (PromptModels Studio in Manager):
cd ComfyUI/custom_nodes
git clone https://github.com/cdanielp/COMFYUI_PROMPTMODELS
Restart ComfyUI. No API key, local only. The pack needs ComfyUI 0.26.0+ to load at all.
Common issues
If a PRO_GetNode downstream can't find your variable, it's almost always a name mismatch - the Set derives its name from the title or the name widget, and typos are silent until the Get errors. Watch the multi-input behavior too: the "first non-None wins" rule means an empty slot you forgot to clear can shadow the input you actually meant to store. And remember the cache is session-only: restart ComfyUI and everything you stored is gone, so a Get that worked before a restart will need the Set re-run once. That's also why the pack ships PRO_ClearCacheNode - a deliberate wipe beats a lingering stale value.
Inputs (16)
| Name | Type | Default | Description |
|---|---|---|---|
| MODELopt | MODEL | β | |
| CLIPopt | CLIP | β | |
| VAEopt | VAE | β | |
| CONTROL_NETopt | CONTROL_NET | β | |
| CLIP_VISIONopt | CLIP_VISION | β | |
| STYLE_MODELopt | STYLE_MODEL | β | |
| UPSCALE_MODELopt | UPSCALE_MODEL | β | |
| LATENTopt | LATENT | β | |
| IMAGEopt | IMAGE | β | |
| MASKopt | MASK | β | |
| CONDITIONINGopt | CONDITIONING | β | |
| SAMPLERopt | SAMPLER | β | |
| SIGMASopt | SIGMAS | β | |
| NOISEopt | NOISE | β | |
| GUIDERopt | GUIDER | β | |
| staropt | * | β |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| star | * | β |