the rendomize node now supports weighted opions to make some options

more common, e.g. "3>>red" is "red" but 3x as likely to come up
This commit is contained in:
Eric W. Burns
2025-07-20 22:02:28 -04:00
parent 26499a0479
commit a5ea9be75e
3 changed files with 42 additions and 19 deletions
+31 -16
View File
@@ -357,7 +357,7 @@ class EbuPromptHelperRandomize:
This node takes an input prompt and replaces occurrences of a specified target substring
(word_to_replace) with a randomly selected option from a provided string of options.
The options string is split based on the chosen delimiter, which can be newlines, commas, or semi‑colons.
Supports weighted options: prefix an option with `N>>` (where N is an integer) to weight it N times.
The seed input controls the random selection, allowing for deterministic output if desired.
Inputs:
@@ -392,34 +392,49 @@ class EbuPromptHelperRandomize:
CATEGORY = "Prompts"
def randomize_text(self, prompt_text, word_to_replace, replacement_options, seed, case_sensitive, delimit_options_with):
import re
import random
random.seed(seed)
# Split the options string based on the selected delimiter.
# Split options based on chosen delimiter
if delimit_options_with == "newlines":
options = [opt.strip() for opt in replacement_options.splitlines() if opt.strip()]
opts = [opt.strip() for opt in replacement_options.splitlines() if opt.strip()]
elif delimit_options_with == "commas":
options = [opt.strip() for opt in replacement_options.split(',') if opt.strip()]
opts = [opt.strip() for opt in replacement_options.split(',') if opt.strip()]
elif delimit_options_with == "semi-colons":
options = [opt.strip() for opt in replacement_options.split(';') if opt.strip()]
opts = [opt.strip() for opt in replacement_options.split(';') if opt.strip()]
else:
options = [opt.strip() for opt in replacement_options.splitlines() if opt.strip()]
opts = [opt.strip() for opt in replacement_options.splitlines() if opt.strip()]
if not options:
if not opts:
return (prompt_text, "")
selected = random.choice(options)
# Expand weighted options (syntax: N>>option)
expanded = []
pattern = re.compile(r'^\s*(\d+)\s*>>(.*)$')
for item in opts:
m = pattern.match(item)
if m:
count = int(m.group(1))
text = m.group(2).strip()
expanded.extend([text] * count)
else:
expanded.append(item)
# Handle multiple words using "|"
words_to_replace = word_to_replace.split("|")
if not expanded:
return (prompt_text, "")
# Select one option based on weights
selected = random.choice(expanded)
# Perform replacement
words = word_to_replace.split("|")
if case_sensitive:
for word in words_to_replace:
prompt_text = prompt_text.replace(word, selected)
for w in words:
prompt_text = prompt_text.replace(w, selected)
else:
import re
for word in words_to_replace:
pattern = re.compile(re.escape(word), re.IGNORECASE)
prompt_text = pattern.sub(selected, prompt_text)
for w in words:
prompt_text = re.compile(re.escape(w), re.IGNORECASE).sub(selected, prompt_text)
return (prompt_text, selected)
+1 -1
View File
@@ -1,7 +1,7 @@
[project]
name = "ComfyUI_EBU_PromptHelper"
description = "This ComfyUI extension provides a suite of custom nodes for enhancing and manipulating prompts. Features include random color palette generation, prompt text replacement, prompt randomization using variable names and lists of options, list sampling, file loading, current datetime formatting, and season/weather/time-of-day generation."
version = "1.0.7"
version = "1.0.8"
authors = [
{name = "burnsbert"}
]
+10 -2
View File
@@ -94,7 +94,7 @@ Replaces a target substring with a randomly selected option from a list.
**Inputs:**
- `prompt_text` (STRING): Input prompt text
- `word_to_replace` (STRING): Target substring to replace (use | as delimiter for multiple)
- `word_to_replace` (STRING): Target substring to replace (you can include multiple strings to match separated by |, e.g. 'red|blue|yellow')
- `replacement_options` (STRING): List of possible replacements
- `random_seed` (INT): Seed for random selection
- `case_sensitive` (BOOLEAN): Whether to match case when replacing
@@ -104,6 +104,14 @@ Replaces a target substring with a randomly selected option from a list.
- `updated_prompt_text` (STRING): The modified prompt
- `word_selected` (STRING): The chosen replacement
**Weighted Options:**
- Prefix any option with `N>>` (where `N` is an integer) to weight it `N` times. So '3>>>red' would be the same as listing 'red' 3 times.
**Returns:**
- `updated_prompt_text` (STRING): The modified prompt.
- `word_selected` (STRING): The chosen replacement.
### EBU PromptHelper Combine Two Strings
Combines two strings using a specified join string.
@@ -155,7 +163,7 @@ Returns the current date/time in various formats.
Selects and removes an item from a list while updating a prompt.
**Inputs:**
- `word_to_replace` (STRING): Target substring to replace
- `word_to_replace` (STRING): Target substring to replace (you can include multiple strings to match separated by |, e.g. 'red|blue|yellow')
- `list` (STRING): Newline-separated list of options
- `seed` (INT): Random seed
- `prompt_text` (STRING, optional): Input prompt text