Prompt Selector
Stop retyping the same system prompt into every workflow
- SYSTEM_PROMPT
What it actually is
The name lies a little. This is not a wildcard picker for your diffusion prompt, and it doesn't touch your sampler at all. It's a library of system prompts - the long instruction text you feed an LLM that's sitting in your graph.
That matters more than it sounds. Once you wired a model into your workflow - Ollama for local prompt enhancement, a vision model for captioning, an API node for the jobs your card can't do - the instruction you give it becomes the longest, most-reused text you own. The popular late-2025 Ollama setup did exactly this: a whole character bible parked in the system prompt so the user prompt is just a name.
Jack: mid-40s Australian man, tanned skin, blue eyes, athletic build, 6'2", sun-kissed scruffy brown hair, distressed brown leather jacket…
That's one answer to consistency, and it creates a plumbing problem the moment you have four workflows. Your choices used to be: paste it into every text box, or keep it in a notes file and paste it each session. Prompt Selector makes it a dropdown backed by a JSON file.
How it works
The node reads a JSON store when ComfyUI builds the node definition, so the dropdown options come live from your library, plus a (manual entry) choice for one-offs. That build-time read is the reason the pack ships a JavaScript extension (/extensions/ComfyUI-Universal-Prompt-Selector/upsel.js): the frontend caches node definitions, so a dropdown built at startup would go stale the second you added a prompt. The JS re-syncs the combo every time a node is created or a workflow is loaded, then restores whatever selection the workflow had saved.
Lookup happens by name, case-insensitively, first match wins. Because the combo widget only carries the name, the node also declares a fingerprint_inputs hook that mixes in the library file's modification time and the prompt's updated_at - that's what makes an edit to a saved prompt show up on the next queue without you touching the graph.
The library lives at <ComfyUI>/user/ComfyUI-Universal-Prompt-Selector/prompts.json, seeded with four starters (Video Prompt Writer, Image Prompt Writer, OCR Expert, Coding Expert). Writes are atomic, and a corrupt file gets backed up instead of silently replaced.
The inputs that matter
Two inputs, one output - that's the whole node.
prompt_name is the dropdown: your saved prompts and (manual entry). manual_text is a multiline box that is only read when prompt_name is (manual entry) - select anything else and whatever you typed there is ignored, which is a five-second confusion everyone has once.
SYSTEM_PROMPT (STRING) comes out the other side. Wire it into the system-prompt field of your LLM node - right-click that field, Convert widget to input, then connect. Or wire it into the Prompt Combiner from the same pack. Both nodes are output nodes with an inline text preview, so you can queue a graph with nothing downstream and just read what the string actually contains. Do that before you blame the model.
Install
ComfyUI Manager → search ComfyUI-Universal-Prompt-Selector → install → restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/Rakeshcool/ComfyUI-Universal-Prompt-Selector.git
# then restart ComfyUI
No models, no pip step. The code imports aiohttp and stdlib only - nothing beyond what ComfyUI already ships. One honest caveat: published September 2026 off a single commit, so there's no track record, just a small readable repo. LLM-adjacent nodes are the exact category that's been weaponized before, so skim the ~600 lines before your first run.
Managing the library without the UI
The Edit / New / Delete / Refresh buttons come from the JS extension, but the same operations are plain HTTP routes, mirrored under /api/upsel/prompts:
curl -s http://127.0.0.1:8188/upsel/prompts
curl -s -X POST http://127.0.0.1:8188/upsel/prompts \
-H 'Content-Type: application/json' \
-d '{"name":"Z-Image Scene Writer","prompt":"You rewrite requests into structured scene prompts.","description":"z-image"}'
Where people get burned
No buttons on the node. The JS didn't load. Check that /extensions/ComfyUI-Universal-Prompt-Selector/upsel.js returns 200, then hard-refresh (Ctrl+F5).
"Could not refresh prompt list". The routes didn't register - look in the ComfyUI console for Prompt library API registered under /upsel/prompts to see whether the import happened at all.
Renaming a prompt that workflows reference. The saved selection is a name, not an id. Delete a prompt and the queue fails with a message naming it; rename one and every workflow pointing at the old name quietly breaks the same way. Duplicate instead of editing in place if a workflow needs a frozen instruction - the library is global, so editing "Image Prompt Writer" changes what every workflow using it does.
Edited text not showing up. On older ComfyUI builds without the V3 fingerprint_inputs hook, queue twice or jiggle any input.
Corrupt store. You'll get a warning and a prompts.json.corrupt-<timestamp> backup next to a fresh library. Your text is in the backup, not gone.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt_name | COMBO | Coding Expert | Saved system prompt to output. '(manual entry)' types text directly instead. |
| manual_text | STRING | Only used when prompt_name is '(manual entry)'. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| SYSTEM_PROMPT | STRING | — |