dynamicPrompts.js 1.42 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import { app } from "../../scripts/app.js";

// Allows for simple dynamic prompt replacement
// Inputs in the format {a|b} will have a random value of a or b chosen when the prompt is queued.

app.registerExtension({
	name: "Comfy.DynamicPrompts",
	nodeCreated(node) {
		// TODO: Change this to replace the value and restore it after posting


		if (node.widgets) {
			// Locate dynamic prompt text widgets
			// Include any widgets with dynamicPrompts set to true, and customtext
			const widgets = node.widgets.filter(
				(n) => (n.type === "customtext" && n.dynamicPrompts !== false) || n.dynamicPrompts
			);
			for (const widget of widgets) {
				// Override the serialization of the value to resolve dynamic prompts for all widgets supporting it in this node
				widget.serializeValue = () => {
					let prompt = widget.value;
					while (prompt.replace("\\{", "").includes("{") && prompt.replace("\\}", "").includes("}")) {
						const startIndex = prompt.replace("\\{", "00").indexOf("{");
						const endIndex = prompt.replace("\\}", "00").indexOf("}");

						const optionsString = prompt.substring(startIndex + 1, endIndex);
						const options = optionsString.split("|");

						const randomIndex = Math.floor(Math.random() * options.length);
						const randomOption = options[randomIndex];

						prompt = prompt.substring(0, startIndex) + randomOption + prompt.substring(endIndex + 1);
					}

					return prompt;
				};
			}
		}
	},
});