From bfcdf777cafcc149fb01df01e2b371cfde891fd3 Mon Sep 17 00:00:00 2001 From: "/ai.oli" Date: Thu, 12 Mar 2026 20:11:29 +0100 Subject: [PATCH] docs: add Flux2Klein inpaint example workflow + update README --- README.md | 89 +++++++-- examples/WF_Inpaint_aioli-nodes.json | 281 +++++++++++++++++++++++++++ 2 files changed, 357 insertions(+), 13 deletions(-) create mode 100644 examples/WF_Inpaint_aioli-nodes.json diff --git a/README.md b/README.md index c747386..d0ec4eb 100644 --- a/README.md +++ b/README.md @@ -4,15 +4,16 @@ Two utility nodes for outpainting and inpainting in ComfyUI. ## Installation -### Via ComfyUI Manager (recommended) +### Via ComfyUI Registry (recommended) + +Search **"Aioli Nodes"** directly in the ComfyUI Manager → Install Nodes. + +### Via Git URL -**Install via Git URL:** ``` https://github.com/aiolicollective/aioli-nodes ``` -> ℹ️ A submission to the [ComfyUI Registry](https://registry.comfy.org) is in progress so the nodes will soon be installable directly from the built-in manager. - ### Manual installation 1. Copy the `aioli-nodes` folder into `ComfyUI/custom_nodes/` @@ -75,25 +76,87 @@ The node ensures the inpainted region stitches back **pixel-perfectly** onto the **Outputs** | Output | Type | Description | |--------|------|-------------| -| image_cropped | IMAGE | Cropped image (upscaled if target is set) | -| mask_cropped | MASK | Cropped mask (upscaled if target is set) | +| image_cropped | IMAGE | Cropped image (scaled if target is set or if bbox > 2048px) | +| mask_cropped | MASK | Cropped mask (scaled if target is set or if bbox > 2048px) | | x | INT | x position for ImageCompositeMasked | | y | INT | y position for ImageCompositeMasked | -| orig_width | INT | Crop width BEFORE upscale (use for resize-back) | -| orig_height | INT | Crop height BEFORE upscale (use for resize-back) | -| width | INT | Final width | -| height | INT | Final height | +| orig_width | INT | Crop width BEFORE scale (use for resize-back after VAE Decode) | +| orig_height | INT | Crop height BEFORE scale (use for resize-back after VAE Decode) | +| width | INT | Final width (after scale) | +| height | INT | Final height (after scale) | -**Workflow without upscale** +**Scaling behaviour** + +| Situation | Behaviour | +|-----------|----------| +| bbox ≤ 2048, target `none` | Round up to multiple only — no scale | +| bbox ≤ 2048, target set | Upscale crop to target — pixel-perfect ratio via GCD | +| bbox > 2048 (any target) | Downscale crop to fit 2048px — ratio preserved via GCD | + +**Workflow without scale** ``` BBox Fix → VAE Encode → KSampler → VAE Decode → ImageCompositeMasked ← x, y ``` -**Workflow with upscale** +**Workflow with upscale / downscale** ``` BBox Fix → VAE Encode → KSampler → VAE Decode ↓ orig_width, orig_height ↓ - ↓ x, y → Image Resize ←────────┘ + ↓ x, y → ImageResize+ ←────────┘ ↓ ImageCompositeMasked ← x, y ``` + +--- + +## 🔁 Example Workflow — Flux2Klein Inpaint + +> **[⬇ Download workflow JSON](examples/WF_Inpaint_aioli-nodes.json)** + +A complete, ready-to-use inpaint workflow for **Flux2Klein** (9B), packaged as a ComfyUI subgraph (`FLUX2KLEIN_INPAINT`). + +**Required models** +| Role | File | +|------|------| +| UNet | `flux2/flux-2-klein-9b-fp8.safetensors` | +| VAE | `flux2/flux2-vae.safetensors` | +| Text encoder | `qwen_3_8b_fp8mixed.safetensors` | + +**Required custom nodes** +- **Aioli Nodes** (this repo) — `BBoxMultipleFix` +- **ComfyUI Essentials** — `MaskBoundingBox+`, `ImageResize+` +- **ComfyUI KJNodes** — `GrowMaskWithBlur` +- **rgthree-comfy** — `Image Comparer` (optional, for before/after preview) + +**Subgraph inputs** +| Input | Description | +|-------|-------------| +| IMAGE | Source image (with painted mask) | +| MASK | Inpaint mask | +| Resize_Megapixels | Working resolution in megapixels (default: 4) | +| PROMPT | Inpaint prompt | +| Resize_Inpaint_Target | BBox target size (`none` · `512` · `768` · `1024` · `1536` · `2048`) | + +**Internal pipeline** +``` +LoadImageOutput (with mask painter) + └→ FLUX2KLEIN_INPAINT subgraph + ├── ImageScaleToTotalPixels (resize source to working MP) + ├── MaskBoundingBox+ (detect mask region) + ├── BBoxMultipleFix (crop + scale for Flux, cap 2048px) + ├── GrowMaskWithBlur (soften mask edges) + ├── VAEEncode × 2 + SetLatentNoiseMask + ├── CLIPTextEncode → ReferenceLatent → FluxGuidance + ├── Flux2Scheduler + KSamplerSelect + RandomNoise + ├── SamplerCustomAdvanced + ├── VAEDecode + ├── ImageResize+ (resize back to orig_width × orig_height) + └── ImageCompositeMasked (stitch result onto source) + └→ SaveImage + Image Comparer (before / after) +``` + +**Usage** +1. Download the JSON and drag it into ComfyUI +2. Point `LoadImageOutput` to your image and paint your mask +3. Set your prompt and target resolution in the subgraph inputs +4. Run — the result is composited pixel-perfectly back onto the source image diff --git a/examples/WF_Inpaint_aioli-nodes.json b/examples/WF_Inpaint_aioli-nodes.json new file mode 100644 index 0000000..06f6077 --- /dev/null +++ b/examples/WF_Inpaint_aioli-nodes.json @@ -0,0 +1,281 @@ +{ + "id": "9845cb52-4265-4177-a8c0-92882a7aa937", + "revision": 0, + "last_node_id": 490, + "last_link_id": 1153, + "nodes": [ + { + "id": 454, + "type": "SaveImage", + "pos": [ + 2853.8205652484253, + -3692.83348151422 + ], + "size": [ + 558.7844111498534, + 962.0645818937251 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 1134 + } + ], + "outputs": [], + "properties": { + "Node name for S&R": "SaveImage" + }, + "widgets_values": [ + "ComfyUI" + ], + "color": "#223", + "bgcolor": "#335" + }, + { + "id": 166, + "type": "Image Comparer (rgthree)", + "pos": [ + 3449.9379436320764, + -3691.469872127588 + ], + "size": [ + 558.0041091397599, + 941.9317290030997 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "dir": 3, + "name": "image_a", + "type": "IMAGE", + "link": 1136 + }, + { + "dir": 3, + "name": "image_b", + "type": "IMAGE", + "link": 1135 + } + ], + "outputs": [], + "properties": { + "comparer_mode": "Slide", + "cnr_id": "rgthree-comfy", + "ver": "1.0.2511270846" + }, + "widgets_values": [[]], + "color": "#223", + "bgcolor": "#335" + }, + { + "id": 399, + "type": "LoadImageOutput", + "pos": [ + 1869.364411511012, + -3675.427952938059 + ], + "size": [ + 324.7786074349633, + 421.1971091595851 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [1150] + }, + { + "name": "MASK", + "type": "MASK", + "links": [1151] + } + ], + "properties": { + "Node name for S&R": "LoadImageOutput" + }, + "widgets_values": [ + "_output_images_will_be_put_here [output]", + false, + "refresh", + "image" + ], + "color": "#323", + "bgcolor": "#535" + }, + { + "id": 489, + "type": "63323b8b-5f83-4f37-b521-5cd86415b4b2", + "pos": [ + 2227.6125047530395, + -3684.241600812175 + ], + "size": [ + 586.2092770823592, + 428 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + {"label": "IMAGE", "name": "on_false", "type": "IMAGE", "link": 1150}, + {"label": "MASK", "name": "on_false_1", "type": "*", "link": 1151}, + {"label": "Resize_Megapixels", "name": "value_1", "type": "FLOAT", "widget": {"name": "value_1"}, "link": null}, + {"label": "PROMPT", "name": "text", "type": "STRING", "widget": {"name": "text"}, "link": null}, + {"label": "Resize_Inpaint_Target", "name": "target", "type": "COMBO", "widget": {"name": "target"}, "link": null} + ], + "outputs": [ + {"label": "Output_IMAGE", "name": "IMAGE", "type": "IMAGE", "links": [1134, 1135]}, + {"label": "Compare_IMAGE", "name": "IMAGE_1", "type": "IMAGE", "links": [1136]} + ], + "properties": {}, + "widgets_values": [4, "1536", ""], + "color": "#223", + "bgcolor": "#335" + } + ], + "links": [ + [1134, 489, 0, 454, 0, "IMAGE"], + [1135, 489, 0, 166, 1, "IMAGE"], + [1136, 489, 1, 166, 0, "IMAGE"], + [1150, 399, 0, 489, 0, "IMAGE"], + [1151, 399, 1, 489, 1, "MASK"] + ], + "groups": [], + "definitions": { + "subgraphs": [ + { + "id": "63323b8b-5f83-4f37-b521-5cd86415b4b2", + "version": 1, + "state": {"lastGroupId": 10, "lastNodeId": 490, "lastLinkId": 1153, "lastRerouteId": 0}, + "revision": 0, + "config": {}, + "name": "FLUX2KLEIN_INPAINT", + "inputNode": {"id": -10, "bounding": [-598.1974643329097, -3637.9099698843856, 162.54296875, 140]}, + "outputNode": {"id": -20, "bounding": [5195.710411922829, -3607.9099698843856, 135.96484375, 80]}, + "inputs": [ + {"id": "2a172b37-8186-4be0-bc73-e6f85f4dc154", "name": "on_false", "type": "IMAGE", "linkIds": [1152], "label": "IMAGE", "pos": [-455.65, -3617.91]}, + {"id": "f33b4a43-f744-456a-bdb5-9e65d3db37da", "name": "on_false_1", "type": "*", "linkIds": [1153], "label": "MASK", "pos": [-455.65, -3597.91]}, + {"id": "9c0ddc65-d1a5-4ee7-82b1-948af805c28b", "name": "value_1", "type": "FLOAT", "linkIds": [1143], "label": "Resize_Megapixels", "pos": [-455.65, -3577.91]}, + {"id": "e100493e-94d9-4b20-a574-b5ce94ba63f7", "name": "text", "type": "STRING", "linkIds": [1144], "label": "PROMPT", "pos": [-455.65, -3557.91]}, + {"id": "82f7aa0d-9611-4826-9f9d-667cd4b8ecbe", "name": "target", "type": "COMBO", "linkIds": [1145], "label": "Resize_Inpaint_Target", "pos": [-455.65, -3537.91]} + ], + "outputs": [ + {"id": "9a44f46a-c984-430f-8547-eda83933286d", "name": "IMAGE", "type": "IMAGE", "linkIds": [1120, 1122], "label": "Output_IMAGE", "pos": [5215.71, -3587.91]}, + {"id": "34ca2429-52e0-4726-9978-e55bd315e131", "name": "IMAGE_1", "type": "IMAGE", "linkIds": [1115], "label": "Compare_IMAGE", "pos": [5215.71, -3567.91]} + ], + "widgets": [], + "nodes": [ + {"id": 432, "type": "UNETLoader", "pos": [-414.37, -4494.43], "size": [364.43, 82], "flags": {}, "order": 4, "mode": 0, "inputs": [], "outputs": [{"name": "MODEL", "type": "MODEL", "links": [1118]}], "properties": {"Node name for S&R": "UNETLoader"}, "widgets_values": ["flux2\\flux-2-klein-9b-fp8.safetensors", "default"]}, + {"id": 438, "type": "VAELoader", "pos": [-417.96, -4207.73], "size": [364.43, 58], "flags": {}, "order": 0, "mode": 0, "inputs": [], "outputs": [{"name": "VAE", "type": "VAE", "links": [993, 1051, 1060]}], "properties": {"Node name for S&R": "VAELoader"}, "widgets_values": ["flux2\\flux2-vae.safetensors"]}, + {"id": 478, "type": "CLIPLoader", "pos": [-418.20, -4367.07], "size": [364.43, 106], "flags": {}, "order": 3, "mode": 0, "inputs": [], "outputs": [{"name": "CLIP", "type": "CLIP", "links": [1119]}], "properties": {"Node name for S&R": "CLIPLoader"}, "widgets_values": ["qwen_3_8b_fp8mixed.safetensors", "flux2", "default"]}, + {"id": 488, "type": "PrimitiveFloat", "pos": [-85.39, -1839.24], "size": [270, 58], "flags": {}, "order": 27, "mode": 0, "inputs": [{"name": "value", "type": "FLOAT", "widget": {"name": "value"}, "link": 1143}], "outputs": [{"name": "FLOAT", "type": "FLOAT", "links": [1127, 1128]}], "title": "megapixels", "properties": {"Node name for S&R": "PrimitiveFloat"}, "widgets_values": [4]}, + {"id": 475, "type": "MaskToImage", "pos": [-10.61, -1909.85], "size": [193.28, 26], "flags": {}, "order": 19, "mode": 0, "inputs": [{"name": "mask", "type": "MASK", "link": 1153}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [1109]}], "properties": {"Node name for S&R": "MaskToImage"}, "widgets_values": []}, + {"id": 486, "type": "ImageScaleToTotalPixels", "pos": [283.75, -2077.32], "size": [270, 106], "flags": {}, "order": 25, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": 1152}, {"name": "megapixels", "type": "FLOAT", "widget": {"name": "megapixels"}, "link": 1127}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [1112, 1113, 1114, 1115, 1116]}], "properties": {"Node name for S&R": "ImageScaleToTotalPixels"}, "widgets_values": ["lanczos", 1, 1]}, + {"id": 487, "type": "ImageScaleToTotalPixels", "pos": [289.13, -1891.35], "size": [270, 106], "flags": {}, "order": 26, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": 1109}, {"name": "megapixels", "type": "FLOAT", "widget": {"name": "megapixels"}, "link": 1128}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [1110]}], "properties": {"Node name for S&R": "ImageScaleToTotalPixels"}, "widgets_values": ["lanczos", 1, 1]}, + {"id": 447, "type": "ImageToMask", "pos": [621.49, -1888.54], "size": [270, 58], "flags": {}, "order": 10, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": 1110}], "outputs": [{"name": "MASK", "type": "MASK", "links": [1015, 1043]}], "properties": {"Node name for S&R": "ImageToMask"}, "widgets_values": ["red"]}, + {"id": 449, "type": "CLIPTextEncode", "pos": [1388.48, -4252.65], "size": [440.32, 88], "flags": {}, "order": 11, "mode": 0, "inputs": [{"name": "clip", "type": "CLIP", "link": 1119}, {"name": "text", "type": "STRING", "widget": {"name": "text"}, "link": 1144}], "outputs": [{"name": "CONDITIONING", "type": "CONDITIONING", "links": [994, 998]}], "title": "CLIP Text Encode (Positive Prompt)", "properties": {"Node name for S&R": "CLIPTextEncode"}, "widgets_values": [""], "color": "#232", "bgcolor": "#353"}, + {"id": 437, "type": "VAEEncode", "pos": [2012.44, -4226.73], "size": [190, 46], "flags": {}, "order": 5, "mode": 0, "inputs": [{"name": "pixels", "type": "IMAGE", "link": 1124}, {"name": "vae", "type": "VAE", "link": 993}], "outputs": [{"name": "LATENT", "type": "LATENT", "links": [995, 997]}], "properties": {"Node name for S&R": "VAEEncode"}, "widgets_values": []}, + {"id": 439, "type": "ReferenceLatent", "pos": [2276.65, -4381.52], "size": [210, 46], "flags": {}, "order": 6, "mode": 0, "inputs": [{"name": "conditioning", "type": "CONDITIONING", "link": 994}, {"name": "latent", "type": "LATENT", "link": 995}], "outputs": [{"name": "CONDITIONING", "type": "CONDITIONING", "links": [1100]}], "properties": {"Node name for S&R": "ReferenceLatent"}, "widgets_values": []}, + {"id": 441, "type": "ConditioningZeroOut", "pos": [2042.08, -4324.41], "size": [204.13, 26], "flags": {}, "order": 8, "mode": 0, "inputs": [{"name": "conditioning", "type": "CONDITIONING", "link": 998}], "outputs": [{"name": "CONDITIONING", "type": "CONDITIONING", "links": [996]}], "properties": {"Node name for S&R": "ConditioningZeroOut"}, "widgets_values": []}, + {"id": 440, "type": "ReferenceLatent", "pos": [2283.78, -4258.25], "size": [210.70, 60.25], "flags": {}, "order": 7, "mode": 0, "inputs": [{"name": "conditioning", "type": "CONDITIONING", "link": 996}, {"name": "latent", "type": "LATENT", "link": 997}], "outputs": [{"name": "CONDITIONING", "type": "CONDITIONING", "links": [1125]}], "properties": {"Node name for S&R": "ReferenceLatent"}, "widgets_values": []}, + {"id": 467, "type": "FluxGuidance", "pos": [2631.60, -4459.38], "size": [270, 58], "flags": {}, "order": 18, "mode": 0, "inputs": [{"name": "conditioning", "type": "CONDITIONING", "link": 1100}], "outputs": [{"name": "CONDITIONING", "type": "CONDITIONING", "links": [1126]}], "properties": {"Node name for S&R": "FluxGuidance"}, "widgets_values": [4]}, + {"id": 451, "type": "Flux2Scheduler", "pos": [2633.39, -4653.36], "size": [270, 106], "flags": {}, "order": 12, "mode": 0, "inputs": [{"name": "width", "type": "INT", "widget": {"name": "width"}, "link": 1002}, {"name": "height", "type": "INT", "widget": {"name": "height"}, "link": 1003}], "outputs": [{"name": "SIGMAS", "type": "SIGMAS", "links": [1013]}], "properties": {"Node name for S&R": "Flux2Scheduler"}, "widgets_values": [4, 1024, 1024]}, + {"id": 444, "type": "CFGGuider", "pos": [2994.03, -4469.56], "size": [270, 98], "flags": {}, "order": 9, "mode": 0, "inputs": [{"name": "model", "type": "MODEL", "link": 1118}, {"name": "positive", "type": "CONDITIONING", "link": 1126}, {"name": "negative", "type": "CONDITIONING", "link": 1125}], "outputs": [{"name": "GUIDER", "type": "GUIDER", "links": [1011]}], "properties": {"Node name for S&R": "CFGGuider"}, "widgets_values": [1]}, + {"id": 460, "type": "KSamplerSelect", "pos": [2980.96, -4587.32], "size": [270, 58], "flags": {}, "order": 1, "mode": 0, "inputs": [], "outputs": [{"name": "SAMPLER", "type": "SAMPLER", "links": [1012]}], "properties": {"Node name for S&R": "KSamplerSelect"}, "widgets_values": ["euler"]}, + {"id": 461, "type": "RandomNoise", "pos": [2980.89, -4718.91], "size": [270, 82], "flags": {}, "order": 2, "mode": 0, "inputs": [], "outputs": [{"name": "NOISE", "type": "NOISE", "links": [1010]}], "properties": {"Node name for S&R": "RandomNoise"}, "widgets_values": [334118193034850, "randomize"]}, + {"id": 459, "type": "GetImageSize+", "pos": [2376.07, -4605.18], "size": [162.82, 66], "flags": {}, "order": 13, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": 1116}], "outputs": [{"name": "width", "type": "INT", "links": [1002]}, {"name": "height", "type": "INT", "links": [1003]}, {"name": "count", "type": "INT", "links": []}], "properties": {"Node name for S&R": "GetImageSize+"}, "widgets_values": []}, + {"id": 462, "type": "SamplerCustomAdvanced", "pos": [3369.09, -4718.03], "size": [410.85, 685.82], "flags": {}, "order": 14, "mode": 0, "inputs": [{"name": "noise", "type": "NOISE", "link": 1010}, {"name": "guider", "type": "GUIDER", "link": 1011}, {"name": "sampler", "type": "SAMPLER", "link": 1012}, {"name": "sigmas", "type": "SIGMAS", "link": 1013}, {"name": "latent_image", "type": "LATENT", "link": 1123}], "outputs": [{"name": "output", "type": "LATENT", "links": []}, {"name": "denoised_output", "type": "LATENT", "links": [1050]}], "properties": {"Node name for S&R": "SamplerCustomAdvanced"}, "widgets_values": []}, + {"id": 463, "type": "VAEDecode", "pos": [4041.91, -4417.06], "size": [257.22, 60.26], "flags": {}, "order": 15, "mode": 0, "inputs": [{"name": "samples", "type": "LATENT", "link": 1050}, {"name": "vae", "type": "VAE", "link": 1051}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [1052]}], "properties": {"Node name for S&R": "VAEDecode"}, "widgets_values": []}, + {"id": 466, "type": "ImageResize+", "pos": [4435.67, -4427.20], "size": [270, 218], "flags": {}, "order": 17, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": 1052}, {"name": "width", "type": "INT", "widget": {"name": "width"}, "link": 1053}, {"name": "height", "type": "INT", "widget": {"name": "height"}, "link": 1054}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [1018]}, {"name": "width", "type": "INT", "links": []}, {"name": "height", "type": "INT", "links": []}], "properties": {"Node name for S&R": "ImageResize+"}, "widgets_values": [512, 0, "lanczos", "keep proportion", "always", 0]}, + {"id": 484, "type": "MaskBoundingBox+", "pos": [155.15, -5289.40], "size": [270, 182], "flags": {}, "order": 23, "mode": 0, "inputs": [{"name": "mask", "type": "MASK", "link": 1015}, {"name": "image_optional", "type": "IMAGE", "link": 1112}], "outputs": [{"name": "MASK", "type": "MASK", "links": []}, {"name": "IMAGE", "type": "IMAGE", "links": []}, {"name": "x", "type": "INT", "links": [1044]}, {"name": "y", "type": "INT", "links": [1045]}, {"name": "width", "type": "INT", "links": [1046]}, {"name": "height", "type": "INT", "links": [1047]}], "properties": {"Node name for S&R": "MaskBoundingBox+"}, "widgets_values": [50, 0]}, + {"id": 485, "type": "BBoxMultipleFix", "pos": [566.29, -5292.28], "size": [270, 318], "flags": {}, "order": 24, "mode": 0, "inputs": [{"name": "image", "type": "IMAGE", "link": 1114}, {"name": "mask", "type": "MASK", "link": 1043}, {"name": "x", "type": "INT", "widget": {"name": "x"}, "link": 1044}, {"name": "y", "type": "INT", "widget": {"name": "y"}, "link": 1045}, {"name": "width", "type": "INT", "widget": {"name": "width"}, "link": 1046}, {"name": "height", "type": "INT", "widget": {"name": "height"}, "link": 1047}, {"name": "target", "type": "COMBO", "widget": {"name": "target"}, "link": 1145}], "outputs": [{"name": "image_cropped", "type": "IMAGE", "links": [1092, 1124]}, {"name": "mask_cropped", "type": "MASK", "links": [1093]}, {"name": "x", "type": "INT", "links": [1019]}, {"name": "y", "type": "INT", "links": [1020]}, {"name": "orig_width", "type": "INT", "links": [1053]}, {"name": "orig_height", "type": "INT", "links": [1054]}, {"name": "width", "type": "INT", "links": []}, {"name": "height", "type": "INT", "links": []}], "properties": {"Node name for S&R": "BBoxMultipleFix"}, "widgets_values": [0, 0, 64, 64, "64 (SDXL / Flux)", "1536"]}, + {"id": 483, "type": "GrowMaskWithBlur", "pos": [1028.87, -5270.10], "size": [299.84, 246], "flags": {}, "order": 22, "mode": 0, "inputs": [{"name": "mask", "type": "MASK", "link": 1093}], "outputs": [{"name": "mask", "type": "MASK", "links": [1062, 1091]}, {"name": "mask_inverted", "type": "MASK", "links": []}], "properties": {"Node name for S&R": "GrowMaskWithBlur"}, "widgets_values": [20, 0, false, false, 20, 1, 1, false]}, + {"id": 481, "type": "VAEEncode", "pos": [1710.36, -4876.97], "size": [140, 46], "flags": {}, "order": 20, "mode": 0, "inputs": [{"name": "pixels", "type": "IMAGE", "link": 1092}, {"name": "vae", "type": "VAE", "link": 1060}], "outputs": [{"name": "LATENT", "type": "LATENT", "links": [1061]}], "properties": {"Node name for S&R": "VAEEncode"}, "widgets_values": []}, + {"id": 482, "type": "SetLatentNoiseMask", "pos": [1919.72, -4872.43], "size": [188.14, 46], "flags": {}, "order": 21, "mode": 0, "inputs": [{"name": "samples", "type": "LATENT", "link": 1061}, {"name": "mask", "type": "MASK", "link": 1062}], "outputs": [{"name": "LATENT", "type": "LATENT", "links": [1123]}], "properties": {"Node name for S&R": "SetLatentNoiseMask"}, "widgets_values": []}, + {"id": 465, "type": "ImageCompositeMasked", "pos": [4865.71, -4389.42], "size": [270, 146], "flags": {}, "order": 16, "mode": 0, "inputs": [{"name": "destination", "type": "IMAGE", "link": 1113}, {"name": "source", "type": "IMAGE", "link": 1018}, {"name": "mask", "type": "MASK", "link": 1091}, {"name": "x", "type": "INT", "widget": {"name": "x"}, "link": 1019}, {"name": "y", "type": "INT", "widget": {"name": "y"}, "link": 1020}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [1120, 1122]}], "properties": {"Node name for S&R": "ImageCompositeMasked"}, "widgets_values": [0, 0, false]} + ], + "groups": [ + {"id": 1, "title": "Image 1", "bounding": [1954.04, -4477.54, 563.73, 325.55], "color": "#88A", "font_size": 24, "flags": {}}, + {"id": 7, "title": "Inpaint", "bounding": [112.02, -5434.46, 2036.90, 828.76], "color": "#8AA", "font_size": 24, "flags": {}} + ], + "links": [ + {"id": 993, "origin_id": 438, "origin_slot": 0, "target_id": 437, "target_slot": 1, "type": "VAE"}, + {"id": 994, "origin_id": 449, "origin_slot": 0, "target_id": 439, "target_slot": 0, "type": "CONDITIONING"}, + {"id": 995, "origin_id": 437, "origin_slot": 0, "target_id": 439, "target_slot": 1, "type": "LATENT"}, + {"id": 996, "origin_id": 441, "origin_slot": 0, "target_id": 440, "target_slot": 0, "type": "CONDITIONING"}, + {"id": 997, "origin_id": 437, "origin_slot": 0, "target_id": 440, "target_slot": 1, "type": "LATENT"}, + {"id": 998, "origin_id": 449, "origin_slot": 0, "target_id": 441, "target_slot": 0, "type": "CONDITIONING"}, + {"id": 1002, "origin_id": 459, "origin_slot": 0, "target_id": 451, "target_slot": 0, "type": "INT"}, + {"id": 1003, "origin_id": 459, "origin_slot": 1, "target_id": 451, "target_slot": 1, "type": "INT"}, + {"id": 1010, "origin_id": 461, "origin_slot": 0, "target_id": 462, "target_slot": 0, "type": "NOISE"}, + {"id": 1011, "origin_id": 444, "origin_slot": 0, "target_id": 462, "target_slot": 1, "type": "GUIDER"}, + {"id": 1012, "origin_id": 460, "origin_slot": 0, "target_id": 462, "target_slot": 2, "type": "SAMPLER"}, + {"id": 1013, "origin_id": 451, "origin_slot": 0, "target_id": 462, "target_slot": 3, "type": "SIGMAS"}, + {"id": 1015, "origin_id": 447, "origin_slot": 0, "target_id": 484, "target_slot": 0, "type": "MASK"}, + {"id": 1018, "origin_id": 466, "origin_slot": 0, "target_id": 465, "target_slot": 1, "type": "IMAGE"}, + {"id": 1019, "origin_id": 485, "origin_slot": 2, "target_id": 465, "target_slot": 3, "type": "INT"}, + {"id": 1020, "origin_id": 485, "origin_slot": 3, "target_id": 465, "target_slot": 4, "type": "INT"}, + {"id": 1043, "origin_id": 447, "origin_slot": 0, "target_id": 485, "target_slot": 1, "type": "MASK"}, + {"id": 1044, "origin_id": 484, "origin_slot": 2, "target_id": 485, "target_slot": 2, "type": "INT"}, + {"id": 1045, "origin_id": 484, "origin_slot": 3, "target_id": 485, "target_slot": 3, "type": "INT"}, + {"id": 1046, "origin_id": 484, "origin_slot": 4, "target_id": 485, "target_slot": 4, "type": "INT"}, + {"id": 1047, "origin_id": 484, "origin_slot": 5, "target_id": 485, "target_slot": 5, "type": "INT"}, + {"id": 1050, "origin_id": 462, "origin_slot": 1, "target_id": 463, "target_slot": 0, "type": "LATENT"}, + {"id": 1051, "origin_id": 438, "origin_slot": 0, "target_id": 463, "target_slot": 1, "type": "VAE"}, + {"id": 1052, "origin_id": 463, "origin_slot": 0, "target_id": 466, "target_slot": 0, "type": "IMAGE"}, + {"id": 1053, "origin_id": 485, "origin_slot": 4, "target_id": 466, "target_slot": 1, "type": "INT"}, + {"id": 1054, "origin_id": 485, "origin_slot": 5, "target_id": 466, "target_slot": 2, "type": "INT"}, + {"id": 1060, "origin_id": 438, "origin_slot": 0, "target_id": 481, "target_slot": 1, "type": "VAE"}, + {"id": 1061, "origin_id": 481, "origin_slot": 0, "target_id": 482, "target_slot": 0, "type": "LATENT"}, + {"id": 1062, "origin_id": 483, "origin_slot": 0, "target_id": 482, "target_slot": 1, "type": "MASK"}, + {"id": 1091, "origin_id": 483, "origin_slot": 0, "target_id": 465, "target_slot": 2, "type": "MASK"}, + {"id": 1092, "origin_id": 485, "origin_slot": 0, "target_id": 481, "target_slot": 0, "type": "IMAGE"}, + {"id": 1093, "origin_id": 485, "origin_slot": 1, "target_id": 483, "target_slot": 0, "type": "MASK"}, + {"id": 1100, "origin_id": 439, "origin_slot": 0, "target_id": 467, "target_slot": 0, "type": "CONDITIONING"}, + {"id": 1109, "origin_id": 475, "origin_slot": 0, "target_id": 487, "target_slot": 0, "type": "IMAGE"}, + {"id": 1110, "origin_id": 487, "origin_slot": 0, "target_id": 447, "target_slot": 0, "type": "IMAGE"}, + {"id": 1112, "origin_id": 486, "origin_slot": 0, "target_id": 484, "target_slot": 1, "type": "IMAGE"}, + {"id": 1113, "origin_id": 486, "origin_slot": 0, "target_id": 465, "target_slot": 0, "type": "IMAGE"}, + {"id": 1114, "origin_id": 486, "origin_slot": 0, "target_id": 485, "target_slot": 0, "type": "IMAGE"}, + {"id": 1115, "origin_id": 486, "origin_slot": 0, "target_id": -20, "target_slot": 1, "type": "IMAGE"}, + {"id": 1116, "origin_id": 486, "origin_slot": 0, "target_id": 459, "target_slot": 0, "type": "IMAGE"}, + {"id": 1118, "origin_id": 432, "origin_slot": 0, "target_id": 444, "target_slot": 0, "type": "MODEL"}, + {"id": 1119, "origin_id": 478, "origin_slot": 0, "target_id": 449, "target_slot": 0, "type": "CLIP"}, + {"id": 1120, "origin_id": 465, "origin_slot": 0, "target_id": -20, "target_slot": 0, "type": "IMAGE"}, + {"id": 1122, "origin_id": 465, "origin_slot": 0, "target_id": -20, "target_slot": 0, "type": "IMAGE"}, + {"id": 1123, "origin_id": 482, "origin_slot": 0, "target_id": 462, "target_slot": 4, "type": "LATENT"}, + {"id": 1124, "origin_id": 485, "origin_slot": 0, "target_id": 437, "target_slot": 0, "type": "IMAGE"}, + {"id": 1125, "origin_id": 440, "origin_slot": 0, "target_id": 444, "target_slot": 2, "type": "CONDITIONING"}, + {"id": 1126, "origin_id": 467, "origin_slot": 0, "target_id": 444, "target_slot": 1, "type": "CONDITIONING"}, + {"id": 1127, "origin_id": 488, "origin_slot": 0, "target_id": 486, "target_slot": 1, "type": "FLOAT"}, + {"id": 1128, "origin_id": 488, "origin_slot": 0, "target_id": 487, "target_slot": 1, "type": "FLOAT"}, + {"id": 1143, "origin_id": -10, "origin_slot": 2, "target_id": 488, "target_slot": 0, "type": "FLOAT"}, + {"id": 1144, "origin_id": -10, "origin_slot": 3, "target_id": 449, "target_slot": 1, "type": "STRING"}, + {"id": 1145, "origin_id": -10, "origin_slot": 4, "target_id": 485, "target_slot": 6, "type": "COMBO"}, + {"id": 1152, "origin_id": -10, "origin_slot": 0, "target_id": 486, "target_slot": 0, "type": "IMAGE"}, + {"id": 1153, "origin_id": -10, "origin_slot": 1, "target_id": 475, "target_slot": 0, "type": "MASK"} + ], + "extra": {"workflowRendererVersion": "LG"} + } + ] + }, + "config": {}, + "extra": { + "workflowRendererVersion": "LG", + "frontendVersion": "1.39.19", + "VHS_latentpreview": false, + "VHS_MetadataImage": true, + "VHS_KeepIntermediate": true + }, + "version": 0.4 +} \ No newline at end of file