Prompt Workbench
Tag-by-tag prompt editing that still hands you a plain STRING
- prompt
If you prompt in tags - and if you run anything on the Illustrious / NoobAI / Pony side of the SDXL family, you do - then editing a prompt is a drag-and-drop, toggle, reweight problem, not a text-typing problem. Prompt Workbench is the node that admits this. It replaces the bare multiline prompt box with a tag editor: drag to reorder, click to disable, double-click to edit inline, and nudge weights in 0.05 / 0.1 / 0.25 steps. Order matters in tag prompting because earlier keywords pull harder, so a tool that makes "move this tag to the front" a drag is not a luxury.
It's a genuinely young pack - the English-speaking community has basically no discussion of it yet, the README leads in Japanese, and the author is upfront that it's an independent re-imagining of Physton's A1111 sd-webui-prompt-all-in-one, not an official port. Keep expectations calibrated: this is a polished editor, not a prompt generator. It won't write prompts for you; it makes hand-built tag prompts painless.
How it works
Here's the design trick that makes it worth trusting: the source of truth is still a normal ComfyUI STRING widget. The node class is almost embarrassingly thin - PromptWorkbench takes your prompt, runs a normalize_output_prompt that collapses newlines into , and guarantees a trailing comma, and hands the result to whatever you wire next. All the real machinery is a frontend extension that hooks the node when it registers, finds that prompt widget, and mounts a DOM editor over it. Full tag state lives in versioned node.properties.promptWorkbenchState, kept separate from the STRING that actually executes.
That separation is the part you'll be glad exists. Run the workflow headless, through the API, or anywhere browser extensions can't load, and the saved STRING still flows out - disabled tags drop out of the output but stay visible in the workflow. Tag parsing is a state-machine parser that tracks bracket pairs (including full-width ones), quotes, and escapes, and it recognizes LoRA, LyCORIS, Embedding, Wildcard, Dynamic Prompt, and BREAK syntax so it doesn't mangle (tag:1.2) or <lora:foo:0.8> into garbage.
The one input and the one output
This is a rare node where the whole contract fits in a sentence:
prompt(STRING, multiline, default"") - your prompt, and the only input. It's markeddynamicPrompts, so ComfyUI's own{a|b}expansion applies to it.prompt(STRING output) - the flat, comma-terminated prompt. Wire it into a CLIP Text Encode positive input (or negative, if you're the sort who builds a negative prompt in tags) and forget it.
Drag it into any workflow already built around tag-style prompting and a CLIP encoder and it slots straight in. Disabled tags never reach the output, so you can keep A/B candidates around without a second node.
Installing
Two ways, both painless:
cd /path/to/ComfyUI/custom_nodes
git clone https://github.com/matsukasa/ComfyUI-Prompt-Workbench.git
# then restart ComfyUI
Or open Manager → Custom Nodes Manager and search ComfyUI Prompt Workbench (or prompt-workbench). In an ecosystem whose defining complaint is dependency hell, this pack is a breath of fresh air: its requirements.txt literally says "No additional runtime dependencies. ComfyUI already provides aiohttp." Translation over HTTP reuses the aiohttp ComfyUI ships with. No model downloads, no pip installs.
One gotcha the author flags: the Manager/Registry build can lag the GitHub version, and right after a release Manager may not resolve prompt-workbench@latest at all. If Manager can't find it, clone from GitHub - that's the recommended path anyway.
Common issues
- Node missing after install - check
custom_nodes/ComfyUI-Prompt-Workbench/__init__.pyis where it should be, and look at ComfyUI's startup log for an import error. - UI doesn't appear - force-refresh the browser, then confirm
WEB_DIRECTORY = "./web"is being read. And remember: the STRING output works even with no UI, by design. - Translation fails - that's the optional DeepL / LibreTranslate / OpenAI-compatible / MyMemory feature. Keys are read from environment variables of the process that launches ComfyUI (
PROMPT_WORKBENCH_DEEPL_API_KEY, etc.) - deliberately not stored in the node, workflow, or browser. Set them in the shell before starting ComfyUI and retry from the tag's translate button. - Wrong "model missing" warnings - the node queries
/object_infoand/embeddingsto warn about LoRA/embedding names; if those are unreachable, warnings go silent. They never stop execution.
One practical note on data: the bundled tag catalog (~2,900 tags across 10 major categories) and tag sets are fully local JSON - no calls out to any external tag service. The GitHub build ships the full catalog; the Registry build ships an SFW sample by default, and you can load your own JSON from the node's settings. If you prompt in Japanese, the built-in dictionary and the "replace Japanese tags with English" button are worth a try; if you don't, ignore translation entirely.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| prompt | STRING | — |