diff --git a/examples/text_driven_prompting_sample.jpg b/examples/text_driven_prompting_sample.jpg new file mode 100644 index 0000000..085152f Binary files /dev/null and b/examples/text_driven_prompting_sample.jpg differ diff --git a/examples/text_driven_prompting_sample.json b/examples/text_driven_prompting_sample.json new file mode 100644 index 0000000..601fd8e --- /dev/null +++ b/examples/text_driven_prompting_sample.json @@ -0,0 +1,691 @@ +{ + "id": "1d4e4326-6985-4b88-a21b-a8a603a38a6b", + "revision": 0, + "last_node_id": 13, + "last_link_id": 24, + "nodes": [ + { + "id": 10, + "type": "TextDrivenJoinStrings", + "pos": [ + 624.0013774104677, + 387.48467630854066 + ], + "size": [ + 231.97501237517213, + 98 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "label": "string0", + "name": "string_inputs.string0", + "type": "STRING", + "link": 17 + }, + { + "label": "string1", + "name": "string_inputs.string1", + "shape": 7, + "type": "STRING", + "link": 18 + }, + { + "label": "string2", + "name": "string_inputs.string2", + "shape": 7, + "type": "STRING", + "link": null + } + ], + "outputs": [ + { + "name": "string_out", + "type": "STRING", + "links": [ + 19 + ] + } + ], + "properties": { + "Node name for S&R": "TextDrivenJoinStrings" + }, + "widgets_values": [ + "," + ], + "color": "#232", + "bgcolor": "#353" + }, + { + "id": 7, + "type": "KSampler", + "pos": [ + 1134.633264462809, + 527.0919421487622 + ], + "size": [ + 270, + 262 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 12 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 13 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 14 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 11 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 10 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.19.3", + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 893386370465587, + "randomize", + 30, + 7, + "euler", + "normal", + 1 + ] + }, + { + "id": 8, + "type": "VAEDecode", + "pos": [ + 1136.0795454545457, + 441.47727272727286 + ], + "size": [ + 140, + 46 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 10 + }, + { + "name": "vae", + "type": "VAE", + "link": 20 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 9 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.19.3", + "Node name for S&R": "VAEDecode" + }, + "widgets_values": [] + }, + { + "id": 11, + "type": "TextDrivenResolutionSelector", + "pos": [ + 624.0013774104659, + 684.5748966942159 + ], + "size": [ + 259.2310546875, + 132 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "width", + "type": "INT", + "links": [ + 23 + ] + }, + { + "name": "height", + "type": "INT", + "links": [ + 24 + ] + } + ], + "properties": { + "Node name for S&R": "TextDrivenResolutionSelector" + }, + "widgets_values": [ + "768x1024 (3:4)\n832x1216 (13:19)\n960x1280 (3:4)\n1024x1365 (3:4)\n1024x1496 (paper)\n1080x1440 (3:4)\n1152x1536 (3:4)\n1280x1728 (3:4)\n1536x1536 (1:1)", + "1024x1365 (3:4)" + ], + "color": "#232", + "bgcolor": "#353" + }, + { + "id": 6, + "type": "EmptyLatentImage", + "pos": [ + 905.3719008264499, + 660.0292699724531 + ], + "size": [ + 210, + 106 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "width", + "type": "INT", + "widget": { + "name": "width" + }, + "link": 23 + }, + { + "name": "height", + "type": "INT", + "widget": { + "name": "height" + }, + "link": 24 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 11 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.19.3", + "Node name for S&R": "EmptyLatentImage" + }, + "widgets_values": [ + 1024, + 1024, + 1 + ] + }, + { + "id": 9, + "type": "SaveImage", + "pos": [ + 1134.8467630854004, + 66.0898760330579 + ], + "size": [ + 237.07128099173542, + 324.3567493112946 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 9 + } + ], + "outputs": [], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.19.3", + "Node name for S&R": "SaveImage" + }, + "widgets_values": [ + "ComfyUI_TextDriven" + ] + }, + { + "id": 2, + "type": "TextDrivenTextLinePrompt", + "pos": [ + 378.7964876033059, + 152.6687327823689 + ], + "size": [ + 322.43457300275486, + 180.97451790633613 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "name": "optional_text_in", + "shape": 7, + "type": "STRING", + "link": null + } + ], + "outputs": [ + { + "name": "string_out", + "type": "STRING", + "links": [ + 17 + ] + } + ], + "properties": { + "Node name for S&R": "TextDrivenTextLinePrompt" + }, + "widgets_values": [ + "1girl, solo, emilia \\(re:zero\\), blonde hair,\n(abstract background:1.5),\nthree quarter view, speed lines,\n(by carnelian:0.6),", + "2: (abstract background:1.5)", + 1.5, + true + ], + "color": "#232", + "bgcolor": "#353" + }, + { + "id": 3, + "type": "TextDrivenMultiPrompts", + "pos": [ + 383.41081267217646, + 390.4872589531677 + ], + "size": [ + 222.9048828125, + 364 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "optional_text_in", + "shape": 7, + "type": "STRING", + "link": null + } + ], + "outputs": [ + { + "name": "string_out", + "type": "STRING", + "links": [ + 18 + ] + } + ], + "properties": { + "Node name for S&R": "TextDrivenMultiPrompts" + }, + "widgets_values": [ + "3", + "cinematic lighting, volumetric lighting", + 1, + true, + "sundress, ruffled, cotton", + 1.2, + true, + "masterpiece, delicate, serene atmosphere", + 0.8, + true, + "", + 1, + true, + "", + 1, + true, + "", + 1, + true, + "", + 1, + true, + "", + 1, + true, + "", + 1, + true, + "", + 1, + true + ], + "color": "#232", + "bgcolor": "#353" + }, + { + "id": 13, + "type": "MarkdownNote", + "pos": [ + 717.6652892561983, + 64.05148071625365 + ], + "size": [ + 388.06301652892535, + 270.0120523415977 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [], + "outputs": [], + "properties": {}, + "widgets_values": [ + "# Text-Driven Prompting Workflow Guide\n\nThis workflow streamlines prompt management and eliminates manual weight tweaking by utilizing two custom nodes for layered control.\n\n---\n\n## Node Overview\n\n### 1. Text Line Prompt (Text-Driven)\nManages a list of prompt assets or concepts line by line.\n* **Bi-directional Sync:** Select a line via the dropdown menu to modify its multiplier or active state. The raw text area updates automatically in real-time.\n* **Muting Function:** Deactivating a line prepends `//` to comment it out. These lines are completely skipped during backend execution to output a clean string.\n* **Regex Parsing:** Properly handles character LoRA escaped brackets `\\( \\)` and safely bypasses rows containing multiple unescaped brackets.\n\n### 2. Multi Prompts (Text-Driven)\nProvides centralized layer-control for multiple modifiers.\n* **Dynamic UI Layout:** Input fields dynamically hide or show based on the \"num_prompts\" value (up to 10 slots) to keep the canvas clean.\n* **Granular Controls:** Allows you to adjust individual multipliers and toggle the active state of each prompt fragment with a single click.\n\n---\n\n## Workflow Pipeline\n\nThe nodes are connected in a relay structure to compile the final prompt:\n\n1. **Base Generation:** [Text Line Prompt] manages base characters, core concepts, or specific styles.\n2. **Modifier Stacking:** The selected base prompt is fed into [Multi Prompts] via the hidden `optional_text_in` input pin.\n3. **Final Output:** [Multi Prompts] appends aesthetic modifiers (lighting, attire, quality tokens), then sends the fully combined string directly to the SDXL CLIP Text Encode.\n\n### Quick Start\n1. Choose a row in **Text Line Prompt** using the dropdown menu.\n2. Tweak individual weights or toggle active states in **Multi Prompts**.\n3. Click **Queue Prompt** to execute." + ], + "color": "#432", + "bgcolor": "#653" + }, + { + "id": 4, + "type": "CLIPTextEncode", + "pos": [ + 896.5909090909092, + 387.07816804407724 + ], + "size": [ + 218.659765625, + 88 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 15 + }, + { + "name": "text", + "type": "STRING", + "widget": { + "name": "text" + }, + "link": 19 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 13 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.19.3", + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "" + ] + }, + { + "id": 5, + "type": "CLIPTextEncode", + "pos": [ + 897.3226584022048, + 524.1477272727292 + ], + "size": [ + 218.659765625, + 88 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 16 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 14 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.19.3", + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "blurry, low quality, text, error, cropped, worst quality" + ] + }, + { + "id": 1, + "type": "CheckpointLoaderSimple", + "pos": [ + 628.323002754823, + 530.5096418732777 + ], + "size": [ + 210, + 98 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 12 + ] + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 15, + 16 + ] + }, + { + "name": "VAE", + "type": "VAE", + "links": [ + 20 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.19.3", + "Node name for S&R": "CheckpointLoaderSimple" + }, + "widgets_values": ["sd_xl_base_1.0.safetensors"] + } + ], + "links": [ + [ + null, + null, + null, + null, + null, + null + ], + [ + 9, + 8, + 0, + 9, + 0, + "IMAGE" + ], + [ + 10, + 7, + 0, + 8, + 0, + "LATENT" + ], + [ + 11, + 6, + 0, + 7, + 3, + "LATENT" + ], + [ + 12, + 1, + 0, + 7, + 0, + "MODEL" + ], + [ + 13, + 4, + 0, + 7, + 1, + "CONDITIONING" + ], + [ + 14, + 5, + 0, + 7, + 2, + "CONDITIONING" + ], + [ + 15, + 1, + 1, + 4, + 0, + "CLIP" + ], + [ + 16, + 1, + 1, + 5, + 0, + "CLIP" + ], + [ + 17, + 2, + 0, + 10, + 0, + "STRING" + ], + [ + 18, + 3, + 0, + 10, + 1, + "STRING" + ], + [ + 19, + 10, + 0, + 4, + 1, + "STRING" + ], + [ + 20, + 1, + 2, + 8, + 1, + "VAE" + ], + [ + 23, + 11, + 0, + 6, + 0, + "INT" + ], + [ + 24, + 11, + 1, + 6, + 1, + "INT" + ] + ], + "groups": [], + "config": {}, + "extra": { + "ds": { + "scale": 1.366588235294118, + "offset": [ + -115.43560606060629, + 107.90960743801628 + ] + }, + "frontendVersion": "1.42.11" + }, + "version": 0.4 +} \ No newline at end of file diff --git a/examples/text_driven_prompting_sample.md b/examples/text_driven_prompting_sample.md new file mode 100644 index 0000000..8d9822a --- /dev/null +++ b/examples/text_driven_prompting_sample.md @@ -0,0 +1,33 @@ +# Text-Driven Prompting Workflow Guide + +This workflow streamlines prompt management and eliminates manual weight tweaking by utilizing two custom nodes for layered control. + +--- + +## Node Overview + +### 1. Text Line Prompt (Text-Driven) +Manages a list of prompt assets or concepts line by line. +* **Bi-directional Sync:** Select a line via the dropdown menu to modify its multiplier or active state. The raw text area updates automatically in real-time. +* **Muting Function:** Deactivating a line prepends `//` to comment it out. These lines are completely skipped during backend execution to output a clean string. +* **Regex Parsing:** Properly handles character LoRA escaped brackets `\( \)` and safely bypasses rows containing multiple unescaped brackets. + +### 2. Multi Prompts (Text-Driven) +Provides centralized layer-control for multiple modifiers. +* **Dynamic UI Layout:** Input fields dynamically hide or show based on the "num_prompts" value (up to 10 slots) to keep the canvas clean. +* **Granular Controls:** Allows you to adjust individual multipliers and toggle the active state of each prompt fragment with a single click. + +--- + +## Workflow Pipeline + +The nodes are connected in a relay structure to compile the final prompt: + +1. **Base Generation:** [Text Line Prompt] manages base characters, core concepts, or specific styles. +2. **Modifier Stacking:** The selected base prompt is fed into [Multi Prompts] via the hidden `optional_text_in` input pin. +3. **Final Output:** [Multi Prompts] appends aesthetic modifiers (lighting, attire, quality tokens), then sends the fully combined string directly to the SDXL CLIP Text Encode. + +### Quick Start +1. Choose a row in **Text Line Prompt** using the dropdown menu. +2. Tweak individual weights or toggle active states in **Multi Prompts**. +3. Click **Queue Prompt** to execute. \ No newline at end of file