Nodes/Prompt Palette/Prompt Palette (Combinatorial)
ComfyUI Node

Prompt Palette (Combinatorial)

Stop clicking Run a hundred times — generate every prompt combo at once

By z3rofeels·Created 3 months ago·Updated 3 days ago· 15
Prompt Palette (Combinatorial)
  • 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
◄text►
◄moderandom►
◄count10►
◄seed0►
◄seed_modesequential►
◄max_prompts0►
◄prompt_prefix►
◄prompt_suffix►
◄enhancer_override►
◄external_seed—►
◄negative_text►
◄negative_prefix►
◄negative_suffix►

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 count times (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. 0 uses 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.

CategoryPromptPalette

Inputs (15)

NameTypeDefaultDescription
textSTRINGWildcard-aware source prompt expanded by this batch node.
modeCOMBOrandomGenerate independent random prompts or expand every combination.
countINT101–5000Random mode only; number of prompts to generate.
seedINT00–18446744073709550000Base seed for deterministic wildcard resolution.
seed_modeCOMBOsequentialChoose sequential, fixed, or deterministically randomized per-prompt seeds.
max_promptsINT00–5000Combinatorial mode safety cap; 0 uses the resolver default (5000).
clipoptCLIPOptional CLIP input used to encode every generated prompt.
modeloptMODELOptional model input used when applying per-prompt LoRA tags.
prompt_prefixoptSTRINGExternal wildcard-aware text prepended to every generated prompt (resolved per prompt).
prompt_suffixoptSTRINGExternal wildcard-aware text appended to every generated prompt (resolved per prompt).
enhancer_overrideoptSTRINGA non-empty value replaces every generated prompt (the batch keeps its length and seeds).
external_seedoptINTOptional external seed that takes precedence over the node's Seed control.
negative_textoptSTRINGOptional wildcard-aware negative prompt, resolved once for the whole batch.
negative_prefixoptSTRINGExternal wildcard-aware text prepended to the negative prompt.
negative_suffixoptSTRINGExternal wildcard-aware text appended to the negative prompt.

Outputs (21)

NameTypeDescription
Model listMODELOne model per prompt, individually patched when LoRA tags are applied.
CLIP listCLIPOne CLIP value per prompt, patched alongside the model when needed.
Conditioning listCONDITIONINGOne encoded conditioning value per prompt when CLIP is connected.
Prompt listSTRINGResolved prompt texts, one per generated item.
Seed listINTResolution seed used for each generated prompt.
Wildcards usedSTRINGWildcard files used during this batch, repeated for list-compatible fan-out.
Prompt metadata (JSON) listSTRINGOne resolved/source metadata record per generated prompt.
Model (passthrough)MODELThe connected Model, unchanged (per-prompt LoRA patched models are on Model list).
CLIP (passthrough)CLIPThe connected CLIP, unchanged (per-prompt LoRA patched CLIPs are on CLIP list).
Conditioning (first)CONDITIONINGConditioning for the first generated prompt. Needs CLIP connected. Use Conditioning list for every prompt.
Negative conditioningCONDITIONINGThe resolved negative prompt encoded once with the connected CLIP (unpatched). Needs CLIP connected.
Prompt (first)STRINGThe first generated prompt. Use Prompt list for every prompt.
Negative promptSTRINGResolved negative prompt text, resolved once for the whole batch.
Seed used (first)INTSeed used for the first generated prompt. Use Seed list for every prompt.
Wildcards used (JSON)STRINGJSON list of wildcard files used during this batch, as one value.
Raw text (unresolved)STRINGSource prompt before wildcard resolution.
Wildcards used (count)INTNumber of distinct wildcard files used during this batch.
Used enhancer overrideBOOLEANTrue when the enhancer override replaced the generated prompts.
CLIP token count (max)INTHighest CLIP-L token count across the batch, or -1 when unavailable or the connected text encoder is not CLIP-based.
Batch metadata (JSON)STRINGOne JSON record for the whole batch, including every generated prompt's metadata.
Prompt countINTHow many prompts this batch generated.