Dual Prompts - PromptDrafter
Dual Prompts - PromptDrafter
- positive_prompt
- negative_prompt
- positive_raw
- negative_raw
If you run SDXL-lineage models for any length of time, you've hit the moment where you're retyping the same forty tags into a fresh CLIP Text Encode for the third time this week. That's what Dual Prompts - PromptDrafter is for. It's a managed replacement for the plain text box upstream of your encoder: one green field for the positive prompt, one red field for the negative, and the ability to save the whole combination to a file and load it back later. The name undersells it - this is the node the pack is built around, and it quietly fixes several annoyances plain ComfyUI leaves you to deal with.
How it works
The node isn't a text encoder. It produces a STRING, which you then wire into a regular CLIP Text Encode (positive output into the positive CLIP box, negative into the negative one). What it adds on top of a bare text field is processing: it joins your prompt with optional positive_prefix/positive_suffix and their negative twins using smart comma handling (no double commas, no trailing ones), and it substitutes wildcards before anything reaches the encoder.
Wildcards are the party trick. Type {wildcard_subject} anywhere in either prompt and the node sprouts an input port literally named wildcard_subject that you can feed from a Wildcard node. Drop {wildcard_lighting} in and you get a second port. Unmatched wildcards get replaced with an empty string, so forgetting to wire one silently removes it rather than erroring - useful to know before you wonder why a whole concept vanished.
Everything is always-dirty (IS_CHANGED returns float("nan")), which means the node re-runs every generation. That's the whole point with wildcards: each queue hit re-rolls them instead of being cached into a stale prompt.
The inputs and outputs that matter
For a beginner, ignore almost everything except the two big text boxes and this trio:
prompt_name- type a name and hit save (or just type a name; entering one auto-saves in recent versions). It lands as a JSON file insaved/dual_prompts/.load_prompt- a dropdown of everything you've saved. Pick one and the fields populate.- The
positive_raw/negative_rawoutputs - same text with wildcards applied but without prefix/suffix. Handy when you want the bare prompt elsewhere in the graph.
The main outputs are positive_prompt and negative_prompt; that's what you feed the encoders.
Installing it
ComfyUI Manager, search "PromptDrafter" and install the ComfyUI-PromptDrafter pack, or:
cd ComfyUI/custom_nodes
git clone https://github.com/Carasibana/ComfyUI-PromptDrafter
Restart ComfyUI after. That's the whole install - the pack's requirements.txt explicitly lists no dependencies beyond ComfyUI itself, and there are no model downloads. Your saved prompts live in the pack's saved/ folder, which is gitignored, so git pull updates never eat your library.
Where people get burned
The one that trips everyone: this node doesn't call any API and it isn't a wildcard file system. The {wildcard_...} syntax is this pack's own in-graph thing - it's not Impact Pack's __wildcard__ and it's not the A1111 {a|b|c} bracket syntax, so a workflow that assumes those won't behave. And if you load an older workflow and see this node listed as DualPromptDrafter, that's just the pre-v1.3.3 name; the current key is Dual_PromptDrafter, kept as a silent alias for old saves. Search the new name and move on.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| positive_prompt | STRING | — | |
| negative_prompt | STRING | — | |
| positive_prefixopt | STRING | — | |
| positive_suffixopt | STRING | — | |
| negative_prefixopt | STRING | — | |
| negative_suffixopt | STRING | — | |
| prompt_nameopt | STRING | — | |
| load_promptopt | COMBO | 3 options: , anime_style, portrait_base |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| positive_prompt | STRING | — |
| negative_prompt | STRING | — |
| positive_raw | STRING | — |
| negative_raw | STRING | — |