Lazy Prompt (ext)
The Lazy Prompt node that hands you back your own text
- clip
- POS_OUT
- NEG_OUT
- pos_raw
- neg_raw
Lazy Prompt (ext) is the version of PG Nodes' signature node that gives you your prompts back. The plain Lazy Prompt encodes your text and quietly saves every run to a global history file. This "ext" variant does the same thing, but it also exposes the exact strings it encoded as pos_raw and neg_raw outputs, so another node can read, transform, or log what actually went into the sampler.
That history is the real reason people reach for this pack at all. The author - GizmoR13 (Piotr Gredka), a ComfyUI newcomer who built these nodes for himself a couple months after starting - posted the pack to r/StableDiffusion in September 2025, and the comment that best sums up the reaction was: the value is "globally accessible prompt history" across all your workflows. Most ComfyUI setups keep prompts locked inside each workflow's textbox. Lazy Prompt flips that: every prompt you've ever run is one dropdown away in any future graph.
How it works
Under the hood it's just CLIPTextEncode with a save step. You feed it a clip and two multiline strings (positive, negative); it encodes both into conditioning and writes a JSON record - positive, negative, timestamp, hit count - to a history file on disk. Default location is custom_nodes\prompt_history.json, capped at 500 entries with an LRU trim. If both fields are empty, it skips the save, which is a nice touch.
Two things make it feel alive:
- Inline randomizer. Write
{red|blue|green}in your prompt and each run picks one. Nested braces work, and backslash escapes keep literal braces. Because a random result changes the output, the node marks itself changed on every queue when it detects choice syntax, so it reruns instead of caching. - The ext outputs.
pos_rawandneg_raware plainSTRINGoutputs carrying the text after the randomizer expanded it - the literal string that got encoded. Feed them into a text display node, a logger, or another node that wants the actual prompt text. That's the whole point of "ext": interoperability.
The inputs that matter
There are exactly three, and you set all of them:
clip- your CLIP model, straight from a loader.positive/negative- your prompts. Multiline, so paste freely.
Outputs: POS_OUT and NEG_OUT (conditioning) go into your sampler; pos_raw / neg_raw (strings) go wherever you need the text. It's an output node, so it marks the graph complete on its own.
Install
Install the pack once and every PG node comes with it:
ComfyUI Manager → search "PG Nodes" → Install → restart
or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/GizmoR13/PG-Nodes
# rename the folder to PG-nodes
# restart ComfyUI
No model downloads, no extra pip dependencies - the pack is pure Python on top of ComfyUI's own APIs. That's rarer than it should be in this ecosystem.
Common issues
- History path or cap too small. Right-click the node (⋯) → context menu, and you can point the history file anywhere and raise
max_entries. The cap default of 500 is fine until it isn't. - Prompt not saved. Both fields empty = no save. That's by design, not a bug.
- Randomizer not re-rolling. The re-roll is on by default; the env var
PG_REROLL=0turns it off if you want deterministic behavior. - Config maps not loading. The lighting/lens/time maps live in
PG_Lazy_Prompt_Config.jsoninside the pack folder; the env varPG_CFG_PATHoverrides its location if you moved it.
One honest caveat: the "ext" strings reflect what you typed after expansion, so if you're logging raw input, grab them before the randomizer splits things. Minor, but it'll save you a confused five minutes.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| clip | CLIP | — | |
| positive | STRING | — | |
| negative | STRING | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| POS_OUT | CONDITIONING | — |
| NEG_OUT | CONDITIONING | — |
| pos_raw | STRING | — |
| neg_raw | STRING | — |