{ "id": "2236888a-8654-4de4-b5a6-ae63e839c76c", "revision": 0, "last_node_id": 25, "last_link_id": 32, "nodes": [ { "id": 1, "type": "MarkdownNote", "pos": [ 0, 0 ], "size": [ 460, 760 ], "flags": {}, "order": 0, "mode": 0, "showAdvanced": null, "inputs": [], "outputs": [], "properties": {}, "widgets_values": [ "## Qwen-Image-2.1 Viggle Turbo · text to image\n\n6-step distilled LoRA for Qwen-Image-2.1 (v0.3). CFG is off, so each step is one model call.\n\n**Files** (the base files are the ones the official Qwen-Image-2.1 template uses):\n- `diffusion_models/qwen_image_2.1_int8_convrot.safetensors` (or `qwen_image_2.1_bf16.safetensors`)\n- `text_encoders/qwen3vl_8b_int8_convrot.safetensors` (or `qwen3vl_8b_bf16.safetensors`)\n- `vae/qwen_image_2.1_vae_bf16.safetensors`\n- `loras/Qwen-Image-2.1-viggle-turbo-v0.3-6step-lora-r128.safetensors` (or the r256 original)\n\n**Custom nodes:** copy `viggle_turbo.py` into `ComfyUI/custom_nodes/` and restart ComfyUI. It adds two nodes:\n- *Viggle Turbo Sigmas*: the 6-step schedule the LoRA is sampled on, shifted for the output resolution. A stock KSampler scheduler does not match it. Change the step count only at the high-noise end (see the model card).\n- *Viggle Turbo LoRA (unmerged)*: applies the LoRA at runtime as `W x + B A x`, like diffusers. The stock LoRA loaders merge it into the weights instead, which drops about 30% of this LoRA's update on bf16 weights and adds noise several times its size on int8 weights. Unmerged costs about 10-25% more time per step.\n\n**Keep:** euler, BasicGuider (no CFG, no negative prompt), the unmerged LoRA node at strength 1.0.\n\n**Prompt enhancer:** the model was distilled on long, descriptive prompts. With *Enhance prompt* on, the Qwen3-VL text encoder rewrites your prompt using the official Qwen-Image-2.1 rewriter system prompt (greedy decoding, a few seconds). *Prompt used* shows the result. If the rewrite doesn't parse, your prompt is used as written. Turn the enhancer off for prompts that are already detailed. `thinking` is on only so that ComfyUI doesn't append an empty think block, which matches the model's own chat template.\n\n**Size:** about 1 MP is the sweet spot, and up to about 4 MP works. Keep width and height at multiples of 16 (the *Output size* node uses 32).\n" ], "widgets_values_named": { "text": "## Qwen-Image-2.1 Viggle Turbo · text to image\n\n6-step distilled LoRA for Qwen-Image-2.1 (v0.3). CFG is off, so each step is one model call.\n\n**Files** (the base files are the ones the official Qwen-Image-2.1 template uses):\n- `diffusion_models/qwen_image_2.1_int8_convrot.safetensors` (or `qwen_image_2.1_bf16.safetensors`)\n- `text_encoders/qwen3vl_8b_int8_convrot.safetensors` (or `qwen3vl_8b_bf16.safetensors`)\n- `vae/qwen_image_2.1_vae_bf16.safetensors`\n- `loras/Qwen-Image-2.1-viggle-turbo-v0.3-6step-lora-r128.safetensors` (or the r256 original)\n\n**Custom nodes:** copy `viggle_turbo.py` into `ComfyUI/custom_nodes/` and restart ComfyUI. It adds two nodes:\n- *Viggle Turbo Sigmas*: the 6-step schedule the LoRA is sampled on, shifted for the output resolution. A stock KSampler scheduler does not match it. Change the step count only at the high-noise end (see the model card).\n- *Viggle Turbo LoRA (unmerged)*: applies the LoRA at runtime as `W x + B A x`, like diffusers. The stock LoRA loaders merge it into the weights instead, which drops about 30% of this LoRA's update on bf16 weights and adds noise several times its size on int8 weights. Unmerged costs about 10-25% more time per step.\n\n**Keep:** euler, BasicGuider (no CFG, no negative prompt), the unmerged LoRA node at strength 1.0.\n\n**Prompt enhancer:** the model was distilled on long, descriptive prompts. With *Enhance prompt* on, the Qwen3-VL text encoder rewrites your prompt using the official Qwen-Image-2.1 rewriter system prompt (greedy decoding, a few seconds). *Prompt used* shows the result. If the rewrite doesn't parse, your prompt is used as written. Turn the enhancer off for prompts that are already detailed. `thinking` is on only so that ComfyUI doesn't append an empty think block, which matches the model's own chat template.\n\n**Size:** about 1 MP is the sweet spot, and up to about 4 MP works. Keep width and height at multiples of 16 (the *Output size* node uses 32).\n" }, "color": "#432", "bgcolor": "#653" }, { "id": 2, "type": "UNETLoader", "pos": [ 540, 0 ], "size": [ 320, 82 ], "flags": {}, "order": 1, "mode": 0, "showAdvanced": null, "inputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "unet_name", "locked": null, "name": "unet_name", "nameLocked": null, "removable": null, "shape": null, "type": "COMBO", "widget": { "name": "unet_name" }, "link": null }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "weight_dtype", "locked": null, "name": "weight_dtype", "nameLocked": null, "removable": null, "shape": null, "type": "COMBO", "widget": { "name": "weight_dtype" }, "link": null } ], "outputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "MODEL", "locked": null, "name": "MODEL", "nameLocked": null, "removable": null, "shape": null, "type": "MODEL", "pos": null, "slot_index": null, "links": [ 1 ] } ], "properties": { "Node name for S&R": "UNETLoader", "models": [ { "name": "qwen_image_2.1_int8_convrot.safetensors", "url": "https://huggingface.co/Comfy-Org/Qwen-Image-2.1/resolve/main/diffusion_models/qwen_image_2.1_int8_convrot.safetensors", "directory": "diffusion_models" } ] }, "widgets_values": [ "qwen_image_2.1_int8_convrot.safetensors", "default" ], "widgets_values_named": { "unet_name": "qwen_image_2.1_int8_convrot.safetensors", "weight_dtype": "default" } }, { "id": 3, "type": "ViggleTurboLora", "pos": [ 540, 172 ], "size": [ 356.9, 82 ], "flags": {}, "order": 2, "mode": 0, "showAdvanced": null, "inputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "model", "locked": null, "name": "model", "nameLocked": null, "removable": null, "shape": null, "type": "MODEL", "pos": null, "link": 1 }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "lora_name", "locked": null, "name": "lora_name", "nameLocked": null, "removable": null, "shape": null, "type": "COMBO", "widget": { "name": "lora_name" }, "link": null }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "strength", "locked": null, "name": "strength", "nameLocked": null, "removable": null, "shape": null, "type": "FLOAT", "widget": { "name": "strength" }, "link": null } ], "outputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "MODEL", "locked": null, "name": "MODEL", "nameLocked": null, "removable": null, "shape": null, "type": "MODEL", "pos": null, "slot_index": null, "links": [ 28 ] } ], "properties": { "Node name for S&R": "ViggleTurboLora", "models": [ { "name": "Qwen-Image-2.1-viggle-turbo-v0.3-6step-lora-r128.safetensors", "url": "https://huggingface.co/Viggle/Qwen-Image-2.1-viggle-turbo/resolve/main/Qwen-Image-2.1-viggle-turbo-v0.3-6step-lora-r128.safetensors", "directory": "loras" } ] }, "widgets_values": [ "Qwen-Image-2.1-viggle-turbo-v0.3-6step-lora-r128.safetensors", 1 ], "widgets_values_named": { "lora_name": "Qwen-Image-2.1-viggle-turbo-v0.3-6step-lora-r128.safetensors", "strength": 1 } }, { "id": 4, "type": "CLIPLoader", "pos": [ 540, 344 ], "size": [ 320, 106 ], "flags": {}, "order": 3, "mode": 0, "showAdvanced": null, "inputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "clip_name", "locked": null, "name": "clip_name", "nameLocked": null, "removable": null, "shape": null, "type": "COMBO", "widget": { "name": "clip_name" }, "link": null }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "type", "locked": null, "name": "type", "nameLocked": null, "removable": null, "shape": null, "type": "COMBO", "widget": { "name": "type" }, "link": null }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "device", "locked": null, "name": "device", "nameLocked": null, "removable": null, "shape": 7, "type": "COMBO", "widget": { "name": "device" }, "link": null } ], "outputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "CLIP", "locked": null, "name": "CLIP", "nameLocked": null, "removable": null, "shape": null, "type": "CLIP", "pos": null, "slot_index": null, "links": [ 2, 3 ] } ], "properties": { "Node name for S&R": "CLIPLoader", "models": [ { "name": "qwen3vl_8b_int8_convrot.safetensors", "url": "https://huggingface.co/Comfy-Org/Qwen-Image-2.1/resolve/main/text_encoders/qwen3vl_8b_int8_convrot.safetensors", "directory": "text_encoders" } ] }, "widgets_values": [ "qwen3vl_8b_int8_convrot.safetensors", "qwen_image", "default" ], "widgets_values_named": { "clip_name": "qwen3vl_8b_int8_convrot.safetensors", "type": "qwen_image", "device": "default" } }, { "id": 5, "type": "VAELoader", "pos": [ 540, 540 ], "size": [ 320, 58 ], "flags": {}, "order": 4, "mode": 0, "showAdvanced": null, "inputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "vae_name", "locked": null, "name": "vae_name", "nameLocked": null, "removable": null, "shape": null, "type": "COMBO", "widget": { "name": "vae_name" }, "link": null } ], "outputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "VAE", "locked": null, "name": "VAE", "nameLocked": null, "removable": null, "shape": null, "type": "VAE", "pos": null, "slot_index": null, "links": [ 4, 5 ] } ], "properties": { "Node name for S&R": "VAELoader", "models": [ { "name": "qwen_image_2.1_vae_bf16.safetensors", "url": "https://huggingface.co/Comfy-Org/Qwen-Image-2.1/resolve/main/vae/qwen_image_2.1_vae_bf16.safetensors", "directory": "vae" } ] }, "widgets_values": [ "qwen_image_2.1_vae_bf16.safetensors" ], "widgets_values_named": { "vae_name": "qwen_image_2.1_vae_bf16.safetensors" } }, { "id": 6, "type": "PrimitiveStringMultiline", "pos": [ 976.9, 0 ], "size": [ 440, 220 ], "flags": {}, "order": 5, "mode": 0, "showAdvanced": null, "inputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "value", "locked": null, "name": "value", "nameLocked": null, "removable": null, "shape": null, "type": "STRING", "widget": { "name": "value" }, "link": null } ], "outputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "STRING", "locked": null, "name": "STRING", "nameLocked": null, "removable": null, "shape": null, "type": "STRING", "pos": null, "slot_index": null, "links": [ 8, 14, 16 ] } ], "title": "Prompt", "properties": { "Node name for S&R": "PrimitiveStringMultiline" }, "widgets_values": [ "Soaking wet capybara taking shelter under a banana leaf in the rainy jungle, close up photo" ], "widgets_values_named": { "value": "Soaking wet capybara taking shelter under a banana leaf in the rainy jungle, close up photo" } }, { "id": 7, "type": "ResolutionSelector", "pos": [ 976.9, 310 ], "size": [ 320, 150 ], "flags": {}, "order": 6, "mode": 0, "showAdvanced": null, "inputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "aspect_ratio", "locked": null, "name": "aspect_ratio", "nameLocked": null, "removable": null, "shape": null, "type": "COMBO", "widget": { "name": "aspect_ratio" }, "link": null }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "megapixels", "locked": null, "name": "megapixels", "nameLocked": null, "removable": null, "shape": null, "type": "FLOAT", "widget": { "name": "megapixels" }, "link": null }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "multiple", "locked": null, "name": "multiple", "nameLocked": null, "removable": null, "shape": null, "type": "INT", "widget": { "name": "multiple" }, "link": null }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "preview", "locked": null, "name": "preview", "nameLocked": null, "removable": null, "shape": 7, "type": "RESOLUTION_PREVIEW", "widget": { "name": "preview" }, "link": null } ], "outputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "width", "locked": null, "name": "width", "nameLocked": null, "removable": null, "shape": null, "type": "INT", "pos": null, "slot_index": null, "links": [ 6, 29 ] }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "height", "locked": null, "name": "height", "nameLocked": null, "removable": null, "shape": null, "type": "INT", "pos": null, "slot_index": null, "links": [ 7, 30 ] } ], "title": "Output size", "properties": { "Node name for S&R": "ResolutionSelector" }, "widgets_values": [ "3:2 (Photo)", 1, 32 ], "widgets_values_named": { "aspect_ratio": "3:2 (Photo)", "megapixels": 1, "multiple": 32 } }, { "id": 8, "type": "EmptyLatentImage", "pos": [ 976.9, 550 ], "size": [ 320, 106 ], "flags": {}, "order": 7, "mode": 0, "showAdvanced": null, "inputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "width", "locked": null, "name": "width", "nameLocked": null, "removable": null, "shape": null, "type": "INT", "widget": { "name": "width" }, "link": 6 }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "height", "locked": null, "name": "height", "nameLocked": null, "removable": null, "shape": null, "type": "INT", "widget": { "name": "height" }, "link": 7 }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "batch_size", "locked": null, "name": "batch_size", "nameLocked": null, "removable": null, "shape": null, "type": "INT", "widget": { "name": "batch_size" }, "link": null } ], "outputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "LATENT", "locked": null, "name": "LATENT", "nameLocked": null, "removable": null, "shape": null, "type": "LATENT", "pos": null, "slot_index": null, "links": [ 31, 32 ] } ], "properties": { "Node name for S&R": "EmptyLatentImage" }, "widgets_values": [ 1024, 1024, 1 ], "widgets_values_named": { "width": 1024, "height": 1024, "batch_size": 1 } }, { "id": 9, "type": "PrimitiveBoolean", "pos": [ 1496.9, 0 ], "size": [ 320, 58 ], "flags": {}, "order": 8, "mode": 0, "showAdvanced": null, "inputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "value", "locked": null, "name": "value", "nameLocked": null, "removable": null, "shape": null, "type": "BOOLEAN", "widget": { "name": "value" }, "link": null } ], "outputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "BOOLEAN", "locked": null, "name": "BOOLEAN", "nameLocked": null, "removable": null, "shape": null, "type": "BOOLEAN", "pos": null, "slot_index": null, "links": [ 18 ] } ], "title": "Enhance prompt", "properties": { "Node name for S&R": "PrimitiveBoolean" }, "widgets_values": [ true ], "widgets_values_named": { "value": true } }, { "id": 10, "type": "PrimitiveStringMultiline", "pos": [ 1496.9, 148 ], "size": [ 440, 180 ], "flags": {}, "order": 9, "mode": 0, "showAdvanced": null, "inputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "value", "locked": null, "name": "value", "nameLocked": null, "removable": null, "shape": null, "type": "STRING", "widget": { "name": "value" }, "link": null } ], "outputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "STRING", "locked": null, "name": "STRING", "nameLocked": null, "removable": null, "shape": null, "type": "STRING", "pos": null, "slot_index": null, "links": [ 9 ] } ], "title": "PE system prompt (official Qwen-Image-2.1 T2I rewriter)", "properties": { "Node name for S&R": "PrimitiveStringMultiline" }, "widgets_values": [ "# Image Prompt Rewriting Expert\n\nYou turn a user's image request into one long English paragraph that describes the\nfinished image as if you were looking at it, plus the aspect ratio it should be\nrendered at. You are not talking to the user and not talking to a renderer: you are\nan observer reporting what is in the frame.\n\nWork through the eight steps below in order. Each step commits one decision; later\nsteps never revise an earlier one.\n\n## Step 1 — Read the brief and split it in two\n\nList what the user has fixed and what they have left open.\n\nFixed, and it must survive into your description unchanged: every string of text\nthey want shown, every named object, every count, every stated colour, every stated\nposition, and the aspect ratio if they gave one. Copy their text strings character\nfor character, in their own script, including punctuation and spacing.\n\nA third thing they may give you is an instruction about the job rather than about the\npicture — \"use double quotes\", \"no hard-edged blocks\", \"4K, no noise\", \"make sure the\ntext is sharp\". That is not content. Obey it silently where it applies and never echo\nit: the description states what is in the frame, never what must be done.\n\nOpen, and you must decide it: everything they did not mention. A three-word request\nand a three-hundred-word request both become a description of the same size, so a\nshort brief means you are inventing most of the frame, not writing less.\n\n## Step 2 — Fix the frame\n\nDecide the orientation from the subject, then pick the ratio.\n\nIf the user states a ratio, use it. Otherwise: `3:2` for anything horizontal and\n`2:3` for anything vertical — these are the two defaults and cover most images.\nUse `1:1` for a square badge, icon, album cover or single centred emblem, `16:9`\nfor a wide cinematic or presentation frame, `1:2` or `9:16` for a phone screen or a\ntall standing banner. `3:4`, `2:1`, `21:9`, `4:3`, `9:21`, `4:5`, `3:1`, `5:4`,\n`1:3` exist but only when the subject or the user really calls for them.\n\nThe ratio lives only in the `wh_ratio` field. Never write a ratio, a resolution, or\na pixel count into the description itself.\n\n## Step 3 — Write the opening sentence\n\nOne sentence, around twenty words. Name the medium, the style, the subject, and the\nbackground or palette; usually name the orientation too:\n\n`The image is a ⟨vertical / wide / square / tall⟩ ⟨style⟩ ⟨photograph · poster · illustration · scene · portrait · infographic · close-up · graphic · page · card · sheet · logo⟩ of ⟨subject⟩, ⟨the background and its palette⟩.`\n\n`This is a …` or a bare `A vertical realistic photograph of …` work equally well. The\nmedium noun is the one part that is never omitted.\n\nThe style word goes here — realistic, photorealistic, minimalist, flat-vector,\ncinematic, watercolour, isometric, editorial, hand-drawn, 3D-rendered, retro. Name\nit once here; you may echo it in the closing sentence.\n\n## Step 4 — Inventory before you write\n\nBefore any more prose, settle two lists.\n\nEvery element that will appear, each with a place in the frame: upper-left,\nacross the top, on the far right, in the lower-third, in the centre, in front of,\nbehind, tucked into the corner. You will need eight to fourteen such positional\nphrases, about ten typically, and they must reach the corners, the edges and the\ncentre — not cluster in the middle.\n\nEvery piece of text that will be legible in the image, in reading order.\n\n## Step 5 — Walk the frame\n\nNow describe it in order. Which order depends on how the frame is filled.\n\n**If the frame is divided into regions** — a poster, a page, an interface, a layout, a\nwide scene with several things in it — walk the regions:\n\n1. The background and the surface it sits on — this comes immediately after the\n opening sentence, not at the end.\n2. The top band: headline, header bar, sky, ceiling, whatever occupies the top edge.\n3. Down and across the body of the frame: left side, then centre, then right side.\n Give each region one or two sentences.\n4. The bottom band: footer, foreground, ground plane, base row.\n\n**If one subject fills the frame** — a portrait, a close-up, a single object — walk\nthe subject instead: the background and how far it falls off, then the subject's pose\nand where it is placed in the frame, then head and face, then body and each garment or\nsurface, then what is held or touching it, then whatever little is left at the edges.\nKeep using positional phrases inside the subject — in the upper-left of the frame,\nbehind the left shoulder, along the lower edge — so the frame stays locatable.\n\nRoughly a third of your sentences should open on the positional phrase itself —\n\"On the right side of the frame, …\", \"In the upper-left corner, …\", \"Across the\nlower third, …\" — so the reader always knows where they are looking.\n\nKeep it to one paragraph. Break to a new paragraph only when the image is genuinely\nbuilt from stacked regions — panels, cards, sections, slides — and then one\nparagraph per region, each opening on where that region sits.\n\n## Step 6 — Set every piece of text\n\nSkip this step if nothing in the image is meant to be read — a third of images have\nno legible text at all, and inventing signage for them is a mistake.\n\nOtherwise, for each string from your Step 4 list, in reading order, name where it sits,\nwhat it looks like, and what it says: `a bold black headline across the top reads \"…\"`.\n\nPut the string in straight double quotes, in its own script — Chinese, Russian,\nKorean, Japanese and Arabic text stays in Chinese, Russian, Korean, Japanese and\nArabic. Give its weight, colour, case and relative size. Describe a line break as a\nsecond line rather than putting a real newline inside the string. If a mark is not meant\nto be read — distant signage, a label behind glass, dense body copy — call it\nblurred, indistinct, or too small to read rather than inventing letters. If the image contains a chart\nor a table, its axes, tick labels, legend entries, series and cell values are text\ntoo: write them out.\n\n## Step 7 — Give the lighting its own sentence\n\nEvery image has light in it, and the description always accounts for it: the source,\nits direction, its quality, and the shadows and highlights it leaves. Soft diffused\ndaylight from a window on the left, hard overhead studio light, warm low sun, flat\neven ambient light for a diagram.\n\nOnce the contents are placed, give it a sentence of its own — `The lighting is …` —\nor, if the light is what makes a particular surface look the way it does, fold it into\nthat surface's sentence. Either way it is stated explicitly, not left implied.\n\n## Step 8 — Close with the whole frame\n\nEnd on a single sentence that steps back:\n\n`The overall composition ⟨is / uses / feels⟩ …`\n\n`The composition is …`, `The overall design …`, `The overall mood …`, `The overall\npalette …` and `The image has …` are the same move. Cover balance and symmetry, the\npalette, the style, and the mood in that one sentence. Write exactly one such\nsentence — do not follow it with a second summary.\n\n## Throughout\n\n**Size.** The description runs about twenty sentences and four to five hundred words,\nroughly twenty-five words a sentence. That is the same size whether the brief was three\nwords or three hundred: a dense frame with many regions and a lot of text runs longer, a\nsingle quiet subject runs shorter, but a thin brief never buys a thin description.\n\n**Observe, don't instruct.** Present tense, third person, declarative. No \"you\", no\n\"create\", no \"make sure\", no \"the AI should\". No quality boosters — no \"masterpiece\",\n\"8K\", \"highly detailed\", \"award-winning\".\n\n**Hedge what you cannot be certain of.** An observer describing a picture says\n\"appears to be\", \"likely\", \"suggesting\", and offers a pair — \"a notebook\nor a tablet\", \"wood or dark laminate\" — when the thing is genuinely ambiguous. Do\nthis often; it is the natural register here. Be flatly definite only about what the\nuser fixed.\n\n**Name colours with a modifier, almost never bare.** Deep navy, muted olive, pale\ncream, warm terracotta, soft dusty rose, blue-grey, off-white, charcoal, brownish-\ngreen. Hex codes only if the user gave them.\n\n**Give the material, not just the noun.** Brushed metal, matte plastic, glossy\nceramic, coarse linen, weathered wood, frosted glass, grain, scuffs, condensation,\nvisible brush strokes, paper fibre.\n\n**Enumerate; never summarise.** \"Several items\" and \"various decorations\" are not\ndescriptions. Say what each thing is. Write small counts as words — three, five,\ntwelve — and if something is partly hidden, say so and describe the visible part.\n\n**People get their observable surface.** Build, posture, where they are looking,\nexpression, hair, skin tone, and each garment with its colour and material. Age is a\nlife stage or a decade — a child, a teenager, a young adult, middle-aged, elderly,\nin her thirties — never a number of years. If a face is turned away or cropped, say\nthat instead of describing it.\n\n**Objects by class, not by brand.** A silver laptop, a mirrorless camera, a compact\nhatchback — unless the user named the brand. Photographic and design vocabulary is\nwelcome: shallow depth of field, bokeh, backlit, close-up, negative space,\ngrid, drop shadow.\n\n**Everything holds together physically.** Shadows fall away from the light, reflections\nmatch what is in front of the surface, scale is consistent between neighbouring\nobjects, and a surface reacts to what sits on it. If the user asked for something\nimpossible, describe it as the image shows it and let the rest of the scene stay\ncoherent around it.\n\n## Language\n\nThe description is always in English, whatever language the request arrives in. The\nonly exception is text shown inside the image, which stays in its own script.\n\n## Output format\n\nReturn one strictly valid JSON object on a single line, nothing before or after:\n\n{\"rewritten_prompt\": \"\", \"wh_ratio\": \"\"}" ], "widgets_values_named": { "value": "# Image Prompt Rewriting Expert\n\nYou turn a user's image request into one long English paragraph that describes the\nfinished image as if you were looking at it, plus the aspect ratio it should be\nrendered at. You are not talking to the user and not talking to a renderer: you are\nan observer reporting what is in the frame.\n\nWork through the eight steps below in order. Each step commits one decision; later\nsteps never revise an earlier one.\n\n## Step 1 — Read the brief and split it in two\n\nList what the user has fixed and what they have left open.\n\nFixed, and it must survive into your description unchanged: every string of text\nthey want shown, every named object, every count, every stated colour, every stated\nposition, and the aspect ratio if they gave one. Copy their text strings character\nfor character, in their own script, including punctuation and spacing.\n\nA third thing they may give you is an instruction about the job rather than about the\npicture — \"use double quotes\", \"no hard-edged blocks\", \"4K, no noise\", \"make sure the\ntext is sharp\". That is not content. Obey it silently where it applies and never echo\nit: the description states what is in the frame, never what must be done.\n\nOpen, and you must decide it: everything they did not mention. A three-word request\nand a three-hundred-word request both become a description of the same size, so a\nshort brief means you are inventing most of the frame, not writing less.\n\n## Step 2 — Fix the frame\n\nDecide the orientation from the subject, then pick the ratio.\n\nIf the user states a ratio, use it. Otherwise: `3:2` for anything horizontal and\n`2:3` for anything vertical — these are the two defaults and cover most images.\nUse `1:1` for a square badge, icon, album cover or single centred emblem, `16:9`\nfor a wide cinematic or presentation frame, `1:2` or `9:16` for a phone screen or a\ntall standing banner. `3:4`, `2:1`, `21:9`, `4:3`, `9:21`, `4:5`, `3:1`, `5:4`,\n`1:3` exist but only when the subject or the user really calls for them.\n\nThe ratio lives only in the `wh_ratio` field. Never write a ratio, a resolution, or\na pixel count into the description itself.\n\n## Step 3 — Write the opening sentence\n\nOne sentence, around twenty words. Name the medium, the style, the subject, and the\nbackground or palette; usually name the orientation too:\n\n`The image is a ⟨vertical / wide / square / tall⟩ ⟨style⟩ ⟨photograph · poster · illustration · scene · portrait · infographic · close-up · graphic · page · card · sheet · logo⟩ of ⟨subject⟩, ⟨the background and its palette⟩.`\n\n`This is a …` or a bare `A vertical realistic photograph of …` work equally well. The\nmedium noun is the one part that is never omitted.\n\nThe style word goes here — realistic, photorealistic, minimalist, flat-vector,\ncinematic, watercolour, isometric, editorial, hand-drawn, 3D-rendered, retro. Name\nit once here; you may echo it in the closing sentence.\n\n## Step 4 — Inventory before you write\n\nBefore any more prose, settle two lists.\n\nEvery element that will appear, each with a place in the frame: upper-left,\nacross the top, on the far right, in the lower-third, in the centre, in front of,\nbehind, tucked into the corner. You will need eight to fourteen such positional\nphrases, about ten typically, and they must reach the corners, the edges and the\ncentre — not cluster in the middle.\n\nEvery piece of text that will be legible in the image, in reading order.\n\n## Step 5 — Walk the frame\n\nNow describe it in order. Which order depends on how the frame is filled.\n\n**If the frame is divided into regions** — a poster, a page, an interface, a layout, a\nwide scene with several things in it — walk the regions:\n\n1. The background and the surface it sits on — this comes immediately after the\n opening sentence, not at the end.\n2. The top band: headline, header bar, sky, ceiling, whatever occupies the top edge.\n3. Down and across the body of the frame: left side, then centre, then right side.\n Give each region one or two sentences.\n4. The bottom band: footer, foreground, ground plane, base row.\n\n**If one subject fills the frame** — a portrait, a close-up, a single object — walk\nthe subject instead: the background and how far it falls off, then the subject's pose\nand where it is placed in the frame, then head and face, then body and each garment or\nsurface, then what is held or touching it, then whatever little is left at the edges.\nKeep using positional phrases inside the subject — in the upper-left of the frame,\nbehind the left shoulder, along the lower edge — so the frame stays locatable.\n\nRoughly a third of your sentences should open on the positional phrase itself —\n\"On the right side of the frame, …\", \"In the upper-left corner, …\", \"Across the\nlower third, …\" — so the reader always knows where they are looking.\n\nKeep it to one paragraph. Break to a new paragraph only when the image is genuinely\nbuilt from stacked regions — panels, cards, sections, slides — and then one\nparagraph per region, each opening on where that region sits.\n\n## Step 6 — Set every piece of text\n\nSkip this step if nothing in the image is meant to be read — a third of images have\nno legible text at all, and inventing signage for them is a mistake.\n\nOtherwise, for each string from your Step 4 list, in reading order, name where it sits,\nwhat it looks like, and what it says: `a bold black headline across the top reads \"…\"`.\n\nPut the string in straight double quotes, in its own script — Chinese, Russian,\nKorean, Japanese and Arabic text stays in Chinese, Russian, Korean, Japanese and\nArabic. Give its weight, colour, case and relative size. Describe a line break as a\nsecond line rather than putting a real newline inside the string. If a mark is not meant\nto be read — distant signage, a label behind glass, dense body copy — call it\nblurred, indistinct, or too small to read rather than inventing letters. If the image contains a chart\nor a table, its axes, tick labels, legend entries, series and cell values are text\ntoo: write them out.\n\n## Step 7 — Give the lighting its own sentence\n\nEvery image has light in it, and the description always accounts for it: the source,\nits direction, its quality, and the shadows and highlights it leaves. Soft diffused\ndaylight from a window on the left, hard overhead studio light, warm low sun, flat\neven ambient light for a diagram.\n\nOnce the contents are placed, give it a sentence of its own — `The lighting is …` —\nor, if the light is what makes a particular surface look the way it does, fold it into\nthat surface's sentence. Either way it is stated explicitly, not left implied.\n\n## Step 8 — Close with the whole frame\n\nEnd on a single sentence that steps back:\n\n`The overall composition ⟨is / uses / feels⟩ …`\n\n`The composition is …`, `The overall design …`, `The overall mood …`, `The overall\npalette …` and `The image has …` are the same move. Cover balance and symmetry, the\npalette, the style, and the mood in that one sentence. Write exactly one such\nsentence — do not follow it with a second summary.\n\n## Throughout\n\n**Size.** The description runs about twenty sentences and four to five hundred words,\nroughly twenty-five words a sentence. That is the same size whether the brief was three\nwords or three hundred: a dense frame with many regions and a lot of text runs longer, a\nsingle quiet subject runs shorter, but a thin brief never buys a thin description.\n\n**Observe, don't instruct.** Present tense, third person, declarative. No \"you\", no\n\"create\", no \"make sure\", no \"the AI should\". No quality boosters — no \"masterpiece\",\n\"8K\", \"highly detailed\", \"award-winning\".\n\n**Hedge what you cannot be certain of.** An observer describing a picture says\n\"appears to be\", \"likely\", \"suggesting\", and offers a pair — \"a notebook\nor a tablet\", \"wood or dark laminate\" — when the thing is genuinely ambiguous. Do\nthis often; it is the natural register here. Be flatly definite only about what the\nuser fixed.\n\n**Name colours with a modifier, almost never bare.** Deep navy, muted olive, pale\ncream, warm terracotta, soft dusty rose, blue-grey, off-white, charcoal, brownish-\ngreen. Hex codes only if the user gave them.\n\n**Give the material, not just the noun.** Brushed metal, matte plastic, glossy\nceramic, coarse linen, weathered wood, frosted glass, grain, scuffs, condensation,\nvisible brush strokes, paper fibre.\n\n**Enumerate; never summarise.** \"Several items\" and \"various decorations\" are not\ndescriptions. Say what each thing is. Write small counts as words — three, five,\ntwelve — and if something is partly hidden, say so and describe the visible part.\n\n**People get their observable surface.** Build, posture, where they are looking,\nexpression, hair, skin tone, and each garment with its colour and material. Age is a\nlife stage or a decade — a child, a teenager, a young adult, middle-aged, elderly,\nin her thirties — never a number of years. If a face is turned away or cropped, say\nthat instead of describing it.\n\n**Objects by class, not by brand.** A silver laptop, a mirrorless camera, a compact\nhatchback — unless the user named the brand. Photographic and design vocabulary is\nwelcome: shallow depth of field, bokeh, backlit, close-up, negative space,\ngrid, drop shadow.\n\n**Everything holds together physically.** Shadows fall away from the light, reflections\nmatch what is in front of the surface, scale is consistent between neighbouring\nobjects, and a surface reacts to what sits on it. If the user asked for something\nimpossible, describe it as the image shows it and let the rest of the scene stay\ncoherent around it.\n\n## Language\n\nThe description is always in English, whatever language the request arrives in. The\nonly exception is text shown inside the image, which stays in its own script.\n\n## Output format\n\nReturn one strictly valid JSON object on a single line, nothing before or after:\n\n{\"rewritten_prompt\": \"\", \"wh_ratio\": \"\"}" } }, { "id": 11, "type": "StringFormat", "pos": [ 1496.9, 418 ], "size": [ 320, 148 ], "flags": {}, "order": 10, "mode": 0, "showAdvanced": null, "inputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "a", "locked": null, "name": "values.a", "nameLocked": null, "removable": null, "shape": 7, "type": "*", "pos": null, "link": 8 }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "b", "locked": null, "name": "values.b", "nameLocked": null, "removable": null, "shape": 7, "type": "*", "pos": null, "link": 29 }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "c", "locked": null, "name": "values.c", "nameLocked": null, "removable": null, "shape": 7, "type": "*", "pos": null, "link": 30 }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "d", "locked": null, "name": "values.d", "nameLocked": null, "removable": null, "shape": 7, "type": "*", "pos": null, "link": null }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "f_string", "locked": null, "name": "f_string", "nameLocked": null, "removable": null, "shape": null, "type": "STRING", "widget": { "name": "f_string" }, "link": null } ], "outputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "STRING", "locked": null, "name": "STRING", "nameLocked": null, "removable": null, "shape": null, "type": "STRING", "pos": null, "slot_index": null, "links": [ 10 ] } ], "title": "PE request", "properties": { "Node name for S&R": "StringFormat" }, "widgets_values": [ "{a}\nAspect ratio: {b}:{c}" ], "widgets_values_named": { "f_string": "{a}\nAspect ratio: {b}:{c}" } }, { "id": 12, "type": "TextGenerate", "pos": [ 2016.9, 0 ], "size": [ 320, 288 ], "flags": {}, "order": 11, "mode": 0, "showAdvanced": null, "inputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "clip", "locked": null, "name": "clip", "nameLocked": null, "removable": null, "shape": null, "type": "CLIP", "pos": null, "link": 3 }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "image", "locked": null, "name": "image", "nameLocked": null, "removable": null, "shape": 7, "type": "IMAGE", "pos": null, "link": null }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "video", "locked": null, "name": "video", "nameLocked": null, "removable": null, "shape": 7, "type": "IMAGE", "pos": null, "link": null }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "audio", "locked": null, "name": "audio", "nameLocked": null, "removable": null, "shape": 7, "type": "AUDIO", "pos": null, "link": null }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "system_prompt", "locked": null, "name": "system_prompt", "nameLocked": null, "removable": null, "shape": 7, "type": "STRING", "pos": null, "link": 9 }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "prompt", "locked": null, "name": "prompt", "nameLocked": null, "removable": null, "shape": null, "type": "STRING", "widget": { "name": "prompt" }, "link": 10 }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "max_length", "locked": null, "name": "max_length", "nameLocked": null, "removable": null, "shape": null, "type": "INT", "widget": { "name": "max_length" }, "link": null }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "Sampling Mode", "locked": null, "name": "sampling_mode", "nameLocked": null, "removable": null, "shape": null, "type": "COMFY_DYNAMICCOMBO_V3", "widget": { "name": "sampling_mode" }, "link": null }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "thinking", "locked": null, "name": "thinking", "nameLocked": null, "removable": null, "shape": 7, "type": "BOOLEAN", "widget": { "name": "thinking" }, "link": null }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "use_default_template", "locked": null, "name": "use_default_template", "nameLocked": null, "removable": null, "shape": 7, "type": "BOOLEAN", "widget": { "name": "use_default_template" }, "link": null }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "mtp", "locked": null, "name": "mtp", "nameLocked": null, "removable": null, "shape": 7, "type": "COMBO", "widget": { "name": "mtp" }, "link": null } ], "outputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "generated_text", "locked": null, "name": "generated_text", "nameLocked": null, "removable": null, "shape": null, "type": "STRING", "pos": null, "slot_index": null, "links": [ 11 ] }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "thinking", "locked": null, "name": "thinking", "nameLocked": null, "removable": null, "shape": null, "type": "STRING", "pos": null, "slot_index": null, "links": null } ], "title": "Rewrite prompt (Qwen3-VL text encoder)", "properties": { "Node name for S&R": "TextGenerate" }, "widgets_values": [ "", 512, "off", true, true, "auto" ], "widgets_values_named": { "prompt": "", "max_length": 512, "sampling_mode": "off", "thinking": true, "use_default_template": true, "mtp": "auto" } }, { "id": 13, "type": "JsonExtractString", "pos": [ 2016.9, 378 ], "size": [ 320, 112 ], "flags": {}, "order": 12, "mode": 0, "showAdvanced": null, "inputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "json_string", "locked": null, "name": "json_string", "nameLocked": null, "removable": null, "shape": null, "type": "STRING", "widget": { "name": "json_string" }, "link": 11 }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "key", "locked": null, "name": "key", "nameLocked": null, "removable": null, "shape": null, "type": "STRING", "widget": { "name": "key" }, "link": null } ], "outputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "STRING", "locked": null, "name": "STRING", "nameLocked": null, "removable": null, "shape": null, "type": "STRING", "pos": null, "slot_index": null, "links": [ 12, 13 ] } ], "properties": { "Node name for S&R": "JsonExtractString" }, "widgets_values": [ "", "rewritten_prompt" ], "widgets_values_named": { "json_string": "", "key": "rewritten_prompt" } }, { "id": 14, "type": "StringCompare", "pos": [ 2016.9, 580 ], "size": [ 320, 190 ], "flags": {}, "order": 13, "mode": 0, "showAdvanced": null, "inputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "string_a", "locked": null, "name": "string_a", "nameLocked": null, "removable": null, "shape": null, "type": "STRING", "widget": { "name": "string_a" }, "link": 12 }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "string_b", "locked": null, "name": "string_b", "nameLocked": null, "removable": null, "shape": null, "type": "STRING", "widget": { "name": "string_b" }, "link": null }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "mode", "locked": null, "name": "mode", "nameLocked": null, "removable": null, "shape": null, "type": "COMBO", "widget": { "name": "mode" }, "link": null }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "case_sensitive", "locked": null, "name": "case_sensitive", "nameLocked": null, "removable": null, "shape": null, "type": "BOOLEAN", "widget": { "name": "case_sensitive" }, "link": null } ], "outputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "BOOLEAN", "locked": null, "name": "BOOLEAN", "nameLocked": null, "removable": null, "shape": null, "type": "BOOLEAN", "pos": null, "slot_index": null, "links": [ 15 ] } ], "title": "Rewrite failed?", "properties": { "Node name for S&R": "StringCompare" }, "widgets_values": [ "", "", "Equal", true ], "widgets_values_named": { "string_a": "", "string_b": "", "mode": "Equal", "case_sensitive": true } }, { "id": 15, "type": "ComfySwitchNode", "pos": [ 2416.9, 0 ], "size": [ 320, 78 ], "flags": {}, "order": 14, "mode": 0, "showAdvanced": null, "inputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "on_false", "locked": null, "name": "on_false", "nameLocked": null, "removable": null, "shape": 7, "type": "STRING", "pos": null, "link": 13 }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "on_true", "locked": null, "name": "on_true", "nameLocked": null, "removable": null, "shape": 7, "type": "STRING", "pos": null, "link": 14 }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "switch", "locked": null, "name": "switch", "nameLocked": null, "removable": null, "shape": null, "type": "BOOLEAN", "widget": { "name": "switch" }, "link": 15 } ], "outputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "output", "locked": null, "name": "output", "nameLocked": null, "removable": null, "shape": null, "type": "STRING", "pos": null, "slot_index": null, "links": [ 17 ] } ], "title": "Fall back to the original prompt", "properties": { "Node name for S&R": "ComfySwitchNode" }, "widgets_values": [ false ], "widgets_values_named": { "switch": false } }, { "id": 16, "type": "ComfySwitchNode", "pos": [ 2416.9, 168 ], "size": [ 320, 78 ], "flags": {}, "order": 15, "mode": 0, "showAdvanced": null, "inputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "on_false", "locked": null, "name": "on_false", "nameLocked": null, "removable": null, "shape": 7, "type": "STRING", "pos": null, "link": 16 }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "on_true", "locked": null, "name": "on_true", "nameLocked": null, "removable": null, "shape": 7, "type": "STRING", "pos": null, "link": 17 }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "switch", "locked": null, "name": "switch", "nameLocked": null, "removable": null, "shape": null, "type": "BOOLEAN", "widget": { "name": "switch" }, "link": 18 } ], "outputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "output", "locked": null, "name": "output", "nameLocked": null, "removable": null, "shape": null, "type": "STRING", "pos": null, "slot_index": null, "links": [ 19, 20 ] } ], "title": "Enhanced or original", "properties": { "Node name for S&R": "ComfySwitchNode" }, "widgets_values": [ false ], "widgets_values_named": { "switch": false } }, { "id": 17, "type": "PreviewAny", "pos": [ 2416.9, 336 ], "size": [ 440, 260 ], "flags": {}, "order": 16, "mode": 0, "showAdvanced": null, "inputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "source", "locked": null, "name": "source", "nameLocked": null, "removable": null, "shape": null, "type": "*", "pos": null, "link": 19 } ], "outputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "STRING", "locked": null, "name": "STRING", "nameLocked": null, "removable": null, "shape": null, "type": "STRING", "pos": null, "slot_index": null, "links": null } ], "title": "Prompt used", "properties": { "Node name for S&R": "PreviewAny" }, "widgets_values": [], "widgets_values_named": {} }, { "id": 18, "type": "TextEncodeQwenImage21", "pos": [ 2936.9, 0 ], "size": [ 320, 206 ], "flags": {}, "order": 17, "mode": 0, "showAdvanced": null, "inputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "clip", "locked": null, "name": "clip", "nameLocked": null, "removable": null, "shape": null, "type": "CLIP", "pos": null, "link": 2 }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "image_1", "locked": null, "name": "images.image_1", "nameLocked": null, "removable": null, "shape": 7, "type": "IMAGE", "pos": null, "link": null }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "vae", "locked": null, "name": "vae", "nameLocked": null, "removable": null, "shape": 7, "type": "VAE", "pos": null, "link": 4 }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "prompt", "locked": null, "name": "prompt", "nameLocked": null, "removable": null, "shape": null, "type": "STRING", "widget": { "name": "prompt" }, "link": 20 }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "negative_prompt", "locked": null, "name": "negative_prompt", "nameLocked": null, "removable": null, "shape": null, "type": "STRING", "widget": { "name": "negative_prompt" }, "link": null }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "resolution", "locked": null, "name": "resolution", "nameLocked": null, "removable": null, "shape": null, "type": "INT", "widget": { "name": "resolution" }, "link": null } ], "outputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "positive", "locked": null, "name": "positive", "nameLocked": null, "removable": null, "shape": null, "type": "CONDITIONING", "pos": null, "slot_index": null, "links": [ 21 ] }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "negative", "locked": null, "name": "negative", "nameLocked": null, "removable": null, "shape": null, "type": "CONDITIONING", "pos": null, "slot_index": null, "links": null }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "latent", "locked": null, "name": "latent", "nameLocked": null, "removable": null, "shape": null, "type": "LATENT", "pos": null, "slot_index": null, "links": null } ], "properties": { "Node name for S&R": "TextEncodeQwenImage21" }, "widgets_values": [ "", "", 1024 ], "widgets_values_named": { "prompt": "", "negative_prompt": "", "resolution": 1024 } }, { "id": 19, "type": "BasicGuider", "pos": [ 2936.9, 296 ], "size": [ 320, 46 ], "flags": {}, "order": 18, "mode": 0, "showAdvanced": null, "inputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "model", "locked": null, "name": "model", "nameLocked": null, "removable": null, "shape": null, "type": "MODEL", "pos": null, "link": 28 }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "conditioning", "locked": null, "name": "conditioning", "nameLocked": null, "removable": null, "shape": null, "type": "CONDITIONING", "pos": null, "link": 21 } ], "outputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "GUIDER", "locked": null, "name": "GUIDER", "nameLocked": null, "removable": null, "shape": null, "type": "GUIDER", "pos": null, "slot_index": null, "links": [ 23 ] } ], "title": "BasicGuider (CFG off)", "properties": { "Node name for S&R": "BasicGuider" } }, { "id": 20, "type": "RandomNoise", "pos": [ 2936.9, 432 ], "size": [ 320, 82 ], "flags": {}, "order": 19, "mode": 0, "showAdvanced": null, "inputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "noise_seed", "locked": null, "name": "noise_seed", "nameLocked": null, "removable": null, "shape": null, "type": "INT", "widget": { "name": "noise_seed" }, "link": null } ], "outputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "NOISE", "locked": null, "name": "NOISE", "nameLocked": null, "removable": null, "shape": null, "type": "NOISE", "pos": null, "slot_index": null, "links": [ 22 ] } ], "properties": { "Node name for S&R": "RandomNoise" }, "widgets_values": [ 0, "randomize" ], "widgets_values_named": { "noise_seed": 0, "control_after_generate": "randomize" } }, { "id": 21, "type": "KSamplerSelect", "pos": [ 2936.9, 604 ], "size": [ 320, 58 ], "flags": {}, "order": 20, "mode": 0, "showAdvanced": null, "inputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "sampler_name", "locked": null, "name": "sampler_name", "nameLocked": null, "removable": null, "shape": null, "type": "COMBO", "widget": { "name": "sampler_name" }, "link": null } ], "outputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "SAMPLER", "locked": null, "name": "SAMPLER", "nameLocked": null, "removable": null, "shape": null, "type": "SAMPLER", "pos": null, "slot_index": null, "links": [ 24 ] } ], "properties": { "Node name for S&R": "KSamplerSelect" }, "widgets_values": [ "euler" ], "widgets_values_named": { "sampler_name": "euler" } }, { "id": 22, "type": "ViggleTurboSigmas", "pos": [ 2936.9, 752 ], "size": [ 320, 58 ], "flags": {}, "order": 21, "mode": 0, "showAdvanced": null, "inputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "latent", "locked": null, "name": "latent", "nameLocked": null, "removable": null, "shape": null, "type": "LATENT", "pos": null, "link": 31 }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "nodes", "locked": null, "name": "nodes", "nameLocked": null, "removable": null, "shape": null, "type": "STRING", "widget": { "name": "nodes" }, "link": null } ], "outputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "SIGMAS", "locked": null, "name": "SIGMAS", "nameLocked": null, "removable": null, "shape": null, "type": "SIGMAS", "pos": null, "slot_index": null, "links": [ 25 ] } ], "properties": { "Node name for S&R": "ViggleTurboSigmas" }, "widgets_values": [ "1.0, 0.9375, 0.875, 0.75, 0.5, 0.25" ], "widgets_values_named": { "nodes": "1.0, 0.9375, 0.875, 0.75, 0.5, 0.25" } }, { "id": 23, "type": "SamplerCustomAdvanced", "pos": [ 3336.9, 0 ], "size": [ 320, 106 ], "flags": {}, "order": 22, "mode": 0, "showAdvanced": null, "inputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "noise", "locked": null, "name": "noise", "nameLocked": null, "removable": null, "shape": null, "type": "NOISE", "pos": null, "link": 22 }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "guider", "locked": null, "name": "guider", "nameLocked": null, "removable": null, "shape": null, "type": "GUIDER", "pos": null, "link": 23 }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "sampler", "locked": null, "name": "sampler", "nameLocked": null, "removable": null, "shape": null, "type": "SAMPLER", "pos": null, "link": 24 }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "sigmas", "locked": null, "name": "sigmas", "nameLocked": null, "removable": null, "shape": null, "type": "SIGMAS", "pos": null, "link": 25 }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "latent_image", "locked": null, "name": "latent_image", "nameLocked": null, "removable": null, "shape": null, "type": "LATENT", "pos": null, "link": 32 } ], "outputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "output", "locked": null, "name": "output", "nameLocked": null, "removable": null, "shape": null, "type": "LATENT", "pos": null, "slot_index": null, "links": [ 26 ] }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "denoised_output", "locked": null, "name": "denoised_output", "nameLocked": null, "removable": null, "shape": null, "type": "LATENT", "pos": null, "slot_index": null, "links": null } ], "properties": { "Node name for S&R": "SamplerCustomAdvanced" } }, { "id": 24, "type": "VAEDecode", "pos": [ 3336.9, 196 ], "size": [ 320, 46 ], "flags": {}, "order": 23, "mode": 0, "showAdvanced": null, "inputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "samples", "locked": null, "name": "samples", "nameLocked": null, "removable": null, "shape": null, "type": "LATENT", "pos": null, "link": 26 }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "vae", "locked": null, "name": "vae", "nameLocked": null, "removable": null, "shape": null, "type": "VAE", "pos": null, "link": 5 } ], "outputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "IMAGE", "locked": null, "name": "IMAGE", "nameLocked": null, "removable": null, "shape": null, "type": "IMAGE", "pos": null, "slot_index": null, "links": [ 27 ] } ], "properties": { "Node name for S&R": "VAEDecode" } }, { "id": 25, "type": "SaveImage", "pos": [ 3336.9, 332 ], "size": [ 520, 560 ], "flags": {}, "order": 24, "mode": 0, "showAdvanced": null, "inputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "images", "locked": null, "name": "images", "nameLocked": null, "removable": null, "shape": null, "type": "IMAGE", "pos": null, "link": 27 }, { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "filename_prefix", "locked": null, "name": "filename_prefix", "nameLocked": null, "removable": null, "shape": null, "type": "STRING", "widget": { "name": "filename_prefix" }, "link": null } ], "outputs": [ { "color_off": null, "color_on": null, "dir": null, "label": null, "localized_name": "images", "locked": null, "name": "images", "nameLocked": null, "removable": null, "shape": null, "type": "IMAGE", "pos": null, "slot_index": null, "links": null } ], "properties": {}, "widgets_values": [ "viggle_turbo/t2i" ], "widgets_values_named": { "filename_prefix": "viggle_turbo/t2i" } } ], "links": [ [ 1, 2, 0, 3, 0, "MODEL" ], [ 2, 4, 0, 18, 0, "CLIP" ], [ 4, 5, 0, 18, 2, "VAE" ], [ 5, 5, 0, 24, 1, "VAE" ], [ 6, 7, 0, 8, 0, "INT" ], [ 7, 7, 1, 8, 1, "INT" ], [ 11, 12, 0, 13, 0, "STRING" ], [ 12, 13, 0, 14, 0, "STRING" ], [ 13, 13, 0, 15, 0, "STRING" ], [ 14, 6, 0, 15, 1, "STRING" ], [ 15, 14, 0, 15, 2, "BOOLEAN" ], [ 16, 6, 0, 16, 0, "STRING" ], [ 17, 15, 0, 16, 1, "STRING" ], [ 18, 9, 0, 16, 2, "BOOLEAN" ], [ 19, 16, 0, 17, 0, "STRING" ], [ 20, 16, 0, 18, 3, "STRING" ], [ 21, 18, 0, 19, 1, "CONDITIONING" ], [ 22, 20, 0, 23, 0, "NOISE" ], [ 23, 19, 0, 23, 1, "GUIDER" ], [ 24, 21, 0, 23, 2, "SAMPLER" ], [ 25, 22, 0, 23, 3, "SIGMAS" ], [ 26, 23, 0, 24, 0, "LATENT" ], [ 27, 24, 0, 25, 0, "IMAGE" ], [ 28, 3, 0, 19, 0, "MODEL" ], [ 8, 6, 0, 11, 0, "STRING" ], [ 29, 7, 0, 11, 1, "INT" ], [ 30, 7, 1, 11, 2, "INT" ], [ 31, 8, 0, 22, 0, "LATENT" ], [ 32, 8, 0, 23, 4, "LATENT" ], [ 3, 4, 0, 12, 0, "CLIP" ], [ 9, 10, 0, 12, 4, "STRING" ], [ 10, 11, 0, 12, 5, "STRING" ] ], "floatingLinks": null, "groups": [ { "id": 1, "title": "1. Models", "bounding": [ 520, -90, 396.9, 708 ], "color": "#3f789e", "flags": {} }, { "id": 2, "title": "2. Prompt & size", "bounding": [ 956.9, -90, 480.0000000000001, 766 ], "color": "#b58b2a", "flags": {} }, { "id": 3, "title": "3. Prompt enhancer (optional)", "bounding": [ 1476.9, -90, 1400, 880 ], "color": "#a1309b", "flags": {} }, { "id": 4, "title": "4. Sample: 6 steps, CFG off", "bounding": [ 2916.9, -90, 960, 1002 ], "color": "#444", "flags": {} } ], "definitions": null, "config": {}, "extra": { "ds": { "scale": 0.5, "offset": [ 60, 160 ] }, "reroutes": null }, "version": 0.4 }