Prompt Verify
Approve It Before the Long Render
- clip
- COND
- TEXT
The most expensive mistake in ComfyUI is a typo inside a 30-minute render. When you type the prompt yourself that's your problem to own, but a lot of modern workflows don't hand-type prompts at all - an LLM writes them, a wildcard node rolls them, a Florence2 captioner spits one out. You get what you get. Prompt Verify turns that into a checkpoint: the workflow stops dead, shows you the exact text about to be encoded, and waits for you to edit and approve it before the sampler ever runs. Human-in-the-loop, on purpose, for the one thing worth pausing over.
It's from ialhabbal, the same person behind Save_It, PhotoLab, and meta_prompt_extractor, and it solves a real itch. Once your prompt comes from a model instead of your fingers, you want a look before you commit - a second pair of eyes, except it needs yours.
How it actually works
Under the hood it's a websocket round-trip between the node and the ComfyUI frontend. When the node executes, it registers itself in a waiting list and pings the UI with the text via prompt_verify_request. The frontend drops that text into an editor widget on the node; you edit, then press Shift+Return (or click Submit), which POSTs the result back and wakes the node up. Meanwhile the Python side is polling every tenth of a second, up to your timeout.
Two details make it behave the way it does. First, it uses lazy evaluation - the text and llm_input sockets are only computed when you toggle them on, so an expensive upstream node isn't run for nothing. Second, it's not just a gate: give it a CLIP model and it encodes the final text itself, so it can stand in for a CLIP Text Encode node in your positive prompt path.
There's also a prompt library bundled in - save prompts under categories (with LoRA and trigger-word fields), import/export them as JSON, all stored in ComfyUI/user/default/prompt_verify_data.json. Handy if you collect reusable prompt fragments and want them a mouse-click away.
The inputs that matter
You'll touch maybe four of these:
use_external_text_input- the toggle that turns thetextsocket on. Default is off, and this is the trap: connect a text source and forget to flip it, and the node silently ignores it.use_llm_input- same idea for thellm_inputsocket. Flip one or the other; theeditorfield is always available as a fallback or prefilled starting text.timeout- seconds to wait before passing the text through anyway (default 60, max 2400). If you don't submit in time, the original text goes on - the node times out rather than cancels.clip- optional. Connect it and theCONDoutput is real conditioning you can feed straight into KSampler. Skip it andCONDisNone; wire theTEXToutput into a normal CLIP Text Encode instead.
Installing it
One wrinkle before the commands: the standalone repo is deprecated. The README is a two-line redirect - the node now ships inside the ComfyUI-ialhabbal suite. So the real install is:
cd ComfyUI/custom_nodes
git clone https://github.com/ialhabbal/ComfyUI-ialhabbal
Then restart ComfyUI and search for "Prompt Verify". You can also grab it through ComfyUI Manager by searching the suite title, which is the path of least resistance. The old repo still works if you must (git clone https://github.com/ialhabbal/ComfyUI-Prompt-Verify), but you'd be installing a pack the author has already moved on from. Good news on dependencies: there are none. No requirements.txt, no model downloads, nothing but Python and the JS that ComfyUI already ships - this is about as dependency-free as a custom node gets.
Where people get burned
The toggle trap above is the big one. The second is that this node blocks the whole queue while it waits - if you hit Run and the graph just sits there, that's not a hang, that's the editor waiting on you. Check the node's widget. And remember the timeout is a fallback, not a feature: if you want an actual decision point, leave it generous rather than sneaky-short, or you'll walk away and come back to a render that used the prompt you wanted to fix.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| use_external_text_input | BOOLEAN | false | Toggle to enable or disable the text connector input |
| use_llm_input | BOOLEAN | false | Toggle to use LLM input instead of the text input |
| timeout | INT | 601–2400 | Time in seconds to wait before passing the input text on (max 2400) |
| clipopt | CLIP | Optional CLIP model for encoding | |
| textopt | STRING | — | |
| llm_inputopt | STRING | Connect LLM text input here | |
| editoropt | STRING | edit here, press 'shift-return' to submit |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| COND | CONDITIONING | — |
| TEXT | STRING | — |