Prompt Palette (Combinatorial)
Stop clicking Run a hundred times — generate every prompt combo at once
- clip
- model
- Model list
- CLIP list
- Conditioning list
- Prompt list
- Seed list
- Wildcards used
- Prompt metadata (JSON) list
- Model (passthrough)
- CLIP (passthrough)
- Conditioning (first)
- Negative conditioning
- Prompt (first)
- Negative prompt
- Seed used (first)
- Wildcards used (JSON)
- Raw text (unresolved)
- Wildcards used (count)
- Used enhancer override
- CLIP token count (max)
- Batch metadata (JSON)
- Prompt count
If you migrated from A1111 or Forge, you know this exact pain: in those UIs, {a|b|c} in a prompt means all three images on one click. In stock ComfyUI it means clicking Run three times. Prompt Palette (Combinatorial) is the fix - you write one wildcard-aware template and it returns the whole batch in a single execution. It's from the same pack as the base Prompt Palette node, and it's the one you reach for when you want a deliberate sweep of variations rather than an afternoon of manual clicking.
How it works
Feed it a template with wildcards and choice groups - a __subject__ wearing __outfit__ in __location__ - and pick a mode:
- Random resolves the template
counttimes (default 10) with independently derived seeds. Sampling is with replacement, so repeats are possible. This is the quick "give me N variations" setting. - Combinatorial expands every unmarked wildcard and
{a|b|c}group into the full Cartesian product - 3 subjects × 4 outfits × 5 locations gives you 60 prompts - stopping at the max_prompts cap.
The clever bit: a group carrying an explicit sampler marker (+, -, *, ~, @, %) opts out of full expansion and makes one pick per generated prompt. So you can sweep subject exhaustively while keeping lighting random. That's the Dynamic Prompts convention this pack follows, and it's old A1111 syntax most people who arrived after 2024 never learned - worth knowing even if you only ever use the base node.
The inputs that matter
- mode - random vs. combinatorial. Everything else hangs off this.
- count - random mode only; how many prompts to roll.
- seed + seed_mode - sequential (seed, seed+1, seed+2…), fixed (same seed every prompt), or random (deterministic sequence derived from the base seed). Sequential is your friend for reproducible sweeps.
- max_prompts - combinatorial safety cap.
0uses the built-in 5,000 limit. The node shows an estimated output before you queue, and warns when expansion will hit the cap.
The fan-out trap
All seven outputs are lists: Prompt list, Seed list, Conditioning list, Model/CLIP lists, Wildcards used, and a Prompt metadata (JSON) list. In ComfyUI, a list output makes connected downstream nodes execute once per item - so an estimated output of 500 prompts genuinely means 500 sampler runs. That's the whole point, but it's also the number-one way people cook their own GPU and walk away confused. Check the estimate, mark groups that should only pick once, and set max_prompts deliberately. Connect model and clip and each generated prompt can also apply its own <lora:name:weight> tags before encoding - handy when different combinations select different LoRAs, though it makes each run slower.
Install and troubleshooting
Install is the same for the whole pack: ComfyUI Manager → search "Prompt Palette", or cd ComfyUI/custom_nodes && git clone https://github.com/z3rofeels/comfyui-promptpalette then restart. The only Python deps are PyYAML and typing-extensions - no model downloads, no torch shenanigans. Wildcards live in ComfyUI/wildcards/ (nested .txt/.yaml, referenced as __characters/monsters__). If the custom UI doesn't appear after updating, hard-refresh the browser (Ctrl+Shift+R) - and note the repository folder must stay named comfyui-promptpalette.
Honest take: this node is niche. The author says so himself - the base Prompt Palette is the everyday tool; Combinatorial is for test matrices and character-reference sweeps. But when you need one, "every subject × outfit × location" in a single run is exactly the thing A1111 users keep asking for in 2026 and rarely get in ComfyUI.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| text | STRING | Wildcard-aware source prompt expanded by this batch node. | |
| mode | COMBO | random | Generate independent random prompts or expand every combination. |
| count | INT | 101–5000 | Random mode only; number of prompts to generate. |
| seed | INT | 00–18446744073709550000 | Base seed for deterministic wildcard resolution. |
| seed_mode | COMBO | sequential | Choose sequential, fixed, or deterministically randomized per-prompt seeds. |
| max_prompts | INT | 00–5000 | Combinatorial mode safety cap; 0 uses the resolver default (5000). |
| clipopt | CLIP | Optional CLIP input used to encode every generated prompt. | |
| modelopt | MODEL | Optional model input used when applying per-prompt LoRA tags. | |
| prompt_prefixopt | STRING | External wildcard-aware text prepended to every generated prompt (resolved per prompt). | |
| prompt_suffixopt | STRING | External wildcard-aware text appended to every generated prompt (resolved per prompt). | |
| enhancer_overrideopt | STRING | A non-empty value replaces every generated prompt (the batch keeps its length and seeds). | |
| external_seedopt | INT | Optional external seed that takes precedence over the node's Seed control. | |
| negative_textopt | STRING | Optional wildcard-aware negative prompt, resolved once for the whole batch. | |
| negative_prefixopt | STRING | External wildcard-aware text prepended to the negative prompt. | |
| negative_suffixopt | STRING | External wildcard-aware text appended to the negative prompt. |
Outputs (21)
| Name | Type | Description |
|---|---|---|
| Model list | MODEL | One model per prompt, individually patched when LoRA tags are applied. |
| CLIP list | CLIP | One CLIP value per prompt, patched alongside the model when needed. |
| Conditioning list | CONDITIONING | One encoded conditioning value per prompt when CLIP is connected. |
| Prompt list | STRING | Resolved prompt texts, one per generated item. |
| Seed list | INT | Resolution seed used for each generated prompt. |
| Wildcards used | STRING | Wildcard files used during this batch, repeated for list-compatible fan-out. |
| Prompt metadata (JSON) list | STRING | One resolved/source metadata record per generated prompt. |
| Model (passthrough) | MODEL | The connected Model, unchanged (per-prompt LoRA patched models are on Model list). |
| CLIP (passthrough) | CLIP | The connected CLIP, unchanged (per-prompt LoRA patched CLIPs are on CLIP list). |
| Conditioning (first) | CONDITIONING | Conditioning for the first generated prompt. Needs CLIP connected. Use Conditioning list for every prompt. |
| Negative conditioning | CONDITIONING | The resolved negative prompt encoded once with the connected CLIP (unpatched). Needs CLIP connected. |
| Prompt (first) | STRING | The first generated prompt. Use Prompt list for every prompt. |
| Negative prompt | STRING | Resolved negative prompt text, resolved once for the whole batch. |
| Seed used (first) | INT | Seed used for the first generated prompt. Use Seed list for every prompt. |
| Wildcards used (JSON) | STRING | JSON list of wildcard files used during this batch, as one value. |
| Raw text (unresolved) | STRING | Source prompt before wildcard resolution. |
| Wildcards used (count) | INT | Number of distinct wildcard files used during this batch. |
| Used enhancer override | BOOLEAN | True when the enhancer override replaced the generated prompts. |
| CLIP token count (max) | INT | Highest CLIP-L token count across the batch, or -1 when unavailable or the connected text encoder is not CLIP-based. |
| Batch metadata (JSON) | STRING | One JSON record for the whole batch, including every generated prompt's metadata. |
| Prompt count | INT | How many prompts this batch generated. |