ComfyUI Node

Prompt Verify

Approve It Before the Long Render

By ialhabbal·Created 12 months ago·Updated 4 months ago· 8
Prompt Verify
  • clip
  • COND
  • TEXT
use_external_text_inputfalse
use_llm_inputfalse
timeout60
text
llm_input
editor

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 the text socket 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 the llm_input socket. Flip one or the other; the editor field 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 the COND output is real conditioning you can feed straight into KSampler. Skip it and COND is None; wire the TEXT output 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.

Categorytext

Inputs (7)

NameTypeDefaultDescription
use_external_text_inputBOOLEANfalseToggle to enable or disable the text connector input
use_llm_inputBOOLEANfalseToggle to use LLM input instead of the text input
timeoutINT601–2400Time in seconds to wait before passing the input text on (max 2400)
clipoptCLIPOptional CLIP model for encoding
textoptSTRING
llm_inputoptSTRINGConnect LLM text input here
editoroptSTRINGedit here, press 'shift-return' to submit

Outputs (2)

NameTypeDescription
CONDCONDITIONING
TEXTSTRING