diff --git a/README.md b/README.md
index 7fbb16c..d13e134 100644
--- a/README.md
+++ b/README.md
@@ -1,340 +1,286 @@
-# Searge-SDXL v3.x - "Truly Reborn"
-*Custom nodes extension* for [ComfyUI](https://github.com/comfyanonymous/ComfyUI)
-including *a workflow* to use *SDXL 1.0* with both the *base and refiner* checkpoints.
+# Searge-SDXL: EVOLVED ~~v4.x~~ v3.991 for ComfyUI
-# Version 3.4
-Instead of having separate workflows for different tasks, everything is now integrated in **one workflow file**.
+*Custom nodes extension* for [ComfyUI](https://github.com/comfyanonymous/ComfyUI),
+**including a workflow** to use *SDXL 1.0* with both the *base and refiner* checkpoints.
-### Always use the latest version of the workflow json file with the latest version of the custom nodes!
+# Public test version 3.991
-
+This version is the first public test version of the huge update to version 4.0 and is 95% feature complete.
+## Missing features
-## What's new in v3.4?
-- Minor tweaks and fixes and the beginnings of some code restructuring, nothing user should notice in the workflows
-- Preparations for more upcoming improvements in a compatible way
-- Added compatibility with v1.x workflows, these have been used in some tutorials and did not work anymore with newer
-versions of the extension
-- *(backwards compatibility with v2.x and older v3.x version - before v3.3 - is unfortunately not possible)*
+Right now the following features are still missing and are planned for the complete v4.0 release:
-## What about v3.3?
-- Starting from v3.3 the custom node extension will always be compatible with workflows created with v3.3 or later
-- *(backwards compatibility with v2.x, v3.0, v3.1. and v3.2 workflows is unfortunately not possible)*
-- Going forward, older versions of workflow will remain in the `workflow` folder, I still highly recommend to **always
-use the latest version** and loading it **from the JSON file** instead of the example images
-- *Version 3.3 has never been publicly released*
-
-## What's new in v3.2?
-- More prompting modes, including the "3-prompt" style that's common in other workflows
-using separate prompts for the 2 CLIP models in SDXL (CLIP G & CLIP L) and a negative prompt
- - **3-Prompt G+L-N** - Similar to simple mode, but cares about *a main, a secondary, and a negative prompt*
-and **ignores** the *additional style prompting fields*, this is great to get similar results as on other
-workflows and makes it easier to compare the images
- - **Subject - Style** - The *subject focused* positives with the *style focused* negatives
- - **Style - Subject** - The *style focused* positives with the *subject focused* negatives
- - **Style Only** - **Only** the positive and negative **style prompts** are used and *main/secondary/negative are ignored*
- - **Weighted - Overlay** - The positive prompts are *weighted* and the negative prompts are *overlaid*
- - **Overlay - Weighted** - The positive prompts are *overlaid* and the negative prompts are *weighted*
-- Better bug fix for the "exploding" the search box issue, should finally be fixed *(for real)* now
-- Some additional node types to make it easier to still use my nodes in other custom workflows
-- The custom node extension should now also work on **Python 3.9** again, it required 3.10 before
-
-## What's new in v3.1?
-- Fixed the issue with "exploding" the search box when this extension is installed
-- Loading of Checkpoints, VAE, Upscalers, and Loras through custom nodes
-- Updated workflow to make use of the added node types
-- Adjusted the default settings for some parameters in the workflow
-- Fixed some reported issues with the workflow and custom nodes
-- Prepared the workflow for an upcoming feature
-
-## What's new in v3.0?
-- Completely overhauled **user interface**, now even easier to use than before
-- More organized workflow graph - if you want to understand how it is designed "under the hood", it should now be
-easier to figure out what is where and how things are connected
-- New settings that help to tweak the generated images *without changing the composition*
- - Quickly iterate between *sharper* results and *softer* results of the same image without changing the composition
-or subject
- - Easily make colors pop where needed, or render a softer image where it fits the mood better
-- Three operating modes in **ONE** workflow
- - **text-to-image**
- - **image-to-image**
- - **inpainting**
-- Different prompting modes (**5 modes** available)
- - **Simple** - Just cares about **a positive and a negative prompt** and *ignores the additional prompting fields*, this
-is great to get started with SDXL, ComfyUI, and this workflow
- - **Subject Focus** - In this mode the *main/secondary prompts* are more important than the *style prompts*
- - **Style Focus** - In this mode the *style prompts* are more important than the *main/secondary prompts*
- - **Weighted** - In this mode the balance between *main/secondary prompts* and *style prompts* can be influenced with
-the *style prompt power* and *negative prompt power* option
- - **Overlay** - In this mode the main*/secondary prompts* and the *style prompts* are competing with each other
-- Greatly *improved Hires-Fix* - now with more options to influence the results
-- A (rather limited for now) alpha test for *style templates*, this is work in progress and only includes one
-style for now (called *test*)
-- Options to change the **intensity of the refiner** when used together with the base model,
-separate for *main pass* and *hires-fix pass*
-- *(... many more things probably, since the workflow was almost completely re-made)*
-
-
+- **Prompt Styles** - loading and applying style templates from a file
+- **More Prompting Modes** - many of the unique prompting modes from v3.x are still missing and need to be
+re-implemented in the new architecture of this extension
+- **Condition Mixing** - this is the foundation for re-introducing the v3.x prompting modes, but it's planned
+to have an even more flexible system to design your own custom prompting modes
-# Installing and Updating:
+# Table of Content
-### Recommended Installation:
-- Navigate to your `ComfyUI/custom_nodes/` directory
-- Open a command line window in the *custom_nodes* directory
-- Run `git clone https://github.com/SeargeDP/SeargeSDXL.git`
-- Restart ComfyUI
+
+* [Searge-SDXL: EVOLVED ~~v4.x~~ v3.991 for ComfyUI](#searge-sdxl-evolved-v4x-v3991-for-comfyui)
+* [Public test version 3.991](#public-test-version-3991)
+ * [Missing features](#missing-features)
+* [Table of Content](#table-of-content)
+* [Version ~~4.0~~ 3.991](#version-40-3991)
+ * [Always use the latest version of the workflow json file with the latest version of the custom nodes!](#always-use-the-latest-version-of-the-workflow-json-file-with-the-latest-version-of-the-custom-nodes)
+* [Installing and Updating](#installing-and-updating)
+ * [Recommended Installation of the Test Version](#recommended-installation-of-the-test-version)
+ * [Recommended Update of the Test Version](#recommended-update-of-the-test-version)
+ * [Checkpoints and Models for these Workflows](#checkpoints-and-models-for-these-workflows)
+ * [Direct Downloads](#direct-downloads)
+* [Updates](#updates)
+ * [What's new in ~~v4.0~~ 3.991?](#whats-new-in-v40-3991)
+ * [Major Highlights](#major-highlights)
+ * [Smaller Changes and Additions](#smaller-changes-and-additions-)
+* [The Workflow File](#the-workflow-file)
+ * [Documentation](#documentation)
+* [Workflow Details](#workflow-details)
+ * [Operating Modes](#operating-modes)
+ * [Text to Image Mode](#text-to-image-mode)
+ * [Image to Image Mode](#image-to-image-mode)
+ * [Inpainting Mode](#inpainting-mode)
+* [More Example Images](#more-example-images)
+
-### Alternative Installation (not recommended):
-- Download and unpack the latest release from the [Searge SDXL CivitAI page](https://civitai.com/models/111463)
-- Drop the `SeargeSDXL` folder into the `ComfyUI/custom_nodes` directory and restart ComfyUI.
-### Updating an Existing Installation
-- Navigate to your `ComfyUI/custom_nodes/` directory
-- If you installed via `git clone` before
- - Open a command line window in the *custom_nodes* directory
- - Run `git pull`
-- If you installed from a zip file
- - Unpack the `SeargeSDXL` folder from the latest release into `ComfyUI/custom_nodes`, overwrite existing files
-- Restart ComfyUI
+# Version ~~4.0~~ 3.991
+
+Instead of having separate workflows for different tasks, everything is integrated in **one workflow file**.
+
+## Always use the latest version of the workflow json file with the latest version of the custom nodes!
+
+
+
+
+
+# Installing and Updating
+
+## Recommended Installation of the Test Version
+
+- Download and unpack the latest test release from the [Searge SDXL CivitAI page](https://civitai.com/models/111463) or
+the [Github releases page for this project](https://github.com/SeargeDP/SeargeSDXL/releases).
+- Drop the `SeargeSDXL-Test` folder into the `ComfyUI/custom_nodes` directory and restart ComfyUI.
+
+### Recommended Update of the Test Version
+
+- When new test versions are released, before the final v4.0 update release, repeat the steps from
+the [Recommended Installation of the Test Version](#recommended-installation-of-the-test-version) section
+and overwrite existing files in the process.
## Checkpoints and Models for these Workflows
+This workflow depends on certain checkpoint files to be installed in ComfyUI, here is a list of the necessary
+files that the workflow expects to be available.
+
+If any of the mentioned folders does not exist in `ComfyUI/models`, **create** the missing folder and put the
+downloaded file into it.
+
+I recommend to **download and copy all** these files *(the required, recommended, and optional ones)* to make
+**full use of all features** included in the workflow!
+
### Direct Downloads
+
(from Huggingface)
-- download [SDXL 1.0 base](https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_base_1.0.safetensors) and copy it into `ComfyUI/models/checkpoints`
-- download [SDXL 1.0 refiner](https://huggingface.co/stabilityai/stable-diffusion-xl-refiner-1.0/resolve/main/sd_xl_refiner_1.0.safetensors) and copy it into `ComfyUI/models/checkpoints`
-- download [Fixed SDXL 0.9 vae](https://huggingface.co/madebyollin/sdxl-vae-fp16-fix/resolve/main/sdxl_vae.safetensors) and copy it into `ComfyUI/models/vae`
-- download [SDXL Offset Noise LoRA](https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_offset_example-lora_1.0.safetensors)
-and copy it into `ComfyUI/models/loras`
-- download [4x_NMKD-Siax_200k upscaler](https://huggingface.co/uwg/upscaler/resolve/main/ESRGAN/4x_NMKD-Siax_200k.pth) and copy it into `ComfyUI/models/upscale_models`
-- download [4x-UltraSharp upscaler](https://huggingface.co/uwg/upscaler/resolve/main/ESRGAN/4x-UltraSharp.pth) and copy it into `ComfyUI/models/upscale_models`
+- **(required)** download [SDXL 1.0 Base with 0.9 VAE (7 GB)](https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_base_1.0_0.9vae.safetensors) and copy it into `ComfyUI/models/checkpoints`
+ - *(this should be pre-selected as the base model on the workflow already)*
+
+
+- **(recommended)** download [SDXL 1.0 Refiner with 0.9 VAE (6 GB)](https://huggingface.co/stabilityai/stable-diffusion-xl-refiner-1.0/resolve/main/sd_xl_refiner_1.0_0.9vae.safetensors) and copy it into `ComfyUI/models/checkpoints`
+ - *(you should select this as the refiner model on the workflow)*
+
+
+- *(optional)* download [Fixed SDXL 0.9 vae (335 MB)](https://huggingface.co/madebyollin/sdxl-vae-fp16-fix/resolve/main/sdxl_vae.safetensors) and copy it into `ComfyUI/models/vae`
+ - *(instead of using the VAE that's embedded in SDXL 1.0, this one has been fixed to work in fp16 and should **fix the issue with generating black images**)*
+
+
+- *(optional)* download [SDXL Offset Noise LoRA (50 MB)](https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_offset_example-lora_1.0.safetensors) and copy it into `ComfyUI/models/loras`
+ - *(the example lora that was released alongside SDXL 1.0, it can add more contrast through offset-noise)*
+
+
+- **(recommended)** download [4x-UltraSharp (67 MB)](https://huggingface.co/uwg/upscaler/resolve/main/ESRGAN/4x-UltraSharp.pth) and copy it into `ComfyUI/models/upscale_models`
+ - *(you should select this as the primary upscaler on the workflow)*
+
+
+- **(recommended)** download [4x_NMKD-Siax_200k (67 MB)](https://huggingface.co/uwg/upscaler/resolve/main/ESRGAN/4x_NMKD-Siax_200k.pth) and copy it into `ComfyUI/models/upscale_models`
+ - *(you should select this as the secondary upscaler on the workflow)*
+
+
+- **(recommended)** download [4x_Nickelback_70000G (67 MB)](https://huggingface.co/uwg/upscaler/resolve/main/ESRGAN/4x_Nickelback_70000G.pth) and copy it into `ComfyUI/models/upscale_models`
+ - *(you should select this as the high-res upscaler on the workflow)*
+
+
+- *(optional)* download [1x-ITF-SkinDiffDetail-Lite-v1 (20 MB)](https://huggingface.co/uwg/upscaler/resolve/main/ESRGAN/4x_Nickelback_70000G.pth) and copy it into `ComfyUI/models/upscale_models`
+ - *(you can select this as the detail processor on the workflow)*
+
+
+- **(required)** download [ControlNetHED (30 MB)](https://huggingface.co/lllyasviel/Annotators/resolve/main/ControlNetHED.pth) and copy it into `ComfyUI/models/annotators`
+ - *(this will be used by the controlnet nodes)*
+
+
+- **(required)** download [res101 (531 MB)](https://huggingface.co/lllyasviel/Annotators/resolve/main/res101.pth) and copy it into `ComfyUI/models/annotators`
+ - *(this will be used by the controlnet nodes)*
+
+
+- **(recommended)** download [clip_vision_g (3.7 GB)](https://huggingface.co/stabilityai/control-lora/resolve/main/revision/clip_vision_g.safetensors) and copy it into `ComfyUI/models/clip_vision`
+ - *(you should select this as the clip vision model on the workflow)*
+
+
+- **(recommended)** download [control-lora-canny-rank256 (774 MB)](https://huggingface.co/stabilityai/control-lora/resolve/main/control-LoRAs-rank256/control-lora-canny-rank256.safetensors) and copy it into `ComfyUI/models/controlnet`
+ - *(you should select this as the canny checkpoint on the workflow)*
+
+
+- **(recommended)** download [control-lora-depth-rank256 (774 MB)](https://huggingface.co/stabilityai/control-lora/resolve/main/control-LoRAs-rank256/control-lora-depth-rank256.safetensors) and copy it into `ComfyUI/models/controlnet`
+ - *(you should select this as the depth checkpoint on the workflow)*
+
+
+- **(recommended)** download [control-lora-recolor-rank256 (774 MB)](https://huggingface.co/stabilityai/control-lora/resolve/main/control-LoRAs-rank256/control-lora-recolor-rank256.safetensors) and copy it into `ComfyUI/models/controlnet`
+ - *(you should select this as the recolor checkpoint on the workflow)*
+
+
+- **(recommended)** download [control-lora-sketch-rank256 (774 MB)](https://huggingface.co/stabilityai/control-lora/resolve/main/control-LoRAs-rank256/control-lora-sketch-rank256.safetensors) and copy it into `ComfyUI/models/controlnet`
+ - *(you should select this as the sketch checkpoint on the workflow)*
+
+
+- *(optional)* download [OpenPoseXL2 (5 GB)](https://huggingface.co/thibaud/controlnet-openpose-sdxl-1.0/resolve/main/OpenPoseXL2.safetensors) and copy it into `ComfyUI/models/controlnet`
+ - *(you can select this as the custom controlnet checkpoint on the workflow)*
+
+
+Now everything should be prepared, but you may to have to adjust some file names in the different model selector boxes
+on the workflow. Do so by clicking on the filename in the workflow UI and selecting the correct file from the list.
+
+
-# More Information
-Now **3** operating modes are included in the workflow, the *.json-file* for it is in the `workflow` folder.
-They are called *text2image*, *image2image*, and *inpainting*.
+# Updates
-The simple workflow has not returned as a separate workflow, but is now also *fully integrated*.
+Find information about the latest changes here.
-To enable it, switch the **prompt mode** option to **simple** and it will only pay attention to the *main prompt*
-and the *negative prompt*.
-Or switch the **prompt mode** to **3 prompts** and only the *main prompt*, the *secondary prompt*, and the
-*negative prompt* are used.
+## What's new in ~~v4.0~~ 3.991?
+
+### Major Highlights
+- A **complete re-write** of the custom node extension and the SDXL workflow
+- **Highly optimized** processing pipeline, now **up to 20% faster** than in older workflow versions
+- Support for **Controlnet and Revision**, up to 5 can be applied together
+- **Multi-LoRA** support with up to 5 LoRA's at once
+- ... (TODO: list more major highlights)
+
+### Smaller Changes and Additions
+- Workflows created with this extension and metadata embeddings in generated images are forward-compatible with
+future updates of this project
+- The custom node extension included in this project is backward-compatible with every workflow since version v3.3
+- ... (TODO: list more smaller changes)
+
+
+
+*(5 multi-purpose image inputs for revision and controlnet)*
-# The Workflow
-The workflow is included in the `workflow` folder.
+# The Workflow File
-**After updating Searge SDXL, always make sure to load the latest version of the json file. Older versions of the
-workflow are often not compatible anymore with the updated node extension.**
+The workflow is included as a `.json` file in the `workflow` folder.
-
+**After updating Searge SDXL, always make sure to load the latest version of the json file if you want to benefit
+from the latest features, updates, and bugfixes.**
+
+(you can check the version of the workflow that you are using by looking at the workflow information box)
+
+
+
+
+## Documentation
+
+[Click this link to see the documentation](docs/readme.md)
+
+
+
+*(the main UI of the workflow)*
-# Searge SDXL Reborn Workflow Description
-The **Reborn v3.x** workflow is a new workflow, created from scratch. It requires the latest additions to the
+# Workflow Details
+
+The **EVOLVED v4.x** workflow is a new workflow, created from scratch. It requires the latest additions to the
SeargeSDXL custom node extension, because it makes use of some new node types.
The interface for using this new workflow is also designed in a different way, with all parameters that
are usually tweaked to generate images tightly packed together. This should make it easier to have every
important element on the screen at the same time without scrolling.
-Starting from version 3.0 all 3 operating modes (text-to-image, image-to-image, and inpainting) are available
-from the same workflow and can be switched with an option.
+
-## Video
-
-[The amazing Youtube channel Nerdy Rodent has a video about this workflow](https://www.youtube.com/watch?v=_Qi0Dgrz1TM).
-
-*(and while you are watching the video, don't forget to subscribe to their channel)*
+*(more advanced UI elements right next to the main UI)*
-## Reborn Workflow v3.x Operating Modes
-
+## Operating Modes
+
+
### Text to Image Mode
+
In this mode you can generate images from text descriptions. The source image and the mask (next to the prompt inputs)
are not used in this mode.
-
+
+
+*(example of using text-to-image in the workflow)*
+
-
+
+
+
+*(result of the text-to-image example)*
+
+
### Image to Image Mode
-In this mode you should first copy an image into the `ConfyUI/input` directory.
-Alternatively you can change the option for the **save directory** to **input folder** when generating images, in that
-case you have to press the ComfyUI *Refresh* button and it should show up in the image loader node.
-Then select that image as the *Source Image* (next to the prompt inputs).
-If it does not show up, press the *Refresh* button on the Comfy UI control box.
+In this mode you can generate images from text descriptions and a source image. The mask (next to the prompt inputs)
+is not used in this mode.
-For image to image the parameter *Denoise* will determine how much the source image should be changed
-according to the prompt.
-Ranges are from *0.0* for "no change" to *1.0* for "completely change".
+
-Good values to try are probably in the *0.2* to *0.8* range.
-With examples of *0.25* for "very little change", *0.5* for "some changes", or *0.75* for "a lot of changes"
+*(example of using image-to-image in the workflow)*
-
-
+
+
+
+*(result of the image-to-image example)*
+
+
### Inpainting Mode
-This is similar to the image to image mode.
-But it also lets you define a mask for selective changes of only parts of the image.
-To use this mode, prepare a source image the same way as described in the image to image workflow.
-Then **right click** on the *Inpainting Mask* image (the bottom one next to the input prompts) and select
-**Open in Mask Editor**.
+In this mode you can generate images from text descriptions and a source image. Both, the source image and the mask
+(next to the prompt inputs) are used in this mode.
-Paint your mask and then press the *Save to node* button when you are done.
-The *Denoise* parameter works the same way as in image to image, but only masked areas will be changed.
+This is similar to the image to image mode, but it also lets you define a mask for selective changes of only parts
+of the image.
+
+
+
+*(example of using inpainting in the workflow)*
-
-
+
+*(result of the inpainting example)*
-# Prompting Modes
+# More Example Images
-
-
-## Reborn Workflow v3.x Prompting Modes
-
-### Simple
-Just cares about the **main** and the **negative** prompt and **ignores** the *additional prompting fields*, this
-is great to get started with SDXL, ComfyUI, and this workflow
-
-
-
-### 3-Prompt G+L-N
-Similar to simple mode, but cares about the **main & secondary** and the **negative** prompt
-and **ignores** the *additional style prompting fields*, this is great to get similar results as on other
-workflows and makes it easier to compare the images
-
-
-
-### Subject Focus
-In this mode the *main & secondary* prompts are **more important** than the *style* prompts
-
-
-
-### Style Focus
-In this mode the *style* prompts are **more important** than the *main & secondary* prompts
-
-
-
-### Weighted
-In this mode the **balance** between *main & secondary* prompts and *style prompts* can be influenced with
-the **style prompt power** and **negative prompt power** option
-
-
-
-### Overlay
-In this mode the *main & secondary* prompts and the *style* prompts are **competing with each other**
-
-
-
-### Subject - Style
-The *main & secondary* positives with the *style* negatives
-
-
-
-### Style - Subject
-The *style* positives with the *main & secondary* negatives
-
-
-
-### Style Only
-**Only** the *style* prompt and *negative style* prompt are used, the *main & secondary* and *negative* are ignored
-
-
-
-### Weighted - Overlay
-The *main & secondary* and *style* prompts are **weighted**, the *negative* and *negative style* prompts are **overlaid**
-
-
-
-### Overlay - Weighted
-The *main & secondary* and *style* prompts are **overlaid**, the *negative* and *negative style* prompts are **weighted**
-
-
-
-
-
-# Custom Nodes
-These custom node types are available in the extension.
-
-The details about them are only important if you want to use them in your own workflow or if you want to
-understand better how the included workflows work.
-
-
-
-
-## SDXL Sampler Node
-
-
-### Inputs
-- **base_model** - connect the SDXL base model here, provided via a `Load Checkpoint` node
-- **base_positive** - recommended to use a `CLIPTextEncodeSDXL` with 4096 for `width`, `height`,
-`target_width`, and `target_height`
-- **base_negative** - recommended to use a `CLIPTextEncodeSDXL` with 4096 for `width`, `height`,
-`target_width`, and `target_height`
-- **refiner_model** - connect the SDXL refiner model here, provided via a `Load Checkpoint` node
-- **refiner_positive** - recommended to use a `CLIPTextEncodeSDXLRefiner` with 2048 for `width`, and `height`
-- **refiner_negative** - recommended to use a `CLIPTextEncodeSDXLRefiner` with 2048 for `width`, and `height`
-- **latent_image** - either an empty latent image or a VAE-encoded latent from a source image for img2img
-- **noise_seed** - the random seed for generating the image
-- **steps** - total steps for the sampler, it will internally be split into base steps and refiner steps
-- **cfg** - CFG scale (classifier free guidance), values between 3.0 and 12.0 are most commonly used
-- **sampler_name** - the noise sampler _(I prefer dpmpp_2m with the karras scheduler, sometimes ddim
-with the ddim_uniform scheduler)_
-- **scheduler** - the scheduler to use with the sampler selected in `sampler_name`
-- **base_ratio** - the ratio between base model steps and refiner model steps _(0.8 = 80% base model and 20% refiner
-model, with 30 total steps that's 24 base steps and 6 refiner steps)_
-- **denoise** - denoising factor, keep this at 1.0 when creating new images from an empty latent and between 0.0-1.0 in the img2img workflow
-
-### Outputs
-- **LATENT** - the generated latent image
-
-
-## SDXL Prompt Node
-
-
-### Inputs
-- **base_clip** - connect the SDXL base CLIP here, provided via a `Load Checkpoint` node
-- **refiner_clip** - connect the SDXL refiner CLIP here, provided via a `Load Checkpoint` node
-- **pos_g** - the text for the positive base prompt G
-- **pos_l** - the text for the positive base prompt L
-- **pos_r** - the text for the positive refiner prompt
-- **neg_g** - the text for the negative base prompt G
-- **neg_l** - the text for the negative base prompt L
-- **neg_r** - the text for the negative refiner prompt
-- **base_width** - the width for the base conditioning
-- **base_height** - the height for the base conditioning
-- **crop_w** - crop width for the base conditioning
-- **crop_h** - crop height for the base conditioning
-- **target_width** - the target width for the base conditioning
-- **target_height** - the target height for the base conditioning
-- **pos_ascore** - the positive aesthetic score for the refiner conditioning
-- **neg_ascore** - the negative aesthetic score for the refiner conditioning
-- **refiner_width** - the width for the refiner conditioning
-- **refiner_height** - the height for the refiner conditioning
-
-### Outputs
-- **CONDITIONING** 1 - the positive base prompt conditioning
-- **CONDITIONING** 2 - the negative base prompt conditioning
-- **CONDITIONING** 3 - the positive refiner prompt conditioning
-- **CONDITIONING** 4 - the negative refiner prompt conditioning
+A small collection of example images (with embedded workflow) can be found in the `examples` folder. [Here is an
+overview of the included images.](examples/readme.md)
diff --git a/__init__.py b/__init__.py
index 82e8549..3f10bb3 100644
--- a/__init__.py
+++ b/__init__.py
@@ -26,7 +26,25 @@ SOFTWARE.
"""
-from .searge_sdxl_sampler_node import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS
+import os
+import folder_paths
+
+from .modules.ui import Defs
+
+from .searge_sdxl import SEARGE_CLASS_MAPPINGS, SEARGE_DISPLAY_NAME_MAPPINGS
+
+folder_paths.add_model_folder_path("annotators", os.path.join(folder_paths.models_dir, "annotators"))
+
+if Defs.DEV_MODE:
+ NODE_CLASS_MAPPINGS = SEARGE_CLASS_MAPPINGS
+ NODE_DISPLAY_NAME_MAPPINGS = SEARGE_DISPLAY_NAME_MAPPINGS
+
+else:
+ pass
+ # from .modules._legacy import LEGACY_CLASS_MAPPINGS, LEGACY_DISPLAY_NAME_MAPPINGS
+
+ # NODE_CLASS_MAPPINGS = SEARGE_CLASS_MAPPINGS | LEGACY_CLASS_MAPPINGS
+ # NODE_DISPLAY_NAME_MAPPINGS = SEARGE_DISPLAY_NAME_MAPPINGS | LEGACY_DISPLAY_NAME_MAPPINGS
__all__ = ['NODE_CLASS_MAPPINGS', 'NODE_DISPLAY_NAME_MAPPINGS']
diff --git a/docs/img/main_readme/banner.png b/docs/img/main_readme/banner.png
new file mode 100644
index 0000000..2d9ea84
Binary files /dev/null and b/docs/img/main_readme/banner.png differ
diff --git a/docs/img/main_readme/full_graph.png b/docs/img/main_readme/full_graph.png
new file mode 100644
index 0000000..91a0ac3
Binary files /dev/null and b/docs/img/main_readme/full_graph.png differ
diff --git a/docs/img/main_readme/operating_mode.png b/docs/img/main_readme/operating_mode.png
new file mode 100644
index 0000000..b79bb92
Binary files /dev/null and b/docs/img/main_readme/operating_mode.png differ
diff --git a/docs/img/main_readme/result_img2img.png b/docs/img/main_readme/result_img2img.png
new file mode 100644
index 0000000..15239c0
Binary files /dev/null and b/docs/img/main_readme/result_img2img.png differ
diff --git a/docs/img/main_readme/result_inpainting.png b/docs/img/main_readme/result_inpainting.png
new file mode 100644
index 0000000..30a3b2d
Binary files /dev/null and b/docs/img/main_readme/result_inpainting.png differ
diff --git a/docs/img/main_readme/result_txt2img.png b/docs/img/main_readme/result_txt2img.png
new file mode 100644
index 0000000..154acec
Binary files /dev/null and b/docs/img/main_readme/result_txt2img.png differ
diff --git a/docs/img/main_readme/ui-1.png b/docs/img/main_readme/ui-1.png
new file mode 100644
index 0000000..99c78b2
Binary files /dev/null and b/docs/img/main_readme/ui-1.png differ
diff --git a/docs/img/main_readme/ui-2.png b/docs/img/main_readme/ui-2.png
new file mode 100644
index 0000000..ea35cdf
Binary files /dev/null and b/docs/img/main_readme/ui-2.png differ
diff --git a/docs/img/main_readme/ui-3.png b/docs/img/main_readme/ui-3.png
new file mode 100644
index 0000000..bf9a809
Binary files /dev/null and b/docs/img/main_readme/ui-3.png differ
diff --git a/docs/img/main_readme/ui_img2img.png b/docs/img/main_readme/ui_img2img.png
new file mode 100644
index 0000000..523561a
Binary files /dev/null and b/docs/img/main_readme/ui_img2img.png differ
diff --git a/docs/img/main_readme/ui_inpainting.png b/docs/img/main_readme/ui_inpainting.png
new file mode 100644
index 0000000..c77799b
Binary files /dev/null and b/docs/img/main_readme/ui_inpainting.png differ
diff --git a/docs/img/main_readme/ui_txt2img.png b/docs/img/main_readme/ui_txt2img.png
new file mode 100644
index 0000000..6902a34
Binary files /dev/null and b/docs/img/main_readme/ui_txt2img.png differ
diff --git a/docs/img/main_readme/workflow_version.png b/docs/img/main_readme/workflow_version.png
new file mode 100644
index 0000000..5671e38
Binary files /dev/null and b/docs/img/main_readme/workflow_version.png differ
diff --git a/docs/img/model_selector.png b/docs/img/model_selector.png
new file mode 100644
index 0000000..fade87d
Binary files /dev/null and b/docs/img/model_selector.png differ
diff --git a/docs/img/queue_prompt.png b/docs/img/queue_prompt.png
new file mode 100644
index 0000000..a5293ce
Binary files /dev/null and b/docs/img/queue_prompt.png differ
diff --git a/docs/readme.md b/docs/readme.md
new file mode 100644
index 0000000..15affc8
--- /dev/null
+++ b/docs/readme.md
@@ -0,0 +1,44 @@
+
+# Searge-SDXL: EVOLVED v4.x for ComfyUI
+
+*(this documentation is work-in-progress and incomplete)*
+
+
+* [Searge-SDXL: EVOLVED v4.x for ComfyUI](#searge-sdxl-evolved-v4x-for-comfyui)
+ * [Getting Started with the Workflow](#getting-started-with-the-workflow)
+ * [Testing the workflow](#testing-the-workflow)
+* [Detailed Documentation](#detailed-documentation)
+
+
+## Getting Started with the Workflow
+
+After installing the required model files as described in the section *Checkpoints and Models* of the
+[main readme file](../README.md#checkpoints-and-models-for-these-workflows)
+for this project, follow these steps to test if everything has been installed correctly and is working properly.
+
+**Also make sure you are using the latest `.json` file from the `workflow` folder.**
+
+You can see the version information on the workflow and it should match the latest released version of this project.
+
+
+
+
+## Testing the workflow
+
+To get started, select the base model, refiner model, and VAE in the model selector by clicking on the fields and
+selecting the correct files. Using the **refiner is highly recommended** for best results. The recommended VAE is
+a fixed version that works in fp16 mode without producing just black images, but if you don't want to use a separate
+VAE file just select *from base model*.
+
+
+
+Once you selected the correct models press the Queue Prompt button in ComfyUI to test if everything is set up
+correctly.
+
+
+
+
+
+# Detailed Documentation
+
+*(TBD)*
diff --git a/example/01-simple.jpg b/example/01-simple.jpg
deleted file mode 100644
index 084f402..0000000
Binary files a/example/01-simple.jpg and /dev/null differ
diff --git a/example/02-3_prompts.jpg b/example/02-3_prompts.jpg
deleted file mode 100644
index deab5f1..0000000
Binary files a/example/02-3_prompts.jpg and /dev/null differ
diff --git a/example/03-subject_focus.jpg b/example/03-subject_focus.jpg
deleted file mode 100644
index f3c0aa5..0000000
Binary files a/example/03-subject_focus.jpg and /dev/null differ
diff --git a/example/04-style_focus.jpg b/example/04-style_focus.jpg
deleted file mode 100644
index 031e455..0000000
Binary files a/example/04-style_focus.jpg and /dev/null differ
diff --git a/example/05-weighted.jpg b/example/05-weighted.jpg
deleted file mode 100644
index 9056b9d..0000000
Binary files a/example/05-weighted.jpg and /dev/null differ
diff --git a/example/06-overlay.jpg b/example/06-overlay.jpg
deleted file mode 100644
index 3819267..0000000
Binary files a/example/06-overlay.jpg and /dev/null differ
diff --git a/example/07-subject-style.jpg b/example/07-subject-style.jpg
deleted file mode 100644
index 6690b5b..0000000
Binary files a/example/07-subject-style.jpg and /dev/null differ
diff --git a/example/08-style-subject.jpg b/example/08-style-subject.jpg
deleted file mode 100644
index 9a67274..0000000
Binary files a/example/08-style-subject.jpg and /dev/null differ
diff --git a/example/09-style_only.jpg b/example/09-style_only.jpg
deleted file mode 100644
index fb18115..0000000
Binary files a/example/09-style_only.jpg and /dev/null differ
diff --git a/example/10-weighted-overlay.jpg b/example/10-weighted-overlay.jpg
deleted file mode 100644
index 6392145..0000000
Binary files a/example/10-weighted-overlay.jpg and /dev/null differ
diff --git a/example/11-overlay-weighted.jpg b/example/11-overlay-weighted.jpg
deleted file mode 100644
index 963f504..0000000
Binary files a/example/11-overlay-weighted.jpg and /dev/null differ
diff --git a/example/Searge-SDXL-Example.png b/example/Searge-SDXL-Example.png
deleted file mode 100644
index b750c8f..0000000
Binary files a/example/Searge-SDXL-Example.png and /dev/null differ
diff --git a/example/Searge-SDXL-Node-1.png b/example/Searge-SDXL-Node-1.png
deleted file mode 100644
index d9aee25..0000000
Binary files a/example/Searge-SDXL-Node-1.png and /dev/null differ
diff --git a/example/Searge-SDXL-Node-2.png b/example/Searge-SDXL-Node-2.png
deleted file mode 100644
index 458eb14..0000000
Binary files a/example/Searge-SDXL-Node-2.png and /dev/null differ
diff --git a/example/Searge-SDXL-Nodetypes.png b/example/Searge-SDXL-Nodetypes.png
deleted file mode 100644
index 893be03..0000000
Binary files a/example/Searge-SDXL-Nodetypes.png and /dev/null differ
diff --git a/example/Searge-SDXL-Overview.png b/example/Searge-SDXL-Overview.png
deleted file mode 100644
index 1fed243..0000000
Binary files a/example/Searge-SDXL-Overview.png and /dev/null differ
diff --git a/example/Searge-SDXL-UI.png b/example/Searge-SDXL-UI.png
deleted file mode 100644
index 017415f..0000000
Binary files a/example/Searge-SDXL-UI.png and /dev/null differ
diff --git a/example/Searge-SDXL-img2img.png b/example/Searge-SDXL-img2img.png
deleted file mode 100644
index 8fcff95..0000000
Binary files a/example/Searge-SDXL-img2img.png and /dev/null differ
diff --git a/example/Searge-SDXL-inpaint.png b/example/Searge-SDXL-inpaint.png
deleted file mode 100644
index 9897db9..0000000
Binary files a/example/Searge-SDXL-inpaint.png and /dev/null differ
diff --git a/example/Searge-SDXL-reborn.png b/example/Searge-SDXL-reborn.png
deleted file mode 100644
index 3c845a4..0000000
Binary files a/example/Searge-SDXL-reborn.png and /dev/null differ
diff --git a/example/Searge-SDXL-workflow-1.png b/example/Searge-SDXL-workflow-1.png
deleted file mode 100644
index 264b9da..0000000
Binary files a/example/Searge-SDXL-workflow-1.png and /dev/null differ
diff --git a/example/Searge-SDXL-workflow-2.png b/example/Searge-SDXL-workflow-2.png
deleted file mode 100644
index 05dc71a..0000000
Binary files a/example/Searge-SDXL-workflow-2.png and /dev/null differ
diff --git a/example/Searge-SDXL-workflow-3.png b/example/Searge-SDXL-workflow-3.png
deleted file mode 100644
index 760b17b..0000000
Binary files a/example/Searge-SDXL-workflow-3.png and /dev/null differ
diff --git a/example/UI-operation-mode.png b/example/UI-operation-mode.png
deleted file mode 100644
index 541d284..0000000
Binary files a/example/UI-operation-mode.png and /dev/null differ
diff --git a/example/UI-prompt-style.png b/example/UI-prompt-style.png
deleted file mode 100644
index aa766db..0000000
Binary files a/example/UI-prompt-style.png and /dev/null differ
diff --git a/examples/example-1-quick-iteration.png b/examples/example-1-quick-iteration.png
new file mode 100644
index 0000000..66f4685
Binary files /dev/null and b/examples/example-1-quick-iteration.png differ
diff --git a/examples/example-2-high-quality.png b/examples/example-2-high-quality.png
new file mode 100644
index 0000000..b920801
Binary files /dev/null and b/examples/example-2-high-quality.png differ
diff --git a/examples/example-2-quality-settings.png b/examples/example-2-quality-settings.png
new file mode 100644
index 0000000..3a8d250
Binary files /dev/null and b/examples/example-2-quality-settings.png differ
diff --git a/examples/example-3-watching-the-universe-end.png b/examples/example-3-watching-the-universe-end.png
new file mode 100644
index 0000000..cb6ab8e
Binary files /dev/null and b/examples/example-3-watching-the-universe-end.png differ
diff --git a/examples/example-4-albert-einstein.png b/examples/example-4-albert-einstein.png
new file mode 100644
index 0000000..481ebf6
Binary files /dev/null and b/examples/example-4-albert-einstein.png differ
diff --git a/examples/example-5-dragon.png b/examples/example-5-dragon.png
new file mode 100644
index 0000000..7fe89e7
Binary files /dev/null and b/examples/example-5-dragon.png differ
diff --git a/examples/example-6-revision-ghost.png b/examples/example-6-revision-ghost.png
new file mode 100644
index 0000000..a32c354
Binary files /dev/null and b/examples/example-6-revision-ghost.png differ
diff --git a/examples/example-7-controlnet-sketch-warrior.png b/examples/example-7-controlnet-sketch-warrior.png
new file mode 100644
index 0000000..fd74fba
Binary files /dev/null and b/examples/example-7-controlnet-sketch-warrior.png differ
diff --git a/examples/readme.md b/examples/readme.md
new file mode 100644
index 0000000..29d4c64
--- /dev/null
+++ b/examples/readme.md
@@ -0,0 +1,57 @@
+
+# Example Images
+
+All images in this folder, except `example-2-quality-settings.png`, have the workflow embedded and can be loaded into
+ComfyUI to re-create them.
+
+To do that either load the images via the `Load` button or just drag one of the images
+on the browser window that has ComfyUI loaded.
+
+## Example 1 - Quick Iteration
+
+This image uses the default settings from the `.json` file and should generate quickly. These settings are a great
+starting point to quickly test a prompt or generate batches of images to pick from for further refinement.
+
+
+
+## Example 2 - High Quality
+
+This is a variation of example 1, but with some settings changed to produce a higher quality and higher resolution
+result in the end.
+
+
+
+Here is an overview of the main settings that can be used to get higher quality results.
+
+
+
+## Example 3 - Watching the Universe End
+
+Using a prompt from one of the signature images that were used in an older version's release on CivitAI.
+
+
+
+## Example 4 - Albert Einstein Running a Marathon
+
+This was an idea for some test images generated with an older version of this workflow during development.
+
+
+
+# Example 5 - Dragon
+
+Who doesn't like dragons? We had to have one in these examples.
+
+
+
+# Example 6 - Revision Ghost
+
+Based on a prompt idea I found on one of the Discord servers. Re-creating a similar effect without the use of a LoRA,
+but using one of the 5 included controlnet/revision stages instead.
+
+
+
+# Example 7 - Controlnet Sketch Warrior
+
+Using one of the 5 included controlnet/revision stages to create a realistic looking image of a warrior.
+
+
diff --git a/modules/__init__.py b/modules/__init__.py
index 29a86e3..3408d64 100644
--- a/modules/__init__.py
+++ b/modules/__init__.py
@@ -26,4 +26,6 @@ SOFTWARE.
"""
-LegacyVersion = "v1.x"
+from .ui import Defs
+
+print("Searge-SDXL v" + Defs.VERSION + ("-dev" if Defs.DEV_MODE else "") + " in " + Defs.EXTENSION_PATH)
diff --git a/modules/_experimental.py b/modules/_experimental.py
new file mode 100644
index 0000000..9a1c81a
--- /dev/null
+++ b/modules/_experimental.py
@@ -0,0 +1,80 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+import torch
+
+
+def gaussian_latent_noise(width=128, height=128, seed=-1, fac=0.5, batch_size=1, nul=0.0, srnd=False, ver="xl"):
+ limit = {
+ "v1": {
+ "min": {"A": -5.5618, "B": -17.1368, "C": -10.3445, "D": -8.6218},
+ "max": {"A": 13.5369, "B": 11.1997, "C": 16.3043, "D": 10.6343},
+ "nul": {"A": -5.3870, "B": -14.2931, "C": 6.2738, "D": 7.1220},
+ },
+ "xl": {
+ "min": {"A": -22.2127, "B": -20.0131, "C": -17.7673, "D": -14.9434},
+ "max": {"A": 17.9334, "B": 26.3043, "C": 33.1648, "D": 8.9380},
+ "nul": {"A": -21.9287, "B": 3.8783, "C": 2.5879, "D": 2.5435},
+ }
+ }
+
+ # seed
+ if seed >= 0:
+ torch.manual_seed(seed)
+
+ limit = limit[ver]
+
+ out = []
+ for i in range(batch_size):
+ if srnd: # shared random
+ rand = torch.rand([height, width])
+ lat = torch.stack([
+ (limit["min"]["A"] + torch.clone(rand) * (limit["max"]["A"] - limit["min"]["A"])),
+ (limit["min"]["B"] + torch.clone(rand) * (limit["max"]["B"] - limit["min"]["B"])),
+ (limit["min"]["C"] + torch.clone(rand) * (limit["max"]["C"] - limit["min"]["C"])),
+ (limit["min"]["D"] + torch.clone(rand) * (limit["max"]["D"] - limit["min"]["D"])),
+ ])
+
+ else: # separate random
+ lat = torch.stack([
+ (limit["min"]["A"] + torch.rand([height, width]) * (limit["max"]["A"] - limit["min"]["A"])),
+ (limit["min"]["B"] + torch.rand([height, width]) * (limit["max"]["B"] - limit["min"]["B"])),
+ (limit["min"]["C"] + torch.rand([height, width]) * (limit["max"]["C"] - limit["min"]["C"])),
+ (limit["min"]["D"] + torch.rand([height, width]) * (limit["max"]["D"] - limit["min"]["D"])),
+ ])
+
+ tnul = torch.stack([ # black image
+ torch.ones([height, width]) * limit["nul"]["A"],
+ torch.ones([height, width]) * limit["nul"]["B"],
+ torch.ones([height, width]) * limit["nul"]["C"],
+ torch.ones([height, width]) * limit["nul"]["D"],
+ ])
+
+ out.append(((lat * fac) * (1.0 - nul) + tnul * nul) / 2)
+
+ return {"samples": torch.stack(out)}
diff --git a/modules/after_upscaling.py b/modules/after_upscaling.py
new file mode 100644
index 0000000..013535d
--- /dev/null
+++ b/modules/after_upscaling.py
@@ -0,0 +1,62 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .data_utils import retrieve_parameter
+from .names import Names
+from .ui import UI
+
+
+# ====================================================================================================
+# Output from magic box for custom stage after a VAE decode
+# ====================================================================================================
+
+class SeargeCustomAfterUpscaling:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "custom_output": ("SRG_STAGE_OUTPUT",),
+ },
+ "optional": {
+ },
+ }
+
+ RETURN_TYPES = ("IMAGE",)
+ RETURN_NAMES = ("image",)
+ FUNCTION = "output"
+
+ CATEGORY = UI.CATEGORY_MAGIC_CUSTOM_STAGES
+
+ def output(self, custom_output):
+ if custom_output is None:
+ return (None,)
+
+ vae_decoded = retrieve_parameter(Names.S_UPSCALED, custom_output)
+ image = retrieve_parameter(Names.F_UPSCALED_IMAGE, vae_decoded)
+
+ return (image,)
diff --git a/modules/after_vae_decode.py b/modules/after_vae_decode.py
new file mode 100644
index 0000000..85d5305
--- /dev/null
+++ b/modules/after_vae_decode.py
@@ -0,0 +1,64 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .data_utils import retrieve_parameter
+from .names import Names
+from .ui import UI
+
+
+# ====================================================================================================
+# Output from magic box for custom stage after a VAE decode
+# ====================================================================================================
+
+class SeargeCustomAfterVaeDecode:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "custom_output": ("SRG_STAGE_OUTPUT",),
+ },
+ "optional": {
+ },
+ }
+
+ RETURN_TYPES = ("IMAGE",)
+ RETURN_NAMES = ("image",)
+ FUNCTION = "output"
+
+ CATEGORY = UI.CATEGORY_MAGIC_CUSTOM_STAGES
+
+ def output(self, custom_output):
+ if custom_output is None:
+ return (None,)
+
+ vae_decoded = retrieve_parameter(Names.S_VAE_DECODED, custom_output)
+ image = retrieve_parameter(Names.F_DECODED_IMAGE, vae_decoded)
+ post_processed = retrieve_parameter(Names.F_POST_PROCESSED, vae_decoded)
+
+ result = image if post_processed is None else post_processed
+ return (result,)
diff --git a/modules/controlnet/ATTRIBUTION b/modules/controlnet/ATTRIBUTION
new file mode 100644
index 0000000..45adfed
--- /dev/null
+++ b/modules/controlnet/ATTRIBUTION
@@ -0,0 +1,20 @@
+
+This uses code from:
+
+Leres Depth Map:
+- Bob Thiry (https://github.com/thygate/stable-diffusion-webui-depthmap-script)
+ (released under MIT license)
+
+Controlnet Aux:
+- Fannovel16 (https://github.com/Fannovel16/comfyui_controlnet_aux)
+ (released under Apache 2.0 license)
+
+Controlnet:
+- lllyasviel (https://github.com/lllyasviel/ControlNet/tree/main/annotator)
+ (released under Apache 2.0 license)
+
+Functions block_reduce and view_as_blocks:
+- scikit-image (https://github.com/scikit-image/scikit-image)
+ (released under BSD 3-clause license)
+
+Changes were made by Searge in August 2023 for the project https://github.com/SeargeDP/SeargeSDXL
diff --git a/modules/controlnet/LICENSE b/modules/controlnet/LICENSE
new file mode 100644
index 0000000..261eeb9
--- /dev/null
+++ b/modules/controlnet/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/modules/controlnet/__init__.py b/modules/controlnet/__init__.py
new file mode 100644
index 0000000..214c563
--- /dev/null
+++ b/modules/controlnet/__init__.py
@@ -0,0 +1,48 @@
+
+import comfy.model_management as model_management
+
+from .canny import CannyDetector
+from .hed import HEDdetector
+from .leres import LeresDetector
+from .utils import annotator_wrapper
+
+
+def canny(image, low_threshold, high_threshold):
+ annotator = CannyDetector()
+
+ low_threshold = int(low_threshold * 255)
+ high_threshold = int(high_threshold * 255)
+
+ def annotate(np_image):
+ return annotator(np_image, low_threshold=low_threshold, high_threshold=high_threshold)
+
+ return annotator_wrapper(image, annotate)
+
+
+def leres(image, rm_nearest, rm_background, annotator_model):
+ annotator = LeresDetector.from_pretrained(annotator_model).to(model_management.get_torch_device())
+
+ rm_nearest = rm_nearest * 100
+ rm_background = (1.0 - rm_background) * 100
+
+ def annotate(np_image):
+ return annotator(np_image, thr_a=rm_background, thr_b=rm_nearest)
+
+ out = annotator_wrapper(image, annotate)
+
+ del annotator
+
+ return out
+
+
+def hed(image, annotator_model):
+ annotator = HEDdetector.from_pretrained(annotator_model).to(model_management.get_torch_device())
+
+ def annotate(np_image):
+ return annotator(np_image, safe=True)
+
+ out = annotator_wrapper(image, annotate)
+
+ del annotator
+
+ return out
diff --git a/modules/controlnet/canny/__init__.py b/modules/controlnet/canny/__init__.py
new file mode 100644
index 0000000..2bb6485
--- /dev/null
+++ b/modules/controlnet/canny/__init__.py
@@ -0,0 +1,32 @@
+
+import cv2
+import numpy as np
+from PIL import Image
+from ..utils import HWC3, resize_image
+
+class CannyDetector:
+ def __call__(self, input_image=None, low_threshold=100, high_threshold=200, detect_resolution=512, image_resolution=512, output_type="np"):
+ if input_image is None:
+ raise ValueError("input_image must be defined.")
+
+ if not isinstance(input_image, np.ndarray):
+ input_image = np.array(input_image, dtype=np.uint8)
+ output_type = output_type or "pil"
+ else:
+ output_type = output_type or "np"
+
+ input_image = HWC3(input_image)
+ input_image = resize_image(input_image, detect_resolution)
+
+ detected_map = cv2.Canny(input_image, low_threshold, high_threshold)
+ detected_map = HWC3(detected_map)
+
+ img = resize_image(input_image, image_resolution)
+ H, W, C = img.shape
+
+ detected_map = cv2.resize(detected_map, (W, H), interpolation=cv2.INTER_LINEAR)
+
+ if output_type == "pil":
+ detected_map = Image.fromarray(detected_map)
+
+ return detected_map
diff --git a/modules/controlnet/hed/__init__.py b/modules/controlnet/hed/__init__.py
new file mode 100644
index 0000000..2187d3d
--- /dev/null
+++ b/modules/controlnet/hed/__init__.py
@@ -0,0 +1,119 @@
+# This is an improved version and model of HED edge detection with Apache License, Version 2.0.
+# Please use this implementation in your products
+# This implementation may produce slightly different results from Saining Xie's official implementations,
+# but it generates smoother edges and is more suitable for ControlNet as well as other image-to-image translations.
+# Different from official models and other implementations, this is an RGB-input model (rather than BGR)
+# and in this way it works better for gradio's RGB protocol
+
+import os
+
+import cv2
+import numpy as np
+import torch
+from einops import rearrange
+from PIL import Image
+
+from ..utils import HWC3, resize_image, nms, safe_step
+
+
+class DoubleConvBlock(torch.nn.Module):
+ def __init__(self, input_channel, output_channel, layer_number):
+ super().__init__()
+ self.convs = torch.nn.Sequential()
+ self.convs.append(torch.nn.Conv2d(in_channels=input_channel, out_channels=output_channel, kernel_size=(3, 3), stride=(1, 1), padding=1))
+ for i in range(1, layer_number):
+ self.convs.append(torch.nn.Conv2d(in_channels=output_channel, out_channels=output_channel, kernel_size=(3, 3), stride=(1, 1), padding=1))
+ self.projection = torch.nn.Conv2d(in_channels=output_channel, out_channels=1, kernel_size=(1, 1), stride=(1, 1), padding=0)
+
+ def __call__(self, x, down_sampling=False):
+ h = x
+ if down_sampling:
+ h = torch.nn.functional.max_pool2d(h, kernel_size=(2, 2), stride=(2, 2))
+ for conv in self.convs:
+ h = conv(h)
+ h = torch.nn.functional.relu(h)
+ return h, self.projection(h)
+
+
+class ControlNetHED_Apache2(torch.nn.Module):
+ def __init__(self):
+ super().__init__()
+ self.norm = torch.nn.Parameter(torch.zeros(size=(1, 3, 1, 1)))
+ self.block1 = DoubleConvBlock(input_channel=3, output_channel=64, layer_number=2)
+ self.block2 = DoubleConvBlock(input_channel=64, output_channel=128, layer_number=2)
+ self.block3 = DoubleConvBlock(input_channel=128, output_channel=256, layer_number=3)
+ self.block4 = DoubleConvBlock(input_channel=256, output_channel=512, layer_number=3)
+ self.block5 = DoubleConvBlock(input_channel=512, output_channel=512, layer_number=3)
+
+ def __call__(self, x):
+ h = x - self.norm
+ h, projection1 = self.block1(h)
+ h, projection2 = self.block2(h, down_sampling=True)
+ h, projection3 = self.block3(h, down_sampling=True)
+ h, projection4 = self.block4(h, down_sampling=True)
+ h, projection5 = self.block5(h, down_sampling=True)
+ return projection1, projection2, projection3, projection4, projection5
+
+class HEDdetector:
+ def __init__(self, netNetwork):
+ self.netNetwork = netNetwork
+
+ @classmethod
+ def from_pretrained(cls, pretrained_model_or_path, filename=None):
+ filename = filename or "ControlNetHED.pth"
+
+ if os.path.isdir(pretrained_model_or_path):
+ model_path = os.path.join(pretrained_model_or_path, filename)
+ else:
+ model_path = pretrained_model_or_path
+
+ netNetwork = ControlNetHED_Apache2()
+ netNetwork.load_state_dict(torch.load(model_path, map_location='cpu'))
+ netNetwork.float().eval()
+
+ return cls(netNetwork)
+
+ def to(self, device):
+ self.netNetwork.to(device)
+ return self
+
+ def __call__(self, input_image, detect_resolution=512, image_resolution=512, safe=False, output_type="np", scribble=False):
+ device = next(iter(self.netNetwork.parameters())).device
+ if not isinstance(input_image, np.ndarray):
+ input_image = np.array(input_image, dtype=np.uint8)
+
+ input_image = HWC3(input_image)
+ input_image = resize_image(input_image, detect_resolution)
+
+ assert input_image.ndim == 3
+ H, W, C = input_image.shape
+ with torch.no_grad():
+ image_hed = torch.from_numpy(input_image.copy()).float().to(device)
+ image_hed = rearrange(image_hed, 'h w c -> 1 c h w')
+ edges = self.netNetwork(image_hed)
+ edges = [e.detach().cpu().numpy().astype(np.float32)[0, 0] for e in edges]
+ edges = [cv2.resize(e, (W, H), interpolation=cv2.INTER_LINEAR) for e in edges]
+ edges = np.stack(edges, axis=2)
+ edge = 1 / (1 + np.exp(-np.mean(edges, axis=2).astype(np.float64)))
+ if safe:
+ edge = safe_step(edge)
+ edge = (edge * 255.0).clip(0, 255).astype(np.uint8)
+
+ detected_map = edge
+ detected_map = HWC3(detected_map)
+
+ img = resize_image(input_image, image_resolution)
+ H, W, C = img.shape
+
+ detected_map = cv2.resize(detected_map, (W, H), interpolation=cv2.INTER_LINEAR)
+
+ if scribble:
+ detected_map = nms(detected_map, 127, 3.0)
+ detected_map = cv2.GaussianBlur(detected_map, (0, 0), 3.0)
+ detected_map[detected_map > 4] = 255
+ detected_map[detected_map < 255] = 0
+
+ if output_type == "pil":
+ detected_map = Image.fromarray(detected_map)
+
+ return detected_map
diff --git a/modules/controlnet/leres/__init__.py b/modules/controlnet/leres/__init__.py
new file mode 100644
index 0000000..bfb2e0b
--- /dev/null
+++ b/modules/controlnet/leres/__init__.py
@@ -0,0 +1,95 @@
+
+import os
+
+import cv2
+import numpy as np
+import torch
+from PIL import Image
+
+from ..utils import HWC3, resize_image
+from .leres.depthmap import estimateleres
+from .leres.multi_depth_model_woauxi import RelDepthModel
+from .leres.net_tools import strip_prefix_if_present
+
+
+class LeresDetector:
+ def __init__(self, model):
+ self.model = model
+
+ @classmethod
+ def from_pretrained(cls, pretrained_model_or_path, filename=None):
+ filename = filename or "res101.pth"
+
+ if os.path.isdir(pretrained_model_or_path):
+ model_path = os.path.join(pretrained_model_or_path, filename)
+ else:
+ model_path = pretrained_model_or_path
+
+ checkpoint = torch.load(model_path, map_location=torch.device('cpu'))
+
+ model = RelDepthModel(backbone='resnext101')
+ model.load_state_dict(strip_prefix_if_present(checkpoint['depth_model'], "module."), strict=True)
+ del checkpoint
+
+ return cls(model)
+
+ def to(self, device):
+ self.model.to(device)
+ return self
+
+ def __call__(self, input_image, thr_a=0, thr_b=0, detect_resolution=512, image_resolution=512, output_type="np"):
+ if not isinstance(input_image, np.ndarray):
+ input_image = np.array(input_image, dtype=np.uint8)
+
+ input_image = HWC3(input_image)
+ input_image = resize_image(input_image, detect_resolution)
+
+ assert input_image.ndim == 3
+ height, width, dim = input_image.shape
+
+ with torch.no_grad():
+
+ depth = estimateleres(input_image, self.model, width, height)
+
+ numbytes=2
+ depth_min = depth.min()
+ depth_max = depth.max()
+ max_val = (2**(8*numbytes))-1
+
+ # check output before normalizing and mapping to 16 bit
+ if depth_max - depth_min > np.finfo("float").eps:
+ out = max_val * (depth - depth_min) / (depth_max - depth_min)
+ else:
+ out = np.zeros(depth.shape)
+
+ # single channel, 16 bit image
+ depth_image = out.astype("uint16")
+
+ # convert to uint8
+ depth_image = cv2.convertScaleAbs(depth_image, alpha=(255.0/65535.0))
+
+ # remove near
+ if thr_a != 0:
+ thr_a = ((thr_a/100)*255)
+ depth_image = cv2.threshold(depth_image, thr_a, 255, cv2.THRESH_TOZERO)[1]
+
+ # invert image
+ depth_image = cv2.bitwise_not(depth_image)
+
+ # remove bg
+ if thr_b != 0:
+ thr_b = ((thr_b/100)*255)
+ depth_image = cv2.threshold(depth_image, thr_b, 255, cv2.THRESH_TOZERO)[1]
+
+ detected_map = depth_image
+ detected_map = HWC3(detected_map)
+
+ img = resize_image(input_image, image_resolution)
+ H, W, C = img.shape
+
+ detected_map = cv2.resize(detected_map, (W, H), interpolation=cv2.INTER_LINEAR)
+
+ if output_type == "pil":
+ detected_map = Image.fromarray(detected_map)
+
+ return detected_map
diff --git a/modules/controlnet/leres/leres/LICENSE b/modules/controlnet/leres/leres/LICENSE
new file mode 100644
index 0000000..e0f1d07
--- /dev/null
+++ b/modules/controlnet/leres/leres/LICENSE
@@ -0,0 +1,23 @@
+https://github.com/thygate/stable-diffusion-webui-depthmap-script
+
+MIT License
+
+Copyright (c) 2023 Bob Thiry
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/modules/controlnet/leres/leres/Resnet.py b/modules/controlnet/leres/leres/Resnet.py
new file mode 100644
index 0000000..f12c997
--- /dev/null
+++ b/modules/controlnet/leres/leres/Resnet.py
@@ -0,0 +1,199 @@
+import torch.nn as nn
+import torch.nn as NN
+
+__all__ = ['ResNet', 'resnet18', 'resnet34', 'resnet50', 'resnet101',
+ 'resnet152']
+
+
+model_urls = {
+ 'resnet18': 'https://download.pytorch.org/models/resnet18-5c106cde.pth',
+ 'resnet34': 'https://download.pytorch.org/models/resnet34-333f7ec4.pth',
+ 'resnet50': 'https://download.pytorch.org/models/resnet50-19c8e357.pth',
+ 'resnet101': 'https://download.pytorch.org/models/resnet101-5d3b4d8f.pth',
+ 'resnet152': 'https://download.pytorch.org/models/resnet152-b121ed2d.pth',
+}
+
+
+def conv3x3(in_planes, out_planes, stride=1):
+ """3x3 convolution with padding"""
+ return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride,
+ padding=1, bias=False)
+
+
+class BasicBlock(nn.Module):
+ expansion = 1
+
+ def __init__(self, inplanes, planes, stride=1, downsample=None):
+ super(BasicBlock, self).__init__()
+ self.conv1 = conv3x3(inplanes, planes, stride)
+ self.bn1 = NN.BatchNorm2d(planes) #NN.BatchNorm2d
+ self.relu = nn.ReLU(inplace=True)
+ self.conv2 = conv3x3(planes, planes)
+ self.bn2 = NN.BatchNorm2d(planes) #NN.BatchNorm2d
+ self.downsample = downsample
+ self.stride = stride
+
+ def forward(self, x):
+ residual = x
+
+ out = self.conv1(x)
+ out = self.bn1(out)
+ out = self.relu(out)
+
+ out = self.conv2(out)
+ out = self.bn2(out)
+
+ if self.downsample is not None:
+ residual = self.downsample(x)
+
+ out += residual
+ out = self.relu(out)
+
+ return out
+
+
+class Bottleneck(nn.Module):
+ expansion = 4
+
+ def __init__(self, inplanes, planes, stride=1, downsample=None):
+ super(Bottleneck, self).__init__()
+ self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False)
+ self.bn1 = NN.BatchNorm2d(planes) #NN.BatchNorm2d
+ self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride,
+ padding=1, bias=False)
+ self.bn2 = NN.BatchNorm2d(planes) #NN.BatchNorm2d
+ self.conv3 = nn.Conv2d(planes, planes * self.expansion, kernel_size=1, bias=False)
+ self.bn3 = NN.BatchNorm2d(planes * self.expansion) #NN.BatchNorm2d
+ self.relu = nn.ReLU(inplace=True)
+ self.downsample = downsample
+ self.stride = stride
+
+ def forward(self, x):
+ residual = x
+
+ out = self.conv1(x)
+ out = self.bn1(out)
+ out = self.relu(out)
+
+ out = self.conv2(out)
+ out = self.bn2(out)
+ out = self.relu(out)
+
+ out = self.conv3(out)
+ out = self.bn3(out)
+
+ if self.downsample is not None:
+ residual = self.downsample(x)
+
+ out += residual
+ out = self.relu(out)
+
+ return out
+
+
+class ResNet(nn.Module):
+
+ def __init__(self, block, layers, num_classes=1000):
+ self.inplanes = 64
+ super(ResNet, self).__init__()
+ self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3,
+ bias=False)
+ self.bn1 = NN.BatchNorm2d(64) #NN.BatchNorm2d
+ self.relu = nn.ReLU(inplace=True)
+ self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
+ self.layer1 = self._make_layer(block, 64, layers[0])
+ self.layer2 = self._make_layer(block, 128, layers[1], stride=2)
+ self.layer3 = self._make_layer(block, 256, layers[2], stride=2)
+ self.layer4 = self._make_layer(block, 512, layers[3], stride=2)
+ #self.avgpool = nn.AvgPool2d(7, stride=1)
+ #self.fc = nn.Linear(512 * block.expansion, num_classes)
+
+ for m in self.modules():
+ if isinstance(m, nn.Conv2d):
+ nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
+ elif isinstance(m, nn.BatchNorm2d):
+ nn.init.constant_(m.weight, 1)
+ nn.init.constant_(m.bias, 0)
+
+ def _make_layer(self, block, planes, blocks, stride=1):
+ downsample = None
+ if stride != 1 or self.inplanes != planes * block.expansion:
+ downsample = nn.Sequential(
+ nn.Conv2d(self.inplanes, planes * block.expansion,
+ kernel_size=1, stride=stride, bias=False),
+ NN.BatchNorm2d(planes * block.expansion), #NN.BatchNorm2d
+ )
+
+ layers = []
+ layers.append(block(self.inplanes, planes, stride, downsample))
+ self.inplanes = planes * block.expansion
+ for i in range(1, blocks):
+ layers.append(block(self.inplanes, planes))
+
+ return nn.Sequential(*layers)
+
+ def forward(self, x):
+ features = []
+
+ x = self.conv1(x)
+ x = self.bn1(x)
+ x = self.relu(x)
+ x = self.maxpool(x)
+
+ x = self.layer1(x)
+ features.append(x)
+ x = self.layer2(x)
+ features.append(x)
+ x = self.layer3(x)
+ features.append(x)
+ x = self.layer4(x)
+ features.append(x)
+
+ return features
+
+
+def resnet18(pretrained=True, **kwargs):
+ """Constructs a ResNet-18 model.
+ Args:
+ pretrained (bool): If True, returns a model pre-trained on ImageNet
+ """
+ model = ResNet(BasicBlock, [2, 2, 2, 2], **kwargs)
+ return model
+
+
+def resnet34(pretrained=True, **kwargs):
+ """Constructs a ResNet-34 model.
+ Args:
+ pretrained (bool): If True, returns a model pre-trained on ImageNet
+ """
+ model = ResNet(BasicBlock, [3, 4, 6, 3], **kwargs)
+ return model
+
+
+def resnet50(pretrained=True, **kwargs):
+ """Constructs a ResNet-50 model.
+ Args:
+ pretrained (bool): If True, returns a model pre-trained on ImageNet
+ """
+ model = ResNet(Bottleneck, [3, 4, 6, 3], **kwargs)
+
+ return model
+
+
+def resnet101(pretrained=True, **kwargs):
+ """Constructs a ResNet-101 model.
+ Args:
+ pretrained (bool): If True, returns a model pre-trained on ImageNet
+ """
+ model = ResNet(Bottleneck, [3, 4, 23, 3], **kwargs)
+
+ return model
+
+
+def resnet152(pretrained=True, **kwargs):
+ """Constructs a ResNet-152 model.
+ Args:
+ pretrained (bool): If True, returns a model pre-trained on ImageNet
+ """
+ model = ResNet(Bottleneck, [3, 8, 36, 3], **kwargs)
+ return model
diff --git a/modules/controlnet/leres/leres/Resnext_torch.py b/modules/controlnet/leres/leres/Resnext_torch.py
new file mode 100644
index 0000000..9af54fc
--- /dev/null
+++ b/modules/controlnet/leres/leres/Resnext_torch.py
@@ -0,0 +1,237 @@
+#!/usr/bin/env python
+# coding: utf-8
+import torch.nn as nn
+
+try:
+ from urllib import urlretrieve
+except ImportError:
+ from urllib.request import urlretrieve
+
+__all__ = ['resnext101_32x8d']
+
+
+model_urls = {
+ 'resnext50_32x4d': 'https://download.pytorch.org/models/resnext50_32x4d-7cdf4587.pth',
+ 'resnext101_32x8d': 'https://download.pytorch.org/models/resnext101_32x8d-8ba56ff5.pth',
+}
+
+
+def conv3x3(in_planes, out_planes, stride=1, groups=1, dilation=1):
+ """3x3 convolution with padding"""
+ return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride,
+ padding=dilation, groups=groups, bias=False, dilation=dilation)
+
+
+def conv1x1(in_planes, out_planes, stride=1):
+ """1x1 convolution"""
+ return nn.Conv2d(in_planes, out_planes, kernel_size=1, stride=stride, bias=False)
+
+
+class BasicBlock(nn.Module):
+ expansion = 1
+
+ def __init__(self, inplanes, planes, stride=1, downsample=None, groups=1,
+ base_width=64, dilation=1, norm_layer=None):
+ super(BasicBlock, self).__init__()
+ if norm_layer is None:
+ norm_layer = nn.BatchNorm2d
+ if groups != 1 or base_width != 64:
+ raise ValueError('BasicBlock only supports groups=1 and base_width=64')
+ if dilation > 1:
+ raise NotImplementedError("Dilation > 1 not supported in BasicBlock")
+ # Both self.conv1 and self.downsample layers downsample the input when stride != 1
+ self.conv1 = conv3x3(inplanes, planes, stride)
+ self.bn1 = norm_layer(planes)
+ self.relu = nn.ReLU(inplace=True)
+ self.conv2 = conv3x3(planes, planes)
+ self.bn2 = norm_layer(planes)
+ self.downsample = downsample
+ self.stride = stride
+
+ def forward(self, x):
+ identity = x
+
+ out = self.conv1(x)
+ out = self.bn1(out)
+ out = self.relu(out)
+
+ out = self.conv2(out)
+ out = self.bn2(out)
+
+ if self.downsample is not None:
+ identity = self.downsample(x)
+
+ out += identity
+ out = self.relu(out)
+
+ return out
+
+
+class Bottleneck(nn.Module):
+ # Bottleneck in torchvision places the stride for downsampling at 3x3 convolution(self.conv2)
+ # while original implementation places the stride at the first 1x1 convolution(self.conv1)
+ # according to "Deep residual learning for image recognition"https://arxiv.org/abs/1512.03385.
+ # This variant is also known as ResNet V1.5 and improves accuracy according to
+ # https://ngc.nvidia.com/catalog/model-scripts/nvidia:resnet_50_v1_5_for_pytorch.
+
+ expansion = 4
+
+ def __init__(self, inplanes, planes, stride=1, downsample=None, groups=1,
+ base_width=64, dilation=1, norm_layer=None):
+ super(Bottleneck, self).__init__()
+ if norm_layer is None:
+ norm_layer = nn.BatchNorm2d
+ width = int(planes * (base_width / 64.)) * groups
+ # Both self.conv2 and self.downsample layers downsample the input when stride != 1
+ self.conv1 = conv1x1(inplanes, width)
+ self.bn1 = norm_layer(width)
+ self.conv2 = conv3x3(width, width, stride, groups, dilation)
+ self.bn2 = norm_layer(width)
+ self.conv3 = conv1x1(width, planes * self.expansion)
+ self.bn3 = norm_layer(planes * self.expansion)
+ self.relu = nn.ReLU(inplace=True)
+ self.downsample = downsample
+ self.stride = stride
+
+ def forward(self, x):
+ identity = x
+
+ out = self.conv1(x)
+ out = self.bn1(out)
+ out = self.relu(out)
+
+ out = self.conv2(out)
+ out = self.bn2(out)
+ out = self.relu(out)
+
+ out = self.conv3(out)
+ out = self.bn3(out)
+
+ if self.downsample is not None:
+ identity = self.downsample(x)
+
+ out += identity
+ out = self.relu(out)
+
+ return out
+
+
+class ResNet(nn.Module):
+
+ def __init__(self, block, layers, num_classes=1000, zero_init_residual=False,
+ groups=1, width_per_group=64, replace_stride_with_dilation=None,
+ norm_layer=None):
+ super(ResNet, self).__init__()
+ if norm_layer is None:
+ norm_layer = nn.BatchNorm2d
+ self._norm_layer = norm_layer
+
+ self.inplanes = 64
+ self.dilation = 1
+ if replace_stride_with_dilation is None:
+ # each element in the tuple indicates if we should replace
+ # the 2x2 stride with a dilated convolution instead
+ replace_stride_with_dilation = [False, False, False]
+ if len(replace_stride_with_dilation) != 3:
+ raise ValueError("replace_stride_with_dilation should be None "
+ "or a 3-element tuple, got {}".format(replace_stride_with_dilation))
+ self.groups = groups
+ self.base_width = width_per_group
+ self.conv1 = nn.Conv2d(3, self.inplanes, kernel_size=7, stride=2, padding=3,
+ bias=False)
+ self.bn1 = norm_layer(self.inplanes)
+ self.relu = nn.ReLU(inplace=True)
+ self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
+ self.layer1 = self._make_layer(block, 64, layers[0])
+ self.layer2 = self._make_layer(block, 128, layers[1], stride=2,
+ dilate=replace_stride_with_dilation[0])
+ self.layer3 = self._make_layer(block, 256, layers[2], stride=2,
+ dilate=replace_stride_with_dilation[1])
+ self.layer4 = self._make_layer(block, 512, layers[3], stride=2,
+ dilate=replace_stride_with_dilation[2])
+ #self.avgpool = nn.AdaptiveAvgPool2d((1, 1))
+ #self.fc = nn.Linear(512 * block.expansion, num_classes)
+
+ for m in self.modules():
+ if isinstance(m, nn.Conv2d):
+ nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
+ elif isinstance(m, (nn.BatchNorm2d, nn.GroupNorm)):
+ nn.init.constant_(m.weight, 1)
+ nn.init.constant_(m.bias, 0)
+
+ # Zero-initialize the last BN in each residual branch,
+ # so that the residual branch starts with zeros, and each residual block behaves like an identity.
+ # This improves the model by 0.2~0.3% according to https://arxiv.org/abs/1706.02677
+ if zero_init_residual:
+ for m in self.modules():
+ if isinstance(m, Bottleneck):
+ nn.init.constant_(m.bn3.weight, 0)
+ elif isinstance(m, BasicBlock):
+ nn.init.constant_(m.bn2.weight, 0)
+
+ def _make_layer(self, block, planes, blocks, stride=1, dilate=False):
+ norm_layer = self._norm_layer
+ downsample = None
+ previous_dilation = self.dilation
+ if dilate:
+ self.dilation *= stride
+ stride = 1
+ if stride != 1 or self.inplanes != planes * block.expansion:
+ downsample = nn.Sequential(
+ conv1x1(self.inplanes, planes * block.expansion, stride),
+ norm_layer(planes * block.expansion),
+ )
+
+ layers = []
+ layers.append(block(self.inplanes, planes, stride, downsample, self.groups,
+ self.base_width, previous_dilation, norm_layer))
+ self.inplanes = planes * block.expansion
+ for _ in range(1, blocks):
+ layers.append(block(self.inplanes, planes, groups=self.groups,
+ base_width=self.base_width, dilation=self.dilation,
+ norm_layer=norm_layer))
+
+ return nn.Sequential(*layers)
+
+ def _forward_impl(self, x):
+ # See note [TorchScript super()]
+ features = []
+ x = self.conv1(x)
+ x = self.bn1(x)
+ x = self.relu(x)
+ x = self.maxpool(x)
+
+ x = self.layer1(x)
+ features.append(x)
+
+ x = self.layer2(x)
+ features.append(x)
+
+ x = self.layer3(x)
+ features.append(x)
+
+ x = self.layer4(x)
+ features.append(x)
+
+ #x = self.avgpool(x)
+ #x = torch.flatten(x, 1)
+ #x = self.fc(x)
+
+ return features
+
+ def forward(self, x):
+ return self._forward_impl(x)
+
+
+
+def resnext101_32x8d(pretrained=True, **kwargs):
+ """Constructs a ResNet-152 model.
+ Args:
+ pretrained (bool): If True, returns a model pre-trained on ImageNet
+ """
+ kwargs['groups'] = 32
+ kwargs['width_per_group'] = 8
+
+ model = ResNet(Bottleneck, [3, 4, 23, 3], **kwargs)
+ return model
+
diff --git a/modules/controlnet/leres/leres/__init__.py b/modules/controlnet/leres/leres/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/modules/controlnet/leres/leres/depthmap.py b/modules/controlnet/leres/leres/depthmap.py
new file mode 100644
index 0000000..eaa6513
--- /dev/null
+++ b/modules/controlnet/leres/leres/depthmap.py
@@ -0,0 +1,349 @@
+# Author: thygate
+# https://github.com/thygate/stable-diffusion-webui-depthmap-script
+
+import gc
+from operator import getitem
+
+import cv2
+import numpy as np
+import torch
+from torchvision.transforms import transforms
+
+whole_size_threshold = 1600 # R_max from the paper
+pix2pixsize = 1024
+
+def scale_torch(img):
+ """
+ Scale the image and output it in torch.tensor.
+ :param img: input rgb is in shape [H, W, C], input depth/disp is in shape [H, W]
+ :param scale: the scale factor. float
+ :return: img. [C, H, W]
+ """
+ if len(img.shape) == 2:
+ img = img[np.newaxis, :, :]
+ if img.shape[2] == 3:
+ transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.485, 0.456, 0.406) , (0.229, 0.224, 0.225) )])
+ img = transform(img.astype(np.float32))
+ else:
+ img = img.astype(np.float32)
+ img = torch.from_numpy(img)
+ return img
+
+def estimateleres(img, model, w, h):
+ device = next(iter(model.parameters())).device
+ # leres transform input
+ rgb_c = img[:, :, ::-1].copy()
+ A_resize = cv2.resize(rgb_c, (w, h))
+ img_torch = scale_torch(A_resize)[None, :, :, :]
+
+ # compute
+ with torch.no_grad():
+ img_torch = img_torch.to(device)
+ prediction = model.depth_model(img_torch)
+
+ prediction = prediction.squeeze().cpu().numpy()
+ prediction = cv2.resize(prediction, (img.shape[1], img.shape[0]), interpolation=cv2.INTER_CUBIC)
+
+ return prediction
+
+def generatemask(size):
+ # Generates a Guassian mask
+ mask = np.zeros(size, dtype=np.float32)
+ sigma = int(size[0]/16)
+ k_size = int(2 * np.ceil(2 * int(size[0]/16)) + 1)
+ mask[int(0.15*size[0]):size[0] - int(0.15*size[0]), int(0.15*size[1]): size[1] - int(0.15*size[1])] = 1
+ mask = cv2.GaussianBlur(mask, (int(k_size), int(k_size)), sigma)
+ mask = (mask - mask.min()) / (mask.max() - mask.min())
+ mask = mask.astype(np.float32)
+ return mask
+
+def resizewithpool(img, size):
+ i_size = img.shape[0]
+ n = int(np.floor(i_size/size))
+
+ out = block_reduce(img, (n, n), np.max)
+ return out
+
+def rgb2gray(rgb):
+ # Converts rgb to gray
+ return np.dot(rgb[..., :3], [0.2989, 0.5870, 0.1140])
+
+def calculateprocessingres(img, basesize, confidence=0.1, scale_threshold=3, whole_size_threshold=3000):
+ # Returns the R_x resolution described in section 5 of the main paper.
+
+ # Parameters:
+ # img :input rgb image
+ # basesize : size the dilation kernel which is equal to receptive field of the network.
+ # confidence: value of x in R_x; allowed percentage of pixels that are not getting any contextual cue.
+ # scale_threshold: maximum allowed upscaling on the input image ; it has been set to 3.
+ # whole_size_threshold: maximum allowed resolution. (R_max from section 6 of the main paper)
+
+ # Returns:
+ # outputsize_scale*speed_scale :The computed R_x resolution
+ # patch_scale: K parameter from section 6 of the paper
+
+ # speed scale parameter is to process every image in a smaller size to accelerate the R_x resolution search
+ speed_scale = 32
+ image_dim = int(min(img.shape[0:2]))
+
+ gray = rgb2gray(img)
+ grad = np.abs(cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=3)) + np.abs(cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3))
+ grad = cv2.resize(grad, (image_dim, image_dim), cv2.INTER_AREA)
+
+ # thresholding the gradient map to generate the edge-map as a proxy of the contextual cues
+ m = grad.min()
+ M = grad.max()
+ middle = m + (0.4 * (M - m))
+ grad[grad < middle] = 0
+ grad[grad >= middle] = 1
+
+ # dilation kernel with size of the receptive field
+ kernel = np.ones((int(basesize/speed_scale), int(basesize/speed_scale)), float)
+ # dilation kernel with size of the a quarter of receptive field used to compute k
+ # as described in section 6 of main paper
+ kernel2 = np.ones((int(basesize / (4*speed_scale)), int(basesize / (4*speed_scale))), float)
+
+ # Output resolution limit set by the whole_size_threshold and scale_threshold.
+ threshold = min(whole_size_threshold, scale_threshold * max(img.shape[:2]))
+
+ outputsize_scale = basesize / speed_scale
+ for p_size in range(int(basesize/speed_scale), int(threshold/speed_scale), int(basesize / (2*speed_scale))):
+ grad_resized = resizewithpool(grad, p_size)
+ grad_resized = cv2.resize(grad_resized, (p_size, p_size), cv2.INTER_NEAREST)
+ grad_resized[grad_resized >= 0.5] = 1
+ grad_resized[grad_resized < 0.5] = 0
+
+ dilated = cv2.dilate(grad_resized, kernel, iterations=1)
+ meanvalue = (1-dilated).mean()
+ if meanvalue > confidence:
+ break
+ else:
+ outputsize_scale = p_size
+
+ grad_region = cv2.dilate(grad_resized, kernel2, iterations=1)
+ patch_scale = grad_region.mean()
+
+ return int(outputsize_scale*speed_scale), patch_scale
+
+# Generate a double-input depth estimation
+def doubleestimate(img, size1, size2, pix2pixsize, model, net_type, pix2pixmodel):
+ # Generate the low resolution estimation
+ estimate1 = singleestimate(img, size1, model, net_type)
+ # Resize to the inference size of merge network.
+ estimate1 = cv2.resize(estimate1, (pix2pixsize, pix2pixsize), interpolation=cv2.INTER_CUBIC)
+
+ # Generate the high resolution estimation
+ estimate2 = singleestimate(img, size2, model, net_type)
+ # Resize to the inference size of merge network.
+ estimate2 = cv2.resize(estimate2, (pix2pixsize, pix2pixsize), interpolation=cv2.INTER_CUBIC)
+
+ # Inference on the merge model
+ pix2pixmodel.set_input(estimate1, estimate2)
+ pix2pixmodel.test()
+ visuals = pix2pixmodel.get_current_visuals()
+ prediction_mapped = visuals['fake_B']
+ prediction_mapped = (prediction_mapped+1)/2
+ prediction_mapped = (prediction_mapped - torch.min(prediction_mapped)) / (
+ torch.max(prediction_mapped) - torch.min(prediction_mapped))
+ prediction_mapped = prediction_mapped.squeeze().cpu().numpy()
+
+ return prediction_mapped
+
+# Generate a single-input depth estimation
+def singleestimate(img, msize, model, net_type):
+ # if net_type == 0:
+ return estimateleres(img, model, msize, msize)
+ # else:
+ # return estimatemidasBoost(img, model, msize, msize)
+
+def applyGridpatch(blsize, stride, img, box):
+ # Extract a simple grid patch.
+ counter1 = 0
+ patch_bound_list = {}
+ for k in range(blsize, img.shape[1] - blsize, stride):
+ for j in range(blsize, img.shape[0] - blsize, stride):
+ patch_bound_list[str(counter1)] = {}
+ patchbounds = [j - blsize, k - blsize, j - blsize + 2 * blsize, k - blsize + 2 * blsize]
+ patch_bound = [box[0] + patchbounds[1], box[1] + patchbounds[0], patchbounds[3] - patchbounds[1],
+ patchbounds[2] - patchbounds[0]]
+ patch_bound_list[str(counter1)]['rect'] = patch_bound
+ patch_bound_list[str(counter1)]['size'] = patch_bound[2]
+ counter1 = counter1 + 1
+ return patch_bound_list
+
+def getGF_fromintegral(integralimage, rect):
+ # Computes the gradient density of a given patch from the gradient integral image.
+ x1 = rect[1]
+ x2 = rect[1]+rect[3]
+ y1 = rect[0]
+ y2 = rect[0]+rect[2]
+ value = integralimage[x2, y2]-integralimage[x1, y2]-integralimage[x2, y1]+integralimage[x1, y1]
+ return value
+
+def impatch(image, rect):
+ # Extract the given patch pixels from a given image.
+ w1 = rect[0]
+ h1 = rect[1]
+ w2 = w1 + rect[2]
+ h2 = h1 + rect[3]
+ image_patch = image[h1:h2, w1:w2]
+ return image_patch
+
+class ImageandPatchs:
+ def __init__(self, root_dir, name, patchsinfo, rgb_image, scale=1):
+ self.root_dir = root_dir
+ self.patchsinfo = patchsinfo
+ self.name = name
+ self.patchs = patchsinfo
+ self.scale = scale
+
+ self.rgb_image = cv2.resize(rgb_image, (round(rgb_image.shape[1]*scale), round(rgb_image.shape[0]*scale)),
+ interpolation=cv2.INTER_CUBIC)
+
+ self.do_have_estimate = False
+ self.estimation_updated_image = None
+ self.estimation_base_image = None
+
+ def __len__(self):
+ return len(self.patchs)
+
+ def set_base_estimate(self, est):
+ self.estimation_base_image = est
+ if self.estimation_updated_image is not None:
+ self.do_have_estimate = True
+
+ def set_updated_estimate(self, est):
+ self.estimation_updated_image = est
+ if self.estimation_base_image is not None:
+ self.do_have_estimate = True
+
+ def __getitem__(self, index):
+ patch_id = int(self.patchs[index][0])
+ rect = np.array(self.patchs[index][1]['rect'])
+ msize = self.patchs[index][1]['size']
+
+ ## applying scale to rect:
+ rect = np.round(rect * self.scale)
+ rect = rect.astype('int')
+ msize = round(msize * self.scale)
+
+ patch_rgb = impatch(self.rgb_image, rect)
+ if self.do_have_estimate:
+ patch_whole_estimate_base = impatch(self.estimation_base_image, rect)
+ patch_whole_estimate_updated = impatch(self.estimation_updated_image, rect)
+ return {'patch_rgb': patch_rgb, 'patch_whole_estimate_base': patch_whole_estimate_base,
+ 'patch_whole_estimate_updated': patch_whole_estimate_updated, 'rect': rect,
+ 'size': msize, 'id': patch_id}
+ else:
+ return {'patch_rgb': patch_rgb, 'rect': rect, 'size': msize, 'id': patch_id}
+
+ def print_options(self, opt):
+ """Print and save options
+
+ It will print both current options and default values(if different).
+ It will save options into a text file / [checkpoints_dir] / opt.txt
+ """
+ message = ''
+ message += '----------------- Options ---------------\n'
+ for k, v in sorted(vars(opt).items()):
+ comment = ''
+ default = self.parser.get_default(k)
+ if v != default:
+ comment = '\t[default: %s]' % str(default)
+ message += '{:>25}: {:<30}{}\n'.format(str(k), str(v), comment)
+ message += '----------------- End -------------------'
+ print(message)
+
+ # save to the disk
+ """
+ expr_dir = os.path.join(opt.checkpoints_dir, opt.name)
+ util.mkdirs(expr_dir)
+ file_name = os.path.join(expr_dir, '{}_opt.txt'.format(opt.phase))
+ with open(file_name, 'wt') as opt_file:
+ opt_file.write(message)
+ opt_file.write('\n')
+ """
+
+ def parse(self):
+ """Parse our options, create checkpoints directory suffix, and set up gpu device."""
+ opt = self.gather_options()
+ opt.isTrain = self.isTrain # train or test
+
+ # process opt.suffix
+ if opt.suffix:
+ suffix = ('_' + opt.suffix.format(**vars(opt))) if opt.suffix != '' else ''
+ opt.name = opt.name + suffix
+
+ #self.print_options(opt)
+
+ # set gpu ids
+ str_ids = opt.gpu_ids.split(',')
+ opt.gpu_ids = []
+ for str_id in str_ids:
+ id = int(str_id)
+ if id >= 0:
+ opt.gpu_ids.append(id)
+ #if len(opt.gpu_ids) > 0:
+ # torch.cuda.set_device(opt.gpu_ids[0])
+
+ self.opt = opt
+ return self.opt
+
+# --------------------====================--------------------
+
+from numpy.lib.stride_tricks import as_strided
+
+
+def view_as_blocks(arr_in, block_shape):
+ if not isinstance(block_shape, tuple):
+ raise TypeError('block needs to be a tuple')
+
+ block_shape = np.array(block_shape)
+ if (block_shape <= 0).any():
+ raise ValueError("'block_shape' elements must be strictly positive")
+
+ if block_shape.size != arr_in.ndim:
+ raise ValueError("'block_shape' must have the same length "
+ "as 'arr_in.shape'")
+
+ arr_shape = np.array(arr_in.shape)
+ if (arr_shape % block_shape).sum() != 0:
+ raise ValueError("'block_shape' is not compatible with 'arr_in'")
+
+ # -- restride the array to build the block view
+ new_shape = tuple(arr_shape // block_shape) + tuple(block_shape)
+ new_strides = tuple(arr_in.strides * block_shape) + arr_in.strides
+
+ arr_out = as_strided(arr_in, shape=new_shape, strides=new_strides)
+
+ return arr_out
+
+
+def block_reduce(image, block_size=2, func=np.sum, cval=0, func_kwargs=None):
+ if np.isscalar(block_size):
+ block_size = (block_size,) * image.ndim
+ elif len(block_size) != image.ndim:
+ raise ValueError("`block_size` must be a scalar or have "
+ "the same length as `image.shape`")
+
+ if func_kwargs is None:
+ func_kwargs = {}
+
+ pad_width = []
+ for i in range(len(block_size)):
+ if block_size[i] < 1:
+ raise ValueError("Down-sampling factors must be >= 1. Use "
+ "`skimage.transform.resize` to up-sample an "
+ "image.")
+ if image.shape[i] % block_size[i] != 0:
+ after_width = block_size[i] - (image.shape[i] % block_size[i])
+ else:
+ after_width = 0
+ pad_width.append((0, after_width))
+
+ image = np.pad(image, pad_width=pad_width, mode='constant',
+ constant_values=cval)
+
+ blocked = view_as_blocks(image, block_size)
+
+ return func(blocked, axis=tuple(range(image.ndim, blocked.ndim)), **func_kwargs)
diff --git a/modules/controlnet/leres/leres/multi_depth_model_woauxi.py b/modules/controlnet/leres/leres/multi_depth_model_woauxi.py
new file mode 100644
index 0000000..c210ec2
--- /dev/null
+++ b/modules/controlnet/leres/leres/multi_depth_model_woauxi.py
@@ -0,0 +1,40 @@
+import torch
+import torch.nn as nn
+
+from . import network_auxi as network
+from .net_tools import get_func
+
+
+class RelDepthModel(nn.Module):
+ def __init__(self, backbone='resnet50'):
+ super(RelDepthModel, self).__init__()
+ if backbone == 'resnet50':
+ encoder = 'resnet50_stride32'
+ elif backbone == 'resnext101':
+ encoder = 'resnext101_stride32x8d'
+ self.depth_model = DepthModel(encoder)
+
+ def inference(self, rgb):
+ with torch.no_grad():
+ input = rgb.to(self.depth_model.device)
+ depth = self.depth_model(input)
+ #pred_depth_out = depth - depth.min() + 0.01
+ return depth #pred_depth_out
+
+
+class DepthModel(nn.Module):
+ def __init__(self, encoder):
+ super(DepthModel, self).__init__()
+ if encoder == "resnet50_stride32":
+ self.encoder_modules = network.resnet50_stride32()
+ elif encoder == "resnext101_stride32x8d":
+ self.encoder_modules = network.resnext101_stride32x8d()
+ else:
+ backbone = network.__name__.split('.')[-1] + '.' + encoder
+ self.encoder_modules = get_func(backbone)()
+ self.decoder_modules = network.Decoder()
+
+ def forward(self, x):
+ lateral_out = self.encoder_modules(x)
+ out_logit = self.decoder_modules(lateral_out)
+ return out_logit
\ No newline at end of file
diff --git a/modules/controlnet/leres/leres/net_tools.py b/modules/controlnet/leres/leres/net_tools.py
new file mode 100644
index 0000000..2f21331
--- /dev/null
+++ b/modules/controlnet/leres/leres/net_tools.py
@@ -0,0 +1,54 @@
+import importlib
+import torch
+import os
+from collections import OrderedDict
+
+
+def get_func(func_name):
+ """Helper to return a function object by name. func_name must identify a
+ function in this module or the path to a function relative to the base
+ 'modeling' module.
+ """
+ if func_name == '':
+ return None
+ try:
+ parts = func_name.split('.')
+ # Refers to a function in this module
+ if len(parts) == 1:
+ return globals()[parts[0]]
+ # Otherwise, assume we're referencing a module under modeling
+ module_name = 'controlnet_aux.leres.leres.' + '.'.join(parts[:-1])
+ module = importlib.import_module(module_name)
+ return getattr(module, parts[-1])
+ except Exception:
+ print('Failed to f1ind function: %s', func_name)
+ raise
+
+def load_ckpt(args, depth_model, shift_model, focal_model):
+ """
+ Load checkpoint.
+ """
+ if os.path.isfile(args.load_ckpt):
+ print("loading checkpoint %s" % args.load_ckpt)
+ checkpoint = torch.load(args.load_ckpt)
+ if shift_model is not None:
+ shift_model.load_state_dict(strip_prefix_if_present(checkpoint['shift_model'], 'module.'),
+ strict=True)
+ if focal_model is not None:
+ focal_model.load_state_dict(strip_prefix_if_present(checkpoint['focal_model'], 'module.'),
+ strict=True)
+ depth_model.load_state_dict(strip_prefix_if_present(checkpoint['depth_model'], "module."),
+ strict=True)
+ del checkpoint
+ if torch.cuda.is_available():
+ torch.cuda.empty_cache()
+
+
+def strip_prefix_if_present(state_dict, prefix):
+ keys = sorted(state_dict.keys())
+ if not all(key.startswith(prefix) for key in keys):
+ return state_dict
+ stripped_state_dict = OrderedDict()
+ for key, value in state_dict.items():
+ stripped_state_dict[key.replace(prefix, "")] = value
+ return stripped_state_dict
\ No newline at end of file
diff --git a/modules/controlnet/leres/leres/network_auxi.py b/modules/controlnet/leres/leres/network_auxi.py
new file mode 100644
index 0000000..1bd8701
--- /dev/null
+++ b/modules/controlnet/leres/leres/network_auxi.py
@@ -0,0 +1,417 @@
+import torch
+import torch.nn as nn
+import torch.nn.init as init
+
+from . import Resnet, Resnext_torch
+
+
+def resnet50_stride32():
+ return DepthNet(backbone='resnet', depth=50, upfactors=[2, 2, 2, 2])
+
+def resnext101_stride32x8d():
+ return DepthNet(backbone='resnext101_32x8d', depth=101, upfactors=[2, 2, 2, 2])
+
+
+class Decoder(nn.Module):
+ def __init__(self):
+ super(Decoder, self).__init__()
+ self.inchannels = [256, 512, 1024, 2048]
+ self.midchannels = [256, 256, 256, 512]
+ self.upfactors = [2,2,2,2]
+ self.outchannels = 1
+
+ self.conv = FTB(inchannels=self.inchannels[3], midchannels=self.midchannels[3])
+ self.conv1 = nn.Conv2d(in_channels=self.midchannels[3], out_channels=self.midchannels[2], kernel_size=3, padding=1, stride=1, bias=True)
+ self.upsample = nn.Upsample(scale_factor=self.upfactors[3], mode='bilinear', align_corners=True)
+
+ self.ffm2 = FFM(inchannels=self.inchannels[2], midchannels=self.midchannels[2], outchannels = self.midchannels[2], upfactor=self.upfactors[2])
+ self.ffm1 = FFM(inchannels=self.inchannels[1], midchannels=self.midchannels[1], outchannels = self.midchannels[1], upfactor=self.upfactors[1])
+ self.ffm0 = FFM(inchannels=self.inchannels[0], midchannels=self.midchannels[0], outchannels = self.midchannels[0], upfactor=self.upfactors[0])
+
+ self.outconv = AO(inchannels=self.midchannels[0], outchannels=self.outchannels, upfactor=2)
+ self._init_params()
+
+ def _init_params(self):
+ for m in self.modules():
+ if isinstance(m, nn.Conv2d):
+ init.normal_(m.weight, std=0.01)
+ if m.bias is not None:
+ init.constant_(m.bias, 0)
+ elif isinstance(m, nn.ConvTranspose2d):
+ init.normal_(m.weight, std=0.01)
+ if m.bias is not None:
+ init.constant_(m.bias, 0)
+ elif isinstance(m, nn.BatchNorm2d): #NN.BatchNorm2d
+ init.constant_(m.weight, 1)
+ init.constant_(m.bias, 0)
+ elif isinstance(m, nn.Linear):
+ init.normal_(m.weight, std=0.01)
+ if m.bias is not None:
+ init.constant_(m.bias, 0)
+
+ def forward(self, features):
+ x_32x = self.conv(features[3]) # 1/32
+ x_32 = self.conv1(x_32x)
+ x_16 = self.upsample(x_32) # 1/16
+
+ x_8 = self.ffm2(features[2], x_16) # 1/8
+ x_4 = self.ffm1(features[1], x_8) # 1/4
+ x_2 = self.ffm0(features[0], x_4) # 1/2
+ #-----------------------------------------
+ x = self.outconv(x_2) # original size
+ return x
+
+class DepthNet(nn.Module):
+ __factory = {
+ 18: Resnet.resnet18,
+ 34: Resnet.resnet34,
+ 50: Resnet.resnet50,
+ 101: Resnet.resnet101,
+ 152: Resnet.resnet152
+ }
+ def __init__(self,
+ backbone='resnet',
+ depth=50,
+ upfactors=[2, 2, 2, 2]):
+ super(DepthNet, self).__init__()
+ self.backbone = backbone
+ self.depth = depth
+ self.pretrained = False
+ self.inchannels = [256, 512, 1024, 2048]
+ self.midchannels = [256, 256, 256, 512]
+ self.upfactors = upfactors
+ self.outchannels = 1
+
+ # Build model
+ if self.backbone == 'resnet':
+ if self.depth not in DepthNet.__factory:
+ raise KeyError("Unsupported depth:", self.depth)
+ self.encoder = DepthNet.__factory[depth](pretrained=self.pretrained)
+ elif self.backbone == 'resnext101_32x8d':
+ self.encoder = Resnext_torch.resnext101_32x8d(pretrained=self.pretrained)
+ else:
+ self.encoder = Resnext_torch.resnext101(pretrained=self.pretrained)
+
+ def forward(self, x):
+ x = self.encoder(x) # 1/32, 1/16, 1/8, 1/4
+ return x
+
+
+class FTB(nn.Module):
+ def __init__(self, inchannels, midchannels=512):
+ super(FTB, self).__init__()
+ self.in1 = inchannels
+ self.mid = midchannels
+ self.conv1 = nn.Conv2d(in_channels=self.in1, out_channels=self.mid, kernel_size=3, padding=1, stride=1,
+ bias=True)
+ # NN.BatchNorm2d
+ self.conv_branch = nn.Sequential(nn.ReLU(inplace=True), \
+ nn.Conv2d(in_channels=self.mid, out_channels=self.mid, kernel_size=3,
+ padding=1, stride=1, bias=True), \
+ nn.BatchNorm2d(num_features=self.mid), \
+ nn.ReLU(inplace=True), \
+ nn.Conv2d(in_channels=self.mid, out_channels=self.mid, kernel_size=3,
+ padding=1, stride=1, bias=True))
+ self.relu = nn.ReLU(inplace=True)
+
+ self.init_params()
+
+ def forward(self, x):
+ x = self.conv1(x)
+ x = x + self.conv_branch(x)
+ x = self.relu(x)
+
+ return x
+
+ def init_params(self):
+ for m in self.modules():
+ if isinstance(m, nn.Conv2d):
+ init.normal_(m.weight, std=0.01)
+ if m.bias is not None:
+ init.constant_(m.bias, 0)
+ elif isinstance(m, nn.ConvTranspose2d):
+ # init.kaiming_normal_(m.weight, mode='fan_out')
+ init.normal_(m.weight, std=0.01)
+ # init.xavier_normal_(m.weight)
+ if m.bias is not None:
+ init.constant_(m.bias, 0)
+ elif isinstance(m, nn.BatchNorm2d): # NN.BatchNorm2d
+ init.constant_(m.weight, 1)
+ init.constant_(m.bias, 0)
+ elif isinstance(m, nn.Linear):
+ init.normal_(m.weight, std=0.01)
+ if m.bias is not None:
+ init.constant_(m.bias, 0)
+
+
+class ATA(nn.Module):
+ def __init__(self, inchannels, reduction=8):
+ super(ATA, self).__init__()
+ self.inchannels = inchannels
+ self.avg_pool = nn.AdaptiveAvgPool2d(1)
+ self.fc = nn.Sequential(nn.Linear(self.inchannels * 2, self.inchannels // reduction),
+ nn.ReLU(inplace=True),
+ nn.Linear(self.inchannels // reduction, self.inchannels),
+ nn.Sigmoid())
+ self.init_params()
+
+ def forward(self, low_x, high_x):
+ n, c, _, _ = low_x.size()
+ x = torch.cat([low_x, high_x], 1)
+ x = self.avg_pool(x)
+ x = x.view(n, -1)
+ x = self.fc(x).view(n, c, 1, 1)
+ x = low_x * x + high_x
+
+ return x
+
+ def init_params(self):
+ for m in self.modules():
+ if isinstance(m, nn.Conv2d):
+ # init.kaiming_normal_(m.weight, mode='fan_out')
+ # init.normal(m.weight, std=0.01)
+ init.xavier_normal_(m.weight)
+ if m.bias is not None:
+ init.constant_(m.bias, 0)
+ elif isinstance(m, nn.ConvTranspose2d):
+ # init.kaiming_normal_(m.weight, mode='fan_out')
+ # init.normal_(m.weight, std=0.01)
+ init.xavier_normal_(m.weight)
+ if m.bias is not None:
+ init.constant_(m.bias, 0)
+ elif isinstance(m, nn.BatchNorm2d): # NN.BatchNorm2d
+ init.constant_(m.weight, 1)
+ init.constant_(m.bias, 0)
+ elif isinstance(m, nn.Linear):
+ init.normal_(m.weight, std=0.01)
+ if m.bias is not None:
+ init.constant_(m.bias, 0)
+
+
+class FFM(nn.Module):
+ def __init__(self, inchannels, midchannels, outchannels, upfactor=2):
+ super(FFM, self).__init__()
+ self.inchannels = inchannels
+ self.midchannels = midchannels
+ self.outchannels = outchannels
+ self.upfactor = upfactor
+
+ self.ftb1 = FTB(inchannels=self.inchannels, midchannels=self.midchannels)
+ # self.ata = ATA(inchannels = self.midchannels)
+ self.ftb2 = FTB(inchannels=self.midchannels, midchannels=self.outchannels)
+
+ self.upsample = nn.Upsample(scale_factor=self.upfactor, mode='bilinear', align_corners=True)
+
+ self.init_params()
+
+ def forward(self, low_x, high_x):
+ x = self.ftb1(low_x)
+ x = x + high_x
+ x = self.ftb2(x)
+ x = self.upsample(x)
+
+ return x
+
+ def init_params(self):
+ for m in self.modules():
+ if isinstance(m, nn.Conv2d):
+ # init.kaiming_normal_(m.weight, mode='fan_out')
+ init.normal_(m.weight, std=0.01)
+ # init.xavier_normal_(m.weight)
+ if m.bias is not None:
+ init.constant_(m.bias, 0)
+ elif isinstance(m, nn.ConvTranspose2d):
+ # init.kaiming_normal_(m.weight, mode='fan_out')
+ init.normal_(m.weight, std=0.01)
+ # init.xavier_normal_(m.weight)
+ if m.bias is not None:
+ init.constant_(m.bias, 0)
+ elif isinstance(m, nn.BatchNorm2d): # NN.Batchnorm2d
+ init.constant_(m.weight, 1)
+ init.constant_(m.bias, 0)
+ elif isinstance(m, nn.Linear):
+ init.normal_(m.weight, std=0.01)
+ if m.bias is not None:
+ init.constant_(m.bias, 0)
+
+
+class AO(nn.Module):
+ # Adaptive output module
+ def __init__(self, inchannels, outchannels, upfactor=2):
+ super(AO, self).__init__()
+ self.inchannels = inchannels
+ self.outchannels = outchannels
+ self.upfactor = upfactor
+
+ self.adapt_conv = nn.Sequential(
+ nn.Conv2d(in_channels=self.inchannels, out_channels=self.inchannels // 2, kernel_size=3, padding=1,
+ stride=1, bias=True), \
+ nn.BatchNorm2d(num_features=self.inchannels // 2), \
+ nn.ReLU(inplace=True), \
+ nn.Conv2d(in_channels=self.inchannels // 2, out_channels=self.outchannels, kernel_size=3, padding=1,
+ stride=1, bias=True), \
+ nn.Upsample(scale_factor=self.upfactor, mode='bilinear', align_corners=True))
+
+ self.init_params()
+
+ def forward(self, x):
+ x = self.adapt_conv(x)
+ return x
+
+ def init_params(self):
+ for m in self.modules():
+ if isinstance(m, nn.Conv2d):
+ # init.kaiming_normal_(m.weight, mode='fan_out')
+ init.normal_(m.weight, std=0.01)
+ # init.xavier_normal_(m.weight)
+ if m.bias is not None:
+ init.constant_(m.bias, 0)
+ elif isinstance(m, nn.ConvTranspose2d):
+ # init.kaiming_normal_(m.weight, mode='fan_out')
+ init.normal_(m.weight, std=0.01)
+ # init.xavier_normal_(m.weight)
+ if m.bias is not None:
+ init.constant_(m.bias, 0)
+ elif isinstance(m, nn.BatchNorm2d): # NN.Batchnorm2d
+ init.constant_(m.weight, 1)
+ init.constant_(m.bias, 0)
+ elif isinstance(m, nn.Linear):
+ init.normal_(m.weight, std=0.01)
+ if m.bias is not None:
+ init.constant_(m.bias, 0)
+
+
+
+# ==============================================================================================================
+
+
+class ResidualConv(nn.Module):
+ def __init__(self, inchannels):
+ super(ResidualConv, self).__init__()
+ # NN.BatchNorm2d
+ self.conv = nn.Sequential(
+ # nn.BatchNorm2d(num_features=inchannels),
+ nn.ReLU(inplace=False),
+ # nn.Conv2d(in_channels=inchannels, out_channels=inchannels, kernel_size=3, padding=1, stride=1, groups=inchannels,bias=True),
+ # nn.Conv2d(in_channels=inchannels, out_channels=inchannels, kernel_size=1, padding=0, stride=1, groups=1,bias=True)
+ nn.Conv2d(in_channels=inchannels, out_channels=inchannels / 2, kernel_size=3, padding=1, stride=1,
+ bias=False),
+ nn.BatchNorm2d(num_features=inchannels / 2),
+ nn.ReLU(inplace=False),
+ nn.Conv2d(in_channels=inchannels / 2, out_channels=inchannels, kernel_size=3, padding=1, stride=1,
+ bias=False)
+ )
+ self.init_params()
+
+ def forward(self, x):
+ x = self.conv(x) + x
+ return x
+
+ def init_params(self):
+ for m in self.modules():
+ if isinstance(m, nn.Conv2d):
+ # init.kaiming_normal_(m.weight, mode='fan_out')
+ init.normal_(m.weight, std=0.01)
+ # init.xavier_normal_(m.weight)
+ if m.bias is not None:
+ init.constant_(m.bias, 0)
+ elif isinstance(m, nn.ConvTranspose2d):
+ # init.kaiming_normal_(m.weight, mode='fan_out')
+ init.normal_(m.weight, std=0.01)
+ # init.xavier_normal_(m.weight)
+ if m.bias is not None:
+ init.constant_(m.bias, 0)
+ elif isinstance(m, nn.BatchNorm2d): # NN.BatchNorm2d
+ init.constant_(m.weight, 1)
+ init.constant_(m.bias, 0)
+ elif isinstance(m, nn.Linear):
+ init.normal_(m.weight, std=0.01)
+ if m.bias is not None:
+ init.constant_(m.bias, 0)
+
+
+class FeatureFusion(nn.Module):
+ def __init__(self, inchannels, outchannels):
+ super(FeatureFusion, self).__init__()
+ self.conv = ResidualConv(inchannels=inchannels)
+ # NN.BatchNorm2d
+ self.up = nn.Sequential(ResidualConv(inchannels=inchannels),
+ nn.ConvTranspose2d(in_channels=inchannels, out_channels=outchannels, kernel_size=3,
+ stride=2, padding=1, output_padding=1),
+ nn.BatchNorm2d(num_features=outchannels),
+ nn.ReLU(inplace=True))
+
+ def forward(self, lowfeat, highfeat):
+ return self.up(highfeat + self.conv(lowfeat))
+
+ def init_params(self):
+ for m in self.modules():
+ if isinstance(m, nn.Conv2d):
+ # init.kaiming_normal_(m.weight, mode='fan_out')
+ init.normal_(m.weight, std=0.01)
+ # init.xavier_normal_(m.weight)
+ if m.bias is not None:
+ init.constant_(m.bias, 0)
+ elif isinstance(m, nn.ConvTranspose2d):
+ # init.kaiming_normal_(m.weight, mode='fan_out')
+ init.normal_(m.weight, std=0.01)
+ # init.xavier_normal_(m.weight)
+ if m.bias is not None:
+ init.constant_(m.bias, 0)
+ elif isinstance(m, nn.BatchNorm2d): # NN.BatchNorm2d
+ init.constant_(m.weight, 1)
+ init.constant_(m.bias, 0)
+ elif isinstance(m, nn.Linear):
+ init.normal_(m.weight, std=0.01)
+ if m.bias is not None:
+ init.constant_(m.bias, 0)
+
+
+class SenceUnderstand(nn.Module):
+ def __init__(self, channels):
+ super(SenceUnderstand, self).__init__()
+ self.channels = channels
+ self.conv1 = nn.Sequential(nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, padding=1),
+ nn.ReLU(inplace=True))
+ self.pool = nn.AdaptiveAvgPool2d(8)
+ self.fc = nn.Sequential(nn.Linear(512 * 8 * 8, self.channels),
+ nn.ReLU(inplace=True))
+ self.conv2 = nn.Sequential(
+ nn.Conv2d(in_channels=self.channels, out_channels=self.channels, kernel_size=1, padding=0),
+ nn.ReLU(inplace=True))
+ self.initial_params()
+
+ def forward(self, x):
+ n, c, h, w = x.size()
+ x = self.conv1(x)
+ x = self.pool(x)
+ x = x.view(n, -1)
+ x = self.fc(x)
+ x = x.view(n, self.channels, 1, 1)
+ x = self.conv2(x)
+ x = x.repeat(1, 1, h, w)
+ return x
+
+ def initial_params(self, dev=0.01):
+ for m in self.modules():
+ if isinstance(m, nn.Conv2d):
+ # print torch.sum(m.weight)
+ m.weight.data.normal_(0, dev)
+ if m.bias is not None:
+ m.bias.data.fill_(0)
+ elif isinstance(m, nn.ConvTranspose2d):
+ # print torch.sum(m.weight)
+ m.weight.data.normal_(0, dev)
+ if m.bias is not None:
+ m.bias.data.fill_(0)
+ elif isinstance(m, nn.Linear):
+ m.weight.data.normal_(0, dev)
+
+
+if __name__ == '__main__':
+ net = DepthNet(depth=50, pretrained=True)
+ print(net)
+ inputs = torch.ones(4,3,128,128)
+ out = net(inputs)
+ print(out.size())
+
diff --git a/modules/controlnet/utils.py b/modules/controlnet/utils.py
new file mode 100644
index 0000000..8a07721
--- /dev/null
+++ b/modules/controlnet/utils.py
@@ -0,0 +1,83 @@
+
+import torch
+import numpy as np
+import cv2
+
+
+def annotator_wrapper(tensor_images, preprocessor_lambda):
+ out_list = []
+
+ for image in tensor_images:
+ H, W, C = image.shape
+ np_image = np.asarray(image * 255., dtype=np.uint8)
+
+ np_result = preprocessor_lambda(np_image)
+
+ np_result = cv2.resize(np_result, (W, H), interpolation=cv2.INTER_AREA)
+ out_list.append(torch.from_numpy(np_result.astype(np.float32) / 255.0))
+
+ return torch.stack(out_list, dim=0)
+
+
+def HWC3(x):
+ assert x.dtype == np.uint8
+
+ if x.ndim == 2:
+ x = x[:, :, None]
+ assert x.ndim == 3
+
+ H, W, C = x.shape
+ assert C == 1 or C == 3 or C == 4
+
+ if C == 3:
+ return x
+
+ if C == 1:
+ return np.concatenate([x, x, x], axis=2)
+
+ if C == 4:
+ color = x[:, :, 0:3].astype(np.float32)
+ alpha = x[:, :, 3:4].astype(np.float32) / 255.0
+ y = color * alpha + 255.0 * (1.0 - alpha)
+ y = y.clip(0, 255).astype(np.uint8)
+ return y
+
+
+def nms(x, t, s):
+ x = cv2.GaussianBlur(x.astype(np.float32), (0, 0), s)
+
+ f1 = np.array([[0, 0, 0], [1, 1, 1], [0, 0, 0]], dtype=np.uint8)
+ f2 = np.array([[0, 1, 0], [0, 1, 0], [0, 1, 0]], dtype=np.uint8)
+ f3 = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]], dtype=np.uint8)
+ f4 = np.array([[0, 0, 1], [0, 1, 0], [1, 0, 0]], dtype=np.uint8)
+
+ y = np.zeros_like(x)
+
+ for f in [f1, f2, f3, f4]:
+ np.putmask(y, cv2.dilate(x, kernel=f) == x, x)
+
+ z = np.zeros_like(y, dtype=np.uint8)
+ z[y > t] = 255
+ return z
+
+
+def safe_step(x, step=2):
+ y = x.astype(np.float32) * float(step + 1)
+ y = y.astype(np.int32).astype(np.float32) / float(step)
+ return y
+
+
+def resize_image(input_image, resolution):
+ H, W, C = input_image.shape
+
+ H = float(H)
+ W = float(W)
+ k = float(resolution) / min(H, W)
+
+ H *= k
+ W *= k
+
+ H = int(np.round(H / 64.0)) * 64
+ W = int(np.round(W / 64.0)) * 64
+
+ return cv2.resize(input_image, (W, H), interpolation=cv2.INTER_LANCZOS4 if k > 1 else cv2.INTER_AREA)
diff --git a/modules/controlnet_adapter.py b/modules/controlnet_adapter.py
new file mode 100644
index 0000000..3a74021
--- /dev/null
+++ b/modules/controlnet_adapter.py
@@ -0,0 +1,165 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from folder_paths import get_full_path
+
+from .controlnet import canny
+from .controlnet import leres
+from .controlnet import hed
+
+from .data_utils import retrieve_parameter
+from .ui import UI
+
+
+# ====================================================================================================
+# Adapter for image inputs
+# ====================================================================================================
+
+class SeargeControlnetAdapterV2:
+ def __init__(self):
+ self.expected_size = None
+
+ self.hed_annotator = "ControlNetHED.pth"
+ self.leres_annotator = "res101.pth"
+
+ self.hed_annotator_full_path = get_full_path("annotators", self.hed_annotator)
+ self.leres_annotator_full_path = get_full_path("annotators", self.leres_annotator)
+
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "controlnet_mode": (UI.CONTROLNET_MODES, {"default": UI.NONE},),
+ "controlnet_preprocessor": ("BOOLEAN", {"default": False},),
+ "strength": ("FLOAT", {"default": 0.5, "min": 0.0, "max": 1.0, "step": 0.05},),
+ "low_threshold": ("FLOAT", {"default": 0.25, "min": 0.0, "max": 1.0, "step": 0.05},),
+ "high_threshold": ("FLOAT", {"default": 0.5, "min": 0.0, "max": 1.0, "step": 0.05},),
+ "start_percent": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.05},),
+ "end_percent": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.05},),
+ "noise_augmentation": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.05},),
+ "revision_enhancer": ("BOOLEAN", {"default": False},),
+ },
+ "optional": {
+ "data": ("SRG_DATA_STREAM",),
+ "source_image": ("IMAGE",),
+ },
+ }
+
+ RETURN_TYPES = ("SRG_DATA_STREAM", "IMAGE",)
+ RETURN_NAMES = ("data", "preview",)
+ FUNCTION = "get_value"
+
+ CATEGORY = UI.CATEGORY_UI_PROMPTING
+
+ def process_image(self, image, mode, low_threshold, high_threshold):
+ if mode == UI.CN_MODE_CANNY:
+ image = canny(image, low_threshold, high_threshold)
+
+ elif mode == UI.CN_MODE_DEPTH:
+ image = leres(image, low_threshold, high_threshold, self.leres_annotator_full_path)
+
+ elif mode == UI.CN_MODE_SKETCH:
+ image = hed(image, self.hed_annotator_full_path)
+
+ else:
+ # do nothing for any other mode, just use the provided image unchanged
+ pass
+
+ return image
+
+ def create_dict(self, stack, source_image, controlnet_mode, controlnet_preprocessor, strength,
+ low_threshold, high_threshold, start, end, noise_augmentation, revision_enhancer):
+ if controlnet_mode is None or controlnet_mode == UI.NONE:
+ cn_image = None
+ else:
+ cn_image = source_image
+
+ low_threshold = round(low_threshold, 3)
+ high_threshold = round(high_threshold, 3)
+
+ # NOTE: for the modes "revision" and "custom" no image pre-processing is needed
+ if controlnet_mode == UI.CN_MODE_REVISION or controlnet_mode == UI.CUSTOM:
+ controlnet_preprocessor = False
+
+ if controlnet_preprocessor and cn_image is not None:
+ cn_image = self.process_image(cn_image, controlnet_mode, low_threshold, high_threshold)
+
+ stack += [
+ {
+ UI.F_REV_CN_IMAGE: cn_image,
+ UI.F_REV_CN_IMAGE_CHANGED: True,
+ UI.F_REV_CN_MODE: controlnet_mode,
+ UI.F_CN_PRE_PROCESSOR: controlnet_preprocessor,
+ UI.F_REV_CN_STRENGTH: round(strength, 3),
+ UI.F_CN_LOW_THRESHOLD: low_threshold,
+ UI.F_CN_HIGH_THRESHOLD: high_threshold,
+ UI.F_CN_START: round(start, 3),
+ UI.F_CN_END: round(end, 3),
+ UI.F_REV_NOISE_AUGMENTATION: round(noise_augmentation, 3),
+ UI.F_REV_ENHANCER: revision_enhancer,
+ }
+ ]
+
+ return (
+ {
+ UI.F_CN_STACK: stack,
+ },
+ cn_image,
+ )
+
+ def get_value(self, controlnet_mode, controlnet_preprocessor, strength, low_threshold, high_threshold,
+ start_percent, end_percent, noise_augmentation, revision_enhancer, source_image=None, data=None):
+ if data is None:
+ data = {}
+
+ stack = retrieve_parameter(UI.F_CN_STACK, retrieve_parameter(UI.S_CONTROLNET_INPUTS, data), [])
+
+ if self.expected_size is None:
+ self.expected_size = len(stack)
+ elif self.expected_size == 0:
+ stack = []
+ elif len(stack) > self.expected_size:
+ stack = stack[:self.expected_size]
+
+ (stack_entry, image) = self.create_dict(
+ stack,
+ source_image,
+ controlnet_mode,
+ controlnet_preprocessor,
+ strength,
+ low_threshold,
+ high_threshold,
+ start_percent,
+ end_percent,
+ noise_augmentation,
+ revision_enhancer,
+ )
+
+ data[UI.S_CONTROLNET_INPUTS] = stack_entry
+
+ return (data, image,)
diff --git a/modules/custom_sdxl_ksampler.py b/modules/custom_sdxl_ksampler.py
new file mode 100644
index 0000000..572974e
--- /dev/null
+++ b/modules/custom_sdxl_ksampler.py
@@ -0,0 +1,314 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+import torch
+import warnings
+
+import comfy.model_management
+import comfy.sample
+import comfy.samplers
+import comfy.utils
+import latent_preview
+
+from .utils import slerp_latents
+
+
+# --------------------------------------------------------------------------------
+
+class CfgMethods:
+ INTERPOLATE = "interpolate"
+ RESCALE = "rescale"
+ TONEMAP = "tonemap"
+
+
+# --------------------------------------------------------------------------------
+
+def sdxl_sample(base_model, refiner_model, noise, base_steps, refiner_steps, cfg, sampler_name, scheduler,
+ base_positive, base_negative, refiner_positive, refiner_negative, latent_image, batch_inds,
+ denoise=1.0, start_step=None, last_step=None, force_full_denoise=False, noise_mask=None, sigmas=None,
+ base_callback=None, refiner_callback=None, disable_pbar=False, seed=None, cfg_method=None,
+ dynamic_base_cfg=0.0, dynamic_refiner_cfg=0.0, refiner_detail_boost=0.0):
+ device = comfy.model_management.get_torch_device()
+
+ if noise_mask is not None:
+ noise_mask = comfy.sample.prepare_mask(noise_mask, noise.shape, device)
+
+ steps = base_steps + refiner_steps
+
+ def base_cfg_callback(args):
+ (cond, uncond, cond_scale, timestep) = (args["cond"], args["uncond"], args["cond_scale"], args["timestep"])
+
+ dyn_cfg = dynamic_base_cfg
+
+ if dyn_cfg < 0.0:
+ dyn_cfg = -dyn_cfg
+ ts = 1.0 - float(timestep) / 999.0
+ else:
+ ts = float(timestep) / 999.0
+
+ if dyn_cfg > 0.0999:
+ cond_scale = cond_scale * ts + (cond_scale * (1.0 - dyn_cfg) + dyn_cfg) * (1.0 - ts)
+
+ return uncond + (cond - uncond) * cond_scale
+
+ def base_rescale_cfg(args):
+ multiplier = dynamic_base_cfg if dynamic_base_cfg >= 0.0 else -dynamic_base_cfg
+
+ cond = args["cond"]
+ uncond = args["uncond"]
+ cond_scale = args["cond_scale"]
+
+ x_cfg = uncond + cond_scale * (cond - uncond)
+ ro_pos = torch.std(cond, dim=(1, 2, 3), keepdim=True)
+ ro_cfg = torch.std(x_cfg, dim=(1, 2, 3), keepdim=True)
+
+ x_rescaled = x_cfg * (ro_pos / ro_cfg)
+ x_final = multiplier * x_rescaled + (1.0 - multiplier) * x_cfg
+
+ return x_final
+
+ def base_tonemap_reinhard(args):
+ multiplier = dynamic_base_cfg if dynamic_base_cfg >= 0.0 else -dynamic_base_cfg
+
+ cond = args["cond"]
+ uncond = args["uncond"]
+ cond_scale = args["cond_scale"]
+
+ noise_pred = (cond - uncond)
+ noise_pred_vector_magnitude = (torch.linalg.vector_norm(noise_pred, dim=(1)) + 0.0000000001)[:, None]
+ noise_pred /= noise_pred_vector_magnitude
+
+ mean = torch.mean(noise_pred_vector_magnitude, dim=(1, 2, 3), keepdim=True)
+ std = torch.std(noise_pred_vector_magnitude, dim=(1, 2, 3), keepdim=True)
+
+ top = (std * 3 + mean) * multiplier
+
+ noise_pred_vector_magnitude *= (1.0 / top)
+ new_magnitude = noise_pred_vector_magnitude / (noise_pred_vector_magnitude + 1.0)
+ new_magnitude *= top
+
+ return uncond + noise_pred * new_magnitude * cond_scale
+
+ if cfg_method is not None:
+ base_model = base_model.clone()
+
+ if cfg_method == CfgMethods.INTERPOLATE:
+ base_model.set_model_sampler_cfg_function(base_cfg_callback)
+ elif cfg_method == CfgMethods.RESCALE and dynamic_base_cfg > 0.0:
+ base_model.set_model_sampler_cfg_function(base_rescale_cfg)
+ elif cfg_method == CfgMethods.TONEMAP and dynamic_base_cfg > 0.0:
+ base_model.set_model_sampler_cfg_function(base_tonemap_reinhard)
+
+ base_models = comfy.sample.get_additional_models(base_positive, base_negative)
+ comfy.model_management.load_models_gpu([base_model] + base_models, comfy.model_management.batch_area_memory(noise.shape[0] * noise.shape[2] * noise.shape[3]))
+
+ real_base_model = base_model.model
+
+ original_latent = latent_image
+
+ noise = noise.to(device)
+ latent_image = latent_image.to(device)
+
+ pos_base_copy = comfy.sample.broadcast_cond(base_positive, noise.shape[0], device)
+ neg_base_copy = comfy.sample.broadcast_cond(base_negative, noise.shape[0], device)
+
+ base_sampler = comfy.samplers.KSampler(real_base_model, steps=steps, device=device, sampler=sampler_name,
+ scheduler=scheduler, denoise=denoise, model_options=base_model.model_options)
+
+ base_samples = base_sampler.sample(noise, pos_base_copy, neg_base_copy, cfg=cfg, latent_image=latent_image,
+ start_step=start_step, last_step=base_steps, force_full_denoise=False,
+ denoise_mask=noise_mask, sigmas=sigmas, callback=base_callback,
+ disable_pbar=disable_pbar, seed=seed)
+
+ comfy.sample.cleanup_additional_models(base_models)
+
+ noise = torch.zeros(base_samples.size(), dtype=base_samples.dtype, layout=base_samples.layout, device=device)
+
+ if refiner_steps < 1:
+ return base_samples
+
+ if refiner_detail_boost > 0.0:
+ new_noise = comfy.sample.prepare_noise(original_latent, seed + 1, batch_inds).to(device)
+ new_noise /= real_base_model.latent_format.scale_factor
+
+ factor = base_sampler.sigmas[-refiner_steps - 1]
+ new_noise = new_noise * factor
+
+ noised_samples = base_samples + new_noise
+
+ base_samples = slerp_latents(base_samples, noised_samples, refiner_detail_boost)
+
+ if noise_mask is not None:
+ latent_from_base = base_samples * noise_mask + latent_image * (1.0 - noise_mask)
+ else:
+ latent_from_base = base_samples
+
+ def refiner_cfg_callback(args):
+ (cond, uncond, cond_scale, timestep) = (args["cond"], args["uncond"], args["cond_scale"], args["timestep"])
+
+ dyn_cfg = dynamic_refiner_cfg
+
+ if dyn_cfg < 0.0:
+ dyn_cfg = -dyn_cfg
+ ts = 1.0 - float(timestep) / 999.0
+ else:
+ ts = float(timestep) / 999.0
+
+ if dyn_cfg > 0.0999:
+ cond_scale = cond_scale * ts + (cond_scale * (1.0 - dyn_cfg) + dyn_cfg) * (1.0 - ts)
+
+ return uncond + (cond - uncond) * cond_scale
+
+ def refiner_rescale_cfg(args):
+ multiplier = dynamic_refiner_cfg if dynamic_refiner_cfg >= 0.0 else -dynamic_refiner_cfg
+
+ cond = args["cond"]
+ uncond = args["uncond"]
+ cond_scale = args["cond_scale"]
+
+ x_cfg = uncond + cond_scale * (cond - uncond)
+ ro_pos = torch.std(cond, dim=(1, 2, 3), keepdim=True)
+ ro_cfg = torch.std(x_cfg, dim=(1, 2, 3), keepdim=True)
+
+ x_rescaled = x_cfg * (ro_pos / ro_cfg)
+ x_final = multiplier * x_rescaled + (1.0 - multiplier) * x_cfg
+
+ return x_final
+
+ def refiner_tonemap_reinhard(args):
+ multiplier = dynamic_refiner_cfg if dynamic_refiner_cfg >= 0.0 else -dynamic_refiner_cfg
+
+ cond = args["cond"]
+ uncond = args["uncond"]
+ cond_scale = args["cond_scale"]
+
+ noise_pred = (cond - uncond)
+ noise_pred_vector_magnitude = (torch.linalg.vector_norm(noise_pred, dim=(1)) + 0.0000000001)[:, None]
+ noise_pred /= noise_pred_vector_magnitude
+
+ mean = torch.mean(noise_pred_vector_magnitude, dim=(1, 2, 3), keepdim=True)
+ std = torch.std(noise_pred_vector_magnitude, dim=(1, 2, 3), keepdim=True)
+
+ top = (std * 3 + mean) * multiplier
+
+ noise_pred_vector_magnitude *= (1.0 / top)
+ new_magnitude = noise_pred_vector_magnitude / (noise_pred_vector_magnitude + 1.0)
+ new_magnitude *= top
+
+ return uncond + noise_pred * new_magnitude * cond_scale
+
+ if cfg_method is not None:
+ refiner_model = refiner_model.clone()
+
+ if cfg_method == CfgMethods.INTERPOLATE:
+ refiner_model.set_model_sampler_cfg_function(refiner_cfg_callback)
+ elif cfg_method == CfgMethods.RESCALE and dynamic_refiner_cfg > 0.0:
+ refiner_model.set_model_sampler_cfg_function(refiner_rescale_cfg)
+ elif cfg_method == CfgMethods.TONEMAP and dynamic_refiner_cfg > 0.0:
+ refiner_model.set_model_sampler_cfg_function(refiner_tonemap_reinhard)
+
+ refiner_models = comfy.sample.get_additional_models(refiner_positive, refiner_negative)
+ comfy.model_management.load_models_gpu([refiner_model] + refiner_models, comfy.model_management.batch_area_memory(noise.shape[0] * noise.shape[2] * noise.shape[3]))
+
+ real_refiner_model = refiner_model.model
+
+ pos_refiner_copy = comfy.sample.broadcast_cond(refiner_positive, noise.shape[0], device)
+ neg_refiner_copy = comfy.sample.broadcast_cond(refiner_negative, noise.shape[0], device)
+
+ refiner_sampler = comfy.samplers.KSampler(real_refiner_model, steps=steps, device=device, sampler=sampler_name,
+ scheduler=scheduler, denoise=denoise, model_options=refiner_model.model_options)
+
+ refiner_samples = refiner_sampler.sample(noise, pos_refiner_copy, neg_refiner_copy, cfg=cfg, latent_image=latent_from_base,
+ start_step=base_steps, last_step=last_step, force_full_denoise=force_full_denoise,
+ denoise_mask=noise_mask, sigmas=sigmas, callback=refiner_callback,
+ disable_pbar=disable_pbar, seed=seed)
+
+ refiner_samples = refiner_samples.cpu()
+
+ comfy.sample.cleanup_additional_models(refiner_models)
+
+ return refiner_samples
+
+
+# --------------------------------------------------------------------------------
+
+def sdxl_ksampler(base_model, refiner_model, seed, base_steps, refiner_steps, cfg, sampler_name, scheduler,
+ base_positive, base_negative, refiner_positive, refiner_negative, latent, denoise=1.0,
+ disable_noise=False, start_step=None, last_step=None, force_full_denoise=False, cfg_method=None,
+ dynamic_base_cfg=0.0, dynamic_refiner_cfg=0.0, refiner_detail_boost=0.0):
+ device = comfy.model_management.get_torch_device()
+ latent_image = latent["samples"]
+
+ batch_inds = None
+ if disable_noise:
+ noise = torch.zeros(latent_image.size(), dtype=latent_image.dtype, layout=latent_image.layout, device="cpu")
+ else:
+ batch_inds = latent["batch_index"] if "batch_index" in latent else None
+ noise = comfy.sample.prepare_noise(latent_image, seed, batch_inds)
+
+ noise_mask = None
+ if "noise_mask" in latent:
+ noise_mask = latent["noise_mask"]
+
+ preview_format = "JPEG"
+ if preview_format not in ["JPEG", "PNG"]:
+ preview_format = "JPEG"
+
+ base_previewer = latent_preview.get_previewer(device, base_model.model.latent_format)
+ refiner_previewer = None
+ if refiner_model is not None:
+ refiner_previewer = latent_preview.get_previewer(device, refiner_model.model.latent_format)
+
+ steps = base_steps + refiner_steps
+ pbar = comfy.utils.ProgressBar(steps)
+
+ def base_callback(step, x0, x, total_steps):
+ preview_bytes = None
+ if base_previewer:
+ preview_bytes = base_previewer.decode_latent_to_preview_image(preview_format, x0)
+ pbar.update_absolute(step + 1, total_steps, preview_bytes)
+
+ def refiner_callback(step, x0, x, total_steps):
+ preview_bytes = None
+ if refiner_previewer:
+ preview_bytes = refiner_previewer.decode_latent_to_preview_image(preview_format, x0)
+ pbar.update_absolute(step + 1, total_steps, preview_bytes)
+
+ with warnings.catch_warnings():
+ warnings.simplefilter("ignore")
+ samples = sdxl_sample(base_model, refiner_model, noise, base_steps, refiner_steps, cfg, sampler_name, scheduler,
+ base_positive, base_negative, refiner_positive, refiner_negative, latent_image,
+ batch_inds, denoise=denoise, start_step=start_step, last_step=last_step,
+ force_full_denoise=force_full_denoise, noise_mask=noise_mask,
+ base_callback=base_callback, refiner_callback=refiner_callback, seed=seed,
+ dynamic_base_cfg=dynamic_base_cfg, dynamic_refiner_cfg=dynamic_refiner_cfg,
+ cfg_method=cfg_method, refiner_detail_boost=refiner_detail_boost)
+
+ out = latent.copy()
+ out["samples"] = samples
+ return (out,)
diff --git a/modules/data_utils.py b/modules/data_utils.py
new file mode 100644
index 0000000..108bb1b
--- /dev/null
+++ b/modules/data_utils.py
@@ -0,0 +1,53 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+
+# --------------------------------------------------------------------------------
+
+def retrieve_input(name, data, stage_input):
+ if stage_input is not None and name in stage_input:
+ result = stage_input[name]
+ elif data is not None and name in data:
+ result = data[name]
+ else:
+ result = None
+
+ return result
+
+
+# --------------------------------------------------------------------------------
+
+def retrieve_parameter(name, structure, default=None):
+ if structure is None:
+ result = default
+ elif name in structure and structure[name] is not None:
+ result = structure[name]
+ else:
+ result = default
+
+ return result
diff --git a/modules/debug_printer.py b/modules/debug_printer.py
new file mode 100644
index 0000000..252f3cb
--- /dev/null
+++ b/modules/debug_printer.py
@@ -0,0 +1,126 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .names import Names
+from .ui import UI
+
+
+# ====================================================================================================
+# Print state of a data stream
+# ====================================================================================================
+
+class SeargeDebugPrinter:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "enabled": ("BOOLEAN", {"default": True},),
+ },
+ "optional": {
+ "data": ("SRG_DATA_STREAM",),
+ "prefix": ("STRING", {"multiline": False, "default": ""},),
+ },
+ }
+
+ RETURN_TYPES = ("SRG_DATA_STREAM",)
+ RETURN_NAMES = ("data",)
+ FUNCTION = "output"
+
+ OUTPUT_NODE = True
+
+ CATEGORY = UI.CATEGORY_DEBUG
+
+ def output(self, enabled, data=None, prefix=None):
+ if data is None or not enabled:
+ return (data,)
+
+ prefix = "" if prefix is None or len(prefix) < 1 else prefix + ": "
+
+ indent_spaces = "· "
+
+ test_data = False
+ if test_data:
+ data["test_dict"] = {"k1": 1.0, "k2": 2, "k3": True}
+ data["test_list"] = ["l1", 2.0, 3]
+ data["test_tuple"] = (1, "t2", 3.0)
+
+ def print_dict(coll, ind=0, kp='"', pk=True):
+ spaces = indent_spaces * ind
+ for (k, v) in coll.items():
+ print_val(k, v, ind, kp, pk)
+
+ def print_coll(coll, ind=0, kp='', pk=False):
+ spaces = indent_spaces * ind
+ cl = len(coll)
+ for i in range(0, cl):
+ v = coll[i]
+ print_val(i, v, ind, kp, pk)
+
+ def print_val(k, v, ind=0, kp='"', pk=True):
+ spaces = indent_spaces * ind
+ key = kp + str(k) + kp + ': ' if pk else ''
+
+ if ind > 10:
+ print(prefix + spaces + key + '')
+ return
+
+ if v is None:
+ print(prefix + spaces + key + 'None,')
+ elif isinstance(v, int) or isinstance(v, float):
+ print(prefix + spaces + key + str(v) + ',')
+ elif isinstance(v, str):
+ print(prefix + spaces + key + '"' + v + '",')
+ elif isinstance(v, dict):
+ # dirty hack: we don't need to print the whole workflow and prompt
+ if k != Names.MAGIC_BOX_HIDDEN:
+ print(prefix + spaces + key + '{')
+ print_dict(v, ind + 1, '"', True)
+ print(prefix + spaces + '},')
+ else:
+ print(prefix + spaces + key + '{ ... printing skipped ... }')
+ elif isinstance(v, list):
+ print(prefix + spaces + key + '[')
+ print_coll(v, ind + 1, '', True)
+ print(prefix + spaces + '],')
+ elif isinstance(v, tuple):
+ print(prefix + spaces + key + '(')
+ print_coll(v, ind + 1, '', False)
+ print(prefix + spaces + '),')
+ else:
+ print(prefix + spaces + key + str(type(v)))
+
+ print(prefix + "===============================================================================")
+ if not isinstance(data, dict):
+ print(prefix + " ! invalid data stream !")
+ else:
+ print(prefix + "* DATA STREAM *")
+ print(prefix + "---------------")
+ print_val("data", data)
+ print(prefix + "===============================================================================")
+
+ return (data,)
diff --git a/modules/image_adapter.py b/modules/image_adapter.py
new file mode 100644
index 0000000..2ba1135
--- /dev/null
+++ b/modules/image_adapter.py
@@ -0,0 +1,77 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .ui import UI
+
+
+# ====================================================================================================
+# Adapter for image inputs
+# ====================================================================================================
+
+class SeargeImageAdapterV2:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ },
+ "optional": {
+ "data": ("SRG_DATA_STREAM",),
+ "source_image": ("IMAGE",),
+ "image_mask": ("MASK",),
+ "uploaded_mask": ("MASK",),
+ },
+ }
+
+ RETURN_TYPES = ("SRG_DATA_STREAM", "SRG_DATA_STREAM",)
+ RETURN_NAMES = ("data", UI.S_IMAGE_INPUTS,)
+ FUNCTION = "get_value"
+
+ CATEGORY = UI.CATEGORY_UI_PROMPTING
+
+ @staticmethod
+ def create_dict(source_image, image_mask, uploaded_mask):
+ return {
+ UI.F_SOURCE_IMAGE_CHANGED: True,
+ UI.F_SOURCE_IMAGE: source_image,
+ UI.F_IMAGE_MASK_CHANGED: True,
+ UI.F_IMAGE_MASK: image_mask,
+ UI.F_UPLOADED_MASK_CHANGED: True,
+ UI.F_UPLOADED_MASK: uploaded_mask,
+ }
+
+ def get_value(self, source_image=None, image_mask=None, uploaded_mask=None, data=None):
+ if data is None:
+ data = {}
+
+ data[UI.S_IMAGE_INPUTS] = self.create_dict(
+ source_image,
+ image_mask,
+ uploaded_mask,
+ )
+
+ return (data, data[UI.S_IMAGE_INPUTS],)
diff --git a/modules/legacy.py b/modules/legacy.py
deleted file mode 100644
index 056e325..0000000
--- a/modules/legacy.py
+++ /dev/null
@@ -1,162 +0,0 @@
-"""
-
-Custom nodes for SDXL in ComfyUI
-
-MIT License
-
-Copyright (c) 2023 Searge
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-"""
-
-import comfy.samplers
-import comfy_extras.nodes_post_processing
-import comfy_extras.nodes_upscale_model
-import nodes
-
-
-# SDXL Sampler with base and refiner support
-
-class SeargeSDXLSampler:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "base_model": ("MODEL",),
- "base_positive": ("CONDITIONING", ),
- "base_negative": ("CONDITIONING", ),
- "refiner_model": ("MODEL",),
- "refiner_positive": ("CONDITIONING", ),
- "refiner_negative": ("CONDITIONING", ),
- "latent_image": ("LATENT", ),
- "noise_seed": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}),
- "steps": ("INT", {"default": 30, "min": 1, "max": 1000}),
- "cfg": ("FLOAT", {"default": 7.0, "min": 0.0, "max": 100.0, "step": 0.5}),
- "sampler_name": (comfy.samplers.KSampler.SAMPLERS, {"default": "dpmpp_2m"}),
- "scheduler": (comfy.samplers.KSampler.SCHEDULERS, {"default": "karras"}),
- "base_ratio": ("FLOAT", {"default": 0.8, "min": 0.0, "max": 1.0, "step": 0.01}),
- "denoise": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.01}),
- },
- }
-
- RETURN_TYPES = ("LATENT", )
- RETURN_NAMES = ("", )
- FUNCTION = "sample"
-
- CATEGORY = "Searge/Legacy"
-
- def sample(self, base_model, base_positive, base_negative, refiner_model, refiner_positive, refiner_negative, latent_image, noise_seed, steps, cfg, sampler_name, scheduler, base_ratio, denoise):
- base_steps = int(steps * base_ratio)
-
- if denoise < 0.01:
- return (latent_image, )
-
- if base_steps >= steps:
- return nodes.common_ksampler(base_model, noise_seed, steps, cfg, sampler_name, scheduler, base_positive, base_negative, latent_image, denoise=denoise, disable_noise=False, start_step=0, last_step=steps, force_full_denoise=True)
-
- base_result = nodes.common_ksampler(base_model, noise_seed, steps, cfg, sampler_name, scheduler, base_positive, base_negative, latent_image, denoise=denoise, disable_noise=False, start_step=0, last_step=base_steps, force_full_denoise=False)
- return nodes.common_ksampler(refiner_model, noise_seed, steps, cfg, sampler_name, scheduler, refiner_positive, refiner_negative, base_result[0], denoise=1.0, disable_noise=True, start_step=base_steps, last_step=steps, force_full_denoise=True)
-
-
-# SDXL Image2Image Sampler (incl. HiRes Fix)
-
-class SeargeSDXLImage2ImageSampler:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "base_model": ("MODEL",),
- "base_positive": ("CONDITIONING", ),
- "base_negative": ("CONDITIONING", ),
- "refiner_model": ("MODEL",),
- "refiner_positive": ("CONDITIONING",),
- "refiner_negative": ("CONDITIONING",),
- "image": ("IMAGE", ),
- "vae": ("VAE",),
- "noise_seed": ("INT", {"default": 0, "min": 0, "max": 0xfffffffffffffff0}),
- "steps": ("INT", {"default": 20, "min": 0, "max": 200}),
- "cfg": ("FLOAT", {"default": 7.0, "min": 0.0, "max": 30.0, "step": 0.5}),
- "sampler_name": ("SAMPLER_NAME", {"default": "ddim"}),
- "scheduler": ("SCHEDULER_NAME", {"default": "ddim_uniform"}),
- "base_ratio": ("FLOAT", {"default": 0.8, "min": 0.0, "max": 1.0, "step": 0.01}),
- "denoise": ("FLOAT", {"default": 0.25, "min": 0.0, "max": 1.0, "step": 0.01}),
- },
- "optional": {
- "upscale_model": ("UPSCALE_MODEL",),
- "scaled_width": ("INT", {"default": 1536, "min": 0, "max": nodes.MAX_RESOLUTION, "step": 8}),
- "scaled_height": ("INT", {"default": 1536, "min": 0, "max": nodes.MAX_RESOLUTION, "step": 8}),
- "noise_offset": ("INT", {"default": 1, "min": 0, "max": 1}),
- "refiner_strength": ("FLOAT", {"default": 1.0, "min": 0.1, "max": 1.0, "step": 0.05}),
- "softness": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.05}),
- },
- }
-
- RETURN_TYPES = ("IMAGE", )
- FUNCTION = "sample"
-
- CATEGORY = "Searge/Legacy"
-
- def sample(self, base_model, base_positive, base_negative, refiner_model, refiner_positive, refiner_negative, image, vae, noise_seed, steps, cfg, sampler_name, scheduler, base_ratio, denoise, softness, upscale_model=None, scaled_width=None, scaled_height=None, noise_offset=None, refiner_strength=None):
- base_steps = int(steps * (base_ratio + 0.0001))
-
- if noise_offset is None:
- noise_offset = 1
-
- if refiner_strength is None:
- refiner_strength = 1.0
-
- if refiner_strength < 0.01:
- refiner_strength = 0.01
-
- if steps < 1:
- return (image, )
-
- scaled_image = image
-
- use_upscale_model = upscale_model is not None and softness < 0.9999
- if use_upscale_model:
- upscale_result = comfy_extras.nodes_upscale_model.ImageUpscaleWithModel().upscale(upscale_model, image)
- scaled_image = upscale_result[0]
-
- if scaled_width is not None and scaled_height is not None:
- upscale_result = nodes.ImageScale().upscale(scaled_image, "bicubic", scaled_width, scaled_height, "center")
- scaled_image = upscale_result[0]
-
- if use_upscale_model and softness > 0.0001:
- upscale_result = nodes.ImageScale().upscale(image, "bicubic", scaled_width, scaled_height, "center")
- scaled_original = upscale_result[0]
-
- blend_result = comfy_extras.nodes_post_processing.Blend().blend_images(scaled_image, scaled_original, softness, "normal")
- scaled_image = blend_result[0]
-
- if denoise < 0.01:
- return (scaled_image, )
-
- vae_encode_result = nodes.VAEEncode().encode(vae, scaled_image)
- input_latent = vae_encode_result[0]
-
- if base_steps >= steps:
- result_latent = nodes.common_ksampler(base_model, noise_seed, steps, cfg, sampler_name, scheduler, base_positive, base_negative, input_latent, denoise=denoise, disable_noise=False, start_step=0, last_step=steps, force_full_denoise=True)
- else:
- base_result = nodes.common_ksampler(base_model, noise_seed, steps, cfg, sampler_name, scheduler, base_positive, base_negative, input_latent, denoise=denoise, disable_noise=False, start_step=0, last_step=base_steps, force_full_denoise=True)
- result_latent = nodes.common_ksampler(refiner_model, noise_seed + noise_offset, steps, cfg, sampler_name, scheduler, refiner_positive, refiner_negative, base_result[0], denoise=denoise * refiner_strength, disable_noise=False, start_step=base_steps, last_step=steps, force_full_denoise=True)
-
- vae_decode_result = nodes.VAEDecode().decode(vae, result_latent[0])
- output_image = vae_decode_result[0]
-
- return (output_image, )
diff --git a/modules/magic_box.py b/modules/magic_box.py
new file mode 100644
index 0000000..8972faf
--- /dev/null
+++ b/modules/magic_box.py
@@ -0,0 +1,268 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .mb_pipeline import PipelineAccess
+from .stage import SeargeStage
+from .stage_pre_processing import SeargePreProcessData
+from .stage_load_checkpoints import SeargeStageLoadCheckpoints
+from .stage_apply_loras import SeargeStageApplyLoras
+from .stage_clip_conditioning import SeargeStageClipConditioning
+from .stage_apply_controlnet import SeargeStageApplyControlnet
+from .stage_latent_inputs import SeargeStageLatentInputs
+from .stage_sampling import SeargeStageSampling
+from .stage_latent_detailer import SeargeStageLatentDetailer
+from .stage_vae_decode_sampled import SeargeStageVAEDecodeSampled
+from .stage_high_resolution import SeargeStageHighResolution
+from .stage_vae_decode_hires import SeargeStageVAEDecodeHires
+from .stage_upscaling import SeargeStageUpscaling
+from .stage_image_saving import SeargeStageImageSaving
+from .ui import UI
+
+
+# ====================================================================================================
+# UI: Model Selector Input
+# ====================================================================================================
+
+class SeargeMagicBox:
+ # processing stages supported by the magic box
+ NONE = "none - skip"
+ PRE_PROCESS_DATA = "pre-process data"
+ LOAD_CHECKPOINTS = "load checkpoints"
+ APPLY_LORAS = "apply loras"
+ PROMPT_STYLING = "prompt styling"
+ CLIP_CONDITIONING = "clip conditioning"
+ CLIP_MIXING = "clip mixing"
+ APPLY_CONTROLNET = "apply controlnet"
+ LATENT_INPUTS = "latent inputs"
+ SAMPLING = "sampling"
+ LATENT_DETAILER = "latent detailer"
+ VAE_DECODE_SAMPLED = "vae decode sampled"
+ HIGH_RESOLUTION = "high resolution"
+ VAE_DECODE_HI_RES = "vae decode hi-res"
+ UPSCALING = "upscaling"
+ IMAGE_SAVING = "image saving"
+ STAGES = [
+ NONE,
+ PRE_PROCESS_DATA,
+ LOAD_CHECKPOINTS,
+ APPLY_LORAS,
+ PROMPT_STYLING,
+ CLIP_CONDITIONING,
+ CLIP_MIXING,
+ APPLY_CONTROLNET,
+ LATENT_INPUTS,
+ SAMPLING,
+ LATENT_DETAILER,
+ VAE_DECODE_SAMPLED,
+ HIGH_RESOLUTION,
+ VAE_DECODE_HI_RES,
+ UPSCALING,
+ IMAGE_SAVING,
+ ]
+
+ # option to take inputs from a custom stage instead of the data stream
+ DATA = "data stream"
+ CUSTOM_AND_DATA = "custom stage & data stream"
+ INPUT_OUTPUT = [
+ DATA,
+ CUSTOM_AND_DATA,
+ ]
+
+ def __init__(self):
+ self.stage_pre_process_data = None
+ self.stage_load_checkpoints = None
+ self.stage_apply_loras = None
+ self.stage_prompt_styling = None
+ self.stage_clip_conditioning = None
+ self.stage_clip_mixing = None
+ self.stage_latent_inputs = None
+ self.stage_apply_controlnet = None
+ self.stage_sampling = None
+ self.stage_vae_decode_sampled = None
+ self.stage_latent_detailer = None
+ self.stage_high_resolution = None
+ self.stage_vae_decode_hi_res = None
+ self.stage_upscaling = None
+ self.stage_image_saving = None
+ self.stage_ = None
+
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "stage": (s.STAGES, {"default": s.NONE},),
+ "input_from": (s.INPUT_OUTPUT,),
+ "output_to": (s.INPUT_OUTPUT,),
+ },
+ "optional": {
+ "data": ("SRG_DATA_STREAM",),
+ "custom_input": ("SRG_STAGE_INPUT",),
+ },
+ }
+
+ RETURN_TYPES = ("SRG_DATA_STREAM", "SRG_STAGE_OUTPUT",)
+ RETURN_NAMES = ("data", "custom_output",)
+ FUNCTION = "process"
+
+ CATEGORY = UI.CATEGORY_MAGIC
+
+ def run_stage(self, stage, data, stage_input=None):
+ stage_processor = None
+
+ has_data = data is not None
+
+ # clear old stage output from data stream
+ stage_output = stage_input
+ if has_data:
+ data["stage_output"] = None
+
+ # stage: "none - skip" - does nothing, skip processing in this magic box
+ if stage == self.NONE:
+ pass
+
+ elif stage == self.PRE_PROCESS_DATA:
+ if self.stage_pre_process_data is None:
+ self.stage_pre_process_data = SeargePreProcessData()
+ stage_processor = self.stage_pre_process_data
+
+ elif stage == self.LOAD_CHECKPOINTS:
+ if self.stage_load_checkpoints is None:
+ self.stage_load_checkpoints = SeargeStageLoadCheckpoints()
+ stage_processor = self.stage_load_checkpoints
+
+ elif stage == self.APPLY_LORAS:
+ if self.stage_apply_loras is None:
+ self.stage_apply_loras = SeargeStageApplyLoras()
+ stage_processor = self.stage_apply_loras
+
+ elif stage == self.PROMPT_STYLING:
+ if self.stage_prompt_styling is None:
+ print("TODO: implement stage " + stage)
+ self.stage_prompt_styling = SeargeStage()
+ stage_processor = self.stage_prompt_styling
+
+ elif stage == self.CLIP_CONDITIONING:
+ if self.stage_clip_conditioning is None:
+ self.stage_clip_conditioning = SeargeStageClipConditioning()
+ stage_processor = self.stage_clip_conditioning
+
+ elif stage == self.CLIP_MIXING:
+ if self.stage_clip_mixing is None:
+ print("TODO: implement stage " + stage)
+ self.stage_clip_mixing = SeargeStage()
+ stage_processor = self.stage_clip_mixing
+
+ elif stage == self.APPLY_CONTROLNET:
+ if self.stage_apply_controlnet is None:
+ self.stage_apply_controlnet = SeargeStageApplyControlnet()
+ stage_processor = self.stage_apply_controlnet
+
+ elif stage == self.LATENT_INPUTS:
+ if self.stage_latent_inputs is None:
+ self.stage_latent_inputs = SeargeStageLatentInputs()
+ stage_processor = self.stage_latent_inputs
+
+ elif stage == self.SAMPLING:
+ if self.stage_sampling is None:
+ self.stage_sampling = SeargeStageSampling()
+ stage_processor = self.stage_sampling
+
+ elif stage == self.LATENT_DETAILER:
+ if self.stage_latent_detailer is None:
+ self.stage_latent_detailer = SeargeStageLatentDetailer()
+ stage_processor = self.stage_latent_detailer
+
+ elif stage == self.VAE_DECODE_SAMPLED:
+ if self.stage_vae_decode_sampled is None:
+ self.stage_vae_decode_sampled = SeargeStageVAEDecodeSampled()
+ stage_processor = self.stage_vae_decode_sampled
+
+ elif stage == self.HIGH_RESOLUTION:
+ if self.stage_high_resolution is None:
+ self.stage_high_resolution = SeargeStageHighResolution()
+ stage_processor = self.stage_high_resolution
+
+ elif stage == self.VAE_DECODE_HI_RES:
+ if self.stage_vae_decode_hi_res is None:
+ self.stage_vae_decode_hi_res = SeargeStageVAEDecodeHires()
+ stage_processor = self.stage_vae_decode_hi_res
+
+ elif stage == self.UPSCALING:
+ if self.stage_upscaling is None:
+ self.stage_upscaling = SeargeStageUpscaling()
+ stage_processor = self.stage_upscaling
+
+ elif stage == self.IMAGE_SAVING:
+ if self.stage_image_saving is None:
+ self.stage_image_saving = SeargeStageImageSaving()
+ stage_processor = self.stage_image_saving
+
+ else:
+ print("WARNING: implementation for stage " + stage + " is missing!")
+
+ # no stage processor exists, so no processing can happen and no result exists
+ if stage_processor is None:
+ return (data, None,)
+
+ # get the stage input data that is relevant to the selected stage
+ stage_input = stage_processor.get_input(data, stage_output)
+
+ # process the selected stage
+ stage_result = None
+ if stage_input is not None:
+ (data, stage_result) = stage_processor.process(data, stage_input)
+
+ # if we got a result from this stage, put it on the data stream
+ if has_data:
+ data["stage_output"] = stage_result
+
+ return (data, stage_result,)
+
+ def process(self, stage, input_from, output_to, data=None, custom_input=None):
+ if data is None:
+ data = {}
+
+ stage_input = None
+ custom_output = None
+
+ # input from custom stage ?
+ if input_from == self.CUSTOM_AND_DATA:
+ stage_input = custom_input
+
+ # if no stage data is provided, the stage will take it from the data stream
+ if PipelineAccess(data).is_pipeline_enabled(): # or stage == self.LOAD_CHECKPOINTS:
+ (data, stage_result) = self.run_stage(stage, data, stage_input)
+ else:
+ stage_result = None
+
+ # output to custom stage ?
+ if output_to == self.CUSTOM_AND_DATA:
+ custom_output = stage_result
+
+ # the result will always be on the data stream, so even without custom output it will be passed on
+ return (data, custom_output,)
diff --git a/modules/mb_pipeline.py b/modules/mb_pipeline.py
new file mode 100644
index 0000000..63a7536
--- /dev/null
+++ b/modules/mb_pipeline.py
@@ -0,0 +1,282 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .data_utils import retrieve_parameter
+from .names import Names
+from .ui import UI
+
+
+# ====================================================================================================
+# Pipeline
+# ====================================================================================================
+
+class Pipeline:
+ def __init__(self):
+ self.data = None
+
+ self.old_settings = {}
+ self.new_settings = {}
+ self.old_overrides = {}
+ self.new_overrides = {}
+ self.cache = {}
+
+ self.pipeline = {}
+
+ self.enabled = True
+
+ def enable(self, enabled=True):
+ if self.data is not None:
+ self.data[Names.B_MAGIC_BOX_ENABLED] = enabled
+ self.enabled = enabled
+
+ def start(self, data):
+ self.data = data
+ if data is None:
+ print("Warning: no data stream for pipeline at start")
+ return
+
+ if self.enabled:
+ self.old_settings = self.new_settings
+ self.old_overrides = self.new_overrides
+
+ for k in self.cache.keys():
+ self.cache[k]["changed"] = False
+
+ self.new_settings = {}
+
+ for k in UI.ALL_UI_INPUTS:
+ self.new_settings[k] = retrieve_parameter(k, data)
+
+ self.new_overrides = {}
+
+ self.pipeline = {
+ "old_settings": self.old_settings,
+ "new_settings": self.new_settings,
+ "old_overrides": self.old_overrides,
+ "new_overrides": self.new_overrides,
+ "cache": self.cache,
+ "stream": {}
+ }
+
+ if data is not None:
+ data[PipelineAccess.NAME] = self.pipeline
+
+
+# ====================================================================================================
+# Pipeline Access
+# ====================================================================================================
+
+class PipelineAccess:
+ NAME = "pipeline"
+
+ def __init__(self, data):
+ self.data = data
+ self.pipeline = data[PipelineAccess.NAME] if PipelineAccess.NAME in data else None
+
+ if self.pipeline is None:
+ print("Warning: pipeline access could not find data")
+
+ def terminate_pipeline(self):
+ if self.data is None:
+ print("Warning: no data stream for pipeline to terminate")
+ return
+
+ if self.pipeline is None:
+ print("Warning: no pipeline to terminate in data stream")
+ return
+
+ self.pipeline["stream"] = {}
+
+ def is_pipeline_enabled(self):
+ return retrieve_parameter(Names.B_MAGIC_BOX_ENABLED, self.data, True)
+
+ # -----===== settings =====-----
+
+ def has_structure(self, name):
+ if self.pipeline is None:
+ return False
+
+ if name in retrieve_parameter("new_overrides", self.pipeline, {}):
+ return True
+
+ if name in retrieve_parameter("new_settings", self.pipeline, {}):
+ return True
+
+ return False
+
+ def get_effective_structure(self, name):
+ if not self.has_structure(name):
+ return None
+
+ new_settings = retrieve_parameter("new_settings", self.pipeline)
+ new_overrides = retrieve_parameter("new_overrides", self.pipeline, {})
+
+ new_structure = retrieve_parameter(name, new_settings)
+ new_structure_overrides = retrieve_parameter(name, new_overrides, {})
+ return new_structure | new_structure_overrides if new_structure is not None else new_structure_overrides
+
+ def override_setting(self, structure_name, field_name, value):
+ if self.pipeline is None:
+ return False
+
+ new_overrides = retrieve_parameter("new_overrides", self.pipeline, {})
+ if structure_name in new_overrides:
+ new_overrides[structure_name][field_name] = value
+ return True
+
+ new_overrides[structure_name] = {
+ field_name: value,
+ }
+
+ self.pipeline["new_overrides"] = new_overrides
+ return True
+
+ def get_active_setting(self, structure_name, field_name, default=None):
+ structure = retrieve_parameter(structure_name, retrieve_parameter("new_overrides", self.pipeline), {})
+
+ if field_name not in structure:
+ structure = retrieve_parameter(structure_name, retrieve_parameter("new_settings", self.pipeline))
+
+ return retrieve_parameter(field_name, structure, default)
+
+ def get_old_setting(self, structure_name, field_name):
+ structure = retrieve_parameter(structure_name, retrieve_parameter("old_overrides", self.pipeline, {}), {})
+
+ if field_name not in structure:
+ structure = retrieve_parameter(structure_name, retrieve_parameter("old_settings", self.pipeline))
+
+ return retrieve_parameter(field_name, structure)
+
+ def has_setting(self, structure_name, field_name):
+ return self.get_active_setting(structure_name, field_name) is not None
+
+ def setting_changed(self, structure_name, field_name):
+ old_value = self.get_old_setting(structure_name, field_name)
+ new_value = self.get_active_setting(structure_name, field_name)
+ return old_value != new_value
+
+ # -----===== pipeline stream =====-----
+
+ def update_in_pipeline(self, name, value):
+ if self.pipeline is None or "stream" not in self.pipeline:
+ return False
+
+ if value is None:
+ return False
+
+ self.pipeline["stream"][name] = {
+ "changed": True,
+ "data": value,
+ }
+
+ return True
+
+ def restore_in_pipeline(self, name, value):
+ if self.pipeline is None or "stream" not in self.pipeline:
+ return False
+
+ if value is None:
+ return False
+
+ self.pipeline["stream"][name] = {
+ "changed": False,
+ "data": value,
+ }
+
+ return True
+
+ def has_in_pipeline(self, name):
+ if self.pipeline is not None and "stream" in self.pipeline:
+ cache = self.pipeline["stream"]
+ if name in cache:
+ return True
+
+ return False
+
+ def get_from_pipeline(self, name):
+ if self.has_in_pipeline(name):
+ cache = self.pipeline["stream"]
+ cached = cache[name]
+ if "data" in cached:
+ return cached["data"]
+
+ return None
+
+ def changed_in_pipeline(self, name):
+ if self.has_in_pipeline(name):
+ cache = self.pipeline["stream"]
+ cached = cache[name]
+ return "changed" in cached and cached["changed"]
+
+ return False
+
+ # -----===== cache =====-----
+
+ def update_in_cache(self, name, key, value):
+ if self.pipeline is None or "cache" not in self.pipeline:
+ return False
+
+ self.pipeline["cache"][name] = {
+ "key": key,
+ "data": value,
+ }
+
+ return True
+
+ def has_in_cache(self, name):
+ if self.pipeline is not None and "cache" in self.pipeline:
+ cache = self.pipeline["cache"]
+ if name in cache:
+ return True
+
+ return False
+
+ def get_from_cache(self, name):
+ if self.has_in_cache(name):
+ cache = self.pipeline["cache"]
+ cached = cache[name]
+ if "data" in cached:
+ return cached["data"]
+
+ return None
+
+ def remove_from_cache(self, name):
+ if self.has_in_cache(name):
+ cache = self.pipeline["cache"]
+ cache.pop(name)
+ return True
+
+ return False
+
+ def changed_in_cache(self, name, key):
+ if self.has_in_cache(name):
+ cache = self.pipeline["cache"]
+ cached = cache[name]
+ return "key" not in cached or cached["key"] != key
+
+ return True
diff --git a/modules/mb_pipeline_start.py b/modules/mb_pipeline_start.py
new file mode 100644
index 0000000..5fe7885
--- /dev/null
+++ b/modules/mb_pipeline_start.py
@@ -0,0 +1,98 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .mb_pipeline import Pipeline
+from .mb_pipeline import PipelineAccess
+from .names import Names
+from .ui import Defs
+from .ui import UI
+
+
+# ====================================================================================================
+# Magic Box Pipeline Terminator
+# ====================================================================================================
+
+class SeargePipelineStart:
+ def __init__(self):
+ self.pipeline = Pipeline()
+
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "wf_version": (Defs.WORKFLOW_VERSIONS,),
+ },
+ "optional": {
+ "data": ("SRG_DATA_STREAM",),
+ "additional_data": ("SRG_DATA_STREAM",),
+ },
+ "hidden": {
+ "prompt": "PROMPT",
+ "extra_pnginfo": "EXTRA_PNGINFO",
+ },
+ }
+
+ RETURN_TYPES = ("SRG_DATA_STREAM",)
+ RETURN_NAMES = ("data",)
+ FUNCTION = "trigger"
+
+ OUTPUT_NODE = True
+
+ CATEGORY = UI.CATEGORY_MAGIC
+
+ def trigger(self, wf_version, data=None, additional_data=None, prompt=None, extra_pnginfo=None):
+ if data is None:
+ print("Warning: Pipeline Start - missing data stream")
+ else:
+ if additional_data is not None:
+ data = data | additional_data
+
+ self.pipeline.start(data)
+
+ access = PipelineAccess(data)
+
+ self.pipeline.enable(access.get_active_setting(UI.S_OPERATING_MODE, UI.F_WORKFLOW_MODE) != UI.NONE)
+
+ mb_hidden = {
+ Names.F_MAGIC_BOX_PROMPT: prompt,
+ Names.F_MAGIC_BOX_EXTRA_PNGINFO: extra_pnginfo,
+ }
+
+ mb_version = {
+ Names.F_MAGIC_BOX_EXTENSION: Defs.VERSION,
+ Names.F_MAGIC_BOX_WORKFLOW: wf_version,
+ }
+
+ access.update_in_pipeline(Names.S_MAGIC_BOX_HIDDEN, mb_hidden)
+ access.update_in_pipeline(Names.S_MAGIC_BOX_VERSION, mb_version)
+
+ if data is not None:
+ data[Names.S_MAGIC_BOX_HIDDEN] = mb_hidden
+ data[Names.S_MAGIC_BOX_VERSION] = mb_version
+
+ return (data,)
diff --git a/modules/mb_pipeline_terminator.py b/modules/mb_pipeline_terminator.py
new file mode 100644
index 0000000..4f0caa7
--- /dev/null
+++ b/modules/mb_pipeline_terminator.py
@@ -0,0 +1,58 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .mb_pipeline import PipelineAccess
+from .ui import UI
+
+
+# ====================================================================================================
+# Magic Box Pipeline Terminator
+# ====================================================================================================
+
+class SeargePipelineTerminator:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ },
+ "optional": {
+ "data": ("SRG_DATA_STREAM",),
+ },
+ }
+
+ RETURN_TYPES = ()
+ FUNCTION = "trigger"
+
+ OUTPUT_NODE = True
+
+ CATEGORY = UI.CATEGORY_MAGIC
+
+ def trigger(self, data=None):
+ access = PipelineAccess(data)
+ access.terminate_pipeline()
+ return {}
diff --git a/modules/names.py b/modules/names.py
new file mode 100644
index 0000000..e08e152
--- /dev/null
+++ b/modules/names.py
@@ -0,0 +1,246 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+
+# ====================================================================================================
+# Names to be used for data streams and the structures & fields in them
+# ====================================================================================================
+
+class Names:
+ PLACEHOLDER = "placeholder"
+
+ S_EXAMPLE_STRUCTURE = "example_structure"
+ F_EXAMPLE_FIELD = "example_field"
+
+ # ----------------------------------------
+ # structures and fields
+ # ----------------------------------------
+
+ # magic box
+ B_MAGIC_BOX_ENABLED = "magic_box_enabled"
+
+ # pre-processor
+ S_MAGIC_BOX_HIDDEN = "hidden_fields"
+ F_MAGIC_BOX_PROMPT = "prompt"
+ F_MAGIC_BOX_EXTRA_PNGINFO = "pnginfo"
+
+ S_MAGIC_BOX_VERSION = "version_info"
+ F_MAGIC_BOX_EXTENSION = "extension_version"
+ F_MAGIC_BOX_WORKFLOW = "workflow_version"
+
+ # vae decoder stage outputs
+ S_VAE_DECODED = "vae_decoded"
+ F_DECODED_IMAGE = "image"
+ F_POST_PROCESSED = "post_processed"
+
+ # checkpoint loader
+ S_LOADED_MODELS = "loaded_models"
+ F_BASE_MODEL = "base_model"
+ F_BASE_CLIP = "base_clip"
+ F_BASE_VAE = "base_vae"
+ F_REFINER_MODEL = "refiner_model"
+ F_REFINER_CLIP = "refiner_clip"
+ F_REFINER_VAE = "refiner_vae"
+ F_VAE_MODEL = "vae_model"
+ F_HIRES_UPSCALER = "hires_upscaler"
+ F_PRIMARY_UPSCALER = "primary_upscaler"
+ F_SECONDARY_UPSCALER = "secondary_upscaler"
+ F_DETAIL_PROCESSOR = "detail_processor"
+ F_CLIP_VISION_MODEL = "clip_vision_model"
+ F_CN_CANNY_MODEL = "cn_canny_model"
+ F_CN_DEPTH_MODEL = "cn_depth_model"
+ F_CN_RECOLOR_MODEL = "cn_recolor_model"
+ F_CN_SKETCH_MODEL = "cn_sketch_model"
+ F_CN_CUSTOM_MODEL = "cn_custom_model"
+
+ # apply loras
+ S_LOADED_LORAS = "loaded_loras"
+ F_LORA_NAMES = "lora_names"
+
+ # clip conditioning
+ S_PROCESSED_PROMPTS = "processed_prompts"
+ F_BASE_POSITIVE_MAIN_PROMPT = "base_positive_main_prompt"
+ F_BASE_POSITIVE_SECONDARY_PROMPT = "base_positive_secondary_prompt"
+ F_BASE_POSITIVE_STYLE_PROMPT = "base_positive_style_prompt"
+ F_BASE_NEGATIVE_MAIN_PROMPT = "base_negative_main_prompt"
+ F_BASE_NEGATIVE_SECONDARY_PROMPT = "base_negative_secondary_prompt"
+ F_BASE_NEGATIVE_STYLE_PROMPT = "base_negative_style_prompt"
+ F_REFINER_POSITIVE_PROMPT = "refiner_positive_prompt"
+ F_REFINER_POSITIVE_STYLE_PROMPT = "refiner_positive_style_prompt"
+ F_REFINER_NEGATIVE_PROMPT = "refiner_negative_prompt"
+ F_REFINER_NEGATIVE_STYLE_PROMPT = "refiner_negative_style_prompt"
+
+ S_CONDITIONING = "conditioning"
+ F_BASE_POSITIVE = "base_positive"
+ F_BASE_POSITIVE_STYLE = "base_positive_style"
+ F_BASE_NEGATIVE = "base_negative"
+ F_BASE_NEGATIVE_STYLE = "base_negative_style"
+ F_REFINER_POSITIVE = "refiner_positive"
+ F_REFINER_POSITIVE_STYLE = "refiner_positive_style"
+ F_REFINER_NEGATIVE = "refiner_negative"
+ F_REFINER_NEGATIVE_STYLE = "refiner_negative_style"
+
+ # apply controlnet
+ S_CONTROLNET_OUTPUT = "controlnet_output"
+ F_CN_BASE_POSITIVE = "cn_base_positive"
+ F_CN_BASE_NEGATIVE = "cn_base_negative"
+
+ # latent inputs
+ S_LATENT_INPUTS = "latent_inputs"
+ F_LATENT_IMAGE = "latent_image"
+
+ # sampler
+ S_SAMPLED_IMAGE = "sampled_image"
+ F_LATENT_SAMPLED = "latent_sampled"
+
+ # latent detailer
+ S_LATENT_DETAILED = "latent_detailed"
+ F_DETAILED_SAMPLED = "detailed_sampled"
+
+ # vae decode sampled
+ S_VAE_DECODED_SAMPLED = "vae_decoded_sampled"
+ F_DECODED_SAMPLED_IMAGE = "sampled_image"
+ F_SAMPLED_POST_PROCESSED = "sampled_post_processed"
+
+ # high resolution
+ S_HIRES_OUTPUT = "hires_output"
+ F_LATENT_HIRES = "latent_hires"
+
+ # vae decode hires
+ S_VAE_DECODED_HIRES = "vae_decoded_hires"
+ F_DECODED_HIRES_IMAGE = "hires_image"
+ F_HIRES_POST_PROCESSED = "hires_post_processed"
+
+ # upscaling
+ S_UPSCALED = "upscaled"
+ F_UPSCALED_IMAGE = "upscaled_image"
+
+ # image saving
+ S_SAVED_FILES = "saved_files"
+ F_GENERATED_IMAGE_PATH = "generated_image_path"
+ F_HIGH_RES_IMAGE_PATH = "high_res_image_path"
+ F_UPSCALED_IMAGE_PATH = "upscaled_image_path"
+ F_PARAMETER_FILE_PATH = "parameter_file_path"
+
+ # ----------------------------------------
+ # cache names
+ # ----------------------------------------
+
+ # pre-processor
+ C_SOURCE_IMAGE = "source_image"
+ C_IMAGE_SIZE = "image_size"
+ C_SOURCE_MASK = "source_mask"
+ C_BLURRY_MASK = "blurry_mask"
+
+ # checkpoint loader
+ C_BASE_CHECKPOINT = "base_checkpoint"
+ C_REFINER_CHECKPOINT = "refiner_checkpoint"
+ C_VAE_CHECKPOINT = "vae_checkpoint"
+ C_HIRES_UPSCALE_MODEL = "hires_upscale_checkpoint"
+ C_PRIMARY_UPSCALE_MODEL = "primary_upscale_checkpoint"
+ C_SECONDARY_UPSCALE_MODEL = "secondary_upscale_checkpoint"
+ C_DETAIL_PROCESSOR_MODEL = "detail_processor_checkpoint"
+ C_CLIP_VISION_MODEL = "clip_vision_checkpoint"
+ C_CN_CANNY_MODEL = "cn_canny_checkpoint"
+ C_CN_DEPTH_MODEL = "cn_depth_checkpoint"
+ C_CN_RECOLOR_MODEL = "cn_recolor_checkpoint"
+ C_CN_SKETCH_MODEL = "cn_sketch_checkpoint"
+ C_CN_CUSTOM_MODEL = "cn_custom_checkpoint"
+
+ # apply loras
+ C_APPLIED_LORAS = "applied_loras"
+
+ # clip conditioning
+ C_PROCESSED_PROMPTS = "processed_prompts"
+ C_BASE_CONDITIONING = "base_conditioning"
+ C_REFINER_CONDITIONING = "refiner_conditioning"
+
+ # apply controlnet
+ C_APPLIED_CONTROLNET = "applied_controlnet"
+
+ # latent inputs
+ C_LATENT_FROM_IMAGE = "latent_from_image"
+ C_IMAGE_MASK = "image_mask"
+ C_LATENT_WITH_MASK = "latent_with_mask"
+ C_EMPTY_LATENT = "empty_latent"
+
+ # sampler
+ C_SAMPLED = "sampled"
+
+ # latent detailer
+ C_SAMPLED_DETAILER = "sampled_detailer"
+
+ # vae decode sampled
+ C_VAE_DECODED = "vae_decoded"
+ C_POST_PROCESSED = "post_processed"
+
+ # high resolution
+ C_HIRES_LATENT = "hires_latent"
+ C_HIRES_LATENT_SIMPLE = "hires_latent_simple"
+ C_HIRES_LATENT_NORMAL = "hires_latent_normal"
+
+ # vae decode sampled
+ C_VAE_DECODED_HIRES = "vae_decoded_hires"
+ C_POST_PROCESSED_HIRES = "post_processed_hires"
+
+ # upscaling
+ C_UPSCALED_IMAGE = "upscaled_image"
+
+ # ----------------------------------------
+ # pipeline stream names
+ # ----------------------------------------
+
+ P_IMAGE = "image"
+ P_MASK = "mask"
+ P_LATENT = "latent"
+
+ P_BASE_MODEL = "base_model"
+ P_BASE_CLIP = "base_clip"
+ P_BASE_VAE = "base_vae"
+
+ P_REFINER_MODEL = "refiner_model"
+ P_REFINER_CLIP = "refiner_clip"
+ P_REFINER_VAE = "refiner_vae"
+
+ P_VAE_MODEL = "vae_model"
+
+ P_HIRES_UPSCALER = "hires_upscaler"
+ P_PRIMARY_UPSCALER = "primary_upscaler"
+ P_SECONDARY_UPSCALER = "secondary_upscaler"
+ P_DETAIL_PROCESSOR = "detail_processor"
+
+ P_CLIP_VISION_MODEL = "clip_vision_model"
+ P_CN_CANNY_MODEL = "cn_canny_model"
+ P_CN_DEPTH_MODEL = "cn_depth_model"
+ P_CN_RECOLOR_MODEL = "cn_recolor_model"
+ P_CN_SKETCH_MODEL = "cn_sketch_model"
+ P_CN_CUSTOM_MODEL = "cn_custom_model"
+
+ P_PROCESSED_PROMPTS = "processed_prompts"
+ P_BASE_CONDITIONING = "base_conditioning"
+ P_REFINER_CONDITIONING = "refiner_conditioning"
diff --git a/modules/node_wrapper.py b/modules/node_wrapper.py
new file mode 100644
index 0000000..31b4a7d
--- /dev/null
+++ b/modules/node_wrapper.py
@@ -0,0 +1,108 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+import nodes
+import comfy_extras.nodes_mask
+import comfy_extras.nodes_post_processing
+import comfy_extras.nodes_clip_sdxl
+import comfy_extras.nodes_upscale_model
+
+from .custom_sdxl_ksampler import sdxl_ksampler
+from .ui import UI
+
+
+# ====================================================================================================
+# Wrapper for other ComfyUI nodes
+# ====================================================================================================
+
+class NodeWrapper:
+ checkpoint_loader = nodes.CheckpointLoaderSimple()
+ clipvision_encoder = nodes.CLIPVisionEncode()
+ clipvision_loader = nodes.CLIPVisionLoader()
+ controlnet_advanced = nodes.ControlNetApplyAdvanced()
+ controlnet_loader = nodes.ControlNetLoader()
+ empty_latent = nodes.EmptyLatentImage()
+ image_blend = comfy_extras.nodes_post_processing.Blend()
+ image_blur = comfy_extras.nodes_post_processing.Blur()
+ image_composite = comfy_extras.nodes_mask.ImageCompositeMasked()
+ image_scale = nodes.ImageScale()
+ image_to_mask = comfy_extras.nodes_mask.ImageToMask()
+ latent_repeater = nodes.RepeatLatentBatch()
+ latent_selector = nodes.LatentFromBatch()
+ latent_upscale_by = nodes.LatentUpscaleBy()
+ lora_loader = nodes.LoraLoader()
+ mask_to_image = comfy_extras.nodes_mask.MaskToImage()
+ scale_with_model = comfy_extras.nodes_upscale_model.ImageUpscaleWithModel()
+ sdxl_clip_base_encoder = comfy_extras.nodes_clip_sdxl.CLIPTextEncodeSDXL()
+ sdxl_clip_refiner_encoder = comfy_extras.nodes_clip_sdxl.CLIPTextEncodeSDXLRefiner()
+ set_latent_mask = nodes.SetLatentNoiseMask()
+ unclip_conditioning = nodes.unCLIPConditioning()
+ upscale_loader = comfy_extras.nodes_upscale_model.UpscaleModelLoader()
+ vae_decoder = nodes.VAEDecode()
+ vae_encoder = nodes.VAEEncode()
+ vae_loader = nodes.VAELoader()
+
+ @staticmethod
+ def sdxl_sampler(base_model, base_positive, base_negative, latent_image, noise_seed, steps, cfg,
+ sampler_name, scheduler, refiner_model=None, refiner_positive=None, refiner_negative=None,
+ base_ratio=0.8, denoise=1.0, cfg_method=None, dynamic_base_cfg=0.0, dynamic_refiner_cfg=0.0,
+ refiner_detail_boost=0.0):
+ has_refiner_model = refiner_model is not None
+
+ base_steps = int(steps * (base_ratio + 0.0001)) if has_refiner_model else steps
+ refiner_steps = max(0, steps - base_steps)
+
+ if cfg_method == UI.NONE:
+ cfg_method = None
+
+ if denoise < 0.005:
+ return (latent_image,)
+
+ if refiner_steps == 0 or not has_refiner_model:
+ result = sdxl_ksampler(base_model, None, noise_seed, base_steps, 0, cfg, sampler_name,
+ scheduler, base_positive, base_negative, None, None,
+ latent_image, denoise=denoise, disable_noise=False, start_step=0, last_step=steps,
+ force_full_denoise=True, dynamic_base_cfg=dynamic_base_cfg, cfg_method=cfg_method)
+ else:
+ result = sdxl_ksampler(base_model, refiner_model, noise_seed, base_steps, refiner_steps, cfg, sampler_name,
+ scheduler, base_positive, base_negative, refiner_positive, refiner_negative,
+ latent_image, denoise=denoise, disable_noise=False,
+ start_step=0, last_step=steps, force_full_denoise=True,
+ dynamic_base_cfg=dynamic_base_cfg, dynamic_refiner_cfg=dynamic_refiner_cfg,
+ cfg_method=cfg_method, refiner_detail_boost=refiner_detail_boost)
+
+ return result[0]
+
+ @staticmethod
+ def common_sampler(model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent,
+ denoise=1.0, disable_noise=False, start_step=None, last_step=None, force_full_denoise=False):
+ result = nodes.common_ksampler(model, seed, steps, cfg, sampler_name, scheduler, positive, negative,
+ latent, denoise=denoise, disable_noise=disable_noise, start_step=start_step,
+ last_step=last_step, force_full_denoise=force_full_denoise)
+
+ return result[0]
diff --git a/modules/processing.py b/modules/processing.py
deleted file mode 100644
index e45358b..0000000
--- a/modules/processing.py
+++ /dev/null
@@ -1,239 +0,0 @@
-"""
-
-Custom nodes for SDXL in ComfyUI
-
-MIT License
-
-Copyright (c) 2023 Searge
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-"""
-
-
-# UI: Parameter Processor
-
-class SeargeParameterProcessor:
- # hard - refiner uses same seed as base | soft - refiner uses different seed from base
- REFINER_INTENSITY = ["hard", "soft"]
- # same - HRF uses same seed as image generation | distinct - HRF uses different seed than image generation
- HRF_SEED_OFFSET = ["same", "distinct"]
- # simple "boolean"-like type
- STATES = ["disabled", "enabled"]
- # operating modes, determine if the latent source is empty or from a source image, inpainting also uses mask
- OPERATION_MODE = ["text to image", "image to image", "inpainting"]
- # sorted from easy-to-use to harder-to-use
- PROMPT_STYLE = ["simple", "3 prompts G+L-N", "subject focus", "style focus", "weighted", "overlay", "subject - style", "style - subject", "style only", "weighted - overlay", "overlay - weighted"]
- # (work in progress)
- STYLE_TEMPLATE = ["none", "from preprocessor", "test"]
- # save folder for generated images
- SAVE_TO = ["output folder", "input folder"]
-
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "inputs": ("PARAMETER_INPUTS", ),
- },
- }
-
- RETURN_TYPES = ("PARAMETERS", )
- RETURN_NAMES = ("parameters", )
- FUNCTION = "process"
-
- CATEGORY = "Searge/UI"
-
- def process(self, inputs):
- if inputs is None:
- parameters = {}
- else:
- parameters = inputs
-
- if parameters["denoise"] is None:
- parameters["denoise"] = 1.0
-
- saturation = parameters["refiner_intensity"]
- if saturation is not None:
- # "soft"
- if saturation == SeargeParameterProcessor.REFINER_INTENSITY[1]:
- parameters["noise_offset"] = 1
- # incl. SeargeParameterProcessor.REFINER_INTENSITY[1] -> "hard"
- else:
- parameters["noise_offset"] = 0
-
- hires_fix = parameters["hires_fix"]
- # "disabled"
- if hires_fix is not None and hires_fix == SeargeParameterProcessor.STATES[0]:
- parameters["hrf_steps"] = 0
-
- hrf_saturation = parameters["hrf_intensity"]
- if hrf_saturation is not None:
- # "soft"
- if hrf_saturation == SeargeParameterProcessor.REFINER_INTENSITY[1]:
- parameters["hrf_noise_offset"] = 1
- # incl. SeargeParameterProcessor.REFINER_INTENSITY[0] -> "hard"
- else:
- parameters["hrf_noise_offset"] = 0
-
- seed_offset = parameters["hrf_seed_offset"]
- if seed_offset is not None:
- seed = parameters["seed"] if parameters["seed"] is not None else 0
- # "distinct"
- if seed_offset == SeargeParameterProcessor.HRF_SEED_OFFSET[1]:
- parameters["hrf_seed"] = seed + 3
- # incl. SeargeParameterProcessor.HRF_SEED_OFFSET[0] -> "same"
- else:
- parameters["hrf_seed"] = seed
-
- style_template = parameters["style_template"]
- if style_template is not None:
- # "from preprocessor"
- if style_template == SeargeParameterProcessor.STYLE_TEMPLATE[1]:
- # this does nothing here, but will be used in the preprocessor
- pass
- # "test"
- if style_template == SeargeParameterProcessor.STYLE_TEMPLATE[2]:
- if parameters["noise_offset"] is not None:
- parameters["noise_offset"] = 1 - parameters["hrf_noise_offset"]
- if parameters["hrf_noise_offset"] is not None:
- parameters["hrf_noise_offset"] = 1 - parameters["hrf_noise_offset"]
- # incl. SeargeParameterProcessor.STYLE_TEMPLATE[0] -> "none"
- else:
- # TODO: apply style based on its name here...
- pass
-
- operation_mode = parameters["operation_mode"]
- if operation_mode is not None:
- # "image to image":
- if operation_mode == SeargeParameterProcessor.OPERATION_MODE[1]:
- parameters["operation_selector"] = 1
- # "inpainting":
- elif operation_mode == SeargeParameterProcessor.OPERATION_MODE[2]:
- parameters["operation_selector"] = 2
- # incl. SeargeParameterProcessor.OPERATION_MODE[0] -> "text to image":
- else:
- parameters["operation_selector"] = 0
- # always fully denoise in img2img mode
- parameters["denoise"] = 1.0
-
- prompt_style = parameters["prompt_style"]
- if prompt_style is not None:
- # "simple"
- if prompt_style == SeargeParameterProcessor.PROMPT_STYLE[0]:
- parameters["prompt_style_selector"] = 0
- parameters["prompt_style_group"] = 0
- main_prompt = parameters["main_prompt"]
- parameters["secondary_prompt"] = main_prompt
- parameters["style_prompt"] = ""
- parameters["negative_style"] = ""
- # "subject focus"
- elif prompt_style == SeargeParameterProcessor.PROMPT_STYLE[2]:
- parameters["prompt_style_selector"] = 1
- parameters["prompt_style_group"] = 0
- # "style focus"
- elif prompt_style == SeargeParameterProcessor.PROMPT_STYLE[3]:
- parameters["prompt_style_selector"] = 2
- parameters["prompt_style_group"] = 0
- # "weighted"
- elif prompt_style == SeargeParameterProcessor.PROMPT_STYLE[4]:
- parameters["prompt_style_selector"] = 3
- parameters["prompt_style_group"] = 0
- # "overlay"
- elif prompt_style == SeargeParameterProcessor.PROMPT_STYLE[5]:
- parameters["prompt_style_selector"] = 4
- parameters["prompt_style_group"] = 0
- # "subject - style"
- elif prompt_style == SeargeParameterProcessor.PROMPT_STYLE[6]:
- parameters["prompt_style_selector"] = 0
- parameters["prompt_style_group"] = 1
- # "style - subject"
- elif prompt_style == SeargeParameterProcessor.PROMPT_STYLE[7]:
- parameters["prompt_style_selector"] = 1
- parameters["prompt_style_group"] = 1
- # "style only"
- elif prompt_style == SeargeParameterProcessor.PROMPT_STYLE[8]:
- parameters["prompt_style_selector"] = 2
- parameters["prompt_style_group"] = 1
- # "weighted - overlay"
- elif prompt_style == SeargeParameterProcessor.PROMPT_STYLE[9]:
- parameters["prompt_style_selector"] = 3
- parameters["prompt_style_group"] = 1
- # "overlay - weighted"
- elif prompt_style == SeargeParameterProcessor.PROMPT_STYLE[10]:
- parameters["prompt_style_selector"] = 4
- parameters["prompt_style_group"] = 1
- # incl. SeargeParameterProcessor.PROMPT_STYLE[1] -> "3 prompts G+L-N"
- else:
- parameters["prompt_style_selector"] = 0
- parameters["prompt_style_group"] = 0
- parameters["style_prompt"] = ""
- parameters["negative_style"] = ""
-
- # TODO: replace this special logic and the dirty hacks by creating new generated parameters for saving
- save_image = parameters["save_image"]
- if save_image is not None:
- # "disabled"
- if save_image == SeargeParameterProcessor.STATES[0]:
- # when image saving is disabled, we also don't want to save the upscaled image, even if that's enabled
- parameters["save_upscaled_image"] = SeargeParameterProcessor.STATES[0]
- # HACK: this is a bit dirty, but the variable hires_fix determines if the image should be saved
- # but when image saving is disabled, we don't want that to happen
- parameters["hires_fix"] = SeargeParameterProcessor.STATES[0]
- # "enabled"
- else:
- # in case we are saving to the input folder, we need to enable saving after the hires fix, even
- # if that's disabled in the settings
- if parameters["save_directory"] == SeargeParameterProcessor.SAVE_TO[1]:
- parameters["hires_fix"] = SeargeParameterProcessor.STATES[1]
-
- return (parameters, )
-
-
-# UI: Style Processor
-
-class SeargeStylePreprocessor:
-
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "inputs": ("PARAMETER_INPUTS", ),
- "active_style_name": ("STRING", {"multiline": False, "default": ""}),
- "style_definitions": ("STRING", {"multiline": True, "default": "[unfinished work in progress]"}),
- },
- }
-
- RETURN_TYPES = ("PARAMETER_INPUTS", )
- RETURN_NAMES = ("inputs", )
- FUNCTION = "process"
-
- CATEGORY = "Searge/UI"
-
- def process(self, inputs, active_style_name, style_definitions):
- if inputs is None:
- inputs = {}
-
- style_template = inputs["style_template"]
- # not "from preprocessor"
- if style_template is None or style_template != SeargeParameterProcessor.STYLE_TEMPLATE[1]:
- return (inputs,)
-
- # TODO: do what needs to be done to apply the selected style
-
- return (inputs, )
-
-
diff --git a/modules/prompt_adapter.py b/modules/prompt_adapter.py
new file mode 100644
index 0000000..ed0e297
--- /dev/null
+++ b/modules/prompt_adapter.py
@@ -0,0 +1,85 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .ui import UI
+
+
+# ====================================================================================================
+# Adapter for prompt text inputs
+# ====================================================================================================
+
+class SeargePromptAdapterV2:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ },
+ "optional": {
+ "data": ("SRG_DATA_STREAM",),
+ "main_prompt": ("SRG_PROMPT_TEXT",),
+ "secondary_prompt": ("SRG_PROMPT_TEXT",),
+ "style_prompt": ("SRG_PROMPT_TEXT",),
+ "negative_main_prompt": ("SRG_PROMPT_TEXT",),
+ "negative_secondary_prompt": ("SRG_PROMPT_TEXT",),
+ "negative_style_prompt": ("SRG_PROMPT_TEXT",),
+ },
+ }
+
+ RETURN_TYPES = ("SRG_DATA_STREAM", "SRG_DATA_STREAM",)
+ RETURN_NAMES = ("data", UI.S_PROMPTS,)
+ FUNCTION = "get_value"
+
+ CATEGORY = UI.CATEGORY_UI_PROMPTING
+
+ @staticmethod
+ def create_dict(main_prompt=None, secondary_prompt=None, style_prompt=None,
+ negative_main_prompt=None, negative_secondary_prompt=None, negative_style_prompt=None):
+ return {
+ UI.F_MAIN_PROMPT: main_prompt,
+ UI.F_SECONDARY_PROMPT: secondary_prompt,
+ UI.F_STYLE_PROMPT: style_prompt,
+ UI.F_NEGATIVE_MAIN_PROMPT: negative_main_prompt,
+ UI.F_NEGATIVE_SECONDARY_PROMPT: negative_secondary_prompt,
+ UI.F_NEGATIVE_STYLE_PROMPT: negative_style_prompt,
+ }
+
+ def get_value(self, main_prompt=None, secondary_prompt=None, style_prompt=None,
+ negative_main_prompt=None, negative_secondary_prompt=None, negative_style_prompt=None, data=None):
+ if data is None:
+ data = {}
+
+ data[UI.S_PROMPTS] = self.create_dict(
+ main_prompt,
+ secondary_prompt,
+ style_prompt,
+ negative_main_prompt,
+ negative_secondary_prompt,
+ negative_style_prompt
+ )
+
+ return (data, data[UI.S_PROMPTS],)
diff --git a/modules/prompt_adapter_output.py b/modules/prompt_adapter_output.py
new file mode 100644
index 0000000..22113b5
--- /dev/null
+++ b/modules/prompt_adapter_output.py
@@ -0,0 +1,82 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .data_utils import retrieve_parameter
+from .ui import UI
+
+
+# ====================================================================================================
+# UI: Prompt Adapter Output
+# ====================================================================================================
+
+class SeargePromptAdapterV2Output:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ },
+ "optional": {
+ "data": ("SRG_DATA_STREAM",),
+ "prompts": ("SRG_DATA_STREAM",),
+ },
+ }
+
+ RETURN_TYPES = ("SRG_DATA_STREAM", "STRING", "STRING", "STRING",
+ "STRING", "STRING", "STRING",)
+ RETURN_NAMES = ("data", UI.F_MAIN_PROMPT, UI.F_SECONDARY_PROMPT, UI.F_STYLE_PROMPT,
+ UI.F_NEGATIVE_MAIN_PROMPT, UI.F_NEGATIVE_SECONDARY_PROMPT, UI.F_NEGATIVE_STYLE_PROMPT,)
+ FUNCTION = "output"
+
+ CATEGORY = UI.CATEGORY_UI_PROMPTING
+
+ @staticmethod
+ def get_data(data=None, prompts=None):
+ if prompts is None:
+ prompts = retrieve_parameter("prompts", data)
+
+ if prompts is None:
+ return (False, None,)
+
+ return (True, {
+ UI.F_MAIN_PROMPT: retrieve_parameter(UI.F_MAIN_PROMPT, prompts),
+ UI.F_SECONDARY_PROMPT: retrieve_parameter(UI.F_SECONDARY_PROMPT, prompts),
+ UI.F_STYLE_PROMPT: retrieve_parameter(UI.F_STYLE_PROMPT, prompts),
+ UI.F_NEGATIVE_MAIN_PROMPT: retrieve_parameter(UI.F_NEGATIVE_MAIN_PROMPT, prompts),
+ UI.F_NEGATIVE_SECONDARY_PROMPT: retrieve_parameter(UI.F_NEGATIVE_SECONDARY_PROMPT, prompts),
+ UI.F_NEGATIVE_STYLE_PROMPT: retrieve_parameter(UI.F_NEGATIVE_STYLE_PROMPT, prompts),
+ })
+
+ def output(self, data=None, prompts=None):
+ (has_data, output) = self.get_data(data, prompts)
+ if not has_data:
+ return (data, None, None, None, None, None, None,)
+
+ return (data, output[UI.F_MAIN_PROMPT], output[UI.F_SECONDARY_PROMPT],
+ output[UI.F_STYLE_PROMPT],
+ output[UI.F_NEGATIVE_MAIN_PROMPT], output[UI.F_NEGATIVE_SECONDARY_PROMPT],
+ output[UI.F_NEGATIVE_STYLE_PROMPT],)
diff --git a/modules/prompt_text_input.py b/modules/prompt_text_input.py
new file mode 100644
index 0000000..cbfd528
--- /dev/null
+++ b/modules/prompt_text_input.py
@@ -0,0 +1,52 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .ui import UI
+
+
+# ====================================================================================================
+# Text input node for prompt text
+# ====================================================================================================
+
+class SeargeTextInputV2:
+ @classmethod
+ def INPUT_TYPES(s):
+ return {
+ "required": {
+ "prompt": ("STRING", {"default": "", "multiline": True},),
+ },
+ }
+
+ RETURN_TYPES = ("SRG_PROMPT_TEXT",)
+ RETURN_NAMES = ("prompt_text",)
+ FUNCTION = "get_value"
+
+ CATEGORY = UI.CATEGORY_UI_PROMPTING
+
+ def get_value(self, prompt):
+ return (prompt,)
diff --git a/modules/prompting.py b/modules/prompting.py
deleted file mode 100644
index d660140..0000000
--- a/modules/prompting.py
+++ /dev/null
@@ -1,251 +0,0 @@
-"""
-
-Custom nodes for SDXL in ComfyUI
-
-MIT License
-
-Copyright (c) 2023 Searge
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-"""
-
-import nodes
-
-
-# SDXL CLIP Text Encoder for prompts with base and refiner support
-
-class SeargeSDXLPromptEncoder:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "base_clip": ("CLIP", ),
- "refiner_clip": ("CLIP", ),
- "pos_g": ("STRING", {"multiline": True, "default": "POS_G"}),
- "pos_l": ("STRING", {"multiline": True, "default": "POS_L"}),
- "pos_r": ("STRING", {"multiline": True, "default": "POS_R"}),
- "neg_g": ("STRING", {"multiline": True, "default": "NEG_G"}),
- "neg_l": ("STRING", {"multiline": True, "default": "NEG_L"}),
- "neg_r": ("STRING", {"multiline": True, "default": "NEG_R"}),
- "base_width": ("INT", {"default": 4096, "min": 0, "max": nodes.MAX_RESOLUTION, "step": 8}),
- "base_height": ("INT", {"default": 4096, "min": 0, "max": nodes.MAX_RESOLUTION, "step": 8}),
- "crop_w": ("INT", {"default": 0, "min": 0, "max": nodes.MAX_RESOLUTION, "step": 8}),
- "crop_h": ("INT", {"default": 0, "min": 0, "max": nodes.MAX_RESOLUTION, "step": 8}),
- "target_width": ("INT", {"default": 4096, "min": 0, "max": nodes.MAX_RESOLUTION, "step": 8}),
- "target_height": ("INT", {"default": 4096, "min": 0, "max": nodes.MAX_RESOLUTION, "step": 8}),
- "pos_ascore": ("FLOAT", {"default": 6.0, "min": 0.0, "max": 1000.0, "step": 0.01}),
- "neg_ascore": ("FLOAT", {"default": 2.5, "min": 0.0, "max": 1000.0, "step": 0.01}),
- "refiner_width": ("INT", {"default": 2048, "min": 0, "max": nodes.MAX_RESOLUTION, "step": 8}),
- "refiner_height": ("INT", {"default": 2048, "min": 0, "max": nodes.MAX_RESOLUTION, "step": 8}),
- },
- }
-
- RETURN_TYPES = ("CONDITIONING", "CONDITIONING", "CONDITIONING", "CONDITIONING", )
- RETURN_NAMES = ("base_positive", "base_negative", "refiner_positive", "refiner_negative", )
- FUNCTION = "encode"
-
- CATEGORY = "Searge/ClipEncoding"
-
- def encode(self, base_clip, refiner_clip, pos_g, pos_l, pos_r, neg_g, neg_l, neg_r, base_width, base_height, crop_w, crop_h, target_width, target_height, pos_ascore, neg_ascore, refiner_width, refiner_height, ):
- empty = base_clip.tokenize("")
-
- # positive base prompt
- tokens1 = base_clip.tokenize(pos_g)
- tokens1["l"] = base_clip.tokenize(pos_l)["l"]
-
- if len(tokens1["l"]) != len(tokens1["g"]):
- while len(tokens1["l"]) < len(tokens1["g"]):
- tokens1["l"] += empty["l"]
- while len(tokens1["l"]) > len(tokens1["g"]):
- tokens1["g"] += empty["g"]
-
- cond1, pooled1 = base_clip.encode_from_tokens(tokens1, return_pooled=True)
- res1 = [[cond1, {"pooled_output": pooled1, "width": base_width, "height": base_height, "crop_w": crop_w, "crop_h": crop_h, "target_width": target_width, "target_height": target_height}]]
-
- # negative base prompt
- tokens2 = base_clip.tokenize(neg_g)
- tokens2["l"] = base_clip.tokenize(neg_l)["l"]
-
- if len(tokens2["l"]) != len(tokens2["g"]):
- while len(tokens2["l"]) < len(tokens2["g"]):
- tokens2["l"] += empty["l"]
- while len(tokens2["l"]) > len(tokens2["g"]):
- tokens2["g"] += empty["g"]
-
- cond2, pooled2 = base_clip.encode_from_tokens(tokens2, return_pooled=True)
- res2 = [[cond2, {"pooled_output": pooled2, "width": base_width, "height": base_height, "crop_w": crop_w, "crop_h": crop_h, "target_width": target_width, "target_height": target_height}]]
-
-
- # positive refiner prompt
- tokens3 = refiner_clip.tokenize(pos_r)
- cond3, pooled3 = refiner_clip.encode_from_tokens(tokens3, return_pooled=True)
- res3 = [[cond3, {"pooled_output": pooled3, "aesthetic_score": pos_ascore, "width": refiner_width, "height": refiner_height}]]
-
- # negative refiner prompt
- tokens4 = refiner_clip.tokenize(neg_r)
- cond4, pooled4 = refiner_clip.encode_from_tokens(tokens4, return_pooled=True)
- res4 = [[cond4, {"pooled_output": pooled4, "aesthetic_score": neg_ascore, "width": refiner_width, "height": refiner_height}]]
-
- return (res1, res2, res3, res4, )
-
-
-# SDXL CLIP Text Encoder for base prompts
-
-class SeargeSDXLBasePromptEncoder:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "base_clip": ("CLIP", ),
- "pos_g": ("STRING", {"multiline": True, "default": "POS_G"}),
- "pos_l": ("STRING", {"multiline": True, "default": "POS_L"}),
- "neg_g": ("STRING", {"multiline": True, "default": "NEG_G"}),
- "neg_l": ("STRING", {"multiline": True, "default": "NEG_L"}),
- "base_width": ("INT", {"default": 4096, "min": 0, "max": nodes.MAX_RESOLUTION, "step": 8}),
- "base_height": ("INT", {"default": 4096, "min": 0, "max": nodes.MAX_RESOLUTION, "step": 8}),
- "crop_w": ("INT", {"default": 0, "min": 0, "max": nodes.MAX_RESOLUTION, "step": 8}),
- "crop_h": ("INT", {"default": 0, "min": 0, "max": nodes.MAX_RESOLUTION, "step": 8}),
- "target_width": ("INT", {"default": 4096, "min": 0, "max": nodes.MAX_RESOLUTION, "step": 8}),
- "target_height": ("INT", {"default": 4096, "min": 0, "max": nodes.MAX_RESOLUTION, "step": 8}),
- },
- }
-
- RETURN_TYPES = ("CONDITIONING", "CONDITIONING", )
- RETURN_NAMES = ("base_positive", "base_negative", )
- FUNCTION = "encode"
-
- CATEGORY = "Searge/ClipEncoding"
-
- def encode(self, base_clip, pos_g, pos_l, neg_g, neg_l, base_width, base_height, crop_w, crop_h, target_width, target_height, ):
- empty = base_clip.tokenize("")
-
- # positive base prompt
- tokens1 = base_clip.tokenize(pos_g)
- tokens1["l"] = base_clip.tokenize(pos_l)["l"]
-
- if len(tokens1["l"]) != len(tokens1["g"]):
- while len(tokens1["l"]) < len(tokens1["g"]):
- tokens1["l"] += empty["l"]
- while len(tokens1["l"]) > len(tokens1["g"]):
- tokens1["g"] += empty["g"]
-
- cond1, pooled1 = base_clip.encode_from_tokens(tokens1, return_pooled=True)
- res1 = [[cond1, {"pooled_output": pooled1, "width": base_width, "height": base_height, "crop_w": crop_w, "crop_h": crop_h, "target_width": target_width, "target_height": target_height}]]
-
- # negative base prompt
- tokens2 = base_clip.tokenize(neg_g)
- tokens2["l"] = base_clip.tokenize(neg_l)["l"]
-
- if len(tokens2["l"]) != len(tokens2["g"]):
- while len(tokens2["l"]) < len(tokens2["g"]):
- tokens2["l"] += empty["l"]
- while len(tokens2["l"]) > len(tokens2["g"]):
- tokens2["g"] += empty["g"]
-
- cond2, pooled2 = base_clip.encode_from_tokens(tokens2, return_pooled=True)
- res2 = [[cond2, {"pooled_output": pooled2, "width": base_width, "height": base_height, "crop_w": crop_w, "crop_h": crop_h, "target_width": target_width, "target_height": target_height}]]
-
- return (res1, res2, )
-
-
-# SDXL CLIP Text Encoder for prompts with base and refiner support
-
-class SeargeSDXLRefinerPromptEncoder:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "refiner_clip": ("CLIP", ),
- "pos_r": ("STRING", {"multiline": True, "default": "POS_R"}),
- "neg_r": ("STRING", {"multiline": True, "default": "NEG_R"}),
- "pos_ascore": ("FLOAT", {"default": 6.0, "min": 0.0, "max": 1000.0, "step": 0.01}),
- "neg_ascore": ("FLOAT", {"default": 2.5, "min": 0.0, "max": 1000.0, "step": 0.01}),
- "refiner_width": ("INT", {"default": 2048, "min": 0, "max": nodes.MAX_RESOLUTION, "step": 8}),
- "refiner_height": ("INT", {"default": 2048, "min": 0, "max": nodes.MAX_RESOLUTION, "step": 8}),
- },
- }
-
- RETURN_TYPES = ("CONDITIONING", "CONDITIONING", )
- RETURN_NAMES = ("refiner_positive", "refiner_negative", )
- FUNCTION = "encode"
-
- CATEGORY = "Searge/ClipEncoding"
-
- def encode(self, refiner_clip, pos_r, neg_r, pos_ascore, neg_ascore, refiner_width, refiner_height, ):
-
- # positive refiner prompt
- tokens1 = refiner_clip.tokenize(pos_r)
- cond1, pooled1 = refiner_clip.encode_from_tokens(tokens1, return_pooled=True)
- res1 = [[cond1, {"pooled_output": pooled1, "aesthetic_score": pos_ascore, "width": refiner_width, "height": refiner_height}]]
-
- # negative refiner prompt
- tokens2 = refiner_clip.tokenize(neg_r)
- cond2, pooled2 = refiner_clip.encode_from_tokens(tokens2, return_pooled=True)
- res2 = [[cond2, {"pooled_output": pooled2, "aesthetic_score": neg_ascore, "width": refiner_width, "height": refiner_height}]]
-
- return (res1, res2, )
-
-
-# Tool: text input node for prompt text
-
-class SeargePromptText:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "prompt": ("STRING", {"default": "", "multiline": True}),
- },
- }
-
- RETURN_TYPES = ("STRING", )
- RETURN_NAMES = ("prompt", )
- FUNCTION = "get_value"
-
- CATEGORY = "Searge/Prompting"
-
- def get_value(self, prompt):
- return (prompt,)
-
-
-# Tool: text input node for prompt text
-
-class SeargePromptCombiner:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "prompt1": ("STRING", {"default": "", "multiline": True}),
- "separator": ("STRING", {"default": ", ", "multiline": False}),
- "prompt2": ("STRING", {"default": "", "multiline": True}),
- },
- }
-
- RETURN_TYPES = ("STRING", )
- RETURN_NAMES = ("combined prompt", )
- FUNCTION = "get_value"
-
- CATEGORY = "Searge/Prompting"
-
- def get_value(self, prompt1, separator, prompt2, ):
- len1 = len(prompt1)
- len2 = len(prompt2)
- prompt = ""
- if len1 > 0 and len2 > 0:
- prompt = prompt1 + separator + prompt2
- elif len1 > 0:
- prompt = prompt1
- elif len2 > 0:
- prompt = prompt2
- return (prompt,)
diff --git a/modules/sampling.py b/modules/sampling.py
deleted file mode 100644
index 2e4f689..0000000
--- a/modules/sampling.py
+++ /dev/null
@@ -1,448 +0,0 @@
-"""
-
-Custom nodes for SDXL in ComfyUI
-
-MIT License
-
-Copyright (c) 2023 Searge
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-"""
-
-import comfy.model_management
-import comfy.sample
-import comfy.samplers
-import comfy.utils
-import comfy_extras.nodes_post_processing
-import comfy_extras.nodes_upscale_model
-import latent_preview
-import nodes
-import torch
-
-
-def sdxl_sample(modelB, modelR, noiseO, stepsB, stepsR, cfg, sampler_name, scheduler, positiveB, negativeB, positiveR, negativeR, latent_image, denoise=1.0, start_step=None, last_step=None, force_full_denoise=False, noise_mask=None, sigmas=None, callbackB=None, callbackR=None, disable_pbar=False, seed=None):
- device = comfy.model_management.get_torch_device()
-
- if noise_mask is not None:
- noise_mask = comfy.sample.prepare_mask(noise_mask, noiseO.shape, device)
-
- steps = stepsB + stepsR
-
- comfy.model_management.load_model_gpu(modelB)
- real_modelB = modelB.model
-
- noise = noiseO.to(device)
- latent_image = latent_image.to(device)
-
- positive_copyB = comfy.sample.broadcast_cond(positiveB, noise.shape[0], device)
- negative_copyB = comfy.sample.broadcast_cond(negativeB, noise.shape[0], device)
-
- modelsB = comfy.sample.load_additional_models(positiveB, negativeB, modelB.model_dtype())
-
- samplerB = comfy.samplers.KSampler(real_modelB, steps=steps, device=device, sampler=sampler_name, scheduler=scheduler, denoise=denoise, model_options=modelB.model_options)
-
- samplesB = samplerB.sample(noise, positive_copyB, negative_copyB, cfg=cfg, latent_image=latent_image, start_step=start_step, last_step=stepsB, force_full_denoise=False, denoise_mask=noise_mask, sigmas=sigmas, callback=callbackB, disable_pbar=disable_pbar, seed=seed)
-
- comfy.sample.cleanup_additional_models(modelsB)
-
- noise = torch.zeros(samplesB.size(), dtype=samplesB.dtype, layout=samplesB.layout, device=device)
-
- if noise_mask is not None:
- latent_for_refiner = samplesB * noise_mask + latent_image * (1.0 - noise_mask)
- else:
- latent_for_refiner = samplesB
-
- comfy.model_management.load_model_gpu(modelR)
- real_modelR = modelR.model
-
- positive_copyR = comfy.sample.broadcast_cond(positiveR, noise.shape[0], device)
- negative_copyR = comfy.sample.broadcast_cond(negativeR, noise.shape[0], device)
-
- modelsR = comfy.sample.load_additional_models(positiveR, negativeR, modelR.model_dtype())
-
- samplerR = comfy.samplers.KSampler(real_modelR, steps=steps, device=device, sampler=sampler_name, scheduler=scheduler, denoise=denoise, model_options=modelR.model_options)
-
- samples = samplerR.sample(noise, positive_copyR, negative_copyR, cfg=cfg, latent_image=latent_for_refiner, start_step=stepsB, last_step=last_step, force_full_denoise=force_full_denoise, denoise_mask=noise_mask, sigmas=sigmas, callback=callbackR, disable_pbar=disable_pbar, seed=seed)
- samples = samples.cpu()
-
- comfy.sample.cleanup_additional_models(modelsR)
-
- return samples
-
-
-def sdxl_ksampler(modelB, modelR, seed, stepsB, stepsR, cfg, sampler_name, scheduler, positiveB, negativeB, positiveR, negativeR, latent, denoise=1.0, disable_noise=False, start_step=None, last_step=None, force_full_denoise=False):
- device = comfy.model_management.get_torch_device()
- latent_image = latent["samples"]
-
- if disable_noise:
- noise = torch.zeros(latent_image.size(), dtype=latent_image.dtype, layout=latent_image.layout, device="cpu")
- else:
- batch_inds = latent["batch_index"] if "batch_index" in latent else None
- noise = comfy.sample.prepare_noise(latent_image, seed, batch_inds)
-
- noise_mask = None
- if "noise_mask" in latent:
- noise_mask = latent["noise_mask"]
-
- preview_format = "JPEG"
- if preview_format not in ["JPEG", "PNG"]:
- preview_format = "JPEG"
-
- previewerB = latent_preview.get_previewer(device, modelB.model.latent_format)
- previewerR = latent_preview.get_previewer(device, modelR.model.latent_format)
-
- steps = stepsB + stepsR
- pbar = comfy.utils.ProgressBar(steps)
-
- def callbackB(step, x0, x, total_steps):
- preview_bytes = None
- if previewerB:
- preview_bytes = previewerB.decode_latent_to_preview_image(preview_format, x0)
- pbar.update_absolute(step + 1, total_steps, preview_bytes)
-
- def callbackR(step, x0, x, total_steps):
- preview_bytes = None
- if previewerR:
- preview_bytes = previewerR.decode_latent_to_preview_image(preview_format, x0)
- pbar.update_absolute(step + 1, total_steps, preview_bytes)
-
- samples = sdxl_sample(modelB, modelR, noise, stepsB, stepsR, cfg, sampler_name, scheduler, positiveB, negativeB, positiveR, negativeR, latent_image,
- denoise=denoise, start_step=start_step, last_step=last_step,
- force_full_denoise=force_full_denoise, noise_mask=noise_mask, callbackB=callbackB, callbackR=callbackR, seed=seed)
-
- out = latent.copy()
- out["samples"] = samples
- return (out, )
-
-
-# SDXL Sampler with base and refiner support
-
-class SeargeSDXLSampler2:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "base_model": ("MODEL",),
- "base_positive": ("CONDITIONING", ),
- "base_negative": ("CONDITIONING", ),
- "refiner_model": ("MODEL",),
- "refiner_positive": ("CONDITIONING", ),
- "refiner_negative": ("CONDITIONING", ),
- "latent_image": ("LATENT", ),
- "noise_seed": ("INT", {"default": 0, "min": 0, "max": 0xfffffffffffffff0}),
- "steps": ("INT", {"default": 20, "min": 1, "max": 200}),
- "cfg": ("FLOAT", {"default": 7.0, "min": 0.0, "max": 30.0, "step": 0.5}),
- "sampler_name": ("SAMPLER_NAME", {"default": "ddim"}),
- "scheduler": ("SCHEDULER_NAME", {"default": "ddim_uniform"}),
- "base_ratio": ("FLOAT", {"default": 0.8, "min": 0.0, "max": 1.0, "step": 0.01}),
- "denoise": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.01}),
- },
- "optional": {
- "refiner_prep_steps": ("INT", {"default": 0, "min": 0, "max": 10}),
- "noise_offset": ("INT", {"default": 1, "min": 0, "max": 1}),
- "refiner_strength": ("FLOAT", {"default": 1.0, "min": 0.01, "max": 1.0, "step": 0.05}),
- },
- }
-
- RETURN_TYPES = ("LATENT", )
- FUNCTION = "sample"
-
- CATEGORY = "Searge/Sampling"
-
- def sample(self, base_model, base_positive, base_negative, refiner_model, refiner_positive, refiner_negative, latent_image, noise_seed, steps, cfg, sampler_name, scheduler, base_ratio, denoise, refiner_prep_steps=None, noise_offset=None, refiner_strength=None):
- base_steps = int(steps * (base_ratio + 0.0001))
-
- if noise_offset is None:
- noise_offset = 1
-
- if refiner_strength is None:
- refiner_strength = 1.0
-
- if refiner_strength < 0.01:
- refiner_strength = 0.01
-
- if denoise < 0.01:
- return (latent_image, )
-
- start_at_step = 0
- input_latent = latent_image
-
- if refiner_prep_steps is not None:
- if refiner_prep_steps >= base_steps:
- refiner_prep_steps = base_steps - 1
-
- if refiner_prep_steps > 0:
- start_at_step = refiner_prep_steps
- precondition_result = nodes.common_ksampler(refiner_model, noise_seed + 2, steps, cfg, sampler_name, scheduler, refiner_positive, refiner_negative, latent_image, denoise=denoise, disable_noise=False, start_step=steps - refiner_prep_steps, last_step=steps, force_full_denoise=False)
- input_latent = precondition_result[0]
-
- if base_steps >= steps:
- return nodes.common_ksampler(base_model, noise_seed, steps, cfg, sampler_name, scheduler, base_positive, base_negative, input_latent, denoise=denoise, disable_noise=False, start_step=start_at_step, last_step=steps, force_full_denoise=True)
-
- base_result = nodes.common_ksampler(base_model, noise_seed, steps, cfg, sampler_name, scheduler, base_positive, base_negative, input_latent, denoise=denoise, disable_noise=False, start_step=start_at_step, last_step=base_steps, force_full_denoise=True)
- return nodes.common_ksampler(refiner_model, noise_seed + noise_offset, steps, cfg, sampler_name, scheduler, refiner_positive, refiner_negative, base_result[0], denoise=denoise * refiner_strength, disable_noise=False, start_step=base_steps, last_step=steps, force_full_denoise=True)
-
-
-# SDXL Image2Image Sampler (incl. HiRes Fix)
-
-class SeargeSDXLImage2ImageSampler2:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "base_model": ("MODEL",),
- "base_positive": ("CONDITIONING", ),
- "base_negative": ("CONDITIONING", ),
- "refiner_model": ("MODEL",),
- "refiner_positive": ("CONDITIONING",),
- "refiner_negative": ("CONDITIONING",),
- "image": ("IMAGE", ),
- "vae": ("VAE",),
- "noise_seed": ("INT", {"default": 0, "min": 0, "max": 0xfffffffffffffff0}),
- "steps": ("INT", {"default": 20, "min": 0, "max": 200}),
- "cfg": ("FLOAT", {"default": 7.0, "min": 0.0, "max": 30.0, "step": 0.5}),
- "sampler_name": ("SAMPLER_NAME", {"default": "ddim"}),
- "scheduler": ("SCHEDULER_NAME", {"default": "ddim_uniform"}),
- "base_ratio": ("FLOAT", {"default": 0.8, "min": 0.0, "max": 1.0, "step": 0.01}),
- "denoise": ("FLOAT", {"default": 0.25, "min": 0.0, "max": 1.0, "step": 0.01}),
- },
- "optional": {
- "upscale_model": ("UPSCALE_MODEL",),
- "scaled_width": ("INT", {"default": 1536, "min": 0, "max": nodes.MAX_RESOLUTION, "step": 8}),
- "scaled_height": ("INT", {"default": 1536, "min": 0, "max": nodes.MAX_RESOLUTION, "step": 8}),
- "noise_offset": ("INT", {"default": 1, "min": 0, "max": 1}),
- "refiner_strength": ("FLOAT", {"default": 1.0, "min": 0.1, "max": 1.0, "step": 0.05}),
- "softness": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.05}),
- },
- }
-
- RETURN_TYPES = ("IMAGE", )
- FUNCTION = "sample"
-
- CATEGORY = "Searge/Sampling"
-
- def sample(self, base_model, base_positive, base_negative, refiner_model, refiner_positive, refiner_negative, image, vae, noise_seed, steps, cfg, sampler_name, scheduler, base_ratio, denoise, softness, upscale_model=None, scaled_width=None, scaled_height=None, noise_offset=None, refiner_strength=None):
- base_steps = int(steps * (base_ratio + 0.0001))
-
- if noise_offset is None:
- noise_offset = 1
-
- if refiner_strength is None:
- refiner_strength = 1.0
-
- if refiner_strength < 0.01:
- refiner_strength = 0.01
-
- if steps < 1:
- return (image, )
-
- scaled_image = image
-
- use_upscale_model = upscale_model is not None and softness < 0.9999
- if use_upscale_model:
- upscale_result = comfy_extras.nodes_upscale_model.ImageUpscaleWithModel().upscale(upscale_model, image)
- scaled_image = upscale_result[0]
-
- if scaled_width is not None and scaled_height is not None:
- upscale_result = nodes.ImageScale().upscale(scaled_image, "bicubic", scaled_width, scaled_height, "center")
- scaled_image = upscale_result[0]
-
- if use_upscale_model and softness > 0.0001:
- upscale_result = nodes.ImageScale().upscale(image, "bicubic", scaled_width, scaled_height, "center")
- scaled_original = upscale_result[0]
-
- blend_result = comfy_extras.nodes_post_processing.Blend().blend_images(scaled_image, scaled_original, softness, "normal")
- scaled_image = blend_result[0]
-
- if denoise < 0.01:
- return (scaled_image, )
-
- vae_encode_result = nodes.VAEEncode().encode(vae, scaled_image)
- input_latent = vae_encode_result[0]
-
- if base_steps >= steps:
- result_latent = nodes.common_ksampler(base_model, noise_seed, steps, cfg, sampler_name, scheduler, base_positive, base_negative, input_latent, denoise=denoise, disable_noise=False, start_step=0, last_step=steps, force_full_denoise=True)
- else:
- base_result = nodes.common_ksampler(base_model, noise_seed, steps, cfg, sampler_name, scheduler, base_positive, base_negative, input_latent, denoise=denoise, disable_noise=False, start_step=0, last_step=base_steps, force_full_denoise=True)
- result_latent = nodes.common_ksampler(refiner_model, noise_seed + noise_offset, steps, cfg, sampler_name, scheduler, refiner_positive, refiner_negative, base_result[0], denoise=denoise * refiner_strength, disable_noise=False, start_step=base_steps, last_step=steps, force_full_denoise=True)
-
- vae_decode_result = nodes.VAEDecode().decode(vae, result_latent[0])
- output_image = vae_decode_result[0]
-
- return (output_image, )
-
-
-# SDXL Sampler with base and refiner support
-
-class SeargeSDXLSamplerV3:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "base_model": ("MODEL",),
- "base_positive": ("CONDITIONING", ),
- "base_negative": ("CONDITIONING", ),
- "refiner_model": ("MODEL",),
- "refiner_positive": ("CONDITIONING", ),
- "refiner_negative": ("CONDITIONING", ),
- "latent_image": ("LATENT", ),
- "noise_seed": ("INT", {"default": 0, "min": 0, "max": 0xfffffffffffffff0}),
- "steps": ("INT", {"default": 20, "min": 1, "max": 200}),
- "cfg": ("FLOAT", {"default": 7.0, "min": 0.0, "max": 30.0, "step": 0.5}),
- "sampler_name": ("SAMPLER_NAME", {"default": "ddim"}),
- "scheduler": ("SCHEDULER_NAME", {"default": "ddim_uniform"}),
- "base_ratio": ("FLOAT", {"default": 0.8, "min": 0.0, "max": 1.0, "step": 0.01}),
- "denoise": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.01}),
- },
- "optional": {
- "refiner_prep_steps": ("INT", {"default": 0, "min": 0, "max": 10}),
-# "noise_offset": ("INT", {"default": 1, "min": 0, "max": 1}),
-# "refiner_strength": ("FLOAT", {"default": 1.0, "min": 0.01, "max": 1.0, "step": 0.05}),
- },
- }
-
- RETURN_TYPES = ("LATENT", )
- FUNCTION = "sample"
-
- CATEGORY = "Searge/Sampling"
-
- def sample(self, base_model, base_positive, base_negative, refiner_model, refiner_positive, refiner_negative, latent_image, noise_seed, steps, cfg, sampler_name, scheduler, base_ratio, denoise, refiner_prep_steps=None, noise_offset=None, refiner_strength=None):
- base_steps = int(steps * (base_ratio + 0.0001))
- refiner_steps = max(0, steps - base_steps)
-
-# if noise_offset is None:
-# noise_offset = 1
-
-# if refiner_strength is None:
-# refiner_strength = 1.0
-
-# if refiner_strength < 0.01:
-# refiner_strength = 0.01
-
- if denoise < 0.01:
- return (latent_image, )
-
- start_at_step = 0
- input_latent = latent_image
-
- if refiner_prep_steps is not None:
- if refiner_prep_steps >= base_steps:
- refiner_prep_steps = base_steps - 1
-
- if refiner_prep_steps > 0:
- start_at_step = refiner_prep_steps
- precondition_result = nodes.common_ksampler(refiner_model, noise_seed + 2, steps, cfg, sampler_name, scheduler, refiner_positive, refiner_negative, latent_image, denoise=denoise, disable_noise=False, start_step=steps - refiner_prep_steps, last_step=steps, force_full_denoise=False)
- input_latent = precondition_result[0]
-
- if base_steps >= steps:
- return nodes.common_ksampler(base_model, noise_seed, steps, cfg, sampler_name, scheduler, base_positive, base_negative, input_latent, denoise=denoise, disable_noise=False, start_step=start_at_step, last_step=steps, force_full_denoise=True)
-
- return sdxl_ksampler(base_model, refiner_model, noise_seed, base_steps, refiner_steps, cfg, sampler_name, scheduler, base_positive, base_negative, refiner_positive, refiner_negative, input_latent, denoise=denoise, disable_noise=False, start_step=start_at_step, last_step=steps, force_full_denoise=True)
-
-# base_result = nodes.common_ksampler(base_model, noise_seed, steps, cfg, sampler_name, scheduler, base_positive, base_negative, input_latent, denoise=denoise, disable_noise=False, start_step=start_at_step, last_step=base_steps, force_full_denoise=True)
-# return nodes.common_ksampler(refiner_model, noise_seed + noise_offset, steps, cfg, sampler_name, scheduler, refiner_positive, refiner_negative, base_result[0], denoise=denoise * refiner_strength, disable_noise=False, start_step=base_steps, last_step=steps, force_full_denoise=True)
-
-
-# SDXL Image2Image Sampler (incl. HiRes Fix)
-
-class SeargeSDXLImage2ImageSamplerV3:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "base_model": ("MODEL",),
- "base_positive": ("CONDITIONING", ),
- "base_negative": ("CONDITIONING", ),
- "refiner_model": ("MODEL",),
- "refiner_positive": ("CONDITIONING",),
- "refiner_negative": ("CONDITIONING",),
- "image": ("IMAGE", ),
- "vae": ("VAE",),
- "noise_seed": ("INT", {"default": 0, "min": 0, "max": 0xfffffffffffffff0}),
- "steps": ("INT", {"default": 20, "min": 0, "max": 200}),
- "cfg": ("FLOAT", {"default": 7.0, "min": 0.0, "max": 30.0, "step": 0.5}),
- "sampler_name": ("SAMPLER_NAME", {"default": "ddim"}),
- "scheduler": ("SCHEDULER_NAME", {"default": "ddim_uniform"}),
- "base_ratio": ("FLOAT", {"default": 0.8, "min": 0.0, "max": 1.0, "step": 0.01}),
- "denoise": ("FLOAT", {"default": 0.25, "min": 0.0, "max": 1.0, "step": 0.01}),
- },
- "optional": {
- "upscale_model": ("UPSCALE_MODEL",),
- "scaled_width": ("INT", {"default": 1536, "min": 0, "max": nodes.MAX_RESOLUTION, "step": 8}),
- "scaled_height": ("INT", {"default": 1536, "min": 0, "max": nodes.MAX_RESOLUTION, "step": 8}),
-# "noise_offset": ("INT", {"default": 1, "min": 0, "max": 1}),
-# "refiner_strength": ("FLOAT", {"default": 1.0, "min": 0.1, "max": 1.0, "step": 0.05}),
- "softness": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.05}),
- },
- }
-
- RETURN_TYPES = ("IMAGE", )
- FUNCTION = "sample"
-
- CATEGORY = "Searge/Sampling"
-
- def sample(self, base_model, base_positive, base_negative, refiner_model, refiner_positive, refiner_negative, image, vae, noise_seed, steps, cfg, sampler_name, scheduler, base_ratio, denoise, softness, upscale_model=None, scaled_width=None, scaled_height=None, noise_offset=None, refiner_strength=None):
- base_steps = int(steps * (base_ratio + 0.0001))
- refiner_steps = max(0, steps - base_steps)
-
-# if noise_offset is None:
-# noise_offset = 1
-
-# if refiner_strength is None:
-# refiner_strength = 1.0
-
-# if refiner_strength < 0.01:
-# refiner_strength = 0.01
-
- if steps < 1:
- return (image, )
-
- scaled_image = image
-
- use_upscale_model = upscale_model is not None and softness < 0.9999
- if use_upscale_model:
- upscale_result = comfy_extras.nodes_upscale_model.ImageUpscaleWithModel().upscale(upscale_model, image)
- scaled_image = upscale_result[0]
-
- if scaled_width is not None and scaled_height is not None:
- upscale_result = nodes.ImageScale().upscale(scaled_image, "bicubic", scaled_width, scaled_height, "center")
- scaled_image = upscale_result[0]
-
- if use_upscale_model and softness > 0.0001:
- upscale_result = nodes.ImageScale().upscale(image, "bicubic", scaled_width, scaled_height, "center")
- scaled_original = upscale_result[0]
-
- blend_result = comfy_extras.nodes_post_processing.Blend().blend_images(scaled_image, scaled_original, softness, "normal")
- scaled_image = blend_result[0]
-
- if denoise < 0.01:
- return (scaled_image, )
-
- vae_encode_result = nodes.VAEEncode().encode(vae, scaled_image)
- input_latent = vae_encode_result[0]
-
- if base_steps >= steps:
- result_latent = nodes.common_ksampler(base_model, noise_seed, steps, cfg, sampler_name, scheduler, base_positive, base_negative, input_latent, denoise=denoise, disable_noise=False, start_step=0, last_step=steps, force_full_denoise=True)
- else:
- result_latent = sdxl_ksampler(base_model, refiner_model, noise_seed, base_steps, refiner_steps, cfg, sampler_name, scheduler, base_positive, base_negative, refiner_positive, refiner_negative, input_latent, denoise=denoise, disable_noise=False, start_step=0, last_step=steps, force_full_denoise=True)
-
-# base_result = nodes.common_ksampler(base_model, noise_seed, steps, cfg, sampler_name, scheduler, base_positive, base_negative, input_latent, denoise=denoise, disable_noise=False, start_step=0, last_step=base_steps, force_full_denoise=True)
-# result_latent = nodes.common_ksampler(refiner_model, noise_seed + noise_offset, steps, cfg, sampler_name, scheduler, refiner_positive, refiner_negative, base_result[0], denoise=denoise * refiner_strength, disable_noise=False, start_step=base_steps, last_step=steps, force_full_denoise=True)
-
- vae_decode_result = nodes.VAEDecode().decode(vae, result_latent[0])
- output_image = vae_decode_result[0]
-
- return (output_image, )
diff --git a/modules/stage.py b/modules/stage.py
new file mode 100644
index 0000000..0c6f227
--- /dev/null
+++ b/modules/stage.py
@@ -0,0 +1,70 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .data_utils import retrieve_parameter
+from .mb_pipeline import PipelineAccess
+from .names import Names
+from .ui import UI
+
+
+# --------------------------------------------------------------------------------
+# Stage: TemplateForNewStages
+# --------------------------------------------------------------------------------
+
+class SeargeStage:
+ def __init__(self):
+ pass
+
+ def get_input(self, data, stage_data):
+ # if we still don't have stage data,
+ if stage_data is None and data is not None:
+ stage_data = {
+ PipelineAccess.NAME: retrieve_parameter(PipelineAccess.NAME, data),
+ }
+
+ return stage_data
+
+ def process(self, data, stage_input):
+ access = PipelineAccess(stage_input)
+
+ example = access.get_active_setting(UI.S_EXAMPLE_STRUCTURE, UI.F_EXAMPLE_FIELD, 4815162342)
+
+ example += 1337
+
+ example_structure = {
+ Names.F_EXAMPLE_FIELD: example,
+ }
+
+ if data is not None:
+ data[Names.S_EXAMPLE_STRUCTURE] = example_structure
+
+ stage_output = {
+ Names.S_EXAMPLE_STRUCTURE: example_structure,
+ }
+
+ return (data, stage_output,)
diff --git a/modules/stage_apply_controlnet.py b/modules/stage_apply_controlnet.py
new file mode 100644
index 0000000..03d32ed
--- /dev/null
+++ b/modules/stage_apply_controlnet.py
@@ -0,0 +1,204 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .data_utils import retrieve_parameter
+from .mb_pipeline import PipelineAccess
+from .names import Names
+from .node_wrapper import NodeWrapper
+from .ui import UI
+
+
+# --------------------------------------------------------------------------------
+# Stage: Apply Controlnet
+# --------------------------------------------------------------------------------
+
+class SeargeStageApplyControlnet:
+ def __init__(self):
+ pass
+
+ def get_input(self, data, stage_data):
+ # if we still don't have stage data,
+ if stage_data is None and data is not None:
+ stage_data = {
+ PipelineAccess.NAME: retrieve_parameter(PipelineAccess.NAME, data),
+ }
+
+ return stage_data
+
+ def process(self, data, stage_input):
+ access = PipelineAccess(stage_input)
+
+ stack = access.get_active_setting(UI.S_CONTROLNET_INPUTS, UI.F_CN_STACK, [])
+
+ base_cond = access.get_from_pipeline(Names.P_BASE_CONDITIONING)
+ base_cond_changed = access.changed_in_pipeline(Names.P_BASE_CONDITIONING)
+
+ clip_vision_changed = access.changed_in_pipeline(Names.P_CLIP_VISION_MODEL)
+ canny_changed = access.changed_in_pipeline(Names.P_CN_CANNY_MODEL)
+ depth_changed = access.changed_in_pipeline(Names.P_CN_DEPTH_MODEL)
+ recolor_changed = access.changed_in_pipeline(Names.P_CN_RECOLOR_MODEL)
+ sketch_changed = access.changed_in_pipeline(Names.P_CN_SKETCH_MODEL)
+ custom_changed = access.changed_in_pipeline(Names.P_CN_CUSTOM_MODEL)
+
+ (cn_stack, images_changed) = self.comparable_stack(stack)
+
+ any_changes = (
+ images_changed or
+ base_cond_changed or
+ clip_vision_changed or
+ canny_changed or
+ depth_changed or
+ recolor_changed or
+ sketch_changed or
+ custom_changed
+ )
+
+ applied_controlnet_changed = access.changed_in_cache(Names.C_APPLIED_CONTROLNET, cn_stack)
+ if any_changes or applied_controlnet_changed:
+ (base_positive, base_negative, changed_cond) = self.apply_controlnet(access, stack, base_cond)
+
+ access.update_in_cache(Names.C_APPLIED_CONTROLNET, cn_stack, (base_positive, base_negative,
+ base_cond, changed_cond))
+
+ access.update_in_pipeline(Names.P_BASE_CONDITIONING, base_cond)
+
+ else:
+ (base_positive, base_negative, base_cond, changed_cond) = access.get_from_cache(Names.C_APPLIED_CONTROLNET)
+ if changed_cond:
+ access.restore_in_pipeline(Names.P_BASE_CONDITIONING, base_cond)
+
+ controlnet_output = {
+ Names.F_CN_BASE_POSITIVE: base_positive,
+ Names.F_CN_BASE_NEGATIVE: base_negative,
+ }
+
+ if data is not None:
+ data[Names.S_CONTROLNET_OUTPUT] = controlnet_output
+
+ stage_output = {
+ Names.S_CONTROLNET_OUTPUT: controlnet_output,
+ }
+
+ return (data, stage_output,)
+
+ def comparable_stack(self, stack):
+ new_stack = []
+
+ images_changed = False
+
+ for controlnet in stack:
+ entry = controlnet.copy()
+
+ if UI.F_REV_CN_IMAGE in entry:
+ entry.pop(UI.F_REV_CN_IMAGE)
+
+ if UI.F_REV_CN_IMAGE_CHANGED in entry:
+ if entry[UI.F_REV_CN_IMAGE_CHANGED]:
+ images_changed = True
+ controlnet[UI.F_REV_CN_IMAGE_CHANGED] = False
+
+ entry.pop(UI.F_REV_CN_IMAGE_CHANGED)
+
+ new_stack.append(entry)
+
+ return (new_stack, images_changed,)
+
+ def apply_controlnet(self, access, stack, base_cond):
+
+ base_positive = retrieve_parameter(Names.F_BASE_POSITIVE, base_cond)
+ base_negative = retrieve_parameter(Names.F_BASE_NEGATIVE, base_cond)
+
+ changed_cond = False
+ for controlnet in stack:
+ mode = retrieve_parameter(UI.F_REV_CN_MODE, controlnet, UI.NONE)
+ strength = retrieve_parameter(UI.F_REV_CN_STRENGTH, controlnet, 0.0)
+ cn_image = retrieve_parameter(UI.F_REV_CN_IMAGE, controlnet)
+
+ base_positive = retrieve_parameter(Names.F_BASE_POSITIVE, base_cond)
+ base_negative = retrieve_parameter(Names.F_BASE_NEGATIVE, base_cond)
+
+ controlnet_model = None
+ if mode == UI.NONE:
+ continue
+
+ elif mode == UI.CN_MODE_REVISION:
+ clipvision_model = access.get_from_pipeline(Names.P_CLIP_VISION_MODEL)
+ if clipvision_model is not None and cn_image is not None:
+ clip_vision = NodeWrapper.clipvision_encoder.encode(clipvision_model, cn_image)[0]
+ else:
+ clip_vision = None
+
+ if clip_vision is not None and base_positive is not None and strength != 0.0:
+ noise_aug = retrieve_parameter(UI.F_REV_NOISE_AUGMENTATION, controlnet, 0.0)
+ enhancer = retrieve_parameter(UI.F_REV_ENHANCER, controlnet, False)
+
+ base_positive = NodeWrapper.unclip_conditioning.apply_adm(base_positive, clip_vision,
+ strength, noise_aug)[0]
+ base_cond[Names.F_BASE_POSITIVE] = base_positive
+
+ if base_negative is not None and strength > 0.0 and enhancer:
+ base_negative = NodeWrapper.unclip_conditioning.apply_adm(base_negative, clip_vision,
+ -strength, noise_aug)[0]
+ base_cond[Names.F_BASE_NEGATIVE] = base_negative
+
+ changed_cond = True
+
+ elif mode == UI.CN_MODE_CANNY:
+ controlnet_model = access.get_from_pipeline(Names.P_CN_CANNY_MODEL)
+
+ elif mode == UI.CN_MODE_DEPTH:
+ controlnet_model = access.get_from_pipeline(Names.P_CN_DEPTH_MODEL)
+
+ elif mode == UI.CN_MODE_RECOLOR:
+ controlnet_model = access.get_from_pipeline(Names.P_CN_RECOLOR_MODEL)
+
+ elif mode == UI.CN_MODE_SKETCH:
+ controlnet_model = access.get_from_pipeline(Names.P_CN_SKETCH_MODEL)
+
+ elif mode == UI.CUSTOM:
+ controlnet_model = access.get_from_pipeline(Names.P_CN_CUSTOM_MODEL)
+
+ if controlnet_model is None:
+ continue
+
+ if cn_image is not None and base_positive is not None and base_negative is not None:
+ start = retrieve_parameter(UI.F_CN_START, controlnet, 0.0)
+ end = retrieve_parameter(UI.F_CN_END, controlnet, 1.0)
+
+ result = NodeWrapper.controlnet_advanced.apply_controlnet(base_positive, base_negative,
+ controlnet_model, cn_image, strength,
+ start, end)
+ base_positive = result[0]
+ base_negative = result[1]
+
+ base_cond[Names.F_BASE_POSITIVE] = base_positive
+ base_cond[Names.F_BASE_NEGATIVE] = base_negative
+
+ changed_cond = True
+
+ return (base_positive, base_negative, changed_cond)
diff --git a/modules/stage_apply_loras.py b/modules/stage_apply_loras.py
new file mode 100644
index 0000000..2aa6676
--- /dev/null
+++ b/modules/stage_apply_loras.py
@@ -0,0 +1,101 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .data_utils import retrieve_parameter
+from .mb_pipeline import PipelineAccess
+from .names import Names
+from .node_wrapper import NodeWrapper
+from .ui import UI
+
+
+# --------------------------------------------------------------------------------
+# Stage: Apply Loras
+# --------------------------------------------------------------------------------
+
+class SeargeStageApplyLoras:
+ def __init__(self):
+ pass
+
+ def get_input(self, data, stage_data):
+ # if we still don't have stage data,
+ if stage_data is None and data is not None:
+ stage_data = {
+ PipelineAccess.NAME: retrieve_parameter(PipelineAccess.NAME, data),
+ }
+
+ return stage_data
+
+ def process(self, data, stage_input):
+ access = PipelineAccess(stage_input)
+
+ base_model = access.get_from_pipeline(Names.P_BASE_MODEL)
+ base_clip = access.get_from_pipeline(Names.P_BASE_CLIP)
+
+ base_model_changed = access.changed_in_pipeline(Names.P_BASE_MODEL)
+ base_clip_changed = access.changed_in_pipeline(Names.P_BASE_CLIP)
+
+ lora_stack = access.get_active_setting(UI.S_LORAS, UI.F_LORA_STACK, [])
+
+ any_changes = (
+ base_model_changed or
+ base_clip_changed
+ )
+
+ applied_loras = []
+
+ loras_changed = access.changed_in_cache(Names.C_APPLIED_LORAS, lora_stack)
+ if loras_changed or any_changes:
+ for lora in lora_stack:
+ lora_name = retrieve_parameter(UI.F_LORA_NAME, lora)
+ lora_strength = retrieve_parameter(UI.F_LORA_STRENGTH, lora, 0.0)
+
+ if lora_name is not None and lora_name != UI.NONE and lora_strength != 0.0:
+ (base_model, base_clip) = NodeWrapper.lora_loader.load_lora(base_model, base_clip, lora_name,
+ lora_strength, lora_strength)
+ applied_loras.append(lora_name)
+
+ access.update_in_cache(Names.C_APPLIED_LORAS, lora_stack, (base_model, base_clip))
+ access.update_in_pipeline(Names.P_BASE_MODEL, base_model)
+ access.update_in_pipeline(Names.P_BASE_CLIP, base_clip)
+ else:
+ (base_model, base_clip) = access.get_from_cache(Names.C_APPLIED_LORAS)
+ access.restore_in_pipeline(Names.P_BASE_MODEL, base_model)
+ access.restore_in_pipeline(Names.P_BASE_CLIP, base_clip)
+
+ loaded_loras = {
+ Names.F_LORA_NAMES: applied_loras,
+ }
+
+ if data is not None:
+ data[Names.S_LOADED_LORAS] = loaded_loras
+
+ stage_output = {
+ Names.S_EXAMPLE_STRUCTURE: loaded_loras,
+ }
+
+ return (data, stage_output,)
diff --git a/modules/stage_clip_conditioning.py b/modules/stage_clip_conditioning.py
new file mode 100644
index 0000000..e218a1b
--- /dev/null
+++ b/modules/stage_clip_conditioning.py
@@ -0,0 +1,392 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .data_utils import retrieve_parameter
+from .mb_pipeline import PipelineAccess
+from .names import Names
+from .node_wrapper import NodeWrapper
+from .ui import UI
+from .utils import next_multiple_of
+
+
+# --------------------------------------------------------------------------------
+# Stage: Clip Conditioning
+# --------------------------------------------------------------------------------
+
+class SeargeStageClipConditioning:
+ PROMPT_PLACEHOLDER = ""
+ CONDITIONING_ROUNDING = 16
+
+ def __init__(self):
+ pass
+
+ def get_input(self, data, stage_data):
+ # if we still don't have stage data,
+ if stage_data is None and data is not None:
+ stage_data = {
+ PipelineAccess.NAME: retrieve_parameter(PipelineAccess.NAME, data),
+ }
+
+ return stage_data
+
+ def process(self, data, stage_input):
+ access = PipelineAccess(stage_input)
+
+ base_clip_changed = access.changed_in_pipeline(Names.P_BASE_CLIP)
+ refiner_clip_changed = access.changed_in_pipeline(Names.P_REFINER_CLIP)
+
+ base_clip = access.get_from_pipeline(Names.P_BASE_CLIP)
+ refiner_clip = access.get_from_pipeline(Names.P_REFINER_CLIP)
+ has_refiner_clip = refiner_clip is not None
+
+ main_prompt = access.get_active_setting(UI.S_PROMPTS, UI.F_MAIN_PROMPT, "")
+ secondary_prompt = access.get_active_setting(UI.S_PROMPTS, UI.F_SECONDARY_PROMPT, "")
+ style_prompt = access.get_active_setting(UI.S_PROMPTS, UI.F_STYLE_PROMPT, "")
+ neg_main_prompt = access.get_active_setting(UI.S_PROMPTS, UI.F_NEGATIVE_MAIN_PROMPT, "")
+ neg_secondary_prompt = access.get_active_setting(UI.S_PROMPTS, UI.F_NEGATIVE_SECONDARY_PROMPT, "")
+ neg_style_prompt = access.get_active_setting(UI.S_PROMPTS, UI.F_NEGATIVE_STYLE_PROMPT, "")
+
+ prompting_mode = access.get_active_setting(UI.S_OPERATING_MODE, UI.F_PROMPTING_MODE, UI.PROMPTING_DEFAULT)
+
+ image_width = access.get_active_setting(UI.S_GENERATION_PARAMETERS, UI.F_IMAGE_WIDTH, 1024)
+ image_height = access.get_active_setting(UI.S_GENERATION_PARAMETERS, UI.F_IMAGE_HEIGHT, 1024)
+
+ base_cond_scale = access.get_active_setting(UI.S_CONDITIONING_PARAMETERS, UI.F_BASE_CONDITIONING_SCALE, 1)
+ refiner_cond_scale = access.get_active_setting(UI.S_CONDITIONING_PARAMETERS, UI.F_REFINER_CONDITIONING_SCALE, 1)
+ target_cond_scale = access.get_active_setting(UI.S_CONDITIONING_PARAMETERS, UI.F_TARGET_CONDITIONING_SCALE, 1)
+ pos_cond_scale = access.get_active_setting(UI.S_CONDITIONING_PARAMETERS, UI.F_POSITIVE_CONDITIONING_SCALE, 1.5)
+ neg_cond_scale = access.get_active_setting(UI.S_CONDITIONING_PARAMETERS, UI.F_NEGATIVE_CONDITIONING_SCALE, 0.75)
+ pos_ascore = access.get_active_setting(UI.S_CONDITIONING_PARAMETERS, UI.F_POSITIVE_AESTHETIC_SCORE, 6.0)
+ neg_ascore = access.get_active_setting(UI.S_CONDITIONING_PARAMETERS, UI.F_NEGATIVE_AESTHETIC_SCORE, 2.5)
+
+ prompts = [
+ prompting_mode,
+ main_prompt,
+ secondary_prompt,
+ style_prompt,
+ neg_main_prompt,
+ neg_secondary_prompt,
+ neg_style_prompt,
+ ]
+
+ def pack_prompts(processed):
+ (base_pos_main, base_pos_sec, base_pos_style, base_neg_main, base_neg_sec, base_neg_style,
+ ref_pos, ref_pos_style, ref_neg, ref_neg_style) = processed
+
+ return {
+ Names.F_BASE_POSITIVE_MAIN_PROMPT: base_pos_main,
+ Names.F_BASE_POSITIVE_SECONDARY_PROMPT: base_pos_sec,
+ Names.F_BASE_POSITIVE_STYLE_PROMPT: base_pos_style,
+ Names.F_BASE_NEGATIVE_MAIN_PROMPT: base_neg_main,
+ Names.F_BASE_NEGATIVE_SECONDARY_PROMPT: base_neg_sec,
+ Names.F_BASE_NEGATIVE_STYLE_PROMPT: base_neg_style,
+ Names.F_REFINER_POSITIVE_PROMPT: ref_pos,
+ Names.F_REFINER_POSITIVE_STYLE_PROMPT: ref_pos_style,
+ Names.F_REFINER_NEGATIVE_PROMPT: ref_neg,
+ Names.F_REFINER_NEGATIVE_STYLE_PROMPT: ref_neg_style,
+ }
+
+ prompts_changed = access.changed_in_cache(Names.C_PROCESSED_PROMPTS, prompts)
+ if prompts_changed:
+ empty = ""
+ if prompting_mode == UI.PROMPTING_DEFAULT:
+ processed_prompts = self.create_standard_prompts(
+ main_prompt, secondary_prompt, style_prompt,
+ neg_main_prompt, neg_secondary_prompt, neg_style_prompt)
+
+ elif prompting_mode == UI.PROMPTING_MAIN_AND_NEGATIVE_ONLY:
+ processed_prompts = self.create_standard_prompts(
+ main_prompt, main_prompt, empty,
+ neg_main_prompt, neg_main_prompt, empty)
+
+ elif prompting_mode == UI.PROMPTING_MAIN_SECONDARY_AND_NEGATIVE:
+ processed_prompts = self.create_standard_prompts(
+ main_prompt, secondary_prompt, empty,
+ neg_main_prompt, neg_main_prompt, empty)
+
+ elif prompting_mode == UI.PROMPTING_MAIN_ALL_EXCEPT_SECONDARY:
+ processed_prompts = self.create_standard_prompts(
+ main_prompt, main_prompt, style_prompt,
+ neg_main_prompt, neg_secondary_prompt, neg_style_prompt)
+
+ else:
+ processed_prompts = self.create_pass_through_prompts(
+ main_prompt, secondary_prompt, style_prompt,
+ neg_main_prompt, neg_secondary_prompt, neg_style_prompt)
+
+ access.update_in_cache(Names.C_PROCESSED_PROMPTS, prompts, processed_prompts)
+ access.update_in_pipeline(Names.P_PROCESSED_PROMPTS, pack_prompts(processed_prompts))
+ else:
+ processed_prompts = access.get_from_cache(Names.C_PROCESSED_PROMPTS)
+ access.restore_in_pipeline(Names.P_PROCESSED_PROMPTS, pack_prompts(processed_prompts))
+
+ (base_pos_main, base_pos_sec, base_pos_style, base_neg_main, base_neg_sec, base_neg_style,
+ ref_pos, ref_pos_style, ref_neg, ref_neg_style) = processed_prompts
+
+ base_prompts = [
+ base_cond_scale,
+ target_cond_scale,
+ pos_cond_scale,
+ neg_cond_scale,
+ base_pos_main,
+ base_pos_sec,
+ base_pos_style,
+ base_neg_main,
+ base_neg_sec,
+ base_neg_style,
+ ]
+
+ refiner_prompts = [
+ refiner_cond_scale,
+ pos_cond_scale,
+ neg_cond_scale,
+ pos_ascore,
+ neg_ascore,
+ ref_pos,
+ ref_pos_style,
+ ref_neg,
+ ref_neg_style,
+ ]
+
+ def pack_base_cond(encoded):
+ (pos, pos_style, neg, neg_style) = encoded
+
+ return {
+ Names.F_BASE_POSITIVE: pos,
+ Names.F_BASE_POSITIVE_STYLE: pos_style,
+ Names.F_BASE_NEGATIVE: neg,
+ Names.F_BASE_NEGATIVE_STYLE: neg_style,
+ }
+
+ def pack_ref_cond(encoded):
+ (pos, pos_style, neg, neg_style) = encoded
+
+ return {
+ Names.F_REFINER_POSITIVE: pos,
+ Names.F_REFINER_POSITIVE_STYLE: pos_style,
+ Names.F_REFINER_NEGATIVE: neg,
+ Names.F_REFINER_NEGATIVE_STYLE: neg_style,
+ }
+
+ base_cond_changed = access.changed_in_cache(Names.C_BASE_CONDITIONING, base_prompts)
+ if base_cond_changed or base_clip_changed:
+ encoded_base = self.encode_base(base_clip, processed_prompts, image_width, image_height,
+ base_cond_scale, target_cond_scale, pos_cond_scale, neg_cond_scale)
+
+ access.update_in_cache(Names.C_BASE_CONDITIONING, base_prompts, encoded_base)
+ access.update_in_pipeline(Names.P_BASE_CONDITIONING, pack_base_cond(encoded_base))
+ else:
+ encoded_base = access.get_from_cache(Names.C_BASE_CONDITIONING)
+ access.restore_in_pipeline(Names.P_BASE_CONDITIONING, pack_base_cond(encoded_base))
+
+ if has_refiner_clip:
+ ref_cond_changed = access.changed_in_cache(Names.C_REFINER_CONDITIONING, refiner_prompts)
+ if ref_cond_changed or refiner_clip_changed:
+ encoded_ref = self.encode_ref(refiner_clip, processed_prompts, image_width, image_height,
+ refiner_cond_scale, pos_cond_scale, neg_cond_scale,
+ pos_ascore, neg_ascore)
+
+ access.update_in_cache(Names.C_REFINER_CONDITIONING, refiner_prompts, encoded_ref)
+ access.update_in_pipeline(Names.P_REFINER_CONDITIONING, pack_ref_cond(encoded_ref))
+ else:
+ encoded_ref = access.get_from_cache(Names.C_REFINER_CONDITIONING)
+ access.restore_in_pipeline(Names.P_REFINER_CONDITIONING, pack_ref_cond(encoded_ref))
+ else:
+ encoded_ref = (None, None, None, None,)
+ if refiner_clip_changed:
+ access.update_in_pipeline(Names.P_REFINER_CONDITIONING, pack_ref_cond(encoded_ref))
+ else:
+ access.restore_in_pipeline(Names.P_REFINER_CONDITIONING, pack_ref_cond(encoded_ref))
+
+ (base_positive, base_positive_style, base_negative, base_negative_style) = encoded_base
+ (refiner_positive, refiner_positive_style, refiner_negative, refiner_negative_style) = encoded_ref
+
+ processed_prompts = pack_prompts(processed_prompts)
+
+ conditioning = {
+ Names.F_BASE_POSITIVE: base_positive,
+ Names.F_BASE_POSITIVE_STYLE: base_positive_style,
+ Names.F_BASE_NEGATIVE: base_negative,
+ Names.F_BASE_NEGATIVE_STYLE: base_negative_style,
+ Names.F_REFINER_POSITIVE: refiner_positive,
+ Names.F_REFINER_POSITIVE_STYLE: refiner_positive_style,
+ Names.F_REFINER_NEGATIVE: refiner_negative,
+ Names.F_REFINER_NEGATIVE_STYLE: refiner_negative_style,
+ }
+
+ if data is not None:
+ data[Names.S_CONDITIONING] = conditioning
+ data[Names.S_PROCESSED_PROMPTS] = processed_prompts
+
+ stage_output = {
+ Names.S_CONDITIONING: conditioning,
+ Names.S_PROCESSED_PROMPTS: processed_prompts,
+ }
+
+ return (data, stage_output,)
+
+ def create_standard_prompts(self, main, secondary, pos_style, neg_main, neg_secondary, neg_style):
+ main = "" if main is None else main
+ secondary = main if secondary is None else secondary
+ neg_main = "" if neg_main is None else neg_main
+ neg_secondary = neg_main if neg_secondary is None else neg_secondary
+
+ if pos_style is not None and len(pos_style) > 0:
+ if pos_style.find(self.PROMPT_PLACEHOLDER) >= 0:
+ base_pos_main = pos_style.replace(self.PROMPT_PLACEHOLDER, main)
+ base_pos_sec = pos_style.replace(self.PROMPT_PLACEHOLDER, secondary)
+ else:
+ if len(main) > 0:
+ base_pos_main = main + ". " + pos_style
+ else:
+ base_pos_main = pos_style
+
+ if len(secondary) > 0:
+ base_pos_sec = secondary + ". " + pos_style
+ else:
+ base_pos_sec = pos_style
+ else:
+ base_pos_main = main
+ base_pos_sec = secondary
+
+ base_neg_main = neg_main
+ base_neg_sec = neg_secondary
+
+ if pos_style is not None and len(pos_style) > 0:
+ if pos_style.find(self.PROMPT_PLACEHOLDER) >= 0:
+ ref_pos = pos_style.replace(self.PROMPT_PLACEHOLDER, main)
+ else:
+ if len(main) > 0:
+ ref_pos = main + ". " + pos_style
+ else:
+ ref_pos = pos_style
+ else:
+ ref_pos = main
+
+ if len(neg_main) > 0 and len(neg_secondary) > 0:
+ ref_neg = neg_main + ". " + neg_secondary
+ elif len(neg_main) > 0:
+ ref_neg = neg_main
+ elif len(neg_secondary) > 0:
+ ref_neg = neg_secondary
+ else:
+ ref_neg = ""
+
+ base_pos_style = pos_style.replace(self.PROMPT_PLACEHOLDER, "")
+ base_neg_style = neg_style.replace(self.PROMPT_PLACEHOLDER, "")
+ ref_pos_style = base_pos_style
+ ref_neg_style = base_neg_style
+
+ return (base_pos_main, base_pos_sec, base_pos_style, base_neg_main, base_neg_sec, base_neg_style,
+ ref_pos, ref_pos_style, ref_neg, ref_neg_style)
+
+ def create_pass_through_prompts(self, main, secondary, style_prompt, neg_main, neg_secondary, neg_style):
+ base_pos_main = main
+ base_pos_sec = secondary
+ base_pos_style = style_prompt
+
+ base_neg_main = neg_main
+ base_neg_sec = neg_secondary
+ base_neg_style = neg_style
+
+ if len(main) > 0 and len(secondary) > 0:
+ ref_pos = main + ". " + secondary
+ elif len(main) > 0:
+ ref_pos = main
+ elif len(secondary) > 0:
+ ref_pos = secondary
+ else:
+ ref_pos = ""
+
+ ref_pos_style = style_prompt
+
+ if len(neg_main) > 0 and len(neg_secondary) > 0:
+ ref_neg = neg_main + ". " + neg_secondary
+ elif len(neg_main) > 0:
+ ref_neg = neg_main
+ elif len(neg_secondary) > 0:
+ ref_neg = neg_secondary
+ else:
+ ref_neg = ""
+
+ ref_neg_style = neg_style
+
+ return (base_pos_main, base_pos_sec, base_pos_style, base_neg_main, base_neg_sec, base_neg_style,
+ ref_pos, ref_pos_style, ref_neg, ref_neg_style)
+
+ def encode_base(self, base_clip, std_prompts, image_width, image_height, cond_scale=1.0, target_scale=1.0,
+ pos_scale=1.0, neg_scale=1.0):
+ encoder = NodeWrapper.sdxl_clip_base_encoder
+
+ (pos_main, pos_sec, pos_style, neg_main, neg_sec, neg_style, _, _, _, _) = std_prompts
+
+ base_width = next_multiple_of(image_width * cond_scale, self.CONDITIONING_ROUNDING)
+ base_height = next_multiple_of(image_height * cond_scale, self.CONDITIONING_ROUNDING)
+ target_width = next_multiple_of(image_width * target_scale, self.CONDITIONING_ROUNDING)
+ target_height = next_multiple_of(image_height * target_scale, self.CONDITIONING_ROUNDING)
+
+ pos_width = next_multiple_of(base_width * pos_scale, self.CONDITIONING_ROUNDING)
+ pos_height = next_multiple_of(base_height * pos_scale, self.CONDITIONING_ROUNDING)
+
+ neg_width = next_multiple_of(base_width * neg_scale, self.CONDITIONING_ROUNDING)
+ neg_height = next_multiple_of(base_height * neg_scale, self.CONDITIONING_ROUNDING)
+
+ base_positive = encoder.encode(base_clip, pos_width, pos_height, 0, 0, target_width, target_height,
+ pos_main, pos_sec)[0]
+ base_positive_style = encoder.encode(base_clip, pos_width, pos_height, 0, 0, target_width, target_height,
+ pos_style, pos_style)[0]
+
+ base_negative = encoder.encode(base_clip, neg_width, neg_height, 0, 0, target_width, target_height,
+ neg_main, neg_sec)[0]
+ base_negative_style = encoder.encode(base_clip, neg_width, neg_height, 0, 0, target_width, target_height,
+ neg_style, neg_style)[0]
+
+ return (base_positive, base_positive_style, base_negative, base_negative_style)
+
+ def encode_ref(self, refiner_clip, std_prompts, image_width, image_height, cond_scale=1.0,
+ pos_scale=1.0, neg_scale=1.0, pos_ascore=6.0, neg_ascore=2.5):
+ encoder = NodeWrapper.sdxl_clip_refiner_encoder
+
+ (_, _, _, _, _, _, pos, pos_style, neg, neg_style) = std_prompts
+
+ refiner_width = next_multiple_of(image_width * cond_scale, self.CONDITIONING_ROUNDING)
+ refiner_height = next_multiple_of(image_height * cond_scale, self.CONDITIONING_ROUNDING)
+
+ pos_width = next_multiple_of(refiner_width * pos_scale, self.CONDITIONING_ROUNDING)
+ pos_height = next_multiple_of(refiner_height * pos_scale, self.CONDITIONING_ROUNDING)
+
+ neg_width = next_multiple_of(refiner_width * neg_scale, self.CONDITIONING_ROUNDING)
+ neg_height = next_multiple_of(refiner_height * neg_scale, self.CONDITIONING_ROUNDING)
+
+ refiner_positive = encoder.encode(refiner_clip, pos_ascore, pos_width, pos_height, pos)[0]
+ refiner_positive_style = encoder.encode(refiner_clip, pos_ascore, pos_width, pos_height, pos_style)[0]
+
+ refiner_negative = encoder.encode(refiner_clip, neg_ascore, neg_width, neg_height, neg)[0]
+ refiner_negative_style = encoder.encode(refiner_clip, neg_ascore, neg_width, neg_height, neg_style)[0]
+
+ return (refiner_positive, refiner_positive_style, refiner_negative, refiner_negative_style)
diff --git a/modules/stage_high_resolution.py b/modules/stage_high_resolution.py
new file mode 100644
index 0000000..c1f976a
--- /dev/null
+++ b/modules/stage_high_resolution.py
@@ -0,0 +1,332 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .data_utils import retrieve_parameter
+from .mb_pipeline import PipelineAccess
+from .names import Names
+from .node_wrapper import NodeWrapper
+from .ui import UI
+from .utils import get_image_size
+from .utils import next_multiple_of
+
+
+# --------------------------------------------------------------------------------
+# Stage: Sampling
+# --------------------------------------------------------------------------------
+
+class SeargeStageHighResolution:
+ SIZE_MULTIPLE_OF = 8
+
+ def __init__(self):
+ pass
+
+ def get_input(self, data, stage_data):
+ # if we still don't have stage data,
+ if stage_data is None and data is not None:
+ stage_data = {
+ PipelineAccess.NAME: retrieve_parameter(PipelineAccess.NAME, data),
+ }
+
+ return stage_data
+
+ def process(self, data, stage_input):
+ access = PipelineAccess(stage_input)
+
+ base_changed = access.changed_in_pipeline(Names.P_BASE_MODEL)
+ refiner_changed = access.changed_in_pipeline(Names.P_REFINER_MODEL)
+
+ base_model = access.get_from_pipeline(Names.P_BASE_MODEL)
+ refiner_model = access.get_from_pipeline(Names.P_REFINER_MODEL)
+ has_refiner = refiner_model is not None
+
+ vae_changed = access.changed_in_pipeline(Names.P_VAE_MODEL)
+ vae_model = access.get_from_pipeline(Names.P_VAE_MODEL)
+
+ upscaler_changed = access.changed_in_pipeline(Names.P_HIRES_UPSCALER)
+ upscale_model = access.get_from_pipeline(Names.P_HIRES_UPSCALER)
+
+ detail_processor_changed = access.changed_in_pipeline(Names.P_DETAIL_PROCESSOR)
+ detail_processor = access.get_from_pipeline(Names.P_DETAIL_PROCESSOR)
+
+ base_cond_changed = access.changed_in_pipeline(Names.P_BASE_CONDITIONING)
+ refiner_cond_changed = access.changed_in_pipeline(Names.P_REFINER_CONDITIONING)
+
+ base_cond = access.get_from_pipeline(Names.P_BASE_CONDITIONING)
+ refiner_cond = access.get_from_pipeline(Names.P_REFINER_CONDITIONING)
+
+ base_positive = retrieve_parameter(Names.F_BASE_POSITIVE, base_cond)
+ base_negative = retrieve_parameter(Names.F_BASE_NEGATIVE, base_cond)
+ refiner_positive = retrieve_parameter(Names.F_REFINER_POSITIVE, refiner_cond)
+ refiner_negative = retrieve_parameter(Names.F_REFINER_NEGATIVE, refiner_cond)
+
+ # for now these are here to prepare for the future addition of latent upscaling
+ latent_changed = access.changed_in_pipeline(Names.P_LATENT)
+ latent = access.get_from_pipeline(Names.P_LATENT)
+
+ image_changed = access.changed_in_pipeline(Names.P_IMAGE)
+ image = access.get_from_pipeline(Names.P_IMAGE)
+
+ seed = access.get_active_setting(UI.S_GENERATION_PARAMETERS, UI.F_SEED, 4815162342)
+ steps = access.get_active_setting(UI.S_GENERATION_PARAMETERS, UI.F_STEPS, 25)
+ cfg = access.get_active_setting(UI.S_GENERATION_PARAMETERS, UI.F_CFG, 7.0)
+ sampler_name = access.get_active_setting(UI.S_GENERATION_PARAMETERS, UI.F_SAMPLER_NAME, "dpmpp_2m")
+ scheduler = access.get_active_setting(UI.S_GENERATION_PARAMETERS, UI.F_SCHEDULER, "karras")
+ base_ratio = access.get_active_setting(UI.S_GENERATION_PARAMETERS, UI.F_BASE_VS_REFINER_RATIO, 0.8)
+
+ hires_mode = access.get_active_setting(UI.S_HIGH_RESOLUTION, UI.F_HIRES_MODE, UI.NONE)
+ hires_mode_changed = access.setting_changed(UI.S_HIGH_RESOLUTION, UI.F_HIRES_MODE)
+ hires_mode_enabled = hires_mode != UI.NONE
+
+ hires_scale = access.get_active_setting(UI.S_HIGH_RESOLUTION, UI.F_HIRES_SCALE, 1.5)
+ hires_denoise = access.get_active_setting(UI.S_HIGH_RESOLUTION, UI.F_HIRES_DENOISE, 0.2)
+ hires_softness = access.get_active_setting(UI.S_HIGH_RESOLUTION, UI.F_HIRES_SOFTNESS, 0.5)
+ hires_detail_boost = access.get_active_setting(UI.S_HIGH_RESOLUTION, UI.F_HIRES_DETAIL_BOOST, 0.0)
+
+ if not has_refiner:
+ refiner_model = None
+ refiner_positive = None
+ refiner_negative = None
+ base_ratio = 1.0
+ hires_detail_boost = 0.0
+
+ def run_sampler(latent, refiner_model, steps, denoise, cfg_method, dynamic_cfg, detail_boost):
+ sampler = NodeWrapper.sdxl_sampler
+ latent = sampler(base_model, base_positive, base_negative, latent, seed, steps, cfg,
+ sampler_name, scheduler, refiner_model=refiner_model,
+ refiner_positive=refiner_positive, refiner_negative=refiner_negative,
+ base_ratio=base_ratio, denoise=denoise, cfg_method=cfg_method,
+ dynamic_base_cfg=dynamic_cfg, dynamic_refiner_cfg=dynamic_cfg,
+ refiner_detail_boost=detail_boost)
+ return latent
+
+ upscale_factor = 1.0
+ if hires_scale == UI.HIRES_SCALE_1_25:
+ upscale_factor = 1.25
+ if hires_scale == UI.HIRES_SCALE_1_5:
+ upscale_factor = 1.5
+ if hires_scale == UI.HIRES_SCALE_2_0:
+ upscale_factor = 2.0
+
+ (image_width, image_height) = get_image_size(image)
+ new_image_width = next_multiple_of(image_width * upscale_factor, self.SIZE_MULTIPLE_OF)
+ new_image_height = next_multiple_of(image_height * upscale_factor, self.SIZE_MULTIPLE_OF)
+
+ # use this to make sure old cached latents are not kept when the high resolution mode changes
+ def cleanup_cache():
+ # do this for all types of upscaled latents that we cache before the sampler at the end
+ access.remove_from_cache(Names.C_HIRES_LATENT_SIMPLE)
+ access.remove_from_cache(Names.C_HIRES_LATENT_NORMAL)
+
+ larger = upscale_factor > 1.0
+ if larger and hires_mode == UI.HIRES_MODE_SIMPLE:
+ parameters = [
+ hires_mode,
+ image_width,
+ image_height,
+ hires_scale,
+ upscale_factor,
+ new_image_width,
+ new_image_height,
+ hires_softness,
+ ]
+
+ any_changes = (
+ vae_changed or
+ image_changed)
+
+ hires_latent_changed = access.changed_in_cache(Names.C_HIRES_LATENT_SIMPLE, parameters)
+ if any_changes or hires_latent_changed:
+ need_nearest = hires_softness < 0.999
+ need_bicubic = hires_softness > 0.001
+
+ if need_nearest:
+ nearest = NodeWrapper.image_scale.upscale(image, "nearest-exact", new_image_width,
+ new_image_height, "center")[0]
+ else:
+ nearest = None
+
+ if need_bicubic:
+ bicubic = NodeWrapper.image_scale.upscale(image, "bicubic", new_image_width,
+ new_image_height, "center")[0]
+ else:
+ bicubic = None
+
+ if need_nearest and need_bicubic and nearest is not None and bicubic is not None:
+ softened = NodeWrapper.image_blend.blend_images(nearest, bicubic, hires_softness, "normal")[0]
+ elif need_nearest and nearest is not None:
+ softened = nearest
+ elif need_bicubic and bicubic is not None:
+ softened = bicubic
+ else:
+ softened = None
+
+ if softened is not None:
+ latent = NodeWrapper.vae_encoder.encode(vae_model, softened)[0]
+
+ cleanup_cache()
+ access.update_in_cache(Names.C_HIRES_LATENT_SIMPLE, parameters, latent)
+ access.update_in_pipeline(Names.P_LATENT, latent)
+ else:
+ latent = access.get_from_cache(Names.C_HIRES_LATENT_SIMPLE)
+ access.restore_in_pipeline(Names.P_LATENT, latent)
+
+ elif larger and hires_mode == UI.HIRES_MODE_NORMAL:
+ parameters = [
+ hires_mode,
+ image_width,
+ image_height,
+ hires_scale,
+ upscale_factor,
+ new_image_width,
+ new_image_height,
+ hires_softness,
+ ]
+
+ any_changes = (
+ vae_changed or
+ upscaler_changed or
+ detail_processor_changed or
+ image_changed)
+
+ hires_latent_changed = access.changed_in_cache(Names.C_HIRES_LATENT_NORMAL, parameters)
+ if any_changes or hires_latent_changed:
+ need_upscaled = hires_softness < 0.999
+ need_bicubic = hires_softness > 0.001
+
+ if upscale_model is not None or detail_processor is not None:
+ if need_upscaled:
+ upscaled = image
+ (scaled_width, scaled_height) = (image_width, image_height)
+
+ if upscale_model is not None:
+ upscaled = NodeWrapper.scale_with_model.upscale(upscale_model, upscaled)[0]
+ (scaled_width, scaled_height) = get_image_size(upscaled)
+ if scaled_width != 4 * image_width or scaled_height != 4 * image_height:
+ print("Warning: high res upscaler should be a 4x ESRGAN model")
+
+ if detail_processor is not None:
+ upscaled = NodeWrapper.scale_with_model.upscale(detail_processor, upscaled)[0]
+ (detailed_width, detailed_height) = get_image_size(upscaled)
+ if detailed_width != scaled_width or detailed_height != scaled_height:
+ print("Warning: detail processor should be a 1x ESRGAN model")
+
+ upscaled = NodeWrapper.image_scale.upscale(upscaled, "bicubic", new_image_width,
+ new_image_height, "center")[0]
+ else:
+ upscaled = None
+
+ if need_bicubic:
+ bicubic = NodeWrapper.image_scale.upscale(image, "bicubic", new_image_width,
+ new_image_height, "center")[0]
+ else:
+ bicubic = None
+
+ if need_upscaled and need_bicubic and upscaled is not None and bicubic is not None:
+ softened = NodeWrapper.image_blend.blend_images(upscaled, bicubic, hires_softness, "normal")[0]
+ elif need_upscaled and upscaled is not None:
+ softened = upscaled
+ elif need_bicubic and bicubic is not None:
+ softened = bicubic
+ else:
+ softened = None
+
+ if softened is not None:
+ latent = NodeWrapper.vae_encoder.encode(vae_model, softened)[0]
+ else:
+ latent = None
+
+ cleanup_cache()
+ access.update_in_cache(Names.C_HIRES_LATENT_NORMAL, parameters, latent)
+ access.update_in_pipeline(Names.P_LATENT, latent)
+ else:
+ latent = access.get_from_cache(Names.C_HIRES_LATENT_NORMAL)
+ access.restore_in_pipeline(Names.P_LATENT, latent)
+
+ else:
+ latent = None
+ if hires_mode_changed:
+ cleanup_cache()
+ access.update_in_pipeline(Names.P_LATENT, latent)
+ else:
+ access.restore_in_pipeline(Names.P_LATENT, latent)
+
+ parameters = [
+ seed,
+ steps,
+ cfg,
+ sampler_name,
+ scheduler,
+ base_ratio,
+ hires_softness,
+ hires_denoise,
+ hires_detail_boost,
+ ]
+
+ latent_changed = access.changed_in_pipeline(Names.P_LATENT)
+
+ # DON'T DO THIS HERE (keep using the current latent variable): latent = access.get_from_pipeline(Names.P_LATENT)
+
+ any_changes = (
+ base_changed or
+ refiner_changed or
+ base_cond_changed or
+ refiner_cond_changed or
+ latent_changed)
+
+ hires_latent_changed = access.changed_in_cache(Names.C_HIRES_LATENT, parameters)
+ if any_changes or hires_latent_changed:
+ if hires_mode_enabled and latent is not None:
+ if "noise_mask" in latent:
+ latent = latent.clone()
+ latent.pop("noise_mask")
+
+ hires_steps = int((steps * 2 + 2) // 3)
+ latent = run_sampler(latent, refiner_model, hires_steps, hires_denoise, cfg_method=None,
+ dynamic_cfg=0.0, detail_boost=hires_detail_boost)
+ else:
+ latent = None
+
+ # NOTE: it's important NOT to call the cleanup cache function here, because it's unrelated to this cache
+ access.update_in_cache(Names.C_HIRES_LATENT, parameters, latent)
+ access.update_in_pipeline(Names.P_LATENT, latent)
+ else:
+ latent = access.get_from_cache(Names.C_HIRES_LATENT)
+ access.restore_in_pipeline(Names.P_LATENT, latent)
+
+ high_res_output = {
+ Names.F_LATENT_HIRES: latent,
+ }
+
+ if data is not None:
+ data[Names.S_HIRES_OUTPUT] = high_res_output
+
+ stage_output = {
+ Names.S_HIRES_OUTPUT: high_res_output,
+ }
+
+ return (data, stage_output,)
diff --git a/modules/stage_image_saving.py b/modules/stage_image_saving.py
new file mode 100644
index 0000000..56799d0
--- /dev/null
+++ b/modules/stage_image_saving.py
@@ -0,0 +1,236 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+import json
+import numpy as np
+import os
+
+from datetime import datetime
+from PIL import Image
+from PIL.PngImagePlugin import PngInfo
+
+import folder_paths
+
+from .data_utils import retrieve_parameter
+from .mb_pipeline import PipelineAccess
+from .names import Names
+from .ui import UI
+
+
+# --------------------------------------------------------------------------------
+# Stage: TemplateForNewStages
+# --------------------------------------------------------------------------------
+
+class SeargeStageImageSaving:
+ def __init__(self):
+ pass
+
+ def get_input(self, data, stage_data):
+ # if we still don't have stage data,
+ if stage_data is None and data is not None:
+ stage_data = {
+ PipelineAccess.NAME: retrieve_parameter(PipelineAccess.NAME, data),
+ }
+
+ return stage_data
+
+ def process(self, data, stage_input):
+ access = PipelineAccess(stage_input)
+
+ save_parameters_file = access.get_active_setting(UI.S_IMAGE_SAVING, UI.F_SAVE_PARAMETERS_FILE, False)
+ save_folder = access.get_active_setting(UI.S_IMAGE_SAVING, UI.F_SAVE_FOLDER, UI.SAVE_TO_OUTPUT_DATE)
+
+ save_generated_image = access.get_active_setting(UI.S_IMAGE_SAVING, UI.F_SAVE_GENERATED_IMAGE, True)
+ embed_wf_in_generated = access.get_active_setting(UI.S_IMAGE_SAVING, UI.F_EMBED_WORKFLOW_IN_GENERATED, True)
+ generated_image_name = access.get_active_setting(UI.S_IMAGE_SAVING, UI.F_GENERATED_IMAGE_NAME, "generated")
+
+ save_high_res_image = access.get_active_setting(UI.S_IMAGE_SAVING, UI.F_SAVE_HIGH_RES_IMAGE, True)
+ embed_wf_in_high_res = access.get_active_setting(UI.S_IMAGE_SAVING, UI.F_EMBED_WORKFLOW_IN_HIGH_RES, True)
+ high_res_image_name = access.get_active_setting(UI.S_IMAGE_SAVING, UI.F_HIGH_RES_IMAGE_NAME, "hires")
+
+ save_upscaled_image = access.get_active_setting(UI.S_IMAGE_SAVING, UI.F_SAVE_UPSCALED_IMAGE, True)
+ embed_wf_in_upscaled = access.get_active_setting(UI.S_IMAGE_SAVING, UI.F_EMBED_WORKFLOW_IN_UPSCALED, True)
+ upscaled_image_name = access.get_active_setting(UI.S_IMAGE_SAVING, UI.F_UPSCALED_IMAGE_NAME, "upscaled")
+
+ magic_box_hidden = access.get_from_pipeline(Names.S_MAGIC_BOX_HIDDEN)
+ hidden_prompt = retrieve_parameter(Names.F_MAGIC_BOX_PROMPT, magic_box_hidden)
+ hidden_extra_pnginfo = retrieve_parameter(Names.F_MAGIC_BOX_EXTRA_PNGINFO, magic_box_hidden)
+
+ # get the images from the data stream instead of the pipeline, this is intentional
+ vae_decoded_sampled = retrieve_parameter(Names.S_VAE_DECODED_SAMPLED, data)
+ generated_images = retrieve_parameter(Names.F_DECODED_SAMPLED_IMAGE, vae_decoded_sampled)
+ post_processed_images = retrieve_parameter(Names.F_SAMPLED_POST_PROCESSED, vae_decoded_sampled)
+
+ vae_decoded_hires = retrieve_parameter(Names.S_VAE_DECODED_HIRES, data)
+ high_res_images = retrieve_parameter(Names.F_DECODED_HIRES_IMAGE, vae_decoded_hires)
+ post_processed_hires = retrieve_parameter(Names.F_HIRES_POST_PROCESSED, vae_decoded_hires)
+
+ upscaling_output = retrieve_parameter(Names.S_UPSCALED, data)
+ upscaled_images = retrieve_parameter(Names.F_UPSCALED_IMAGE, upscaling_output)
+
+ save_to_input = save_folder == UI.SAVE_TO_INPUT
+ output_folder = folder_paths.get_input_directory() if save_to_input else folder_paths.get_output_directory()
+
+ if save_folder == UI.SAVE_TO_OUTPUT:
+ sub_folder = ""
+ elif save_folder == UI.SAVE_TO_OUTPUT_DATE:
+ sub_folder = "%date%"
+ elif save_folder == UI.SAVE_TO_OUTPUT_SEARGE_SDXL_DATE:
+ sub_folder = "Searge-SDXL-%date%"
+ elif save_folder == UI.SAVE_TO_INPUT:
+ sub_folder = ""
+ else:
+ return (data, None,)
+
+ sub_folder = sub_folder.replace("%date%", datetime.now().strftime("%Y-%m-%d"))
+ full_path = os.path.join(output_folder, sub_folder)
+
+ try:
+ files = [fn for fn in os.listdir(full_path) if os.path.isfile(os.path.join(full_path, fn))]
+ except FileNotFoundError:
+ os.makedirs(full_path, exist_ok=True)
+ files = []
+
+ num = 0
+
+ for filenum in [fn[0:5] for fn in files if fn[5] == '-' and fn[0:5].isnumeric()]:
+ test = int(filenum)
+ if test > num:
+ num = test
+
+ num = num + 1
+
+ generated_image_path = False
+ high_res_image_path = False
+ upscaled_image_path = False
+ parameter_file_path = False
+
+ anything_saved = False
+
+ if save_generated_image and generated_images is not None:
+ generated_image_name = generated_image_name.replace("\\", "_").replace("/", "_").replace(".", "_")
+ filename = f"{num:05}-{generated_image_name}"
+
+ generated_image_path = os.path.join(sub_folder, filename)
+ images_to_save = generated_images if post_processed_images is None else post_processed_images
+ self.save_images(images_to_save, full_path, filename, embed_wf_in_generated,
+ hidden_prompt, hidden_extra_pnginfo)
+
+ anything_saved = True
+
+ if save_high_res_image and high_res_images is not None:
+ high_res_image_name = high_res_image_name.replace("\\", "_").replace("/", "_").replace(".", "_")
+ filename = f"{num:05}-{high_res_image_name}"
+
+ high_res_image_path = os.path.join(sub_folder, filename)
+ images_to_save = high_res_images if post_processed_hires is None else post_processed_hires
+ self.save_images(images_to_save, full_path, filename, embed_wf_in_high_res,
+ hidden_prompt, hidden_extra_pnginfo)
+
+ anything_saved = True
+
+ if save_upscaled_image and upscaled_images is not None:
+ upscaled_image_name = upscaled_image_name.replace("\\", "_").replace("/", "_").replace(".", "_")
+ filename = f"{num:05}-{upscaled_image_name}"
+
+ upscaled_image_path = os.path.join(sub_folder, filename)
+ self.save_images(upscaled_images, full_path, filename, embed_wf_in_upscaled,
+ hidden_prompt, hidden_extra_pnginfo)
+
+ anything_saved = True
+
+ if save_parameters_file and anything_saved:
+ filename = f"{num:05}-param.txt"
+ parameter_file_path = os.path.join(sub_folder, filename)
+ full_filename = os.path.join(full_path, filename)
+
+ parameters = {
+ Names.S_MAGIC_BOX_VERSION: access.get_from_pipeline(Names.S_MAGIC_BOX_VERSION),
+
+ UI.S_PROMPTS: access.get_effective_structure(UI.S_PROMPTS),
+ UI.S_OPERATING_MODE: access.get_effective_structure(UI.S_OPERATING_MODE),
+ UI.S_GENERATION_PARAMETERS: access.get_effective_structure(UI.S_GENERATION_PARAMETERS),
+ UI.S_CONDITIONING_PARAMETERS: access.get_effective_structure(UI.S_CONDITIONING_PARAMETERS),
+ UI.S_ADVANCED_PARAMETERS: access.get_effective_structure(UI.S_ADVANCED_PARAMETERS),
+ UI.S_IMG2IMG_INPAINTING: access.get_effective_structure(UI.S_IMG2IMG_INPAINTING),
+ UI.S_HIGH_RESOLUTION: access.get_effective_structure(UI.S_HIGH_RESOLUTION),
+ UI.S_CHECKPOINTS: access.get_effective_structure(UI.S_CHECKPOINTS),
+ UI.S_UPSCALE_MODELS: access.get_effective_structure(UI.S_UPSCALE_MODELS), # TODO
+ UI.S_LORAS: access.get_effective_structure(UI.S_LORAS), # TODO
+ UI.S_PROMPT_STYLING: access.get_effective_structure(UI.S_PROMPT_STYLING), # TODO
+ UI.S_CUSTOM_PROMPTING: access.get_effective_structure(UI.S_CUSTOM_PROMPTING), # TODO
+ UI.S_CONDITION_MIXING: access.get_effective_structure(UI.S_CONDITION_MIXING), # TODO
+
+ "debug_information": {
+ Names.S_PROCESSED_PROMPTS: retrieve_parameter(Names.S_PROCESSED_PROMPTS, data, {"info": "missing"})
+ }
+ }
+
+ parameters_json = json.dumps(parameters, indent=4)
+ with open(full_filename, "w", encoding="utf-8") as f:
+ f.write(parameters_json)
+
+ saved_files = {
+ Names.F_GENERATED_IMAGE_PATH: generated_image_path,
+ Names.F_HIGH_RES_IMAGE_PATH: high_res_image_path,
+ Names.F_UPSCALED_IMAGE_PATH: upscaled_image_path,
+ Names.F_PARAMETER_FILE_PATH: parameter_file_path,
+ }
+
+ if data is not None:
+ data[Names.S_SAVED_FILES] = saved_files
+
+ stage_output = {
+ Names.S_SAVED_FILES: saved_files,
+ }
+
+ return (data, stage_output,)
+
+ @staticmethod
+ def save_images(images, full_path, filename, embed_metadata, prompt, extra_pnginfo):
+ if images is None:
+ print(f"Warning: trying to save {filename}, but no images were provided")
+ return
+
+ counter = 1
+ for image in images:
+ i = 255. * image.cpu().numpy()
+ img = Image.fromarray(np.clip(i, 0, 255).astype(np.uint8))
+ metadata = None
+ if embed_metadata:
+ metadata = PngInfo()
+ if prompt is not None:
+ metadata.add_text("prompt", json.dumps(prompt))
+ if extra_pnginfo is not None:
+ for x in extra_pnginfo:
+ metadata.add_text(x, json.dumps(extra_pnginfo[x]))
+
+ file = f"{filename}-{counter}.png" if counter > 1 else f"{filename}.png"
+ counter = counter + 1
+
+ img.save(os.path.join(full_path, file), pnginfo=metadata, compress_level=4)
diff --git a/modules/stage_latent_detailer.py b/modules/stage_latent_detailer.py
new file mode 100644
index 0000000..9ffe4f3
--- /dev/null
+++ b/modules/stage_latent_detailer.py
@@ -0,0 +1,147 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from comfy.sample import prepare_mask
+
+from .data_utils import retrieve_parameter
+from .mb_pipeline import PipelineAccess
+from .names import Names
+from .node_wrapper import NodeWrapper
+from .ui import UI
+
+
+# --------------------------------------------------------------------------------
+# Stage: Latent Detailer
+# --------------------------------------------------------------------------------
+
+class SeargeStageLatentDetailer:
+ def __init__(self):
+ pass
+
+ def get_input(self, data, stage_data):
+ # if we still don't have stage data,
+ if stage_data is None and data is not None:
+ stage_data = {
+ PipelineAccess.NAME: retrieve_parameter(PipelineAccess.NAME, data),
+ }
+
+ return stage_data
+
+ def process(self, data, stage_input):
+ access = PipelineAccess(stage_input)
+
+ base_changed = access.changed_in_pipeline(Names.P_BASE_MODEL)
+ base_model = access.get_from_pipeline(Names.P_BASE_MODEL)
+
+ base_cond_changed = access.changed_in_pipeline(Names.P_BASE_CONDITIONING)
+ base_cond = access.get_from_pipeline(Names.P_BASE_CONDITIONING)
+
+ base_positive = retrieve_parameter(Names.F_BASE_POSITIVE, base_cond)
+ base_negative = retrieve_parameter(Names.F_BASE_NEGATIVE, base_cond)
+
+ latent_changed = access.changed_in_pipeline(Names.P_LATENT)
+ latent = access.get_from_pipeline(Names.P_LATENT)
+
+ seed = access.get_active_setting(UI.S_GENERATION_PARAMETERS, UI.F_SEED, 4815162342)
+ cfg = access.get_active_setting(UI.S_GENERATION_PARAMETERS, UI.F_CFG, 7.0)
+
+ latent_detailer = access.get_active_setting(UI.S_ADVANCED_PARAMETERS, UI.F_LATENT_DETAILER, UI.NONE)
+
+ parameters = [
+ seed,
+ cfg,
+ latent_detailer,
+ ]
+
+ any_changes = (
+ base_changed or
+ base_cond_changed or
+ latent_changed)
+
+ sampled_changed = access.changed_in_cache(Names.C_SAMPLED_DETAILER, parameters)
+ if any_changes or sampled_changed:
+ latent_original = latent
+ if latent_detailer == UI.DETAILER_NORMAL:
+ latent = self.detailer(latent, 5, "nearest-exact", base_model, base_positive, base_negative, seed, cfg)
+ elif latent_detailer == UI.DETAILER_SOFT:
+ latent = self.detailer(latent, 5, "bicubic", base_model, base_positive, base_negative, seed, cfg)
+ elif latent_detailer == UI.DETAILER_BLURRY:
+ latent = self.detailer(latent, 10, "nearest-exact", base_model, base_positive, base_negative, seed, cfg)
+ elif latent_detailer == UI.DETAILER_SOFT_BLURRY:
+ latent = self.detailer(latent, 10, "bicubic", base_model, base_positive, base_negative, seed, cfg)
+
+ if "noise_mask" in latent_original and "samples" in latent_original and "samples" in latent:
+ old_samples = latent_original["samples"]
+ new_samples = latent["samples"]
+
+ noise_mask = latent_original["noise_mask"]
+ noise_mask = prepare_mask(noise_mask, old_samples.shape, "cpu")
+
+ latent["samples"] = new_samples * noise_mask + old_samples * (1.0 - noise_mask)
+
+ access.update_in_cache(Names.C_SAMPLED_DETAILER, parameters, latent)
+ access.update_in_pipeline(Names.P_LATENT, latent)
+ else:
+ latent = access.get_from_cache(Names.C_SAMPLED_DETAILER)
+ access.restore_in_pipeline(Names.P_LATENT, latent)
+
+ detailed_output = {
+ Names.F_DETAILED_SAMPLED: latent,
+ }
+
+ if data is not None:
+ data[Names.S_LATENT_DETAILED] = detailed_output
+
+ stage_output = {
+ Names.S_LATENT_DETAILED: detailed_output,
+ }
+
+ return (data, stage_output,)
+
+ def detailer(self, latent, percent, method, base_model, base_positive, base_negative, seed, cfg):
+ sampler = NodeWrapper.common_sampler
+ scaler = NodeWrapper.latent_upscale_by
+
+ sampler_name = "dpmpp_2m"
+ scheduler = "karras"
+
+ latent = scaler.upscale(latent, method, 2.0)[0]
+
+ latent = sampler(base_model, seed, 100, cfg, sampler_name, scheduler,
+ base_positive, base_negative, latent, denoise=1.0, disable_noise=False,
+ start_step=int(100 - percent * 2), last_step=int(100 - percent),
+ force_full_denoise=False)
+
+ latent = scaler.upscale(latent, method, 0.5)[0]
+
+ latent = sampler(base_model, seed, 100, cfg, sampler_name, scheduler,
+ base_positive, base_negative, latent, denoise=1.0, disable_noise=True,
+ start_step=int(100 - percent * 2), last_step=100,
+ force_full_denoise=True)
+
+ return latent
diff --git a/modules/stage_latent_inputs.py b/modules/stage_latent_inputs.py
new file mode 100644
index 0000000..f284eb7
--- /dev/null
+++ b/modules/stage_latent_inputs.py
@@ -0,0 +1,206 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from ._experimental import gaussian_latent_noise
+from .data_utils import retrieve_parameter
+from .mb_pipeline import PipelineAccess
+from .names import Names
+from .node_wrapper import NodeWrapper
+from .ui import UI
+from .utils import get_image_size
+from .utils import get_mask_size
+
+
+# --------------------------------------------------------------------------------
+# Stage: Latent Inputs
+# --------------------------------------------------------------------------------
+
+class SeargeStageLatentInputs:
+ def __init__(self):
+ pass
+
+ def get_input(self, data, stage_data):
+ # if we still don't have stage data,
+ if stage_data is None and data is not None:
+ stage_data = {
+ PipelineAccess.NAME: retrieve_parameter(PipelineAccess.NAME, data),
+ }
+
+ return stage_data
+
+ def process(self, data, stage_input):
+ access = PipelineAccess(stage_input)
+
+ vae_changed = access.changed_in_pipeline(Names.P_VAE_MODEL)
+ vae_model = access.get_from_pipeline(Names.P_VAE_MODEL)
+
+ image_width = access.get_active_setting(UI.S_GENERATION_PARAMETERS, UI.F_IMAGE_WIDTH, 1024)
+ image_height = access.get_active_setting(UI.S_GENERATION_PARAMETERS, UI.F_IMAGE_HEIGHT, 1024)
+
+ seed = access.get_active_setting(UI.S_GENERATION_PARAMETERS, UI.F_SEED, 4815162342)
+
+ workflow_mode = access.get_active_setting(UI.S_OPERATING_MODE, UI.F_WORKFLOW_MODE, UI.WF_MODE_TEXT_TO_IMAGE)
+
+ image_changed = access.changed_in_pipeline(Names.P_IMAGE)
+ mask_changed = access.changed_in_pipeline(Names.P_MASK)
+
+ image = access.get_from_pipeline(Names.P_IMAGE)
+ mask = access.get_from_pipeline(Names.P_MASK)
+
+ batch_size = access.get_active_setting(UI.S_OPERATING_MODE, UI.F_BATCH_SIZE, 1)
+
+ precondition_mode = access.get_active_setting(UI.S_CONDITIONING_PARAMETERS, UI.F_PRECONDITION_MODE, UI.NONE)
+ precondition_strength = access.get_active_setting(UI.S_CONDITIONING_PARAMETERS, UI.F_PRECONDITION_STRENGTH, 0.1)
+
+ latent = None
+ if workflow_mode == UI.WF_MODE_IMAGE_TO_IMAGE or workflow_mode == UI.WF_MODE_IN_PAINTING:
+ parameters = [
+ image_width,
+ image_height,
+ batch_size,
+ workflow_mode,
+ ]
+
+ latent_changed = access.changed_in_cache(Names.C_LATENT_FROM_IMAGE, parameters)
+ if latent_changed or image_changed or vae_changed:
+ (width, height) = get_image_size(image)
+
+ if width != image_width or height != image_height:
+ image = NodeWrapper.image_scale.upscale(image, "bicubic", image_width, image_height, "center")[0]
+ access.update_in_pipeline(Names.P_IMAGE, image)
+
+ latent = NodeWrapper.vae_encoder.encode(vae_model, image)[0]
+
+ if batch_size > 1:
+ # NOTE: only repeat with batch size here if we are not in inpainting mode (optimization)
+ if workflow_mode == UI.WF_MODE_IMAGE_TO_IMAGE:
+ latent = NodeWrapper.latent_repeater.repeat(latent, batch_size)[0]
+
+ image = image.repeat(batch_size, 1, 1, 1)
+ access.update_in_pipeline(Names.P_IMAGE, image)
+
+ access.remove_from_cache(Names.C_EMPTY_LATENT)
+ access.remove_from_cache(Names.C_IMAGE_MASK)
+ access.remove_from_cache(Names.C_LATENT_WITH_MASK)
+ access.update_in_cache(Names.C_LATENT_FROM_IMAGE, parameters, (latent, image))
+ access.update_in_pipeline(Names.P_LATENT, latent)
+ else:
+ (latent, image) = access.get_from_cache(Names.C_LATENT_FROM_IMAGE)
+ access.restore_in_pipeline(Names.P_LATENT, latent)
+ access.restore_in_pipeline(Names.P_IMAGE, image)
+
+ if workflow_mode == UI.WF_MODE_IN_PAINTING:
+ parameters = [
+ image_width,
+ image_height,
+ batch_size,
+ workflow_mode,
+ ]
+
+ image_mask_changed = access.changed_in_cache(Names.C_IMAGE_MASK, parameters)
+ if mask_changed or image_mask_changed:
+ (width, height) = get_mask_size(mask)
+
+ if width != image_width or height != image_height:
+ image_scale = NodeWrapper.image_scale
+
+ mask_image = NodeWrapper.mask_to_image.mask_to_image(mask)[0]
+ mask_image = image_scale.upscale(mask_image, "bicubic", image_width, image_height, "center")[0]
+
+ mask = NodeWrapper.image_to_mask.image_to_mask(mask_image, "green")[0]
+
+ access.remove_from_cache(Names.C_EMPTY_LATENT)
+ access.remove_from_cache(Names.C_LATENT_WITH_MASK)
+ access.update_in_cache(Names.C_IMAGE_MASK, parameters, mask)
+ access.update_in_pipeline(Names.P_MASK, mask)
+ else:
+ mask = access.get_from_cache(Names.C_IMAGE_MASK)
+ access.restore_in_pipeline(Names.P_MASK, mask)
+
+ latent_changed = access.changed_in_pipeline(Names.P_LATENT)
+ mask_changed = access.changed_in_pipeline(Names.P_MASK)
+ if latent_changed or mask_changed:
+ latent = access.get_from_pipeline(Names.P_LATENT)
+
+ # in case we are using an older cached latent that was already repeated with batch size, take only first
+ latent = NodeWrapper.latent_selector.frombatch(latent, 0, 1)[0]
+
+ latent = NodeWrapper.set_latent_mask.set_mask(latent, mask)[0]
+
+ # repeat with batch size, will also repeat the mask in addition to the latent
+ if batch_size > 1:
+ latent = NodeWrapper.latent_repeater.repeat(latent, batch_size)[0]
+
+ access.remove_from_cache(Names.C_EMPTY_LATENT)
+ access.update_in_cache(Names.C_LATENT_WITH_MASK, parameters, latent)
+ access.update_in_pipeline(Names.P_LATENT, latent)
+ else:
+ latent = access.get_from_cache(Names.C_LATENT_WITH_MASK)
+ access.restore_in_pipeline(Names.P_LATENT, latent)
+
+ if workflow_mode == UI.WF_MODE_TEXT_TO_IMAGE:
+ parameters = [
+ seed,
+ image_width,
+ image_height,
+ batch_size,
+ precondition_mode,
+ precondition_strength,
+ ]
+
+ empty_latent_changed = access.changed_in_cache(Names.C_EMPTY_LATENT, parameters)
+ if empty_latent_changed:
+ if precondition_mode == UI.NONE or precondition_strength < 0.001:
+ latent = NodeWrapper.empty_latent.generate(image_width, image_height, batch_size)[0]
+ elif precondition_mode == UI.PRECONDITION_MODE_GAUSSIAN:
+ latent = gaussian_latent_noise(image_width // 8, image_height // 8, seed, precondition_strength,
+ batch_size)
+ else:
+ latent = NodeWrapper.empty_latent.generate(image_width, image_height, batch_size)[0]
+
+ access.remove_from_cache(Names.C_LATENT_FROM_IMAGE)
+ access.remove_from_cache(Names.C_IMAGE_MASK)
+ access.remove_from_cache(Names.C_LATENT_WITH_MASK)
+ access.update_in_cache(Names.C_EMPTY_LATENT, parameters, latent)
+ access.update_in_pipeline(Names.P_LATENT, latent)
+ else:
+ latent = access.get_from_cache(Names.C_EMPTY_LATENT)
+ access.restore_in_pipeline(Names.P_LATENT, latent)
+
+ latent_input = {
+ Names.F_LATENT_IMAGE: latent,
+ }
+
+ if data is not None:
+ data[Names.S_LATENT_INPUTS] = latent_input
+
+ stage_output = {
+ Names.S_LATENT_INPUTS: latent_input,
+ }
+
+ return (data, stage_output,)
diff --git a/modules/stage_load_checkpoints.py b/modules/stage_load_checkpoints.py
new file mode 100644
index 0000000..6d77bd3
--- /dev/null
+++ b/modules/stage_load_checkpoints.py
@@ -0,0 +1,330 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .data_utils import retrieve_parameter
+from .mb_pipeline import PipelineAccess
+from .names import Names
+from .node_wrapper import NodeWrapper
+from .ui import UI
+
+
+# --------------------------------------------------------------------------------
+# Stage: Load Checkpoints
+# --------------------------------------------------------------------------------
+
+class SeargeStageLoadCheckpoints:
+ def __init__(self):
+ pass
+
+ def get_input(self, data, stage_data):
+ # if we still don't have stage data,
+ if stage_data is None and data is not None:
+ stage_data = {
+ PipelineAccess.NAME: retrieve_parameter(PipelineAccess.NAME, data),
+ }
+
+ return stage_data
+
+ def process(self, data, stage_input):
+ access = PipelineAccess(stage_input)
+
+ # TODO: this stage will always execute, even if the pipeline is disabled and in that case unload all models
+ if not access.is_pipeline_enabled():
+ pass
+
+ base_changed = access.setting_changed(UI.S_CHECKPOINTS, UI.F_BASE_CHECKPOINT)
+ if base_changed:
+ base_name = access.get_active_setting(UI.S_CHECKPOINTS, UI.F_BASE_CHECKPOINT)
+
+ base_checkpoint = NodeWrapper.checkpoint_loader.load_checkpoint(base_name)
+
+ access.update_in_cache(Names.C_BASE_CHECKPOINT, [base_name], base_checkpoint)
+ else:
+ base_checkpoint = access.get_from_cache(Names.C_BASE_CHECKPOINT)
+
+ base_model = base_checkpoint[0]
+ base_clip = base_checkpoint[1]
+ base_vae = base_checkpoint[2]
+
+ if base_changed:
+ access.update_in_pipeline(Names.P_BASE_MODEL, base_model)
+ access.update_in_pipeline(Names.P_BASE_CLIP, base_clip)
+ access.update_in_pipeline(Names.P_BASE_VAE, base_vae)
+ else:
+ access.restore_in_pipeline(Names.P_BASE_MODEL, base_model)
+ access.restore_in_pipeline(Names.P_BASE_CLIP, base_clip)
+ access.restore_in_pipeline(Names.P_BASE_VAE, base_vae)
+
+ refiner_changed = access.setting_changed(UI.S_CHECKPOINTS, UI.F_REFINER_CHECKPOINT)
+ if refiner_changed:
+ refiner_name = access.get_active_setting(UI.S_CHECKPOINTS, UI.F_REFINER_CHECKPOINT, UI.NONE)
+
+ if refiner_name == UI.NONE:
+ refiner_checkpoint = (None, None, None,)
+ else:
+ refiner_checkpoint = NodeWrapper.checkpoint_loader.load_checkpoint(refiner_name)
+
+ access.update_in_cache(Names.C_REFINER_CHECKPOINT, [refiner_name], refiner_checkpoint)
+ else:
+ refiner_checkpoint = access.get_from_cache(Names.C_REFINER_CHECKPOINT)
+
+ refiner_model = refiner_checkpoint[0]
+ refiner_clip = refiner_checkpoint[1]
+ refiner_vae = refiner_checkpoint[2]
+
+ if refiner_changed:
+ access.update_in_pipeline(Names.P_REFINER_MODEL, refiner_model)
+ access.update_in_pipeline(Names.P_REFINER_CLIP, refiner_clip)
+ access.update_in_pipeline(Names.P_REFINER_VAE, refiner_vae)
+ else:
+ access.restore_in_pipeline(Names.P_REFINER_MODEL, refiner_model)
+ access.restore_in_pipeline(Names.P_REFINER_CLIP, refiner_clip)
+ access.restore_in_pipeline(Names.P_REFINER_VAE, refiner_vae)
+
+ vae_changed = access.setting_changed(UI.S_CHECKPOINTS, UI.F_VAE_CHECKPOINT)
+ if vae_changed:
+ vae_name = access.get_active_setting(UI.S_CHECKPOINTS, UI.F_VAE_CHECKPOINT, UI.VAE_FROM_BASE_MODEL)
+
+ if vae_name == UI.VAE_FROM_REFINER_MODEL:
+ if refiner_vae is not None:
+ vae_checkpoint = refiner_vae
+ else:
+ vae_checkpoint = base_vae
+
+ elif vae_name == UI.VAE_FROM_BASE_MODEL:
+ vae_checkpoint = base_vae
+
+ else:
+ vae_checkpoint = NodeWrapper.vae_loader.load_vae(vae_name)[0]
+
+ access.update_in_cache(Names.C_VAE_CHECKPOINT, [vae_name], vae_checkpoint)
+ access.update_in_pipeline(Names.P_VAE_MODEL, vae_checkpoint)
+ else:
+ vae_checkpoint = access.get_from_cache(Names.C_VAE_CHECKPOINT)
+ access.restore_in_pipeline(Names.P_VAE_MODEL, vae_checkpoint)
+
+ vae_model = vae_checkpoint
+
+ hires_upscaler_changed = access.setting_changed(UI.S_UPSCALE_MODELS, UI.F_HIGH_RES_UPSCALER)
+ if hires_upscaler_changed:
+ hires_upscaler_name = access.get_active_setting(UI.S_UPSCALE_MODELS, UI.F_HIGH_RES_UPSCALER, UI.NONE)
+
+ if hires_upscaler_name != UI.NONE:
+ hires_upscaler_model = NodeWrapper.upscale_loader.load_model(hires_upscaler_name)[0]
+ else:
+ hires_upscaler_model = None
+
+ access.update_in_cache(Names.C_HIRES_UPSCALE_MODEL, [hires_upscaler_name], hires_upscaler_model)
+ access.update_in_pipeline(Names.P_HIRES_UPSCALER, hires_upscaler_model)
+ else:
+ hires_upscaler_model = access.get_from_cache(Names.C_HIRES_UPSCALE_MODEL)
+ access.restore_in_pipeline(Names.P_HIRES_UPSCALER, hires_upscaler_model)
+
+ hires_upscaler = hires_upscaler_model
+
+ primary_upscaler_changed = access.setting_changed(UI.S_UPSCALE_MODELS, UI.F_PRIMARY_UPSCALER)
+ if primary_upscaler_changed:
+ primary_upscaler_name = access.get_active_setting(UI.S_UPSCALE_MODELS, UI.F_PRIMARY_UPSCALER, UI.NONE)
+
+ if primary_upscaler_name != UI.NONE:
+ primary_upscaler_model = NodeWrapper.upscale_loader.load_model(primary_upscaler_name)[0]
+ else:
+ primary_upscaler_model = None
+
+ access.update_in_cache(Names.C_PRIMARY_UPSCALE_MODEL, [primary_upscaler_name], primary_upscaler_model)
+ access.update_in_pipeline(Names.P_PRIMARY_UPSCALER, primary_upscaler_model)
+ else:
+ primary_upscaler_model = access.get_from_cache(Names.C_PRIMARY_UPSCALE_MODEL)
+ access.restore_in_pipeline(Names.P_PRIMARY_UPSCALER, primary_upscaler_model)
+
+ primary_upscaler = primary_upscaler_model
+
+ secondary_upscaler_changed = access.setting_changed(UI.S_UPSCALE_MODELS, UI.F_SECONDARY_UPSCALER)
+ if secondary_upscaler_changed:
+ secondary_upscaler_name = access.get_active_setting(UI.S_UPSCALE_MODELS, UI.F_SECONDARY_UPSCALER, UI.NONE)
+
+ if secondary_upscaler_name != UI.NONE:
+ secondary_upscaler_model = NodeWrapper.upscale_loader.load_model(secondary_upscaler_name)[0]
+ else:
+ secondary_upscaler_model = None
+
+ access.update_in_cache(Names.C_SECONDARY_UPSCALE_MODEL, [secondary_upscaler_name], secondary_upscaler_model)
+ access.update_in_pipeline(Names.P_SECONDARY_UPSCALER, secondary_upscaler_model)
+ else:
+ secondary_upscaler_model = access.get_from_cache(Names.C_SECONDARY_UPSCALE_MODEL)
+ access.restore_in_pipeline(Names.P_SECONDARY_UPSCALER, secondary_upscaler_model)
+
+ secondary_upscaler = secondary_upscaler_model
+
+ detail_processor_changed = access.setting_changed(UI.S_UPSCALE_MODELS, UI.F_DETAIL_PROCESSOR)
+ if detail_processor_changed:
+ detail_processor_name = access.get_active_setting(UI.S_UPSCALE_MODELS, UI.F_DETAIL_PROCESSOR, UI.NONE)
+
+ if detail_processor_name != UI.NONE:
+ detail_processor_model = NodeWrapper.upscale_loader.load_model(detail_processor_name)[0]
+ else:
+ detail_processor_model = None
+
+ access.update_in_cache(Names.C_DETAIL_PROCESSOR_MODEL, [detail_processor_name], detail_processor_model)
+ access.update_in_pipeline(Names.P_DETAIL_PROCESSOR, detail_processor_model)
+ else:
+ detail_processor_model = access.get_from_cache(Names.C_DETAIL_PROCESSOR_MODEL)
+ access.restore_in_pipeline(Names.P_DETAIL_PROCESSOR, detail_processor_model)
+
+ detail_processor = detail_processor_model
+
+ clip_vision_checkpoint_changed = access.setting_changed(UI.S_CONTROLNET_MODELS, UI.F_CLIP_VISION_CHECKPOINT)
+ if clip_vision_checkpoint_changed:
+ clip_vision_checkpoint_name = access.get_active_setting(UI.S_CONTROLNET_MODELS, UI.F_CLIP_VISION_CHECKPOINT, UI.NONE)
+
+ if clip_vision_checkpoint_name != UI.NONE:
+ clip_vision_model = NodeWrapper.clipvision_loader.load_clip(clip_vision_checkpoint_name)[0]
+ else:
+ clip_vision_model = None
+
+ access.update_in_cache(Names.C_CLIP_VISION_MODEL, [clip_vision_checkpoint_name], clip_vision_model)
+ access.update_in_pipeline(Names.P_CLIP_VISION_MODEL, clip_vision_model)
+ else:
+ clip_vision_model = access.get_from_cache(Names.C_CLIP_VISION_MODEL)
+ access.restore_in_pipeline(Names.P_CLIP_VISION_MODEL, clip_vision_model)
+
+ clip_vision = clip_vision_model
+
+ canny_checkpoint_changed = access.setting_changed(UI.S_CONTROLNET_MODELS, UI.F_CANNY_CHECKPOINT)
+ if canny_checkpoint_changed:
+ canny_checkpoint_name = access.get_active_setting(UI.S_CONTROLNET_MODELS, UI.F_CANNY_CHECKPOINT, UI.NONE)
+
+ if canny_checkpoint_name != UI.NONE:
+ canny_model = NodeWrapper.controlnet_loader.load_controlnet(canny_checkpoint_name)[0]
+ else:
+ canny_model = None
+
+ access.update_in_cache(Names.C_CN_CANNY_MODEL, [canny_checkpoint_name], canny_model)
+ access.update_in_pipeline(Names.P_CN_CANNY_MODEL, canny_model)
+ else:
+ canny_model = access.get_from_cache(Names.C_CN_CANNY_MODEL)
+ access.restore_in_pipeline(Names.P_CN_CANNY_MODEL, canny_model)
+
+ cn_canny = canny_model
+
+ depth_checkpoint_changed = access.setting_changed(UI.S_CONTROLNET_MODELS, UI.F_DEPTH_CHECKPOINT)
+ if depth_checkpoint_changed:
+ depth_checkpoint_name = access.get_active_setting(UI.S_CONTROLNET_MODELS, UI.F_DEPTH_CHECKPOINT, UI.NONE)
+
+ if depth_checkpoint_name != UI.NONE:
+ depth_model = NodeWrapper.controlnet_loader.load_controlnet(depth_checkpoint_name)[0]
+ else:
+ depth_model = None
+
+ access.update_in_cache(Names.C_CN_DEPTH_MODEL, [depth_checkpoint_name], depth_model)
+ access.update_in_pipeline(Names.P_CN_DEPTH_MODEL, depth_model)
+ else:
+ depth_model = access.get_from_cache(Names.C_CN_DEPTH_MODEL)
+ access.restore_in_pipeline(Names.P_CN_DEPTH_MODEL, depth_model)
+
+ cn_depth = depth_model
+
+ recolor_checkpoint_changed = access.setting_changed(UI.S_CONTROLNET_MODELS, UI.F_RECOLOR_CHECKPOINT)
+ if recolor_checkpoint_changed:
+ recolor_checkpoint_name = access.get_active_setting(UI.S_CONTROLNET_MODELS, UI.F_RECOLOR_CHECKPOINT, UI.NONE)
+
+ if recolor_checkpoint_name != UI.NONE:
+ recolor_model = NodeWrapper.controlnet_loader.load_controlnet(recolor_checkpoint_name)[0]
+ else:
+ recolor_model = None
+
+ access.update_in_cache(Names.C_CN_RECOLOR_MODEL, [recolor_checkpoint_name], recolor_model)
+ access.update_in_pipeline(Names.P_CN_RECOLOR_MODEL, recolor_model)
+ else:
+ recolor_model = access.get_from_cache(Names.C_CN_RECOLOR_MODEL)
+ access.restore_in_pipeline(Names.P_CN_RECOLOR_MODEL, recolor_model)
+
+ cn_recolor = recolor_model
+
+ sketch_checkpoint_changed = access.setting_changed(UI.S_CONTROLNET_MODELS, UI.F_SKETCH_CHECKPOINT)
+ if sketch_checkpoint_changed:
+ sketch_checkpoint_name = access.get_active_setting(UI.S_CONTROLNET_MODELS, UI.F_SKETCH_CHECKPOINT, UI.NONE)
+
+ if sketch_checkpoint_name != UI.NONE:
+ sketch_model = NodeWrapper.controlnet_loader.load_controlnet(sketch_checkpoint_name)[0]
+ else:
+ sketch_model = None
+
+ access.update_in_cache(Names.C_CN_SKETCH_MODEL, [sketch_checkpoint_name], sketch_model)
+ access.update_in_pipeline(Names.P_CN_SKETCH_MODEL, sketch_model)
+ else:
+ sketch_model = access.get_from_cache(Names.C_CN_SKETCH_MODEL)
+ access.restore_in_pipeline(Names.P_CN_SKETCH_MODEL, sketch_model)
+
+ cn_sketch = sketch_model
+
+ custom_checkpoint_changed = access.setting_changed(UI.S_CONTROLNET_MODELS, UI.F_CUSTOM_CHECKPOINT)
+ if custom_checkpoint_changed:
+ custom_checkpoint_name = access.get_active_setting(UI.S_CONTROLNET_MODELS, UI.F_CUSTOM_CHECKPOINT, UI.NONE)
+
+ if custom_checkpoint_name != UI.NONE:
+ custom_model = NodeWrapper.controlnet_loader.load_controlnet(custom_checkpoint_name)[0]
+ else:
+ custom_model = None
+
+ access.update_in_cache(Names.C_CN_CUSTOM_MODEL, [custom_checkpoint_name], custom_model)
+ access.update_in_pipeline(Names.P_CN_CUSTOM_MODEL, custom_model)
+ else:
+ custom_model = access.get_from_cache(Names.C_CN_CUSTOM_MODEL)
+ access.restore_in_pipeline(Names.P_CN_CUSTOM_MODEL, custom_model)
+
+ cn_custom = custom_model
+
+ loaded_models = {
+ Names.F_BASE_MODEL: base_model,
+ Names.F_BASE_CLIP: base_clip,
+ Names.F_BASE_VAE: base_vae,
+ Names.F_REFINER_MODEL: refiner_model,
+ Names.F_REFINER_CLIP: refiner_clip,
+ Names.F_REFINER_VAE: refiner_vae,
+ Names.F_VAE_MODEL: vae_model,
+ Names.F_HIRES_UPSCALER: hires_upscaler,
+ Names.F_PRIMARY_UPSCALER: primary_upscaler,
+ Names.F_SECONDARY_UPSCALER: secondary_upscaler,
+ Names.F_DETAIL_PROCESSOR: detail_processor,
+ Names.F_CLIP_VISION_MODEL: clip_vision,
+ Names.F_CN_CANNY_MODEL: cn_canny,
+ Names.F_CN_DEPTH_MODEL: cn_depth,
+ Names.F_CN_RECOLOR_MODEL: cn_recolor,
+ Names.F_CN_SKETCH_MODEL: cn_sketch,
+ Names.F_CN_CUSTOM_MODEL: cn_custom,
+ }
+
+ if data is not None:
+ data[Names.S_LOADED_MODELS] = loaded_models
+
+ stage_output = {
+ Names.S_LOADED_MODELS: loaded_models,
+ }
+
+ return (data, stage_output,)
diff --git a/modules/stage_pre_processing.py b/modules/stage_pre_processing.py
new file mode 100644
index 0000000..a4e89df
--- /dev/null
+++ b/modules/stage_pre_processing.py
@@ -0,0 +1,196 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .data_utils import retrieve_input
+from .data_utils import retrieve_parameter
+from .mb_pipeline import PipelineAccess
+from .names import Names
+from .node_wrapper import NodeWrapper
+from .ui import UI
+from .utils import get_image_size
+
+
+# --------------------------------------------------------------------------------
+# Stage: Pre Process Data
+# --------------------------------------------------------------------------------
+
+class SeargePreProcessData:
+ def __init__(self):
+ self.UI_OUTPUT_KEYS = None
+ self.STAGE_OUTPUT_KEYS = None
+
+ def get_input(self, data, stage_data):
+ # if we still don't have stage data,
+ if stage_data is None and data is not None:
+ stage_data = {
+ PipelineAccess.NAME: retrieve_parameter(PipelineAccess.NAME, data),
+ UI.S_IMAGE_INPUTS: retrieve_parameter(UI.S_IMAGE_INPUTS, data),
+ }
+
+ return stage_data
+
+ def process(self, data, stage_input):
+ access = PipelineAccess(stage_input)
+
+ denoise = access.get_active_setting(UI.S_IMG2IMG_INPAINTING, UI.F_DENOISE, 0.5)
+ workflow_mode = access.get_active_setting(UI.S_OPERATING_MODE, UI.F_WORKFLOW_MODE, UI.WF_MODE_TEXT_TO_IMAGE)
+
+ if denoise is not None and workflow_mode == UI.WF_MODE_TEXT_TO_IMAGE:
+ denoise = 1.0
+ access.override_setting(UI.S_IMG2IMG_INPAINTING, UI.F_DENOISE, denoise)
+
+ size_preset = access.get_active_setting(UI.S_GENERATION_PARAMETERS, UI.F_IMAGE_SIZE_PRESET, UI.USE_SETTINGS)
+
+ need_image = (
+ workflow_mode == UI.WF_MODE_IMAGE_TO_IMAGE or
+ workflow_mode == UI.WF_MODE_IN_PAINTING or
+ size_preset == UI.RESOLUTION_FROM_IMAGE
+ )
+
+ if need_image:
+ image_inputs = retrieve_input(UI.S_IMAGE_INPUTS, data, stage_input)
+ image_changed = retrieve_parameter(UI.F_SOURCE_IMAGE_CHANGED, image_inputs, False)
+ image_inputs[UI.F_SOURCE_IMAGE_CHANGED] = False
+
+ if image_changed:
+ image = retrieve_parameter(UI.F_SOURCE_IMAGE, image_inputs)
+
+ access.update_in_cache(Names.C_SOURCE_IMAGE, [], image)
+ access.update_in_pipeline(Names.P_IMAGE, image)
+ else:
+ image = access.get_from_cache(Names.C_SOURCE_IMAGE)
+ access.restore_in_pipeline(Names.P_IMAGE, image)
+
+ if size_preset == UI.RESOLUTION_1024x1024:
+ (image_width, image_height) = (1024, 1024)
+ elif size_preset == UI.RESOLUTION_1152x896:
+ (image_width, image_height) = (1152, 896)
+ elif size_preset == UI.RESOLUTION_1216x832:
+ (image_width, image_height) = (1216, 832)
+ elif size_preset == UI.RESOLUTION_1344x768:
+ (image_width, image_height) = (1344, 768)
+ elif size_preset == UI.RESOLUTION_1536x640:
+ (image_width, image_height) = (1536, 640)
+ elif size_preset == UI.RESOLUTION_896x1152:
+ (image_width, image_height) = (896, 1152)
+ elif size_preset == UI.RESOLUTION_832x1216:
+ (image_width, image_height) = (832, 1216)
+ elif size_preset == UI.RESOLUTION_768x1344:
+ (image_width, image_height) = (768, 1344)
+ elif size_preset == UI.RESOLUTION_640x1536:
+ (image_width, image_height) = (640, 1536)
+ else:
+ (image_width, image_height) = (
+ access.get_active_setting(UI.S_GENERATION_PARAMETERS, UI.F_IMAGE_WIDTH, 1024),
+ access.get_active_setting(UI.S_GENERATION_PARAMETERS, UI.F_IMAGE_HEIGHT, 1024),
+ )
+
+ image_changed = access.changed_in_pipeline(Names.P_IMAGE)
+ changed_in_cache = access.changed_in_cache(Names.C_IMAGE_SIZE, [size_preset])
+
+ any_changes = (
+ image_changed or
+ changed_in_cache
+ )
+
+ if size_preset == UI.RESOLUTION_FROM_IMAGE:
+ if any_changes:
+ image = access.get_from_pipeline(Names.P_IMAGE)
+
+ if image is not None:
+ (image_width, image_height) = get_image_size(image)
+ access.update_in_cache(Names.C_IMAGE_SIZE, [size_preset], (image_width, image_height))
+
+ elif access.has_in_cache(Names.C_IMAGE_SIZE):
+ (image_width, image_height) = access.get_from_cache(Names.C_IMAGE_SIZE)
+
+ access.override_setting(UI.S_GENERATION_PARAMETERS, UI.F_IMAGE_WIDTH, image_width)
+ access.override_setting(UI.S_GENERATION_PARAMETERS, UI.F_IMAGE_HEIGHT, image_height)
+
+ mask_mode = access.get_active_setting(UI.S_IMG2IMG_INPAINTING, UI.F_INPAINT_MASK_MODE)
+ mask_mode_changed = access.setting_changed(UI.S_IMG2IMG_INPAINTING, UI.F_INPAINT_MASK_MODE)
+
+ if workflow_mode == UI.WF_MODE_IN_PAINTING:
+ image_inputs = retrieve_input(UI.S_IMAGE_INPUTS, data, stage_input)
+
+ if mask_mode == UI.MASK_MODE_UPLOADED_FULL:
+ mask_changed = retrieve_parameter(UI.F_UPLOADED_MASK_CHANGED, image_inputs, False)
+ image_inputs[UI.F_UPLOADED_MASK_CHANGED] = False
+ else:
+ mask_changed = retrieve_parameter(UI.F_IMAGE_MASK_CHANGED, image_inputs, False)
+ image_inputs[UI.F_IMAGE_MASK_CHANGED] = False
+
+ if mask_changed or mask_mode_changed:
+ if mask_mode == UI.MASK_MODE_UPLOADED_FULL:
+ mask = retrieve_parameter(UI.F_UPLOADED_MASK, image_inputs)
+ else:
+ mask = retrieve_parameter(UI.F_IMAGE_MASK, image_inputs)
+
+ access.update_in_cache(Names.C_SOURCE_MASK, [], mask)
+ access.update_in_pipeline(Names.P_MASK, mask)
+
+ else:
+ mask = access.get_from_cache(Names.C_SOURCE_MASK)
+ access.restore_in_pipeline(Names.P_MASK, mask)
+
+ mask_blur = access.get_active_setting(UI.S_IMG2IMG_INPAINTING, UI.F_INPAINT_MASK_BLUR, 8)
+
+ parameters = [
+ mask_blur,
+ mask_mode,
+ ]
+
+ mask_changed = access.changed_in_pipeline(Names.P_MASK)
+ changed_in_cache = access.changed_in_cache(Names.C_BLURRY_MASK, parameters)
+
+ any_changes = (
+ mask_changed or
+ changed_in_cache
+ )
+
+ if any_changes:
+ mask = access.get_from_pipeline(Names.P_MASK)
+ if mask is not None and mask_blur > 0 and changed_in_cache:
+ mask = NodeWrapper.mask_to_image.mask_to_image(mask)[0]
+ mask = NodeWrapper.image_blur.blur(mask, mask_blur, 3.0)[0]
+ mask = NodeWrapper.image_to_mask.image_to_mask(mask, "green")[0]
+
+ access.update_in_cache(Names.C_BLURRY_MASK, parameters, mask)
+ access.update_in_pipeline(Names.P_MASK, mask)
+ elif access.has_in_cache(Names.C_BLURRY_MASK):
+ mask = access.get_from_cache(Names.C_BLURRY_MASK)
+ access.restore_in_pipeline(Names.P_MASK, mask)
+
+ stage_results = {
+ }
+
+ stage_output = {
+ Names.PLACEHOLDER: stage_results,
+ }
+
+ return (data, stage_output,)
diff --git a/modules/stage_sampling.py b/modules/stage_sampling.py
new file mode 100644
index 0000000..4e0269a
--- /dev/null
+++ b/modules/stage_sampling.py
@@ -0,0 +1,150 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .data_utils import retrieve_parameter
+from .mb_pipeline import PipelineAccess
+from .names import Names
+from .node_wrapper import NodeWrapper
+from .ui import UI
+
+
+# --------------------------------------------------------------------------------
+# Stage: Sampling
+# --------------------------------------------------------------------------------
+
+class SeargeStageSampling:
+ def __init__(self):
+ pass
+
+ def get_input(self, data, stage_data):
+ # if we still don't have stage data,
+ if stage_data is None and data is not None:
+ stage_data = {
+ PipelineAccess.NAME: retrieve_parameter(PipelineAccess.NAME, data),
+ }
+
+ return stage_data
+
+ def process(self, data, stage_input):
+ access = PipelineAccess(stage_input)
+
+ base_changed = access.changed_in_pipeline(Names.P_BASE_MODEL)
+ refiner_changed = access.changed_in_pipeline(Names.P_REFINER_MODEL)
+
+ base_model = access.get_from_pipeline(Names.P_BASE_MODEL)
+ refiner_model = access.get_from_pipeline(Names.P_REFINER_MODEL)
+ has_refiner = refiner_model is not None
+
+ base_cond_changed = access.changed_in_pipeline(Names.P_BASE_CONDITIONING)
+ refiner_cond_changed = access.changed_in_pipeline(Names.P_REFINER_CONDITIONING)
+
+ base_cond = access.get_from_pipeline(Names.P_BASE_CONDITIONING)
+ refiner_cond = access.get_from_pipeline(Names.P_REFINER_CONDITIONING)
+
+ base_positive = retrieve_parameter(Names.F_BASE_POSITIVE, base_cond)
+ base_negative = retrieve_parameter(Names.F_BASE_NEGATIVE, base_cond)
+ refiner_positive = retrieve_parameter(Names.F_REFINER_POSITIVE, refiner_cond)
+ refiner_negative = retrieve_parameter(Names.F_REFINER_NEGATIVE, refiner_cond)
+
+ latent_changed = access.changed_in_pipeline(Names.P_LATENT)
+ latent = access.get_from_pipeline(Names.P_LATENT)
+
+ seed = access.get_active_setting(UI.S_GENERATION_PARAMETERS, UI.F_SEED, 4815162342)
+ steps = access.get_active_setting(UI.S_GENERATION_PARAMETERS, UI.F_STEPS, 25)
+ cfg = access.get_active_setting(UI.S_GENERATION_PARAMETERS, UI.F_CFG, 7.0)
+ sampler_name = access.get_active_setting(UI.S_GENERATION_PARAMETERS, UI.F_SAMPLER_NAME, "dpmpp_2m")
+ scheduler = access.get_active_setting(UI.S_GENERATION_PARAMETERS, UI.F_SCHEDULER, "karras")
+ base_ratio = access.get_active_setting(UI.S_GENERATION_PARAMETERS, UI.F_BASE_VS_REFINER_RATIO, 0.8)
+
+ denoise = access.get_active_setting(UI.S_IMG2IMG_INPAINTING, UI.F_DENOISE, 0.5)
+
+ cfg_method = access.get_active_setting(UI.S_ADVANCED_PARAMETERS, UI.F_DYNAMIC_CFG_METHOD)
+ dynamic_cfg = access.get_active_setting(UI.S_ADVANCED_PARAMETERS, UI.F_DYNAMIC_CFG_FACTOR, 0.0)
+ refiner_detail_boost = access.get_active_setting(UI.S_ADVANCED_PARAMETERS, UI.F_REFINER_DETAIL_BOOST)
+
+ dynamic_base_cfg = dynamic_cfg
+ dynamic_refiner_cfg = dynamic_cfg
+
+ if not has_refiner:
+ refiner_model = None
+ refiner_positive = None
+ refiner_negative = None
+ base_ratio = 1.0
+ dynamic_refiner_cfg = 0.0
+ refiner_detail_boost = None
+
+ parameters = [
+ has_refiner,
+ seed,
+ steps,
+ cfg,
+ sampler_name,
+ scheduler,
+ base_ratio,
+ denoise,
+ cfg_method,
+ dynamic_base_cfg,
+ dynamic_refiner_cfg,
+ refiner_detail_boost,
+ ]
+
+ any_changes = (
+ base_changed or
+ refiner_changed or
+ base_cond_changed or
+ refiner_cond_changed or
+ latent_changed)
+
+ sampled_changed = access.changed_in_cache(Names.C_SAMPLED, parameters)
+ if any_changes or sampled_changed:
+ sampler = NodeWrapper.sdxl_sampler
+ latent = sampler(base_model, base_positive, base_negative, latent, seed, steps, cfg,
+ sampler_name, scheduler, refiner_model=refiner_model,
+ refiner_positive=refiner_positive, refiner_negative=refiner_negative,
+ base_ratio=base_ratio, denoise=denoise, cfg_method=cfg_method,
+ dynamic_base_cfg=dynamic_base_cfg, dynamic_refiner_cfg=dynamic_refiner_cfg,
+ refiner_detail_boost=refiner_detail_boost)
+
+ access.update_in_cache(Names.C_SAMPLED, parameters, latent)
+ access.update_in_pipeline(Names.P_LATENT, latent)
+ else:
+ latent = access.get_from_cache(Names.C_SAMPLED)
+ access.restore_in_pipeline(Names.P_LATENT, latent)
+
+ sampled_image = {
+ Names.F_LATENT_SAMPLED: latent,
+ }
+
+ if data is not None:
+ data[Names.S_SAMPLED_IMAGE] = sampled_image
+
+ stage_output = {
+ Names.S_SAMPLED_IMAGE: sampled_image,
+ }
+
+ return (data, stage_output,)
diff --git a/modules/stage_upscaling.py b/modules/stage_upscaling.py
new file mode 100644
index 0000000..d60fa86
--- /dev/null
+++ b/modules/stage_upscaling.py
@@ -0,0 +1,186 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .data_utils import retrieve_parameter
+from .mb_pipeline import PipelineAccess
+from .names import Names
+from .node_wrapper import NodeWrapper
+from .ui import UI
+from .utils import get_image_size
+from .utils import next_multiple_of
+
+
+# --------------------------------------------------------------------------------
+# Stage: Upscaling
+# --------------------------------------------------------------------------------
+
+class SeargeStageUpscaling:
+ SIZE_MULTIPLE_OF = 8
+
+ def __init__(self):
+ pass
+
+ def get_input(self, data, stage_data):
+ # if we still don't have stage data,
+ if stage_data is None and data is not None:
+ stage_data = {
+ PipelineAccess.NAME: retrieve_parameter(PipelineAccess.NAME, data),
+ }
+
+ return stage_data
+
+ def process(self, data, stage_input):
+ access = PipelineAccess(stage_input)
+
+ primary_upscaler = access.get_from_pipeline(Names.P_PRIMARY_UPSCALER)
+ secondary_upscaler = access.get_from_pipeline(Names.P_SECONDARY_UPSCALER)
+
+ primary_upscaler_changed = access.changed_in_pipeline(Names.P_PRIMARY_UPSCALER)
+ secondary_upscaler_changed = access.changed_in_pipeline(Names.P_SECONDARY_UPSCALER)
+
+ upscale_size = access.get_active_setting(UI.S_HIGH_RESOLUTION, UI.F_FINAL_UPSCALE_SIZE, UI.NONE)
+
+ upscale_factor = 1.0
+ if upscale_size == UI.UPSCALE_FACTOR_1_2:
+ upscale_factor = 1.2
+ if upscale_size == UI.UPSCALE_FACTOR_1_25:
+ upscale_factor = 1.25
+ if upscale_size == UI.UPSCALE_FACTOR_1_333:
+ upscale_factor = 1.33333
+ elif upscale_size == UI.UPSCALE_FACTOR_1_5:
+ upscale_factor = 1.5
+ elif upscale_size == UI.UPSCALE_FACTOR_2_0:
+ upscale_factor = 2.0
+ elif upscale_size == UI.UPSCALE_FACTOR_3_0:
+ upscale_factor = 3.0
+ elif upscale_size == UI.UPSCALE_FACTOR_4_0:
+ upscale_factor = 4.0
+
+ image = access.get_from_pipeline(Names.P_IMAGE)
+ image_changed = access.changed_in_pipeline(Names.P_IMAGE)
+
+ parameters = [
+ upscale_size,
+ upscale_factor,
+ ]
+
+ any_changes = (
+ primary_upscaler_changed or
+ secondary_upscaler_changed or
+ image_changed
+ )
+
+ upscaled_image_changed = access.changed_in_cache(Names.C_UPSCALED_IMAGE, parameters)
+ if upscaled_image_changed or any_changes:
+ if image is not None:
+ (image_width, image_height) = get_image_size(image)
+ else:
+ (image_width, image_height) = (1024, 1024)
+
+ new_width = next_multiple_of(image_width * upscale_factor, self.SIZE_MULTIPLE_OF)
+ new_height = next_multiple_of(image_height * upscale_factor, self.SIZE_MULTIPLE_OF)
+
+ if upscale_factor > 1.0 and image is not None:
+ if primary_upscaler is not None and secondary_upscaler is not None:
+ image1 = NodeWrapper.scale_with_model.upscale(primary_upscaler, image)[0]
+ (scaled_width1, scaled_height1) = get_image_size(image1)
+ if scaled_width1 != 4 * image_width or scaled_height1 != 4 * image_height:
+ print("Warning: primary upscaler should be a 4x ESRGAN model")
+
+ image2 = NodeWrapper.scale_with_model.upscale(secondary_upscaler, image)[0]
+ (scaled_width2, scaled_height2) = get_image_size(image2)
+ if scaled_width2 != 4 * image_width or scaled_height2 != 4 * image_height:
+ print("Warning: secondary upscaler should be a 4x ESRGAN model")
+
+ image = NodeWrapper.image_blend.blend_images(image1, image2, 0.2, "normal")[0]
+
+ elif primary_upscaler is not None:
+ image = NodeWrapper.scale_with_model.upscale(primary_upscaler, image)[0]
+ (scaled_width, scaled_height) = get_image_size(image)
+ if scaled_width != 4 * image_width or scaled_height != 4 * image_height:
+ print("Warning: primary upscaler should be a 4x ESRGAN model")
+
+ elif secondary_upscaler is not None:
+ image = NodeWrapper.scale_with_model.upscale(secondary_upscaler, image)[0]
+ (scaled_width, scaled_height) = get_image_size(image)
+ if scaled_width != 4 * image_width or scaled_height != 4 * image_height:
+ print("Warning: secondary upscaler should be a 4x ESRGAN model")
+
+ else:
+ image = None
+
+ else:
+ image = None
+
+ if image is not None:
+ (scaled_width, scaled_height) = get_image_size(image)
+
+ if scaled_width != new_width or scaled_height != new_height:
+ width_factor = float(scaled_width) / float(new_width)
+ height_factor = float(scaled_height) / float(new_height)
+
+ if width_factor >= 3.0 or height_factor >= 3.0:
+ step_width = next_multiple_of(new_width * 2.66666, self.SIZE_MULTIPLE_OF)
+ step_height = next_multiple_of(new_height * 2.66666, self.SIZE_MULTIPLE_OF)
+ image = NodeWrapper.image_scale.upscale(image, "bilinear", step_width, step_height, "center")[0]
+
+ if width_factor >= 2.5 or height_factor >= 2.5:
+ step_width = next_multiple_of(new_width * 2.0, self.SIZE_MULTIPLE_OF)
+ step_height = next_multiple_of(new_height * 2.0, self.SIZE_MULTIPLE_OF)
+ image = NodeWrapper.image_scale.upscale(image, "bilinear", step_width, step_height, "center")[0]
+
+ if width_factor >= 2.0 or height_factor >= 2.0:
+ step_width = next_multiple_of(new_width * 1.5, self.SIZE_MULTIPLE_OF)
+ step_height = next_multiple_of(new_height * 1.5, self.SIZE_MULTIPLE_OF)
+ image = NodeWrapper.image_scale.upscale(image, "bilinear", step_width, step_height, "center")[0]
+
+ if width_factor >= 1.5 or height_factor >= 1.5:
+ step_width = next_multiple_of(new_width * 1.33333, self.SIZE_MULTIPLE_OF)
+ step_height = next_multiple_of(new_height * 1.33333, self.SIZE_MULTIPLE_OF)
+ image = NodeWrapper.image_scale.upscale(image, "bilinear", step_width, step_height, "center")[0]
+
+ image = NodeWrapper.image_scale.upscale(image, "bicubic", new_width, new_height, "center")[0]
+
+ access.update_in_cache(Names.C_UPSCALED_IMAGE, parameters, image)
+ access.update_in_pipeline(Names.P_IMAGE, image)
+ else:
+ image = access.get_from_cache(Names.C_UPSCALED_IMAGE)
+ access.restore_in_pipeline(Names.P_IMAGE, image)
+
+ upscaled = {
+ Names.F_UPSCALED_IMAGE: image,
+ }
+
+ if data is not None:
+ data[Names.S_UPSCALED] = upscaled
+
+ stage_output = {
+ Names.S_UPSCALED: upscaled,
+ }
+
+ return (data, stage_output,)
diff --git a/modules/stage_vae_decode_hires.py b/modules/stage_vae_decode_hires.py
new file mode 100644
index 0000000..29b2c62
--- /dev/null
+++ b/modules/stage_vae_decode_hires.py
@@ -0,0 +1,159 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .data_utils import retrieve_parameter
+from .mb_pipeline import PipelineAccess
+from .names import Names
+from .node_wrapper import NodeWrapper
+from .ui import UI
+
+
+# --------------------------------------------------------------------------------
+# Stage: VAE Decode Sampled
+# --------------------------------------------------------------------------------
+
+class SeargeStageVAEDecodeHires:
+ def __init__(self):
+ pass
+
+ def get_input(self, data, stage_data):
+ # if we still don't have stage data,
+ if stage_data is None and data is not None:
+ stage_data = {
+ PipelineAccess.NAME: retrieve_parameter(PipelineAccess.NAME, data),
+ }
+
+ return stage_data
+
+ def process(self, data, stage_input):
+ access = PipelineAccess(stage_input)
+
+ vae_changed = access.changed_in_pipeline(Names.P_VAE_MODEL)
+ vae_model = access.get_from_pipeline(Names.P_VAE_MODEL)
+
+ latent_changed = access.changed_in_pipeline(Names.P_LATENT)
+ latent = access.get_from_pipeline(Names.P_LATENT)
+
+ hires_contrast_factor = access.get_active_setting(UI.S_HIGH_RESOLUTION, UI.F_HIRES_CONTRAST_FACTOR, 0.0)
+ hires_saturation_factor = access.get_active_setting(UI.S_HIGH_RESOLUTION, UI.F_HIRES_SATURATION_FACTOR, 0.0)
+
+ hires_mode = access.get_active_setting(UI.S_HIGH_RESOLUTION, UI.F_HIRES_MODE, UI.NONE)
+ hires_mode_changed = access.setting_changed(UI.S_HIGH_RESOLUTION, UI.F_HIRES_MODE)
+
+ hires_mode_enabled = hires_mode != UI.NONE
+
+ # vae decoding
+
+ parameters = [
+ hires_mode,
+ ]
+
+ any_changes = (
+ vae_changed or
+ latent_changed
+ )
+
+ vae_decoded_changed = access.changed_in_cache(Names.C_VAE_DECODED_HIRES, parameters)
+ if vae_decoded_changed or any_changes:
+ if hires_mode_enabled:
+ image = NodeWrapper.vae_decoder.decode(vae_model, latent)[0]
+ else:
+ image = None
+
+ access.update_in_cache(Names.C_VAE_DECODED_HIRES, parameters, image)
+ access.update_in_pipeline(Names.P_IMAGE, image)
+ else:
+ image = access.get_from_cache(Names.C_VAE_DECODED_HIRES)
+ access.restore_in_pipeline(Names.P_IMAGE, image)
+
+ # post processing
+
+ image_changed = access.changed_in_pipeline(Names.P_IMAGE)
+ image = access.get_from_pipeline(Names.P_IMAGE)
+
+ parameters = [
+ hires_mode_enabled,
+ hires_contrast_factor,
+ hires_saturation_factor,
+ ]
+
+ any_changes = (
+ hires_mode_changed or
+ image_changed
+ )
+
+ post_processed = None
+
+ post_processed_changed = access.changed_in_cache(Names.C_POST_PROCESSED_HIRES, parameters)
+ if post_processed_changed or any_changes:
+ if hires_contrast_factor > 0.0:
+ if post_processed is None:
+ post_processed = image
+
+ if hires_mode_enabled and post_processed is not None:
+ post_processed = NodeWrapper.image_blend.blend_images(post_processed, post_processed, hires_contrast_factor * 0.5, "multiply")[0]
+ else:
+ post_processed = None
+
+ if hires_saturation_factor > 0.0:
+ if post_processed is None:
+ post_processed = image
+
+ if hires_mode_enabled and post_processed is not None:
+ post_processed = NodeWrapper.image_blend.blend_images(post_processed, post_processed, hires_saturation_factor * 0.5, "overlay")[0]
+ else:
+ post_processed = None
+
+ access.update_in_cache(Names.C_POST_PROCESSED_HIRES, parameters, post_processed)
+ access.update_in_pipeline(Names.P_IMAGE, post_processed)
+ else:
+ post_processed = access.get_from_cache(Names.C_POST_PROCESSED_HIRES)
+ access.restore_in_pipeline(Names.P_IMAGE, post_processed)
+
+ if not hires_mode_enabled:
+ image = None
+ post_processed = None
+
+ vae_decoded = {
+ Names.F_DECODED_HIRES_IMAGE: image,
+ Names.F_HIRES_POST_PROCESSED: post_processed,
+ }
+
+ if data is not None:
+ data[Names.S_VAE_DECODED_HIRES] = vae_decoded
+
+ # special treatment for the stage output here to match the structure of other vae stage outputs
+
+ stage_output = {
+ Names.S_VAE_DECODED: {
+ Names.F_DECODED_IMAGE: image,
+ Names.F_POST_PROCESSED: post_processed,
+ },
+ }
+
+ return (data, stage_output,)
diff --git a/modules/stage_vae_decode_sampled.py b/modules/stage_vae_decode_sampled.py
new file mode 100644
index 0000000..0ffb345
--- /dev/null
+++ b/modules/stage_vae_decode_sampled.py
@@ -0,0 +1,147 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .data_utils import retrieve_parameter
+from .mb_pipeline import PipelineAccess
+from .names import Names
+from .node_wrapper import NodeWrapper
+from .ui import UI
+
+
+# --------------------------------------------------------------------------------
+# Stage: VAE Decode Sampled
+# --------------------------------------------------------------------------------
+
+class SeargeStageVAEDecodeSampled:
+ def __init__(self):
+ pass
+
+ def get_input(self, data, stage_data):
+ # if we still don't have stage data,
+ if stage_data is None and data is not None:
+ stage_data = {
+ PipelineAccess.NAME: retrieve_parameter(PipelineAccess.NAME, data),
+ }
+
+ return stage_data
+
+ def process(self, data, stage_input):
+ access = PipelineAccess(stage_input)
+
+ vae_changed = access.changed_in_pipeline(Names.P_VAE_MODEL)
+ vae_model = access.get_from_pipeline(Names.P_VAE_MODEL)
+
+ latent_changed = access.changed_in_pipeline(Names.P_LATENT)
+ latent = access.get_from_pipeline(Names.P_LATENT)
+
+ contrast_factor = access.get_active_setting(UI.S_ADVANCED_PARAMETERS, UI.F_CONTRAST_FACTOR, 0.0)
+ saturation_factor = access.get_active_setting(UI.S_ADVANCED_PARAMETERS, UI.F_SATURATION_FACTOR, 0.0)
+
+ source_image_changed = access.changed_in_pipeline(Names.P_IMAGE)
+ source_image = access.get_from_pipeline(Names.P_IMAGE)
+
+ batch_size = access.get_active_setting(UI.S_OPERATING_MODE, UI.F_BATCH_SIZE, 1)
+
+ any_changes = (
+ vae_changed or
+ latent_changed
+ )
+
+ vae_decoded_changed = access.changed_in_cache(Names.C_VAE_DECODED, [])
+ if vae_decoded_changed or any_changes:
+ image = NodeWrapper.vae_decoder.decode(vae_model, latent)[0]
+
+ access.update_in_cache(Names.C_VAE_DECODED, [], image)
+ access.update_in_pipeline(Names.P_IMAGE, image)
+ else:
+ image = access.get_from_cache(Names.C_VAE_DECODED)
+ access.restore_in_pipeline(Names.P_IMAGE, image)
+
+ image_changed = access.changed_in_pipeline(Names.P_IMAGE)
+ mask_changed = access.changed_in_pipeline(Names.P_MASK)
+
+ image = access.get_from_pipeline(Names.P_IMAGE)
+ mask = access.get_from_pipeline(Names.P_MASK)
+
+ parameters = [
+ contrast_factor,
+ saturation_factor,
+ batch_size,
+ ]
+
+ any_changes = (
+ source_image_changed or
+ image_changed or
+ mask_changed
+ )
+
+ post_processed = None
+
+ post_processed_changed = access.changed_in_cache(Names.C_POST_PROCESSED, parameters)
+ if post_processed_changed or any_changes:
+ if contrast_factor > 0.0:
+ if post_processed is None:
+ post_processed = image
+
+ post_processed = NodeWrapper.image_blend.blend_images(post_processed, post_processed,
+ contrast_factor * 0.5, "multiply")[0]
+
+ if saturation_factor > 0.0:
+ if post_processed is None:
+ post_processed = image
+
+ post_processed = NodeWrapper.image_blend.blend_images(post_processed, post_processed,
+ saturation_factor * 0.5, "overlay")[0]
+
+ if "noise_mask" in latent:
+ image = NodeWrapper.image_composite.composite(source_image, image, 0, 0, False, mask)[0]
+ post_processed = NodeWrapper.image_composite.composite(source_image, post_processed, 0, 0,
+ False, mask)[0]
+
+ access.update_in_cache(Names.C_POST_PROCESSED, parameters, post_processed)
+ access.update_in_pipeline(Names.P_IMAGE, post_processed)
+ else:
+ post_processed = access.get_from_cache(Names.C_POST_PROCESSED)
+ access.restore_in_pipeline(Names.P_IMAGE, post_processed)
+
+ vae_decoded = {
+ Names.F_DECODED_SAMPLED_IMAGE: image,
+ Names.F_SAMPLED_POST_PROCESSED: post_processed,
+ }
+
+ if data is not None:
+ data[Names.S_VAE_DECODED_SAMPLED] = vae_decoded
+
+ stage_output = {
+ Names.S_VAE_DECODED: {
+ Names.F_DECODED_IMAGE: image,
+ Names.F_POST_PROCESSED: post_processed,
+ },
+ }
+
+ return (data, stage_output,)
diff --git a/modules/ui.py b/modules/ui.py
index 856a93b..4387ba9 100644
--- a/modules/ui.py
+++ b/modules/ui.py
@@ -26,507 +26,505 @@ SOFTWARE.
"""
-import comfy.samplers
import folder_paths
import nodes
-from .processing import SeargeParameterProcessor
-
-
-# UI: Prompt Inputs
-
-class SeargeInput1:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "main_prompt": ("STRING", {"multiline": True, "default": ""}),
- "secondary_prompt": ("STRING", {"multiline": True, "default": ""}),
- "style_prompt": ("STRING", {"multiline": True, "default": ""}),
- "negative_prompt": ("STRING", {"multiline": True, "default": ""}),
- "negative_style": ("STRING", {"multiline": True, "default": ""}),
- },
- "optional": {
- "inputs": ("PARAMETER_INPUTS", ),
- "image": ("IMAGE",),
- "mask": ("MASK",),
- },
- }
-
- RETURN_TYPES = ("PARAMETER_INPUTS", )
- RETURN_NAMES = ("inputs", )
- FUNCTION = "mux"
-
- CATEGORY = "Searge/UI/Inputs"
-
- def mux(self, main_prompt, secondary_prompt, style_prompt, negative_prompt, negative_style, inputs=None, image=None, mask=None):
- if inputs is None:
- parameters = {}
- else:
- parameters = inputs
-
- parameters["main_prompt"] = main_prompt
- parameters["secondary_prompt"] = secondary_prompt
- parameters["style_prompt"] = style_prompt
- parameters["negative_prompt"] = negative_prompt
- parameters["negative_style"] = negative_style
- parameters["image"] = image
- parameters["mask"] = mask
-
- return (parameters, )
-
-
-# UI: Prompt Outputs
-
-class SeargeOutput1:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "parameters": ("PARAMETERS", ),
- },
- }
-
- RETURN_TYPES = ("PARAMETERS", "STRING", "STRING", "STRING", "STRING", "STRING", "IMAGE", "MASK", )
- RETURN_NAMES = ("parameters", "main_prompt", "secondary_prompt", "style_prompt", "negative_prompt", "negative_style", "image", "mask", )
- FUNCTION = "demux"
-
- CATEGORY = "Searge/UI/Outputs"
-
- def demux(self, parameters):
- main_prompt = parameters["main_prompt"]
- secondary_prompt = parameters["secondary_prompt"]
- style_prompt = parameters["style_prompt"]
- negative_prompt = parameters["negative_prompt"]
- negative_style = parameters["negative_style"]
- image = parameters["image"]
- mask = parameters["mask"]
-
- return (parameters, main_prompt, secondary_prompt, style_prompt, negative_prompt, negative_style, image, mask, )
-
-
-# UI: Generation Parameters Input
-
-class SeargeInput2:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "seed": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}),
- "image_width": ("INT", {"default": 1024, "min": 0, "max": nodes.MAX_RESOLUTION, "step": 8}),
- "image_height": ("INT", {"default": 1024, "min": 0, "max": nodes.MAX_RESOLUTION, "step": 8}),
- "steps": ("INT", {"default": 20, "min": 0, "max": 200}),
- "cfg": ("FLOAT", {"default": 7.0, "min": 0.0, "max": 30.0, "step": 0.5}),
- "sampler_name": (comfy.samplers.KSampler.SAMPLERS, {"default": "ddim"}),
- "scheduler": (comfy.samplers.KSampler.SCHEDULERS, {"default": "ddim_uniform"}),
- "save_image": (SeargeParameterProcessor.STATES, {"default": SeargeParameterProcessor.STATES[1]}),
- "save_directory": (SeargeParameterProcessor.SAVE_TO, {"default": SeargeParameterProcessor.SAVE_TO[0]}),
- },
- "optional": {
- "inputs": ("PARAMETER_INPUTS", ),
- },
- }
-
- RETURN_TYPES = ("PARAMETER_INPUTS", )
- RETURN_NAMES = ("inputs", )
- FUNCTION = "mux"
-
- CATEGORY = "Searge/UI/Inputs"
-
- def mux(self, seed, image_width, image_height, steps, cfg, sampler_name, scheduler, save_image, save_directory, inputs=None):
- if inputs is None:
- parameters = {}
- else:
- parameters = inputs
-
- parameters["seed"] = seed
- parameters["image_width"] = image_width
- parameters["image_height"] = image_height
- parameters["steps"] = steps
- parameters["cfg"] = cfg
- parameters["sampler_name"] = sampler_name
- parameters["scheduler"] = scheduler
- parameters["save_image"] = save_image
- parameters["save_directory"] = save_directory
-
- return (parameters, )
-
-
-# UI: Generation Parameters Output
-
-class SeargeOutput2:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "parameters": ("PARAMETERS", ),
- },
- }
-
- RETURN_TYPES = ("PARAMETERS", "INT", "INT", "INT", "INT", "FLOAT", "SAMPLER_NAME", "SCHEDULER_NAME", "ENABLE_STATE", "SAVE_FOLDER", )
- RETURN_NAMES = ("parameters", "seed", "image_width", "image_height", "steps", "cfg", "sampler_name", "scheduler", "save_image", "save_directory", )
- FUNCTION = "demux"
-
- CATEGORY = "Searge/UI/Outputs"
-
- def demux(self, parameters):
- seed = parameters["seed"]
- image_width = parameters["image_width"]
- image_height = parameters["image_height"]
- steps = parameters["steps"]
- cfg = parameters["cfg"]
- sampler_name = parameters["sampler_name"]
- scheduler = parameters["scheduler"]
- save_image = parameters["save_image"]
- save_directory = parameters["save_directory"]
-
- return (parameters, seed, image_width, image_height, steps, cfg, sampler_name, scheduler, save_image, save_directory, )
-
-
-# UI: Advanced Parameters Input
-
-class SeargeInput3:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "base_ratio": ("FLOAT", {"default": 0.8, "min": 0.0, "max": 1.0, "step": 0.01}),
- "refiner_strength": ("FLOAT", {"default": 1.0, "min": 0.1, "max": 1.0, "step": 0.05}),
- "refiner_intensity": (SeargeParameterProcessor.REFINER_INTENSITY, {"default": SeargeParameterProcessor.REFINER_INTENSITY[1]}),
- "precondition_steps": ("INT", {"default": 0, "min": 0, "max": 10}),
- "batch_size": ("INT", {"default": 1, "min": 1, "max": 4}),
- "upscale_resolution_factor": ("FLOAT", {"default": 2.0, "min": 0.25, "max": 4.0, "step": 0.25}),
- "save_upscaled_image": (SeargeParameterProcessor.STATES, {"default": SeargeParameterProcessor.STATES[1]}),
- },
- "optional": {
- "inputs": ("PARAMETER_INPUTS", ),
- "denoise": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.01}),
- },
- }
-
- RETURN_TYPES = ("PARAMETER_INPUTS", )
- RETURN_NAMES = ("inputs", )
- FUNCTION = "mux"
-
- CATEGORY = "Searge/UI/Inputs"
-
- def mux(self, base_ratio, refiner_strength, refiner_intensity, precondition_steps, batch_size, upscale_resolution_factor, save_upscaled_image, inputs=None, denoise=None):
- if inputs is None:
- parameters = {}
- else:
- parameters = inputs
-
- parameters["denoise"] = denoise
- parameters["base_ratio"] = base_ratio
- parameters["refiner_strength"] = refiner_strength
- parameters["refiner_intensity"] = refiner_intensity
- parameters["precondition_steps"] = precondition_steps
- parameters["batch_size"] = batch_size
- parameters["upscale_resolution_factor"] = upscale_resolution_factor
- parameters["save_upscaled_image"] = save_upscaled_image
-
- return (parameters, )
-
-
-# UI: Advanced Parameters Output
-
-class SeargeOutput3:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "parameters": ("PARAMETERS", ),
- },
- }
-
- RETURN_TYPES = ("PARAMETERS", "FLOAT", "FLOAT", "FLOAT", "INT", "INT", "INT", "FLOAT", "ENABLE_STATE", )
- RETURN_NAMES = ("parameters", "denoise", "base_ratio", "refiner_strength", "noise_offset", "precondition_steps", "batch_size", "upscale_resolution_factor", "save_upscaled_image", )
- FUNCTION = "demux"
-
- CATEGORY = "Searge/UI/Outputs"
-
- def demux(self, parameters):
- denoise = parameters["denoise"]
- base_ratio = parameters["base_ratio"]
- refiner_strength = parameters["refiner_strength"]
- noise_offset = parameters["noise_offset"]
- precondition_steps = parameters["precondition_steps"]
- batch_size = parameters["batch_size"]
- upscale_resolution_factor = parameters["upscale_resolution_factor"]
- save_upscaled_image = parameters["save_upscaled_image"]
-
- return (parameters, denoise, base_ratio, refiner_strength, noise_offset, precondition_steps, batch_size, upscale_resolution_factor, save_upscaled_image, )
-
-
-# UI: Model Selector Input
-
-class SeargeInput4:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "base_model": (folder_paths.get_filename_list("checkpoints"), ),
- "refiner_model": (folder_paths.get_filename_list("checkpoints"), ),
- "vae_model": (folder_paths.get_filename_list("vae"), ),
- "main_upscale_model": (folder_paths.get_filename_list("upscale_models"),),
- "support_upscale_model": (folder_paths.get_filename_list("upscale_models"),),
- "lora_model": (folder_paths.get_filename_list("loras"),),
- },
- "optional": {
- "model_settings": ("MODEL_SETTINGS", ),
- },
- }
-
- RETURN_TYPES = ("MODEL_NAMES", )
- RETURN_NAMES = ("model_names", )
- FUNCTION = "mux"
-
- CATEGORY = "Searge/UI/Inputs"
-
- def mux(self, base_model, refiner_model, vae_model, main_upscale_model, support_upscale_model, lora_model, model_settings=None):
- if model_settings is None:
- model_names = {}
- else:
- model_names = model_settings
-
- model_names["base_model"] = base_model
- model_names["refiner_model"] = refiner_model
- model_names["vae_model"] = vae_model
- model_names["main_upscale_model"] = main_upscale_model
- model_names["support_upscale_model"] = support_upscale_model
- model_names["lora_model"] = lora_model
-
- return (model_names, )
-
-
-# UI: Model Selector
-
-class SeargeOutput4:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "model_names": ("MODEL_NAMES", ),
- },
- }
-
- RETURN_TYPES = ("MODEL_NAMES", "CHECKPOINT_NAME", "CHECKPOINT_NAME", "VAE_NAME", "UPSCALER_NAME", "UPSCALER_NAME", "LORA_NAME", )
- RETURN_NAMES = ("model_names", "base_model", "refiner_model", "vae_model", "main_upscale_model", "support_upscale_model", "lora_model", )
- FUNCTION = "demux"
-
- CATEGORY = "Searge/UI/Outputs"
-
- def demux(self, model_names):
- base_model = model_names["base_model"]
- refiner_model = model_names["refiner_model"]
- vae_model = model_names["vae_model"]
- main_upscale_model = model_names["main_upscale_model"]
- support_upscale_model = model_names["support_upscale_model"]
- lora_model = model_names["lora_model"]
-
- return (model_names, base_model, refiner_model, vae_model, main_upscale_model, support_upscale_model, lora_model,)
-
-
-# UI: Prompt Processing Input
-
-class SeargeInput5:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "base_conditioning_scale": ("FLOAT", {"default": 2.0, "min": 0.25, "max": 4.0, "step": 0.25}),
- "refiner_conditioning_scale": ("FLOAT", {"default": 2.0, "min": 0.25, "max": 4.0, "step": 0.25}),
- "style_prompt_power": ("FLOAT", {"default": 0.33, "min": 0.0, "max": 1.0, "step": 0.01}),
- "negative_style_power": ("FLOAT", {"default": 0.67, "min": 0.0, "max": 1.0, "step": 0.01}),
- "style_template": (SeargeParameterProcessor.STYLE_TEMPLATE, {"default": SeargeParameterProcessor.STYLE_TEMPLATE[0]}),
- },
- "optional": {
- "inputs": ("PARAMETER_INPUTS", ),
- },
- }
-
- RETURN_TYPES = ("PARAMETER_INPUTS", )
- RETURN_NAMES = ("inputs", )
- FUNCTION = "mux"
-
- CATEGORY = "Searge/UI/Inputs"
-
- def mux(self, base_conditioning_scale, refiner_conditioning_scale, style_prompt_power, negative_style_power, style_template, inputs=None):
- if inputs is None:
- parameters = {}
- else:
- parameters = inputs
-
- parameters["base_conditioning_scale"] = base_conditioning_scale
- parameters["refiner_conditioning_scale"] = refiner_conditioning_scale
- parameters["style_prompt_power"] = style_prompt_power
- parameters["negative_style_power"] = negative_style_power
- parameters["style_template"] = style_template
-
- return (parameters, )
-
-
-# UI: Prompt Processing Output
-
-class SeargeOutput5:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "parameters": ("PARAMETERS", ),
- },
- }
-
- RETURN_TYPES = ("PARAMETERS", "FLOAT", "FLOAT", "FLOAT", "FLOAT", )
- RETURN_NAMES = ("parameters", "base_conditioning_scale", "refiner_conditioning_scale", "style_prompt_power", "negative_style_power", )
- FUNCTION = "demux"
-
- CATEGORY = "Searge/UI/Outputs"
-
- def demux(self, parameters):
- base_conditioning_scale = parameters["base_conditioning_scale"]
- refiner_conditioning_scale = parameters["refiner_conditioning_scale"]
- style_prompt_power = parameters["style_prompt_power"]
- negative_style_power = parameters["negative_style_power"]
-
- return (parameters, base_conditioning_scale, refiner_conditioning_scale, style_prompt_power, negative_style_power, )
-
-
-# UI: HiResFix Parameters Input
-
-class SeargeInput6:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "hires_fix": (SeargeParameterProcessor.STATES, {"default": SeargeParameterProcessor.STATES[1]}),
- "hrf_steps": ("INT", {"default": 0, "min": 0, "max": 100}),
- "hrf_denoise": ("FLOAT", {"default": 0.1, "min": 0.0, "max": 1.0, "step": 0.01}),
- "hrf_upscale_factor": ("FLOAT", {"default": 1.5, "min": 0.25, "max": 4.0, "step": 0.25}),
- "hrf_intensity": (SeargeParameterProcessor.REFINER_INTENSITY, {"default": SeargeParameterProcessor.REFINER_INTENSITY[1]}),
- "hrf_seed_offset": (SeargeParameterProcessor.HRF_SEED_OFFSET, {"default": SeargeParameterProcessor.HRF_SEED_OFFSET[1]}),
- "hrf_smoothness": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.05}),
- },
- "optional": {
- "inputs": ("PARAMETER_INPUTS", ),
- },
- }
-
- RETURN_TYPES = ("PARAMETER_INPUTS", )
- RETURN_NAMES = ("inputs", )
- FUNCTION = "mux"
-
- CATEGORY = "Searge/UI/Inputs"
-
- def mux(self, hires_fix, hrf_steps, hrf_denoise, hrf_upscale_factor, hrf_intensity, hrf_seed_offset, hrf_smoothness, inputs=None):
- if inputs is None:
- parameters = {}
- else:
- parameters = inputs
-
- parameters["hires_fix"] = hires_fix
- parameters["hrf_steps"] = hrf_steps
- parameters["hrf_denoise"] = hrf_denoise
- parameters["hrf_upscale_factor"] = hrf_upscale_factor
- parameters["hrf_intensity"] = hrf_intensity
- parameters["hrf_seed_offset"] = hrf_seed_offset
- parameters["hrf_smoothness"] = hrf_smoothness
-
- return (parameters, )
-
-
-# UI: HiResFix Parameters Output
-
-class SeargeOutput6:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "parameters": ("PARAMETERS", ),
- },
- }
-
- RETURN_TYPES = ("PARAMETERS", "INT", "FLOAT", "FLOAT", "INT", "INT", "ENABLE_STATE", "FLOAT", )
- RETURN_NAMES = ("parameters", "hrf_steps", "hrf_denoise", "hrf_upscale_factor", "hrf_noise_offset", "hrf_seed", "hires_fix", "hrf_smoothness", )
- FUNCTION = "demux"
-
- CATEGORY = "Searge/UI/Outputs"
-
- def demux(self, parameters):
- hrf_steps = parameters["hrf_steps"]
- hrf_denoise = parameters["hrf_denoise"]
- hrf_upscale_factor = parameters["hrf_upscale_factor"]
- hrf_noise_offset = parameters["hrf_noise_offset"]
- hrf_seed = parameters["hrf_seed"]
- hires_fix = parameters["hires_fix"]
- hrf_smoothness = parameters["hrf_smoothness"]
-
- return (parameters, hrf_steps, hrf_denoise, hrf_upscale_factor, hrf_noise_offset, hrf_seed, hires_fix, hrf_smoothness, )
-
-
-# UI: Misc Inputs
-
-class SeargeInput7:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "lora_strength": ("FLOAT", {"default": 0.2, "min": -10.0, "max": 10.0, "step": 0.05}),
- "operation_mode": (SeargeParameterProcessor.OPERATION_MODE, {"default": SeargeParameterProcessor.OPERATION_MODE[0]}),
- "prompt_style": (SeargeParameterProcessor.PROMPT_STYLE, {"default": SeargeParameterProcessor.PROMPT_STYLE[0]}),
- },
- "optional": {
- "inputs": ("PARAMETER_INPUTS", ),
- },
- }
-
- RETURN_TYPES = ("PARAMETER_INPUTS", )
- RETURN_NAMES = ("inputs", )
- FUNCTION = "mux"
-
- CATEGORY = "Searge/UI/Inputs"
-
- def mux(self, lora_strength, operation_mode, prompt_style, inputs=None):
- if inputs is None:
- parameters = {}
- else:
- parameters = inputs
-
- parameters["lora_strength"] = lora_strength
- parameters["operation_mode"] = operation_mode
- parameters["prompt_style"] = prompt_style
-
- return (parameters, )
-
-
-# UI: Misc Outputs
-
-class SeargeOutput7:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "parameters": ("PARAMETERS", ),
- },
- }
-
- RETURN_TYPES = ("PARAMETERS", "FLOAT", )
- RETURN_NAMES = ("parameters", "lora_strength", )
- FUNCTION = "demux"
-
- CATEGORY = "Searge/UI/Outputs"
-
- def demux(self, parameters):
- lora_strength = parameters["lora_strength"]
-
- return (parameters, lora_strength, )
-
-
-# UI: Generated outputs for flow control
-
-class SeargeGenerated1:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "parameters": ("PARAMETERS", ),
- },
- }
-
- RETURN_TYPES = ("PARAMETERS", "INT", "INT", "INT", )
- RETURN_NAMES = ("parameters", "operation_selector", "prompt_style_selector", "prompt_style_group", )
- FUNCTION = "demux"
-
- CATEGORY = "Searge/UI/Generated"
-
- def demux(self, parameters):
- operation_selector = parameters["operation_selector"]
- prompt_style_selector = parameters["prompt_style_selector"]
- prompt_style_group = parameters["prompt_style_group"]
-
- return (parameters, operation_selector, prompt_style_selector, prompt_style_group, )
+from inspect import currentframe, getframeinfo
+from pathlib import Path
+
+from comfy.samplers import KSampler
+
+from .custom_sdxl_ksampler import CfgMethods
+
+
+# ====================================================================================================
+# UI: Constants, lists, definitions
+# ====================================================================================================
+
+class Defs:
+ DEV_MODE = True # do NOT disable this in test releases or things will break, some required code is missing
+
+ VERSION = "3.991-dev" if DEV_MODE else "4.0"
+
+ WORKFLOW_VERSIONS = [
+ "3.991-dev",
+ ] if DEV_MODE else [
+ "4.0",
+ ]
+
+ # --- don't touch these ---
+ CLASS_POSTFIX = "Dev" if DEV_MODE else ""
+ CATEGORY = "Searge-Dev" if DEV_MODE else "Searge"
+ EXTENSION_PATH = str(Path(getframeinfo(currentframe()).filename).resolve().parent.parent)
+
+
+# ====================================================================================================
+# UI: Constants, lists, definitions
+# ====================================================================================================
+
+class UI:
+ CATEGORY_DEBUG = f"{Defs.CATEGORY}/Debug"
+ CATEGORY_MAGIC = f"{Defs.CATEGORY}/Magic"
+ CATEGORY_MAGIC_CUSTOM_STAGES = f"{Defs.CATEGORY}/Magic/Custom Stages"
+ CATEGORY_SAMPLING = f"{Defs.CATEGORY}/Sampling"
+ CATEGORY_UI = f"{Defs.CATEGORY}/UI"
+ CATEGORY_UI_INPUTS = f"{Defs.CATEGORY}/UI/Inputs"
+ CATEGORY_UI_PROMPTING = f"{Defs.CATEGORY}/UI/Prompting"
+
+ MAX_RESOLUTION = nodes.MAX_RESOLUTION
+
+ EXAMPLE = "example"
+
+ # ================================================================================
+ # Selections
+ # ================================================================================
+
+ NONE = "none"
+ CUSTOM = "custom"
+ USE_SETTINGS = "none - use settings"
+
+ VAE_FROM_BASE_MODEL = "from base model"
+ VAE_FROM_REFINER_MODEL = "from refiner model"
+
+ VAE_SOURCES = [
+ VAE_FROM_BASE_MODEL,
+ VAE_FROM_REFINER_MODEL,
+ ]
+
+ WF_MODE_TEXT_TO_IMAGE = "text-to-image"
+ WF_MODE_IMAGE_TO_IMAGE = "image-to-image"
+ WF_MODE_IN_PAINTING = "in-painting"
+
+ WORKFLOW_MODES = [
+ NONE,
+ WF_MODE_TEXT_TO_IMAGE,
+ WF_MODE_IMAGE_TO_IMAGE,
+ WF_MODE_IN_PAINTING,
+ ]
+
+ PROMPTING_DEFAULT = "default - all prompts"
+ PROMPTING_MAIN_AND_NEGATIVE_ONLY = "main and neg. only"
+ PROMPTING_MAIN_SECONDARY_AND_NEGATIVE = "main, sec., and neg."
+ PROMPTING_MAIN_ALL_EXCEPT_SECONDARY = "all except sec."
+
+ PROMPTING_MODES = [
+ PROMPTING_DEFAULT,
+ CUSTOM,
+ PROMPTING_MAIN_AND_NEGATIVE_ONLY,
+ PROMPTING_MAIN_SECONDARY_AND_NEGATIVE,
+ PROMPTING_MAIN_ALL_EXCEPT_SECONDARY,
+ ]
+
+ SAMPLERS = KSampler.SAMPLERS
+ SCHEDULERS = KSampler.SCHEDULERS
+
+ SAMPLER_PRESET_DPMPP_2M_KARRAS = "1 - DPM++ 2M Karras"
+ SAMPLER_PRESET_EULER_A = "2 - Euler a"
+ SAMPLER_PRESET_DPMPP_2M_SDE_KARRAS = "3 - DPM++ 2M SDE Karras"
+ SAMPLER_PRESET_DPMPP_3M_SDE_EXPONENTIAL = "4 - DPM++ 3M SDE Exp"
+ SAMPLER_PRESET_DDIM_UNIFORM = "5 - DDIM Uniform"
+
+ SAMPLER_PRESETS = [
+ USE_SETTINGS,
+ SAMPLER_PRESET_DPMPP_2M_KARRAS,
+ SAMPLER_PRESET_EULER_A,
+ SAMPLER_PRESET_DPMPP_2M_SDE_KARRAS,
+ SAMPLER_PRESET_DPMPP_3M_SDE_EXPONENTIAL,
+ SAMPLER_PRESET_DDIM_UNIFORM,
+ ]
+
+ RESOLUTION_1024x1024 = "1024x1024 (1:1)"
+ RESOLUTION_1152x896 = "1152x896 (4:3)"
+ RESOLUTION_1216x832 = "1216x832 (3:2)"
+ RESOLUTION_1344x768 = "1344x768 (16:9)"
+ RESOLUTION_1536x640 = "1536x640 (21:9)"
+ RESOLUTION_896x1152 = "896x1152 (3:4)"
+ RESOLUTION_832x1216 = "832x1216 (2:3)"
+ RESOLUTION_768x1344 = "768x1344 (9:16)"
+ RESOLUTION_640x1536 = "640x1536 (9:21)"
+ RESOLUTION_FROM_IMAGE = "from source image"
+
+ RESOLUTION_PRESETS = [
+ USE_SETTINGS,
+ RESOLUTION_1024x1024,
+ RESOLUTION_1152x896,
+ RESOLUTION_1216x832,
+ RESOLUTION_1344x768,
+ RESOLUTION_1536x640,
+ RESOLUTION_896x1152,
+ RESOLUTION_832x1216,
+ RESOLUTION_768x1344,
+ RESOLUTION_640x1536,
+ RESOLUTION_FROM_IMAGE,
+ ]
+
+ SAVE_DISABLED = "none - don't save"
+ SAVE_TO_OUTPUT = "output"
+ SAVE_TO_OUTPUT_DATE = "output/%date%"
+ SAVE_TO_OUTPUT_SEARGE_SDXL_DATE = "output/Searge-SDXL-%date%"
+ SAVE_TO_INPUT = "input"
+
+ SAVE_FOLDERS = [
+ SAVE_DISABLED,
+ SAVE_TO_OUTPUT,
+ SAVE_TO_OUTPUT_DATE,
+ SAVE_TO_OUTPUT_SEARGE_SDXL_DATE,
+ SAVE_TO_INPUT,
+ ]
+
+ CFG_INTERPOLATE = CfgMethods.INTERPOLATE
+ CFG_RESCALE = CfgMethods.RESCALE
+ CFG_TONEMAP = CfgMethods.TONEMAP
+
+ DYNAMIC_CFG_METHODS = [
+ NONE,
+ CFG_INTERPOLATE,
+ CFG_RESCALE,
+ CFG_TONEMAP,
+ ]
+
+ DETAILER_NORMAL = "normal"
+ DETAILER_SOFT = "soft"
+ DETAILER_BLURRY = "blurry"
+ DETAILER_SOFT_BLURRY = "soft blurry"
+
+ LATENT_DETAILERS = [
+ NONE,
+ DETAILER_NORMAL,
+ DETAILER_SOFT,
+ DETAILER_BLURRY,
+ DETAILER_SOFT_BLURRY,
+ ]
+
+ HIRES_MODE_SIMPLE = "simple - fast"
+ HIRES_MODE_NORMAL = "normal"
+
+ HIRES_MODES = [
+ NONE,
+ HIRES_MODE_SIMPLE,
+ HIRES_MODE_NORMAL,
+ ]
+
+ HIRES_SCALE_1_25 = "1.25x"
+ HIRES_SCALE_1_5 = "1.5x"
+ HIRES_SCALE_2_0 = "2x"
+
+ HIRES_SCALE_FACTORS = [
+ HIRES_SCALE_1_25,
+ HIRES_SCALE_1_5,
+ HIRES_SCALE_2_0,
+ ]
+
+ PRECONDITION_MODE_GAUSSIAN = "gaussian"
+
+ PRECONDITION_MODES = [
+ NONE,
+ PRECONDITION_MODE_GAUSSIAN,
+ ]
+
+ UPSCALE_FACTOR_1_2 = "1.2x"
+ UPSCALE_FACTOR_1_25 = "1.25x"
+ UPSCALE_FACTOR_1_333 = "1.333x"
+ UPSCALE_FACTOR_1_5 = "1.5x"
+ UPSCALE_FACTOR_2_0 = "2.0x"
+ UPSCALE_FACTOR_3_0 = "3.0x"
+ UPSCALE_FACTOR_4_0 = "4.0x"
+
+ UPSCALE_FACTORS = [
+ NONE,
+ UPSCALE_FACTOR_1_2,
+ UPSCALE_FACTOR_1_25,
+ UPSCALE_FACTOR_1_333,
+ UPSCALE_FACTOR_1_5,
+ UPSCALE_FACTOR_2_0,
+ UPSCALE_FACTOR_3_0,
+ UPSCALE_FACTOR_4_0,
+ ]
+
+ MASK_MODE_DRAWN_FULL = "masked - full"
+ MASK_MODE_UPLOADED_FULL = "uploaded - full"
+
+ MASK_MODES = [
+ MASK_MODE_DRAWN_FULL,
+ MASK_MODE_UPLOADED_FULL,
+ ]
+
+ CN_MODE_REVISION = "revision"
+ CN_MODE_CANNY = "canny"
+ CN_MODE_DEPTH = "depth"
+ CN_MODE_RECOLOR = "recolor"
+ CN_MODE_SKETCH = "sketch"
+
+ CONTROLNET_MODES = [
+ NONE,
+ CN_MODE_REVISION,
+ CN_MODE_CANNY,
+ CN_MODE_DEPTH,
+ CN_MODE_RECOLOR,
+ CN_MODE_SKETCH,
+ CUSTOM,
+ ]
+
+ # ================================================================================
+ # Selection Methods
+ # ================================================================================
+
+ @staticmethod
+ def CHECKPOINTS():
+ return folder_paths.get_filename_list("checkpoints")
+
+ @staticmethod
+ def CHECKPOINTS_WITH_NONE():
+ return [UI.NONE] + folder_paths.get_filename_list("checkpoints")
+
+ @staticmethod
+ def VAE_WITH_EMBEDDED():
+ return UI.VAE_SOURCES + folder_paths.get_filename_list("vae")
+
+ @staticmethod
+ def UPSCALERS_WITH_NONE():
+ return [UI.NONE] + folder_paths.get_filename_list("upscale_models")
+
+ @staticmethod
+ def UPSCALERS_1x_WITH_NONE():
+ return [UI.NONE] + [fn for fn in folder_paths.get_filename_list("upscale_models") if fn.startswith("1x")]
+
+ @staticmethod
+ def UPSCALERS_4x_WITH_NONE():
+ return [UI.NONE] + [fn for fn in folder_paths.get_filename_list("upscale_models") if fn.startswith("4x")]
+
+ @staticmethod
+ def LORAS_WITH_NONE():
+ return [UI.NONE] + folder_paths.get_filename_list("loras")
+
+ @staticmethod
+ def CONTROLNETS_WITH_NONE():
+ return [UI.NONE] + folder_paths.get_filename_list("controlnet")
+
+ @staticmethod
+ def CLIP_VISION_WITH_NONE():
+ return [UI.NONE] + folder_paths.get_filename_list("clip_vision")
+
+ # ================================================================================
+ # PROCESSING
+ # ================================================================================
+
+ ALL_UI_INPUTS = []
+
+ S_EXAMPLE_STRUCTURE = "example_structure"
+ F_EXAMPLE_FIELD = "example_field"
+
+ # ================================================================================
+ # UI DATA OUTPUTS
+ # ================================================================================
+
+ # UI: Prompt Adapter
+ # --------------------------------------------------------------------------------
+ # output structure and field names
+ S_PROMPTS = "prompts"
+ ALL_UI_INPUTS += [S_PROMPTS]
+
+ F_MAIN_PROMPT = "main_prompt"
+ F_SECONDARY_PROMPT = "secondary_prompt"
+ F_STYLE_PROMPT = "style_prompt"
+ F_NEGATIVE_MAIN_PROMPT = "negative_main_prompt"
+ F_NEGATIVE_SECONDARY_PROMPT = "negative_secondary_prompt"
+ F_NEGATIVE_STYLE_PROMPT = "negative_style_prompt"
+
+ # UI: Prompt Adapter
+ # --------------------------------------------------------------------------------
+ # output structure and field names
+ S_IMAGE_INPUTS = "image_inputs"
+ ALL_UI_INPUTS += [S_IMAGE_INPUTS]
+
+ F_SOURCE_IMAGE = "source_image"
+ F_SOURCE_IMAGE_CHANGED = "source_image_changed"
+ F_IMAGE_MASK = "image_mask"
+ F_IMAGE_MASK_CHANGED = "image_mask_changed"
+ F_UPLOADED_MASK = "uploaded_mask"
+ F_UPLOADED_MASK_CHANGED = "uploaded_mask_changed"
+
+ # UI: Controlnet Models
+ # --------------------------------------------------------------------------------
+ # output structure and field names
+ S_CONTROLNET_MODELS = "controlnet_models"
+ ALL_UI_INPUTS += [S_CONTROLNET_MODELS]
+
+ F_CLIP_VISION_CHECKPOINT = "clip_vision_checkpoint"
+ F_CANNY_CHECKPOINT = "canny_checkpoint"
+ F_DEPTH_CHECKPOINT = "depth_checkpoint"
+ F_RECOLOR_CHECKPOINT = "recolor_checkpoint"
+ F_SKETCH_CHECKPOINT = "sketch_checkpoint"
+ F_CUSTOM_CHECKPOINT = "custom_checkpoint"
+
+ # UI: Controlnet Adapter
+ # --------------------------------------------------------------------------------
+ # output structure and field names
+ S_CONTROLNET_INPUTS = "controlnet_inputs"
+ ALL_UI_INPUTS += [S_CONTROLNET_INPUTS]
+
+ F_CN_STACK = "cn_stack"
+
+ # per controlnet settings
+ F_REV_CN_IMAGE = "cn_image"
+ F_REV_CN_IMAGE_CHANGED = "cn_image_changed"
+ F_REV_CN_MODE = "cn_pre_mode"
+ F_CN_PRE_PROCESSOR = "cn_pre_processor"
+ F_REV_CN_STRENGTH = "cn_rev_strength"
+ F_CN_LOW_THRESHOLD = "cn_low_threshold"
+ F_CN_HIGH_THRESHOLD = "cn_high_threshold"
+ F_CN_START = "cn_start"
+ F_CN_END = "cn_end"
+ F_REV_NOISE_AUGMENTATION = "rev_noise_augmentation"
+ F_REV_ENHANCER = "rev_enhancer"
+
+ # UI: Model Selector
+ # --------------------------------------------------------------------------------
+ # output structure and field names
+ S_CHECKPOINTS = "checkpoints"
+ ALL_UI_INPUTS += [S_CHECKPOINTS]
+
+ F_BASE_CHECKPOINT = "base_checkpoint"
+ F_REFINER_CHECKPOINT = "refiner_checkpoint"
+ F_VAE_CHECKPOINT = "vae_checkpoint"
+
+ # UI: Generation Parameters
+ # --------------------------------------------------------------------------------
+ # output structure and field names
+ S_GENERATION_PARAMETERS = "generation_parameters"
+ ALL_UI_INPUTS += [S_GENERATION_PARAMETERS]
+
+ F_SEED = "seed"
+ F_IMAGE_SIZE_PRESET = "image_size_preset"
+ F_IMAGE_WIDTH = "image_width"
+ F_IMAGE_HEIGHT = "image_height"
+ F_STEPS = "steps"
+ F_CFG = "cfg"
+ F_SAMPLER_PRESET = "sampler_preset"
+ F_SAMPLER_NAME = "sampler_name"
+ F_SCHEDULER = "scheduler"
+ F_BASE_VS_REFINER_RATIO = "base_vs_refiner_ratio"
+
+ # UI: Conditioning Parameters
+ # --------------------------------------------------------------------------------
+ # output structure and field names
+ S_CONDITIONING_PARAMETERS = "conditioning_parameters"
+ ALL_UI_INPUTS += [S_CONDITIONING_PARAMETERS]
+
+ F_BASE_CONDITIONING_SCALE = "base_conditioning_scale"
+ F_REFINER_CONDITIONING_SCALE = "refiner_conditioning_scale"
+ F_TARGET_CONDITIONING_SCALE = "target_conditioning_scale"
+ F_POSITIVE_CONDITIONING_SCALE = "positive_conditioning_scale"
+ F_NEGATIVE_CONDITIONING_SCALE = "negative_conditioning_scale"
+ F_POSITIVE_AESTHETIC_SCORE = "positive_aesthetic_score"
+ F_NEGATIVE_AESTHETIC_SCORE = "negative_aesthetic_score"
+ F_PRECONDITION_MODE = "precondition_mode"
+ F_PRECONDITION_STRENGTH = "precondition_strength"
+
+ # UI: Advanced Parameters
+ # --------------------------------------------------------------------------------
+ # output structure and field names
+ S_ADVANCED_PARAMETERS = "advanced_parameters"
+ ALL_UI_INPUTS += [S_ADVANCED_PARAMETERS]
+
+ F_DYNAMIC_CFG_METHOD = "dynamic_cfg_method"
+ F_DYNAMIC_CFG_FACTOR = "dynamic_cfg_factor"
+ F_REFINER_DETAIL_BOOST = "refiner_detail_boost"
+ F_CONTRAST_FACTOR = "contrast_factor"
+ F_SATURATION_FACTOR = "saturation_factor"
+ F_LATENT_DETAILER = "latent_detailer"
+
+ # UI: Image Saving
+ # --------------------------------------------------------------------------------
+ # output structure and field names
+ S_IMAGE_SAVING = "image_saving"
+ ALL_UI_INPUTS += [S_IMAGE_SAVING]
+
+ F_SAVE_PARAMETERS_FILE = "save_parameters_file",
+ F_SAVE_FOLDER = "save_folder",
+ F_SAVE_GENERATED_IMAGE = "save_generated_image",
+ F_EMBED_WORKFLOW_IN_GENERATED = "embed_workflow_in_generated",
+ F_GENERATED_IMAGE_NAME = "generated_image_name",
+ F_SAVE_HIGH_RES_IMAGE = "save_high_res_image",
+ F_EMBED_WORKFLOW_IN_HIGH_RES = "embed_workflow_in_high_res",
+ F_HIGH_RES_IMAGE_NAME = "high_res_image_name",
+ F_SAVE_UPSCALED_IMAGE = "save_upscaled_image",
+ F_EMBED_WORKFLOW_IN_UPSCALED = "embed_workflow_in_upscaled",
+ F_UPSCALED_IMAGE_NAME = "upscaled_image_name",
+
+ # UI: Operating Mode
+ # --------------------------------------------------------------------------------
+ # output structure and field names
+ S_OPERATING_MODE = "operating_mode"
+ ALL_UI_INPUTS += [S_OPERATING_MODE]
+
+ F_WORKFLOW_MODE = "workflow_mode"
+ F_PROMPTING_MODE = "prompting_mode"
+ F_BATCH_SIZE = "batch_size"
+
+ # UI: Operating Mode
+ # --------------------------------------------------------------------------------
+ # output structure and field names
+ S_IMG2IMG_INPAINTING = "img2img_inpainting"
+ ALL_UI_INPUTS += [S_IMG2IMG_INPAINTING]
+
+ F_DENOISE = "denoise"
+ F_INPAINT_MASK_BLUR = "inpaint_mask_blur"
+ F_INPAINT_MASK_MODE = "inpaint_mask_mode"
+
+ # UI: Custom Prompt Mode
+ # --------------------------------------------------------------------------------
+ # output structure and field names
+ S_CUSTOM_PROMPTING = "custom_prompting"
+ ALL_UI_INPUTS += [S_CUSTOM_PROMPTING]
+
+ # UI: Prompt Styles
+ # --------------------------------------------------------------------------------
+ # output structure and field names
+ S_PROMPT_STYLING = "prompt_styling"
+ ALL_UI_INPUTS += [S_PROMPT_STYLING]
+
+ # UI: High Resolution
+ # --------------------------------------------------------------------------------
+ # output structure and field names
+ S_HIGH_RESOLUTION = "high_resolution"
+ ALL_UI_INPUTS += [S_HIGH_RESOLUTION]
+
+ F_HIRES_MODE = "hires_mode"
+ F_HIRES_SCALE = "hires_scale"
+ F_HIRES_DENOISE = "hires_denoise"
+ F_HIRES_SOFTNESS = "hires_softness"
+ F_HIRES_DETAIL_BOOST = "hires_detail_boost"
+ F_HIRES_CONTRAST_FACTOR = "hires_contrast_factor"
+ F_HIRES_SATURATION_FACTOR = "hires_saturation_factor"
+ F_HIRES_LATENT_DETAILER = "hires_latent_detailer"
+ F_FINAL_UPSCALE_SIZE = "final_upscale_size"
+
+ # UI: Condition Mixing
+ # --------------------------------------------------------------------------------
+ # output structure and field names
+ S_CONDITION_MIXING = "condition_mixing"
+ ALL_UI_INPUTS += [S_CONDITION_MIXING]
+
+ # UI: Upscale Models
+ # --------------------------------------------------------------------------------
+ # output structure and field names
+ S_UPSCALE_MODELS = "upscale_models"
+ ALL_UI_INPUTS += [S_UPSCALE_MODELS]
+
+ F_HIGH_RES_UPSCALER = "high_res_upscaler"
+ F_PRIMARY_UPSCALER = "primary_upscaler"
+ F_SECONDARY_UPSCALER = "secondary_upscaler"
+ F_DETAIL_PROCESSOR = "detail_processor"
+
+ # UI: Loras
+ # --------------------------------------------------------------------------------
+ # output structure and field names
+ S_LORAS = "loras"
+ ALL_UI_INPUTS += [S_LORAS]
+
+ F_LORA_STACK = "lora_stack"
+
+ # per lora settings
+ F_LORA_NAME = "lora_name"
+ F_LORA_STRENGTH = "lora_strength"
diff --git a/modules/ui_advanced_parameters.py b/modules/ui_advanced_parameters.py
new file mode 100644
index 0000000..60505dd
--- /dev/null
+++ b/modules/ui_advanced_parameters.py
@@ -0,0 +1,84 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .ui import UI
+
+
+# ====================================================================================================
+# UI: Advanced Parameters Input
+# ====================================================================================================
+
+class SeargeAdvancedParameters:
+ @classmethod
+ def INPUT_TYPES(cls):
+ return {
+ "required": {
+ "dynamic_cfg_method": (UI.DYNAMIC_CFG_METHODS, {"default": UI.NONE},),
+ "dynamic_cfg_factor": ("FLOAT", {"default": 0.0, "min": -1.0, "max": 1.0, "step": 0.05},),
+ "refiner_detail_boost": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.05},),
+ "contrast_factor": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.05},),
+ "saturation_factor": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.05},),
+ "latent_detailer": (UI.LATENT_DETAILERS, {"default": UI.NONE},),
+ },
+ "optional": {
+ "data": ("SRG_DATA_STREAM",),
+ },
+ }
+
+ RETURN_TYPES = ("SRG_DATA_STREAM",)
+ RETURN_NAMES = ("data",)
+ FUNCTION = "get"
+
+ CATEGORY = UI.CATEGORY_UI_INPUTS
+
+ @staticmethod
+ def create_dict(dynamic_cfg_method, dynamic_cfg_factor, refiner_detail_boost, contrast_factor, saturation_factor, latent_detailer):
+ return {
+ UI.F_DYNAMIC_CFG_METHOD: dynamic_cfg_method,
+ UI.F_DYNAMIC_CFG_FACTOR: round(dynamic_cfg_factor, 3),
+ UI.F_REFINER_DETAIL_BOOST: round(refiner_detail_boost, 3),
+ UI.F_CONTRAST_FACTOR: round(contrast_factor, 3),
+ UI.F_SATURATION_FACTOR: round(saturation_factor, 3),
+ UI.F_LATENT_DETAILER: latent_detailer,
+ }
+
+ def get(self, dynamic_cfg_method, dynamic_cfg_factor, refiner_detail_boost, contrast_factor, saturation_factor, latent_detailer,
+ data=None):
+ if data is None:
+ data = {}
+
+ data[UI.S_ADVANCED_PARAMETERS] = self.create_dict(
+ dynamic_cfg_method,
+ dynamic_cfg_factor,
+ refiner_detail_boost,
+ contrast_factor,
+ saturation_factor,
+ latent_detailer,
+ )
+
+ return (data,)
diff --git a/modules/ui_condition_mixing.py b/modules/ui_condition_mixing.py
new file mode 100644
index 0000000..de7911f
--- /dev/null
+++ b/modules/ui_condition_mixing.py
@@ -0,0 +1,68 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .ui import UI
+
+
+# ====================================================================================================
+# UI: Condition Mixing Input
+# ====================================================================================================
+
+class SeargeConditionMixing:
+ @classmethod
+ def INPUT_TYPES(cls):
+ return {
+ "required": {
+ # "example": ("FLOAT", {"default": 0.5, "min": 0.0, "max": 1.0, "step": 0.05},),
+ },
+ "optional": {
+ "data": ("SRG_DATA_STREAM",),
+ },
+ }
+
+ RETURN_TYPES = ("SRG_DATA_STREAM",)
+ RETURN_NAMES = ("data",)
+ FUNCTION = "get"
+
+ CATEGORY = UI.CATEGORY_UI_INPUTS
+
+ @staticmethod
+ def create_dict(example):
+ return {
+ UI.EXAMPLE: example,
+ }
+
+ def get(self, data=None):
+ if data is None:
+ data = {}
+
+ data[UI.S_CONDITION_MIXING] = self.create_dict(
+ "example",
+ )
+
+ return (data,)
diff --git a/modules/ui_conditioning_parameters.py b/modules/ui_conditioning_parameters.py
new file mode 100644
index 0000000..0534e4b
--- /dev/null
+++ b/modules/ui_conditioning_parameters.py
@@ -0,0 +1,98 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .ui import UI
+
+
+# ====================================================================================================
+# UI: Conditioning Parameters Input
+# ====================================================================================================
+
+class SeargeConditioningParameters:
+ @classmethod
+ def INPUT_TYPES(cls):
+ return {
+ "required": {
+ "base_conditioning_scale": ("FLOAT", {"default": 2.0, "min": 0.5, "max": 4.0, "step": 0.25},),
+ "refiner_conditioning_scale": ("FLOAT", {"default": 2.0, "min": 0.5, "max": 4.0, "step": 0.25},),
+ "target_conditioning_scale": ("FLOAT", {"default": 2.0, "min": 0.5, "max": 4.0, "step": 0.25},),
+ "positive_conditioning_scale": ("FLOAT", {"default": 1.5, "min": 0.25, "max": 2.0, "step": 0.25},),
+ "negative_conditioning_scale": ("FLOAT", {"default": 0.75, "min": 0.25, "max": 2.0, "step": 0.25},),
+ "positive_aesthetic_score": ("FLOAT", {"default": 6.0, "min": 0.5, "max": 10.0, "step": 0.5},),
+ "negative_aesthetic_score": ("FLOAT", {"default": 2.5, "min": 0.5, "max": 10.0, "step": 0.5},),
+ "precondition_mode": (UI.PRECONDITION_MODES,),
+ "precondition_strength": ("FLOAT", {"default": 0.1, "min": 0.0, "max": 1.0, "step": 0.05},),
+ },
+ "optional": {
+ "data": ("SRG_DATA_STREAM",),
+ },
+ }
+
+ RETURN_TYPES = ("SRG_DATA_STREAM",)
+ RETURN_NAMES = ("data",)
+ FUNCTION = "get"
+
+ CATEGORY = UI.CATEGORY_UI_INPUTS
+
+ @staticmethod
+ def create_dict(base_conditioning_scale, refiner_conditioning_scale, target_conditioning_scale,
+ positive_conditioning_scale, negative_conditioning_scale,
+ positive_aesthetic_score, negative_aesthetic_score,
+ precondition_mode, precondition_strength):
+ return {
+ UI.F_BASE_CONDITIONING_SCALE: round(base_conditioning_scale, 3),
+ UI.F_REFINER_CONDITIONING_SCALE: round(refiner_conditioning_scale, 3),
+ UI.F_TARGET_CONDITIONING_SCALE: round(target_conditioning_scale, 3),
+ UI.F_POSITIVE_CONDITIONING_SCALE: round(positive_conditioning_scale, 3),
+ UI.F_NEGATIVE_CONDITIONING_SCALE: round(negative_conditioning_scale, 3),
+ UI.F_POSITIVE_AESTHETIC_SCORE: round(positive_aesthetic_score, 3),
+ UI.F_NEGATIVE_AESTHETIC_SCORE: round(negative_aesthetic_score, 3),
+ UI.F_PRECONDITION_MODE: precondition_mode,
+ UI.F_PRECONDITION_STRENGTH: round(precondition_strength, 3),
+ }
+
+ def get(self, base_conditioning_scale, refiner_conditioning_scale, target_conditioning_scale,
+ positive_conditioning_scale, negative_conditioning_scale,
+ positive_aesthetic_score, negative_aesthetic_score,
+ precondition_mode, precondition_strength, data=None):
+ if data is None:
+ data = {}
+
+ data[UI.S_CONDITIONING_PARAMETERS] = self.create_dict(
+ base_conditioning_scale,
+ refiner_conditioning_scale,
+ target_conditioning_scale,
+ positive_conditioning_scale,
+ negative_conditioning_scale,
+ positive_aesthetic_score,
+ negative_aesthetic_score,
+ precondition_mode,
+ precondition_strength,
+ )
+
+ return (data,)
diff --git a/modules/ui_controlnet_models.py b/modules/ui_controlnet_models.py
new file mode 100644
index 0000000..cb4cd40
--- /dev/null
+++ b/modules/ui_controlnet_models.py
@@ -0,0 +1,83 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .ui import UI
+
+
+# ====================================================================================================
+# UI: Upscale Models Input
+# ====================================================================================================
+
+class SeargeControlnetModels:
+ @classmethod
+ def INPUT_TYPES(cls):
+ return {
+ "required": {
+ "clip_vision": (UI.CLIP_VISION_WITH_NONE(),),
+ "canny_checkpoint": (UI.CONTROLNETS_WITH_NONE(),),
+ "depth_checkpoint": (UI.CONTROLNETS_WITH_NONE(),),
+ "recolor_checkpoint": (UI.CONTROLNETS_WITH_NONE(),),
+ "sketch_checkpoint": (UI.CONTROLNETS_WITH_NONE(),),
+ "custom_checkpoint": (UI.CONTROLNETS_WITH_NONE(),),
+ },
+ "optional": {
+ "data": ("SRG_DATA_STREAM",),
+ },
+ }
+
+ RETURN_TYPES = ("SRG_DATA_STREAM",)
+ RETURN_NAMES = ("data",)
+ FUNCTION = "get"
+
+ CATEGORY = UI.CATEGORY_UI_INPUTS
+
+ @staticmethod
+ def create_dict(clip_vision, canny_checkpoint, depth_checkpoint, recolor_checkpoint, sketch_checkpoint, custom_checkpoint):
+ return {
+ UI.F_CLIP_VISION_CHECKPOINT: clip_vision,
+ UI.F_CANNY_CHECKPOINT: canny_checkpoint,
+ UI.F_DEPTH_CHECKPOINT: depth_checkpoint,
+ UI.F_RECOLOR_CHECKPOINT: recolor_checkpoint,
+ UI.F_SKETCH_CHECKPOINT: sketch_checkpoint,
+ UI.F_CUSTOM_CHECKPOINT: custom_checkpoint,
+ }
+
+ def get(self, clip_vision, canny_checkpoint, depth_checkpoint, recolor_checkpoint, sketch_checkpoint, custom_checkpoint, data=None):
+ if data is None:
+ data = {}
+
+ data[UI.S_CONTROLNET_MODELS] = self.create_dict(
+ clip_vision,
+ canny_checkpoint,
+ depth_checkpoint,
+ recolor_checkpoint,
+ sketch_checkpoint,
+ custom_checkpoint,
+ )
+
+ return (data,)
diff --git a/modules/ui_custom_prompt_mode.py b/modules/ui_custom_prompt_mode.py
new file mode 100644
index 0000000..15496d5
--- /dev/null
+++ b/modules/ui_custom_prompt_mode.py
@@ -0,0 +1,68 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .ui import UI
+
+
+# ====================================================================================================
+# UI: Custom Prompt Mode Input
+# ====================================================================================================
+
+class SeargeCustomPromptMode:
+ @classmethod
+ def INPUT_TYPES(cls):
+ return {
+ "required": {
+ # "example": ("FLOAT", {"default": 0.5, "min": 0.0, "max": 1.0, "step": 0.05},),
+ },
+ "optional": {
+ "data": ("SRG_DATA_STREAM",),
+ },
+ }
+
+ RETURN_TYPES = ("SRG_DATA_STREAM",)
+ RETURN_NAMES = ("data",)
+ FUNCTION = "get"
+
+ CATEGORY = UI.CATEGORY_UI_INPUTS
+
+ @staticmethod
+ def create_dict(example):
+ return {
+ UI.EXAMPLE: example,
+ }
+
+ def get(self, data=None):
+ if data is None:
+ data = {}
+
+ data[UI.S_CUSTOM_PROMPTING] = self.create_dict(
+ "example",
+ )
+
+ return (data,)
diff --git a/modules/ui_generation_parameters.py b/modules/ui_generation_parameters.py
new file mode 100644
index 0000000..d640e6f
--- /dev/null
+++ b/modules/ui_generation_parameters.py
@@ -0,0 +1,110 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .ui import UI
+
+
+# ====================================================================================================
+# UI: Generation Parameters Input
+# ====================================================================================================
+
+class SeargeGenerationParameters:
+ @classmethod
+ def INPUT_TYPES(cls):
+ return {
+ "required": {
+ "seed": ("INT", {"default": 0, "min": 0, "max": 0xfffffffffffffff0},),
+ "image_size_preset": (UI.RESOLUTION_PRESETS,),
+ "image_width": ("INT", {"default": 1024, "min": 0, "max": UI.MAX_RESOLUTION, "step": 8},),
+ "image_height": ("INT", {"default": 1024, "min": 0, "max": UI.MAX_RESOLUTION, "step": 8},),
+ "steps": ("INT", {"default": 20, "min": 1, "max": 200},),
+ "cfg": ("FLOAT", {"default": 7.0, "min": 0.5, "max": 30.0, "step": 0.5},),
+ "sampler_preset": (UI.SAMPLER_PRESETS,),
+ "sampler_name": (UI.SAMPLERS, {"default": "dpmpp_2m"},),
+ "scheduler": (UI.SCHEDULERS, {"default": "karras"},),
+ "base_vs_refiner_ratio": ("FLOAT", {"default": 0.8, "min": 0.0, "max": 1.0, "step": 0.05},),
+ },
+ "optional": {
+ "data": ("SRG_DATA_STREAM",),
+ },
+ }
+
+ RETURN_TYPES = ("SRG_DATA_STREAM",)
+ RETURN_NAMES = ("data",)
+ FUNCTION = "get"
+
+ CATEGORY = UI.CATEGORY_UI_INPUTS
+
+ @staticmethod
+ def create_dict(seed, image_size_preset, image_width, image_height, steps, cfg,
+ sampler_preset, sampler_name, scheduler, base_vs_refiner_ratio):
+
+ # TODO: move to pre-processor
+ if sampler_preset == UI.SAMPLER_PRESET_DPMPP_2M_KARRAS:
+ (sampler_name, scheduler) = ("dpmpp_2m", "karras")
+ elif sampler_preset == UI.SAMPLER_PRESET_EULER_A:
+ (sampler_name, scheduler) = ("euler_ancestral", "normal")
+ elif sampler_preset == UI.SAMPLER_PRESET_DPMPP_2M_SDE_KARRAS:
+ (sampler_name, scheduler) = ("dpmpp_2m_sde", "karras")
+ elif sampler_preset == UI.SAMPLER_PRESET_DPMPP_3M_SDE_EXPONENTIAL:
+ (sampler_name, scheduler) = ("dpmpp_3m_sde", "exponential")
+ elif sampler_preset == UI.SAMPLER_PRESET_DDIM_UNIFORM:
+ (sampler_name, scheduler) = ("ddim", "ddim_uniform")
+
+ return {
+ UI.F_SEED: seed,
+ UI.F_IMAGE_SIZE_PRESET: image_size_preset,
+ UI.F_IMAGE_WIDTH: image_width,
+ UI.F_IMAGE_HEIGHT: image_height,
+ UI.F_STEPS: steps,
+ UI.F_CFG: round(cfg, 3),
+ UI.F_SAMPLER_PRESET: sampler_preset,
+ UI.F_SAMPLER_NAME: sampler_name,
+ UI.F_SCHEDULER: scheduler,
+ UI.F_BASE_VS_REFINER_RATIO: round(base_vs_refiner_ratio, 3),
+ }
+
+ def get(self, seed, image_size_preset, image_width, image_height, steps, cfg,
+ sampler_preset, sampler_name, scheduler, base_vs_refiner_ratio, data=None):
+ if data is None:
+ data = {}
+
+ data[UI.S_GENERATION_PARAMETERS] = self.create_dict(
+ seed,
+ image_size_preset,
+ image_width,
+ image_height,
+ steps,
+ cfg,
+ sampler_preset,
+ sampler_name,
+ scheduler,
+ base_vs_refiner_ratio,
+ )
+
+ return (data,)
diff --git a/modules/ui_high_resolution.py b/modules/ui_high_resolution.py
new file mode 100644
index 0000000..fdc089c
--- /dev/null
+++ b/modules/ui_high_resolution.py
@@ -0,0 +1,94 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .ui import UI
+
+
+# ====================================================================================================
+# UI: High Resolution Input
+# ====================================================================================================
+
+class SeargeHighResolution:
+ @classmethod
+ def INPUT_TYPES(cls):
+ return {
+ "required": {
+ "hires_mode": (UI.HIRES_MODES, {"default": UI.NONE},),
+ "hires_scale": (UI.HIRES_SCALE_FACTORS, {"default": UI.HIRES_SCALE_1_5},),
+ "hires_denoise": ("FLOAT", {"default": 0.2, "min": 0.0, "max": 1.0, "step": 0.01},),
+ "hires_softness": ("FLOAT", {"default": 0.5, "min": 0.0, "max": 1.0, "step": 0.05},),
+ "hires_detail_boost": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.05},),
+ "hires_contrast_factor": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.05},),
+ "hires_saturation_factor": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.05},),
+ "hires_latent_detailer": ([UI.NONE],), # TODO: implement later
+ "final_upscale_size": (UI.UPSCALE_FACTORS, {"default": UI.NONE},),
+ },
+ "optional": {
+ "data": ("SRG_DATA_STREAM",),
+ },
+ }
+
+ RETURN_TYPES = ("SRG_DATA_STREAM",)
+ RETURN_NAMES = ("data",)
+ FUNCTION = "get"
+
+ CATEGORY = UI.CATEGORY_UI_INPUTS
+
+ @staticmethod
+ def create_dict(hires_mode, hires_scale, hires_denoise, hires_softness, hires_detail_boost, hires_contrast_factor,
+ hires_saturation_factor, hires_latent_detailer, final_upscale_size):
+ return {
+ UI.F_HIRES_MODE: hires_mode,
+ UI.F_HIRES_SCALE: hires_scale,
+ UI.F_HIRES_DENOISE: round(hires_denoise, 3),
+ UI.F_HIRES_SOFTNESS: round(hires_softness, 3),
+ UI.F_HIRES_DETAIL_BOOST: round(hires_detail_boost, 3),
+ UI.F_HIRES_CONTRAST_FACTOR: round(hires_contrast_factor, 3),
+ UI.F_HIRES_SATURATION_FACTOR: round(hires_saturation_factor, 3),
+ UI.F_HIRES_LATENT_DETAILER: hires_latent_detailer,
+ UI.F_FINAL_UPSCALE_SIZE: final_upscale_size,
+ }
+
+ def get(self, hires_mode, hires_scale, hires_denoise, hires_softness, hires_detail_boost, hires_contrast_factor,
+ hires_saturation_factor, hires_latent_detailer, final_upscale_size, data=None):
+ if data is None:
+ data = {}
+
+ data[UI.S_HIGH_RESOLUTION] = self.create_dict(
+ hires_mode,
+ hires_scale,
+ hires_denoise,
+ hires_softness,
+ hires_detail_boost,
+ hires_contrast_factor,
+ hires_saturation_factor,
+ hires_latent_detailer,
+ final_upscale_size,
+ )
+
+ return (data,)
diff --git a/modules/ui_image_saving.py b/modules/ui_image_saving.py
new file mode 100644
index 0000000..213bab4
--- /dev/null
+++ b/modules/ui_image_saving.py
@@ -0,0 +1,104 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .ui import UI
+
+
+# ====================================================================================================
+# UI: Image Saving Input
+# ====================================================================================================
+
+class SeargeImageSaving:
+ @classmethod
+ def INPUT_TYPES(cls):
+ return {
+ "required": {
+ "save_parameters_file": ("BOOLEAN", {"default": True},),
+ "save_folder": (UI.SAVE_FOLDERS, {"default": UI.SAVE_TO_OUTPUT_DATE, },),
+ "save_generated_image": ("BOOLEAN", {"default": True},),
+ "embed_workflow_in_generated": ("BOOLEAN", {"default": True},),
+ "generated_image_name": ("STRING", {"multiline": False, "default": "generated", },),
+ "save_high_res_image": ("BOOLEAN", {"default": True},),
+ "embed_workflow_in_high_res": ("BOOLEAN", {"default": True},),
+ "high_res_image_name": ("STRING", {"multiline": False, "default": "high-res", },),
+ "save_upscaled_image": ("BOOLEAN", {"default": True},),
+ "embed_workflow_in_upscaled": ("BOOLEAN", {"default": True},),
+ "upscaled_image_name": ("STRING", {"multiline": False, "default": "upscaled", },),
+ },
+ "optional": {
+ "data": ("SRG_DATA_STREAM",),
+ },
+ }
+
+ RETURN_TYPES = ("SRG_DATA_STREAM",)
+ RETURN_NAMES = ("data",)
+ FUNCTION = "get"
+
+ CATEGORY = UI.CATEGORY_UI_INPUTS
+
+ @staticmethod
+ def create_dict(save_parameters_file, save_folder,
+ save_generated_image, embed_workflow_in_generated, generated_image_name,
+ save_high_res_image, embed_workflow_in_high_res, high_res_image_name,
+ save_upscaled_image, embed_workflow_in_upscaled, upscaled_image_name):
+ return {
+ UI.F_SAVE_PARAMETERS_FILE: save_parameters_file is not None and save_parameters_file,
+ UI.F_SAVE_FOLDER: save_folder,
+ UI.F_SAVE_GENERATED_IMAGE: save_generated_image is not None and save_generated_image,
+ UI.F_EMBED_WORKFLOW_IN_GENERATED: embed_workflow_in_generated is not None and embed_workflow_in_generated,
+ UI.F_GENERATED_IMAGE_NAME: generated_image_name,
+ UI.F_SAVE_HIGH_RES_IMAGE: save_high_res_image is not None and save_high_res_image,
+ UI.F_EMBED_WORKFLOW_IN_HIGH_RES: embed_workflow_in_high_res is not None and embed_workflow_in_high_res,
+ UI.F_HIGH_RES_IMAGE_NAME: high_res_image_name,
+ UI.F_SAVE_UPSCALED_IMAGE: save_upscaled_image is not None and save_upscaled_image,
+ UI.F_EMBED_WORKFLOW_IN_UPSCALED: embed_workflow_in_upscaled is not None and embed_workflow_in_upscaled,
+ UI.F_UPSCALED_IMAGE_NAME: upscaled_image_name,
+ }
+
+ def get(self, save_parameters_file, save_folder,
+ save_generated_image, embed_workflow_in_generated, generated_image_name,
+ save_high_res_image, embed_workflow_in_high_res, high_res_image_name,
+ save_upscaled_image, embed_workflow_in_upscaled, upscaled_image_name, data=None):
+ if data is None:
+ data = {}
+
+ data[UI.S_IMAGE_SAVING] = self.create_dict(
+ save_parameters_file,
+ save_folder,
+ save_generated_image,
+ embed_workflow_in_generated,
+ generated_image_name,
+ save_high_res_image,
+ embed_workflow_in_high_res,
+ high_res_image_name,
+ save_upscaled_image,
+ embed_workflow_in_upscaled,
+ upscaled_image_name,
+ )
+
+ return (data,)
diff --git a/modules/ui_img2img_inpaint.py b/modules/ui_img2img_inpaint.py
new file mode 100644
index 0000000..14a8d1a
--- /dev/null
+++ b/modules/ui_img2img_inpaint.py
@@ -0,0 +1,74 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .ui import UI
+
+
+# ====================================================================================================
+# UI: Template for Input
+# ====================================================================================================
+
+class SeargeImage2ImageAndInpainting:
+ @classmethod
+ def INPUT_TYPES(cls):
+ return {
+ "required": {
+ "denoise": ("FLOAT", {"default": 0.5, "min": 0.0, "max": 1.0, "step": 0.01},),
+ "inpaint_mask_blur": ("INT", {"default": 16, "min": 0, "max": 24, "step": 4},),
+ "inpaint_mask_mode": (UI.MASK_MODES,),
+ },
+ "optional": {
+ "data": ("SRG_DATA_STREAM",),
+ },
+ }
+
+ RETURN_TYPES = ("SRG_DATA_STREAM",)
+ RETURN_NAMES = ("data",)
+ FUNCTION = "get"
+
+ CATEGORY = UI.CATEGORY_UI_INPUTS
+
+ @staticmethod
+ def create_dict(denoise, inpaint_mask_blur, inpaint_mask_mode):
+ return {
+ UI.F_DENOISE: round(denoise, 3),
+ UI.F_INPAINT_MASK_BLUR: inpaint_mask_blur,
+ UI.F_INPAINT_MASK_MODE: inpaint_mask_mode,
+ }
+
+ def get(self, denoise, inpaint_mask_blur, inpaint_mask_mode, data=None):
+ if data is None:
+ data = {}
+
+ data[UI.S_IMG2IMG_INPAINTING] = self.create_dict(
+ denoise,
+ inpaint_mask_blur,
+ inpaint_mask_mode,
+ )
+
+ return (data,)
diff --git a/modules/ui_loras.py b/modules/ui_loras.py
new file mode 100644
index 0000000..484f007
--- /dev/null
+++ b/modules/ui_loras.py
@@ -0,0 +1,125 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .data_utils import retrieve_parameter
+from .ui import UI
+
+
+# ====================================================================================================
+# UI: Loras Input
+# ====================================================================================================
+
+class SeargeLoras:
+ def __init__(self):
+ self.expected_lora_stack_size = None
+
+ @classmethod
+ def INPUT_TYPES(cls):
+ return {
+ "required": {
+ "lora_1": (UI.LORAS_WITH_NONE(),),
+ "lora_1_strength": ("FLOAT", {"default": 0.0, "min": -10.0, "max": 10.0, "step": 0.05},),
+ "lora_2": (UI.LORAS_WITH_NONE(),),
+ "lora_2_strength": ("FLOAT", {"default": 0.0, "min": -10.0, "max": 10.0, "step": 0.05},),
+ "lora_3": (UI.LORAS_WITH_NONE(),),
+ "lora_3_strength": ("FLOAT", {"default": 0.0, "min": -10.0, "max": 10.0, "step": 0.05},),
+ "lora_4": (UI.LORAS_WITH_NONE(),),
+ "lora_4_strength": ("FLOAT", {"default": 0.0, "min": -10.0, "max": 10.0, "step": 0.05},),
+ "lora_5": (UI.LORAS_WITH_NONE(),),
+ "lora_5_strength": ("FLOAT", {"default": 0.0, "min": -10.0, "max": 10.0, "step": 0.05},),
+ },
+ "optional": {
+ "data": ("SRG_DATA_STREAM",),
+ },
+ }
+
+ RETURN_TYPES = ("SRG_DATA_STREAM",)
+ RETURN_NAMES = ("data",)
+ FUNCTION = "get"
+
+ CATEGORY = UI.CATEGORY_UI_INPUTS
+
+ @staticmethod
+ def create_dict(loras, lora_1, lora_1_strength, lora_2, lora_2_strength, lora_3, lora_3_strength,
+ lora_4, lora_4_strength, lora_5, lora_5_strength):
+ loras += [
+ {
+ UI.F_LORA_NAME: lora_1,
+ UI.F_LORA_STRENGTH: round(lora_1_strength, 3),
+ },
+ {
+ UI.F_LORA_NAME: lora_2,
+ UI.F_LORA_STRENGTH: round(lora_2_strength, 3),
+ },
+ {
+ UI.F_LORA_NAME: lora_3,
+ UI.F_LORA_STRENGTH: round(lora_3_strength, 3),
+ },
+ {
+ UI.F_LORA_NAME: lora_4,
+ UI.F_LORA_STRENGTH: round(lora_4_strength, 3),
+ },
+ {
+ UI.F_LORA_NAME: lora_5,
+ UI.F_LORA_STRENGTH: round(lora_5_strength, 3),
+ },
+ ]
+
+ return {
+ UI.F_LORA_STACK: loras,
+ }
+
+ def get(self, lora_1, lora_1_strength, lora_2, lora_2_strength, lora_3, lora_3_strength, lora_4, lora_4_strength,
+ lora_5, lora_5_strength, data=None):
+ if data is None:
+ data = {}
+
+ loras = retrieve_parameter(UI.F_LORA_STACK, retrieve_parameter(UI.S_LORAS, data), [])
+
+ if self.expected_lora_stack_size is None:
+ self.expected_lora_stack_size = len(loras)
+ elif self.expected_lora_stack_size == 0:
+ loras = []
+ elif len(loras) > self.expected_lora_stack_size:
+ loras = loras[:self.expected_lora_stack_size]
+
+ data[UI.S_LORAS] = self.create_dict(
+ loras,
+ lora_1,
+ lora_1_strength,
+ lora_2,
+ lora_2_strength,
+ lora_3,
+ lora_3_strength,
+ lora_4,
+ lora_4_strength,
+ lora_5,
+ lora_5_strength,
+ )
+
+ return (data,)
diff --git a/modules/ui_model_selector.py b/modules/ui_model_selector.py
new file mode 100644
index 0000000..262fb81
--- /dev/null
+++ b/modules/ui_model_selector.py
@@ -0,0 +1,74 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .ui import UI
+
+
+# ====================================================================================================
+# UI: Model Selector Input
+# ====================================================================================================
+
+class SeargeModelSelector:
+ @classmethod
+ def INPUT_TYPES(cls):
+ return {
+ "required": {
+ "base_checkpoint": (UI.CHECKPOINTS(),),
+ "refiner_checkpoint": (UI.CHECKPOINTS_WITH_NONE(),),
+ "vae_checkpoint": (UI.VAE_WITH_EMBEDDED(),),
+ },
+ "optional": {
+ "data": ("SRG_DATA_STREAM",),
+ },
+ }
+
+ RETURN_TYPES = ("SRG_DATA_STREAM",)
+ RETURN_NAMES = ("data",)
+ FUNCTION = "get"
+
+ CATEGORY = UI.CATEGORY_UI_INPUTS
+
+ @staticmethod
+ def create_dict(base_checkpoint, refiner_checkpoint, vae_checkpoint):
+ return {
+ UI.F_BASE_CHECKPOINT: base_checkpoint,
+ UI.F_REFINER_CHECKPOINT: refiner_checkpoint,
+ UI.F_VAE_CHECKPOINT: vae_checkpoint,
+ }
+
+ def get(self, base_checkpoint, refiner_checkpoint, vae_checkpoint, data=None):
+ if data is None:
+ data = {}
+
+ data[UI.S_CHECKPOINTS] = self.create_dict(
+ base_checkpoint,
+ refiner_checkpoint,
+ vae_checkpoint,
+ )
+
+ return (data,)
diff --git a/modules/ui_operating_mode.py b/modules/ui_operating_mode.py
new file mode 100644
index 0000000..8ac172f
--- /dev/null
+++ b/modules/ui_operating_mode.py
@@ -0,0 +1,74 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .ui import UI
+
+
+# ====================================================================================================
+# UI: Operating Mode Input
+# ====================================================================================================
+
+class SeargeOperatingMode:
+ @classmethod
+ def INPUT_TYPES(cls):
+ return {
+ "required": {
+ "workflow_mode": (UI.WORKFLOW_MODES, {"default": UI.WF_MODE_TEXT_TO_IMAGE},),
+ "prompting_mode": (UI.PROMPTING_MODES, {"default": UI.PROMPTING_DEFAULT},),
+ "batch_size": ("INT", {"default": 1, "min": 1, "max": 4, "step": 1},),
+ },
+ "optional": {
+ "data": ("SRG_DATA_STREAM",),
+ },
+ }
+
+ RETURN_TYPES = ("SRG_DATA_STREAM",)
+ RETURN_NAMES = ("data",)
+ FUNCTION = "get"
+
+ CATEGORY = UI.CATEGORY_UI_INPUTS
+
+ @staticmethod
+ def create_dict(workflow_mode, prompting_mode, batch_size):
+ return {
+ UI.F_WORKFLOW_MODE: workflow_mode,
+ UI.F_PROMPTING_MODE: prompting_mode,
+ UI.F_BATCH_SIZE: batch_size,
+ }
+
+ def get(self, workflow_mode, prompting_mode, batch_size, data=None):
+ if data is None:
+ data = {}
+
+ data[UI.S_OPERATING_MODE] = self.create_dict(
+ workflow_mode,
+ prompting_mode,
+ batch_size,
+ )
+
+ return (data,)
diff --git a/modules/ui_preview_image.py b/modules/ui_preview_image.py
new file mode 100644
index 0000000..46e29b3
--- /dev/null
+++ b/modules/ui_preview_image.py
@@ -0,0 +1,79 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+import random
+
+import folder_paths
+import nodes
+
+from .ui import UI
+
+
+# ====================================================================================================
+# Custom Preview Node
+# ====================================================================================================
+
+class SeargePreviewImage(nodes.SaveImage):
+ def __init__(self):
+ super().__init__()
+ self.output_dir = folder_paths.get_temp_directory()
+ self.type = "temp"
+ self.prefix_append = "_temp_" + ''.join(random.choice("abcdefghijklmnopqrstupvxyz") for _ in range(5))
+
+ @classmethod
+ def INPUT_TYPES(cls):
+ return {
+ "required": {
+ "enabled": ("BOOLEAN", {"default": True},),
+ },
+ "optional": {
+ "images": ("IMAGE",),
+ },
+ "hidden": {
+ "prompt": "PROMPT",
+ "extra_pnginfo": "EXTRA_PNGINFO",
+ },
+ }
+
+ RETURN_TYPES = ("IMAGE",)
+ RETURN_NAMES = ("images",)
+ FUNCTION = "preview_images"
+
+ CATEGORY = UI.CATEGORY_UI
+
+ def preview_images(self, enabled, images=None, prompt=None, extra_pnginfo=None):
+ if images is None or not enabled:
+ return {
+ "result": (images,),
+ "ui": {"images": list(), },
+ }
+
+ saved_images = nodes.SaveImage.save_images(self, images, "srg_sdxl_preview", prompt, extra_pnginfo)
+ saved_images["result"] = (images,)
+
+ return saved_images
diff --git a/modules/ui_prompt_styles.py b/modules/ui_prompt_styles.py
new file mode 100644
index 0000000..8142177
--- /dev/null
+++ b/modules/ui_prompt_styles.py
@@ -0,0 +1,68 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .ui import UI
+
+
+# ====================================================================================================
+# UI: Prompt Styles Input
+# ====================================================================================================
+
+class SeargePromptStyles:
+ @classmethod
+ def INPUT_TYPES(cls):
+ return {
+ "required": {
+ # "example": ("FLOAT", {"default": 0.5, "min": 0.0, "max": 1.0, "step": 0.05},),
+ },
+ "optional": {
+ "data": ("SRG_DATA_STREAM",),
+ },
+ }
+
+ RETURN_TYPES = ("SRG_DATA_STREAM",)
+ RETURN_NAMES = ("data",)
+ FUNCTION = "get"
+
+ CATEGORY = UI.CATEGORY_UI_INPUTS
+
+ @staticmethod
+ def create_dict(example):
+ return {
+ UI.EXAMPLE: example,
+ }
+
+ def get(self, data=None):
+ if data is None:
+ data = {}
+
+ data[UI.S_PROMPT_STYLING] = self.create_dict(
+ "example",
+ )
+
+ return (data,)
diff --git a/modules/ui_separator.py b/modules/ui_separator.py
new file mode 100644
index 0000000..0fd48e8
--- /dev/null
+++ b/modules/ui_separator.py
@@ -0,0 +1,51 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .ui import UI
+
+
+# ====================================================================================================
+# UI: Separator
+# ====================================================================================================
+
+class SeargeSeparator:
+ @classmethod
+ def INPUT_TYPES(cls):
+ return {
+ "required": {
+ },
+ }
+
+ RETURN_TYPES = ()
+ RETURN_NAMES = ()
+ FUNCTION = "do_nothing"
+
+ CATEGORY = UI.CATEGORY_UI
+
+ def do_nothing(self):
+ return ()
diff --git a/modules/ui_upscale_models.py b/modules/ui_upscale_models.py
new file mode 100644
index 0000000..7e0a453
--- /dev/null
+++ b/modules/ui_upscale_models.py
@@ -0,0 +1,77 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .ui import UI
+
+
+# ====================================================================================================
+# UI: Upscale Models Input
+# ====================================================================================================
+
+class SeargeUpscaleModels:
+ @classmethod
+ def INPUT_TYPES(cls):
+ return {
+ "required": {
+ "detail_processor": (UI.UPSCALERS_1x_WITH_NONE(),),
+ "high_res_upscaler": (UI.UPSCALERS_4x_WITH_NONE(),),
+ "primary_upscaler": (UI.UPSCALERS_4x_WITH_NONE(),),
+ "secondary_upscaler": (UI.UPSCALERS_4x_WITH_NONE(),),
+ },
+ "optional": {
+ "data": ("SRG_DATA_STREAM",),
+ },
+ }
+
+ RETURN_TYPES = ("SRG_DATA_STREAM",)
+ RETURN_NAMES = ("data",)
+ FUNCTION = "get"
+
+ CATEGORY = UI.CATEGORY_UI_INPUTS
+
+ @staticmethod
+ def create_dict(detail_processor, high_res_upscaler, primary_upscaler, secondary_upscaler):
+ return {
+ UI.F_DETAIL_PROCESSOR: detail_processor,
+ UI.F_HIGH_RES_UPSCALER: high_res_upscaler,
+ UI.F_PRIMARY_UPSCALER: primary_upscaler,
+ UI.F_SECONDARY_UPSCALER: secondary_upscaler,
+ }
+
+ def get(self, detail_processor, high_res_upscaler, primary_upscaler, secondary_upscaler, data=None):
+ if data is None:
+ data = {}
+
+ data[UI.S_UPSCALE_MODELS] = self.create_dict(
+ detail_processor,
+ high_res_upscaler,
+ primary_upscaler,
+ secondary_upscaler,
+ )
+
+ return (data,)
diff --git a/modules/utils.py b/modules/utils.py
new file mode 100644
index 0000000..a1c5336
--- /dev/null
+++ b/modules/utils.py
@@ -0,0 +1,97 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+import torch
+
+
+def next_multiple_of(value, factor):
+ return int(int((value + factor - 1) // factor) * factor)
+
+
+def get_image_size(image):
+ if image is None:
+ return (None, None,)
+
+ (_, height, width, _) = image.shape
+
+ return (width, height,)
+
+
+def get_mask_size(mask):
+ if mask is None:
+ return (None, None,)
+
+ (height, width) = mask.shape
+
+ return (width, height,)
+
+
+def get_latent_size(latent):
+ if latent is None or "samples" not in latent:
+ return (None, None,)
+
+ samples = latent["samples"]
+
+ (_, _, height, width) = samples.shape
+
+ return (width, height,)
+
+
+def get_latent_pixel_size(latent):
+ (width, height) = get_latent_size(latent)
+
+ if width is None or height is None:
+ return (None, None,)
+
+ return (width * 8, height * 8,)
+
+
+def slerp(factor, input1, input2):
+ dims = input1.shape
+
+ input1 = input1.reshape(dims[0], -1)
+ input2 = input2.reshape(dims[0], -1)
+
+ input1_norm = input1 / torch.norm(input1, dim=1, keepdim=True)
+ input2_norm = input2 / torch.norm(input2, dim=1, keepdim=True)
+
+ input1_norm[input1_norm != input1_norm] = 0.0
+ input2_norm[input2_norm != input2_norm] = 0.0
+
+ omega = torch.acos((input1_norm * input2_norm).sum(1))
+ sin_omega = torch.sin(omega)
+
+ result = ((torch.sin((1.0 - factor) * omega) / sin_omega).unsqueeze(1) * input1
+ + (torch.sin(factor * omega) / sin_omega).unsqueeze(1) * input2)
+
+ return result.reshape(dims)
+
+
+def slerp_latents(latent1, latent2, factor):
+ result = slerp(factor, latent1.clone(), latent2.clone())
+ return result
diff --git a/searge_sdxl.py b/searge_sdxl.py
new file mode 100644
index 0000000..23021fa
--- /dev/null
+++ b/searge_sdxl.py
@@ -0,0 +1,139 @@
+"""
+
+Custom nodes for SDXL in ComfyUI
+
+MIT License
+
+Copyright (c) 2023 Searge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+"""
+
+from .modules.ui import Defs
+
+from .modules.prompt_text_input import SeargeTextInputV2
+from .modules.prompt_adapter import SeargePromptAdapterV2
+from .modules.image_adapter import SeargeImageAdapterV2
+from .modules.controlnet_adapter import SeargeControlnetAdapterV2
+
+from .modules.ui_separator import SeargeSeparator
+from .modules.ui_preview_image import SeargePreviewImage
+
+from .modules.ui_model_selector import SeargeModelSelector
+from .modules.ui_upscale_models import SeargeUpscaleModels
+from .modules.ui_loras import SeargeLoras
+from .modules.ui_controlnet_models import SeargeControlnetModels
+
+from .modules.ui_generation_parameters import SeargeGenerationParameters
+from .modules.ui_conditioning_parameters import SeargeConditioningParameters
+from .modules.ui_advanced_parameters import SeargeAdvancedParameters
+from .modules.ui_image_saving import SeargeImageSaving
+from .modules.ui_operating_mode import SeargeOperatingMode
+from .modules.ui_img2img_inpaint import SeargeImage2ImageAndInpainting
+from .modules.ui_custom_prompt_mode import SeargeCustomPromptMode
+from .modules.ui_prompt_styles import SeargePromptStyles
+from .modules.ui_high_resolution import SeargeHighResolution
+from .modules.ui_condition_mixing import SeargeConditionMixing
+
+from .modules.magic_box import SeargeMagicBox
+from .modules.mb_pipeline_start import SeargePipelineStart
+from .modules.mb_pipeline_terminator import SeargePipelineTerminator
+
+from .modules.after_vae_decode import SeargeCustomAfterVaeDecode
+from .modules.after_upscaling import SeargeCustomAfterUpscaling
+
+from .modules.debug_printer import SeargeDebugPrinter
+
+
+# ====================================================================================================
+# Register nodes in ComfyUI
+# ====================================================================================================
+
+SEARGE_CLASS_MAPPINGS = {
+ f"SeargeTextInputV2{Defs.CLASS_POSTFIX}": SeargeTextInputV2,
+ f"SeargePromptAdapterV2{Defs.CLASS_POSTFIX}": SeargePromptAdapterV2,
+ f"SeargeImageAdapterV2{Defs.CLASS_POSTFIX}": SeargeImageAdapterV2,
+ f"SeargeControlnetAdapterV2{Defs.CLASS_POSTFIX}": SeargeControlnetAdapterV2,
+
+ f"SeargeSeparator{Defs.CLASS_POSTFIX}": SeargeSeparator,
+ f"SeargePreviewImage{Defs.CLASS_POSTFIX}": SeargePreviewImage,
+
+ f"SeargeAdvancedParameters{Defs.CLASS_POSTFIX}": SeargeAdvancedParameters,
+ f"SeargeConditioningParameters{Defs.CLASS_POSTFIX}": SeargeConditioningParameters,
+ f"SeargeConditionMixing{Defs.CLASS_POSTFIX}": SeargeConditionMixing,
+ f"SeargeControlnetModels{Defs.CLASS_POSTFIX}": SeargeControlnetModels,
+ f"SeargeCustomPromptMode{Defs.CLASS_POSTFIX}": SeargeCustomPromptMode,
+ f"SeargeGenerationParameters{Defs.CLASS_POSTFIX}": SeargeGenerationParameters,
+ f"SeargeHighResolution{Defs.CLASS_POSTFIX}": SeargeHighResolution,
+ f"SeargeImage2ImageAndInpainting{Defs.CLASS_POSTFIX}": SeargeImage2ImageAndInpainting,
+ f"SeargeImageSaving{Defs.CLASS_POSTFIX}": SeargeImageSaving,
+ f"SeargeLoras{Defs.CLASS_POSTFIX}": SeargeLoras,
+ f"SeargeModelSelector{Defs.CLASS_POSTFIX}": SeargeModelSelector,
+ f"SeargeOperatingMode{Defs.CLASS_POSTFIX}": SeargeOperatingMode,
+ f"SeargePromptStyles{Defs.CLASS_POSTFIX}": SeargePromptStyles,
+ f"SeargeUpscaleModels{Defs.CLASS_POSTFIX}": SeargeUpscaleModels,
+
+ f"SeargeMagicBox{Defs.CLASS_POSTFIX}": SeargeMagicBox,
+ f"SeargePipelineStart{Defs.CLASS_POSTFIX}": SeargePipelineStart,
+ f"SeargePipelineTerminator{Defs.CLASS_POSTFIX}": SeargePipelineTerminator,
+
+ f"SeargeCustomAfterVaeDecode{Defs.CLASS_POSTFIX}": SeargeCustomAfterVaeDecode,
+ f"SeargeCustomAfterUpscaling{Defs.CLASS_POSTFIX}": SeargeCustomAfterUpscaling,
+
+ f"SeargeDebugPrinter{Defs.CLASS_POSTFIX}": SeargeDebugPrinter,
+}
+
+# ====================================================================================================
+# Human readable names for the nodes
+# ====================================================================================================
+
+SEARGE_DISPLAY_NAME_MAPPINGS = {
+ f"SeargeTextInputV2{Defs.CLASS_POSTFIX}": "Text Input v2",
+ f"SeargePromptAdapterV2{Defs.CLASS_POSTFIX}": "Prompt Adapter v2",
+ f"SeargeImageAdapterV2{Defs.CLASS_POSTFIX}": "Image Adapter v2",
+ f"SeargeControlnetAdapterV2{Defs.CLASS_POSTFIX}": "Controlnet Adapter v2",
+
+ f"SeargeSeparator{Defs.CLASS_POSTFIX}": "Separator",
+ f"SeargePreviewImage{Defs.CLASS_POSTFIX}": "SeargePreviewImage",
+
+ f"SeargeAdvancedParameters{Defs.CLASS_POSTFIX}": "Advanced Parameters v2",
+ f"SeargeConditioningParameters{Defs.CLASS_POSTFIX}": "Conditioning Parameters v2",
+ f"SeargeConditionMixing{Defs.CLASS_POSTFIX}": "Condition Mixing v2",
+ f"SeargeControlnetModels{Defs.CLASS_POSTFIX}": "Controlnet Models Selector v2",
+ f"SeargeCustomPromptMode{Defs.CLASS_POSTFIX}": "Custom Prompt Mode v2",
+ f"SeargeGenerationParameters{Defs.CLASS_POSTFIX}": "Generation Parameters v2",
+ f"SeargeHighResolution{Defs.CLASS_POSTFIX}": "High Resolution v2",
+ f"SeargeImage2ImageAndInpainting{Defs.CLASS_POSTFIX}": "Image to Image and Inpainting v2",
+ f"SeargeImageSaving{Defs.CLASS_POSTFIX}": "Image Saving v2",
+ f"SeargeLoras{Defs.CLASS_POSTFIX}": "Lora Selector v2",
+ f"SeargeModelSelector{Defs.CLASS_POSTFIX}": "Model Selector v2",
+ f"SeargeOperatingMode{Defs.CLASS_POSTFIX}": "Operating Mode v2",
+ f"SeargePromptStyles{Defs.CLASS_POSTFIX}": "Prompt Styles v2",
+ f"SeargeUpscaleModels{Defs.CLASS_POSTFIX}": "Upscale Models Selector v2",
+
+ f"SeargeMagicBox{Defs.CLASS_POSTFIX}": "Searge's Magic Box for SDXL",
+ f"SeargePipelineStart{Defs.CLASS_POSTFIX}": "Magic Box Pipeline Start",
+ f"SeargePipelineTerminator{Defs.CLASS_POSTFIX}": "Magic Box Pipeline Terminator",
+
+ f"SeargeCustomAfterVaeDecode{Defs.CLASS_POSTFIX}": "After VAE Decode",
+ f"SeargeCustomAfterUpscaling{Defs.CLASS_POSTFIX}": "After Upscaling",
+
+ f"SeargeDebugPrinter{Defs.CLASS_POSTFIX}": "Debug Printer",
+}
diff --git a/searge_sdxl_sampler_node.py b/searge_sdxl_sampler_node.py
deleted file mode 100644
index 2b18465..0000000
--- a/searge_sdxl_sampler_node.py
+++ /dev/null
@@ -1,673 +0,0 @@
-"""
-
-Custom nodes for SDXL in ComfyUI
-
-MIT License
-
-Copyright (c) 2023 Searge
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-"""
-
-import datetime
-
-import comfy.samplers
-import comfy_extras.nodes_upscale_model
-import comfy_extras.nodes_post_processing
-import folder_paths
-import json
-import nodes
-import numpy as np
-import os
-
-from comfy.cli_args import args
-from datetime import datetime
-from PIL import Image
-from PIL.PngImagePlugin import PngInfo
-
-from .modules.sampling import SeargeSDXLSampler2
-from .modules.sampling import SeargeSDXLImage2ImageSampler2
-# from .modules.sampling import SeargeSDXLSamplerV3
-# from .modules.sampling import SeargeSDXLImage2ImageSamplerV3
-
-from .modules.prompting import SeargeSDXLPromptEncoder
-from .modules.prompting import SeargeSDXLBasePromptEncoder
-from .modules.prompting import SeargeSDXLRefinerPromptEncoder
-
-from .modules.prompting import SeargePromptText
-from .modules.prompting import SeargePromptCombiner
-
-from .modules.processing import SeargeParameterProcessor
-from .modules.processing import SeargeStylePreprocessor
-
-from .modules.ui import SeargeInput1
-from .modules.ui import SeargeOutput1
-from .modules.ui import SeargeInput2
-from .modules.ui import SeargeOutput2
-from .modules.ui import SeargeInput3
-from .modules.ui import SeargeOutput3
-from .modules.ui import SeargeInput4
-from .modules.ui import SeargeOutput4
-from .modules.ui import SeargeInput5
-from .modules.ui import SeargeOutput5
-from .modules.ui import SeargeInput6
-from .modules.ui import SeargeOutput6
-from .modules.ui import SeargeInput7
-from .modules.ui import SeargeOutput7
-from .modules.ui import SeargeGenerated1
-
-from .modules.legacy import SeargeSDXLSampler
-from .modules.legacy import SeargeSDXLImage2ImageSampler
-
-
-# Input: sampler inputs
-
-class SeargeSamplerInputs:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "sampler_name": (comfy.samplers.KSampler.SAMPLERS, {"default": "ddim"}),
- "scheduler": (comfy.samplers.KSampler.SCHEDULERS, {"default": "ddim_uniform"}),
- },
- }
-
- RETURN_TYPES = ("SAMPLER_NAME", "SCHEDULER_NAME", )
- RETURN_NAMES = ("sampler_name", "scheduler", )
- FUNCTION = "get_value"
-
- CATEGORY = "Searge/Inputs"
-
- def get_value(self, sampler_name, scheduler, ):
- return (sampler_name, scheduler, )
-
-
-# Input: enabler inputs
-
-class SeargeEnablerInputs:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "state": (SeargeParameterProcessor.STATES, {"default": SeargeParameterProcessor.STATES[1]}),
- },
- }
-
- RETURN_TYPES = ("ENABLE_STATE", )
- RETURN_NAMES = ("state", )
- FUNCTION = "get_value"
-
- CATEGORY = "Searge/Inputs"
-
- def get_value(self, state, ):
- return (state, )
-
-
-# Input: save folder inputs
-
-class SeargeSaveFolderInputs:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "save_to": (SeargeParameterProcessor.SAVE_TO, {"default": SeargeParameterProcessor.SAVE_TO[0]}),
- },
- }
-
- RETURN_TYPES = ("SAVE_FOLDER", )
- RETURN_NAMES = ("save_to", )
- FUNCTION = "get_value"
-
- CATEGORY = "Searge/Inputs"
-
- def get_value(self, save_to, ):
- return (save_to, )
-
-
-# Tool: integer constant
-
-class SeargeIntegerConstant:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "value": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}),
- },
- }
-
- RETURN_TYPES = ("INT", )
- RETURN_NAMES = ("value", )
- FUNCTION = "get_value"
-
- CATEGORY = "Searge/Integers"
-
- def get_value(self, value, ):
- return (value,)
-
-
-# Tool: integer pair
-
-class SeargeIntegerPair:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "value1": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}),
- "value2": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}),
- },
- }
-
- RETURN_TYPES = ("INT", "INT", )
- RETURN_NAMES = ("value 1", "value 2", )
- FUNCTION = "get_value"
-
- CATEGORY = "Searge/Integers"
-
- def get_value(self, value1, value2, ):
- return (value1,value2,)
-
-
-# Tool: integer math
-
-class SeargeIntegerMath:
- OPERATIONS = ["a * b + c", "a + c", "a - c", "a * b", "a / b"]
-
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "op": (SeargeIntegerMath.OPERATIONS, {"default": "a * b + c"}),
- "a": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}),
- "b": ("INT", {"default": 1, "min": 0, "max": 0xffffffffffffffff}),
- "c": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}),
- },
- }
-
- RETURN_TYPES = ("INT", )
- RETURN_NAMES = ("result", )
- FUNCTION = "get_value"
-
- CATEGORY = "Searge/Integers"
-
- def get_value(self, op, a, b, c, ):
- res = 0
- if op == "a * b + c":
- res = a * b + c
- elif op == "a + c":
- res = a + c
- elif op == "a - c":
- res = a - c
- elif op == "a * b":
- res = a * b
- elif op == "a / b":
- res = a // b
- return (int(res),)
-
-
-# Tool: integer scaler
-
-class SeargeIntegerScaler:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "value": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}),
- "factor": ("FLOAT", {"default": 1.0, "step": 0.01}),
- "multiple_of": ("INT", {"default": 1, "min": 0, "max": 65536}),
- },
- }
-
- RETURN_TYPES = ("INT", )
- RETURN_NAMES = ("value", )
- FUNCTION = "get_value"
-
- CATEGORY = "Searge/Integers"
-
- def get_value(self, value, factor, multiple_of, ):
- return (int(value * factor // multiple_of) * multiple_of, )
-
-
-# Tool: float constant
-
-class SeargeFloatConstant:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "value": ("FLOAT", {"default": 0.0, "step": 0.01}),
- },
- }
-
- RETURN_TYPES = ("FLOAT", )
- RETURN_NAMES = ("value", )
- FUNCTION = "get_value"
-
- CATEGORY = "Searge/Floats"
-
- def get_value(self, value, ):
- return (value,)
-
-
-# Tool: float pair
-
-class SeargeFloatPair:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "value1": ("FLOAT", {"default": 0.0, "step": 0.01}),
- "value2": ("FLOAT", {"default": 0.0, "step": 0.01}),
- },
- }
-
- RETURN_TYPES = ("FLOAT", "FLOAT", )
- RETURN_NAMES = ("value 1", "value 2", )
- FUNCTION = "get_value"
-
- CATEGORY = "Searge/Floats"
-
- def get_value(self, value1, value2, ):
- return (value1,value2,)
-
-
-# Tool: float math
-
-class SeargeFloatMath:
- OPERATIONS = ["a * b + c", "a + c", "a - c", "a * b", "a / b"]
-
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "op": (SeargeFloatMath.OPERATIONS, {"default": "a * b + c"}),
- "a": ("FLOAT", {"default": 0.0, "step": 0.01}),
- "b": ("FLOAT", {"default": 1.0, "step": 0.01}),
- "c": ("FLOAT", {"default": 0.0, "step": 0.01}),
- },
- }
-
- RETURN_TYPES = ("FLOAT", )
- RETURN_NAMES = ("result", )
- FUNCTION = "get_value"
-
- CATEGORY = "Searge/Floats"
-
- def get_value(self, op, a, b, c, ):
- res = 0.0
- if op == "a * b + c":
- res = a * b + c
- elif op == "a + c":
- res = a + c
- elif op == "a - c":
- res = a - c
- elif op == "a * b":
- res = a * b
- elif op == "a / b":
- res = a / b
- return (res,)
-
-
-# Util: custom save node (without preview)
-
-class SeargeImageSave:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "images": ("IMAGE", ),
- "filename_prefix": ("STRING", {"default": "SeargeSDXL-%date%/Image"}),
- "state": ("ENABLE_STATE", {"default": SeargeParameterProcessor.STATES[1]}),
- "save_to": ("SAVE_FOLDER", {"default": SeargeParameterProcessor.SAVE_TO[0]}),
- },
- "hidden": {
- "prompt": "PROMPT", "extra_pnginfo": "EXTRA_PNGINFO"
- },
- }
-
- RETURN_TYPES = ()
- FUNCTION = "save_images"
-
- OUTPUT_NODE = True
-
- CATEGORY = "Searge/Files"
-
- def save_images(self, images, filename_prefix, state, save_to, prompt=None, extra_pnginfo=None):
- # "disabled"
- if state == SeargeParameterProcessor.STATES[0]:
- return {}
-
- # "input folder"
- if save_to == SeargeParameterProcessor.SAVE_TO[1]:
- output_dir = folder_paths.get_input_directory()
- filename_prefix = "output-%date%"
- # incl. SeargeParameterProcessor.SAVE_TO[0] -> "output folder"
- else:
- output_dir = folder_paths.get_output_directory()
-
- filename_prefix = filename_prefix.replace("%date%", datetime.now().strftime("%Y-%m-%d"))
-
- full_output_folder, filename, counter, subfolder, filename_prefix = folder_paths.get_save_image_path(filename_prefix, output_dir, images[0].shape[1], images[0].shape[0])
-
- for image in images:
- i = 255. * image.cpu().numpy()
- img = Image.fromarray(np.clip(i, 0, 255).astype(np.uint8))
- metadata = None
- if args.disable_metadata is None or not args.disable_metadata:
- metadata = PngInfo()
- if prompt is not None:
- metadata.add_text("prompt", json.dumps(prompt))
- if extra_pnginfo is not None:
- for x in extra_pnginfo:
- metadata.add_text(x, json.dumps(extra_pnginfo[x]))
-
- file = f"{filename}_{counter:05}_.png"
- img.save(os.path.join(full_output_folder, file), pnginfo=metadata, compress_level=4)
-
- counter += 1
-
- return {}
-
-
-# Util: custom checkpoint loader
-
-class SeargeCheckpointLoader:
- def __init__(self):
- self.chkp_loader = nodes.CheckpointLoaderSimple()
-
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "ckpt_name": ("CHECKPOINT_NAME", ),
- },
- }
- RETURN_TYPES = ("MODEL", "CLIP", "VAE", )
- FUNCTION = "load_checkpoint"
-
- CATEGORY = "Searge/Files"
-
- def load_checkpoint(self, ckpt_name, ):
- return self.chkp_loader.load_checkpoint(ckpt_name)
-
-
-# Util: custom vae loader
-
-class SeargeVAELoader:
- def __init__(self):
- self.vae_loader = nodes.VAELoader()
-
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "vae_name": ("VAE_NAME", ),
- },
- }
- RETURN_TYPES = ("VAE", )
- FUNCTION = "load_vae"
-
- CATEGORY = "Searge/Files"
-
- def load_vae(self, vae_name, ):
- return self.vae_loader.load_vae(vae_name)
-
-
-# Util: custom upscale model loader
-
-class SeargeUpscaleModelLoader:
- def __init__(self):
- self.upscale_model_loader = comfy_extras.nodes_upscale_model.UpscaleModelLoader()
-
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "upscaler_name": ("UPSCALER_NAME", ),
- },
- }
- RETURN_TYPES = ("UPSCALE_MODEL", )
- FUNCTION = "load_upscaler"
-
- CATEGORY = "Searge/Files"
-
- def load_upscaler(self, upscaler_name, ):
- return self.upscale_model_loader.load_model(upscaler_name)
-
-
-# Util: custom upscale model loader
-
-class SeargeLoraLoader:
- def __init__(self):
- self.lora_loader = nodes.LoraLoader()
-
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "model": ("MODEL",),
- "clip": ("CLIP",),
- "lora_name": ("LORA_NAME",),
- "strength_model": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}),
- "strength_clip": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}),
- },
- }
- RETURN_TYPES = ("MODEL", "CLIP", )
- FUNCTION = "load_lora"
-
- CATEGORY = "Searge/Files"
-
- def load_lora(self, model, clip, lora_name, strength_model, strength_clip, ):
- return self.lora_loader.load_lora(model, clip, lora_name, strength_model, strength_clip)
-
-
-# Tool: Muxer for selecting between 3 latent inputs
-
-class SeargeLatentMuxer3:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "input0": ("LATENT", ),
- "input1": ("LATENT", ),
- "input2": ("LATENT", ),
- "input_selector": ("INT", {"default": 0, "min": 0, "max": 2}),
- },
- }
-
- RETURN_TYPES = ("LATENT", )
- RETURN_NAMES = ("output", )
- FUNCTION = "mux"
-
- CATEGORY = "Searge/FlowControl"
-
- def mux(self, input0, input1, input2, input_selector, ):
- if input_selector == 1:
- return (input1,)
- elif input_selector == 2:
- return (input2,)
- else:
- return (input0, )
-
-
-# Tool: Muxer for selecting between 5 conditioning inputs
-
-class SeargeConditioningMuxer2:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "input0": ("CONDITIONING", ),
- "input1": ("CONDITIONING", ),
- "input_selector": ("INT", {"default": 0, "min": 0, "max": 1}),
- },
- }
-
- RETURN_TYPES = ("CONDITIONING", )
- RETURN_NAMES = ("output", )
- FUNCTION = "mux"
-
- CATEGORY = "Searge/FlowControl"
-
- def mux(self, input0, input1, input_selector, ):
- if input_selector == 1:
- return (input1,)
- else:
- return (input0, )
-
-
-# Tool: Muxer for selecting between 5 conditioning inputs
-
-class SeargeConditioningMuxer5:
- @classmethod
- def INPUT_TYPES(s):
- return {"required": {
- "input0": ("CONDITIONING", ),
- "input1": ("CONDITIONING", ),
- "input2": ("CONDITIONING", ),
- "input3": ("CONDITIONING", ),
- "input4": ("CONDITIONING", ),
- "input_selector": ("INT", {"default": 0, "min": 0, "max": 4}),
- },
- }
-
- RETURN_TYPES = ("CONDITIONING", )
- RETURN_NAMES = ("output", )
- FUNCTION = "mux"
-
- CATEGORY = "Searge/FlowControl"
-
- def mux(self, input0, input1, input2, input3, input4, input_selector, ):
- if input_selector == 1:
- return (input1,)
- elif input_selector == 2:
- return (input2,)
- elif input_selector == 3:
- return (input3,)
- elif input_selector == 4:
- return (input4,)
- else:
- return (input0, )
-
-
-# Register nodes in ComfyUI
-
-NODE_CLASS_MAPPINGS = {
- "SeargeSDXLSampler2": SeargeSDXLSampler2,
- "SeargeSDXLImage2ImageSampler2": SeargeSDXLImage2ImageSampler2,
-# "SeargeSDXLSamplerV3": SeargeSDXLSamplerV3,
-# "SeargeSDXLImage2ImageSamplerV3": SeargeSDXLImage2ImageSamplerV3,
-
- "SeargeSamplerInputs": SeargeSamplerInputs,
- "SeargeEnablerInputs": SeargeEnablerInputs,
- "SeargeSaveFolderInputs": SeargeSaveFolderInputs,
-
- "SeargeSDXLPromptEncoder": SeargeSDXLPromptEncoder,
- "SeargeSDXLBasePromptEncoder": SeargeSDXLBasePromptEncoder,
- "SeargeSDXLRefinerPromptEncoder": SeargeSDXLRefinerPromptEncoder,
-
- "SeargePromptText": SeargePromptText,
- "SeargePromptCombiner": SeargePromptCombiner,
-
- "SeargeIntegerConstant": SeargeIntegerConstant,
- "SeargeIntegerPair": SeargeIntegerPair,
- "SeargeIntegerMath": SeargeIntegerMath,
- "SeargeIntegerScaler": SeargeIntegerScaler,
-
- "SeargeFloatConstant": SeargeFloatConstant,
- "SeargeFloatPair": SeargeFloatPair,
- "SeargeFloatMath": SeargeFloatMath,
-
- "SeargeImageSave": SeargeImageSave,
- "SeargeCheckpointLoader": SeargeCheckpointLoader,
- "SeargeVAELoader": SeargeVAELoader,
- "SeargeUpscaleModelLoader": SeargeUpscaleModelLoader,
- "SeargeLoraLoader": SeargeLoraLoader,
-
- "SeargeLatentMuxer3": SeargeLatentMuxer3,
- "SeargeConditioningMuxer2": SeargeConditioningMuxer2,
- "SeargeConditioningMuxer5": SeargeConditioningMuxer5,
-
- "SeargeParameterProcessor": SeargeParameterProcessor,
- "SeargeStylePreprocessor": SeargeStylePreprocessor,
-
- "SeargeInput1": SeargeInput1,
- "SeargeOutput1": SeargeOutput1,
- "SeargeInput2": SeargeInput2,
- "SeargeOutput2": SeargeOutput2,
- "SeargeInput3": SeargeInput3,
- "SeargeOutput3": SeargeOutput3,
- "SeargeInput4": SeargeInput4,
- "SeargeOutput4": SeargeOutput4,
- "SeargeInput5": SeargeInput5,
- "SeargeOutput5": SeargeOutput5,
- "SeargeInput6": SeargeInput6,
- "SeargeOutput6": SeargeOutput6,
- "SeargeInput7": SeargeInput7,
- "SeargeOutput7": SeargeOutput7,
- "SeargeGenerated1": SeargeGenerated1,
-
- "SeargeSDXLSampler": SeargeSDXLSampler,
- "SeargeSDXLImage2ImageSampler": SeargeSDXLImage2ImageSampler,
-}
-
-
-# Human readable names for the nodes
-
-NODE_DISPLAY_NAME_MAPPINGS = {
- "SeargeSDXLSampler2": "SDXL Sampler v2 (Searge)",
- "SeargeSDXLImage2ImageSampler2": "Image2Image Sampler v2 (Searge)",
-# "SeargeSDXLSamplerV3": "SDXL Sampler v3 (Searge)",
-# "SeargeSDXLImage2ImageSamplerV3": "Image2Image Sampler v3 (Searge)",
-
- "SeargeSamplerInputs": "Sampler Settings",
- "SeargeEnablerInputs": "Enable / Disable",
- "SeargeSaveFolderInputs": "Save Folder",
-
- "SeargeSDXLPromptEncoder": "SDXL Prompt Encoder (Searge)",
- "SeargeSDXLBasePromptEncoder": "SDXL Base Prompt Encoder (Searge)",
- "SeargeSDXLRefinerPromptEncoder": "SDXL Refiner Prompt Encoder (Searge)",
-
- "SeargePromptText": "Prompt text input",
- "SeargePromptCombiner": "Prompt combiner",
-
- "SeargeIntegerConstant": "Integer Constant",
- "SeargeIntegerPair": "Integer Pair",
- "SeargeIntegerMath": "Integer Math",
- "SeargeIntegerScaler": "Integer Scaler",
-
- "SeargeFloatConstant": "Float Constant",
- "SeargeFloatPair": "Float Pair",
- "SeargeFloatMath": "Float Math",
-
- "SeargeImageSave": "Save Image (Searge)",
- "SeargeCheckpointLoader": "Checkpoint Loader (Searge)",
- "SeargeVAELoader": "VAE Loader (Searge)",
- "SeargeUpscaleModelLoader": "Upscale Model Loader (Searge)",
- "SeargeLoraLoader": "Lora Loader (Searge)",
-
- "SeargeLatentMuxer3": "3-Way Muxer for Latents",
- "SeargeConditioningMuxer2": "2-Way Muxer for Conditioning",
- "SeargeConditioningMuxer5": "5-Way Muxer for Conditioning",
-
- "SeargeParameterProcessor": "Parameter Processor",
- "SeargeStylePreprocessor": "Style Preprocessor (wip)",
-
- "SeargeInput1": "Prompts",
- "SeargeOutput1": "Prompts",
- "SeargeInput2": "Generation Parameters",
- "SeargeOutput2": "Generation Parameters",
- "SeargeInput3": "Advanced Parameters",
- "SeargeOutput3": "Advanced Parameters",
- "SeargeInput4": "Model Names",
- "SeargeOutput4": "Model Names",
- "SeargeInput5": "Prompt Processing",
- "SeargeOutput5": "Prompt Processing",
- "SeargeInput6": "HiResFix Parameters",
- "SeargeOutput6": "HiResFix Parameters",
- "SeargeInput7": "Misc Parameters",
- "SeargeOutput7": "Misc Parameters",
- "SeargeGenerated1": "Flow Control Parameters",
-
- "SeargeSDXLSampler": "Legacy SDXL Sampler (Searge)",
- "SeargeSDXLImage2ImageSampler": "Legacy Image2Image Sampler (Searge)",
-}
diff --git a/workflow/Searge-SDXL-Reborn-v3_3.json b/workflow/Searge-SDXL-Reborn-v3_3.json
deleted file mode 100644
index 8d36cff..0000000
--- a/workflow/Searge-SDXL-Reborn-v3_3.json
+++ /dev/null
@@ -1,19375 +0,0 @@
-{
- "last_node_id": 460,
- "last_link_id": 1268,
- "nodes": [
- {
- "id": 133,
- "type": "SeargeInput2",
- "pos": [
- 530,
- 40
- ],
- "size": {
- "0": 320,
- "1": 280
- },
- "flags": {
- "pinned": true
- },
- "order": 30,
- "mode": 0,
- "inputs": [
- {
- "name": "inputs",
- "type": "PARAMETER_INPUTS",
- "link": 440,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "inputs",
- "type": "PARAMETER_INPUTS",
- "links": [
- 439
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeInput2"
- },
- "widgets_values": [
- 4815162342,
- "randomize",
- 1024,
- 1024,
- 30,
- 7,
- "dpmpp_2m",
- "karras",
- "enabled",
- "output folder"
- ],
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 143,
- "type": "SeargeInput5",
- "pos": [
- 860,
- 40
- ],
- "size": {
- "0": 320,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 23,
- "mode": 0,
- "inputs": [
- {
- "name": "inputs",
- "type": "PARAMETER_INPUTS",
- "link": 736,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "inputs",
- "type": "PARAMETER_INPUTS",
- "links": [
- 440
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeInput5"
- },
- "widgets_values": [
- 2,
- 2,
- 0.333,
- 0.667,
- "none"
- ],
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 136,
- "type": "SeargeInput3",
- "pos": [
- 530,
- 360
- ],
- "size": {
- "0": 320,
- "1": 250
- },
- "flags": {
- "pinned": true
- },
- "order": 36,
- "mode": 0,
- "inputs": [
- {
- "name": "inputs",
- "type": "PARAMETER_INPUTS",
- "link": 439,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "inputs",
- "type": "PARAMETER_INPUTS",
- "links": [
- 722
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeInput3"
- },
- "widgets_values": [
- 0.7999999999999998,
- 0.7499999999999998,
- "hard",
- 0,
- 1,
- 2,
- "enabled",
- 0.5
- ],
- "color": "#332922",
- "bgcolor": "#593930"
- },
- {
- "id": 154,
- "type": "SeargeInput4",
- "pos": [
- 530,
- 650
- ],
- "size": {
- "0": 650,
- "1": 240
- },
- "flags": {
- "pinned": true
- },
- "order": 0,
- "mode": 0,
- "inputs": [
- {
- "name": "model_settings",
- "type": "MODEL_SETTINGS",
- "link": null
- }
- ],
- "outputs": [
- {
- "name": "model_names",
- "type": "MODEL_NAMES",
- "links": [
- 931
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeInput4"
- },
- "widgets_values": [
- "sd_xl_base_1.0.safetensors",
- "sd_xl_refiner_1.0.safetensors",
- "sdxl-vae.safetensors",
- "4x_NMKD-Siax_200k.pth",
- "4x-UltraSharp.pth",
- "sd_xl_offset_example-lora_1.0.safetensors"
- ],
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 19,
- "type": "PreviewImage",
- "pos": [
- 1190,
- 40
- ],
- "size": {
- "0": 520,
- "1": 540
- },
- "flags": {
- "pinned": true
- },
- "order": 296,
- "mode": 0,
- "inputs": [
- {
- "name": "images",
- "type": "IMAGE",
- "link": 225,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "PreviewImage"
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 126,
- "type": "Note",
- "pos": [
- 1190,
- 620
- ],
- "size": {
- "0": 520,
- "1": 430
- },
- "flags": {
- "pinned": true
- },
- "order": 1,
- "mode": 0,
- "title": "Workflow Information",
- "properties": {
- "text": ""
- },
- "widgets_values": [
- "=== How to prompt this workflow in other prompt modes than \"simple\" ===\n\nMain Prompt\n-----------\nThe subject of the image in natural language\n* Example: a cat with a hat in a grass field\n\n\nSecondary Prompt\n----------------\nA keyword/tag list version of the main prompts\n* Example: cat with hat, in grass field\n\n\nStyle and References Prompt\n---------------------------\nA description of the style of the image, the main style should be the first word\n* Example: ~*~oil painting~*~ in the style of [artist name], vibrant colors\n\n\nNegative Prompt\n---------------\nSubjects that should not appear in the image\n* Example: jpeg artifacts, noise\n\n\nNegative Style Prompt\n---------------------\nStyles and concepts that should not be used to generate the image\n* Example: photograph, anime\n\n === In \"simple\" prompt mode only the main and negative prompts are used ===\n === In \"3 prompts\" prompt mode it's main, secondary, and negative prompts ==="
- ],
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 172,
- "type": "Reroute",
- "pos": [
- -3940,
- 2040
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 58,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 533,
- "pos": [
- 37.5,
- 0
- ],
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "PARAMETERS",
- "links": [
- 553
- ],
- "slot_index": 0,
- "label": "data"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 174,
- "type": "Reroute",
- "pos": [
- -2400,
- 2100
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 63,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 929,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "MODEL",
- "links": [
- 561
- ],
- "label": "b m"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 176,
- "type": "Reroute",
- "pos": [
- -2400,
- 2200
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 64,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 930,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CLIP",
- "links": [
- 562
- ],
- "label": "b c"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 175,
- "type": "Reroute",
- "pos": [
- -2400,
- 2600
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 24,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 936,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "MODEL",
- "links": [
- 563
- ],
- "label": "r m"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 177,
- "type": "Reroute",
- "pos": [
- -2400,
- 2700
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 25,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 937,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CLIP",
- "links": [
- 564
- ],
- "label": "r c"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 178,
- "type": "Reroute",
- "pos": [
- -2400,
- 2900
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 26,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 939,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "VAE",
- "links": [
- 588
- ],
- "label": "vae"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#322",
- "bgcolor": "#533"
- },
- {
- "id": 180,
- "type": "Reroute",
- "pos": [
- -2400,
- 3400
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 28,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 943,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "UPSCALE_MODEL",
- "links": [
- 697
- ],
- "label": "up 2"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 51,
- "type": "SeargeIntegerScaler",
- "pos": [
- -3699.7040965118426,
- 5030.6233893932895
- ],
- "size": {
- "0": 300,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 81,
- "mode": 0,
- "inputs": [
- {
- "name": "value",
- "type": "INT",
- "link": 1034,
- "widget": {
- "name": "value",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 18446744073709552000
- }
- ]
- },
- "slot_index": 0
- },
- {
- "name": "factor",
- "type": "FLOAT",
- "link": 501,
- "widget": {
- "name": "factor",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "step": 0.01
- }
- ]
- },
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "value",
- "type": "INT",
- "links": [
- 210,
- 211
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Base Width Scaler",
- "properties": {
- "Node name for S&R": "SeargeIntegerScaler"
- },
- "widgets_values": [
- 0,
- 1,
- 8
- ],
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 52,
- "type": "SeargeIntegerScaler",
- "pos": [
- -3699.7040965118426,
- 5230.6233893932895
- ],
- "size": {
- "0": 300,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 82,
- "mode": 0,
- "inputs": [
- {
- "name": "value",
- "type": "INT",
- "link": 1035,
- "widget": {
- "name": "value",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 18446744073709552000
- }
- ]
- },
- "slot_index": 0
- },
- {
- "name": "factor",
- "type": "FLOAT",
- "link": 502,
- "widget": {
- "name": "factor",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "step": 0.01
- }
- ]
- },
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "value",
- "type": "INT",
- "links": [
- 212,
- 213
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Base Height Scaler",
- "properties": {
- "Node name for S&R": "SeargeIntegerScaler"
- },
- "widgets_values": [
- 0,
- 1,
- 8
- ],
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 54,
- "type": "SeargeIntegerScaler",
- "pos": [
- -3699.7040965118426,
- 5430.6233893932895
- ],
- "size": {
- "0": 300,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 83,
- "mode": 0,
- "inputs": [
- {
- "name": "value",
- "type": "INT",
- "link": 1031,
- "widget": {
- "name": "value",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 18446744073709552000
- }
- ]
- },
- "slot_index": 0
- },
- {
- "name": "factor",
- "type": "FLOAT",
- "link": 503,
- "widget": {
- "name": "factor",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "step": 0.01
- }
- ]
- },
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "value",
- "type": "INT",
- "links": [
- 214,
- 215
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Refiner Width Scaler",
- "properties": {
- "Node name for S&R": "SeargeIntegerScaler"
- },
- "widgets_values": [
- 0,
- 1,
- 8
- ],
- "color": "#2a363b",
- "bgcolor": "#3f5159"
- },
- {
- "id": 53,
- "type": "SeargeIntegerScaler",
- "pos": [
- -3699.7040965118426,
- 5630.6233893932895
- ],
- "size": {
- "0": 300,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 84,
- "mode": 0,
- "inputs": [
- {
- "name": "value",
- "type": "INT",
- "link": 1033,
- "widget": {
- "name": "value",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 18446744073709552000
- }
- ]
- },
- "slot_index": 0
- },
- {
- "name": "factor",
- "type": "FLOAT",
- "link": 504,
- "widget": {
- "name": "factor",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "step": 0.01
- }
- ]
- },
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "value",
- "type": "INT",
- "links": [
- 216,
- 217
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Refiner Height Scaler",
- "properties": {
- "Node name for S&R": "SeargeIntegerScaler"
- },
- "widgets_values": [
- 0,
- 1,
- 8
- ],
- "color": "#2a363b",
- "bgcolor": "#3f5159"
- },
- {
- "id": 145,
- "type": "SeargeOutput5",
- "pos": [
- -1699.8005108491654,
- 4229.8544652066785
- ],
- "size": {
- "0": 400,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 74,
- "mode": 0,
- "inputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "link": 587
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": [
- 881
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "base_conditioning_scale",
- "type": "FLOAT",
- "links": [],
- "shape": 3,
- "slot_index": 1
- },
- {
- "name": "refiner_conditioning_scale",
- "type": "FLOAT",
- "links": [],
- "shape": 3,
- "slot_index": 2
- },
- {
- "name": "style_prompt_power",
- "type": "FLOAT",
- "links": [
- 505,
- 506
- ],
- "shape": 3,
- "slot_index": 3
- },
- {
- "name": "negative_style_power",
- "type": "FLOAT",
- "links": [
- 507,
- 508
- ],
- "shape": 3,
- "slot_index": 4
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeOutput5"
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 189,
- "type": "Reroute",
- "pos": [
- 3100,
- 4100
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 79,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 616
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "PARAMETERS",
- "links": [
- 598,
- 1023
- ],
- "slot_index": 0,
- "label": "data"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 44,
- "type": "EmptyLatentImage",
- "pos": [
- 4000,
- 4230
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 115,
- "mode": 0,
- "inputs": [
- {
- "name": "width",
- "type": "INT",
- "link": 959,
- "widget": {
- "name": "width",
- "config": [
- "INT",
- {
- "default": 512,
- "min": 64,
- "max": 8192,
- "step": 8
- }
- ]
- },
- "slot_index": 0
- },
- {
- "name": "height",
- "type": "INT",
- "link": 960,
- "widget": {
- "name": "height",
- "config": [
- "INT",
- {
- "default": 512,
- "min": 64,
- "max": 8192,
- "step": 8
- }
- ]
- },
- "slot_index": 1
- },
- {
- "name": "batch_size",
- "type": "INT",
- "link": 1022,
- "widget": {
- "name": "batch_size",
- "config": [
- "INT",
- {
- "default": 1,
- "min": 1,
- "max": 64
- }
- ]
- },
- "slot_index": 2
- }
- ],
- "outputs": [
- {
- "name": "LATENT",
- "type": "LATENT",
- "links": [
- 785
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "EmptyLatentImage"
- },
- "widgets_values": [
- 512,
- 512,
- 1
- ],
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 188,
- "type": "Reroute",
- "pos": [
- -1799.8005108491654,
- 4099.854465206677
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 69,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 619
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "PARAMETERS",
- "links": [
- 587,
- 617
- ],
- "slot_index": 0,
- "label": "data"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 190,
- "type": "Reroute",
- "pos": [
- -4499.70409651184,
- 4100.623389393287
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 62,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 622
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "PARAMETERS",
- "links": [
- 618,
- 1025
- ],
- "slot_index": 0,
- "label": "data"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 201,
- "type": "Reroute",
- "pos": [
- -2399.7040965118417,
- 4100.623389393287
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 65,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 618
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "PARAMETERS",
- "links": [
- 619
- ],
- "slot_index": 0,
- "label": "data"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 152,
- "type": "SeargeOutput7",
- "pos": [
- -3700,
- 2430
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 59,
- "mode": 0,
- "inputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "link": 553
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": [
- 621
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "lora_strength",
- "type": "FLOAT",
- "links": [
- 925,
- 926
- ],
- "shape": 3,
- "slot_index": 1
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeOutput7"
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 179,
- "type": "Reroute",
- "pos": [
- -2400,
- 3200
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 27,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 942,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "UPSCALE_MODEL",
- "links": [
- 695
- ],
- "label": "up 1"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 195,
- "type": "Reroute",
- "pos": [
- 6000,
- 4100
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 94,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 598
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "PARAMETERS",
- "links": [
- 611
- ],
- "slot_index": 0,
- "label": "data"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 46,
- "type": "VAEDecode",
- "pos": [
- 5100,
- 4330
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 283,
- "mode": 0,
- "inputs": [
- {
- "name": "samples",
- "type": "LATENT",
- "link": 973
- },
- {
- "name": "vae",
- "type": "VAE",
- "link": 614,
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "IMAGE",
- "type": "IMAGE",
- "links": [
- 634,
- 690,
- 963
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "VAEDecode"
- },
- "color": "#2a363b",
- "bgcolor": "#3f5159"
- },
- {
- "id": 207,
- "type": "Reroute",
- "pos": [
- 6000,
- 4150
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 284,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 634
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "IMAGE",
- "links": [
- 633
- ],
- "slot_index": 0,
- "label": "img"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 106,
- "type": "SeargeIntegerScaler",
- "pos": [
- 7600,
- 4230
- ],
- "size": {
- "0": 300,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 185,
- "mode": 0,
- "inputs": [
- {
- "name": "value",
- "type": "INT",
- "link": 997,
- "widget": {
- "name": "value",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 18446744073709552000
- }
- ]
- },
- "slot_index": 0
- },
- {
- "name": "factor",
- "type": "FLOAT",
- "link": 990,
- "widget": {
- "name": "factor",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "step": 0.01
- }
- ]
- },
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "value",
- "type": "INT",
- "links": [
- 1002
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "HRF Image Width",
- "properties": {
- "Node name for S&R": "SeargeIntegerScaler"
- },
- "widgets_values": [
- 0,
- 1,
- 8
- ],
- "color": "#233",
- "bgcolor": "#355"
- },
- {
- "id": 107,
- "type": "SeargeIntegerScaler",
- "pos": [
- 7600,
- 4430
- ],
- "size": {
- "0": 300,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 186,
- "mode": 0,
- "inputs": [
- {
- "name": "value",
- "type": "INT",
- "link": 998,
- "widget": {
- "name": "value",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 18446744073709552000
- }
- ]
- },
- "slot_index": 0
- },
- {
- "name": "factor",
- "type": "FLOAT",
- "link": 991,
- "widget": {
- "name": "factor",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "step": 0.01
- }
- ]
- },
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "value",
- "type": "INT",
- "links": [
- 1001
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "HRF Image Height",
- "properties": {
- "Node name for S&R": "SeargeIntegerScaler"
- },
- "widgets_values": [
- 0,
- 1,
- 8
- ],
- "color": "#233",
- "bgcolor": "#355"
- },
- {
- "id": 206,
- "type": "Reroute",
- "pos": [
- 8200,
- 4150
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 53,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 708,
- "slot_index": 0,
- "pos": [
- 37.5,
- 0
- ]
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "VAE",
- "links": [
- 1005
- ],
- "slot_index": 0,
- "label": "vae"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#322",
- "bgcolor": "#533"
- },
- {
- "id": 210,
- "type": "Reroute",
- "pos": [
- 8300,
- 4150
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 44,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 699,
- "slot_index": 0,
- "pos": [
- 37.5,
- 0
- ]
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "UPSCALE_MODEL",
- "links": [
- 1003
- ],
- "slot_index": 0,
- "label": "up 2"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 213,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 5149.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 168,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 647
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1063,
- 1267
- ],
- "slot_index": 0,
- "label": "wb-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 212,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 5199.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 174,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 648
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1073,
- 1262
- ],
- "slot_index": 0,
- "label": "wr+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 211,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 5249.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 179,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 649
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1083,
- 1268
- ],
- "slot_index": 0,
- "label": "wr-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 216,
- "type": "Reroute",
- "pos": [
- 3200,
- 4950
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 270,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1129,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 825,
- 969
- ],
- "slot_index": 0,
- "label": "b-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 217,
- "type": "Reroute",
- "pos": [
- 3200,
- 5000
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 273,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1130,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 824,
- 968
- ],
- "slot_index": 0,
- "label": "r+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 218,
- "type": "Reroute",
- "pos": [
- 3200,
- 5050
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 272,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1131,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 823,
- 967
- ],
- "slot_index": 0,
- "label": "r-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 219,
- "type": "Reroute",
- "pos": [
- -2399.7040965118417,
- 4600.6233893932895
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 106,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 662,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 670
- ],
- "label": "bc +"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 220,
- "type": "Reroute",
- "pos": [
- -2399.7040965118417,
- 4650.6233893932895
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 107,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 663,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 671
- ],
- "label": "bc -"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 221,
- "type": "Reroute",
- "pos": [
- -2399.7040965118417,
- 4700.6233893932895
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 108,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 664,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 672
- ],
- "label": "rc +"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 222,
- "type": "Reroute",
- "pos": [
- -2399.7040965118417,
- 4750.6233893932895
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 109,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 665,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 673
- ],
- "label": "rc -"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 223,
- "type": "Reroute",
- "pos": [
- -2399.7040965118417,
- 4900.6233893932895
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 104,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 666,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 674
- ],
- "label": "bsc +"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 224,
- "type": "Reroute",
- "pos": [
- -2399.7040965118417,
- 4950.6233893932895
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 105,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 667,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 675
- ],
- "label": "bsc -"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 225,
- "type": "Reroute",
- "pos": [
- -2399.7040965118417,
- 5000.6233893932895
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 110,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 668,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 676
- ],
- "label": "rsc +"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 226,
- "type": "Reroute",
- "pos": [
- -2399.7040965118417,
- 5050.6233893932895
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 111,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 669,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 677
- ],
- "label": "rsc -"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 40,
- "type": "SeargeSDXLPromptEncoder",
- "pos": [
- -2999.704096511842,
- 4230.6233893932895
- ],
- "size": {
- "0": 400,
- "1": 470
- },
- "flags": {
- "pinned": true
- },
- "order": 99,
- "mode": 0,
- "inputs": [
- {
- "name": "base_clip",
- "type": "CLIP",
- "link": 717
- },
- {
- "name": "refiner_clip",
- "type": "CLIP",
- "link": 720,
- "slot_index": 1
- },
- {
- "name": "pos_g",
- "type": "STRING",
- "link": 463,
- "widget": {
- "name": "pos_g",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": "POS_G"
- }
- ]
- }
- },
- {
- "name": "pos_l",
- "type": "STRING",
- "link": 465,
- "widget": {
- "name": "pos_l",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": "POS_L"
- }
- ]
- }
- },
- {
- "name": "pos_r",
- "type": "STRING",
- "link": 464,
- "widget": {
- "name": "pos_r",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": "POS_R"
- }
- ]
- }
- },
- {
- "name": "neg_g",
- "type": "STRING",
- "link": 466,
- "widget": {
- "name": "neg_g",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": "NEG_G"
- }
- ]
- }
- },
- {
- "name": "neg_l",
- "type": "STRING",
- "link": 467,
- "widget": {
- "name": "neg_l",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": "NEG_L"
- }
- ]
- }
- },
- {
- "name": "neg_r",
- "type": "STRING",
- "link": 468,
- "widget": {
- "name": "neg_r",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": "NEG_R"
- }
- ]
- }
- },
- {
- "name": "base_width",
- "type": "INT",
- "link": 210,
- "widget": {
- "name": "base_width",
- "config": [
- "INT",
- {
- "default": 4096,
- "min": 0,
- "max": 8192,
- "step": 64
- }
- ]
- },
- "slot_index": 8
- },
- {
- "name": "base_height",
- "type": "INT",
- "link": 212,
- "widget": {
- "name": "base_height",
- "config": [
- "INT",
- {
- "default": 4096,
- "min": 0,
- "max": 8192,
- "step": 64
- }
- ]
- },
- "slot_index": 9
- },
- {
- "name": "target_width",
- "type": "INT",
- "link": 1026,
- "widget": {
- "name": "target_width",
- "config": [
- "INT",
- {
- "default": 4096,
- "min": 0,
- "max": 8192,
- "step": 64
- }
- ]
- },
- "slot_index": 10
- },
- {
- "name": "target_height",
- "type": "INT",
- "link": 1027,
- "widget": {
- "name": "target_height",
- "config": [
- "INT",
- {
- "default": 4096,
- "min": 0,
- "max": 8192,
- "step": 64
- }
- ]
- },
- "slot_index": 11
- },
- {
- "name": "refiner_width",
- "type": "INT",
- "link": 214,
- "widget": {
- "name": "refiner_width",
- "config": [
- "INT",
- {
- "default": 2048,
- "min": 0,
- "max": 8192,
- "step": 64
- }
- ]
- }
- },
- {
- "name": "refiner_height",
- "type": "INT",
- "link": 216,
- "widget": {
- "name": "refiner_height",
- "config": [
- "INT",
- {
- "default": 2048,
- "min": 0,
- "max": 8192,
- "step": 64
- }
- ]
- },
- "slot_index": 13
- }
- ],
- "outputs": [
- {
- "name": "base_positive",
- "type": "CONDITIONING",
- "links": [
- 662
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "base_negative",
- "type": "CONDITIONING",
- "links": [
- 663
- ],
- "shape": 3,
- "slot_index": 1
- },
- {
- "name": "refiner_positive",
- "type": "CONDITIONING",
- "links": [
- 664
- ],
- "shape": 3,
- "slot_index": 2
- },
- {
- "name": "refiner_negative",
- "type": "CONDITIONING",
- "links": [
- 665
- ],
- "shape": 3,
- "slot_index": 3
- }
- ],
- "title": "Primary Prompt Encoder (SeargeSDXL)",
- "properties": {
- "Node name for S&R": "SeargeSDXLPromptEncoder"
- },
- "widgets_values": [
- "POS_G",
- "POS_L",
- "POS_R",
- "NEG_G",
- "NEG_L",
- "NEG_R",
- 4096,
- 4096,
- 0,
- 0,
- 4096,
- 4096,
- 6,
- 2.5,
- 2048,
- 2048
- ],
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 227,
- "type": "Reroute",
- "pos": [
- -1799.8005108491654,
- 4599.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 120,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 670,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 678,
- 682,
- 827,
- 828,
- 1118
- ],
- "slot_index": 0,
- "label": "bc +"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 228,
- "type": "Reroute",
- "pos": [
- -1799.8005108491654,
- 4649.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 121,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 671,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 679,
- 683,
- 791,
- 829,
- 830
- ],
- "slot_index": 0,
- "label": "bc -"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 229,
- "type": "Reroute",
- "pos": [
- -1799.8005108491654,
- 4699.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 122,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 672,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 680,
- 684,
- 792,
- 832,
- 834
- ],
- "slot_index": 0,
- "label": "rc +"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 230,
- "type": "Reroute",
- "pos": [
- -1799.8005108491654,
- 4749.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 123,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 673,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 681,
- 685,
- 793,
- 833,
- 835
- ],
- "slot_index": 0,
- "label": "rc -"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 41,
- "type": "SeargeSDXLBasePromptEncoder",
- "pos": [
- -2999.704096511842,
- 4830.6233893932895
- ],
- "size": {
- "0": 400,
- "1": 270
- },
- "flags": {
- "pinned": true
- },
- "order": 98,
- "mode": 0,
- "inputs": [
- {
- "name": "base_clip",
- "type": "CLIP",
- "link": 718,
- "slot_index": 0
- },
- {
- "name": "pos_g",
- "type": "STRING",
- "link": 472,
- "widget": {
- "name": "pos_g",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": "POS_G"
- }
- ]
- },
- "slot_index": 1
- },
- {
- "name": "pos_l",
- "type": "STRING",
- "link": 473,
- "widget": {
- "name": "pos_l",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": "POS_L"
- }
- ]
- },
- "slot_index": 2
- },
- {
- "name": "neg_g",
- "type": "STRING",
- "link": 470,
- "widget": {
- "name": "neg_g",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": "NEG_G"
- }
- ]
- },
- "slot_index": 3
- },
- {
- "name": "neg_l",
- "type": "STRING",
- "link": 471,
- "widget": {
- "name": "neg_l",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": "NEG_L"
- }
- ]
- },
- "slot_index": 4
- },
- {
- "name": "base_width",
- "type": "INT",
- "link": 211,
- "widget": {
- "name": "base_width",
- "config": [
- "INT",
- {
- "default": 4096,
- "min": 0,
- "max": 8192,
- "step": 64
- }
- ]
- },
- "slot_index": 5
- },
- {
- "name": "base_height",
- "type": "INT",
- "link": 213,
- "widget": {
- "name": "base_height",
- "config": [
- "INT",
- {
- "default": 4096,
- "min": 0,
- "max": 8192,
- "step": 64
- }
- ]
- },
- "slot_index": 6
- },
- {
- "name": "target_width",
- "type": "INT",
- "link": 1028,
- "widget": {
- "name": "target_width",
- "config": [
- "INT",
- {
- "default": 4096,
- "min": 0,
- "max": 8192,
- "step": 64
- }
- ]
- },
- "slot_index": 7
- },
- {
- "name": "target_height",
- "type": "INT",
- "link": 1029,
- "widget": {
- "name": "target_height",
- "config": [
- "INT",
- {
- "default": 4096,
- "min": 0,
- "max": 8192,
- "step": 64
- }
- ]
- },
- "slot_index": 8
- }
- ],
- "outputs": [
- {
- "name": "base_positive",
- "type": "CONDITIONING",
- "links": [
- 666
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "base_negative",
- "type": "CONDITIONING",
- "links": [
- 667
- ],
- "shape": 3,
- "slot_index": 1
- }
- ],
- "title": "Base Style Encoder (SeargeSDXL)",
- "properties": {
- "Node name for S&R": "SeargeSDXLBasePromptEncoder"
- },
- "widgets_values": [
- "POS_G",
- "POS_L",
- "NEG_G",
- "NEG_L",
- 4096,
- 4096,
- 0,
- 0,
- 4096,
- 4096
- ],
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 231,
- "type": "Reroute",
- "pos": [
- -1799.8005108491654,
- 4899.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 118,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 674,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 686,
- 781,
- 836,
- 840,
- 1164
- ],
- "slot_index": 0,
- "label": "bsc +"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 232,
- "type": "Reroute",
- "pos": [
- -1799.8005108491654,
- 4949.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 119,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 675,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 687,
- 782,
- 837,
- 841,
- 1165
- ],
- "slot_index": 0,
- "label": "bsc -"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 42,
- "type": "SeargeSDXLRefinerPromptEncoder",
- "pos": [
- -2999.704096511842,
- 5230.6233893932895
- ],
- "size": {
- "0": 400,
- "1": 270
- },
- "flags": {
- "pinned": true
- },
- "order": 100,
- "mode": 0,
- "inputs": [
- {
- "name": "refiner_clip",
- "type": "CLIP",
- "link": 721,
- "slot_index": 0
- },
- {
- "name": "pos_r",
- "type": "STRING",
- "link": 474,
- "widget": {
- "name": "pos_r",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": "POS_R"
- }
- ]
- },
- "slot_index": 1
- },
- {
- "name": "neg_r",
- "type": "STRING",
- "link": 469,
- "widget": {
- "name": "neg_r",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": "NEG_R"
- }
- ]
- },
- "slot_index": 2
- },
- {
- "name": "refiner_width",
- "type": "INT",
- "link": 215,
- "widget": {
- "name": "refiner_width",
- "config": [
- "INT",
- {
- "default": 2048,
- "min": 0,
- "max": 8192,
- "step": 64
- }
- ]
- }
- },
- {
- "name": "refiner_height",
- "type": "INT",
- "link": 217,
- "widget": {
- "name": "refiner_height",
- "config": [
- "INT",
- {
- "default": 2048,
- "min": 0,
- "max": 8192,
- "step": 64
- }
- ]
- },
- "slot_index": 4
- }
- ],
- "outputs": [
- {
- "name": "refiner_positive",
- "type": "CONDITIONING",
- "links": [
- 668
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "refiner_negative",
- "type": "CONDITIONING",
- "links": [
- 669
- ],
- "shape": 3,
- "slot_index": 1
- }
- ],
- "title": "Refiner Style Encoder (SeargeSDXL)",
- "properties": {
- "Node name for S&R": "SeargeSDXLRefinerPromptEncoder"
- },
- "widgets_values": [
- "POS_R",
- "NEG_R",
- 6,
- 2.5,
- 2048,
- 2048
- ],
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 233,
- "type": "Reroute",
- "pos": [
- -1799.8005108491654,
- 4999.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 124,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 676,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 688,
- 783,
- 838,
- 842,
- 1166
- ],
- "slot_index": 0,
- "label": "rsc +"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 234,
- "type": "Reroute",
- "pos": [
- -1799.8005108491654,
- 5049.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 125,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 677,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 689,
- 784,
- 839,
- 843,
- 1167
- ],
- "slot_index": 0,
- "label": "rsc -"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 196,
- "type": "Reroute",
- "pos": [
- 4400,
- 4150
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 37,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 603,
- "pos": [
- 37.5,
- 0
- ]
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "MODEL",
- "links": [
- 971
- ],
- "slot_index": 0,
- "label": "r m"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 197,
- "type": "Reroute",
- "pos": [
- 4500,
- 4150
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 71,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 605,
- "pos": [
- 37.5,
- 0
- ]
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "MODEL",
- "links": [
- 972
- ],
- "slot_index": 0,
- "label": "b m"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 199,
- "type": "Reroute",
- "pos": [
- 4900,
- 4150
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 47,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 732,
- "slot_index": 0,
- "pos": [
- 37.5,
- 0
- ]
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "VAE",
- "links": [
- 614
- ],
- "slot_index": 0,
- "label": "vae"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#322",
- "bgcolor": "#533"
- },
- {
- "id": 235,
- "type": "PreviewImage",
- "pos": [
- 5600,
- 4830
- ],
- "size": {
- "0": 300,
- "1": 270
- },
- "flags": {
- "pinned": true
- },
- "order": 285,
- "mode": 0,
- "inputs": [
- {
- "name": "images",
- "type": "IMAGE",
- "link": 690,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "PreviewImage"
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 192,
- "type": "Reroute",
- "pos": [
- 6800,
- 5350
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 279,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 821,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1009
- ],
- "slot_index": 0,
- "label": "b-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 193,
- "type": "Reroute",
- "pos": [
- 6800,
- 5400
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 282,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 820,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1010
- ],
- "slot_index": 0,
- "label": "r+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 194,
- "type": "Reroute",
- "pos": [
- 6800,
- 5450
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 281,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 819,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1011
- ],
- "slot_index": 0,
- "label": "r-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 236,
- "type": "PreviewImage",
- "pos": [
- 8700,
- 5130
- ],
- "size": {
- "0": 300,
- "1": 270
- },
- "flags": {
- "pinned": true
- },
- "order": 291,
- "mode": 0,
- "inputs": [
- {
- "name": "images",
- "type": "IMAGE",
- "link": 985,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "PreviewImage"
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 198,
- "type": "Reroute",
- "pos": [
- 6700,
- 4100
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 101,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 611
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "PARAMETERS",
- "links": [
- 693,
- 1012
- ],
- "slot_index": 0,
- "label": "data"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 237,
- "type": "Reroute",
- "pos": [
- 9100,
- 4100
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 112,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 693
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "PARAMETERS",
- "links": [
- 694
- ],
- "slot_index": 0,
- "label": "data"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 209,
- "type": "Reroute",
- "pos": [
- 9800,
- 4100
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 126,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 694
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "PARAMETERS",
- "links": [
- 703,
- 978
- ],
- "slot_index": 0,
- "label": "data"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 105,
- "type": "Reroute",
- "pos": [
- 9100,
- 4150
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 290,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 984
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "IMAGE",
- "links": [
- 714
- ],
- "slot_index": 0,
- "label": "img"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 240,
- "type": "Reroute",
- "pos": [
- 10250,
- 4150
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 29,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 806,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "*",
- "links": [
- 701,
- 702
- ],
- "slot_index": 0,
- "label": "img"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 66,
- "type": "ImageUpscaleWithModel",
- "pos": [
- 10600,
- 4230
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 50,
- "mode": 0,
- "inputs": [
- {
- "name": "upscale_model",
- "type": "UPSCALE_MODEL",
- "link": 623,
- "slot_index": 0
- },
- {
- "name": "image",
- "type": "IMAGE",
- "link": 701,
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "IMAGE",
- "type": "IMAGE",
- "links": [
- 86
- ],
- "shape": 3
- }
- ],
- "title": "Upscale with Model 1",
- "properties": {
- "Node name for S&R": "ImageUpscaleWithModel"
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 65,
- "type": "SeargeIntegerScaler",
- "pos": [
- 10600,
- 4830
- ],
- "size": {
- "0": 300.6545104980469,
- "1": 121.05631256103516
- },
- "flags": {
- "pinned": true
- },
- "order": 230,
- "mode": 0,
- "inputs": [
- {
- "name": "value",
- "type": "INT",
- "link": 981,
- "widget": {
- "name": "value",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 18446744073709552000
- }
- ]
- },
- "slot_index": 0
- },
- {
- "name": "factor",
- "type": "FLOAT",
- "link": 977,
- "widget": {
- "name": "factor",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "step": 0.01
- }
- ]
- },
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "value",
- "type": "INT",
- "links": [
- 92
- ],
- "shape": 3
- }
- ],
- "title": "Upscaled Image Height",
- "properties": {
- "Node name for S&R": "SeargeIntegerScaler"
- },
- "widgets_values": [
- 0,
- 1,
- 8
- ],
- "color": "#233",
- "bgcolor": "#355"
- },
- {
- "id": 68,
- "type": "ImageBlend",
- "pos": [
- 11000,
- 4330
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 56,
- "mode": 0,
- "inputs": [
- {
- "name": "image1",
- "type": "IMAGE",
- "link": 86,
- "slot_index": 0
- },
- {
- "name": "image2",
- "type": "IMAGE",
- "link": 87,
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "IMAGE",
- "type": "IMAGE",
- "links": [
- 89
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Mix Upscaled Images",
- "properties": {
- "Node name for S&R": "ImageBlend"
- },
- "widgets_values": [
- 0.5,
- "normal"
- ],
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 69,
- "type": "ImageScale",
- "pos": [
- 11400,
- 4530
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 240,
- "mode": 0,
- "inputs": [
- {
- "name": "image",
- "type": "IMAGE",
- "link": 89
- },
- {
- "name": "width",
- "type": "INT",
- "link": 91,
- "widget": {
- "name": "width",
- "config": [
- "INT",
- {
- "default": 512,
- "min": 1,
- "max": 8192,
- "step": 1
- }
- ]
- }
- },
- {
- "name": "height",
- "type": "INT",
- "link": 92,
- "widget": {
- "name": "height",
- "config": [
- "INT",
- {
- "default": 512,
- "min": 1,
- "max": 8192,
- "step": 1
- }
- ]
- },
- "slot_index": 2
- }
- ],
- "outputs": [
- {
- "name": "IMAGE",
- "type": "IMAGE",
- "links": [
- 704,
- 974
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Scale to Target Size",
- "properties": {
- "Node name for S&R": "ImageScale"
- },
- "widgets_values": [
- "bicubic",
- 512,
- 512,
- "center"
- ],
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 241,
- "type": "Reroute",
- "pos": [
- 12200,
- 4100
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 155,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 703,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "PARAMETERS",
- "links": null,
- "label": "data"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 187,
- "type": "Reroute",
- "pos": [
- 10100,
- 3400
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 43,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 698,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "UPSCALE_MODEL",
- "links": [
- 705
- ],
- "slot_index": 0,
- "label": "up 2"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 238,
- "type": "Reroute",
- "pos": [
- 10100,
- 3200
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 34,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 695,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "UPSCALE_MODEL",
- "links": [
- 696
- ],
- "slot_index": 0,
- "label": "up 1"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 244,
- "type": "Reroute",
- "pos": [
- 10400,
- 4140
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 51,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 705,
- "slot_index": 0,
- "pos": [
- 37.5,
- 0
- ]
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "UPSCALE_MODEL",
- "links": [
- 706
- ],
- "slot_index": 0,
- "label": "up 2"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 186,
- "type": "Reroute",
- "pos": [
- 10500,
- 4140
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 42,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 696,
- "slot_index": 0,
- "pos": [
- 37.5,
- 0
- ]
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "UPSCALE_MODEL",
- "links": [
- 623
- ],
- "slot_index": 0,
- "label": "up 1"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 183,
- "type": "Reroute",
- "pos": [
- 3900,
- 2100
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 67,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 561,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "MODEL",
- "links": [
- 605,
- 710
- ],
- "slot_index": 0,
- "label": "b m"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 239,
- "type": "Reroute",
- "pos": [
- 8103,
- 3402
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 35,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 697,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "UPSCALE_MODEL",
- "links": [
- 698,
- 699
- ],
- "slot_index": 0,
- "label": "up 2"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 245,
- "type": "Reroute",
- "pos": [
- 7700,
- 2900
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 48,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 734,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "VAE",
- "links": [
- 708
- ],
- "slot_index": 0,
- "label": "vae"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#322",
- "bgcolor": "#533"
- },
- {
- "id": 181,
- "type": "Reroute",
- "pos": [
- 3900,
- 2600
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 31,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 563,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "MODEL",
- "links": [
- 603,
- 711
- ],
- "slot_index": 0,
- "label": "r m"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 247,
- "type": "Reroute",
- "pos": [
- 7600,
- 2600
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 38,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 711,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "MODEL",
- "links": [
- 713
- ],
- "slot_index": 0,
- "label": "r m"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 248,
- "type": "Reroute",
- "pos": [
- 7500,
- 2100
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 72,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 710,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "MODEL",
- "links": [
- 712
- ],
- "slot_index": 0,
- "label": "b m"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 249,
- "type": "Reroute",
- "pos": [
- 9300,
- 1600
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 292,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 714,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "IMAGE",
- "links": [
- 715
- ],
- "slot_index": 0,
- "label": "img"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 191,
- "type": "Reroute",
- "pos": [
- 6800,
- 5300
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 280,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 822,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1008
- ],
- "slot_index": 0,
- "label": "b+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 251,
- "type": "Reroute",
- "pos": [
- -3199.704096511842,
- 4150.623389393285
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 39,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 719,
- "pos": [
- 37.5,
- 0
- ]
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CLIP",
- "links": [
- 720,
- 721
- ],
- "slot_index": 0,
- "label": "r m"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 250,
- "type": "Reroute",
- "pos": [
- -3299.704096511842,
- 4150.623389393285
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 73,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 716,
- "pos": [
- 37.5,
- 0
- ]
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CLIP",
- "links": [
- 717,
- 718
- ],
- "slot_index": 0,
- "label": "b m"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 45,
- "type": "Note",
- "pos": [
- 530,
- 930
- ],
- "size": {
- "0": 650,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 2,
- "mode": 0,
- "title": "Workflow Information",
- "properties": {
- "text": ""
- },
- "widgets_values": [
- " Improved Searge SDXL \"Reborn\" workflows for SDXL 1.0 | Version 3.3 updated on Aug 07, 2023\n\n !!! REQUIRES CUSTOM NODE EXTENSION: https://github.com/SeargeDP/SeargeSDXL !!!\n\n 1024 x 1024, 1152 x 896, 896 x 1152, 1216 x 832, 832 x 1216, 1344 x 768, 768 x 1344, 1536 x 640, 640 x 1536\n\nNOTE: All upscale factors are applied to the image size from generation parameters, not the actual image size"
- ],
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 86,
- "type": "PreviewImage",
- "pos": [
- 100,
- -970
- ],
- "size": {
- "0": 1600,
- "1": 870
- },
- "flags": {
- "pinned": true
- },
- "order": 295,
- "mode": 0,
- "inputs": [
- {
- "name": "images",
- "type": "IMAGE",
- "link": 224,
- "slot_index": 0
- }
- ],
- "title": "Horizontal Preview Image",
- "properties": {
- "Node name for S&R": "PreviewImage"
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 268,
- "type": "LoadImage",
- "pos": [
- -400,
- 30
- ],
- "size": {
- "0": 400,
- "1": 470
- },
- "flags": {
- "pinned": true
- },
- "order": 3,
- "mode": 0,
- "outputs": [
- {
- "name": "IMAGE",
- "type": "IMAGE",
- "links": [
- 729
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "MASK",
- "type": "MASK",
- "links": null,
- "shape": 3
- }
- ],
- "title": "Source Image",
- "properties": {
- "Node name for S&R": "LoadImage"
- },
- "widgets_values": [
- "example.png",
- "image"
- ],
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 269,
- "type": "LoadImage",
- "pos": [
- -400,
- 580
- ],
- "size": {
- "0": 400,
- "1": 470
- },
- "flags": {
- "pinned": true
- },
- "order": 4,
- "mode": 0,
- "outputs": [
- {
- "name": "IMAGE",
- "type": "IMAGE",
- "links": null,
- "shape": 3
- },
- {
- "name": "MASK",
- "type": "MASK",
- "links": [
- 730
- ],
- "shape": 3
- }
- ],
- "title": "Inpainting Mask - right click -> MaskEditor",
- "properties": {
- "Node name for S&R": "LoadImage"
- },
- "widgets_values": [
- "example.png",
- "image"
- ],
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 87,
- "type": "PreviewImage",
- "pos": [
- -1400,
- -970
- ],
- "size": {
- "0": 900,
- "1": 1570
- },
- "flags": {
- "pinned": true
- },
- "order": 294,
- "mode": 0,
- "inputs": [
- {
- "name": "images",
- "type": "IMAGE",
- "link": 223,
- "slot_index": 0
- }
- ],
- "title": "Vertical Preview Image",
- "properties": {
- "Node name for S&R": "PreviewImage"
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 104,
- "type": "Reroute",
- "pos": [
- 3100,
- 50
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 293,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 715
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "IMAGE",
- "links": [
- 223,
- 224,
- 225,
- 916
- ],
- "slot_index": 0,
- "label": "img"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 271,
- "type": "Reroute",
- "pos": [
- 4600,
- 2900
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 40,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 733,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "VAE",
- "links": [
- 732,
- 734
- ],
- "slot_index": 0,
- "label": "vae"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#322",
- "bgcolor": "#533"
- },
- {
- "id": 272,
- "type": "SeargeInput6",
- "pos": [
- 860,
- 250
- ],
- "size": {
- "0": 320,
- "1": 202
- },
- "flags": {
- "pinned": true
- },
- "order": 16,
- "mode": 0,
- "inputs": [
- {
- "name": "inputs",
- "type": "PARAMETER_INPUTS",
- "link": 735
- }
- ],
- "outputs": [
- {
- "name": "inputs",
- "type": "PARAMETER_INPUTS",
- "links": [
- 736
- ],
- "shape": 3
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeInput6"
- },
- "widgets_values": [
- "disabled",
- 25,
- 0.25,
- 1.5,
- "hard",
- "distinct",
- 0.49999999999999994
- ],
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 243,
- "type": "PreviewImage",
- "pos": [
- 11800,
- 4330
- ],
- "size": {
- "0": 300,
- "1": 270
- },
- "flags": {
- "pinned": true
- },
- "order": 250,
- "mode": 0,
- "inputs": [
- {
- "name": "images",
- "type": "IMAGE",
- "link": 704,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "PreviewImage"
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 64,
- "type": "SeargeIntegerScaler",
- "pos": [
- 10600,
- 4580
- ],
- "size": {
- "0": 300,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 229,
- "mode": 0,
- "inputs": [
- {
- "name": "value",
- "type": "INT",
- "link": 980,
- "widget": {
- "name": "value",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 18446744073709552000
- }
- ]
- },
- "slot_index": 0
- },
- {
- "name": "factor",
- "type": "FLOAT",
- "link": 976,
- "widget": {
- "name": "factor",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "step": 0.01
- }
- ]
- },
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "value",
- "type": "INT",
- "links": [
- 91
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Upscaled Image Width",
- "properties": {
- "Node name for S&R": "SeargeIntegerScaler"
- },
- "widgets_values": [
- 0,
- 1,
- 8
- ],
- "color": "#233",
- "bgcolor": "#355"
- },
- {
- "id": 67,
- "type": "ImageUpscaleWithModel",
- "pos": [
- 10600,
- 4380
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 54,
- "mode": 0,
- "inputs": [
- {
- "name": "upscale_model",
- "type": "UPSCALE_MODEL",
- "link": 706,
- "slot_index": 0
- },
- {
- "name": "image",
- "type": "IMAGE",
- "link": 702,
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "IMAGE",
- "type": "IMAGE",
- "links": [
- 87
- ],
- "shape": 3
- }
- ],
- "title": "Upscale with Model 2",
- "properties": {
- "Node name for S&R": "ImageUpscaleWithModel"
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 185,
- "type": "Reroute",
- "pos": [
- 0,
- 2900
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 33,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 588,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "VAE",
- "links": [
- 733,
- 762
- ],
- "slot_index": 0,
- "label": "vae"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#322",
- "bgcolor": "#533"
- },
- {
- "id": 290,
- "type": "SeargeOutput2",
- "pos": [
- 1100,
- 7130
- ],
- "size": {
- "0": 400,
- "1": 270
- },
- "flags": {
- "pinned": true
- },
- "order": 96,
- "mode": 0,
- "inputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "link": 767
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": [
- 787
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "seed",
- "type": "INT",
- "links": null,
- "shape": 3
- },
- {
- "name": "image_width",
- "type": "INT",
- "links": [
- 770,
- 771
- ],
- "shape": 3,
- "slot_index": 2
- },
- {
- "name": "image_height",
- "type": "INT",
- "links": [
- 772,
- 773
- ],
- "shape": 3,
- "slot_index": 3
- },
- {
- "name": "steps",
- "type": "INT",
- "links": null,
- "shape": 3
- },
- {
- "name": "cfg",
- "type": "FLOAT",
- "links": null,
- "shape": 3
- },
- {
- "name": "sampler_name",
- "type": [
- "euler",
- "euler_ancestral",
- "heun",
- "dpm_2",
- "dpm_2_ancestral",
- "lms",
- "dpm_fast",
- "dpm_adaptive",
- "dpmpp_2s_ancestral",
- "dpmpp_sde",
- "dpmpp_sde_gpu",
- "dpmpp_2m",
- "dpmpp_2m_sde",
- "dpmpp_2m_sde_gpu",
- "ddim",
- "uni_pc",
- "uni_pc_bh2"
- ],
- "links": null,
- "shape": 3
- },
- {
- "name": "scheduler",
- "type": [
- "normal",
- "karras",
- "exponential",
- "simple",
- "ddim_uniform"
- ],
- "links": null,
- "shape": 3
- },
- {
- "name": "save_image",
- "type": [
- "disabled",
- "enabled"
- ],
- "links": null,
- "shape": 3
- },
- {
- "name": "save_directory",
- "type": [
- "output folder",
- "input folder"
- ],
- "links": null,
- "shape": 3
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeOutput2"
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 153,
- "type": "SeargeOutput1",
- "pos": [
- -4399.70409651184,
- 4530.6233893932895
- ],
- "size": {
- "0": 400,
- "1": 220
- },
- "flags": {
- "pinned": true
- },
- "order": 70,
- "mode": 0,
- "inputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "link": 1036
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": [
- 537
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "main_prompt",
- "type": "STRING",
- "links": [
- 463,
- 464
- ],
- "shape": 3,
- "slot_index": 1
- },
- {
- "name": "secondary_prompt",
- "type": "STRING",
- "links": [
- 465
- ],
- "shape": 3,
- "slot_index": 2
- },
- {
- "name": "style_prompt",
- "type": "STRING",
- "links": [
- 472,
- 473,
- 474
- ],
- "shape": 3,
- "slot_index": 3
- },
- {
- "name": "negative_prompt",
- "type": "STRING",
- "links": [
- 466,
- 467,
- 468
- ],
- "shape": 3,
- "slot_index": 4
- },
- {
- "name": "negative_style",
- "type": "STRING",
- "links": [
- 469,
- 470,
- 471
- ],
- "shape": 3,
- "slot_index": 5
- },
- {
- "name": "image",
- "type": "IMAGE",
- "links": null,
- "shape": 3
- },
- {
- "name": "mask",
- "type": "MASK",
- "links": null,
- "shape": 3
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeOutput1"
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 161,
- "type": "SeargeOutput5",
- "pos": [
- -4399.70409651184,
- 4830.6233893932895
- ],
- "size": {
- "0": 400,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 76,
- "mode": 0,
- "inputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "link": 537
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": [],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "base_conditioning_scale",
- "type": "FLOAT",
- "links": [
- 501,
- 502
- ],
- "shape": 3,
- "slot_index": 1
- },
- {
- "name": "refiner_conditioning_scale",
- "type": "FLOAT",
- "links": [
- 503,
- 504
- ],
- "shape": 3,
- "slot_index": 2
- },
- {
- "name": "style_prompt_power",
- "type": "FLOAT",
- "links": [],
- "shape": 3,
- "slot_index": 3
- },
- {
- "name": "negative_style_power",
- "type": "FLOAT",
- "links": [],
- "shape": 3,
- "slot_index": 4
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeOutput5"
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 215,
- "type": "Reroute",
- "pos": [
- 3203,
- 4903
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 271,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1128,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 826,
- 970
- ],
- "slot_index": 0,
- "label": "b+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 286,
- "type": "MaskToImage",
- "pos": [
- 1600,
- 7730
- ],
- "size": {
- "0": 200,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 117,
- "mode": 0,
- "inputs": [
- {
- "name": "mask",
- "type": "MASK",
- "link": 768,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "IMAGE",
- "type": "IMAGE",
- "links": [
- 760
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "MaskToImage"
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 281,
- "type": "ImageScale",
- "pos": [
- 1900,
- 7130
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 116,
- "mode": 0,
- "inputs": [
- {
- "name": "image",
- "type": "IMAGE",
- "link": 769
- },
- {
- "name": "width",
- "type": "INT",
- "link": 770,
- "widget": {
- "name": "width",
- "config": [
- "INT",
- {
- "default": 512,
- "min": 1,
- "max": 8192,
- "step": 1
- }
- ]
- },
- "slot_index": 1
- },
- {
- "name": "height",
- "type": "INT",
- "link": 772,
- "widget": {
- "name": "height",
- "config": [
- "INT",
- {
- "default": 512,
- "min": 1,
- "max": 8192,
- "step": 1
- }
- ]
- },
- "slot_index": 2
- }
- ],
- "outputs": [
- {
- "name": "IMAGE",
- "type": "IMAGE",
- "links": [
- 756
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ImageScale"
- },
- "widgets_values": [
- "bicubic",
- 512,
- 512,
- "center"
- ],
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 284,
- "type": "ImageScale",
- "pos": [
- 1900,
- 7430
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 130,
- "mode": 0,
- "inputs": [
- {
- "name": "image",
- "type": "IMAGE",
- "link": 760
- },
- {
- "name": "width",
- "type": "INT",
- "link": 771,
- "widget": {
- "name": "width",
- "config": [
- "INT",
- {
- "default": 512,
- "min": 1,
- "max": 8192,
- "step": 1
- }
- ]
- }
- },
- {
- "name": "height",
- "type": "INT",
- "link": 773,
- "widget": {
- "name": "height",
- "config": [
- "INT",
- {
- "default": 512,
- "min": 1,
- "max": 8192,
- "step": 1
- }
- ]
- }
- }
- ],
- "outputs": [
- {
- "name": "IMAGE",
- "type": "IMAGE",
- "links": [
- 761
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ImageScale"
- },
- "widgets_values": [
- "bicubic",
- 512,
- 512,
- "center"
- ],
- "color": "#2a363b",
- "bgcolor": "#3f5159"
- },
- {
- "id": 288,
- "type": "FeatherMask",
- "pos": [
- 2700,
- 7430
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 188,
- "mode": 0,
- "inputs": [
- {
- "name": "mask",
- "type": "MASK",
- "link": 764
- }
- ],
- "outputs": [
- {
- "name": "MASK",
- "type": "MASK",
- "links": [
- 765
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "FeatherMask"
- },
- "widgets_values": [
- 4,
- 4,
- 4,
- 4
- ],
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 282,
- "type": "VAEEncode",
- "pos": [
- 2400,
- 7130
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 129,
- "mode": 0,
- "inputs": [
- {
- "name": "pixels",
- "type": "IMAGE",
- "link": 756,
- "slot_index": 0
- },
- {
- "name": "vae",
- "type": "VAE",
- "link": 775
- }
- ],
- "outputs": [
- {
- "name": "LATENT",
- "type": "LATENT",
- "links": [
- 758,
- 778
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "VAEEncode"
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 285,
- "type": "ImageToMask",
- "pos": [
- 2300,
- 7430
- ],
- "size": {
- "0": 297.2215881347656,
- "1": 72.36862182617188
- },
- "flags": {
- "pinned": true
- },
- "order": 159,
- "mode": 0,
- "inputs": [
- {
- "name": "image",
- "type": "IMAGE",
- "link": 761
- }
- ],
- "outputs": [
- {
- "name": "MASK",
- "type": "MASK",
- "links": [
- 764
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ImageToMask"
- },
- "widgets_values": [
- "green"
- ],
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 289,
- "type": "Reroute",
- "pos": [
- 3800,
- 5100
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 252,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 780,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "LATENT",
- "links": [
- 914
- ],
- "label": "ip",
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 294,
- "type": "Reroute",
- "pos": [
- 2260,
- 7050
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 49,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 774,
- "slot_index": 0,
- "pos": [
- 37.5,
- 0
- ]
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "VAE",
- "links": [
- 775
- ],
- "slot_index": 0,
- "label": "vae"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#322",
- "bgcolor": "#533"
- },
- {
- "id": 283,
- "type": "SetLatentNoiseMask",
- "pos": [
- 3100,
- 7230
- ],
- "size": {
- "0": 200,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 231,
- "mode": 0,
- "inputs": [
- {
- "name": "samples",
- "type": "LATENT",
- "link": 758
- },
- {
- "name": "mask",
- "type": "MASK",
- "link": 765
- }
- ],
- "outputs": [
- {
- "name": "LATENT",
- "type": "LATENT",
- "links": [
- 777
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SetLatentNoiseMask"
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 296,
- "type": "Reroute",
- "pos": [
- 3300,
- 7000
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 97,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 776
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "PARAMETERS",
- "links": null,
- "label": "data"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 297,
- "type": "Reroute",
- "pos": [
- 2860,
- 7050
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 158,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 778
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "LATENT",
- "links": [
- 779
- ],
- "slot_index": 0,
- "label": "i 2 i"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 298,
- "type": "Reroute",
- "pos": [
- 3800,
- 5050
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 187,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 779,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "LATENT",
- "links": [
- 913
- ],
- "label": "i 2 i",
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 299,
- "type": "Reroute",
- "pos": [
- 4360,
- 4450
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 128,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 785,
- "slot_index": 0,
- "pos": [
- 37.5,
- 0
- ]
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "LATENT",
- "links": [
- 910
- ],
- "slot_index": 0,
- "label": "t 2 i"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 293,
- "type": "SeargeOutput1",
- "pos": [
- 1100,
- 7530
- ],
- "size": {
- "0": 400,
- "1": 270
- },
- "flags": {
- "pinned": true
- },
- "order": 103,
- "mode": 0,
- "inputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "link": 787
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": null,
- "shape": 3
- },
- {
- "name": "main_prompt",
- "type": "STRING",
- "links": null,
- "shape": 3
- },
- {
- "name": "secondary_prompt",
- "type": "STRING",
- "links": null,
- "shape": 3
- },
- {
- "name": "style_prompt",
- "type": "STRING",
- "links": null,
- "shape": 3
- },
- {
- "name": "negative_prompt",
- "type": "STRING",
- "links": null,
- "shape": 3
- },
- {
- "name": "negative_style",
- "type": "STRING",
- "links": null,
- "shape": 3
- },
- {
- "name": "image",
- "type": "IMAGE",
- "links": [
- 769
- ],
- "shape": 3,
- "slot_index": 6
- },
- {
- "name": "mask",
- "type": "MASK",
- "links": [
- 768
- ],
- "shape": 3,
- "slot_index": 7
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeOutput1"
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 205,
- "type": "Reroute",
- "pos": [
- 8101,
- 4151
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 77,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 712,
- "slot_index": 0,
- "pos": [
- 37.5,
- 0
- ]
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "MODEL",
- "links": [
- 1006
- ],
- "slot_index": 0,
- "label": "b m"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 204,
- "type": "Reroute",
- "pos": [
- 8004,
- 4151
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 46,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 713,
- "slot_index": 0,
- "pos": [
- 37.5,
- 0
- ]
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "MODEL",
- "links": [
- 1007
- ],
- "slot_index": 0,
- "label": "r m"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 208,
- "type": "Reroute",
- "pos": [
- 7813,
- 4148
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 287,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 633
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "IMAGE",
- "links": [
- 1004
- ],
- "slot_index": 0,
- "label": "img"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 304,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 4749.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 180,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 794
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1084,
- 1264
- ],
- "label": "cr-",
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 305,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 4699.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 175,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 795
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1074,
- 1266
- ],
- "label": "cr+",
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 306,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 4649.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 167,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 796
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1064,
- 1263
- ],
- "label": "cb-",
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 308,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 4449.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 173,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 798
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1260
- ],
- "label": "sr-",
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 3,
- "type": "SeargePromptText",
- "pos": [
- 60,
- 40
- ],
- "size": {
- "0": 460,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 5,
- "mode": 0,
- "outputs": [
- {
- "name": "prompt",
- "type": "STRING",
- "links": [
- 723
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Main Prompt",
- "properties": {
- "Node name for S&R": "SeargePromptText"
- },
- "widgets_values": [
- "a cat with a hat in a grass field"
- ],
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 5,
- "type": "SeargePromptText",
- "pos": [
- 60,
- 250
- ],
- "size": {
- "0": 460,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 6,
- "mode": 0,
- "outputs": [
- {
- "name": "prompt",
- "type": "STRING",
- "links": [
- 724
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Secondary Prompt",
- "properties": {
- "Node name for S&R": "SeargePromptText"
- },
- "widgets_values": [
- "cat with hat, in grass field"
- ],
- "color": "#2a363b",
- "bgcolor": "#3f5159"
- },
- {
- "id": 6,
- "type": "SeargePromptText",
- "pos": [
- 60,
- 460
- ],
- "size": {
- "0": 460,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 7,
- "mode": 0,
- "outputs": [
- {
- "name": "prompt",
- "type": "STRING",
- "links": [
- 725
- ],
- "shape": 3
- }
- ],
- "title": "Style",
- "properties": {
- "Node name for S&R": "SeargePromptText"
- },
- "widgets_values": [
- "~*~oil painting~*~ in the style of Frank Bowling, vibrant colors"
- ],
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 7,
- "type": "SeargePromptText",
- "pos": [
- 60,
- 670
- ],
- "size": {
- "0": 460,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 8,
- "mode": 0,
- "outputs": [
- {
- "name": "prompt",
- "type": "STRING",
- "links": [
- 726
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Negative Prompt",
- "properties": {
- "Node name for S&R": "SeargePromptText"
- },
- "widgets_values": [
- "jpeg artifacts, noise"
- ],
- "color": "#322",
- "bgcolor": "#533"
- },
- {
- "id": 312,
- "type": "Reroute",
- "pos": [
- 9760,
- 4150
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 22,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 919
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "*",
- "links": [
- 806
- ],
- "slot_index": 0,
- "label": "img"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 8,
- "type": "SeargePromptText",
- "pos": [
- 60,
- 880
- ],
- "size": {
- "0": 460,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 9,
- "mode": 0,
- "outputs": [
- {
- "name": "prompt",
- "type": "STRING",
- "links": [
- 727
- ],
- "shape": 3
- }
- ],
- "title": "Negative Style",
- "properties": {
- "Node name for S&R": "SeargePromptText"
- },
- "widgets_values": [
- "photograph, anime"
- ],
- "color": "#332922",
- "bgcolor": "#593930"
- },
- {
- "id": 316,
- "type": "Reroute",
- "pos": [
- 3700,
- 5450
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 276,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 823
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 819
- ],
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 315,
- "type": "Reroute",
- "pos": [
- 3700,
- 5350
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 274,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 825
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 821
- ],
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 317,
- "type": "Reroute",
- "pos": [
- 3700,
- 5400
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 277,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 824
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 820
- ],
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 314,
- "type": "Reroute",
- "pos": [
- 3700,
- 5300
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 275,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 826
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 822
- ],
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 291,
- "type": "Reroute",
- "pos": [
- 1000,
- 7000
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 80,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1039
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "PARAMETERS",
- "links": [
- 767,
- 776
- ],
- "slot_index": 0,
- "label": "data"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 295,
- "type": "Reroute",
- "pos": [
- 3360,
- 7100
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 241,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 777
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "LATENT",
- "links": [
- 780
- ],
- "slot_index": 0,
- "label": "ip"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 287,
- "type": "Reroute",
- "pos": [
- 800,
- 6600
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 41,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 762,
- "slot_index": 0,
- "pos": [
- 37.5,
- 0
- ]
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "VAE",
- "links": [
- 774
- ],
- "slot_index": 0,
- "label": "vae"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#322",
- "bgcolor": "#533"
- },
- {
- "id": 55,
- "type": "ConditioningCombine",
- "pos": [
- -1099.8005108491657,
- 4529.8544652066785
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 133,
- "mode": 0,
- "inputs": [
- {
- "name": "conditioning_1",
- "type": "CONDITIONING",
- "link": 678
- },
- {
- "name": "conditioning_2",
- "type": "CONDITIONING",
- "link": 781
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 797
- ],
- "shape": 3,
- "label": "base +",
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ConditioningCombine"
- },
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 56,
- "type": "ConditioningCombine",
- "pos": [
- -1099.8005108491657,
- 4639.8544652066785
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 138,
- "mode": 0,
- "inputs": [
- {
- "name": "conditioning_1",
- "type": "CONDITIONING",
- "link": 679
- },
- {
- "name": "conditioning_2",
- "type": "CONDITIONING",
- "link": 782
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 796
- ],
- "shape": 3,
- "label": "base -",
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ConditioningCombine"
- },
- "color": "#322",
- "bgcolor": "#533"
- },
- {
- "id": 57,
- "type": "ConditioningCombine",
- "pos": [
- -1099.8005108491657,
- 4749.8544652066785
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 146,
- "mode": 0,
- "inputs": [
- {
- "name": "conditioning_1",
- "type": "CONDITIONING",
- "link": 680
- },
- {
- "name": "conditioning_2",
- "type": "CONDITIONING",
- "link": 783
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 795
- ],
- "shape": 3,
- "label": "refiner +",
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ConditioningCombine"
- },
- "color": "#233",
- "bgcolor": "#355"
- },
- {
- "id": 58,
- "type": "ConditioningCombine",
- "pos": [
- -1099.8005108491657,
- 4859.8544652066785
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 151,
- "mode": 0,
- "inputs": [
- {
- "name": "conditioning_1",
- "type": "CONDITIONING",
- "link": 681
- },
- {
- "name": "conditioning_2",
- "type": "CONDITIONING",
- "link": 784
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 794
- ],
- "shape": 3,
- "label": "refiner -",
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ConditioningCombine"
- },
- "color": "#332922",
- "bgcolor": "#593930"
- },
- {
- "id": 75,
- "type": "ConditioningAverage ",
- "pos": [
- -1099.8005108491657,
- 5029.8544652066785
- ],
- "size": {
- "0": 300,
- "1": 74
- },
- "flags": {
- "pinned": true
- },
- "order": 134,
- "mode": 0,
- "inputs": [
- {
- "name": "conditioning_to",
- "type": "CONDITIONING",
- "link": 686,
- "slot_index": 0
- },
- {
- "name": "conditioning_from",
- "type": "CONDITIONING",
- "link": 682
- },
- {
- "name": "conditioning_to_strength",
- "type": "FLOAT",
- "link": 505,
- "widget": {
- "name": "conditioning_to_strength",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "min": 0,
- "max": 1,
- "step": 0.01
- }
- ]
- },
- "slot_index": 2
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 844
- ],
- "shape": 3,
- "label": "base +",
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ConditioningAverage "
- },
- "widgets_values": [
- 1
- ],
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 76,
- "type": "ConditioningAverage ",
- "pos": [
- -1099.8005108491657,
- 5139.8544652066785
- ],
- "size": {
- "0": 300,
- "1": 74
- },
- "flags": {
- "pinned": true
- },
- "order": 139,
- "mode": 0,
- "inputs": [
- {
- "name": "conditioning_to",
- "type": "CONDITIONING",
- "link": 687,
- "slot_index": 0
- },
- {
- "name": "conditioning_from",
- "type": "CONDITIONING",
- "link": 683
- },
- {
- "name": "conditioning_to_strength",
- "type": "FLOAT",
- "link": 507,
- "widget": {
- "name": "conditioning_to_strength",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "min": 0,
- "max": 1,
- "step": 0.01
- }
- ]
- },
- "slot_index": 2
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 647
- ],
- "shape": 3,
- "label": "base -",
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ConditioningAverage "
- },
- "widgets_values": [
- 1
- ],
- "color": "#322",
- "bgcolor": "#533"
- },
- {
- "id": 77,
- "type": "ConditioningAverage ",
- "pos": [
- -1099.8005108491657,
- 5249.8544652066785
- ],
- "size": {
- "0": 300,
- "1": 74
- },
- "flags": {
- "pinned": true
- },
- "order": 145,
- "mode": 0,
- "inputs": [
- {
- "name": "conditioning_to",
- "type": "CONDITIONING",
- "link": 688,
- "slot_index": 0
- },
- {
- "name": "conditioning_from",
- "type": "CONDITIONING",
- "link": 684
- },
- {
- "name": "conditioning_to_strength",
- "type": "FLOAT",
- "link": 506,
- "widget": {
- "name": "conditioning_to_strength",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "min": 0,
- "max": 1,
- "step": 0.01
- }
- ]
- },
- "slot_index": 2
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 648
- ],
- "shape": 3,
- "label": "refiner +",
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ConditioningAverage "
- },
- "widgets_values": [
- 1
- ],
- "color": "#233",
- "bgcolor": "#355"
- },
- {
- "id": 78,
- "type": "ConditioningAverage ",
- "pos": [
- -1099.8005108491657,
- 5359.8544652066785
- ],
- "size": {
- "0": 300,
- "1": 74
- },
- "flags": {
- "pinned": true
- },
- "order": 150,
- "mode": 0,
- "inputs": [
- {
- "name": "conditioning_to",
- "type": "CONDITIONING",
- "link": 689
- },
- {
- "name": "conditioning_from",
- "type": "CONDITIONING",
- "link": 685
- },
- {
- "name": "conditioning_to_strength",
- "type": "FLOAT",
- "link": 508,
- "widget": {
- "name": "conditioning_to_strength",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "min": 0,
- "max": 1,
- "step": 0.01
- }
- ]
- },
- "slot_index": 2
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 649
- ],
- "shape": 3,
- "label": "refiner -",
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ConditioningAverage "
- },
- "widgets_values": [
- 1
- ],
- "color": "#332922",
- "bgcolor": "#593930"
- },
- {
- "id": 313,
- "type": "ConditioningConcat",
- "pos": [
- -1099.8005108491657,
- 5529.8544652066785
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 136,
- "mode": 0,
- "inputs": [
- {
- "name": "conditioning_to",
- "type": "CONDITIONING",
- "link": 828
- },
- {
- "name": "conditioning_from",
- "type": "CONDITIONING",
- "link": 836,
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 849
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ConditioningConcat"
- },
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 318,
- "type": "ConditioningConcat",
- "pos": [
- -1099.8005108491657,
- 5639.8544652066785
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 141,
- "mode": 0,
- "inputs": [
- {
- "name": "conditioning_to",
- "type": "CONDITIONING",
- "link": 829
- },
- {
- "name": "conditioning_from",
- "type": "CONDITIONING",
- "link": 837,
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 850
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ConditioningConcat"
- },
- "color": "#322",
- "bgcolor": "#533"
- },
- {
- "id": 319,
- "type": "ConditioningConcat",
- "pos": [
- -1099.8005108491657,
- 5749.8544652066785
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 147,
- "mode": 0,
- "inputs": [
- {
- "name": "conditioning_to",
- "type": "CONDITIONING",
- "link": 834,
- "slot_index": 0
- },
- {
- "name": "conditioning_from",
- "type": "CONDITIONING",
- "link": 838,
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 851
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ConditioningConcat"
- },
- "color": "#233",
- "bgcolor": "#355"
- },
- {
- "id": 320,
- "type": "ConditioningConcat",
- "pos": [
- -1099.8005108491657,
- 5859.8544652066785
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 152,
- "mode": 0,
- "inputs": [
- {
- "name": "conditioning_to",
- "type": "CONDITIONING",
- "link": 835,
- "slot_index": 0
- },
- {
- "name": "conditioning_from",
- "type": "CONDITIONING",
- "link": 839,
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 852
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ConditioningConcat"
- },
- "color": "#332922",
- "bgcolor": "#593930"
- },
- {
- "id": 321,
- "type": "ConditioningConcat",
- "pos": [
- -1099.8005108491657,
- 6029.8544652066785
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 135,
- "mode": 0,
- "inputs": [
- {
- "name": "conditioning_to",
- "type": "CONDITIONING",
- "link": 840,
- "slot_index": 0
- },
- {
- "name": "conditioning_from",
- "type": "CONDITIONING",
- "link": 827
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 848
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ConditioningConcat"
- },
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 322,
- "type": "ConditioningConcat",
- "pos": [
- -1099.8005108491657,
- 6139.8544652066785
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 142,
- "mode": 0,
- "inputs": [
- {
- "name": "conditioning_to",
- "type": "CONDITIONING",
- "link": 841,
- "slot_index": 0
- },
- {
- "name": "conditioning_from",
- "type": "CONDITIONING",
- "link": 830
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 847
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ConditioningConcat"
- },
- "color": "#322",
- "bgcolor": "#533"
- },
- {
- "id": 323,
- "type": "ConditioningConcat",
- "pos": [
- -1099.8005108491657,
- 6249.8544652066785
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 148,
- "mode": 0,
- "inputs": [
- {
- "name": "conditioning_to",
- "type": "CONDITIONING",
- "link": 842,
- "slot_index": 0
- },
- {
- "name": "conditioning_from",
- "type": "CONDITIONING",
- "link": 832
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 846
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ConditioningConcat"
- },
- "color": "#233",
- "bgcolor": "#355"
- },
- {
- "id": 324,
- "type": "ConditioningConcat",
- "pos": [
- -1099.8005108491657,
- 6359.8544652066785
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 153,
- "mode": 0,
- "inputs": [
- {
- "name": "conditioning_to",
- "type": "CONDITIONING",
- "link": 843,
- "slot_index": 0
- },
- {
- "name": "conditioning_from",
- "type": "CONDITIONING",
- "link": 833,
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 845
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ConditioningConcat"
- },
- "color": "#332922",
- "bgcolor": "#593930"
- },
- {
- "id": 214,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 5099.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 163,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 844,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1053,
- 1261
- ],
- "slot_index": 0,
- "label": "wb+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 325,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 5749.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 181,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 852
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1081,
- 1246
- ],
- "slot_index": 0,
- "label": "pfr-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 326,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 5699.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 176,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 851
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1071,
- 1240
- ],
- "slot_index": 0,
- "label": "pfr+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 327,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 5649.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 170,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 850
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1061,
- 1245
- ],
- "slot_index": 0,
- "label": "pfb-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 328,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 5599.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 165,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 849,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1051,
- 1238
- ],
- "slot_index": 0,
- "label": "pfb+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 329,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 6249.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 182,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 845
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1082,
- 1242
- ],
- "slot_index": 0,
- "label": "sfr-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 330,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 6199.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 177,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 846
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1072,
- 1244
- ],
- "slot_index": 0,
- "label": "sfr+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 331,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 6149.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 171,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 847
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1062,
- 1241
- ],
- "slot_index": 0,
- "label": "sfb-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 332,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 6099.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 164,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 848,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1052,
- 1243
- ],
- "slot_index": 0,
- "label": "sfb+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 307,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 4599.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 162,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 797
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1054,
- 1265
- ],
- "label": "cb+",
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 340,
- "type": "SeargeGenerated1",
- "pos": [
- 3250,
- 4800
- ],
- "size": {
- "0": 300,
- "1": 86
- },
- "flags": {
- "pinned": true
- },
- "order": 114,
- "mode": 0,
- "inputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "link": 965
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": null,
- "shape": 3
- },
- {
- "name": "operation_selector",
- "type": "INT",
- "links": [
- 912
- ],
- "shape": 3,
- "slot_index": 1
- },
- {
- "name": "prompt_style_selector",
- "type": "INT",
- "links": [],
- "shape": 3,
- "slot_index": 2
- },
- {
- "name": "prompt_style_group",
- "type": "INT",
- "links": null,
- "shape": 3
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeGenerated1"
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 335,
- "type": "SeargeLatentMuxer3",
- "pos": [
- 4000,
- 4980
- ],
- "size": {
- "0": 302.3999938964844,
- "1": 94
- },
- "flags": {
- "pinned": true
- },
- "order": 257,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "LATENT",
- "link": 910,
- "slot_index": 0
- },
- {
- "name": "input1",
- "type": "LATENT",
- "link": 913
- },
- {
- "name": "input2",
- "type": "LATENT",
- "link": 914
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 912,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 2
- }
- ]
- }
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "LATENT",
- "links": [
- 966
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeLatentMuxer3"
- },
- "widgets_values": [
- 0
- ],
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 341,
- "type": "Reroute",
- "pos": [
- 700,
- 1060
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 297,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 916
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "IMAGE",
- "links": null,
- "label": "upscale"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 342,
- "type": "Reroute",
- "pos": [
- 920,
- 1060
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 10,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": null
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "*",
- "links": [
- 918
- ],
- "slot_index": 0,
- "label": "upscale"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 343,
- "type": "Reroute",
- "pos": [
- 9300,
- 1060
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 15,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 918
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "*",
- "links": [
- 919
- ],
- "slot_index": 0,
- "label": "img"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 150,
- "type": "SeargeInput7",
- "pos": [
- 860,
- 490
- ],
- "size": {
- "0": 320,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 11,
- "mode": 0,
- "inputs": [
- {
- "name": "inputs",
- "type": "PARAMETER_INPUTS",
- "link": null
- }
- ],
- "outputs": [
- {
- "name": "inputs",
- "type": "PARAMETER_INPUTS",
- "links": [
- 735
- ],
- "shape": 3
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeInput7"
- },
- "widgets_values": [
- 0,
- "text to image",
- "subject focus"
- ],
- "color": "#2a363b",
- "bgcolor": "#3f5159"
- },
- {
- "id": 353,
- "type": "SeargeLoraLoader",
- "pos": [
- -3000,
- 2330
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 61,
- "mode": 0,
- "inputs": [
- {
- "name": "model",
- "type": "MODEL",
- "link": 933
- },
- {
- "name": "clip",
- "type": "CLIP",
- "link": 934
- },
- {
- "name": "lora_name",
- "type": "LORA_NAME",
- "link": 924
- },
- {
- "name": "strength_model",
- "type": "FLOAT",
- "link": 925,
- "widget": {
- "name": "strength_model",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "min": -10,
- "max": 10,
- "step": 0.01
- }
- ]
- }
- },
- {
- "name": "strength_clip",
- "type": "FLOAT",
- "link": 926,
- "widget": {
- "name": "strength_clip",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "min": -10,
- "max": 10,
- "step": 0.01
- }
- ]
- }
- }
- ],
- "outputs": [
- {
- "name": "MODEL",
- "type": "MODEL",
- "links": [
- 929
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "CLIP",
- "type": "CLIP",
- "links": [
- 930
- ],
- "shape": 3,
- "slot_index": 1
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeLoraLoader"
- },
- "widgets_values": [
- 1,
- 1
- ],
- "color": "#332922",
- "bgcolor": "#593930"
- },
- {
- "id": 349,
- "type": "SeargeOutput4",
- "pos": [
- -4400,
- 2130
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 14,
- "mode": 0,
- "inputs": [
- {
- "name": "model_names",
- "type": "MODEL_NAMES",
- "link": 931
- }
- ],
- "outputs": [
- {
- "name": "model_names",
- "type": "MODEL_NAMES",
- "links": null,
- "shape": 3
- },
- {
- "name": "base_model",
- "type": "CHECKPOINT_NAME",
- "links": [
- 932
- ],
- "shape": 3,
- "slot_index": 1
- },
- {
- "name": "refiner_model",
- "type": "CHECKPOINT_NAME",
- "links": [
- 935
- ],
- "shape": 3,
- "slot_index": 2
- },
- {
- "name": "vae_model",
- "type": "VAE_NAME",
- "links": [
- 938
- ],
- "shape": 3,
- "slot_index": 3
- },
- {
- "name": "main_upscale_model",
- "type": "UPSCALER_NAME",
- "links": [
- 940
- ],
- "shape": 3,
- "slot_index": 4
- },
- {
- "name": "support_upscale_model",
- "type": "UPSCALER_NAME",
- "links": [
- 941
- ],
- "shape": 3,
- "slot_index": 5
- },
- {
- "name": "lora_model",
- "type": "LORA_NAME",
- "links": [
- 924
- ],
- "shape": 3,
- "slot_index": 6
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeOutput4"
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 350,
- "type": "SeargeCheckpointLoader",
- "pos": [
- -3700,
- 2130
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 17,
- "mode": 0,
- "inputs": [
- {
- "name": "ckpt_name",
- "type": "CHECKPOINT_NAME",
- "link": 932
- }
- ],
- "outputs": [
- {
- "name": "MODEL",
- "type": "MODEL",
- "links": [
- 933
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "CLIP",
- "type": "CLIP",
- "links": [
- 934
- ],
- "shape": 3,
- "slot_index": 1
- },
- {
- "name": "VAE",
- "type": "VAE",
- "links": null,
- "shape": 3
- }
- ],
- "title": "BASE Model",
- "properties": {
- "Node name for S&R": "SeargeCheckpointLoader"
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 355,
- "type": "SeargeCheckpointLoader",
- "pos": [
- -3700,
- 2630
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 18,
- "mode": 0,
- "inputs": [
- {
- "name": "ckpt_name",
- "type": "CHECKPOINT_NAME",
- "link": 935
- }
- ],
- "outputs": [
- {
- "name": "MODEL",
- "type": "MODEL",
- "links": [
- 936
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "CLIP",
- "type": "CLIP",
- "links": [
- 937
- ],
- "shape": 3,
- "slot_index": 1
- },
- {
- "name": "VAE",
- "type": "VAE",
- "links": null,
- "shape": 3
- }
- ],
- "title": "REFINER Model",
- "properties": {
- "Node name for S&R": "SeargeCheckpointLoader"
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 351,
- "type": "SeargeVAELoader",
- "pos": [
- -3700,
- 2930
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 19,
- "mode": 0,
- "inputs": [
- {
- "name": "vae_name",
- "type": "VAE_NAME",
- "link": 938
- }
- ],
- "outputs": [
- {
- "name": "VAE",
- "type": "VAE",
- "links": [
- 939
- ],
- "shape": 3
- }
- ],
- "title": "VAE Model",
- "properties": {
- "Node name for S&R": "SeargeVAELoader"
- },
- "color": "#322",
- "bgcolor": "#533"
- },
- {
- "id": 352,
- "type": "SeargeUpscaleModelLoader",
- "pos": [
- -3700,
- 3230
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 20,
- "mode": 0,
- "inputs": [
- {
- "name": "upscaler_name",
- "type": "UPSCALER_NAME",
- "link": 940
- }
- ],
- "outputs": [
- {
- "name": "UPSCALE_MODEL",
- "type": "UPSCALE_MODEL",
- "links": [
- 942
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Main Upscale Model",
- "properties": {
- "Node name for S&R": "SeargeUpscaleModelLoader"
- },
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 356,
- "type": "SeargeUpscaleModelLoader",
- "pos": [
- -3700,
- 3430
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 21,
- "mode": 0,
- "inputs": [
- {
- "name": "upscaler_name",
- "type": "UPSCALER_NAME",
- "link": 941
- }
- ],
- "outputs": [
- {
- "name": "UPSCALE_MODEL",
- "type": "UPSCALE_MODEL",
- "links": [
- 943
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Supporting Upscale Model",
- "properties": {
- "Node name for S&R": "SeargeUpscaleModelLoader"
- },
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 270,
- "type": "SeargeInput1",
- "pos": [
- 1800,
- 130
- ],
- "size": {
- "0": 300,
- "1": 270
- },
- "flags": {
- "pinned": true
- },
- "order": 45,
- "mode": 0,
- "inputs": [
- {
- "name": "inputs",
- "type": "PARAMETER_INPUTS",
- "link": 722
- },
- {
- "name": "image",
- "type": "IMAGE",
- "link": 729
- },
- {
- "name": "mask",
- "type": "MASK",
- "link": 730,
- "slot_index": 2
- },
- {
- "name": "main_prompt",
- "type": "STRING",
- "link": 723,
- "widget": {
- "name": "main_prompt",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": ""
- }
- ]
- }
- },
- {
- "name": "secondary_prompt",
- "type": "STRING",
- "link": 724,
- "widget": {
- "name": "secondary_prompt",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": ""
- }
- ]
- }
- },
- {
- "name": "style_prompt",
- "type": "STRING",
- "link": 725,
- "widget": {
- "name": "style_prompt",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": ""
- }
- ]
- }
- },
- {
- "name": "negative_prompt",
- "type": "STRING",
- "link": 726,
- "widget": {
- "name": "negative_prompt",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": ""
- }
- ]
- }
- },
- {
- "name": "negative_style",
- "type": "STRING",
- "link": 727,
- "widget": {
- "name": "negative_style",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": ""
- }
- ]
- }
- }
- ],
- "outputs": [
- {
- "name": "inputs",
- "type": "PARAMETER_INPUTS",
- "links": [
- 945
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeInput1"
- },
- "widgets_values": [
- "",
- "",
- "",
- "",
- ""
- ],
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 131,
- "type": "SeargeParameterProcessor",
- "pos": [
- 3000,
- 130
- ],
- "size": {
- "0": 200,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 55,
- "mode": 0,
- "inputs": [
- {
- "name": "inputs",
- "type": "PARAMETER_INPUTS",
- "link": 944
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": [
- 534
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeParameterProcessor"
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 357,
- "type": "SeargeStylePreprocessor",
- "pos": [
- 2200,
- 130
- ],
- "size": {
- "0": 700,
- "1": 970
- },
- "flags": {
- "pinned": true
- },
- "order": 52,
- "mode": 0,
- "inputs": [
- {
- "name": "inputs",
- "type": "PARAMETER_INPUTS",
- "link": 945
- }
- ],
- "outputs": [
- {
- "name": "inputs",
- "type": "PARAMETER_INPUTS",
- "links": [
- 944
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeStylePreprocessor"
- },
- "widgets_values": [
- "test",
- "[unfinished work in progress]"
- ],
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 170,
- "type": "Reroute",
- "pos": [
- 3200,
- 1000
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 57,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 534,
- "pos": [
- 37.5,
- 0
- ],
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "PARAMETERS",
- "links": [
- 533
- ],
- "label": "data"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 359,
- "type": "SeargeOutput2",
- "pos": [
- 3200,
- 4530
- ],
- "size": {
- "0": 400,
- "1": 220
- },
- "flags": {
- "pinned": true
- },
- "order": 102,
- "mode": 0,
- "inputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "link": 1024
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": [
- 965
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "seed",
- "type": "INT",
- "links": [
- 948
- ],
- "shape": 3,
- "slot_index": 1
- },
- {
- "name": "image_width",
- "type": "INT",
- "links": [
- 959
- ],
- "shape": 3,
- "slot_index": 2
- },
- {
- "name": "image_height",
- "type": "INT",
- "links": [
- 960
- ],
- "shape": 3,
- "slot_index": 3
- },
- {
- "name": "steps",
- "type": "INT",
- "links": [
- 950
- ],
- "shape": 3,
- "slot_index": 4
- },
- {
- "name": "cfg",
- "type": "FLOAT",
- "links": [
- 951
- ],
- "shape": 3,
- "slot_index": 5
- },
- {
- "name": "sampler_name",
- "type": "SAMPLER_NAME",
- "links": [
- 957
- ],
- "shape": 3,
- "slot_index": 6
- },
- {
- "name": "scheduler",
- "type": "SCHEDULER_NAME",
- "links": [
- 958
- ],
- "shape": 3,
- "slot_index": 7
- },
- {
- "name": "save_image",
- "type": "ENABLE_STATE",
- "links": [
- 961
- ],
- "shape": 3,
- "slot_index": 8
- },
- {
- "name": "save_directory",
- "type": "SAVE_FOLDER",
- "links": [
- 962
- ],
- "shape": 3,
- "slot_index": 9
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeOutput2"
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 358,
- "type": "SeargeSDXLSampler2",
- "pos": [
- 4600,
- 4730
- ],
- "size": {
- "0": 300,
- "1": 370
- },
- "flags": {
- "pinned": true
- },
- "order": 278,
- "mode": 0,
- "inputs": [
- {
- "name": "base_model",
- "type": "MODEL",
- "link": 972
- },
- {
- "name": "base_positive",
- "type": "CONDITIONING",
- "link": 970,
- "slot_index": 1
- },
- {
- "name": "base_negative",
- "type": "CONDITIONING",
- "link": 969,
- "slot_index": 2
- },
- {
- "name": "refiner_model",
- "type": "MODEL",
- "link": 971
- },
- {
- "name": "refiner_positive",
- "type": "CONDITIONING",
- "link": 968,
- "slot_index": 4
- },
- {
- "name": "refiner_negative",
- "type": "CONDITIONING",
- "link": 967,
- "slot_index": 5
- },
- {
- "name": "latent_image",
- "type": "LATENT",
- "link": 966,
- "slot_index": 6
- },
- {
- "name": "sampler_name",
- "type": "SAMPLER_NAME",
- "link": 957
- },
- {
- "name": "scheduler",
- "type": "SCHEDULER_NAME",
- "link": 958
- },
- {
- "name": "noise_seed",
- "type": "INT",
- "link": 948,
- "widget": {
- "name": "noise_seed",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 18446744073709552000
- }
- ]
- }
- },
- {
- "name": "steps",
- "type": "INT",
- "link": 950,
- "widget": {
- "name": "steps",
- "config": [
- "INT",
- {
- "default": 20,
- "min": 1,
- "max": 200
- }
- ]
- }
- },
- {
- "name": "cfg",
- "type": "FLOAT",
- "link": 951,
- "widget": {
- "name": "cfg",
- "config": [
- "FLOAT",
- {
- "default": 7,
- "min": 0,
- "max": 30,
- "step": 0.5
- }
- ]
- }
- },
- {
- "name": "base_ratio",
- "type": "FLOAT",
- "link": 1018,
- "widget": {
- "name": "base_ratio",
- "config": [
- "FLOAT",
- {
- "default": 0.8,
- "min": 0,
- "max": 1,
- "step": 0.01
- }
- ]
- }
- },
- {
- "name": "denoise",
- "type": "FLOAT",
- "link": 1017,
- "widget": {
- "name": "denoise",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "min": 0,
- "max": 1,
- "step": 0.01
- }
- ]
- }
- },
- {
- "name": "refiner_prep_steps",
- "type": "INT",
- "link": 1021,
- "widget": {
- "name": "refiner_prep_steps",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 10
- }
- ]
- }
- },
- {
- "name": "noise_offset",
- "type": "INT",
- "link": 1020,
- "widget": {
- "name": "noise_offset",
- "config": [
- "INT",
- {
- "default": 1,
- "min": 0,
- "max": 1
- }
- ]
- }
- },
- {
- "name": "refiner_strength",
- "type": "FLOAT",
- "link": 1019,
- "widget": {
- "name": "refiner_strength",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "min": 0.01,
- "max": 1,
- "step": 0.05
- }
- ]
- }
- }
- ],
- "outputs": [
- {
- "name": "LATENT",
- "type": "LATENT",
- "links": [
- 973
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeSDXLSampler2"
- },
- "widgets_values": [
- 213103709520708,
- "randomize",
- 20,
- 7,
- 0.8,
- 1,
- 0,
- 1,
- 1
- ],
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 360,
- "type": "SeargeImageSave",
- "pos": [
- 5600,
- 4530
- ],
- "size": {
- "0": 350,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 286,
- "mode": 0,
- "inputs": [
- {
- "name": "images",
- "type": "IMAGE",
- "link": 963
- },
- {
- "name": "state",
- "type": "ENABLE_STATE",
- "link": 961
- },
- {
- "name": "save_to",
- "type": "SAVE_FOLDER",
- "link": 962
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeImageSave"
- },
- "widgets_values": [
- "SeargeSDXL-out-%date%/generated/gen"
- ],
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 364,
- "type": "SeargeImageSave",
- "pos": [
- 11800,
- 4830
- ],
- "size": {
- "0": 400,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 251,
- "mode": 0,
- "inputs": [
- {
- "name": "images",
- "type": "IMAGE",
- "link": 974
- },
- {
- "name": "state",
- "type": "ENABLE_STATE",
- "link": 975
- },
- {
- "name": "save_to",
- "type": "SAVE_FOLDER",
- "link": 1038
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeImageSave"
- },
- "widgets_values": [
- "SeargeSDXL-out-%date%/upscaled/up"
- ],
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 365,
- "type": "SeargeOutput2",
- "pos": [
- 9900,
- 4230
- ],
- "size": {
- "0": 400,
- "1": 220
- },
- "flags": {
- "pinned": true
- },
- "order": 156,
- "mode": 0,
- "inputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "link": 978
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": [
- 979
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "seed",
- "type": "INT",
- "links": null,
- "shape": 3
- },
- {
- "name": "image_width",
- "type": "INT",
- "links": [
- 980
- ],
- "shape": 3,
- "slot_index": 2
- },
- {
- "name": "image_height",
- "type": "INT",
- "links": [
- 981
- ],
- "shape": 3,
- "slot_index": 3
- },
- {
- "name": "steps",
- "type": "INT",
- "links": null,
- "shape": 3
- },
- {
- "name": "cfg",
- "type": "FLOAT",
- "links": null,
- "shape": 3
- },
- {
- "name": "sampler_name",
- "type": "SAMPLER_NAME",
- "links": null,
- "shape": 3
- },
- {
- "name": "scheduler",
- "type": "SCHEDULER_NAME",
- "links": null,
- "shape": 3
- },
- {
- "name": "save_image",
- "type": "ENABLE_STATE",
- "links": null,
- "shape": 3
- },
- {
- "name": "save_directory",
- "type": "SAVE_FOLDER",
- "links": [
- 1038
- ],
- "shape": 3,
- "slot_index": 9
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeOutput2"
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 366,
- "type": "SeargeOutput3",
- "pos": [
- 9900,
- 4530
- ],
- "size": {
- "0": 400,
- "1": 220
- },
- "flags": {
- "pinned": true
- },
- "order": 184,
- "mode": 0,
- "inputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "link": 979
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": null,
- "shape": 3
- },
- {
- "name": "denoise",
- "type": "FLOAT",
- "links": null,
- "shape": 3
- },
- {
- "name": "base_ratio",
- "type": "FLOAT",
- "links": null,
- "shape": 3
- },
- {
- "name": "refiner_strength",
- "type": "FLOAT",
- "links": null,
- "shape": 3
- },
- {
- "name": "noise_offset",
- "type": "INT",
- "links": null,
- "shape": 3
- },
- {
- "name": "precondition_steps",
- "type": "INT",
- "links": null,
- "shape": 3
- },
- {
- "name": "batch_size",
- "type": "INT",
- "links": null,
- "shape": 3
- },
- {
- "name": "upscale_resolution_factor",
- "type": "FLOAT",
- "links": [
- 976,
- 977
- ],
- "shape": 3,
- "slot_index": 7
- },
- {
- "name": "save_upscaled_image",
- "type": "ENABLE_STATE",
- "links": [
- 975
- ],
- "shape": 3,
- "slot_index": 8
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeOutput3"
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 361,
- "type": "SeargeImageSave",
- "pos": [
- 8600,
- 4230
- ],
- "size": {
- "0": 400,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 289,
- "mode": 0,
- "inputs": [
- {
- "name": "images",
- "type": "IMAGE",
- "link": 983,
- "slot_index": 0
- },
- {
- "name": "state",
- "type": "ENABLE_STATE",
- "link": 986
- },
- {
- "name": "save_to",
- "type": "SAVE_FOLDER",
- "link": 1037
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeImageSave"
- },
- "widgets_values": [
- "SeargeSDXL-out-%date%/hires/hrf"
- ],
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 363,
- "type": "SeargeSDXLImage2ImageSampler",
- "pos": [
- 8200,
- 4730
- ],
- "size": {
- "0": 300,
- "1": 470
- },
- "flags": {
- "pinned": true
- },
- "order": 288,
- "mode": 0,
- "inputs": [
- {
- "name": "base_model",
- "type": "MODEL",
- "link": 1006
- },
- {
- "name": "base_positive",
- "type": "CONDITIONING",
- "link": 1008
- },
- {
- "name": "base_negative",
- "type": "CONDITIONING",
- "link": 1009
- },
- {
- "name": "refiner_model",
- "type": "MODEL",
- "link": 1007
- },
- {
- "name": "refiner_positive",
- "type": "CONDITIONING",
- "link": 1010
- },
- {
- "name": "refiner_negative",
- "type": "CONDITIONING",
- "link": 1011
- },
- {
- "name": "image",
- "type": "IMAGE",
- "link": 1004
- },
- {
- "name": "vae",
- "type": "VAE",
- "link": 1005
- },
- {
- "name": "sampler_name",
- "type": "SAMPLER_NAME",
- "link": 999
- },
- {
- "name": "scheduler",
- "type": "SCHEDULER_NAME",
- "link": 1000
- },
- {
- "name": "upscale_model",
- "type": "UPSCALE_MODEL",
- "link": 1003
- },
- {
- "name": "noise_seed",
- "type": "INT",
- "link": 988,
- "widget": {
- "name": "noise_seed",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 18446744073709552000
- }
- ]
- }
- },
- {
- "name": "steps",
- "type": "INT",
- "link": 993,
- "widget": {
- "name": "steps",
- "config": [
- "INT",
- {
- "default": 20,
- "min": 0,
- "max": 200
- }
- ]
- }
- },
- {
- "name": "cfg",
- "type": "FLOAT",
- "link": 996,
- "widget": {
- "name": "cfg",
- "config": [
- "FLOAT",
- {
- "default": 7,
- "min": 0,
- "max": 30,
- "step": 0.5
- }
- ]
- }
- },
- {
- "name": "base_ratio",
- "type": "FLOAT",
- "link": 995,
- "widget": {
- "name": "base_ratio",
- "config": [
- "FLOAT",
- {
- "default": 0.8,
- "min": 0,
- "max": 1,
- "step": 0.01
- }
- ]
- }
- },
- {
- "name": "denoise",
- "type": "FLOAT",
- "link": 992,
- "widget": {
- "name": "denoise",
- "config": [
- "FLOAT",
- {
- "default": 0.25,
- "min": 0,
- "max": 1,
- "step": 0.01
- }
- ]
- }
- },
- {
- "name": "scaled_width",
- "type": "INT",
- "link": 1002,
- "widget": {
- "name": "scaled_width",
- "config": [
- "INT",
- {
- "default": 1536,
- "min": 0,
- "max": 8192,
- "step": 8
- }
- ]
- }
- },
- {
- "name": "scaled_height",
- "type": "INT",
- "link": 1001,
- "widget": {
- "name": "scaled_height",
- "config": [
- "INT",
- {
- "default": 1536,
- "min": 0,
- "max": 8192,
- "step": 8
- }
- ]
- }
- },
- {
- "name": "noise_offset",
- "type": "INT",
- "link": 989,
- "widget": {
- "name": "noise_offset",
- "config": [
- "INT",
- {
- "default": 1,
- "min": 0,
- "max": 1
- }
- ]
- }
- },
- {
- "name": "refiner_strength",
- "type": "FLOAT",
- "link": 994,
- "widget": {
- "name": "refiner_strength",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "min": 0.1,
- "max": 1,
- "step": 0.05
- }
- ]
- }
- },
- {
- "name": "softness",
- "type": "FLOAT",
- "link": 987,
- "widget": {
- "name": "softness",
- "config": [
- "FLOAT",
- {
- "default": 0,
- "min": 0,
- "max": 1,
- "step": 0.05
- }
- ]
- }
- }
- ],
- "outputs": [
- {
- "name": "IMAGE",
- "type": "IMAGE",
- "links": [
- 983,
- 984,
- 985
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeSDXLImage2ImageSampler"
- },
- "widgets_values": [
- 862579782100573,
- "randomize",
- 20,
- 7,
- 0.8,
- 0.25,
- 1536,
- 1536,
- 1,
- 1,
- 0
- ],
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 368,
- "type": "SeargeOutput6",
- "pos": [
- 6800,
- 4830
- ],
- "size": {
- "0": 400,
- "1": 220
- },
- "flags": {
- "pinned": true
- },
- "order": 157,
- "mode": 0,
- "inputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "link": 1014
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": null,
- "shape": 3
- },
- {
- "name": "hrf_steps",
- "type": "INT",
- "links": [
- 993
- ],
- "shape": 3,
- "slot_index": 1
- },
- {
- "name": "hrf_denoise",
- "type": "FLOAT",
- "links": [
- 992
- ],
- "shape": 3,
- "slot_index": 2
- },
- {
- "name": "hrf_upscale_factor",
- "type": "FLOAT",
- "links": [
- 990,
- 991
- ],
- "shape": 3,
- "slot_index": 3
- },
- {
- "name": "hrf_noise_offset",
- "type": "INT",
- "links": [
- 989
- ],
- "shape": 3,
- "slot_index": 4
- },
- {
- "name": "hrf_seed",
- "type": "INT",
- "links": [
- 988
- ],
- "shape": 3,
- "slot_index": 5
- },
- {
- "name": "hires_fix",
- "type": "ENABLE_STATE",
- "links": [
- 986
- ],
- "shape": 3,
- "slot_index": 6
- },
- {
- "name": "hrf_smoothness",
- "type": "FLOAT",
- "links": [
- 987
- ],
- "shape": 3,
- "slot_index": 7
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeOutput6"
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 367,
- "type": "SeargeOutput3",
- "pos": [
- 6800,
- 4530
- ],
- "size": {
- "0": 400,
- "1": 220
- },
- "flags": {
- "pinned": true
- },
- "order": 127,
- "mode": 0,
- "inputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "link": 1013
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": [
- 1014
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "denoise",
- "type": "FLOAT",
- "links": null,
- "shape": 3
- },
- {
- "name": "base_ratio",
- "type": "FLOAT",
- "links": [
- 995
- ],
- "shape": 3,
- "slot_index": 2
- },
- {
- "name": "refiner_strength",
- "type": "FLOAT",
- "links": [
- 994
- ],
- "shape": 3,
- "slot_index": 3
- },
- {
- "name": "noise_offset",
- "type": "INT",
- "links": null,
- "shape": 3
- },
- {
- "name": "precondition_steps",
- "type": "INT",
- "links": null,
- "shape": 3
- },
- {
- "name": "batch_size",
- "type": "INT",
- "links": null,
- "shape": 3
- },
- {
- "name": "upscale_resolution_factor",
- "type": "FLOAT",
- "links": null,
- "shape": 3
- },
- {
- "name": "save_upscaled_image",
- "type": "ENABLE_STATE",
- "links": null,
- "shape": 3
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeOutput3"
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 362,
- "type": "SeargeOutput2",
- "pos": [
- 6800,
- 4230
- ],
- "size": {
- "0": 400,
- "1": 220
- },
- "flags": {
- "pinned": true
- },
- "order": 113,
- "mode": 0,
- "inputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "link": 1012
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": [
- 1013
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "seed",
- "type": "INT",
- "links": null,
- "shape": 3
- },
- {
- "name": "image_width",
- "type": "INT",
- "links": [
- 997
- ],
- "shape": 3,
- "slot_index": 2
- },
- {
- "name": "image_height",
- "type": "INT",
- "links": [
- 998
- ],
- "shape": 3,
- "slot_index": 3
- },
- {
- "name": "steps",
- "type": "INT",
- "links": null,
- "shape": 3
- },
- {
- "name": "cfg",
- "type": "FLOAT",
- "links": [
- 996
- ],
- "shape": 3,
- "slot_index": 5
- },
- {
- "name": "sampler_name",
- "type": "SAMPLER_NAME",
- "links": [
- 999
- ],
- "shape": 3,
- "slot_index": 6
- },
- {
- "name": "scheduler",
- "type": "SCHEDULER_NAME",
- "links": [
- 1000
- ],
- "shape": 3,
- "slot_index": 7
- },
- {
- "name": "save_image",
- "type": "ENABLE_STATE",
- "links": null,
- "shape": 3
- },
- {
- "name": "save_directory",
- "type": "SAVE_FOLDER",
- "links": [
- 1037
- ],
- "shape": 3,
- "slot_index": 9
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeOutput2"
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 369,
- "type": "SeargeOutput3",
- "pos": [
- 3200,
- 4230
- ],
- "size": {
- "0": 400,
- "1": 220
- },
- "flags": {
- "pinned": true
- },
- "order": 95,
- "mode": 0,
- "inputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "link": 1023
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": [
- 1024
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "denoise",
- "type": "FLOAT",
- "links": [
- 1017
- ],
- "shape": 3,
- "slot_index": 1
- },
- {
- "name": "base_ratio",
- "type": "FLOAT",
- "links": [
- 1018
- ],
- "shape": 3,
- "slot_index": 2
- },
- {
- "name": "refiner_strength",
- "type": "FLOAT",
- "links": [
- 1019
- ],
- "shape": 3,
- "slot_index": 3
- },
- {
- "name": "noise_offset",
- "type": "INT",
- "links": [
- 1020
- ],
- "shape": 3,
- "slot_index": 4
- },
- {
- "name": "precondition_steps",
- "type": "INT",
- "links": [
- 1021
- ],
- "shape": 3,
- "slot_index": 5
- },
- {
- "name": "batch_size",
- "type": "INT",
- "links": [
- 1022
- ],
- "shape": 3,
- "slot_index": 6
- },
- {
- "name": "upscale_resolution_factor",
- "type": "FLOAT",
- "links": null,
- "shape": 3
- },
- {
- "name": "save_upscaled_image",
- "type": "ENABLE_STATE",
- "links": null,
- "shape": 3
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeOutput3"
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 370,
- "type": "SeargeOutput2",
- "pos": [
- -4399.70409651184,
- 4230.6233893932895
- ],
- "size": {
- "0": 400,
- "1": 220
- },
- "flags": {
- "pinned": true
- },
- "order": 66,
- "mode": 0,
- "inputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "link": 1025
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": [
- 1036
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "seed",
- "type": "INT",
- "links": null,
- "shape": 3
- },
- {
- "name": "image_width",
- "type": "INT",
- "links": [
- 1026,
- 1028,
- 1031,
- 1034
- ],
- "shape": 3,
- "slot_index": 2
- },
- {
- "name": "image_height",
- "type": "INT",
- "links": [
- 1027,
- 1029,
- 1033,
- 1035
- ],
- "shape": 3,
- "slot_index": 3
- },
- {
- "name": "steps",
- "type": "INT",
- "links": null,
- "shape": 3
- },
- {
- "name": "cfg",
- "type": "FLOAT",
- "links": null,
- "shape": 3
- },
- {
- "name": "sampler_name",
- "type": "SAMPLER_NAME",
- "links": null,
- "shape": 3
- },
- {
- "name": "scheduler",
- "type": "SCHEDULER_NAME",
- "links": null,
- "shape": 3
- },
- {
- "name": "save_image",
- "type": "ENABLE_STATE",
- "links": null,
- "shape": 3
- },
- {
- "name": "save_directory",
- "type": "SAVE_FOLDER",
- "links": null,
- "shape": 3
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeOutput2"
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 202,
- "type": "Reroute",
- "pos": [
- -4500,
- 3600
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 60,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 621
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "PARAMETERS",
- "links": [
- 622
- ],
- "slot_index": 0,
- "label": "data"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 182,
- "type": "Reroute",
- "pos": [
- -2100,
- 3600
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 68,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 562,
- "slot_index": 0,
- "pos": [
- 37.5,
- 0
- ]
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CLIP",
- "links": [
- 716
- ],
- "slot_index": 0,
- "label": "b m"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 184,
- "type": "Reroute",
- "pos": [
- -2000,
- 3600
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 32,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 564,
- "slot_index": 0,
- "pos": [
- 37.5,
- 0
- ]
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CLIP",
- "links": [
- 719
- ],
- "slot_index": 0,
- "label": "r m"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 200,
- "type": "Reroute",
- "pos": [
- 400,
- 4100
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 75,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 617
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "PARAMETERS",
- "links": [
- 616,
- 1039
- ],
- "slot_index": 0,
- "label": "data"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 337,
- "type": "SeargeConditioningMuxer5",
- "pos": [
- -300,
- 4530
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 233,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "CONDITIONING",
- "link": 1055
- },
- {
- "name": "input1",
- "type": "CONDITIONING",
- "link": 1056,
- "slot_index": 1
- },
- {
- "name": "input2",
- "type": "CONDITIONING",
- "link": 1057,
- "slot_index": 2
- },
- {
- "name": "input3",
- "type": "CONDITIONING",
- "link": 1058,
- "slot_index": 3
- },
- {
- "name": "input4",
- "type": "CONDITIONING",
- "link": 1059,
- "slot_index": 4
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 1111,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 4
- }
- ]
- },
- "slot_index": 5
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "CONDITIONING",
- "links": [
- 1043
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Positive Base Muxer",
- "properties": {
- "Node name for S&R": "SeargeConditioningMuxer5"
- },
- "widgets_values": [
- 0
- ],
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 336,
- "type": "SeargeConditioningMuxer5",
- "pos": [
- -300,
- 4780
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 234,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "CONDITIONING",
- "link": 1069
- },
- {
- "name": "input1",
- "type": "CONDITIONING",
- "link": 1068,
- "slot_index": 1
- },
- {
- "name": "input2",
- "type": "CONDITIONING",
- "link": 1067,
- "slot_index": 2
- },
- {
- "name": "input3",
- "type": "CONDITIONING",
- "link": 1066,
- "slot_index": 3
- },
- {
- "name": "input4",
- "type": "CONDITIONING",
- "link": 1065,
- "slot_index": 4
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 1113,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 4
- }
- ]
- }
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "CONDITIONING",
- "links": [
- 1049
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Negative Base Muxer",
- "properties": {
- "Node name for S&R": "SeargeConditioningMuxer5"
- },
- "widgets_values": [
- 0
- ],
- "color": "#322",
- "bgcolor": "#533"
- },
- {
- "id": 338,
- "type": "SeargeConditioningMuxer5",
- "pos": [
- -300,
- 5030
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 236,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "CONDITIONING",
- "link": 1079,
- "slot_index": 0
- },
- {
- "name": "input1",
- "type": "CONDITIONING",
- "link": 1078,
- "slot_index": 1
- },
- {
- "name": "input2",
- "type": "CONDITIONING",
- "link": 1077,
- "slot_index": 2
- },
- {
- "name": "input3",
- "type": "CONDITIONING",
- "link": 1076,
- "slot_index": 3
- },
- {
- "name": "input4",
- "type": "CONDITIONING",
- "link": 1075,
- "slot_index": 4
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 1115,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 4
- }
- ]
- },
- "slot_index": 5
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "CONDITIONING",
- "links": [
- 1041
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Positive Refiner Muxer",
- "properties": {
- "Node name for S&R": "SeargeConditioningMuxer5"
- },
- "widgets_values": [
- 0
- ],
- "color": "#233",
- "bgcolor": "#355"
- },
- {
- "id": 339,
- "type": "SeargeConditioningMuxer5",
- "pos": [
- -300,
- 5280
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 238,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "CONDITIONING",
- "link": 1089,
- "slot_index": 0
- },
- {
- "name": "input1",
- "type": "CONDITIONING",
- "link": 1088,
- "slot_index": 1
- },
- {
- "name": "input2",
- "type": "CONDITIONING",
- "link": 1087,
- "slot_index": 2
- },
- {
- "name": "input3",
- "type": "CONDITIONING",
- "link": 1086,
- "slot_index": 3
- },
- {
- "name": "input4",
- "type": "CONDITIONING",
- "link": 1085,
- "slot_index": 4
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 1117,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 4
- }
- ]
- },
- "slot_index": 5
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "CONDITIONING",
- "links": [
- 1040
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Negative Refiner Muxer",
- "properties": {
- "Node name for S&R": "SeargeConditioningMuxer5"
- },
- "widgets_values": [
- 0
- ],
- "color": "#332922",
- "bgcolor": "#593930"
- },
- {
- "id": 373,
- "type": "Reroute",
- "pos": [
- 100,
- 4950
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 244,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1049,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1145
- ],
- "label": "B-",
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 372,
- "type": "Reroute",
- "pos": [
- 100,
- 5000
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 246,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1041
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1146
- ],
- "label": "R+",
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 371,
- "type": "Reroute",
- "pos": [
- 100,
- 5050
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 248,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1040
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1147
- ],
- "slot_index": 0,
- "label": "R-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 375,
- "type": "SeargeConditioningMuxer5",
- "pos": [
- -300,
- 5780
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 235,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "CONDITIONING",
- "link": 1104
- },
- {
- "name": "input1",
- "type": "CONDITIONING",
- "link": 1103,
- "slot_index": 1
- },
- {
- "name": "input2",
- "type": "CONDITIONING",
- "link": 1102,
- "slot_index": 2
- },
- {
- "name": "input3",
- "type": "CONDITIONING",
- "link": 1101,
- "slot_index": 3
- },
- {
- "name": "input4",
- "type": "CONDITIONING",
- "link": 1100,
- "slot_index": 4
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 1133,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 4
- }
- ]
- }
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "CONDITIONING",
- "links": [
- 1141
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Negative Base Muxer",
- "properties": {
- "Node name for S&R": "SeargeConditioningMuxer5"
- },
- "widgets_values": [
- 0
- ],
- "color": "#322",
- "bgcolor": "#533"
- },
- {
- "id": 377,
- "type": "SeargeConditioningMuxer5",
- "pos": [
- -300,
- 6030
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 237,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "CONDITIONING",
- "link": 1099,
- "slot_index": 0
- },
- {
- "name": "input1",
- "type": "CONDITIONING",
- "link": 1098,
- "slot_index": 1
- },
- {
- "name": "input2",
- "type": "CONDITIONING",
- "link": 1097,
- "slot_index": 2
- },
- {
- "name": "input3",
- "type": "CONDITIONING",
- "link": 1096,
- "slot_index": 3
- },
- {
- "name": "input4",
- "type": "CONDITIONING",
- "link": 1095,
- "slot_index": 4
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 1134,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 4
- }
- ]
- },
- "slot_index": 5
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "CONDITIONING",
- "links": [
- 1142
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Positive Refiner Muxer",
- "properties": {
- "Node name for S&R": "SeargeConditioningMuxer5"
- },
- "widgets_values": [
- 0
- ],
- "color": "#233",
- "bgcolor": "#355"
- },
- {
- "id": 378,
- "type": "SeargeConditioningMuxer5",
- "pos": [
- -300,
- 6280
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 239,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "CONDITIONING",
- "link": 1094,
- "slot_index": 0
- },
- {
- "name": "input1",
- "type": "CONDITIONING",
- "link": 1093,
- "slot_index": 1
- },
- {
- "name": "input2",
- "type": "CONDITIONING",
- "link": 1092,
- "slot_index": 2
- },
- {
- "name": "input3",
- "type": "CONDITIONING",
- "link": 1091,
- "slot_index": 3
- },
- {
- "name": "input4",
- "type": "CONDITIONING",
- "link": 1090,
- "slot_index": 4
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 1135,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 4
- }
- ]
- },
- "slot_index": 5
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "CONDITIONING",
- "links": [
- 1143
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Negative Refiner Muxer",
- "properties": {
- "Node name for S&R": "SeargeConditioningMuxer5"
- },
- "widgets_values": [
- 0
- ],
- "color": "#332922",
- "bgcolor": "#593930"
- },
- {
- "id": 376,
- "type": "SeargeConditioningMuxer5",
- "pos": [
- -300,
- 5530
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 232,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "CONDITIONING",
- "link": 1109
- },
- {
- "name": "input1",
- "type": "CONDITIONING",
- "link": 1108,
- "slot_index": 1
- },
- {
- "name": "input2",
- "type": "CONDITIONING",
- "link": 1107,
- "slot_index": 2
- },
- {
- "name": "input3",
- "type": "CONDITIONING",
- "link": 1106,
- "slot_index": 3
- },
- {
- "name": "input4",
- "type": "CONDITIONING",
- "link": 1105,
- "slot_index": 4
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 1132,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 4
- }
- ]
- },
- "slot_index": 5
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "CONDITIONING",
- "links": [
- 1140
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Positive Base Muxer",
- "properties": {
- "Node name for S&R": "SeargeConditioningMuxer5"
- },
- "widgets_values": [
- 0
- ],
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 379,
- "type": "Reroute",
- "pos": [
- -440,
- 4500
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 199,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1050
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1055
- ],
- "slot_index": 0,
- "label": "sb+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 380,
- "type": "Reroute",
- "pos": [
- -440,
- 4530
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 197,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1051
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1056
- ],
- "slot_index": 0,
- "label": "pfb+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 381,
- "type": "Reroute",
- "pos": [
- -440,
- 4560
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 195,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1052
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1057
- ],
- "slot_index": 0,
- "label": "sfb+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 382,
- "type": "Reroute",
- "pos": [
- -440,
- 4590
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 193,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1053
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1058
- ],
- "slot_index": 0,
- "label": "wb+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 383,
- "type": "Reroute",
- "pos": [
- -440,
- 4620
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 191,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1054
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1059
- ],
- "slot_index": 0,
- "label": "cb+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 384,
- "type": "Reroute",
- "pos": [
- -439.69344968515696,
- 4750.48178896125
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 204,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1060
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1069
- ],
- "slot_index": 0,
- "label": "sb-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 385,
- "type": "Reroute",
- "pos": [
- -439.69344968515696,
- 4780.48178896125
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 205,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1061
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1068
- ],
- "slot_index": 0,
- "label": "pfb-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 386,
- "type": "Reroute",
- "pos": [
- -439.69344968515696,
- 4810.48178896125
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 207,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1062
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1067
- ],
- "slot_index": 0,
- "label": "sfb-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 387,
- "type": "Reroute",
- "pos": [
- -439.69344968515696,
- 4840.48178896125
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 202,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1063
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1066
- ],
- "slot_index": 0,
- "label": "wb-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 388,
- "type": "Reroute",
- "pos": [
- -439.69344968515696,
- 4870.48178896125
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 200,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1064
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1065
- ],
- "slot_index": 0,
- "label": "cb-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 389,
- "type": "Reroute",
- "pos": [
- -440.0128247178442,
- 5001.5996420061765
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 209,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1070
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1079
- ],
- "slot_index": 0,
- "label": "sr+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 390,
- "type": "Reroute",
- "pos": [
- -440.0128247178442,
- 5031.5996420061765
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 215,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1071
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1078
- ],
- "slot_index": 0,
- "label": "pfr+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 391,
- "type": "Reroute",
- "pos": [
- -440.0128247178442,
- 5061.5996420061765
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 217,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1072
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1077
- ],
- "slot_index": 0,
- "label": "sfr+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 392,
- "type": "Reroute",
- "pos": [
- -440.0128247178442,
- 5091.5996420061765
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 211,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1073
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1076
- ],
- "slot_index": 0,
- "label": "wr+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 393,
- "type": "Reroute",
- "pos": [
- -440.0128247178442,
- 5121.5996420061765
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 213,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1074
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1075
- ],
- "slot_index": 0,
- "label": "cr+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 394,
- "type": "Reroute",
- "pos": [
- -439.69898297216025,
- 5250.479291084056
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 210,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1260
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1089
- ],
- "slot_index": 0,
- "label": "sr-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 395,
- "type": "Reroute",
- "pos": [
- -439.69898297216025,
- 5280.479291084056
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 224,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1081
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1088
- ],
- "slot_index": 0,
- "label": "pfr-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 396,
- "type": "Reroute",
- "pos": [
- -439.69898297216025,
- 5310.479291084056
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 226,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1082
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1087
- ],
- "slot_index": 0,
- "label": "sfr-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 397,
- "type": "Reroute",
- "pos": [
- -439.69898297216025,
- 5340.479291084056
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 220,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1083
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1086
- ],
- "slot_index": 0,
- "label": "wr-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 398,
- "type": "Reroute",
- "pos": [
- -439.69898297216025,
- 5370.479291084056
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 222,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1084
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1085
- ],
- "slot_index": 0,
- "label": "cr-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 399,
- "type": "Reroute",
- "pos": [
- -440.0594766173699,
- 5501.284406981773
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 198,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1238,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1109
- ],
- "slot_index": 0,
- "label": "pfb+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 400,
- "type": "Reroute",
- "pos": [
- -440.0594766173699,
- 5531.284406981773
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 196,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1243,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1108
- ],
- "slot_index": 0,
- "label": "sfb+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 401,
- "type": "Reroute",
- "pos": [
- -440.0594766173699,
- 5561.284406981773
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 189,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1170,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1107
- ],
- "slot_index": 0,
- "label": "bso+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 402,
- "type": "Reroute",
- "pos": [
- -440.0594766173699,
- 5591.284406981773
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 194,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1261,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1106
- ],
- "slot_index": 0,
- "label": " wb+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 403,
- "type": "Reroute",
- "pos": [
- -440.0594766173699,
- 5621.284406981773
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 192,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1265,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1105
- ],
- "slot_index": 0,
- "label": " cb+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 404,
- "type": "Reroute",
- "pos": [
- -440.0594766173699,
- 5750.331942842333
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 208,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1241,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1104
- ],
- "slot_index": 0,
- "label": "sfb-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 405,
- "type": "Reroute",
- "pos": [
- -440.0594766173699,
- 5780.331942842333
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 206,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1245,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1103
- ],
- "slot_index": 0,
- "label": "pfb-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 406,
- "type": "Reroute",
- "pos": [
- -440.0594766173699,
- 5810.331942842333
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 190,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1175,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1102
- ],
- "slot_index": 0,
- "label": "bso-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 407,
- "type": "Reroute",
- "pos": [
- -440.0594766173699,
- 5840.331942842333
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 201,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1263,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1101
- ],
- "slot_index": 0,
- "label": " cb-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 408,
- "type": "Reroute",
- "pos": [
- -440.0594766173699,
- 5870.331942842333
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 203,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1267,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1100
- ],
- "slot_index": 0,
- "label": " wb-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 409,
- "type": "Reroute",
- "pos": [
- -439.14068030080034,
- 6001.215889755803
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 216,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1240,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1099
- ],
- "slot_index": 0,
- "label": "pfr+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 410,
- "type": "Reroute",
- "pos": [
- -439.14068030080034,
- 6031.215889755803
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 218,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1244,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1098
- ],
- "slot_index": 0,
- "label": "sfr+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 411,
- "type": "Reroute",
- "pos": [
- -439.14068030080034,
- 6061.215889755803
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 219,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1180,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1097
- ],
- "slot_index": 0,
- "label": "rso+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 412,
- "type": "Reroute",
- "pos": [
- -439.14068030080034,
- 6091.215889755803
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 212,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1262,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1096
- ],
- "slot_index": 0,
- "label": " wr+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 413,
- "type": "Reroute",
- "pos": [
- -439.14068030080034,
- 6121.215889755803
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 214,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1266,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1095
- ],
- "slot_index": 0,
- "label": " cr+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 414,
- "type": "Reroute",
- "pos": [
- -440.9787184458908,
- 6249.804604522524
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 227,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1242,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1094
- ],
- "slot_index": 0,
- "label": "sfr-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 415,
- "type": "Reroute",
- "pos": [
- -440.9787184458908,
- 6279.804604522524
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 225,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1246,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1093
- ],
- "slot_index": 0,
- "label": "pfr-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 416,
- "type": "Reroute",
- "pos": [
- -440.9787184458908,
- 6309.804604522524
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 228,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1185,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1092
- ],
- "slot_index": 0,
- "label": "rso-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 417,
- "type": "Reroute",
- "pos": [
- -440.9787184458908,
- 6339.804604522524
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 223,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1264,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1091
- ],
- "slot_index": 0,
- "label": "cr-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 418,
- "type": "Reroute",
- "pos": [
- -440.9787184458908,
- 6369.804604522524
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 221,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1268,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1090
- ],
- "slot_index": 0,
- "label": "wr-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 334,
- "type": "SeargeGenerated1",
- "pos": [
- -1000,
- 4180
- ],
- "size": {
- "0": 300,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 78,
- "mode": 0,
- "inputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "link": 881
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": [],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "operation_selector",
- "type": "INT",
- "links": null,
- "shape": 3
- },
- {
- "name": "prompt_style_selector",
- "type": "INT",
- "links": [
- 1110,
- 1112,
- 1114,
- 1116,
- 1136,
- 1137,
- 1138,
- 1139
- ],
- "shape": 3,
- "slot_index": 2
- },
- {
- "name": "prompt_style_group",
- "type": "INT",
- "links": [
- 1259
- ],
- "shape": 3
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeGenerated1"
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 419,
- "type": "Reroute",
- "pos": [
- -440,
- 4650
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 85,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1110
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "INT",
- "links": [
- 1111
- ],
- "slot_index": 0,
- "label": "pss"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 420,
- "type": "Reroute",
- "pos": [
- -440,
- 4900
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 86,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1112
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "INT",
- "links": [
- 1113
- ],
- "slot_index": 0,
- "label": "pss"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 421,
- "type": "Reroute",
- "pos": [
- -440,
- 5150
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 87,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1114
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "INT",
- "links": [
- 1115
- ],
- "slot_index": 0,
- "label": "pss"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 422,
- "type": "Reroute",
- "pos": [
- -440,
- 5400
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 88,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1116
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "INT",
- "links": [
- 1117
- ],
- "slot_index": 0,
- "label": "pss"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 303,
- "type": "Reroute",
- "pos": [
- -1100,
- 4450
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 144,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 793,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 798
- ],
- "slot_index": 0,
- "label": "rc -"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 302,
- "type": "Reroute",
- "pos": [
- -1100,
- 4410
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 143,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 792,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 799
- ],
- "slot_index": 0,
- "label": "rc +"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 301,
- "type": "Reroute",
- "pos": [
- -1100,
- 4370
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 140,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 791,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 800
- ],
- "slot_index": 0,
- "label": "bc -"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 300,
- "type": "Reroute",
- "pos": [
- -1100,
- 4330
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 137,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1118,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 801
- ],
- "slot_index": 0,
- "label": "bc +"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 424,
- "type": "Reroute",
- "pos": [
- 1000,
- 4850
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 259,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1157,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1202,
- 1205
- ],
- "slot_index": 0,
- "label": "B-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 425,
- "type": "Reroute",
- "pos": [
- 1000,
- 4900
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 260,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1158,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1203,
- 1208
- ],
- "slot_index": 0,
- "label": "R+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 426,
- "type": "Reroute",
- "pos": [
- 1000,
- 4950
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 261,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1159,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1204,
- 1207
- ],
- "slot_index": 0,
- "label": "R-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 428,
- "type": "Reroute",
- "pos": [
- 2501.334326171875,
- 4251.2181640625
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 266,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1210,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1129
- ],
- "slot_index": 0,
- "label": "b-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 429,
- "type": "Reroute",
- "pos": [
- 2501.334326171875,
- 4301.2181640625
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 269,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1211,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1130
- ],
- "slot_index": 0,
- "label": "r+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 430,
- "type": "Reroute",
- "pos": [
- 2501.334326171875,
- 4351.2181640625
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 268,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1212,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1131
- ],
- "slot_index": 0,
- "label": "r-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 427,
- "type": "Reroute",
- "pos": [
- 2501.334326171875,
- 4201.2181640625
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 267,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1209,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1128
- ],
- "slot_index": 0,
- "label": "b+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 431,
- "type": "Reroute",
- "pos": [
- -440,
- 5650
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 89,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1136
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "INT",
- "links": [
- 1132
- ],
- "slot_index": 0,
- "label": "pss"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 432,
- "type": "Reroute",
- "pos": [
- -440,
- 5900
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 90,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1137
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "INT",
- "links": [
- 1133
- ],
- "slot_index": 0,
- "label": "pss"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 433,
- "type": "Reroute",
- "pos": [
- -440,
- 6150
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 91,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1138
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "INT",
- "links": [
- 1134
- ],
- "slot_index": 0,
- "label": "pss"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 434,
- "type": "Reroute",
- "pos": [
- -440,
- 6400
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 92,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1139
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "INT",
- "links": [
- 1135
- ],
- "slot_index": 0,
- "label": "pss"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 374,
- "type": "Reroute",
- "pos": [
- 100,
- 4900
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 243,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1043
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1144
- ],
- "label": "B+",
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 435,
- "type": "Reroute",
- "pos": [
- 100.58035101247651,
- 6050.94617317214
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 249,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1143
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1151
- ],
- "label": "R-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 436,
- "type": "Reroute",
- "pos": [
- 100.58035101247651,
- 6000.94617317214
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 247,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1142
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1150
- ],
- "label": "R+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 437,
- "type": "Reroute",
- "pos": [
- 100.58035101247651,
- 5950.94617317214
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 245,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1141,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1149
- ],
- "label": "B-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 438,
- "type": "Reroute",
- "pos": [
- 100.58035101247651,
- 5900.94617317214
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 242,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1140
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1148
- ],
- "label": "B+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 440,
- "type": "SeargeConditioningMuxer2",
- "pos": [
- 300,
- 5330
- ],
- "size": {
- "0": 250,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 254,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "CONDITIONING",
- "link": 1145
- },
- {
- "name": "input1",
- "type": "CONDITIONING",
- "link": 1149,
- "slot_index": 1
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 1257,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 1
- }
- ]
- },
- "slot_index": 2
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "CONDITIONING",
- "links": [
- 1157
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeConditioningMuxer2"
- },
- "widgets_values": [
- 0
- ],
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 441,
- "type": "SeargeConditioningMuxer2",
- "pos": [
- 300,
- 5530
- ],
- "size": {
- "0": 250,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 255,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "CONDITIONING",
- "link": 1146
- },
- {
- "name": "input1",
- "type": "CONDITIONING",
- "link": 1150,
- "slot_index": 1
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 1256,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 1
- }
- ]
- },
- "slot_index": 2
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "CONDITIONING",
- "links": [
- 1158
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeConditioningMuxer2"
- },
- "widgets_values": [
- 0
- ],
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 439,
- "type": "SeargeConditioningMuxer2",
- "pos": [
- 300,
- 5130
- ],
- "size": {
- "0": 250,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 253,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "CONDITIONING",
- "link": 1144
- },
- {
- "name": "input1",
- "type": "CONDITIONING",
- "link": 1148,
- "slot_index": 1
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 1258,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 1
- }
- ]
- },
- "slot_index": 2
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "CONDITIONING",
- "links": [
- 1156
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeConditioningMuxer2"
- },
- "widgets_values": [
- 0
- ],
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 442,
- "type": "SeargeConditioningMuxer2",
- "pos": [
- 300,
- 5730
- ],
- "size": {
- "0": 250,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 256,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "CONDITIONING",
- "link": 1147
- },
- {
- "name": "input1",
- "type": "CONDITIONING",
- "link": 1151,
- "slot_index": 1
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 1255,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 1
- }
- ]
- },
- "slot_index": 2
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "CONDITIONING",
- "links": [
- 1159
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeConditioningMuxer2"
- },
- "widgets_values": [
- 0
- ],
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 309,
- "type": "Reroute",
- "pos": [
- -750,
- 4410
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 172,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 799
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1070
- ],
- "label": "sr+",
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 310,
- "type": "Reroute",
- "pos": [
- -750,
- 4370
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 169,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 800
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1060
- ],
- "label": "sb-",
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 311,
- "type": "Reroute",
- "pos": [
- -750,
- 4330
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 166,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 801
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1050
- ],
- "label": "sb+",
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 446,
- "type": "Reroute",
- "pos": [
- -1098.3110595703124,
- 6450.41689453125
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 131,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1164,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1160
- ],
- "slot_index": 0,
- "label": "bs+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 447,
- "type": "Reroute",
- "pos": [
- -1098.3110595703124,
- 6490.41689453125
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 132,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1165,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1161
- ],
- "slot_index": 0,
- "label": "bs-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 448,
- "type": "Reroute",
- "pos": [
- -1098.3110595703124,
- 6530.41689453125
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 149,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1166,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1162
- ],
- "slot_index": 0,
- "label": "rs+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 449,
- "type": "Reroute",
- "pos": [
- -1098.3110595703124,
- 6570.41689453125
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 154,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1167,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1163
- ],
- "slot_index": 0,
- "label": "rs-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 450,
- "type": "Reroute",
- "pos": [
- -879.539599609375,
- 6450.50380859375
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 160,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1160,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1170
- ],
- "label": "bso+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 451,
- "type": "Reroute",
- "pos": [
- -879.539599609375,
- 6490.50380859375
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 161,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1161,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1175
- ],
- "label": "bso-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 452,
- "type": "Reroute",
- "pos": [
- -879.539599609375,
- 6530.50380859375
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 178,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1162,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1180
- ],
- "label": "rso+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 453,
- "type": "Reroute",
- "pos": [
- -879.539599609375,
- 6570.50380859375
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 183,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1163,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1185
- ],
- "label": "rso-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 455,
- "type": "SeargeConditioningMuxer2",
- "pos": [
- 1500,
- 4630
- ],
- "size": {
- "0": 250,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 262,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "CONDITIONING",
- "link": 1202,
- "slot_index": 0
- },
- {
- "name": "input1",
- "type": "CONDITIONING",
- "link": 1206,
- "slot_index": 1
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 1198,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 1
- }
- ]
- }
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "CONDITIONING",
- "links": [
- 1210
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeConditioningMuxer2"
- },
- "widgets_values": [
- 0
- ],
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 456,
- "type": "SeargeConditioningMuxer2",
- "pos": [
- 1500,
- 4830
- ],
- "size": {
- "0": 250,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 265,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "CONDITIONING",
- "link": 1203,
- "slot_index": 0
- },
- {
- "name": "input1",
- "type": "CONDITIONING",
- "link": 1207,
- "slot_index": 1
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 1199,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 1
- }
- ]
- }
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "CONDITIONING",
- "links": [
- 1211
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeConditioningMuxer2"
- },
- "widgets_values": [
- 0
- ],
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 457,
- "type": "SeargeConditioningMuxer2",
- "pos": [
- 1500,
- 5030
- ],
- "size": {
- "0": 250,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 264,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "CONDITIONING",
- "link": 1204,
- "slot_index": 0
- },
- {
- "name": "input1",
- "type": "CONDITIONING",
- "link": 1208,
- "slot_index": 1
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 1200,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 1
- }
- ]
- }
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "CONDITIONING",
- "links": [
- 1212
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeConditioningMuxer2"
- },
- "widgets_values": [
- 0
- ],
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 454,
- "type": "SeargeConditioningMuxer2",
- "pos": [
- 1500,
- 4430
- ],
- "size": {
- "0": 250,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 263,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "CONDITIONING",
- "link": 1201,
- "slot_index": 0
- },
- {
- "name": "input1",
- "type": "CONDITIONING",
- "link": 1205,
- "slot_index": 1
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 1197,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 1
- }
- ]
- }
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "CONDITIONING",
- "links": [
- 1209
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeConditioningMuxer2"
- },
- "widgets_values": [
- 0
- ],
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 458,
- "type": "SeargeIntegerConstant",
- "pos": [
- 1000,
- 4540
- ],
- "size": {
- "0": 210,
- "1": 58
- },
- "flags": {
- "pinned": true
- },
- "order": 12,
- "mode": 0,
- "outputs": [
- {
- "name": "value",
- "type": "INT",
- "links": [
- 1197,
- 1198,
- 1199,
- 1200
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "SWAP + / -",
- "properties": {
- "Node name for S&R": "SeargeIntegerConstant"
- },
- "widgets_values": [
- 0
- ],
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 460,
- "type": "Reroute",
- "pos": [
- 100,
- 4300
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 93,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1259,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "INT",
- "links": [
- 1255,
- 1256,
- 1257,
- 1258
- ],
- "label": "grp"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 344,
- "type": "Note",
- "pos": [
- 600,
- 1130
- ],
- "size": {
- "0": 500,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 13,
- "mode": 0,
- "title": "Off by default for performance reasons",
- "properties": {
- "text": ""
- },
- "widgets_values": [
- " Connect this \"jumper\" to enable UPSCALING\n (this is NOT related to hires fix)\n (when it's disconnected ignore the warnings printed to the console)"
- ],
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 423,
- "type": "Reroute",
- "pos": [
- 1000,
- 4800
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 258,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1156,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1201,
- 1206
- ],
- "slot_index": 0,
- "label": "B+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- }
- ],
- "links": [
- [
- 86,
- 66,
- 0,
- 68,
- 0,
- "IMAGE"
- ],
- [
- 87,
- 67,
- 0,
- 68,
- 1,
- "IMAGE"
- ],
- [
- 89,
- 68,
- 0,
- 69,
- 0,
- "IMAGE"
- ],
- [
- 91,
- 64,
- 0,
- 69,
- 1,
- "INT"
- ],
- [
- 92,
- 65,
- 0,
- 69,
- 2,
- "INT"
- ],
- [
- 210,
- 51,
- 0,
- 40,
- 8,
- "INT"
- ],
- [
- 211,
- 51,
- 0,
- 41,
- 5,
- "INT"
- ],
- [
- 212,
- 52,
- 0,
- 40,
- 9,
- "INT"
- ],
- [
- 213,
- 52,
- 0,
- 41,
- 6,
- "INT"
- ],
- [
- 214,
- 54,
- 0,
- 40,
- 12,
- "INT"
- ],
- [
- 215,
- 54,
- 0,
- 42,
- 3,
- "INT"
- ],
- [
- 216,
- 53,
- 0,
- 40,
- 13,
- "INT"
- ],
- [
- 217,
- 53,
- 0,
- 42,
- 4,
- "INT"
- ],
- [
- 223,
- 104,
- 0,
- 87,
- 0,
- "IMAGE"
- ],
- [
- 224,
- 104,
- 0,
- 86,
- 0,
- "IMAGE"
- ],
- [
- 225,
- 104,
- 0,
- 19,
- 0,
- "IMAGE"
- ],
- [
- 424,
- 98,
- 0,
- 130,
- 6,
- "FLOAT"
- ],
- [
- 439,
- 133,
- 0,
- 136,
- 0,
- "PARAMETER_INPUTS"
- ],
- [
- 440,
- 143,
- 0,
- 133,
- 0,
- "PARAMETER_INPUTS"
- ],
- [
- 463,
- 153,
- 1,
- 40,
- 2,
- "STRING"
- ],
- [
- 464,
- 153,
- 1,
- 40,
- 4,
- "STRING"
- ],
- [
- 465,
- 153,
- 2,
- 40,
- 3,
- "STRING"
- ],
- [
- 466,
- 153,
- 4,
- 40,
- 5,
- "STRING"
- ],
- [
- 467,
- 153,
- 4,
- 40,
- 6,
- "STRING"
- ],
- [
- 468,
- 153,
- 4,
- 40,
- 7,
- "STRING"
- ],
- [
- 469,
- 153,
- 5,
- 42,
- 2,
- "STRING"
- ],
- [
- 470,
- 153,
- 5,
- 41,
- 3,
- "STRING"
- ],
- [
- 471,
- 153,
- 5,
- 41,
- 4,
- "STRING"
- ],
- [
- 472,
- 153,
- 3,
- 41,
- 1,
- "STRING"
- ],
- [
- 473,
- 153,
- 3,
- 41,
- 2,
- "STRING"
- ],
- [
- 474,
- 153,
- 3,
- 42,
- 1,
- "STRING"
- ],
- [
- 501,
- 161,
- 1,
- 51,
- 1,
- "FLOAT"
- ],
- [
- 502,
- 161,
- 1,
- 52,
- 1,
- "FLOAT"
- ],
- [
- 503,
- 161,
- 2,
- 54,
- 1,
- "FLOAT"
- ],
- [
- 504,
- 161,
- 2,
- 53,
- 1,
- "FLOAT"
- ],
- [
- 505,
- 145,
- 3,
- 75,
- 2,
- "FLOAT"
- ],
- [
- 506,
- 145,
- 3,
- 77,
- 2,
- "FLOAT"
- ],
- [
- 507,
- 145,
- 4,
- 76,
- 2,
- "FLOAT"
- ],
- [
- 508,
- 145,
- 4,
- 78,
- 2,
- "FLOAT"
- ],
- [
- 533,
- 170,
- 0,
- 172,
- 0,
- "*"
- ],
- [
- 534,
- 131,
- 0,
- 170,
- 0,
- "*"
- ],
- [
- 537,
- 153,
- 0,
- 161,
- 0,
- "PARAMETERS"
- ],
- [
- 553,
- 172,
- 0,
- 152,
- 0,
- "PARAMETERS"
- ],
- [
- 561,
- 174,
- 0,
- 183,
- 0,
- "*"
- ],
- [
- 562,
- 176,
- 0,
- 182,
- 0,
- "*"
- ],
- [
- 563,
- 175,
- 0,
- 181,
- 0,
- "*"
- ],
- [
- 564,
- 177,
- 0,
- 184,
- 0,
- "*"
- ],
- [
- 587,
- 188,
- 0,
- 145,
- 0,
- "PARAMETERS"
- ],
- [
- 588,
- 178,
- 0,
- 185,
- 0,
- "*"
- ],
- [
- 598,
- 189,
- 0,
- 195,
- 0,
- "*"
- ],
- [
- 603,
- 181,
- 0,
- 196,
- 0,
- "*"
- ],
- [
- 605,
- 183,
- 0,
- 197,
- 0,
- "*"
- ],
- [
- 611,
- 195,
- 0,
- 198,
- 0,
- "*"
- ],
- [
- 614,
- 199,
- 0,
- 46,
- 1,
- "VAE"
- ],
- [
- 616,
- 200,
- 0,
- 189,
- 0,
- "*"
- ],
- [
- 617,
- 188,
- 0,
- 200,
- 0,
- "*"
- ],
- [
- 618,
- 190,
- 0,
- 201,
- 0,
- "*"
- ],
- [
- 619,
- 201,
- 0,
- 188,
- 0,
- "*"
- ],
- [
- 621,
- 152,
- 0,
- 202,
- 0,
- "*"
- ],
- [
- 622,
- 202,
- 0,
- 190,
- 0,
- "*"
- ],
- [
- 623,
- 186,
- 0,
- 66,
- 0,
- "UPSCALE_MODEL"
- ],
- [
- 633,
- 207,
- 0,
- 208,
- 0,
- "*"
- ],
- [
- 634,
- 46,
- 0,
- 207,
- 0,
- "*"
- ],
- [
- 647,
- 76,
- 0,
- 213,
- 0,
- "*"
- ],
- [
- 648,
- 77,
- 0,
- 212,
- 0,
- "*"
- ],
- [
- 649,
- 78,
- 0,
- 211,
- 0,
- "*"
- ],
- [
- 662,
- 40,
- 0,
- 219,
- 0,
- "*"
- ],
- [
- 663,
- 40,
- 1,
- 220,
- 0,
- "*"
- ],
- [
- 664,
- 40,
- 2,
- 221,
- 0,
- "*"
- ],
- [
- 665,
- 40,
- 3,
- 222,
- 0,
- "*"
- ],
- [
- 666,
- 41,
- 0,
- 223,
- 0,
- "*"
- ],
- [
- 667,
- 41,
- 1,
- 224,
- 0,
- "*"
- ],
- [
- 668,
- 42,
- 0,
- 225,
- 0,
- "*"
- ],
- [
- 669,
- 42,
- 1,
- 226,
- 0,
- "*"
- ],
- [
- 670,
- 219,
- 0,
- 227,
- 0,
- "*"
- ],
- [
- 671,
- 220,
- 0,
- 228,
- 0,
- "*"
- ],
- [
- 672,
- 221,
- 0,
- 229,
- 0,
- "*"
- ],
- [
- 673,
- 222,
- 0,
- 230,
- 0,
- "*"
- ],
- [
- 674,
- 223,
- 0,
- 231,
- 0,
- "*"
- ],
- [
- 675,
- 224,
- 0,
- 232,
- 0,
- "*"
- ],
- [
- 676,
- 225,
- 0,
- 233,
- 0,
- "*"
- ],
- [
- 677,
- 226,
- 0,
- 234,
- 0,
- "*"
- ],
- [
- 678,
- 227,
- 0,
- 55,
- 0,
- "CONDITIONING"
- ],
- [
- 679,
- 228,
- 0,
- 56,
- 0,
- "CONDITIONING"
- ],
- [
- 680,
- 229,
- 0,
- 57,
- 0,
- "CONDITIONING"
- ],
- [
- 681,
- 230,
- 0,
- 58,
- 0,
- "CONDITIONING"
- ],
- [
- 682,
- 227,
- 0,
- 75,
- 1,
- "CONDITIONING"
- ],
- [
- 683,
- 228,
- 0,
- 76,
- 1,
- "CONDITIONING"
- ],
- [
- 684,
- 229,
- 0,
- 77,
- 1,
- "CONDITIONING"
- ],
- [
- 685,
- 230,
- 0,
- 78,
- 1,
- "CONDITIONING"
- ],
- [
- 686,
- 231,
- 0,
- 75,
- 0,
- "CONDITIONING"
- ],
- [
- 687,
- 232,
- 0,
- 76,
- 0,
- "CONDITIONING"
- ],
- [
- 688,
- 233,
- 0,
- 77,
- 0,
- "CONDITIONING"
- ],
- [
- 689,
- 234,
- 0,
- 78,
- 0,
- "CONDITIONING"
- ],
- [
- 690,
- 46,
- 0,
- 235,
- 0,
- "IMAGE"
- ],
- [
- 693,
- 198,
- 0,
- 237,
- 0,
- "*"
- ],
- [
- 694,
- 237,
- 0,
- 209,
- 0,
- "*"
- ],
- [
- 695,
- 179,
- 0,
- 238,
- 0,
- "*"
- ],
- [
- 696,
- 238,
- 0,
- 186,
- 0,
- "*"
- ],
- [
- 697,
- 180,
- 0,
- 239,
- 0,
- "*"
- ],
- [
- 698,
- 239,
- 0,
- 187,
- 0,
- "*"
- ],
- [
- 699,
- 239,
- 0,
- 210,
- 0,
- "*"
- ],
- [
- 701,
- 240,
- 0,
- 66,
- 1,
- "IMAGE"
- ],
- [
- 702,
- 240,
- 0,
- 67,
- 1,
- "IMAGE"
- ],
- [
- 703,
- 209,
- 0,
- 241,
- 0,
- "*"
- ],
- [
- 704,
- 69,
- 0,
- 243,
- 0,
- "IMAGE"
- ],
- [
- 705,
- 187,
- 0,
- 244,
- 0,
- "*"
- ],
- [
- 706,
- 244,
- 0,
- 67,
- 0,
- "UPSCALE_MODEL"
- ],
- [
- 708,
- 245,
- 0,
- 206,
- 0,
- "*"
- ],
- [
- 710,
- 183,
- 0,
- 248,
- 0,
- "*"
- ],
- [
- 711,
- 181,
- 0,
- 247,
- 0,
- "*"
- ],
- [
- 712,
- 248,
- 0,
- 205,
- 0,
- "*"
- ],
- [
- 713,
- 247,
- 0,
- 204,
- 0,
- "*"
- ],
- [
- 714,
- 105,
- 0,
- 249,
- 0,
- "*"
- ],
- [
- 715,
- 249,
- 0,
- 104,
- 0,
- "*"
- ],
- [
- 716,
- 182,
- 0,
- 250,
- 0,
- "*"
- ],
- [
- 717,
- 250,
- 0,
- 40,
- 0,
- "CLIP"
- ],
- [
- 718,
- 250,
- 0,
- 41,
- 0,
- "CLIP"
- ],
- [
- 719,
- 184,
- 0,
- 251,
- 0,
- "*"
- ],
- [
- 720,
- 251,
- 0,
- 40,
- 1,
- "CLIP"
- ],
- [
- 721,
- 251,
- 0,
- 42,
- 0,
- "CLIP"
- ],
- [
- 722,
- 136,
- 0,
- 270,
- 0,
- "PARAMETER_INPUTS"
- ],
- [
- 723,
- 3,
- 0,
- 270,
- 3,
- "STRING"
- ],
- [
- 724,
- 5,
- 0,
- 270,
- 4,
- "STRING"
- ],
- [
- 725,
- 6,
- 0,
- 270,
- 5,
- "STRING"
- ],
- [
- 726,
- 7,
- 0,
- 270,
- 6,
- "STRING"
- ],
- [
- 727,
- 8,
- 0,
- 270,
- 7,
- "STRING"
- ],
- [
- 729,
- 268,
- 0,
- 270,
- 1,
- "IMAGE"
- ],
- [
- 730,
- 269,
- 1,
- 270,
- 2,
- "MASK"
- ],
- [
- 732,
- 271,
- 0,
- 199,
- 0,
- "*"
- ],
- [
- 733,
- 185,
- 0,
- 271,
- 0,
- "*"
- ],
- [
- 734,
- 271,
- 0,
- 245,
- 0,
- "*"
- ],
- [
- 735,
- 150,
- 0,
- 272,
- 0,
- "PARAMETER_INPUTS"
- ],
- [
- 736,
- 272,
- 0,
- 143,
- 0,
- "PARAMETER_INPUTS"
- ],
- [
- 756,
- 281,
- 0,
- 282,
- 0,
- "IMAGE"
- ],
- [
- 758,
- 282,
- 0,
- 283,
- 0,
- "LATENT"
- ],
- [
- 760,
- 286,
- 0,
- 284,
- 0,
- "IMAGE"
- ],
- [
- 761,
- 284,
- 0,
- 285,
- 0,
- "IMAGE"
- ],
- [
- 762,
- 185,
- 0,
- 287,
- 0,
- "*"
- ],
- [
- 764,
- 285,
- 0,
- 288,
- 0,
- "MASK"
- ],
- [
- 765,
- 288,
- 0,
- 283,
- 1,
- "MASK"
- ],
- [
- 767,
- 291,
- 0,
- 290,
- 0,
- "PARAMETERS"
- ],
- [
- 768,
- 293,
- 7,
- 286,
- 0,
- "MASK"
- ],
- [
- 769,
- 293,
- 6,
- 281,
- 0,
- "IMAGE"
- ],
- [
- 770,
- 290,
- 2,
- 281,
- 1,
- "INT"
- ],
- [
- 771,
- 290,
- 2,
- 284,
- 1,
- "INT"
- ],
- [
- 772,
- 290,
- 3,
- 281,
- 2,
- "INT"
- ],
- [
- 773,
- 290,
- 3,
- 284,
- 2,
- "INT"
- ],
- [
- 774,
- 287,
- 0,
- 294,
- 0,
- "*"
- ],
- [
- 775,
- 294,
- 0,
- 282,
- 1,
- "VAE"
- ],
- [
- 776,
- 291,
- 0,
- 296,
- 0,
- "*"
- ],
- [
- 777,
- 283,
- 0,
- 295,
- 0,
- "*"
- ],
- [
- 778,
- 282,
- 0,
- 297,
- 0,
- "*"
- ],
- [
- 779,
- 297,
- 0,
- 298,
- 0,
- "*"
- ],
- [
- 780,
- 295,
- 0,
- 289,
- 0,
- "*"
- ],
- [
- 781,
- 231,
- 0,
- 55,
- 1,
- "CONDITIONING"
- ],
- [
- 782,
- 232,
- 0,
- 56,
- 1,
- "CONDITIONING"
- ],
- [
- 783,
- 233,
- 0,
- 57,
- 1,
- "CONDITIONING"
- ],
- [
- 784,
- 234,
- 0,
- 58,
- 1,
- "CONDITIONING"
- ],
- [
- 785,
- 44,
- 0,
- 299,
- 0,
- "*"
- ],
- [
- 787,
- 290,
- 0,
- 293,
- 0,
- "PARAMETERS"
- ],
- [
- 791,
- 228,
- 0,
- 301,
- 0,
- "*"
- ],
- [
- 792,
- 229,
- 0,
- 302,
- 0,
- "*"
- ],
- [
- 793,
- 230,
- 0,
- 303,
- 0,
- "*"
- ],
- [
- 794,
- 58,
- 0,
- 304,
- 0,
- "*"
- ],
- [
- 795,
- 57,
- 0,
- 305,
- 0,
- "*"
- ],
- [
- 796,
- 56,
- 0,
- 306,
- 0,
- "*"
- ],
- [
- 797,
- 55,
- 0,
- 307,
- 0,
- "*"
- ],
- [
- 798,
- 303,
- 0,
- 308,
- 0,
- "*"
- ],
- [
- 799,
- 302,
- 0,
- 309,
- 0,
- "*"
- ],
- [
- 800,
- 301,
- 0,
- 310,
- 0,
- "*"
- ],
- [
- 801,
- 300,
- 0,
- 311,
- 0,
- "*"
- ],
- [
- 806,
- 312,
- 0,
- 240,
- 0,
- "*"
- ],
- [
- 819,
- 316,
- 0,
- 194,
- 0,
- "*"
- ],
- [
- 820,
- 317,
- 0,
- 193,
- 0,
- "*"
- ],
- [
- 821,
- 315,
- 0,
- 192,
- 0,
- "*"
- ],
- [
- 822,
- 314,
- 0,
- 191,
- 0,
- "*"
- ],
- [
- 823,
- 218,
- 0,
- 316,
- 0,
- "*"
- ],
- [
- 824,
- 217,
- 0,
- 317,
- 0,
- "*"
- ],
- [
- 825,
- 216,
- 0,
- 315,
- 0,
- "*"
- ],
- [
- 826,
- 215,
- 0,
- 314,
- 0,
- "*"
- ],
- [
- 827,
- 227,
- 0,
- 321,
- 1,
- "CONDITIONING"
- ],
- [
- 828,
- 227,
- 0,
- 313,
- 0,
- "CONDITIONING"
- ],
- [
- 829,
- 228,
- 0,
- 318,
- 0,
- "CONDITIONING"
- ],
- [
- 830,
- 228,
- 0,
- 322,
- 1,
- "CONDITIONING"
- ],
- [
- 832,
- 229,
- 0,
- 323,
- 1,
- "CONDITIONING"
- ],
- [
- 833,
- 230,
- 0,
- 324,
- 1,
- "CONDITIONING"
- ],
- [
- 834,
- 229,
- 0,
- 319,
- 0,
- "CONDITIONING"
- ],
- [
- 835,
- 230,
- 0,
- 320,
- 0,
- "CONDITIONING"
- ],
- [
- 836,
- 231,
- 0,
- 313,
- 1,
- "CONDITIONING"
- ],
- [
- 837,
- 232,
- 0,
- 318,
- 1,
- "CONDITIONING"
- ],
- [
- 838,
- 233,
- 0,
- 319,
- 1,
- "CONDITIONING"
- ],
- [
- 839,
- 234,
- 0,
- 320,
- 1,
- "CONDITIONING"
- ],
- [
- 840,
- 231,
- 0,
- 321,
- 0,
- "CONDITIONING"
- ],
- [
- 841,
- 232,
- 0,
- 322,
- 0,
- "CONDITIONING"
- ],
- [
- 842,
- 233,
- 0,
- 323,
- 0,
- "CONDITIONING"
- ],
- [
- 843,
- 234,
- 0,
- 324,
- 0,
- "CONDITIONING"
- ],
- [
- 844,
- 75,
- 0,
- 214,
- 0,
- "*"
- ],
- [
- 845,
- 324,
- 0,
- 329,
- 0,
- "*"
- ],
- [
- 846,
- 323,
- 0,
- 330,
- 0,
- "*"
- ],
- [
- 847,
- 322,
- 0,
- 331,
- 0,
- "*"
- ],
- [
- 848,
- 321,
- 0,
- 332,
- 0,
- "*"
- ],
- [
- 849,
- 313,
- 0,
- 328,
- 0,
- "*"
- ],
- [
- 850,
- 318,
- 0,
- 327,
- 0,
- "*"
- ],
- [
- 851,
- 319,
- 0,
- 326,
- 0,
- "*"
- ],
- [
- 852,
- 320,
- 0,
- 325,
- 0,
- "*"
- ],
- [
- 881,
- 145,
- 0,
- 334,
- 0,
- "PARAMETERS"
- ],
- [
- 910,
- 299,
- 0,
- 335,
- 0,
- "LATENT"
- ],
- [
- 912,
- 340,
- 1,
- 335,
- 3,
- "INT"
- ],
- [
- 913,
- 298,
- 0,
- 335,
- 1,
- "LATENT"
- ],
- [
- 914,
- 289,
- 0,
- 335,
- 2,
- "LATENT"
- ],
- [
- 916,
- 104,
- 0,
- 341,
- 0,
- "*"
- ],
- [
- 918,
- 342,
- 0,
- 343,
- 0,
- "*"
- ],
- [
- 919,
- 343,
- 0,
- 312,
- 0,
- "*"
- ],
- [
- 924,
- 349,
- 6,
- 353,
- 2,
- "LORA_NAME"
- ],
- [
- 925,
- 152,
- 1,
- 353,
- 3,
- "FLOAT"
- ],
- [
- 926,
- 152,
- 1,
- 353,
- 4,
- "FLOAT"
- ],
- [
- 929,
- 353,
- 0,
- 174,
- 0,
- "*"
- ],
- [
- 930,
- 353,
- 1,
- 176,
- 0,
- "*"
- ],
- [
- 931,
- 154,
- 0,
- 349,
- 0,
- "MODEL_NAMES"
- ],
- [
- 932,
- 349,
- 1,
- 350,
- 0,
- "CHECKPOINT_NAME"
- ],
- [
- 933,
- 350,
- 0,
- 353,
- 0,
- "MODEL"
- ],
- [
- 934,
- 350,
- 1,
- 353,
- 1,
- "CLIP"
- ],
- [
- 935,
- 349,
- 2,
- 355,
- 0,
- "CHECKPOINT_NAME"
- ],
- [
- 936,
- 355,
- 0,
- 175,
- 0,
- "*"
- ],
- [
- 937,
- 355,
- 1,
- 177,
- 0,
- "*"
- ],
- [
- 938,
- 349,
- 3,
- 351,
- 0,
- "VAE_NAME"
- ],
- [
- 939,
- 351,
- 0,
- 178,
- 0,
- "*"
- ],
- [
- 940,
- 349,
- 4,
- 352,
- 0,
- "UPSCALER_NAME"
- ],
- [
- 941,
- 349,
- 5,
- 356,
- 0,
- "UPSCALER_NAME"
- ],
- [
- 942,
- 352,
- 0,
- 179,
- 0,
- "*"
- ],
- [
- 943,
- 356,
- 0,
- 180,
- 0,
- "*"
- ],
- [
- 944,
- 357,
- 0,
- 131,
- 0,
- "PARAMETER_INPUTS"
- ],
- [
- 945,
- 270,
- 0,
- 357,
- 0,
- "PARAMETER_INPUTS"
- ],
- [
- 948,
- 359,
- 1,
- 358,
- 9,
- "INT"
- ],
- [
- 950,
- 359,
- 4,
- 358,
- 10,
- "INT"
- ],
- [
- 951,
- 359,
- 5,
- 358,
- 11,
- "FLOAT"
- ],
- [
- 957,
- 359,
- 6,
- 358,
- 7,
- "SAMPLER_NAME"
- ],
- [
- 958,
- 359,
- 7,
- 358,
- 8,
- "SCHEDULER_NAME"
- ],
- [
- 959,
- 359,
- 2,
- 44,
- 0,
- "INT"
- ],
- [
- 960,
- 359,
- 3,
- 44,
- 1,
- "INT"
- ],
- [
- 961,
- 359,
- 8,
- 360,
- 1,
- "ENABLE_STATE"
- ],
- [
- 962,
- 359,
- 9,
- 360,
- 2,
- "SAVE_FOLDER"
- ],
- [
- 963,
- 46,
- 0,
- 360,
- 0,
- "IMAGE"
- ],
- [
- 965,
- 359,
- 0,
- 340,
- 0,
- "PARAMETERS"
- ],
- [
- 966,
- 335,
- 0,
- 358,
- 6,
- "LATENT"
- ],
- [
- 967,
- 218,
- 0,
- 358,
- 5,
- "CONDITIONING"
- ],
- [
- 968,
- 217,
- 0,
- 358,
- 4,
- "CONDITIONING"
- ],
- [
- 969,
- 216,
- 0,
- 358,
- 2,
- "CONDITIONING"
- ],
- [
- 970,
- 215,
- 0,
- 358,
- 1,
- "CONDITIONING"
- ],
- [
- 971,
- 196,
- 0,
- 358,
- 3,
- "MODEL"
- ],
- [
- 972,
- 197,
- 0,
- 358,
- 0,
- "MODEL"
- ],
- [
- 973,
- 358,
- 0,
- 46,
- 0,
- "LATENT"
- ],
- [
- 974,
- 69,
- 0,
- 364,
- 0,
- "IMAGE"
- ],
- [
- 975,
- 366,
- 8,
- 364,
- 1,
- "ENABLE_STATE"
- ],
- [
- 976,
- 366,
- 7,
- 64,
- 1,
- "FLOAT"
- ],
- [
- 977,
- 366,
- 7,
- 65,
- 1,
- "FLOAT"
- ],
- [
- 978,
- 209,
- 0,
- 365,
- 0,
- "PARAMETERS"
- ],
- [
- 979,
- 365,
- 0,
- 366,
- 0,
- "PARAMETERS"
- ],
- [
- 980,
- 365,
- 2,
- 64,
- 0,
- "INT"
- ],
- [
- 981,
- 365,
- 3,
- 65,
- 0,
- "INT"
- ],
- [
- 983,
- 363,
- 0,
- 361,
- 0,
- "IMAGE"
- ],
- [
- 984,
- 363,
- 0,
- 105,
- 0,
- "*"
- ],
- [
- 985,
- 363,
- 0,
- 236,
- 0,
- "IMAGE"
- ],
- [
- 986,
- 368,
- 6,
- 361,
- 1,
- "ENABLE_STATE"
- ],
- [
- 987,
- 368,
- 7,
- 363,
- 20,
- "FLOAT"
- ],
- [
- 988,
- 368,
- 5,
- 363,
- 11,
- "INT"
- ],
- [
- 989,
- 368,
- 4,
- 363,
- 18,
- "INT"
- ],
- [
- 990,
- 368,
- 3,
- 106,
- 1,
- "FLOAT"
- ],
- [
- 991,
- 368,
- 3,
- 107,
- 1,
- "FLOAT"
- ],
- [
- 992,
- 368,
- 2,
- 363,
- 15,
- "FLOAT"
- ],
- [
- 993,
- 368,
- 1,
- 363,
- 12,
- "INT"
- ],
- [
- 994,
- 367,
- 3,
- 363,
- 19,
- "FLOAT"
- ],
- [
- 995,
- 367,
- 2,
- 363,
- 14,
- "FLOAT"
- ],
- [
- 996,
- 362,
- 5,
- 363,
- 13,
- "FLOAT"
- ],
- [
- 997,
- 362,
- 2,
- 106,
- 0,
- "INT"
- ],
- [
- 998,
- 362,
- 3,
- 107,
- 0,
- "INT"
- ],
- [
- 999,
- 362,
- 6,
- 363,
- 8,
- "SAMPLER_NAME"
- ],
- [
- 1000,
- 362,
- 7,
- 363,
- 9,
- "SCHEDULER_NAME"
- ],
- [
- 1001,
- 107,
- 0,
- 363,
- 17,
- "INT"
- ],
- [
- 1002,
- 106,
- 0,
- 363,
- 16,
- "INT"
- ],
- [
- 1003,
- 210,
- 0,
- 363,
- 10,
- "UPSCALE_MODEL"
- ],
- [
- 1004,
- 208,
- 0,
- 363,
- 6,
- "IMAGE"
- ],
- [
- 1005,
- 206,
- 0,
- 363,
- 7,
- "VAE"
- ],
- [
- 1006,
- 205,
- 0,
- 363,
- 0,
- "MODEL"
- ],
- [
- 1007,
- 204,
- 0,
- 363,
- 3,
- "MODEL"
- ],
- [
- 1008,
- 191,
- 0,
- 363,
- 1,
- "CONDITIONING"
- ],
- [
- 1009,
- 192,
- 0,
- 363,
- 2,
- "CONDITIONING"
- ],
- [
- 1010,
- 193,
- 0,
- 363,
- 4,
- "CONDITIONING"
- ],
- [
- 1011,
- 194,
- 0,
- 363,
- 5,
- "CONDITIONING"
- ],
- [
- 1012,
- 198,
- 0,
- 362,
- 0,
- "PARAMETERS"
- ],
- [
- 1013,
- 362,
- 0,
- 367,
- 0,
- "PARAMETERS"
- ],
- [
- 1014,
- 367,
- 0,
- 368,
- 0,
- "PARAMETERS"
- ],
- [
- 1017,
- 369,
- 1,
- 358,
- 13,
- "FLOAT"
- ],
- [
- 1018,
- 369,
- 2,
- 358,
- 12,
- "FLOAT"
- ],
- [
- 1019,
- 369,
- 3,
- 358,
- 16,
- "FLOAT"
- ],
- [
- 1020,
- 369,
- 4,
- 358,
- 15,
- "INT"
- ],
- [
- 1021,
- 369,
- 5,
- 358,
- 14,
- "INT"
- ],
- [
- 1022,
- 369,
- 6,
- 44,
- 2,
- "INT"
- ],
- [
- 1023,
- 189,
- 0,
- 369,
- 0,
- "PARAMETERS"
- ],
- [
- 1024,
- 369,
- 0,
- 359,
- 0,
- "PARAMETERS"
- ],
- [
- 1025,
- 190,
- 0,
- 370,
- 0,
- "PARAMETERS"
- ],
- [
- 1026,
- 370,
- 2,
- 40,
- 10,
- "INT"
- ],
- [
- 1027,
- 370,
- 3,
- 40,
- 11,
- "INT"
- ],
- [
- 1028,
- 370,
- 2,
- 41,
- 7,
- "INT"
- ],
- [
- 1029,
- 370,
- 3,
- 41,
- 8,
- "INT"
- ],
- [
- 1031,
- 370,
- 2,
- 54,
- 0,
- "INT"
- ],
- [
- 1033,
- 370,
- 3,
- 53,
- 0,
- "INT"
- ],
- [
- 1034,
- 370,
- 2,
- 51,
- 0,
- "INT"
- ],
- [
- 1035,
- 370,
- 3,
- 52,
- 0,
- "INT"
- ],
- [
- 1036,
- 370,
- 0,
- 153,
- 0,
- "PARAMETERS"
- ],
- [
- 1037,
- 362,
- 9,
- 361,
- 2,
- "SAVE_FOLDER"
- ],
- [
- 1038,
- 365,
- 9,
- 364,
- 2,
- "SAVE_FOLDER"
- ],
- [
- 1039,
- 200,
- 0,
- 291,
- 0,
- "*"
- ],
- [
- 1040,
- 339,
- 0,
- 371,
- 0,
- "*"
- ],
- [
- 1041,
- 338,
- 0,
- 372,
- 0,
- "*"
- ],
- [
- 1043,
- 337,
- 0,
- 374,
- 0,
- "*"
- ],
- [
- 1049,
- 336,
- 0,
- 373,
- 0,
- "*"
- ],
- [
- 1050,
- 311,
- 0,
- 379,
- 0,
- "*"
- ],
- [
- 1051,
- 328,
- 0,
- 380,
- 0,
- "*"
- ],
- [
- 1052,
- 332,
- 0,
- 381,
- 0,
- "*"
- ],
- [
- 1053,
- 214,
- 0,
- 382,
- 0,
- "*"
- ],
- [
- 1054,
- 307,
- 0,
- 383,
- 0,
- "*"
- ],
- [
- 1055,
- 379,
- 0,
- 337,
- 0,
- "CONDITIONING"
- ],
- [
- 1056,
- 380,
- 0,
- 337,
- 1,
- "CONDITIONING"
- ],
- [
- 1057,
- 381,
- 0,
- 337,
- 2,
- "CONDITIONING"
- ],
- [
- 1058,
- 382,
- 0,
- 337,
- 3,
- "CONDITIONING"
- ],
- [
- 1059,
- 383,
- 0,
- 337,
- 4,
- "CONDITIONING"
- ],
- [
- 1060,
- 310,
- 0,
- 384,
- 0,
- "*"
- ],
- [
- 1061,
- 327,
- 0,
- 385,
- 0,
- "*"
- ],
- [
- 1062,
- 331,
- 0,
- 386,
- 0,
- "*"
- ],
- [
- 1063,
- 213,
- 0,
- 387,
- 0,
- "*"
- ],
- [
- 1064,
- 306,
- 0,
- 388,
- 0,
- "*"
- ],
- [
- 1065,
- 388,
- 0,
- 336,
- 4,
- "CONDITIONING"
- ],
- [
- 1066,
- 387,
- 0,
- 336,
- 3,
- "CONDITIONING"
- ],
- [
- 1067,
- 386,
- 0,
- 336,
- 2,
- "CONDITIONING"
- ],
- [
- 1068,
- 385,
- 0,
- 336,
- 1,
- "CONDITIONING"
- ],
- [
- 1069,
- 384,
- 0,
- 336,
- 0,
- "CONDITIONING"
- ],
- [
- 1070,
- 309,
- 0,
- 389,
- 0,
- "*"
- ],
- [
- 1071,
- 326,
- 0,
- 390,
- 0,
- "*"
- ],
- [
- 1072,
- 330,
- 0,
- 391,
- 0,
- "*"
- ],
- [
- 1073,
- 212,
- 0,
- 392,
- 0,
- "*"
- ],
- [
- 1074,
- 305,
- 0,
- 393,
- 0,
- "*"
- ],
- [
- 1075,
- 393,
- 0,
- 338,
- 4,
- "CONDITIONING"
- ],
- [
- 1076,
- 392,
- 0,
- 338,
- 3,
- "CONDITIONING"
- ],
- [
- 1077,
- 391,
- 0,
- 338,
- 2,
- "CONDITIONING"
- ],
- [
- 1078,
- 390,
- 0,
- 338,
- 1,
- "CONDITIONING"
- ],
- [
- 1079,
- 389,
- 0,
- 338,
- 0,
- "CONDITIONING"
- ],
- [
- 1081,
- 325,
- 0,
- 395,
- 0,
- "*"
- ],
- [
- 1082,
- 329,
- 0,
- 396,
- 0,
- "*"
- ],
- [
- 1083,
- 211,
- 0,
- 397,
- 0,
- "*"
- ],
- [
- 1084,
- 304,
- 0,
- 398,
- 0,
- "*"
- ],
- [
- 1085,
- 398,
- 0,
- 339,
- 4,
- "CONDITIONING"
- ],
- [
- 1086,
- 397,
- 0,
- 339,
- 3,
- "CONDITIONING"
- ],
- [
- 1087,
- 396,
- 0,
- 339,
- 2,
- "CONDITIONING"
- ],
- [
- 1088,
- 395,
- 0,
- 339,
- 1,
- "CONDITIONING"
- ],
- [
- 1089,
- 394,
- 0,
- 339,
- 0,
- "CONDITIONING"
- ],
- [
- 1090,
- 418,
- 0,
- 378,
- 4,
- "CONDITIONING"
- ],
- [
- 1091,
- 417,
- 0,
- 378,
- 3,
- "CONDITIONING"
- ],
- [
- 1092,
- 416,
- 0,
- 378,
- 2,
- "CONDITIONING"
- ],
- [
- 1093,
- 415,
- 0,
- 378,
- 1,
- "CONDITIONING"
- ],
- [
- 1094,
- 414,
- 0,
- 378,
- 0,
- "CONDITIONING"
- ],
- [
- 1095,
- 413,
- 0,
- 377,
- 4,
- "CONDITIONING"
- ],
- [
- 1096,
- 412,
- 0,
- 377,
- 3,
- "CONDITIONING"
- ],
- [
- 1097,
- 411,
- 0,
- 377,
- 2,
- "CONDITIONING"
- ],
- [
- 1098,
- 410,
- 0,
- 377,
- 1,
- "CONDITIONING"
- ],
- [
- 1099,
- 409,
- 0,
- 377,
- 0,
- "CONDITIONING"
- ],
- [
- 1100,
- 408,
- 0,
- 375,
- 4,
- "CONDITIONING"
- ],
- [
- 1101,
- 407,
- 0,
- 375,
- 3,
- "CONDITIONING"
- ],
- [
- 1102,
- 406,
- 0,
- 375,
- 2,
- "CONDITIONING"
- ],
- [
- 1103,
- 405,
- 0,
- 375,
- 1,
- "CONDITIONING"
- ],
- [
- 1104,
- 404,
- 0,
- 375,
- 0,
- "CONDITIONING"
- ],
- [
- 1105,
- 403,
- 0,
- 376,
- 4,
- "CONDITIONING"
- ],
- [
- 1106,
- 402,
- 0,
- 376,
- 3,
- "CONDITIONING"
- ],
- [
- 1107,
- 401,
- 0,
- 376,
- 2,
- "CONDITIONING"
- ],
- [
- 1108,
- 400,
- 0,
- 376,
- 1,
- "CONDITIONING"
- ],
- [
- 1109,
- 399,
- 0,
- 376,
- 0,
- "CONDITIONING"
- ],
- [
- 1110,
- 334,
- 2,
- 419,
- 0,
- "*"
- ],
- [
- 1111,
- 419,
- 0,
- 337,
- 5,
- "INT"
- ],
- [
- 1112,
- 334,
- 2,
- 420,
- 0,
- "*"
- ],
- [
- 1113,
- 420,
- 0,
- 336,
- 5,
- "INT"
- ],
- [
- 1114,
- 334,
- 2,
- 421,
- 0,
- "*"
- ],
- [
- 1115,
- 421,
- 0,
- 338,
- 5,
- "INT"
- ],
- [
- 1116,
- 334,
- 2,
- 422,
- 0,
- "*"
- ],
- [
- 1117,
- 422,
- 0,
- 339,
- 5,
- "INT"
- ],
- [
- 1118,
- 227,
- 0,
- 300,
- 0,
- "*"
- ],
- [
- 1128,
- 427,
- 0,
- 215,
- 0,
- "*"
- ],
- [
- 1129,
- 428,
- 0,
- 216,
- 0,
- "*"
- ],
- [
- 1130,
- 429,
- 0,
- 217,
- 0,
- "*"
- ],
- [
- 1131,
- 430,
- 0,
- 218,
- 0,
- "*"
- ],
- [
- 1132,
- 431,
- 0,
- 376,
- 5,
- "INT"
- ],
- [
- 1133,
- 432,
- 0,
- 375,
- 5,
- "INT"
- ],
- [
- 1134,
- 433,
- 0,
- 377,
- 5,
- "INT"
- ],
- [
- 1135,
- 434,
- 0,
- 378,
- 5,
- "INT"
- ],
- [
- 1136,
- 334,
- 2,
- 431,
- 0,
- "*"
- ],
- [
- 1137,
- 334,
- 2,
- 432,
- 0,
- "*"
- ],
- [
- 1138,
- 334,
- 2,
- 433,
- 0,
- "*"
- ],
- [
- 1139,
- 334,
- 2,
- 434,
- 0,
- "*"
- ],
- [
- 1140,
- 376,
- 0,
- 438,
- 0,
- "*"
- ],
- [
- 1141,
- 375,
- 0,
- 437,
- 0,
- "*"
- ],
- [
- 1142,
- 377,
- 0,
- 436,
- 0,
- "*"
- ],
- [
- 1143,
- 378,
- 0,
- 435,
- 0,
- "*"
- ],
- [
- 1144,
- 374,
- 0,
- 439,
- 0,
- "CONDITIONING"
- ],
- [
- 1145,
- 373,
- 0,
- 440,
- 0,
- "CONDITIONING"
- ],
- [
- 1146,
- 372,
- 0,
- 441,
- 0,
- "CONDITIONING"
- ],
- [
- 1147,
- 371,
- 0,
- 442,
- 0,
- "CONDITIONING"
- ],
- [
- 1148,
- 438,
- 0,
- 439,
- 1,
- "CONDITIONING"
- ],
- [
- 1149,
- 437,
- 0,
- 440,
- 1,
- "CONDITIONING"
- ],
- [
- 1150,
- 436,
- 0,
- 441,
- 1,
- "CONDITIONING"
- ],
- [
- 1151,
- 435,
- 0,
- 442,
- 1,
- "CONDITIONING"
- ],
- [
- 1156,
- 439,
- 0,
- 423,
- 0,
- "*"
- ],
- [
- 1157,
- 440,
- 0,
- 424,
- 0,
- "*"
- ],
- [
- 1158,
- 441,
- 0,
- 425,
- 0,
- "*"
- ],
- [
- 1159,
- 442,
- 0,
- 426,
- 0,
- "*"
- ],
- [
- 1160,
- 446,
- 0,
- 450,
- 0,
- "*"
- ],
- [
- 1161,
- 447,
- 0,
- 451,
- 0,
- "*"
- ],
- [
- 1162,
- 448,
- 0,
- 452,
- 0,
- "*"
- ],
- [
- 1163,
- 449,
- 0,
- 453,
- 0,
- "*"
- ],
- [
- 1164,
- 231,
- 0,
- 446,
- 0,
- "*"
- ],
- [
- 1165,
- 232,
- 0,
- 447,
- 0,
- "*"
- ],
- [
- 1166,
- 233,
- 0,
- 448,
- 0,
- "*"
- ],
- [
- 1167,
- 234,
- 0,
- 449,
- 0,
- "*"
- ],
- [
- 1170,
- 450,
- 0,
- 401,
- 0,
- "*"
- ],
- [
- 1175,
- 451,
- 0,
- 406,
- 0,
- "*"
- ],
- [
- 1180,
- 452,
- 0,
- 411,
- 0,
- "*"
- ],
- [
- 1185,
- 453,
- 0,
- 416,
- 0,
- "*"
- ],
- [
- 1197,
- 458,
- 0,
- 454,
- 2,
- "INT"
- ],
- [
- 1198,
- 458,
- 0,
- 455,
- 2,
- "INT"
- ],
- [
- 1199,
- 458,
- 0,
- 456,
- 2,
- "INT"
- ],
- [
- 1200,
- 458,
- 0,
- 457,
- 2,
- "INT"
- ],
- [
- 1201,
- 423,
- 0,
- 454,
- 0,
- "CONDITIONING"
- ],
- [
- 1202,
- 424,
- 0,
- 455,
- 0,
- "CONDITIONING"
- ],
- [
- 1203,
- 425,
- 0,
- 456,
- 0,
- "CONDITIONING"
- ],
- [
- 1204,
- 426,
- 0,
- 457,
- 0,
- "CONDITIONING"
- ],
- [
- 1205,
- 424,
- 0,
- 454,
- 1,
- "CONDITIONING"
- ],
- [
- 1206,
- 423,
- 0,
- 455,
- 1,
- "CONDITIONING"
- ],
- [
- 1207,
- 426,
- 0,
- 456,
- 1,
- "CONDITIONING"
- ],
- [
- 1208,
- 425,
- 0,
- 457,
- 1,
- "CONDITIONING"
- ],
- [
- 1209,
- 454,
- 0,
- 427,
- 0,
- "*"
- ],
- [
- 1210,
- 455,
- 0,
- 428,
- 0,
- "*"
- ],
- [
- 1211,
- 456,
- 0,
- 429,
- 0,
- "*"
- ],
- [
- 1212,
- 457,
- 0,
- 430,
- 0,
- "*"
- ],
- [
- 1238,
- 328,
- 0,
- 399,
- 0,
- "*"
- ],
- [
- 1240,
- 326,
- 0,
- 409,
- 0,
- "*"
- ],
- [
- 1241,
- 331,
- 0,
- 404,
- 0,
- "*"
- ],
- [
- 1242,
- 329,
- 0,
- 414,
- 0,
- "*"
- ],
- [
- 1243,
- 332,
- 0,
- 400,
- 0,
- "*"
- ],
- [
- 1244,
- 330,
- 0,
- 410,
- 0,
- "*"
- ],
- [
- 1245,
- 327,
- 0,
- 405,
- 0,
- "*"
- ],
- [
- 1246,
- 325,
- 0,
- 415,
- 0,
- "*"
- ],
- [
- 1255,
- 460,
- 0,
- 442,
- 2,
- "INT"
- ],
- [
- 1256,
- 460,
- 0,
- 441,
- 2,
- "INT"
- ],
- [
- 1257,
- 460,
- 0,
- 440,
- 2,
- "INT"
- ],
- [
- 1258,
- 460,
- 0,
- 439,
- 2,
- "INT"
- ],
- [
- 1259,
- 334,
- 3,
- 460,
- 0,
- "*"
- ],
- [
- 1260,
- 308,
- 0,
- 394,
- 0,
- "*"
- ],
- [
- 1261,
- 214,
- 0,
- 402,
- 0,
- "*"
- ],
- [
- 1262,
- 212,
- 0,
- 412,
- 0,
- "*"
- ],
- [
- 1263,
- 306,
- 0,
- 407,
- 0,
- "*"
- ],
- [
- 1264,
- 304,
- 0,
- 417,
- 0,
- "*"
- ],
- [
- 1265,
- 307,
- 0,
- 403,
- 0,
- "*"
- ],
- [
- 1266,
- 305,
- 0,
- 413,
- 0,
- "*"
- ],
- [
- 1267,
- 213,
- 0,
- 408,
- 0,
- "*"
- ],
- [
- 1268,
- 211,
- 0,
- 418,
- 0,
- "*"
- ]
- ],
- "groups": [
- {
- "title": "Model Loading",
- "bounding": [
- -4600,
- 1900,
- 2401,
- 1800
- ],
- "color": "#88A"
- },
- {
- "title": "Prompt Parsing",
- "bounding": [
- -4599,
- 4000,
- 2399,
- 1900
- ],
- "color": "#8A8"
- },
- {
- "title": "Prompt Processing",
- "bounding": [
- -1899,
- 4001,
- 2498,
- 2798
- ],
- "color": "#b58b2a"
- },
- {
- "title": "Image Generation",
- "bounding": [
- 3001,
- 4001,
- 3199,
- 1198
- ],
- "color": "#b06634"
- },
- {
- "title": "HiRes Fix",
- "bounding": [
- 6601,
- 4001,
- 2698,
- 1598
- ],
- "color": "#A88"
- },
- {
- "title": "Upscaling",
- "bounding": [
- 9700,
- 4000,
- 2700,
- 1199
- ],
- "color": "#8AA"
- },
- {
- "title": "User Interface",
- "bounding": [
- -1599,
- -1199,
- 4898,
- 2398
- ],
- "color": "#444"
- },
- {
- "title": "Image 2 Image and Inpainting",
- "bounding": [
- 902,
- 6901,
- 2698,
- 1099
- ],
- "color": "#a1309b"
- },
- {
- "title": "Experimental Prompt Post-Processing",
- "bounding": [
- 901,
- 4001,
- 1798,
- 2598
- ],
- "color": "#3f789e"
- }
- ],
- "config": {},
- "extra": {},
- "version": 0.4
-}
\ No newline at end of file
diff --git a/workflow/Searge-SDXL-Reborn-v3_4.json b/workflow/Searge-SDXL-Reborn-v3_4.json
deleted file mode 100644
index 0f6d6f8..0000000
--- a/workflow/Searge-SDXL-Reborn-v3_4.json
+++ /dev/null
@@ -1,19375 +0,0 @@
-{
- "last_node_id": 460,
- "last_link_id": 1268,
- "nodes": [
- {
- "id": 133,
- "type": "SeargeInput2",
- "pos": [
- 530,
- 40
- ],
- "size": {
- "0": 320,
- "1": 280
- },
- "flags": {
- "pinned": true
- },
- "order": 30,
- "mode": 0,
- "inputs": [
- {
- "name": "inputs",
- "type": "PARAMETER_INPUTS",
- "link": 440,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "inputs",
- "type": "PARAMETER_INPUTS",
- "links": [
- 439
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeInput2"
- },
- "widgets_values": [
- 4815162342,
- "randomize",
- 1024,
- 1024,
- 30,
- 7,
- "dpmpp_2m",
- "karras",
- "enabled",
- "output folder"
- ],
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 143,
- "type": "SeargeInput5",
- "pos": [
- 860,
- 40
- ],
- "size": {
- "0": 320,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 23,
- "mode": 0,
- "inputs": [
- {
- "name": "inputs",
- "type": "PARAMETER_INPUTS",
- "link": 736,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "inputs",
- "type": "PARAMETER_INPUTS",
- "links": [
- 440
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeInput5"
- },
- "widgets_values": [
- 2,
- 2,
- 0.333,
- 0.667,
- "none"
- ],
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 136,
- "type": "SeargeInput3",
- "pos": [
- 530,
- 360
- ],
- "size": {
- "0": 320,
- "1": 250
- },
- "flags": {
- "pinned": true
- },
- "order": 36,
- "mode": 0,
- "inputs": [
- {
- "name": "inputs",
- "type": "PARAMETER_INPUTS",
- "link": 439,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "inputs",
- "type": "PARAMETER_INPUTS",
- "links": [
- 722
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeInput3"
- },
- "widgets_values": [
- 0.7999999999999998,
- 0.7499999999999998,
- "hard",
- 0,
- 1,
- 2,
- "enabled",
- 0.5
- ],
- "color": "#332922",
- "bgcolor": "#593930"
- },
- {
- "id": 154,
- "type": "SeargeInput4",
- "pos": [
- 530,
- 650
- ],
- "size": {
- "0": 650,
- "1": 240
- },
- "flags": {
- "pinned": true
- },
- "order": 0,
- "mode": 0,
- "inputs": [
- {
- "name": "model_settings",
- "type": "MODEL_SETTINGS",
- "link": null
- }
- ],
- "outputs": [
- {
- "name": "model_names",
- "type": "MODEL_NAMES",
- "links": [
- 931
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeInput4"
- },
- "widgets_values": [
- "sd_xl_base_1.0.safetensors",
- "sd_xl_refiner_1.0.safetensors",
- "sdxl-vae.safetensors",
- "4x_NMKD-Siax_200k.pth",
- "4x-UltraSharp.pth",
- "sd_xl_offset_example-lora_1.0.safetensors"
- ],
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 19,
- "type": "PreviewImage",
- "pos": [
- 1190,
- 40
- ],
- "size": {
- "0": 520,
- "1": 540
- },
- "flags": {
- "pinned": true
- },
- "order": 296,
- "mode": 0,
- "inputs": [
- {
- "name": "images",
- "type": "IMAGE",
- "link": 225,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "PreviewImage"
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 126,
- "type": "Note",
- "pos": [
- 1190,
- 620
- ],
- "size": {
- "0": 520,
- "1": 430
- },
- "flags": {
- "pinned": true
- },
- "order": 1,
- "mode": 0,
- "title": "Workflow Information",
- "properties": {
- "text": ""
- },
- "widgets_values": [
- "=== How to prompt this workflow in other prompt modes than \"simple\" ===\n\nMain Prompt\n-----------\nThe subject of the image in natural language\n* Example: a cat with a hat in a grass field\n\n\nSecondary Prompt\n----------------\nA keyword/tag list version of the main prompts\n* Example: cat with hat, in grass field\n\n\nStyle and References Prompt\n---------------------------\nA description of the style of the image, the main style should be the first word\n* Example: ~*~oil painting~*~ in the style of [artist name], vibrant colors\n\n\nNegative Prompt\n---------------\nSubjects that should not appear in the image\n* Example: jpeg artifacts, noise\n\n\nNegative Style Prompt\n---------------------\nStyles and concepts that should not be used to generate the image\n* Example: photograph, anime\n\n === In \"simple\" prompt mode only the main and negative prompts are used ===\n === In \"3 prompts\" prompt mode it's main, secondary, and negative prompts ==="
- ],
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 172,
- "type": "Reroute",
- "pos": [
- -3940,
- 2040
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 58,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 533,
- "pos": [
- 37.5,
- 0
- ],
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "PARAMETERS",
- "links": [
- 553
- ],
- "slot_index": 0,
- "label": "data"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 174,
- "type": "Reroute",
- "pos": [
- -2400,
- 2100
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 63,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 929,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "MODEL",
- "links": [
- 561
- ],
- "label": "b m"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 176,
- "type": "Reroute",
- "pos": [
- -2400,
- 2200
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 64,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 930,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CLIP",
- "links": [
- 562
- ],
- "label": "b c"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 175,
- "type": "Reroute",
- "pos": [
- -2400,
- 2600
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 24,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 936,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "MODEL",
- "links": [
- 563
- ],
- "label": "r m"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 177,
- "type": "Reroute",
- "pos": [
- -2400,
- 2700
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 25,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 937,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CLIP",
- "links": [
- 564
- ],
- "label": "r c"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 178,
- "type": "Reroute",
- "pos": [
- -2400,
- 2900
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 26,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 939,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "VAE",
- "links": [
- 588
- ],
- "label": "vae"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#322",
- "bgcolor": "#533"
- },
- {
- "id": 180,
- "type": "Reroute",
- "pos": [
- -2400,
- 3400
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 28,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 943,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "UPSCALE_MODEL",
- "links": [
- 697
- ],
- "label": "up 2"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 51,
- "type": "SeargeIntegerScaler",
- "pos": [
- -3699.7040965118426,
- 5030.6233893932895
- ],
- "size": {
- "0": 300,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 81,
- "mode": 0,
- "inputs": [
- {
- "name": "value",
- "type": "INT",
- "link": 1034,
- "widget": {
- "name": "value",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 18446744073709552000
- }
- ]
- },
- "slot_index": 0
- },
- {
- "name": "factor",
- "type": "FLOAT",
- "link": 501,
- "widget": {
- "name": "factor",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "step": 0.01
- }
- ]
- },
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "value",
- "type": "INT",
- "links": [
- 210,
- 211
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Base Width Scaler",
- "properties": {
- "Node name for S&R": "SeargeIntegerScaler"
- },
- "widgets_values": [
- 0,
- 1,
- 8
- ],
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 52,
- "type": "SeargeIntegerScaler",
- "pos": [
- -3699.7040965118426,
- 5230.6233893932895
- ],
- "size": {
- "0": 300,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 82,
- "mode": 0,
- "inputs": [
- {
- "name": "value",
- "type": "INT",
- "link": 1035,
- "widget": {
- "name": "value",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 18446744073709552000
- }
- ]
- },
- "slot_index": 0
- },
- {
- "name": "factor",
- "type": "FLOAT",
- "link": 502,
- "widget": {
- "name": "factor",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "step": 0.01
- }
- ]
- },
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "value",
- "type": "INT",
- "links": [
- 212,
- 213
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Base Height Scaler",
- "properties": {
- "Node name for S&R": "SeargeIntegerScaler"
- },
- "widgets_values": [
- 0,
- 1,
- 8
- ],
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 54,
- "type": "SeargeIntegerScaler",
- "pos": [
- -3699.7040965118426,
- 5430.6233893932895
- ],
- "size": {
- "0": 300,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 83,
- "mode": 0,
- "inputs": [
- {
- "name": "value",
- "type": "INT",
- "link": 1031,
- "widget": {
- "name": "value",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 18446744073709552000
- }
- ]
- },
- "slot_index": 0
- },
- {
- "name": "factor",
- "type": "FLOAT",
- "link": 503,
- "widget": {
- "name": "factor",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "step": 0.01
- }
- ]
- },
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "value",
- "type": "INT",
- "links": [
- 214,
- 215
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Refiner Width Scaler",
- "properties": {
- "Node name for S&R": "SeargeIntegerScaler"
- },
- "widgets_values": [
- 0,
- 1,
- 8
- ],
- "color": "#2a363b",
- "bgcolor": "#3f5159"
- },
- {
- "id": 53,
- "type": "SeargeIntegerScaler",
- "pos": [
- -3699.7040965118426,
- 5630.6233893932895
- ],
- "size": {
- "0": 300,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 84,
- "mode": 0,
- "inputs": [
- {
- "name": "value",
- "type": "INT",
- "link": 1033,
- "widget": {
- "name": "value",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 18446744073709552000
- }
- ]
- },
- "slot_index": 0
- },
- {
- "name": "factor",
- "type": "FLOAT",
- "link": 504,
- "widget": {
- "name": "factor",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "step": 0.01
- }
- ]
- },
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "value",
- "type": "INT",
- "links": [
- 216,
- 217
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Refiner Height Scaler",
- "properties": {
- "Node name for S&R": "SeargeIntegerScaler"
- },
- "widgets_values": [
- 0,
- 1,
- 8
- ],
- "color": "#2a363b",
- "bgcolor": "#3f5159"
- },
- {
- "id": 145,
- "type": "SeargeOutput5",
- "pos": [
- -1699.8005108491654,
- 4229.8544652066785
- ],
- "size": {
- "0": 400,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 74,
- "mode": 0,
- "inputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "link": 587
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": [
- 881
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "base_conditioning_scale",
- "type": "FLOAT",
- "links": [],
- "shape": 3,
- "slot_index": 1
- },
- {
- "name": "refiner_conditioning_scale",
- "type": "FLOAT",
- "links": [],
- "shape": 3,
- "slot_index": 2
- },
- {
- "name": "style_prompt_power",
- "type": "FLOAT",
- "links": [
- 505,
- 506
- ],
- "shape": 3,
- "slot_index": 3
- },
- {
- "name": "negative_style_power",
- "type": "FLOAT",
- "links": [
- 507,
- 508
- ],
- "shape": 3,
- "slot_index": 4
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeOutput5"
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 189,
- "type": "Reroute",
- "pos": [
- 3100,
- 4100
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 79,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 616
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "PARAMETERS",
- "links": [
- 598,
- 1023
- ],
- "slot_index": 0,
- "label": "data"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 44,
- "type": "EmptyLatentImage",
- "pos": [
- 4000,
- 4230
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 115,
- "mode": 0,
- "inputs": [
- {
- "name": "width",
- "type": "INT",
- "link": 959,
- "widget": {
- "name": "width",
- "config": [
- "INT",
- {
- "default": 512,
- "min": 64,
- "max": 8192,
- "step": 8
- }
- ]
- },
- "slot_index": 0
- },
- {
- "name": "height",
- "type": "INT",
- "link": 960,
- "widget": {
- "name": "height",
- "config": [
- "INT",
- {
- "default": 512,
- "min": 64,
- "max": 8192,
- "step": 8
- }
- ]
- },
- "slot_index": 1
- },
- {
- "name": "batch_size",
- "type": "INT",
- "link": 1022,
- "widget": {
- "name": "batch_size",
- "config": [
- "INT",
- {
- "default": 1,
- "min": 1,
- "max": 64
- }
- ]
- },
- "slot_index": 2
- }
- ],
- "outputs": [
- {
- "name": "LATENT",
- "type": "LATENT",
- "links": [
- 785
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "EmptyLatentImage"
- },
- "widgets_values": [
- 512,
- 512,
- 1
- ],
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 188,
- "type": "Reroute",
- "pos": [
- -1799.8005108491654,
- 4099.854465206677
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 69,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 619
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "PARAMETERS",
- "links": [
- 587,
- 617
- ],
- "slot_index": 0,
- "label": "data"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 190,
- "type": "Reroute",
- "pos": [
- -4499.70409651184,
- 4100.623389393287
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 62,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 622
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "PARAMETERS",
- "links": [
- 618,
- 1025
- ],
- "slot_index": 0,
- "label": "data"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 201,
- "type": "Reroute",
- "pos": [
- -2399.7040965118417,
- 4100.623389393287
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 65,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 618
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "PARAMETERS",
- "links": [
- 619
- ],
- "slot_index": 0,
- "label": "data"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 152,
- "type": "SeargeOutput7",
- "pos": [
- -3700,
- 2430
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 59,
- "mode": 0,
- "inputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "link": 553
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": [
- 621
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "lora_strength",
- "type": "FLOAT",
- "links": [
- 925,
- 926
- ],
- "shape": 3,
- "slot_index": 1
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeOutput7"
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 179,
- "type": "Reroute",
- "pos": [
- -2400,
- 3200
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 27,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 942,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "UPSCALE_MODEL",
- "links": [
- 695
- ],
- "label": "up 1"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 195,
- "type": "Reroute",
- "pos": [
- 6000,
- 4100
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 94,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 598
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "PARAMETERS",
- "links": [
- 611
- ],
- "slot_index": 0,
- "label": "data"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 46,
- "type": "VAEDecode",
- "pos": [
- 5100,
- 4330
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 283,
- "mode": 0,
- "inputs": [
- {
- "name": "samples",
- "type": "LATENT",
- "link": 973
- },
- {
- "name": "vae",
- "type": "VAE",
- "link": 614,
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "IMAGE",
- "type": "IMAGE",
- "links": [
- 634,
- 690,
- 963
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "VAEDecode"
- },
- "color": "#2a363b",
- "bgcolor": "#3f5159"
- },
- {
- "id": 207,
- "type": "Reroute",
- "pos": [
- 6000,
- 4150
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 284,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 634
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "IMAGE",
- "links": [
- 633
- ],
- "slot_index": 0,
- "label": "img"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 106,
- "type": "SeargeIntegerScaler",
- "pos": [
- 7600,
- 4230
- ],
- "size": {
- "0": 300,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 185,
- "mode": 0,
- "inputs": [
- {
- "name": "value",
- "type": "INT",
- "link": 997,
- "widget": {
- "name": "value",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 18446744073709552000
- }
- ]
- },
- "slot_index": 0
- },
- {
- "name": "factor",
- "type": "FLOAT",
- "link": 990,
- "widget": {
- "name": "factor",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "step": 0.01
- }
- ]
- },
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "value",
- "type": "INT",
- "links": [
- 1002
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "HRF Image Width",
- "properties": {
- "Node name for S&R": "SeargeIntegerScaler"
- },
- "widgets_values": [
- 0,
- 1,
- 8
- ],
- "color": "#233",
- "bgcolor": "#355"
- },
- {
- "id": 107,
- "type": "SeargeIntegerScaler",
- "pos": [
- 7600,
- 4430
- ],
- "size": {
- "0": 300,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 186,
- "mode": 0,
- "inputs": [
- {
- "name": "value",
- "type": "INT",
- "link": 998,
- "widget": {
- "name": "value",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 18446744073709552000
- }
- ]
- },
- "slot_index": 0
- },
- {
- "name": "factor",
- "type": "FLOAT",
- "link": 991,
- "widget": {
- "name": "factor",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "step": 0.01
- }
- ]
- },
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "value",
- "type": "INT",
- "links": [
- 1001
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "HRF Image Height",
- "properties": {
- "Node name for S&R": "SeargeIntegerScaler"
- },
- "widgets_values": [
- 0,
- 1,
- 8
- ],
- "color": "#233",
- "bgcolor": "#355"
- },
- {
- "id": 206,
- "type": "Reroute",
- "pos": [
- 8200,
- 4150
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 53,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 708,
- "slot_index": 0,
- "pos": [
- 37.5,
- 0
- ]
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "VAE",
- "links": [
- 1005
- ],
- "slot_index": 0,
- "label": "vae"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#322",
- "bgcolor": "#533"
- },
- {
- "id": 210,
- "type": "Reroute",
- "pos": [
- 8300,
- 4150
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 44,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 699,
- "slot_index": 0,
- "pos": [
- 37.5,
- 0
- ]
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "UPSCALE_MODEL",
- "links": [
- 1003
- ],
- "slot_index": 0,
- "label": "up 2"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 213,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 5149.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 168,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 647
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1063,
- 1267
- ],
- "slot_index": 0,
- "label": "wb-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 212,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 5199.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 174,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 648
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1073,
- 1262
- ],
- "slot_index": 0,
- "label": "wr+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 211,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 5249.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 179,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 649
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1083,
- 1268
- ],
- "slot_index": 0,
- "label": "wr-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 216,
- "type": "Reroute",
- "pos": [
- 3200,
- 4950
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 270,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1129,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 825,
- 969
- ],
- "slot_index": 0,
- "label": "b-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 217,
- "type": "Reroute",
- "pos": [
- 3200,
- 5000
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 273,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1130,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 824,
- 968
- ],
- "slot_index": 0,
- "label": "r+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 218,
- "type": "Reroute",
- "pos": [
- 3200,
- 5050
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 272,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1131,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 823,
- 967
- ],
- "slot_index": 0,
- "label": "r-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 219,
- "type": "Reroute",
- "pos": [
- -2399.7040965118417,
- 4600.6233893932895
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 106,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 662,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 670
- ],
- "label": "bc +"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 220,
- "type": "Reroute",
- "pos": [
- -2399.7040965118417,
- 4650.6233893932895
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 107,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 663,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 671
- ],
- "label": "bc -"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 221,
- "type": "Reroute",
- "pos": [
- -2399.7040965118417,
- 4700.6233893932895
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 108,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 664,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 672
- ],
- "label": "rc +"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 222,
- "type": "Reroute",
- "pos": [
- -2399.7040965118417,
- 4750.6233893932895
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 109,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 665,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 673
- ],
- "label": "rc -"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 223,
- "type": "Reroute",
- "pos": [
- -2399.7040965118417,
- 4900.6233893932895
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 104,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 666,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 674
- ],
- "label": "bsc +"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 224,
- "type": "Reroute",
- "pos": [
- -2399.7040965118417,
- 4950.6233893932895
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 105,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 667,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 675
- ],
- "label": "bsc -"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 225,
- "type": "Reroute",
- "pos": [
- -2399.7040965118417,
- 5000.6233893932895
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 110,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 668,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 676
- ],
- "label": "rsc +"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 226,
- "type": "Reroute",
- "pos": [
- -2399.7040965118417,
- 5050.6233893932895
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 111,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 669,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 677
- ],
- "label": "rsc -"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 40,
- "type": "SeargeSDXLPromptEncoder",
- "pos": [
- -2999.704096511842,
- 4230.6233893932895
- ],
- "size": {
- "0": 400,
- "1": 470
- },
- "flags": {
- "pinned": true
- },
- "order": 99,
- "mode": 0,
- "inputs": [
- {
- "name": "base_clip",
- "type": "CLIP",
- "link": 717
- },
- {
- "name": "refiner_clip",
- "type": "CLIP",
- "link": 720,
- "slot_index": 1
- },
- {
- "name": "pos_g",
- "type": "STRING",
- "link": 463,
- "widget": {
- "name": "pos_g",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": "POS_G"
- }
- ]
- }
- },
- {
- "name": "pos_l",
- "type": "STRING",
- "link": 465,
- "widget": {
- "name": "pos_l",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": "POS_L"
- }
- ]
- }
- },
- {
- "name": "pos_r",
- "type": "STRING",
- "link": 464,
- "widget": {
- "name": "pos_r",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": "POS_R"
- }
- ]
- }
- },
- {
- "name": "neg_g",
- "type": "STRING",
- "link": 466,
- "widget": {
- "name": "neg_g",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": "NEG_G"
- }
- ]
- }
- },
- {
- "name": "neg_l",
- "type": "STRING",
- "link": 467,
- "widget": {
- "name": "neg_l",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": "NEG_L"
- }
- ]
- }
- },
- {
- "name": "neg_r",
- "type": "STRING",
- "link": 468,
- "widget": {
- "name": "neg_r",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": "NEG_R"
- }
- ]
- }
- },
- {
- "name": "base_width",
- "type": "INT",
- "link": 210,
- "widget": {
- "name": "base_width",
- "config": [
- "INT",
- {
- "default": 4096,
- "min": 0,
- "max": 8192,
- "step": 64
- }
- ]
- },
- "slot_index": 8
- },
- {
- "name": "base_height",
- "type": "INT",
- "link": 212,
- "widget": {
- "name": "base_height",
- "config": [
- "INT",
- {
- "default": 4096,
- "min": 0,
- "max": 8192,
- "step": 64
- }
- ]
- },
- "slot_index": 9
- },
- {
- "name": "target_width",
- "type": "INT",
- "link": 1026,
- "widget": {
- "name": "target_width",
- "config": [
- "INT",
- {
- "default": 4096,
- "min": 0,
- "max": 8192,
- "step": 64
- }
- ]
- },
- "slot_index": 10
- },
- {
- "name": "target_height",
- "type": "INT",
- "link": 1027,
- "widget": {
- "name": "target_height",
- "config": [
- "INT",
- {
- "default": 4096,
- "min": 0,
- "max": 8192,
- "step": 64
- }
- ]
- },
- "slot_index": 11
- },
- {
- "name": "refiner_width",
- "type": "INT",
- "link": 214,
- "widget": {
- "name": "refiner_width",
- "config": [
- "INT",
- {
- "default": 2048,
- "min": 0,
- "max": 8192,
- "step": 64
- }
- ]
- }
- },
- {
- "name": "refiner_height",
- "type": "INT",
- "link": 216,
- "widget": {
- "name": "refiner_height",
- "config": [
- "INT",
- {
- "default": 2048,
- "min": 0,
- "max": 8192,
- "step": 64
- }
- ]
- },
- "slot_index": 13
- }
- ],
- "outputs": [
- {
- "name": "base_positive",
- "type": "CONDITIONING",
- "links": [
- 662
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "base_negative",
- "type": "CONDITIONING",
- "links": [
- 663
- ],
- "shape": 3,
- "slot_index": 1
- },
- {
- "name": "refiner_positive",
- "type": "CONDITIONING",
- "links": [
- 664
- ],
- "shape": 3,
- "slot_index": 2
- },
- {
- "name": "refiner_negative",
- "type": "CONDITIONING",
- "links": [
- 665
- ],
- "shape": 3,
- "slot_index": 3
- }
- ],
- "title": "Primary Prompt Encoder (SeargeSDXL)",
- "properties": {
- "Node name for S&R": "SeargeSDXLPromptEncoder"
- },
- "widgets_values": [
- "POS_G",
- "POS_L",
- "POS_R",
- "NEG_G",
- "NEG_L",
- "NEG_R",
- 4096,
- 4096,
- 0,
- 0,
- 4096,
- 4096,
- 6,
- 2.5,
- 2048,
- 2048
- ],
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 227,
- "type": "Reroute",
- "pos": [
- -1799.8005108491654,
- 4599.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 120,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 670,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 678,
- 682,
- 827,
- 828,
- 1118
- ],
- "slot_index": 0,
- "label": "bc +"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 228,
- "type": "Reroute",
- "pos": [
- -1799.8005108491654,
- 4649.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 121,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 671,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 679,
- 683,
- 791,
- 829,
- 830
- ],
- "slot_index": 0,
- "label": "bc -"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 229,
- "type": "Reroute",
- "pos": [
- -1799.8005108491654,
- 4699.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 122,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 672,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 680,
- 684,
- 792,
- 832,
- 834
- ],
- "slot_index": 0,
- "label": "rc +"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 230,
- "type": "Reroute",
- "pos": [
- -1799.8005108491654,
- 4749.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 123,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 673,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 681,
- 685,
- 793,
- 833,
- 835
- ],
- "slot_index": 0,
- "label": "rc -"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 41,
- "type": "SeargeSDXLBasePromptEncoder",
- "pos": [
- -2999.704096511842,
- 4830.6233893932895
- ],
- "size": {
- "0": 400,
- "1": 270
- },
- "flags": {
- "pinned": true
- },
- "order": 98,
- "mode": 0,
- "inputs": [
- {
- "name": "base_clip",
- "type": "CLIP",
- "link": 718,
- "slot_index": 0
- },
- {
- "name": "pos_g",
- "type": "STRING",
- "link": 472,
- "widget": {
- "name": "pos_g",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": "POS_G"
- }
- ]
- },
- "slot_index": 1
- },
- {
- "name": "pos_l",
- "type": "STRING",
- "link": 473,
- "widget": {
- "name": "pos_l",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": "POS_L"
- }
- ]
- },
- "slot_index": 2
- },
- {
- "name": "neg_g",
- "type": "STRING",
- "link": 470,
- "widget": {
- "name": "neg_g",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": "NEG_G"
- }
- ]
- },
- "slot_index": 3
- },
- {
- "name": "neg_l",
- "type": "STRING",
- "link": 471,
- "widget": {
- "name": "neg_l",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": "NEG_L"
- }
- ]
- },
- "slot_index": 4
- },
- {
- "name": "base_width",
- "type": "INT",
- "link": 211,
- "widget": {
- "name": "base_width",
- "config": [
- "INT",
- {
- "default": 4096,
- "min": 0,
- "max": 8192,
- "step": 64
- }
- ]
- },
- "slot_index": 5
- },
- {
- "name": "base_height",
- "type": "INT",
- "link": 213,
- "widget": {
- "name": "base_height",
- "config": [
- "INT",
- {
- "default": 4096,
- "min": 0,
- "max": 8192,
- "step": 64
- }
- ]
- },
- "slot_index": 6
- },
- {
- "name": "target_width",
- "type": "INT",
- "link": 1028,
- "widget": {
- "name": "target_width",
- "config": [
- "INT",
- {
- "default": 4096,
- "min": 0,
- "max": 8192,
- "step": 64
- }
- ]
- },
- "slot_index": 7
- },
- {
- "name": "target_height",
- "type": "INT",
- "link": 1029,
- "widget": {
- "name": "target_height",
- "config": [
- "INT",
- {
- "default": 4096,
- "min": 0,
- "max": 8192,
- "step": 64
- }
- ]
- },
- "slot_index": 8
- }
- ],
- "outputs": [
- {
- "name": "base_positive",
- "type": "CONDITIONING",
- "links": [
- 666
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "base_negative",
- "type": "CONDITIONING",
- "links": [
- 667
- ],
- "shape": 3,
- "slot_index": 1
- }
- ],
- "title": "Base Style Encoder (SeargeSDXL)",
- "properties": {
- "Node name for S&R": "SeargeSDXLBasePromptEncoder"
- },
- "widgets_values": [
- "POS_G",
- "POS_L",
- "NEG_G",
- "NEG_L",
- 4096,
- 4096,
- 0,
- 0,
- 4096,
- 4096
- ],
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 231,
- "type": "Reroute",
- "pos": [
- -1799.8005108491654,
- 4899.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 118,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 674,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 686,
- 781,
- 836,
- 840,
- 1164
- ],
- "slot_index": 0,
- "label": "bsc +"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 232,
- "type": "Reroute",
- "pos": [
- -1799.8005108491654,
- 4949.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 119,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 675,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 687,
- 782,
- 837,
- 841,
- 1165
- ],
- "slot_index": 0,
- "label": "bsc -"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 42,
- "type": "SeargeSDXLRefinerPromptEncoder",
- "pos": [
- -2999.704096511842,
- 5230.6233893932895
- ],
- "size": {
- "0": 400,
- "1": 270
- },
- "flags": {
- "pinned": true
- },
- "order": 100,
- "mode": 0,
- "inputs": [
- {
- "name": "refiner_clip",
- "type": "CLIP",
- "link": 721,
- "slot_index": 0
- },
- {
- "name": "pos_r",
- "type": "STRING",
- "link": 474,
- "widget": {
- "name": "pos_r",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": "POS_R"
- }
- ]
- },
- "slot_index": 1
- },
- {
- "name": "neg_r",
- "type": "STRING",
- "link": 469,
- "widget": {
- "name": "neg_r",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": "NEG_R"
- }
- ]
- },
- "slot_index": 2
- },
- {
- "name": "refiner_width",
- "type": "INT",
- "link": 215,
- "widget": {
- "name": "refiner_width",
- "config": [
- "INT",
- {
- "default": 2048,
- "min": 0,
- "max": 8192,
- "step": 64
- }
- ]
- }
- },
- {
- "name": "refiner_height",
- "type": "INT",
- "link": 217,
- "widget": {
- "name": "refiner_height",
- "config": [
- "INT",
- {
- "default": 2048,
- "min": 0,
- "max": 8192,
- "step": 64
- }
- ]
- },
- "slot_index": 4
- }
- ],
- "outputs": [
- {
- "name": "refiner_positive",
- "type": "CONDITIONING",
- "links": [
- 668
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "refiner_negative",
- "type": "CONDITIONING",
- "links": [
- 669
- ],
- "shape": 3,
- "slot_index": 1
- }
- ],
- "title": "Refiner Style Encoder (SeargeSDXL)",
- "properties": {
- "Node name for S&R": "SeargeSDXLRefinerPromptEncoder"
- },
- "widgets_values": [
- "POS_R",
- "NEG_R",
- 6,
- 2.5,
- 2048,
- 2048
- ],
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 233,
- "type": "Reroute",
- "pos": [
- -1799.8005108491654,
- 4999.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 124,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 676,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 688,
- 783,
- 838,
- 842,
- 1166
- ],
- "slot_index": 0,
- "label": "rsc +"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 234,
- "type": "Reroute",
- "pos": [
- -1799.8005108491654,
- 5049.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 125,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 677,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 689,
- 784,
- 839,
- 843,
- 1167
- ],
- "slot_index": 0,
- "label": "rsc -"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 196,
- "type": "Reroute",
- "pos": [
- 4400,
- 4150
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 37,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 603,
- "pos": [
- 37.5,
- 0
- ]
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "MODEL",
- "links": [
- 971
- ],
- "slot_index": 0,
- "label": "r m"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 197,
- "type": "Reroute",
- "pos": [
- 4500,
- 4150
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 71,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 605,
- "pos": [
- 37.5,
- 0
- ]
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "MODEL",
- "links": [
- 972
- ],
- "slot_index": 0,
- "label": "b m"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 199,
- "type": "Reroute",
- "pos": [
- 4900,
- 4150
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 47,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 732,
- "slot_index": 0,
- "pos": [
- 37.5,
- 0
- ]
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "VAE",
- "links": [
- 614
- ],
- "slot_index": 0,
- "label": "vae"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#322",
- "bgcolor": "#533"
- },
- {
- "id": 235,
- "type": "PreviewImage",
- "pos": [
- 5600,
- 4830
- ],
- "size": {
- "0": 300,
- "1": 270
- },
- "flags": {
- "pinned": true
- },
- "order": 285,
- "mode": 0,
- "inputs": [
- {
- "name": "images",
- "type": "IMAGE",
- "link": 690,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "PreviewImage"
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 192,
- "type": "Reroute",
- "pos": [
- 6800,
- 5350
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 279,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 821,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1009
- ],
- "slot_index": 0,
- "label": "b-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 193,
- "type": "Reroute",
- "pos": [
- 6800,
- 5400
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 282,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 820,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1010
- ],
- "slot_index": 0,
- "label": "r+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 194,
- "type": "Reroute",
- "pos": [
- 6800,
- 5450
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 281,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 819,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1011
- ],
- "slot_index": 0,
- "label": "r-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 236,
- "type": "PreviewImage",
- "pos": [
- 8700,
- 5130
- ],
- "size": {
- "0": 300,
- "1": 270
- },
- "flags": {
- "pinned": true
- },
- "order": 291,
- "mode": 0,
- "inputs": [
- {
- "name": "images",
- "type": "IMAGE",
- "link": 985,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "PreviewImage"
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 198,
- "type": "Reroute",
- "pos": [
- 6700,
- 4100
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 101,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 611
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "PARAMETERS",
- "links": [
- 693,
- 1012
- ],
- "slot_index": 0,
- "label": "data"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 237,
- "type": "Reroute",
- "pos": [
- 9100,
- 4100
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 112,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 693
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "PARAMETERS",
- "links": [
- 694
- ],
- "slot_index": 0,
- "label": "data"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 209,
- "type": "Reroute",
- "pos": [
- 9800,
- 4100
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 126,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 694
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "PARAMETERS",
- "links": [
- 703,
- 978
- ],
- "slot_index": 0,
- "label": "data"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 105,
- "type": "Reroute",
- "pos": [
- 9100,
- 4150
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 290,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 984
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "IMAGE",
- "links": [
- 714
- ],
- "slot_index": 0,
- "label": "img"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 240,
- "type": "Reroute",
- "pos": [
- 10250,
- 4150
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 29,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 806,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "*",
- "links": [
- 701,
- 702
- ],
- "slot_index": 0,
- "label": "img"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 66,
- "type": "ImageUpscaleWithModel",
- "pos": [
- 10600,
- 4230
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 50,
- "mode": 0,
- "inputs": [
- {
- "name": "upscale_model",
- "type": "UPSCALE_MODEL",
- "link": 623,
- "slot_index": 0
- },
- {
- "name": "image",
- "type": "IMAGE",
- "link": 701,
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "IMAGE",
- "type": "IMAGE",
- "links": [
- 86
- ],
- "shape": 3
- }
- ],
- "title": "Upscale with Model 1",
- "properties": {
- "Node name for S&R": "ImageUpscaleWithModel"
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 65,
- "type": "SeargeIntegerScaler",
- "pos": [
- 10600,
- 4830
- ],
- "size": {
- "0": 300.6545104980469,
- "1": 121.05631256103516
- },
- "flags": {
- "pinned": true
- },
- "order": 230,
- "mode": 0,
- "inputs": [
- {
- "name": "value",
- "type": "INT",
- "link": 981,
- "widget": {
- "name": "value",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 18446744073709552000
- }
- ]
- },
- "slot_index": 0
- },
- {
- "name": "factor",
- "type": "FLOAT",
- "link": 977,
- "widget": {
- "name": "factor",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "step": 0.01
- }
- ]
- },
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "value",
- "type": "INT",
- "links": [
- 92
- ],
- "shape": 3
- }
- ],
- "title": "Upscaled Image Height",
- "properties": {
- "Node name for S&R": "SeargeIntegerScaler"
- },
- "widgets_values": [
- 0,
- 1,
- 8
- ],
- "color": "#233",
- "bgcolor": "#355"
- },
- {
- "id": 68,
- "type": "ImageBlend",
- "pos": [
- 11000,
- 4330
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 56,
- "mode": 0,
- "inputs": [
- {
- "name": "image1",
- "type": "IMAGE",
- "link": 86,
- "slot_index": 0
- },
- {
- "name": "image2",
- "type": "IMAGE",
- "link": 87,
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "IMAGE",
- "type": "IMAGE",
- "links": [
- 89
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Mix Upscaled Images",
- "properties": {
- "Node name for S&R": "ImageBlend"
- },
- "widgets_values": [
- 0.5,
- "normal"
- ],
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 69,
- "type": "ImageScale",
- "pos": [
- 11400,
- 4530
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 240,
- "mode": 0,
- "inputs": [
- {
- "name": "image",
- "type": "IMAGE",
- "link": 89
- },
- {
- "name": "width",
- "type": "INT",
- "link": 91,
- "widget": {
- "name": "width",
- "config": [
- "INT",
- {
- "default": 512,
- "min": 1,
- "max": 8192,
- "step": 1
- }
- ]
- }
- },
- {
- "name": "height",
- "type": "INT",
- "link": 92,
- "widget": {
- "name": "height",
- "config": [
- "INT",
- {
- "default": 512,
- "min": 1,
- "max": 8192,
- "step": 1
- }
- ]
- },
- "slot_index": 2
- }
- ],
- "outputs": [
- {
- "name": "IMAGE",
- "type": "IMAGE",
- "links": [
- 704,
- 974
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Scale to Target Size",
- "properties": {
- "Node name for S&R": "ImageScale"
- },
- "widgets_values": [
- "bicubic",
- 512,
- 512,
- "center"
- ],
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 241,
- "type": "Reroute",
- "pos": [
- 12200,
- 4100
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 155,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 703,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "PARAMETERS",
- "links": null,
- "label": "data"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 187,
- "type": "Reroute",
- "pos": [
- 10100,
- 3400
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 43,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 698,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "UPSCALE_MODEL",
- "links": [
- 705
- ],
- "slot_index": 0,
- "label": "up 2"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 238,
- "type": "Reroute",
- "pos": [
- 10100,
- 3200
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 34,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 695,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "UPSCALE_MODEL",
- "links": [
- 696
- ],
- "slot_index": 0,
- "label": "up 1"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 244,
- "type": "Reroute",
- "pos": [
- 10400,
- 4140
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 51,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 705,
- "slot_index": 0,
- "pos": [
- 37.5,
- 0
- ]
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "UPSCALE_MODEL",
- "links": [
- 706
- ],
- "slot_index": 0,
- "label": "up 2"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 186,
- "type": "Reroute",
- "pos": [
- 10500,
- 4140
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 42,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 696,
- "slot_index": 0,
- "pos": [
- 37.5,
- 0
- ]
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "UPSCALE_MODEL",
- "links": [
- 623
- ],
- "slot_index": 0,
- "label": "up 1"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 183,
- "type": "Reroute",
- "pos": [
- 3900,
- 2100
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 67,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 561,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "MODEL",
- "links": [
- 605,
- 710
- ],
- "slot_index": 0,
- "label": "b m"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 239,
- "type": "Reroute",
- "pos": [
- 8103,
- 3402
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 35,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 697,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "UPSCALE_MODEL",
- "links": [
- 698,
- 699
- ],
- "slot_index": 0,
- "label": "up 2"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 245,
- "type": "Reroute",
- "pos": [
- 7700,
- 2900
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 48,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 734,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "VAE",
- "links": [
- 708
- ],
- "slot_index": 0,
- "label": "vae"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#322",
- "bgcolor": "#533"
- },
- {
- "id": 181,
- "type": "Reroute",
- "pos": [
- 3900,
- 2600
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 31,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 563,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "MODEL",
- "links": [
- 603,
- 711
- ],
- "slot_index": 0,
- "label": "r m"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 247,
- "type": "Reroute",
- "pos": [
- 7600,
- 2600
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 38,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 711,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "MODEL",
- "links": [
- 713
- ],
- "slot_index": 0,
- "label": "r m"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 248,
- "type": "Reroute",
- "pos": [
- 7500,
- 2100
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 72,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 710,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "MODEL",
- "links": [
- 712
- ],
- "slot_index": 0,
- "label": "b m"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 249,
- "type": "Reroute",
- "pos": [
- 9300,
- 1600
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 292,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 714,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "IMAGE",
- "links": [
- 715
- ],
- "slot_index": 0,
- "label": "img"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 191,
- "type": "Reroute",
- "pos": [
- 6800,
- 5300
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 280,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 822,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1008
- ],
- "slot_index": 0,
- "label": "b+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 251,
- "type": "Reroute",
- "pos": [
- -3199.704096511842,
- 4150.623389393285
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 39,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 719,
- "pos": [
- 37.5,
- 0
- ]
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CLIP",
- "links": [
- 720,
- 721
- ],
- "slot_index": 0,
- "label": "r m"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 250,
- "type": "Reroute",
- "pos": [
- -3299.704096511842,
- 4150.623389393285
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 73,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 716,
- "pos": [
- 37.5,
- 0
- ]
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CLIP",
- "links": [
- 717,
- 718
- ],
- "slot_index": 0,
- "label": "b m"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 45,
- "type": "Note",
- "pos": [
- 530,
- 930
- ],
- "size": {
- "0": 650,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 2,
- "mode": 0,
- "title": "Workflow Information",
- "properties": {
- "text": ""
- },
- "widgets_values": [
- " Improved Searge SDXL \"Reborn\" workflows for SDXL 1.0 | Version 3.4 updated on Aug 08, 2023\n\n !!! REQUIRES CUSTOM NODE EXTENSION: https://github.com/SeargeDP/SeargeSDXL !!!\n\n 1024 x 1024, 1152 x 896, 896 x 1152, 1216 x 832, 832 x 1216, 1344 x 768, 768 x 1344, 1536 x 640, 640 x 1536\n\nNOTE: All upscale factors are applied to the image size from generation parameters, not the actual image size"
- ],
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 86,
- "type": "PreviewImage",
- "pos": [
- 100,
- -970
- ],
- "size": {
- "0": 1600,
- "1": 870
- },
- "flags": {
- "pinned": true
- },
- "order": 295,
- "mode": 0,
- "inputs": [
- {
- "name": "images",
- "type": "IMAGE",
- "link": 224,
- "slot_index": 0
- }
- ],
- "title": "Horizontal Preview Image",
- "properties": {
- "Node name for S&R": "PreviewImage"
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 268,
- "type": "LoadImage",
- "pos": [
- -400,
- 30
- ],
- "size": {
- "0": 400,
- "1": 470
- },
- "flags": {
- "pinned": true
- },
- "order": 3,
- "mode": 0,
- "outputs": [
- {
- "name": "IMAGE",
- "type": "IMAGE",
- "links": [
- 729
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "MASK",
- "type": "MASK",
- "links": null,
- "shape": 3
- }
- ],
- "title": "Source Image",
- "properties": {
- "Node name for S&R": "LoadImage"
- },
- "widgets_values": [
- "example.png",
- "image"
- ],
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 269,
- "type": "LoadImage",
- "pos": [
- -400,
- 580
- ],
- "size": {
- "0": 400,
- "1": 470
- },
- "flags": {
- "pinned": true
- },
- "order": 4,
- "mode": 0,
- "outputs": [
- {
- "name": "IMAGE",
- "type": "IMAGE",
- "links": null,
- "shape": 3
- },
- {
- "name": "MASK",
- "type": "MASK",
- "links": [
- 730
- ],
- "shape": 3
- }
- ],
- "title": "Inpainting Mask - right click -> MaskEditor",
- "properties": {
- "Node name for S&R": "LoadImage"
- },
- "widgets_values": [
- "example.png",
- "image"
- ],
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 87,
- "type": "PreviewImage",
- "pos": [
- -1400,
- -970
- ],
- "size": {
- "0": 900,
- "1": 1570
- },
- "flags": {
- "pinned": true
- },
- "order": 294,
- "mode": 0,
- "inputs": [
- {
- "name": "images",
- "type": "IMAGE",
- "link": 223,
- "slot_index": 0
- }
- ],
- "title": "Vertical Preview Image",
- "properties": {
- "Node name for S&R": "PreviewImage"
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 104,
- "type": "Reroute",
- "pos": [
- 3100,
- 50
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 293,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 715
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "IMAGE",
- "links": [
- 223,
- 224,
- 225,
- 916
- ],
- "slot_index": 0,
- "label": "img"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 271,
- "type": "Reroute",
- "pos": [
- 4600,
- 2900
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 40,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 733,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "VAE",
- "links": [
- 732,
- 734
- ],
- "slot_index": 0,
- "label": "vae"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#322",
- "bgcolor": "#533"
- },
- {
- "id": 272,
- "type": "SeargeInput6",
- "pos": [
- 860,
- 250
- ],
- "size": {
- "0": 320,
- "1": 202
- },
- "flags": {
- "pinned": true
- },
- "order": 16,
- "mode": 0,
- "inputs": [
- {
- "name": "inputs",
- "type": "PARAMETER_INPUTS",
- "link": 735
- }
- ],
- "outputs": [
- {
- "name": "inputs",
- "type": "PARAMETER_INPUTS",
- "links": [
- 736
- ],
- "shape": 3
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeInput6"
- },
- "widgets_values": [
- "disabled",
- 25,
- 0.25,
- 1.5,
- "hard",
- "distinct",
- 0.49999999999999994
- ],
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 243,
- "type": "PreviewImage",
- "pos": [
- 11800,
- 4330
- ],
- "size": {
- "0": 300,
- "1": 270
- },
- "flags": {
- "pinned": true
- },
- "order": 250,
- "mode": 0,
- "inputs": [
- {
- "name": "images",
- "type": "IMAGE",
- "link": 704,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "PreviewImage"
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 64,
- "type": "SeargeIntegerScaler",
- "pos": [
- 10600,
- 4580
- ],
- "size": {
- "0": 300,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 229,
- "mode": 0,
- "inputs": [
- {
- "name": "value",
- "type": "INT",
- "link": 980,
- "widget": {
- "name": "value",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 18446744073709552000
- }
- ]
- },
- "slot_index": 0
- },
- {
- "name": "factor",
- "type": "FLOAT",
- "link": 976,
- "widget": {
- "name": "factor",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "step": 0.01
- }
- ]
- },
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "value",
- "type": "INT",
- "links": [
- 91
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Upscaled Image Width",
- "properties": {
- "Node name for S&R": "SeargeIntegerScaler"
- },
- "widgets_values": [
- 0,
- 1,
- 8
- ],
- "color": "#233",
- "bgcolor": "#355"
- },
- {
- "id": 67,
- "type": "ImageUpscaleWithModel",
- "pos": [
- 10600,
- 4380
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 54,
- "mode": 0,
- "inputs": [
- {
- "name": "upscale_model",
- "type": "UPSCALE_MODEL",
- "link": 706,
- "slot_index": 0
- },
- {
- "name": "image",
- "type": "IMAGE",
- "link": 702,
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "IMAGE",
- "type": "IMAGE",
- "links": [
- 87
- ],
- "shape": 3
- }
- ],
- "title": "Upscale with Model 2",
- "properties": {
- "Node name for S&R": "ImageUpscaleWithModel"
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 185,
- "type": "Reroute",
- "pos": [
- 0,
- 2900
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 33,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 588,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "VAE",
- "links": [
- 733,
- 762
- ],
- "slot_index": 0,
- "label": "vae"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#322",
- "bgcolor": "#533"
- },
- {
- "id": 290,
- "type": "SeargeOutput2",
- "pos": [
- 1100,
- 7130
- ],
- "size": {
- "0": 400,
- "1": 270
- },
- "flags": {
- "pinned": true
- },
- "order": 96,
- "mode": 0,
- "inputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "link": 767
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": [
- 787
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "seed",
- "type": "INT",
- "links": null,
- "shape": 3
- },
- {
- "name": "image_width",
- "type": "INT",
- "links": [
- 770,
- 771
- ],
- "shape": 3,
- "slot_index": 2
- },
- {
- "name": "image_height",
- "type": "INT",
- "links": [
- 772,
- 773
- ],
- "shape": 3,
- "slot_index": 3
- },
- {
- "name": "steps",
- "type": "INT",
- "links": null,
- "shape": 3
- },
- {
- "name": "cfg",
- "type": "FLOAT",
- "links": null,
- "shape": 3
- },
- {
- "name": "sampler_name",
- "type": [
- "euler",
- "euler_ancestral",
- "heun",
- "dpm_2",
- "dpm_2_ancestral",
- "lms",
- "dpm_fast",
- "dpm_adaptive",
- "dpmpp_2s_ancestral",
- "dpmpp_sde",
- "dpmpp_sde_gpu",
- "dpmpp_2m",
- "dpmpp_2m_sde",
- "dpmpp_2m_sde_gpu",
- "ddim",
- "uni_pc",
- "uni_pc_bh2"
- ],
- "links": null,
- "shape": 3
- },
- {
- "name": "scheduler",
- "type": [
- "normal",
- "karras",
- "exponential",
- "simple",
- "ddim_uniform"
- ],
- "links": null,
- "shape": 3
- },
- {
- "name": "save_image",
- "type": [
- "disabled",
- "enabled"
- ],
- "links": null,
- "shape": 3
- },
- {
- "name": "save_directory",
- "type": [
- "output folder",
- "input folder"
- ],
- "links": null,
- "shape": 3
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeOutput2"
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 153,
- "type": "SeargeOutput1",
- "pos": [
- -4399.70409651184,
- 4530.6233893932895
- ],
- "size": {
- "0": 400,
- "1": 220
- },
- "flags": {
- "pinned": true
- },
- "order": 70,
- "mode": 0,
- "inputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "link": 1036
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": [
- 537
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "main_prompt",
- "type": "STRING",
- "links": [
- 463,
- 464
- ],
- "shape": 3,
- "slot_index": 1
- },
- {
- "name": "secondary_prompt",
- "type": "STRING",
- "links": [
- 465
- ],
- "shape": 3,
- "slot_index": 2
- },
- {
- "name": "style_prompt",
- "type": "STRING",
- "links": [
- 472,
- 473,
- 474
- ],
- "shape": 3,
- "slot_index": 3
- },
- {
- "name": "negative_prompt",
- "type": "STRING",
- "links": [
- 466,
- 467,
- 468
- ],
- "shape": 3,
- "slot_index": 4
- },
- {
- "name": "negative_style",
- "type": "STRING",
- "links": [
- 469,
- 470,
- 471
- ],
- "shape": 3,
- "slot_index": 5
- },
- {
- "name": "image",
- "type": "IMAGE",
- "links": null,
- "shape": 3
- },
- {
- "name": "mask",
- "type": "MASK",
- "links": null,
- "shape": 3
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeOutput1"
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 161,
- "type": "SeargeOutput5",
- "pos": [
- -4399.70409651184,
- 4830.6233893932895
- ],
- "size": {
- "0": 400,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 76,
- "mode": 0,
- "inputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "link": 537
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": [],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "base_conditioning_scale",
- "type": "FLOAT",
- "links": [
- 501,
- 502
- ],
- "shape": 3,
- "slot_index": 1
- },
- {
- "name": "refiner_conditioning_scale",
- "type": "FLOAT",
- "links": [
- 503,
- 504
- ],
- "shape": 3,
- "slot_index": 2
- },
- {
- "name": "style_prompt_power",
- "type": "FLOAT",
- "links": [],
- "shape": 3,
- "slot_index": 3
- },
- {
- "name": "negative_style_power",
- "type": "FLOAT",
- "links": [],
- "shape": 3,
- "slot_index": 4
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeOutput5"
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 215,
- "type": "Reroute",
- "pos": [
- 3203,
- 4903
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 271,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1128,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 826,
- 970
- ],
- "slot_index": 0,
- "label": "b+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 286,
- "type": "MaskToImage",
- "pos": [
- 1600,
- 7730
- ],
- "size": {
- "0": 200,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 117,
- "mode": 0,
- "inputs": [
- {
- "name": "mask",
- "type": "MASK",
- "link": 768,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "IMAGE",
- "type": "IMAGE",
- "links": [
- 760
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "MaskToImage"
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 281,
- "type": "ImageScale",
- "pos": [
- 1900,
- 7130
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 116,
- "mode": 0,
- "inputs": [
- {
- "name": "image",
- "type": "IMAGE",
- "link": 769
- },
- {
- "name": "width",
- "type": "INT",
- "link": 770,
- "widget": {
- "name": "width",
- "config": [
- "INT",
- {
- "default": 512,
- "min": 1,
- "max": 8192,
- "step": 1
- }
- ]
- },
- "slot_index": 1
- },
- {
- "name": "height",
- "type": "INT",
- "link": 772,
- "widget": {
- "name": "height",
- "config": [
- "INT",
- {
- "default": 512,
- "min": 1,
- "max": 8192,
- "step": 1
- }
- ]
- },
- "slot_index": 2
- }
- ],
- "outputs": [
- {
- "name": "IMAGE",
- "type": "IMAGE",
- "links": [
- 756
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ImageScale"
- },
- "widgets_values": [
- "bicubic",
- 512,
- 512,
- "center"
- ],
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 284,
- "type": "ImageScale",
- "pos": [
- 1900,
- 7430
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 130,
- "mode": 0,
- "inputs": [
- {
- "name": "image",
- "type": "IMAGE",
- "link": 760
- },
- {
- "name": "width",
- "type": "INT",
- "link": 771,
- "widget": {
- "name": "width",
- "config": [
- "INT",
- {
- "default": 512,
- "min": 1,
- "max": 8192,
- "step": 1
- }
- ]
- }
- },
- {
- "name": "height",
- "type": "INT",
- "link": 773,
- "widget": {
- "name": "height",
- "config": [
- "INT",
- {
- "default": 512,
- "min": 1,
- "max": 8192,
- "step": 1
- }
- ]
- }
- }
- ],
- "outputs": [
- {
- "name": "IMAGE",
- "type": "IMAGE",
- "links": [
- 761
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ImageScale"
- },
- "widgets_values": [
- "bicubic",
- 512,
- 512,
- "center"
- ],
- "color": "#2a363b",
- "bgcolor": "#3f5159"
- },
- {
- "id": 288,
- "type": "FeatherMask",
- "pos": [
- 2700,
- 7430
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 188,
- "mode": 0,
- "inputs": [
- {
- "name": "mask",
- "type": "MASK",
- "link": 764
- }
- ],
- "outputs": [
- {
- "name": "MASK",
- "type": "MASK",
- "links": [
- 765
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "FeatherMask"
- },
- "widgets_values": [
- 4,
- 4,
- 4,
- 4
- ],
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 282,
- "type": "VAEEncode",
- "pos": [
- 2400,
- 7130
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 129,
- "mode": 0,
- "inputs": [
- {
- "name": "pixels",
- "type": "IMAGE",
- "link": 756,
- "slot_index": 0
- },
- {
- "name": "vae",
- "type": "VAE",
- "link": 775
- }
- ],
- "outputs": [
- {
- "name": "LATENT",
- "type": "LATENT",
- "links": [
- 758,
- 778
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "VAEEncode"
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 285,
- "type": "ImageToMask",
- "pos": [
- 2300,
- 7430
- ],
- "size": {
- "0": 297.2215881347656,
- "1": 72.36862182617188
- },
- "flags": {
- "pinned": true
- },
- "order": 159,
- "mode": 0,
- "inputs": [
- {
- "name": "image",
- "type": "IMAGE",
- "link": 761
- }
- ],
- "outputs": [
- {
- "name": "MASK",
- "type": "MASK",
- "links": [
- 764
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ImageToMask"
- },
- "widgets_values": [
- "green"
- ],
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 289,
- "type": "Reroute",
- "pos": [
- 3800,
- 5100
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 252,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 780,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "LATENT",
- "links": [
- 914
- ],
- "label": "ip",
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 294,
- "type": "Reroute",
- "pos": [
- 2260,
- 7050
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 49,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 774,
- "slot_index": 0,
- "pos": [
- 37.5,
- 0
- ]
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "VAE",
- "links": [
- 775
- ],
- "slot_index": 0,
- "label": "vae"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#322",
- "bgcolor": "#533"
- },
- {
- "id": 283,
- "type": "SetLatentNoiseMask",
- "pos": [
- 3100,
- 7230
- ],
- "size": {
- "0": 200,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 231,
- "mode": 0,
- "inputs": [
- {
- "name": "samples",
- "type": "LATENT",
- "link": 758
- },
- {
- "name": "mask",
- "type": "MASK",
- "link": 765
- }
- ],
- "outputs": [
- {
- "name": "LATENT",
- "type": "LATENT",
- "links": [
- 777
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SetLatentNoiseMask"
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 296,
- "type": "Reroute",
- "pos": [
- 3300,
- 7000
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 97,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 776
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "PARAMETERS",
- "links": null,
- "label": "data"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 297,
- "type": "Reroute",
- "pos": [
- 2860,
- 7050
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 158,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 778
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "LATENT",
- "links": [
- 779
- ],
- "slot_index": 0,
- "label": "i 2 i"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 298,
- "type": "Reroute",
- "pos": [
- 3800,
- 5050
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 187,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 779,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "LATENT",
- "links": [
- 913
- ],
- "label": "i 2 i",
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 299,
- "type": "Reroute",
- "pos": [
- 4360,
- 4450
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 128,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 785,
- "slot_index": 0,
- "pos": [
- 37.5,
- 0
- ]
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "LATENT",
- "links": [
- 910
- ],
- "slot_index": 0,
- "label": "t 2 i"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 293,
- "type": "SeargeOutput1",
- "pos": [
- 1100,
- 7530
- ],
- "size": {
- "0": 400,
- "1": 270
- },
- "flags": {
- "pinned": true
- },
- "order": 103,
- "mode": 0,
- "inputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "link": 787
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": null,
- "shape": 3
- },
- {
- "name": "main_prompt",
- "type": "STRING",
- "links": null,
- "shape": 3
- },
- {
- "name": "secondary_prompt",
- "type": "STRING",
- "links": null,
- "shape": 3
- },
- {
- "name": "style_prompt",
- "type": "STRING",
- "links": null,
- "shape": 3
- },
- {
- "name": "negative_prompt",
- "type": "STRING",
- "links": null,
- "shape": 3
- },
- {
- "name": "negative_style",
- "type": "STRING",
- "links": null,
- "shape": 3
- },
- {
- "name": "image",
- "type": "IMAGE",
- "links": [
- 769
- ],
- "shape": 3,
- "slot_index": 6
- },
- {
- "name": "mask",
- "type": "MASK",
- "links": [
- 768
- ],
- "shape": 3,
- "slot_index": 7
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeOutput1"
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 205,
- "type": "Reroute",
- "pos": [
- 8101,
- 4151
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 77,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 712,
- "slot_index": 0,
- "pos": [
- 37.5,
- 0
- ]
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "MODEL",
- "links": [
- 1006
- ],
- "slot_index": 0,
- "label": "b m"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 204,
- "type": "Reroute",
- "pos": [
- 8004,
- 4151
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 46,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 713,
- "slot_index": 0,
- "pos": [
- 37.5,
- 0
- ]
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "MODEL",
- "links": [
- 1007
- ],
- "slot_index": 0,
- "label": "r m"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 208,
- "type": "Reroute",
- "pos": [
- 7813,
- 4148
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 287,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 633
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "IMAGE",
- "links": [
- 1004
- ],
- "slot_index": 0,
- "label": "img"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 304,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 4749.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 180,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 794
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1084,
- 1264
- ],
- "label": "cr-",
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 305,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 4699.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 175,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 795
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1074,
- 1266
- ],
- "label": "cr+",
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 306,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 4649.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 167,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 796
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1064,
- 1263
- ],
- "label": "cb-",
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 308,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 4449.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 173,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 798
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1260
- ],
- "label": "sr-",
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 3,
- "type": "SeargePromptText",
- "pos": [
- 60,
- 40
- ],
- "size": {
- "0": 460,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 5,
- "mode": 0,
- "outputs": [
- {
- "name": "prompt",
- "type": "STRING",
- "links": [
- 723
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Main Prompt",
- "properties": {
- "Node name for S&R": "SeargePromptText"
- },
- "widgets_values": [
- "a cat with a hat in a grass field"
- ],
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 5,
- "type": "SeargePromptText",
- "pos": [
- 60,
- 250
- ],
- "size": {
- "0": 460,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 6,
- "mode": 0,
- "outputs": [
- {
- "name": "prompt",
- "type": "STRING",
- "links": [
- 724
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Secondary Prompt",
- "properties": {
- "Node name for S&R": "SeargePromptText"
- },
- "widgets_values": [
- "cat with hat, in grass field"
- ],
- "color": "#2a363b",
- "bgcolor": "#3f5159"
- },
- {
- "id": 6,
- "type": "SeargePromptText",
- "pos": [
- 60,
- 460
- ],
- "size": {
- "0": 460,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 7,
- "mode": 0,
- "outputs": [
- {
- "name": "prompt",
- "type": "STRING",
- "links": [
- 725
- ],
- "shape": 3
- }
- ],
- "title": "Style",
- "properties": {
- "Node name for S&R": "SeargePromptText"
- },
- "widgets_values": [
- "~*~oil painting~*~ in the style of Frank Bowling, vibrant colors"
- ],
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 7,
- "type": "SeargePromptText",
- "pos": [
- 60,
- 670
- ],
- "size": {
- "0": 460,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 8,
- "mode": 0,
- "outputs": [
- {
- "name": "prompt",
- "type": "STRING",
- "links": [
- 726
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Negative Prompt",
- "properties": {
- "Node name for S&R": "SeargePromptText"
- },
- "widgets_values": [
- "jpeg artifacts, noise"
- ],
- "color": "#322",
- "bgcolor": "#533"
- },
- {
- "id": 312,
- "type": "Reroute",
- "pos": [
- 9760,
- 4150
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 22,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 919
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "*",
- "links": [
- 806
- ],
- "slot_index": 0,
- "label": "img"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 8,
- "type": "SeargePromptText",
- "pos": [
- 60,
- 880
- ],
- "size": {
- "0": 460,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 9,
- "mode": 0,
- "outputs": [
- {
- "name": "prompt",
- "type": "STRING",
- "links": [
- 727
- ],
- "shape": 3
- }
- ],
- "title": "Negative Style",
- "properties": {
- "Node name for S&R": "SeargePromptText"
- },
- "widgets_values": [
- "photograph, anime"
- ],
- "color": "#332922",
- "bgcolor": "#593930"
- },
- {
- "id": 316,
- "type": "Reroute",
- "pos": [
- 3700,
- 5450
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 276,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 823
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 819
- ],
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 315,
- "type": "Reroute",
- "pos": [
- 3700,
- 5350
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 274,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 825
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 821
- ],
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 317,
- "type": "Reroute",
- "pos": [
- 3700,
- 5400
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 277,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 824
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 820
- ],
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 314,
- "type": "Reroute",
- "pos": [
- 3700,
- 5300
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 275,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 826
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 822
- ],
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 291,
- "type": "Reroute",
- "pos": [
- 1000,
- 7000
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 80,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1039
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "PARAMETERS",
- "links": [
- 767,
- 776
- ],
- "slot_index": 0,
- "label": "data"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 295,
- "type": "Reroute",
- "pos": [
- 3360,
- 7100
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 241,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 777
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "LATENT",
- "links": [
- 780
- ],
- "slot_index": 0,
- "label": "ip"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 287,
- "type": "Reroute",
- "pos": [
- 800,
- 6600
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 41,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 762,
- "slot_index": 0,
- "pos": [
- 37.5,
- 0
- ]
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "VAE",
- "links": [
- 774
- ],
- "slot_index": 0,
- "label": "vae"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#322",
- "bgcolor": "#533"
- },
- {
- "id": 55,
- "type": "ConditioningCombine",
- "pos": [
- -1099.8005108491657,
- 4529.8544652066785
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 133,
- "mode": 0,
- "inputs": [
- {
- "name": "conditioning_1",
- "type": "CONDITIONING",
- "link": 678
- },
- {
- "name": "conditioning_2",
- "type": "CONDITIONING",
- "link": 781
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 797
- ],
- "shape": 3,
- "label": "base +",
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ConditioningCombine"
- },
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 56,
- "type": "ConditioningCombine",
- "pos": [
- -1099.8005108491657,
- 4639.8544652066785
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 138,
- "mode": 0,
- "inputs": [
- {
- "name": "conditioning_1",
- "type": "CONDITIONING",
- "link": 679
- },
- {
- "name": "conditioning_2",
- "type": "CONDITIONING",
- "link": 782
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 796
- ],
- "shape": 3,
- "label": "base -",
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ConditioningCombine"
- },
- "color": "#322",
- "bgcolor": "#533"
- },
- {
- "id": 57,
- "type": "ConditioningCombine",
- "pos": [
- -1099.8005108491657,
- 4749.8544652066785
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 146,
- "mode": 0,
- "inputs": [
- {
- "name": "conditioning_1",
- "type": "CONDITIONING",
- "link": 680
- },
- {
- "name": "conditioning_2",
- "type": "CONDITIONING",
- "link": 783
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 795
- ],
- "shape": 3,
- "label": "refiner +",
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ConditioningCombine"
- },
- "color": "#233",
- "bgcolor": "#355"
- },
- {
- "id": 58,
- "type": "ConditioningCombine",
- "pos": [
- -1099.8005108491657,
- 4859.8544652066785
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 151,
- "mode": 0,
- "inputs": [
- {
- "name": "conditioning_1",
- "type": "CONDITIONING",
- "link": 681
- },
- {
- "name": "conditioning_2",
- "type": "CONDITIONING",
- "link": 784
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 794
- ],
- "shape": 3,
- "label": "refiner -",
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ConditioningCombine"
- },
- "color": "#332922",
- "bgcolor": "#593930"
- },
- {
- "id": 75,
- "type": "ConditioningAverage ",
- "pos": [
- -1099.8005108491657,
- 5029.8544652066785
- ],
- "size": {
- "0": 300,
- "1": 74
- },
- "flags": {
- "pinned": true
- },
- "order": 134,
- "mode": 0,
- "inputs": [
- {
- "name": "conditioning_to",
- "type": "CONDITIONING",
- "link": 686,
- "slot_index": 0
- },
- {
- "name": "conditioning_from",
- "type": "CONDITIONING",
- "link": 682
- },
- {
- "name": "conditioning_to_strength",
- "type": "FLOAT",
- "link": 505,
- "widget": {
- "name": "conditioning_to_strength",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "min": 0,
- "max": 1,
- "step": 0.01
- }
- ]
- },
- "slot_index": 2
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 844
- ],
- "shape": 3,
- "label": "base +",
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ConditioningAverage "
- },
- "widgets_values": [
- 1
- ],
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 76,
- "type": "ConditioningAverage ",
- "pos": [
- -1099.8005108491657,
- 5139.8544652066785
- ],
- "size": {
- "0": 300,
- "1": 74
- },
- "flags": {
- "pinned": true
- },
- "order": 139,
- "mode": 0,
- "inputs": [
- {
- "name": "conditioning_to",
- "type": "CONDITIONING",
- "link": 687,
- "slot_index": 0
- },
- {
- "name": "conditioning_from",
- "type": "CONDITIONING",
- "link": 683
- },
- {
- "name": "conditioning_to_strength",
- "type": "FLOAT",
- "link": 507,
- "widget": {
- "name": "conditioning_to_strength",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "min": 0,
- "max": 1,
- "step": 0.01
- }
- ]
- },
- "slot_index": 2
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 647
- ],
- "shape": 3,
- "label": "base -",
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ConditioningAverage "
- },
- "widgets_values": [
- 1
- ],
- "color": "#322",
- "bgcolor": "#533"
- },
- {
- "id": 77,
- "type": "ConditioningAverage ",
- "pos": [
- -1099.8005108491657,
- 5249.8544652066785
- ],
- "size": {
- "0": 300,
- "1": 74
- },
- "flags": {
- "pinned": true
- },
- "order": 145,
- "mode": 0,
- "inputs": [
- {
- "name": "conditioning_to",
- "type": "CONDITIONING",
- "link": 688,
- "slot_index": 0
- },
- {
- "name": "conditioning_from",
- "type": "CONDITIONING",
- "link": 684
- },
- {
- "name": "conditioning_to_strength",
- "type": "FLOAT",
- "link": 506,
- "widget": {
- "name": "conditioning_to_strength",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "min": 0,
- "max": 1,
- "step": 0.01
- }
- ]
- },
- "slot_index": 2
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 648
- ],
- "shape": 3,
- "label": "refiner +",
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ConditioningAverage "
- },
- "widgets_values": [
- 1
- ],
- "color": "#233",
- "bgcolor": "#355"
- },
- {
- "id": 78,
- "type": "ConditioningAverage ",
- "pos": [
- -1099.8005108491657,
- 5359.8544652066785
- ],
- "size": {
- "0": 300,
- "1": 74
- },
- "flags": {
- "pinned": true
- },
- "order": 150,
- "mode": 0,
- "inputs": [
- {
- "name": "conditioning_to",
- "type": "CONDITIONING",
- "link": 689
- },
- {
- "name": "conditioning_from",
- "type": "CONDITIONING",
- "link": 685
- },
- {
- "name": "conditioning_to_strength",
- "type": "FLOAT",
- "link": 508,
- "widget": {
- "name": "conditioning_to_strength",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "min": 0,
- "max": 1,
- "step": 0.01
- }
- ]
- },
- "slot_index": 2
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 649
- ],
- "shape": 3,
- "label": "refiner -",
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ConditioningAverage "
- },
- "widgets_values": [
- 1
- ],
- "color": "#332922",
- "bgcolor": "#593930"
- },
- {
- "id": 313,
- "type": "ConditioningConcat",
- "pos": [
- -1099.8005108491657,
- 5529.8544652066785
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 136,
- "mode": 0,
- "inputs": [
- {
- "name": "conditioning_to",
- "type": "CONDITIONING",
- "link": 828
- },
- {
- "name": "conditioning_from",
- "type": "CONDITIONING",
- "link": 836,
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 849
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ConditioningConcat"
- },
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 318,
- "type": "ConditioningConcat",
- "pos": [
- -1099.8005108491657,
- 5639.8544652066785
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 141,
- "mode": 0,
- "inputs": [
- {
- "name": "conditioning_to",
- "type": "CONDITIONING",
- "link": 829
- },
- {
- "name": "conditioning_from",
- "type": "CONDITIONING",
- "link": 837,
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 850
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ConditioningConcat"
- },
- "color": "#322",
- "bgcolor": "#533"
- },
- {
- "id": 319,
- "type": "ConditioningConcat",
- "pos": [
- -1099.8005108491657,
- 5749.8544652066785
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 147,
- "mode": 0,
- "inputs": [
- {
- "name": "conditioning_to",
- "type": "CONDITIONING",
- "link": 834,
- "slot_index": 0
- },
- {
- "name": "conditioning_from",
- "type": "CONDITIONING",
- "link": 838,
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 851
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ConditioningConcat"
- },
- "color": "#233",
- "bgcolor": "#355"
- },
- {
- "id": 320,
- "type": "ConditioningConcat",
- "pos": [
- -1099.8005108491657,
- 5859.8544652066785
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 152,
- "mode": 0,
- "inputs": [
- {
- "name": "conditioning_to",
- "type": "CONDITIONING",
- "link": 835,
- "slot_index": 0
- },
- {
- "name": "conditioning_from",
- "type": "CONDITIONING",
- "link": 839,
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 852
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ConditioningConcat"
- },
- "color": "#332922",
- "bgcolor": "#593930"
- },
- {
- "id": 321,
- "type": "ConditioningConcat",
- "pos": [
- -1099.8005108491657,
- 6029.8544652066785
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 135,
- "mode": 0,
- "inputs": [
- {
- "name": "conditioning_to",
- "type": "CONDITIONING",
- "link": 840,
- "slot_index": 0
- },
- {
- "name": "conditioning_from",
- "type": "CONDITIONING",
- "link": 827
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 848
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ConditioningConcat"
- },
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 322,
- "type": "ConditioningConcat",
- "pos": [
- -1099.8005108491657,
- 6139.8544652066785
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 142,
- "mode": 0,
- "inputs": [
- {
- "name": "conditioning_to",
- "type": "CONDITIONING",
- "link": 841,
- "slot_index": 0
- },
- {
- "name": "conditioning_from",
- "type": "CONDITIONING",
- "link": 830
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 847
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ConditioningConcat"
- },
- "color": "#322",
- "bgcolor": "#533"
- },
- {
- "id": 323,
- "type": "ConditioningConcat",
- "pos": [
- -1099.8005108491657,
- 6249.8544652066785
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 148,
- "mode": 0,
- "inputs": [
- {
- "name": "conditioning_to",
- "type": "CONDITIONING",
- "link": 842,
- "slot_index": 0
- },
- {
- "name": "conditioning_from",
- "type": "CONDITIONING",
- "link": 832
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 846
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ConditioningConcat"
- },
- "color": "#233",
- "bgcolor": "#355"
- },
- {
- "id": 324,
- "type": "ConditioningConcat",
- "pos": [
- -1099.8005108491657,
- 6359.8544652066785
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 153,
- "mode": 0,
- "inputs": [
- {
- "name": "conditioning_to",
- "type": "CONDITIONING",
- "link": 843,
- "slot_index": 0
- },
- {
- "name": "conditioning_from",
- "type": "CONDITIONING",
- "link": 833,
- "slot_index": 1
- }
- ],
- "outputs": [
- {
- "name": "CONDITIONING",
- "type": "CONDITIONING",
- "links": [
- 845
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "ConditioningConcat"
- },
- "color": "#332922",
- "bgcolor": "#593930"
- },
- {
- "id": 214,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 5099.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 163,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 844,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1053,
- 1261
- ],
- "slot_index": 0,
- "label": "wb+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 325,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 5749.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 181,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 852
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1081,
- 1246
- ],
- "slot_index": 0,
- "label": "pfr-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 326,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 5699.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 176,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 851
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1071,
- 1240
- ],
- "slot_index": 0,
- "label": "pfr+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 327,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 5649.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 170,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 850
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1061,
- 1245
- ],
- "slot_index": 0,
- "label": "pfb-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 328,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 5599.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 165,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 849,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1051,
- 1238
- ],
- "slot_index": 0,
- "label": "pfb+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 329,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 6249.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 182,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 845
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1082,
- 1242
- ],
- "slot_index": 0,
- "label": "sfr-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 330,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 6199.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 177,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 846
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1072,
- 1244
- ],
- "slot_index": 0,
- "label": "sfr+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 331,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 6149.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 171,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 847
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1062,
- 1241
- ],
- "slot_index": 0,
- "label": "sfb-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 332,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 6099.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 164,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 848,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1052,
- 1243
- ],
- "slot_index": 0,
- "label": "sfb+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 307,
- "type": "Reroute",
- "pos": [
- -749.8005108491612,
- 4599.8544652066785
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 162,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 797
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1054,
- 1265
- ],
- "label": "cb+",
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 340,
- "type": "SeargeGenerated1",
- "pos": [
- 3250,
- 4800
- ],
- "size": {
- "0": 300,
- "1": 86
- },
- "flags": {
- "pinned": true
- },
- "order": 114,
- "mode": 0,
- "inputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "link": 965
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": null,
- "shape": 3
- },
- {
- "name": "operation_selector",
- "type": "INT",
- "links": [
- 912
- ],
- "shape": 3,
- "slot_index": 1
- },
- {
- "name": "prompt_style_selector",
- "type": "INT",
- "links": [],
- "shape": 3,
- "slot_index": 2
- },
- {
- "name": "prompt_style_group",
- "type": "INT",
- "links": null,
- "shape": 3
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeGenerated1"
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 335,
- "type": "SeargeLatentMuxer3",
- "pos": [
- 4000,
- 4980
- ],
- "size": {
- "0": 302.3999938964844,
- "1": 94
- },
- "flags": {
- "pinned": true
- },
- "order": 257,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "LATENT",
- "link": 910,
- "slot_index": 0
- },
- {
- "name": "input1",
- "type": "LATENT",
- "link": 913
- },
- {
- "name": "input2",
- "type": "LATENT",
- "link": 914
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 912,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 2
- }
- ]
- }
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "LATENT",
- "links": [
- 966
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeLatentMuxer3"
- },
- "widgets_values": [
- 0
- ],
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 341,
- "type": "Reroute",
- "pos": [
- 700,
- 1060
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 297,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 916
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "IMAGE",
- "links": null,
- "label": "upscale"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 342,
- "type": "Reroute",
- "pos": [
- 920,
- 1060
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 10,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": null
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "*",
- "links": [
- 918
- ],
- "slot_index": 0,
- "label": "upscale"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 343,
- "type": "Reroute",
- "pos": [
- 9300,
- 1060
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 15,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 918
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "*",
- "links": [
- 919
- ],
- "slot_index": 0,
- "label": "img"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 150,
- "type": "SeargeInput7",
- "pos": [
- 860,
- 490
- ],
- "size": {
- "0": 320,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 11,
- "mode": 0,
- "inputs": [
- {
- "name": "inputs",
- "type": "PARAMETER_INPUTS",
- "link": null
- }
- ],
- "outputs": [
- {
- "name": "inputs",
- "type": "PARAMETER_INPUTS",
- "links": [
- 735
- ],
- "shape": 3
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeInput7"
- },
- "widgets_values": [
- 0,
- "text to image",
- "subject focus"
- ],
- "color": "#2a363b",
- "bgcolor": "#3f5159"
- },
- {
- "id": 353,
- "type": "SeargeLoraLoader",
- "pos": [
- -3000,
- 2330
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 61,
- "mode": 0,
- "inputs": [
- {
- "name": "model",
- "type": "MODEL",
- "link": 933
- },
- {
- "name": "clip",
- "type": "CLIP",
- "link": 934
- },
- {
- "name": "lora_name",
- "type": "LORA_NAME",
- "link": 924
- },
- {
- "name": "strength_model",
- "type": "FLOAT",
- "link": 925,
- "widget": {
- "name": "strength_model",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "min": -10,
- "max": 10,
- "step": 0.01
- }
- ]
- }
- },
- {
- "name": "strength_clip",
- "type": "FLOAT",
- "link": 926,
- "widget": {
- "name": "strength_clip",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "min": -10,
- "max": 10,
- "step": 0.01
- }
- ]
- }
- }
- ],
- "outputs": [
- {
- "name": "MODEL",
- "type": "MODEL",
- "links": [
- 929
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "CLIP",
- "type": "CLIP",
- "links": [
- 930
- ],
- "shape": 3,
- "slot_index": 1
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeLoraLoader"
- },
- "widgets_values": [
- 1,
- 1
- ],
- "color": "#332922",
- "bgcolor": "#593930"
- },
- {
- "id": 349,
- "type": "SeargeOutput4",
- "pos": [
- -4400,
- 2130
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 14,
- "mode": 0,
- "inputs": [
- {
- "name": "model_names",
- "type": "MODEL_NAMES",
- "link": 931
- }
- ],
- "outputs": [
- {
- "name": "model_names",
- "type": "MODEL_NAMES",
- "links": null,
- "shape": 3
- },
- {
- "name": "base_model",
- "type": "CHECKPOINT_NAME",
- "links": [
- 932
- ],
- "shape": 3,
- "slot_index": 1
- },
- {
- "name": "refiner_model",
- "type": "CHECKPOINT_NAME",
- "links": [
- 935
- ],
- "shape": 3,
- "slot_index": 2
- },
- {
- "name": "vae_model",
- "type": "VAE_NAME",
- "links": [
- 938
- ],
- "shape": 3,
- "slot_index": 3
- },
- {
- "name": "main_upscale_model",
- "type": "UPSCALER_NAME",
- "links": [
- 940
- ],
- "shape": 3,
- "slot_index": 4
- },
- {
- "name": "support_upscale_model",
- "type": "UPSCALER_NAME",
- "links": [
- 941
- ],
- "shape": 3,
- "slot_index": 5
- },
- {
- "name": "lora_model",
- "type": "LORA_NAME",
- "links": [
- 924
- ],
- "shape": 3,
- "slot_index": 6
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeOutput4"
- },
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 350,
- "type": "SeargeCheckpointLoader",
- "pos": [
- -3700,
- 2130
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 17,
- "mode": 0,
- "inputs": [
- {
- "name": "ckpt_name",
- "type": "CHECKPOINT_NAME",
- "link": 932
- }
- ],
- "outputs": [
- {
- "name": "MODEL",
- "type": "MODEL",
- "links": [
- 933
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "CLIP",
- "type": "CLIP",
- "links": [
- 934
- ],
- "shape": 3,
- "slot_index": 1
- },
- {
- "name": "VAE",
- "type": "VAE",
- "links": null,
- "shape": 3
- }
- ],
- "title": "BASE Model",
- "properties": {
- "Node name for S&R": "SeargeCheckpointLoader"
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 355,
- "type": "SeargeCheckpointLoader",
- "pos": [
- -3700,
- 2630
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 18,
- "mode": 0,
- "inputs": [
- {
- "name": "ckpt_name",
- "type": "CHECKPOINT_NAME",
- "link": 935
- }
- ],
- "outputs": [
- {
- "name": "MODEL",
- "type": "MODEL",
- "links": [
- 936
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "CLIP",
- "type": "CLIP",
- "links": [
- 937
- ],
- "shape": 3,
- "slot_index": 1
- },
- {
- "name": "VAE",
- "type": "VAE",
- "links": null,
- "shape": 3
- }
- ],
- "title": "REFINER Model",
- "properties": {
- "Node name for S&R": "SeargeCheckpointLoader"
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 351,
- "type": "SeargeVAELoader",
- "pos": [
- -3700,
- 2930
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 19,
- "mode": 0,
- "inputs": [
- {
- "name": "vae_name",
- "type": "VAE_NAME",
- "link": 938
- }
- ],
- "outputs": [
- {
- "name": "VAE",
- "type": "VAE",
- "links": [
- 939
- ],
- "shape": 3
- }
- ],
- "title": "VAE Model",
- "properties": {
- "Node name for S&R": "SeargeVAELoader"
- },
- "color": "#322",
- "bgcolor": "#533"
- },
- {
- "id": 352,
- "type": "SeargeUpscaleModelLoader",
- "pos": [
- -3700,
- 3230
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 20,
- "mode": 0,
- "inputs": [
- {
- "name": "upscaler_name",
- "type": "UPSCALER_NAME",
- "link": 940
- }
- ],
- "outputs": [
- {
- "name": "UPSCALE_MODEL",
- "type": "UPSCALE_MODEL",
- "links": [
- 942
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Main Upscale Model",
- "properties": {
- "Node name for S&R": "SeargeUpscaleModelLoader"
- },
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 356,
- "type": "SeargeUpscaleModelLoader",
- "pos": [
- -3700,
- 3430
- ],
- "size": {
- "0": 300,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 21,
- "mode": 0,
- "inputs": [
- {
- "name": "upscaler_name",
- "type": "UPSCALER_NAME",
- "link": 941
- }
- ],
- "outputs": [
- {
- "name": "UPSCALE_MODEL",
- "type": "UPSCALE_MODEL",
- "links": [
- 943
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Supporting Upscale Model",
- "properties": {
- "Node name for S&R": "SeargeUpscaleModelLoader"
- },
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 270,
- "type": "SeargeInput1",
- "pos": [
- 1800,
- 130
- ],
- "size": {
- "0": 300,
- "1": 270
- },
- "flags": {
- "pinned": true
- },
- "order": 45,
- "mode": 0,
- "inputs": [
- {
- "name": "inputs",
- "type": "PARAMETER_INPUTS",
- "link": 722
- },
- {
- "name": "image",
- "type": "IMAGE",
- "link": 729
- },
- {
- "name": "mask",
- "type": "MASK",
- "link": 730,
- "slot_index": 2
- },
- {
- "name": "main_prompt",
- "type": "STRING",
- "link": 723,
- "widget": {
- "name": "main_prompt",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": ""
- }
- ]
- }
- },
- {
- "name": "secondary_prompt",
- "type": "STRING",
- "link": 724,
- "widget": {
- "name": "secondary_prompt",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": ""
- }
- ]
- }
- },
- {
- "name": "style_prompt",
- "type": "STRING",
- "link": 725,
- "widget": {
- "name": "style_prompt",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": ""
- }
- ]
- }
- },
- {
- "name": "negative_prompt",
- "type": "STRING",
- "link": 726,
- "widget": {
- "name": "negative_prompt",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": ""
- }
- ]
- }
- },
- {
- "name": "negative_style",
- "type": "STRING",
- "link": 727,
- "widget": {
- "name": "negative_style",
- "config": [
- "STRING",
- {
- "multiline": true,
- "default": ""
- }
- ]
- }
- }
- ],
- "outputs": [
- {
- "name": "inputs",
- "type": "PARAMETER_INPUTS",
- "links": [
- 945
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeInput1"
- },
- "widgets_values": [
- "",
- "",
- "",
- "",
- ""
- ],
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 131,
- "type": "SeargeParameterProcessor",
- "pos": [
- 3000,
- 130
- ],
- "size": {
- "0": 200,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 55,
- "mode": 0,
- "inputs": [
- {
- "name": "inputs",
- "type": "PARAMETER_INPUTS",
- "link": 944
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": [
- 534
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeParameterProcessor"
- },
- "color": "#323",
- "bgcolor": "#535"
- },
- {
- "id": 357,
- "type": "SeargeStylePreprocessor",
- "pos": [
- 2200,
- 130
- ],
- "size": {
- "0": 700,
- "1": 970
- },
- "flags": {
- "pinned": true
- },
- "order": 52,
- "mode": 0,
- "inputs": [
- {
- "name": "inputs",
- "type": "PARAMETER_INPUTS",
- "link": 945
- }
- ],
- "outputs": [
- {
- "name": "inputs",
- "type": "PARAMETER_INPUTS",
- "links": [
- 944
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeStylePreprocessor"
- },
- "widgets_values": [
- "test",
- "[unfinished work in progress]"
- ],
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 170,
- "type": "Reroute",
- "pos": [
- 3200,
- 1000
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 57,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 534,
- "pos": [
- 37.5,
- 0
- ],
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "PARAMETERS",
- "links": [
- 533
- ],
- "label": "data"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 359,
- "type": "SeargeOutput2",
- "pos": [
- 3200,
- 4530
- ],
- "size": {
- "0": 400,
- "1": 220
- },
- "flags": {
- "pinned": true
- },
- "order": 102,
- "mode": 0,
- "inputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "link": 1024
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": [
- 965
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "seed",
- "type": "INT",
- "links": [
- 948
- ],
- "shape": 3,
- "slot_index": 1
- },
- {
- "name": "image_width",
- "type": "INT",
- "links": [
- 959
- ],
- "shape": 3,
- "slot_index": 2
- },
- {
- "name": "image_height",
- "type": "INT",
- "links": [
- 960
- ],
- "shape": 3,
- "slot_index": 3
- },
- {
- "name": "steps",
- "type": "INT",
- "links": [
- 950
- ],
- "shape": 3,
- "slot_index": 4
- },
- {
- "name": "cfg",
- "type": "FLOAT",
- "links": [
- 951
- ],
- "shape": 3,
- "slot_index": 5
- },
- {
- "name": "sampler_name",
- "type": "SAMPLER_NAME",
- "links": [
- 957
- ],
- "shape": 3,
- "slot_index": 6
- },
- {
- "name": "scheduler",
- "type": "SCHEDULER_NAME",
- "links": [
- 958
- ],
- "shape": 3,
- "slot_index": 7
- },
- {
- "name": "save_image",
- "type": "ENABLE_STATE",
- "links": [
- 961
- ],
- "shape": 3,
- "slot_index": 8
- },
- {
- "name": "save_directory",
- "type": "SAVE_FOLDER",
- "links": [
- 962
- ],
- "shape": 3,
- "slot_index": 9
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeOutput2"
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 358,
- "type": "SeargeSDXLSampler2",
- "pos": [
- 4600,
- 4730
- ],
- "size": {
- "0": 300,
- "1": 370
- },
- "flags": {
- "pinned": true
- },
- "order": 278,
- "mode": 0,
- "inputs": [
- {
- "name": "base_model",
- "type": "MODEL",
- "link": 972
- },
- {
- "name": "base_positive",
- "type": "CONDITIONING",
- "link": 970,
- "slot_index": 1
- },
- {
- "name": "base_negative",
- "type": "CONDITIONING",
- "link": 969,
- "slot_index": 2
- },
- {
- "name": "refiner_model",
- "type": "MODEL",
- "link": 971
- },
- {
- "name": "refiner_positive",
- "type": "CONDITIONING",
- "link": 968,
- "slot_index": 4
- },
- {
- "name": "refiner_negative",
- "type": "CONDITIONING",
- "link": 967,
- "slot_index": 5
- },
- {
- "name": "latent_image",
- "type": "LATENT",
- "link": 966,
- "slot_index": 6
- },
- {
- "name": "sampler_name",
- "type": "SAMPLER_NAME",
- "link": 957
- },
- {
- "name": "scheduler",
- "type": "SCHEDULER_NAME",
- "link": 958
- },
- {
- "name": "noise_seed",
- "type": "INT",
- "link": 948,
- "widget": {
- "name": "noise_seed",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 18446744073709552000
- }
- ]
- }
- },
- {
- "name": "steps",
- "type": "INT",
- "link": 950,
- "widget": {
- "name": "steps",
- "config": [
- "INT",
- {
- "default": 20,
- "min": 1,
- "max": 200
- }
- ]
- }
- },
- {
- "name": "cfg",
- "type": "FLOAT",
- "link": 951,
- "widget": {
- "name": "cfg",
- "config": [
- "FLOAT",
- {
- "default": 7,
- "min": 0,
- "max": 30,
- "step": 0.5
- }
- ]
- }
- },
- {
- "name": "base_ratio",
- "type": "FLOAT",
- "link": 1018,
- "widget": {
- "name": "base_ratio",
- "config": [
- "FLOAT",
- {
- "default": 0.8,
- "min": 0,
- "max": 1,
- "step": 0.01
- }
- ]
- }
- },
- {
- "name": "denoise",
- "type": "FLOAT",
- "link": 1017,
- "widget": {
- "name": "denoise",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "min": 0,
- "max": 1,
- "step": 0.01
- }
- ]
- }
- },
- {
- "name": "refiner_prep_steps",
- "type": "INT",
- "link": 1021,
- "widget": {
- "name": "refiner_prep_steps",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 10
- }
- ]
- }
- },
- {
- "name": "noise_offset",
- "type": "INT",
- "link": 1020,
- "widget": {
- "name": "noise_offset",
- "config": [
- "INT",
- {
- "default": 1,
- "min": 0,
- "max": 1
- }
- ]
- }
- },
- {
- "name": "refiner_strength",
- "type": "FLOAT",
- "link": 1019,
- "widget": {
- "name": "refiner_strength",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "min": 0.01,
- "max": 1,
- "step": 0.05
- }
- ]
- }
- }
- ],
- "outputs": [
- {
- "name": "LATENT",
- "type": "LATENT",
- "links": [
- 973
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeSDXLSampler2"
- },
- "widgets_values": [
- 213103709520708,
- "randomize",
- 20,
- 7,
- 0.8,
- 1,
- 0,
- 1,
- 1
- ],
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 360,
- "type": "SeargeImageSave",
- "pos": [
- 5600,
- 4530
- ],
- "size": {
- "0": 350,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 286,
- "mode": 0,
- "inputs": [
- {
- "name": "images",
- "type": "IMAGE",
- "link": 963
- },
- {
- "name": "state",
- "type": "ENABLE_STATE",
- "link": 961
- },
- {
- "name": "save_to",
- "type": "SAVE_FOLDER",
- "link": 962
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeImageSave"
- },
- "widgets_values": [
- "SeargeSDXL-out-%date%/generated/gen"
- ],
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 364,
- "type": "SeargeImageSave",
- "pos": [
- 11800,
- 4830
- ],
- "size": {
- "0": 400,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 251,
- "mode": 0,
- "inputs": [
- {
- "name": "images",
- "type": "IMAGE",
- "link": 974
- },
- {
- "name": "state",
- "type": "ENABLE_STATE",
- "link": 975
- },
- {
- "name": "save_to",
- "type": "SAVE_FOLDER",
- "link": 1038
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeImageSave"
- },
- "widgets_values": [
- "SeargeSDXL-out-%date%/upscaled/up"
- ],
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 365,
- "type": "SeargeOutput2",
- "pos": [
- 9900,
- 4230
- ],
- "size": {
- "0": 400,
- "1": 220
- },
- "flags": {
- "pinned": true
- },
- "order": 156,
- "mode": 0,
- "inputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "link": 978
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": [
- 979
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "seed",
- "type": "INT",
- "links": null,
- "shape": 3
- },
- {
- "name": "image_width",
- "type": "INT",
- "links": [
- 980
- ],
- "shape": 3,
- "slot_index": 2
- },
- {
- "name": "image_height",
- "type": "INT",
- "links": [
- 981
- ],
- "shape": 3,
- "slot_index": 3
- },
- {
- "name": "steps",
- "type": "INT",
- "links": null,
- "shape": 3
- },
- {
- "name": "cfg",
- "type": "FLOAT",
- "links": null,
- "shape": 3
- },
- {
- "name": "sampler_name",
- "type": "SAMPLER_NAME",
- "links": null,
- "shape": 3
- },
- {
- "name": "scheduler",
- "type": "SCHEDULER_NAME",
- "links": null,
- "shape": 3
- },
- {
- "name": "save_image",
- "type": "ENABLE_STATE",
- "links": null,
- "shape": 3
- },
- {
- "name": "save_directory",
- "type": "SAVE_FOLDER",
- "links": [
- 1038
- ],
- "shape": 3,
- "slot_index": 9
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeOutput2"
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 366,
- "type": "SeargeOutput3",
- "pos": [
- 9900,
- 4530
- ],
- "size": {
- "0": 400,
- "1": 220
- },
- "flags": {
- "pinned": true
- },
- "order": 184,
- "mode": 0,
- "inputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "link": 979
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": null,
- "shape": 3
- },
- {
- "name": "denoise",
- "type": "FLOAT",
- "links": null,
- "shape": 3
- },
- {
- "name": "base_ratio",
- "type": "FLOAT",
- "links": null,
- "shape": 3
- },
- {
- "name": "refiner_strength",
- "type": "FLOAT",
- "links": null,
- "shape": 3
- },
- {
- "name": "noise_offset",
- "type": "INT",
- "links": null,
- "shape": 3
- },
- {
- "name": "precondition_steps",
- "type": "INT",
- "links": null,
- "shape": 3
- },
- {
- "name": "batch_size",
- "type": "INT",
- "links": null,
- "shape": 3
- },
- {
- "name": "upscale_resolution_factor",
- "type": "FLOAT",
- "links": [
- 976,
- 977
- ],
- "shape": 3,
- "slot_index": 7
- },
- {
- "name": "save_upscaled_image",
- "type": "ENABLE_STATE",
- "links": [
- 975
- ],
- "shape": 3,
- "slot_index": 8
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeOutput3"
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 361,
- "type": "SeargeImageSave",
- "pos": [
- 8600,
- 4230
- ],
- "size": {
- "0": 400,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 289,
- "mode": 0,
- "inputs": [
- {
- "name": "images",
- "type": "IMAGE",
- "link": 983,
- "slot_index": 0
- },
- {
- "name": "state",
- "type": "ENABLE_STATE",
- "link": 986
- },
- {
- "name": "save_to",
- "type": "SAVE_FOLDER",
- "link": 1037
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeImageSave"
- },
- "widgets_values": [
- "SeargeSDXL-out-%date%/hires/hrf"
- ],
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 363,
- "type": "SeargeSDXLImage2ImageSampler2",
- "pos": [
- 8200,
- 4730
- ],
- "size": {
- "0": 300,
- "1": 470
- },
- "flags": {
- "pinned": true
- },
- "order": 288,
- "mode": 0,
- "inputs": [
- {
- "name": "base_model",
- "type": "MODEL",
- "link": 1006
- },
- {
- "name": "base_positive",
- "type": "CONDITIONING",
- "link": 1008
- },
- {
- "name": "base_negative",
- "type": "CONDITIONING",
- "link": 1009
- },
- {
- "name": "refiner_model",
- "type": "MODEL",
- "link": 1007
- },
- {
- "name": "refiner_positive",
- "type": "CONDITIONING",
- "link": 1010
- },
- {
- "name": "refiner_negative",
- "type": "CONDITIONING",
- "link": 1011
- },
- {
- "name": "image",
- "type": "IMAGE",
- "link": 1004
- },
- {
- "name": "vae",
- "type": "VAE",
- "link": 1005
- },
- {
- "name": "sampler_name",
- "type": "SAMPLER_NAME",
- "link": 999
- },
- {
- "name": "scheduler",
- "type": "SCHEDULER_NAME",
- "link": 1000
- },
- {
- "name": "upscale_model",
- "type": "UPSCALE_MODEL",
- "link": 1003
- },
- {
- "name": "noise_seed",
- "type": "INT",
- "link": 988,
- "widget": {
- "name": "noise_seed",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 18446744073709552000
- }
- ]
- }
- },
- {
- "name": "steps",
- "type": "INT",
- "link": 993,
- "widget": {
- "name": "steps",
- "config": [
- "INT",
- {
- "default": 20,
- "min": 0,
- "max": 200
- }
- ]
- }
- },
- {
- "name": "cfg",
- "type": "FLOAT",
- "link": 996,
- "widget": {
- "name": "cfg",
- "config": [
- "FLOAT",
- {
- "default": 7,
- "min": 0,
- "max": 30,
- "step": 0.5
- }
- ]
- }
- },
- {
- "name": "base_ratio",
- "type": "FLOAT",
- "link": 995,
- "widget": {
- "name": "base_ratio",
- "config": [
- "FLOAT",
- {
- "default": 0.8,
- "min": 0,
- "max": 1,
- "step": 0.01
- }
- ]
- }
- },
- {
- "name": "denoise",
- "type": "FLOAT",
- "link": 992,
- "widget": {
- "name": "denoise",
- "config": [
- "FLOAT",
- {
- "default": 0.25,
- "min": 0,
- "max": 1,
- "step": 0.01
- }
- ]
- }
- },
- {
- "name": "scaled_width",
- "type": "INT",
- "link": 1002,
- "widget": {
- "name": "scaled_width",
- "config": [
- "INT",
- {
- "default": 1536,
- "min": 0,
- "max": 8192,
- "step": 8
- }
- ]
- }
- },
- {
- "name": "scaled_height",
- "type": "INT",
- "link": 1001,
- "widget": {
- "name": "scaled_height",
- "config": [
- "INT",
- {
- "default": 1536,
- "min": 0,
- "max": 8192,
- "step": 8
- }
- ]
- }
- },
- {
- "name": "noise_offset",
- "type": "INT",
- "link": 989,
- "widget": {
- "name": "noise_offset",
- "config": [
- "INT",
- {
- "default": 1,
- "min": 0,
- "max": 1
- }
- ]
- }
- },
- {
- "name": "refiner_strength",
- "type": "FLOAT",
- "link": 994,
- "widget": {
- "name": "refiner_strength",
- "config": [
- "FLOAT",
- {
- "default": 1,
- "min": 0.1,
- "max": 1,
- "step": 0.05
- }
- ]
- }
- },
- {
- "name": "softness",
- "type": "FLOAT",
- "link": 987,
- "widget": {
- "name": "softness",
- "config": [
- "FLOAT",
- {
- "default": 0,
- "min": 0,
- "max": 1,
- "step": 0.05
- }
- ]
- }
- }
- ],
- "outputs": [
- {
- "name": "IMAGE",
- "type": "IMAGE",
- "links": [
- 983,
- 984,
- 985
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeSDXLImage2ImageSampler2"
- },
- "widgets_values": [
- 862579782100573,
- "randomize",
- 20,
- 7,
- 0.8,
- 0.25,
- 1536,
- 1536,
- 1,
- 1,
- 0
- ],
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 368,
- "type": "SeargeOutput6",
- "pos": [
- 6800,
- 4830
- ],
- "size": {
- "0": 400,
- "1": 220
- },
- "flags": {
- "pinned": true
- },
- "order": 157,
- "mode": 0,
- "inputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "link": 1014
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": null,
- "shape": 3
- },
- {
- "name": "hrf_steps",
- "type": "INT",
- "links": [
- 993
- ],
- "shape": 3,
- "slot_index": 1
- },
- {
- "name": "hrf_denoise",
- "type": "FLOAT",
- "links": [
- 992
- ],
- "shape": 3,
- "slot_index": 2
- },
- {
- "name": "hrf_upscale_factor",
- "type": "FLOAT",
- "links": [
- 990,
- 991
- ],
- "shape": 3,
- "slot_index": 3
- },
- {
- "name": "hrf_noise_offset",
- "type": "INT",
- "links": [
- 989
- ],
- "shape": 3,
- "slot_index": 4
- },
- {
- "name": "hrf_seed",
- "type": "INT",
- "links": [
- 988
- ],
- "shape": 3,
- "slot_index": 5
- },
- {
- "name": "hires_fix",
- "type": "ENABLE_STATE",
- "links": [
- 986
- ],
- "shape": 3,
- "slot_index": 6
- },
- {
- "name": "hrf_smoothness",
- "type": "FLOAT",
- "links": [
- 987
- ],
- "shape": 3,
- "slot_index": 7
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeOutput6"
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 367,
- "type": "SeargeOutput3",
- "pos": [
- 6800,
- 4530
- ],
- "size": {
- "0": 400,
- "1": 220
- },
- "flags": {
- "pinned": true
- },
- "order": 127,
- "mode": 0,
- "inputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "link": 1013
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": [
- 1014
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "denoise",
- "type": "FLOAT",
- "links": null,
- "shape": 3
- },
- {
- "name": "base_ratio",
- "type": "FLOAT",
- "links": [
- 995
- ],
- "shape": 3,
- "slot_index": 2
- },
- {
- "name": "refiner_strength",
- "type": "FLOAT",
- "links": [
- 994
- ],
- "shape": 3,
- "slot_index": 3
- },
- {
- "name": "noise_offset",
- "type": "INT",
- "links": null,
- "shape": 3
- },
- {
- "name": "precondition_steps",
- "type": "INT",
- "links": null,
- "shape": 3
- },
- {
- "name": "batch_size",
- "type": "INT",
- "links": null,
- "shape": 3
- },
- {
- "name": "upscale_resolution_factor",
- "type": "FLOAT",
- "links": null,
- "shape": 3
- },
- {
- "name": "save_upscaled_image",
- "type": "ENABLE_STATE",
- "links": null,
- "shape": 3
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeOutput3"
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 362,
- "type": "SeargeOutput2",
- "pos": [
- 6800,
- 4230
- ],
- "size": {
- "0": 400,
- "1": 220
- },
- "flags": {
- "pinned": true
- },
- "order": 113,
- "mode": 0,
- "inputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "link": 1012
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": [
- 1013
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "seed",
- "type": "INT",
- "links": null,
- "shape": 3
- },
- {
- "name": "image_width",
- "type": "INT",
- "links": [
- 997
- ],
- "shape": 3,
- "slot_index": 2
- },
- {
- "name": "image_height",
- "type": "INT",
- "links": [
- 998
- ],
- "shape": 3,
- "slot_index": 3
- },
- {
- "name": "steps",
- "type": "INT",
- "links": null,
- "shape": 3
- },
- {
- "name": "cfg",
- "type": "FLOAT",
- "links": [
- 996
- ],
- "shape": 3,
- "slot_index": 5
- },
- {
- "name": "sampler_name",
- "type": "SAMPLER_NAME",
- "links": [
- 999
- ],
- "shape": 3,
- "slot_index": 6
- },
- {
- "name": "scheduler",
- "type": "SCHEDULER_NAME",
- "links": [
- 1000
- ],
- "shape": 3,
- "slot_index": 7
- },
- {
- "name": "save_image",
- "type": "ENABLE_STATE",
- "links": null,
- "shape": 3
- },
- {
- "name": "save_directory",
- "type": "SAVE_FOLDER",
- "links": [
- 1037
- ],
- "shape": 3,
- "slot_index": 9
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeOutput2"
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 369,
- "type": "SeargeOutput3",
- "pos": [
- 3200,
- 4230
- ],
- "size": {
- "0": 400,
- "1": 220
- },
- "flags": {
- "pinned": true
- },
- "order": 95,
- "mode": 0,
- "inputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "link": 1023
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": [
- 1024
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "denoise",
- "type": "FLOAT",
- "links": [
- 1017
- ],
- "shape": 3,
- "slot_index": 1
- },
- {
- "name": "base_ratio",
- "type": "FLOAT",
- "links": [
- 1018
- ],
- "shape": 3,
- "slot_index": 2
- },
- {
- "name": "refiner_strength",
- "type": "FLOAT",
- "links": [
- 1019
- ],
- "shape": 3,
- "slot_index": 3
- },
- {
- "name": "noise_offset",
- "type": "INT",
- "links": [
- 1020
- ],
- "shape": 3,
- "slot_index": 4
- },
- {
- "name": "precondition_steps",
- "type": "INT",
- "links": [
- 1021
- ],
- "shape": 3,
- "slot_index": 5
- },
- {
- "name": "batch_size",
- "type": "INT",
- "links": [
- 1022
- ],
- "shape": 3,
- "slot_index": 6
- },
- {
- "name": "upscale_resolution_factor",
- "type": "FLOAT",
- "links": null,
- "shape": 3
- },
- {
- "name": "save_upscaled_image",
- "type": "ENABLE_STATE",
- "links": null,
- "shape": 3
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeOutput3"
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 370,
- "type": "SeargeOutput2",
- "pos": [
- -4399.70409651184,
- 4230.6233893932895
- ],
- "size": {
- "0": 400,
- "1": 220
- },
- "flags": {
- "pinned": true
- },
- "order": 66,
- "mode": 0,
- "inputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "link": 1025
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": [
- 1036
- ],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "seed",
- "type": "INT",
- "links": null,
- "shape": 3
- },
- {
- "name": "image_width",
- "type": "INT",
- "links": [
- 1026,
- 1028,
- 1031,
- 1034
- ],
- "shape": 3,
- "slot_index": 2
- },
- {
- "name": "image_height",
- "type": "INT",
- "links": [
- 1027,
- 1029,
- 1033,
- 1035
- ],
- "shape": 3,
- "slot_index": 3
- },
- {
- "name": "steps",
- "type": "INT",
- "links": null,
- "shape": 3
- },
- {
- "name": "cfg",
- "type": "FLOAT",
- "links": null,
- "shape": 3
- },
- {
- "name": "sampler_name",
- "type": "SAMPLER_NAME",
- "links": null,
- "shape": 3
- },
- {
- "name": "scheduler",
- "type": "SCHEDULER_NAME",
- "links": null,
- "shape": 3
- },
- {
- "name": "save_image",
- "type": "ENABLE_STATE",
- "links": null,
- "shape": 3
- },
- {
- "name": "save_directory",
- "type": "SAVE_FOLDER",
- "links": null,
- "shape": 3
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeOutput2"
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 202,
- "type": "Reroute",
- "pos": [
- -4500,
- 3600
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 60,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 621
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "PARAMETERS",
- "links": [
- 622
- ],
- "slot_index": 0,
- "label": "data"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 182,
- "type": "Reroute",
- "pos": [
- -2100,
- 3600
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 68,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 562,
- "slot_index": 0,
- "pos": [
- 37.5,
- 0
- ]
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CLIP",
- "links": [
- 716
- ],
- "slot_index": 0,
- "label": "b m"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 184,
- "type": "Reroute",
- "pos": [
- -2000,
- 3600
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 32,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 564,
- "slot_index": 0,
- "pos": [
- 37.5,
- 0
- ]
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CLIP",
- "links": [
- 719
- ],
- "slot_index": 0,
- "label": "r m"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": true
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 200,
- "type": "Reroute",
- "pos": [
- 400,
- 4100
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 75,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 617
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "PARAMETERS",
- "links": [
- 616,
- 1039
- ],
- "slot_index": 0,
- "label": "data"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 337,
- "type": "SeargeConditioningMuxer5",
- "pos": [
- -300,
- 4530
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 233,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "CONDITIONING",
- "link": 1055
- },
- {
- "name": "input1",
- "type": "CONDITIONING",
- "link": 1056,
- "slot_index": 1
- },
- {
- "name": "input2",
- "type": "CONDITIONING",
- "link": 1057,
- "slot_index": 2
- },
- {
- "name": "input3",
- "type": "CONDITIONING",
- "link": 1058,
- "slot_index": 3
- },
- {
- "name": "input4",
- "type": "CONDITIONING",
- "link": 1059,
- "slot_index": 4
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 1111,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 4
- }
- ]
- },
- "slot_index": 5
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "CONDITIONING",
- "links": [
- 1043
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Positive Base Muxer",
- "properties": {
- "Node name for S&R": "SeargeConditioningMuxer5"
- },
- "widgets_values": [
- 0
- ],
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 336,
- "type": "SeargeConditioningMuxer5",
- "pos": [
- -300,
- 4780
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 234,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "CONDITIONING",
- "link": 1069
- },
- {
- "name": "input1",
- "type": "CONDITIONING",
- "link": 1068,
- "slot_index": 1
- },
- {
- "name": "input2",
- "type": "CONDITIONING",
- "link": 1067,
- "slot_index": 2
- },
- {
- "name": "input3",
- "type": "CONDITIONING",
- "link": 1066,
- "slot_index": 3
- },
- {
- "name": "input4",
- "type": "CONDITIONING",
- "link": 1065,
- "slot_index": 4
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 1113,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 4
- }
- ]
- }
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "CONDITIONING",
- "links": [
- 1049
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Negative Base Muxer",
- "properties": {
- "Node name for S&R": "SeargeConditioningMuxer5"
- },
- "widgets_values": [
- 0
- ],
- "color": "#322",
- "bgcolor": "#533"
- },
- {
- "id": 338,
- "type": "SeargeConditioningMuxer5",
- "pos": [
- -300,
- 5030
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 236,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "CONDITIONING",
- "link": 1079,
- "slot_index": 0
- },
- {
- "name": "input1",
- "type": "CONDITIONING",
- "link": 1078,
- "slot_index": 1
- },
- {
- "name": "input2",
- "type": "CONDITIONING",
- "link": 1077,
- "slot_index": 2
- },
- {
- "name": "input3",
- "type": "CONDITIONING",
- "link": 1076,
- "slot_index": 3
- },
- {
- "name": "input4",
- "type": "CONDITIONING",
- "link": 1075,
- "slot_index": 4
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 1115,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 4
- }
- ]
- },
- "slot_index": 5
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "CONDITIONING",
- "links": [
- 1041
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Positive Refiner Muxer",
- "properties": {
- "Node name for S&R": "SeargeConditioningMuxer5"
- },
- "widgets_values": [
- 0
- ],
- "color": "#233",
- "bgcolor": "#355"
- },
- {
- "id": 339,
- "type": "SeargeConditioningMuxer5",
- "pos": [
- -300,
- 5280
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 238,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "CONDITIONING",
- "link": 1089,
- "slot_index": 0
- },
- {
- "name": "input1",
- "type": "CONDITIONING",
- "link": 1088,
- "slot_index": 1
- },
- {
- "name": "input2",
- "type": "CONDITIONING",
- "link": 1087,
- "slot_index": 2
- },
- {
- "name": "input3",
- "type": "CONDITIONING",
- "link": 1086,
- "slot_index": 3
- },
- {
- "name": "input4",
- "type": "CONDITIONING",
- "link": 1085,
- "slot_index": 4
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 1117,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 4
- }
- ]
- },
- "slot_index": 5
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "CONDITIONING",
- "links": [
- 1040
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Negative Refiner Muxer",
- "properties": {
- "Node name for S&R": "SeargeConditioningMuxer5"
- },
- "widgets_values": [
- 0
- ],
- "color": "#332922",
- "bgcolor": "#593930"
- },
- {
- "id": 373,
- "type": "Reroute",
- "pos": [
- 100,
- 4950
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 244,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1049,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1145
- ],
- "label": "B-",
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 372,
- "type": "Reroute",
- "pos": [
- 100,
- 5000
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 246,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1041
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1146
- ],
- "label": "R+",
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 371,
- "type": "Reroute",
- "pos": [
- 100,
- 5050
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 248,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1040
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1147
- ],
- "slot_index": 0,
- "label": "R-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 375,
- "type": "SeargeConditioningMuxer5",
- "pos": [
- -300,
- 5780
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 235,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "CONDITIONING",
- "link": 1104
- },
- {
- "name": "input1",
- "type": "CONDITIONING",
- "link": 1103,
- "slot_index": 1
- },
- {
- "name": "input2",
- "type": "CONDITIONING",
- "link": 1102,
- "slot_index": 2
- },
- {
- "name": "input3",
- "type": "CONDITIONING",
- "link": 1101,
- "slot_index": 3
- },
- {
- "name": "input4",
- "type": "CONDITIONING",
- "link": 1100,
- "slot_index": 4
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 1133,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 4
- }
- ]
- }
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "CONDITIONING",
- "links": [
- 1141
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Negative Base Muxer",
- "properties": {
- "Node name for S&R": "SeargeConditioningMuxer5"
- },
- "widgets_values": [
- 0
- ],
- "color": "#322",
- "bgcolor": "#533"
- },
- {
- "id": 377,
- "type": "SeargeConditioningMuxer5",
- "pos": [
- -300,
- 6030
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 237,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "CONDITIONING",
- "link": 1099,
- "slot_index": 0
- },
- {
- "name": "input1",
- "type": "CONDITIONING",
- "link": 1098,
- "slot_index": 1
- },
- {
- "name": "input2",
- "type": "CONDITIONING",
- "link": 1097,
- "slot_index": 2
- },
- {
- "name": "input3",
- "type": "CONDITIONING",
- "link": 1096,
- "slot_index": 3
- },
- {
- "name": "input4",
- "type": "CONDITIONING",
- "link": 1095,
- "slot_index": 4
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 1134,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 4
- }
- ]
- },
- "slot_index": 5
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "CONDITIONING",
- "links": [
- 1142
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Positive Refiner Muxer",
- "properties": {
- "Node name for S&R": "SeargeConditioningMuxer5"
- },
- "widgets_values": [
- 0
- ],
- "color": "#233",
- "bgcolor": "#355"
- },
- {
- "id": 378,
- "type": "SeargeConditioningMuxer5",
- "pos": [
- -300,
- 6280
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 239,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "CONDITIONING",
- "link": 1094,
- "slot_index": 0
- },
- {
- "name": "input1",
- "type": "CONDITIONING",
- "link": 1093,
- "slot_index": 1
- },
- {
- "name": "input2",
- "type": "CONDITIONING",
- "link": 1092,
- "slot_index": 2
- },
- {
- "name": "input3",
- "type": "CONDITIONING",
- "link": 1091,
- "slot_index": 3
- },
- {
- "name": "input4",
- "type": "CONDITIONING",
- "link": 1090,
- "slot_index": 4
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 1135,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 4
- }
- ]
- },
- "slot_index": 5
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "CONDITIONING",
- "links": [
- 1143
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Negative Refiner Muxer",
- "properties": {
- "Node name for S&R": "SeargeConditioningMuxer5"
- },
- "widgets_values": [
- 0
- ],
- "color": "#332922",
- "bgcolor": "#593930"
- },
- {
- "id": 376,
- "type": "SeargeConditioningMuxer5",
- "pos": [
- -300,
- 5530
- ],
- "size": {
- "0": 300,
- "1": 170
- },
- "flags": {
- "pinned": true
- },
- "order": 232,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "CONDITIONING",
- "link": 1109
- },
- {
- "name": "input1",
- "type": "CONDITIONING",
- "link": 1108,
- "slot_index": 1
- },
- {
- "name": "input2",
- "type": "CONDITIONING",
- "link": 1107,
- "slot_index": 2
- },
- {
- "name": "input3",
- "type": "CONDITIONING",
- "link": 1106,
- "slot_index": 3
- },
- {
- "name": "input4",
- "type": "CONDITIONING",
- "link": 1105,
- "slot_index": 4
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 1132,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 4
- }
- ]
- },
- "slot_index": 5
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "CONDITIONING",
- "links": [
- 1140
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "Positive Base Muxer",
- "properties": {
- "Node name for S&R": "SeargeConditioningMuxer5"
- },
- "widgets_values": [
- 0
- ],
- "color": "#232",
- "bgcolor": "#353"
- },
- {
- "id": 379,
- "type": "Reroute",
- "pos": [
- -440,
- 4500
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 199,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1050
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1055
- ],
- "slot_index": 0,
- "label": "sb+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 380,
- "type": "Reroute",
- "pos": [
- -440,
- 4530
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 197,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1051
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1056
- ],
- "slot_index": 0,
- "label": "pfb+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 381,
- "type": "Reroute",
- "pos": [
- -440,
- 4560
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 195,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1052
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1057
- ],
- "slot_index": 0,
- "label": "sfb+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 382,
- "type": "Reroute",
- "pos": [
- -440,
- 4590
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 193,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1053
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1058
- ],
- "slot_index": 0,
- "label": "wb+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 383,
- "type": "Reroute",
- "pos": [
- -440,
- 4620
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 191,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1054
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1059
- ],
- "slot_index": 0,
- "label": "cb+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 384,
- "type": "Reroute",
- "pos": [
- -439.69344968515696,
- 4750.48178896125
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 204,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1060
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1069
- ],
- "slot_index": 0,
- "label": "sb-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 385,
- "type": "Reroute",
- "pos": [
- -439.69344968515696,
- 4780.48178896125
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 205,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1061
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1068
- ],
- "slot_index": 0,
- "label": "pfb-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 386,
- "type": "Reroute",
- "pos": [
- -439.69344968515696,
- 4810.48178896125
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 207,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1062
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1067
- ],
- "slot_index": 0,
- "label": "sfb-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 387,
- "type": "Reroute",
- "pos": [
- -439.69344968515696,
- 4840.48178896125
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 202,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1063
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1066
- ],
- "slot_index": 0,
- "label": "wb-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 388,
- "type": "Reroute",
- "pos": [
- -439.69344968515696,
- 4870.48178896125
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 200,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1064
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1065
- ],
- "slot_index": 0,
- "label": "cb-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 389,
- "type": "Reroute",
- "pos": [
- -440.0128247178442,
- 5001.5996420061765
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 209,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1070
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1079
- ],
- "slot_index": 0,
- "label": "sr+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 390,
- "type": "Reroute",
- "pos": [
- -440.0128247178442,
- 5031.5996420061765
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 215,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1071
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1078
- ],
- "slot_index": 0,
- "label": "pfr+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 391,
- "type": "Reroute",
- "pos": [
- -440.0128247178442,
- 5061.5996420061765
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 217,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1072
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1077
- ],
- "slot_index": 0,
- "label": "sfr+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 392,
- "type": "Reroute",
- "pos": [
- -440.0128247178442,
- 5091.5996420061765
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 211,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1073
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1076
- ],
- "slot_index": 0,
- "label": "wr+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 393,
- "type": "Reroute",
- "pos": [
- -440.0128247178442,
- 5121.5996420061765
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 213,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1074
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1075
- ],
- "slot_index": 0,
- "label": "cr+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 394,
- "type": "Reroute",
- "pos": [
- -439.69898297216025,
- 5250.479291084056
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 210,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1260
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1089
- ],
- "slot_index": 0,
- "label": "sr-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 395,
- "type": "Reroute",
- "pos": [
- -439.69898297216025,
- 5280.479291084056
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 224,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1081
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1088
- ],
- "slot_index": 0,
- "label": "pfr-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 396,
- "type": "Reroute",
- "pos": [
- -439.69898297216025,
- 5310.479291084056
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 226,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1082
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1087
- ],
- "slot_index": 0,
- "label": "sfr-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 397,
- "type": "Reroute",
- "pos": [
- -439.69898297216025,
- 5340.479291084056
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 220,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1083
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1086
- ],
- "slot_index": 0,
- "label": "wr-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 398,
- "type": "Reroute",
- "pos": [
- -439.69898297216025,
- 5370.479291084056
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 222,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1084
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1085
- ],
- "slot_index": 0,
- "label": "cr-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 399,
- "type": "Reroute",
- "pos": [
- -440.0594766173699,
- 5501.284406981773
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 198,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1238,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1109
- ],
- "slot_index": 0,
- "label": "pfb+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 400,
- "type": "Reroute",
- "pos": [
- -440.0594766173699,
- 5531.284406981773
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 196,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1243,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1108
- ],
- "slot_index": 0,
- "label": "sfb+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 401,
- "type": "Reroute",
- "pos": [
- -440.0594766173699,
- 5561.284406981773
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 189,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1170,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1107
- ],
- "slot_index": 0,
- "label": "bso+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 402,
- "type": "Reroute",
- "pos": [
- -440.0594766173699,
- 5591.284406981773
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 194,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1261,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1106
- ],
- "slot_index": 0,
- "label": " wb+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 403,
- "type": "Reroute",
- "pos": [
- -440.0594766173699,
- 5621.284406981773
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 192,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1265,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1105
- ],
- "slot_index": 0,
- "label": " cb+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 404,
- "type": "Reroute",
- "pos": [
- -440.0594766173699,
- 5750.331942842333
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 208,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1241,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1104
- ],
- "slot_index": 0,
- "label": "sfb-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 405,
- "type": "Reroute",
- "pos": [
- -440.0594766173699,
- 5780.331942842333
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 206,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1245,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1103
- ],
- "slot_index": 0,
- "label": "pfb-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 406,
- "type": "Reroute",
- "pos": [
- -440.0594766173699,
- 5810.331942842333
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 190,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1175,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1102
- ],
- "slot_index": 0,
- "label": "bso-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 407,
- "type": "Reroute",
- "pos": [
- -440.0594766173699,
- 5840.331942842333
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 201,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1263,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1101
- ],
- "slot_index": 0,
- "label": " cb-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 408,
- "type": "Reroute",
- "pos": [
- -440.0594766173699,
- 5870.331942842333
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 203,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1267,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1100
- ],
- "slot_index": 0,
- "label": " wb-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 409,
- "type": "Reroute",
- "pos": [
- -439.14068030080034,
- 6001.215889755803
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 216,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1240,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1099
- ],
- "slot_index": 0,
- "label": "pfr+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 410,
- "type": "Reroute",
- "pos": [
- -439.14068030080034,
- 6031.215889755803
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 218,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1244,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1098
- ],
- "slot_index": 0,
- "label": "sfr+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 411,
- "type": "Reroute",
- "pos": [
- -439.14068030080034,
- 6061.215889755803
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 219,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1180,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1097
- ],
- "slot_index": 0,
- "label": "rso+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 412,
- "type": "Reroute",
- "pos": [
- -439.14068030080034,
- 6091.215889755803
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 212,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1262,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1096
- ],
- "slot_index": 0,
- "label": " wr+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 413,
- "type": "Reroute",
- "pos": [
- -439.14068030080034,
- 6121.215889755803
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 214,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1266,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1095
- ],
- "slot_index": 0,
- "label": " cr+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 414,
- "type": "Reroute",
- "pos": [
- -440.9787184458908,
- 6249.804604522524
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 227,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1242,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1094
- ],
- "slot_index": 0,
- "label": "sfr-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 415,
- "type": "Reroute",
- "pos": [
- -440.9787184458908,
- 6279.804604522524
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 225,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1246,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1093
- ],
- "slot_index": 0,
- "label": "pfr-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 416,
- "type": "Reroute",
- "pos": [
- -440.9787184458908,
- 6309.804604522524
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 228,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1185,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1092
- ],
- "slot_index": 0,
- "label": "rso-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 417,
- "type": "Reroute",
- "pos": [
- -440.9787184458908,
- 6339.804604522524
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 223,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1264,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1091
- ],
- "slot_index": 0,
- "label": "cr-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 418,
- "type": "Reroute",
- "pos": [
- -440.9787184458908,
- 6369.804604522524
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 221,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1268,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1090
- ],
- "slot_index": 0,
- "label": "wr-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 334,
- "type": "SeargeGenerated1",
- "pos": [
- -1000,
- 4180
- ],
- "size": {
- "0": 300,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 78,
- "mode": 0,
- "inputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "link": 881
- }
- ],
- "outputs": [
- {
- "name": "parameters",
- "type": "PARAMETERS",
- "links": [],
- "shape": 3,
- "slot_index": 0
- },
- {
- "name": "operation_selector",
- "type": "INT",
- "links": null,
- "shape": 3
- },
- {
- "name": "prompt_style_selector",
- "type": "INT",
- "links": [
- 1110,
- 1112,
- 1114,
- 1116,
- 1136,
- 1137,
- 1138,
- 1139
- ],
- "shape": 3,
- "slot_index": 2
- },
- {
- "name": "prompt_style_group",
- "type": "INT",
- "links": [
- 1259
- ],
- "shape": 3
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeGenerated1"
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 419,
- "type": "Reroute",
- "pos": [
- -440,
- 4650
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 85,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1110
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "INT",
- "links": [
- 1111
- ],
- "slot_index": 0,
- "label": "pss"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 420,
- "type": "Reroute",
- "pos": [
- -440,
- 4900
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 86,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1112
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "INT",
- "links": [
- 1113
- ],
- "slot_index": 0,
- "label": "pss"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 421,
- "type": "Reroute",
- "pos": [
- -440,
- 5150
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 87,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1114
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "INT",
- "links": [
- 1115
- ],
- "slot_index": 0,
- "label": "pss"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 422,
- "type": "Reroute",
- "pos": [
- -440,
- 5400
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 88,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1116
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "INT",
- "links": [
- 1117
- ],
- "slot_index": 0,
- "label": "pss"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 303,
- "type": "Reroute",
- "pos": [
- -1100,
- 4450
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 144,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 793,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 798
- ],
- "slot_index": 0,
- "label": "rc -"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 302,
- "type": "Reroute",
- "pos": [
- -1100,
- 4410
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 143,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 792,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 799
- ],
- "slot_index": 0,
- "label": "rc +"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 301,
- "type": "Reroute",
- "pos": [
- -1100,
- 4370
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 140,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 791,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 800
- ],
- "slot_index": 0,
- "label": "bc -"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 300,
- "type": "Reroute",
- "pos": [
- -1100,
- 4330
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 137,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1118,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 801
- ],
- "slot_index": 0,
- "label": "bc +"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 424,
- "type": "Reroute",
- "pos": [
- 1000,
- 4850
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 259,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1157,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1202,
- 1205
- ],
- "slot_index": 0,
- "label": "B-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 425,
- "type": "Reroute",
- "pos": [
- 1000,
- 4900
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 260,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1158,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1203,
- 1208
- ],
- "slot_index": 0,
- "label": "R+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 426,
- "type": "Reroute",
- "pos": [
- 1000,
- 4950
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 261,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1159,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1204,
- 1207
- ],
- "slot_index": 0,
- "label": "R-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 428,
- "type": "Reroute",
- "pos": [
- 2501.334326171875,
- 4251.2181640625
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 266,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1210,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1129
- ],
- "slot_index": 0,
- "label": "b-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 429,
- "type": "Reroute",
- "pos": [
- 2501.334326171875,
- 4301.2181640625
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 269,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1211,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1130
- ],
- "slot_index": 0,
- "label": "r+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 430,
- "type": "Reroute",
- "pos": [
- 2501.334326171875,
- 4351.2181640625
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 268,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1212,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1131
- ],
- "slot_index": 0,
- "label": "r-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 427,
- "type": "Reroute",
- "pos": [
- 2501.334326171875,
- 4201.2181640625
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 267,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1209,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1128
- ],
- "slot_index": 0,
- "label": "b+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 431,
- "type": "Reroute",
- "pos": [
- -440,
- 5650
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 89,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1136
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "INT",
- "links": [
- 1132
- ],
- "slot_index": 0,
- "label": "pss"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 432,
- "type": "Reroute",
- "pos": [
- -440,
- 5900
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 90,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1137
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "INT",
- "links": [
- 1133
- ],
- "slot_index": 0,
- "label": "pss"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 433,
- "type": "Reroute",
- "pos": [
- -440,
- 6150
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 91,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1138
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "INT",
- "links": [
- 1134
- ],
- "slot_index": 0,
- "label": "pss"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 434,
- "type": "Reroute",
- "pos": [
- -440,
- 6400
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 92,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1139
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "INT",
- "links": [
- 1135
- ],
- "slot_index": 0,
- "label": "pss"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 374,
- "type": "Reroute",
- "pos": [
- 100,
- 4900
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 243,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1043
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1144
- ],
- "label": "B+",
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 435,
- "type": "Reroute",
- "pos": [
- 100.58035101247651,
- 6050.94617317214
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 249,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1143
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1151
- ],
- "label": "R-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 436,
- "type": "Reroute",
- "pos": [
- 100.58035101247651,
- 6000.94617317214
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 247,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1142
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1150
- ],
- "label": "R+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 437,
- "type": "Reroute",
- "pos": [
- 100.58035101247651,
- 5950.94617317214
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 245,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1141,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1149
- ],
- "label": "B-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 438,
- "type": "Reroute",
- "pos": [
- 100.58035101247651,
- 5900.94617317214
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 242,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1140
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1148
- ],
- "label": "B+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 440,
- "type": "SeargeConditioningMuxer2",
- "pos": [
- 300,
- 5330
- ],
- "size": {
- "0": 250,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 254,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "CONDITIONING",
- "link": 1145
- },
- {
- "name": "input1",
- "type": "CONDITIONING",
- "link": 1149,
- "slot_index": 1
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 1257,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 1
- }
- ]
- },
- "slot_index": 2
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "CONDITIONING",
- "links": [
- 1157
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeConditioningMuxer2"
- },
- "widgets_values": [
- 0
- ],
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 441,
- "type": "SeargeConditioningMuxer2",
- "pos": [
- 300,
- 5530
- ],
- "size": {
- "0": 250,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 255,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "CONDITIONING",
- "link": 1146
- },
- {
- "name": "input1",
- "type": "CONDITIONING",
- "link": 1150,
- "slot_index": 1
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 1256,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 1
- }
- ]
- },
- "slot_index": 2
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "CONDITIONING",
- "links": [
- 1158
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeConditioningMuxer2"
- },
- "widgets_values": [
- 0
- ],
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 439,
- "type": "SeargeConditioningMuxer2",
- "pos": [
- 300,
- 5130
- ],
- "size": {
- "0": 250,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 253,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "CONDITIONING",
- "link": 1144
- },
- {
- "name": "input1",
- "type": "CONDITIONING",
- "link": 1148,
- "slot_index": 1
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 1258,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 1
- }
- ]
- },
- "slot_index": 2
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "CONDITIONING",
- "links": [
- 1156
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeConditioningMuxer2"
- },
- "widgets_values": [
- 0
- ],
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 442,
- "type": "SeargeConditioningMuxer2",
- "pos": [
- 300,
- 5730
- ],
- "size": {
- "0": 250,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 256,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "CONDITIONING",
- "link": 1147
- },
- {
- "name": "input1",
- "type": "CONDITIONING",
- "link": 1151,
- "slot_index": 1
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 1255,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 1
- }
- ]
- },
- "slot_index": 2
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "CONDITIONING",
- "links": [
- 1159
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeConditioningMuxer2"
- },
- "widgets_values": [
- 0
- ],
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 309,
- "type": "Reroute",
- "pos": [
- -750,
- 4410
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 172,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 799
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1070
- ],
- "label": "sr+",
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 310,
- "type": "Reroute",
- "pos": [
- -750,
- 4370
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 169,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 800
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1060
- ],
- "label": "sb-",
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 311,
- "type": "Reroute",
- "pos": [
- -750,
- 4330
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 166,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 801
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1050
- ],
- "label": "sb+",
- "slot_index": 0
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 446,
- "type": "Reroute",
- "pos": [
- -1098.3110595703124,
- 6450.41689453125
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 131,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1164,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1160
- ],
- "slot_index": 0,
- "label": "bs+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 447,
- "type": "Reroute",
- "pos": [
- -1098.3110595703124,
- 6490.41689453125
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 132,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1165,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1161
- ],
- "slot_index": 0,
- "label": "bs-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 448,
- "type": "Reroute",
- "pos": [
- -1098.3110595703124,
- 6530.41689453125
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 149,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1166,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1162
- ],
- "slot_index": 0,
- "label": "rs+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 449,
- "type": "Reroute",
- "pos": [
- -1098.3110595703124,
- 6570.41689453125
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 154,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1167,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1163
- ],
- "slot_index": 0,
- "label": "rs-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 450,
- "type": "Reroute",
- "pos": [
- -879.539599609375,
- 6450.50380859375
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 160,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1160,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1170
- ],
- "label": "bso+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 451,
- "type": "Reroute",
- "pos": [
- -879.539599609375,
- 6490.50380859375
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 161,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1161,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1175
- ],
- "label": "bso-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 452,
- "type": "Reroute",
- "pos": [
- -879.539599609375,
- 6530.50380859375
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 178,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1162,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1180
- ],
- "label": "rso+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 453,
- "type": "Reroute",
- "pos": [
- -879.539599609375,
- 6570.50380859375
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 183,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1163,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1185
- ],
- "label": "rso-"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 455,
- "type": "SeargeConditioningMuxer2",
- "pos": [
- 1500,
- 4630
- ],
- "size": {
- "0": 250,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 262,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "CONDITIONING",
- "link": 1202,
- "slot_index": 0
- },
- {
- "name": "input1",
- "type": "CONDITIONING",
- "link": 1206,
- "slot_index": 1
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 1198,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 1
- }
- ]
- }
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "CONDITIONING",
- "links": [
- 1210
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeConditioningMuxer2"
- },
- "widgets_values": [
- 0
- ],
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 456,
- "type": "SeargeConditioningMuxer2",
- "pos": [
- 1500,
- 4830
- ],
- "size": {
- "0": 250,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 265,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "CONDITIONING",
- "link": 1203,
- "slot_index": 0
- },
- {
- "name": "input1",
- "type": "CONDITIONING",
- "link": 1207,
- "slot_index": 1
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 1199,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 1
- }
- ]
- }
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "CONDITIONING",
- "links": [
- 1211
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeConditioningMuxer2"
- },
- "widgets_values": [
- 0
- ],
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 457,
- "type": "SeargeConditioningMuxer2",
- "pos": [
- 1500,
- 5030
- ],
- "size": {
- "0": 250,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 264,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "CONDITIONING",
- "link": 1204,
- "slot_index": 0
- },
- {
- "name": "input1",
- "type": "CONDITIONING",
- "link": 1208,
- "slot_index": 1
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 1200,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 1
- }
- ]
- }
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "CONDITIONING",
- "links": [
- 1212
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeConditioningMuxer2"
- },
- "widgets_values": [
- 0
- ],
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 454,
- "type": "SeargeConditioningMuxer2",
- "pos": [
- 1500,
- 4430
- ],
- "size": {
- "0": 250,
- "1": 120
- },
- "flags": {
- "pinned": true
- },
- "order": 263,
- "mode": 0,
- "inputs": [
- {
- "name": "input0",
- "type": "CONDITIONING",
- "link": 1201,
- "slot_index": 0
- },
- {
- "name": "input1",
- "type": "CONDITIONING",
- "link": 1205,
- "slot_index": 1
- },
- {
- "name": "input_selector",
- "type": "INT",
- "link": 1197,
- "widget": {
- "name": "input_selector",
- "config": [
- "INT",
- {
- "default": 0,
- "min": 0,
- "max": 1
- }
- ]
- }
- }
- ],
- "outputs": [
- {
- "name": "output",
- "type": "CONDITIONING",
- "links": [
- 1209
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "properties": {
- "Node name for S&R": "SeargeConditioningMuxer2"
- },
- "widgets_values": [
- 0
- ],
- "color": "#432",
- "bgcolor": "#653"
- },
- {
- "id": 458,
- "type": "SeargeIntegerConstant",
- "pos": [
- 1000,
- 4540
- ],
- "size": {
- "0": 210,
- "1": 58
- },
- "flags": {
- "pinned": true
- },
- "order": 12,
- "mode": 0,
- "outputs": [
- {
- "name": "value",
- "type": "INT",
- "links": [
- 1197,
- 1198,
- 1199,
- 1200
- ],
- "shape": 3,
- "slot_index": 0
- }
- ],
- "title": "SWAP + / -",
- "properties": {
- "Node name for S&R": "SeargeIntegerConstant"
- },
- "widgets_values": [
- 0
- ],
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 460,
- "type": "Reroute",
- "pos": [
- 100,
- 4300
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 93,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1259,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "INT",
- "links": [
- 1255,
- 1256,
- 1257,
- 1258
- ],
- "label": "grp"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#222",
- "bgcolor": "#000"
- },
- {
- "id": 344,
- "type": "Note",
- "pos": [
- 600,
- 1130
- ],
- "size": {
- "0": 500,
- "1": 70
- },
- "flags": {
- "pinned": true
- },
- "order": 13,
- "mode": 0,
- "title": "Off by default for performance reasons",
- "properties": {
- "text": ""
- },
- "widgets_values": [
- " Connect this \"jumper\" to enable UPSCALING\n (this is NOT related to hires fix)\n (when it's disconnected ignore the warnings printed to the console)"
- ],
- "color": "#223",
- "bgcolor": "#335"
- },
- {
- "id": 423,
- "type": "Reroute",
- "pos": [
- 1000,
- 4800
- ],
- "size": [
- 75,
- 26
- ],
- "flags": {
- "pinned": true
- },
- "order": 258,
- "mode": 0,
- "inputs": [
- {
- "name": "",
- "type": "*",
- "link": 1156,
- "slot_index": 0
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "CONDITIONING",
- "links": [
- 1201,
- 1206
- ],
- "slot_index": 0,
- "label": "B+"
- }
- ],
- "properties": {
- "showOutputText": false,
- "horizontal": false
- },
- "color": "#432",
- "bgcolor": "#653"
- }
- ],
- "links": [
- [
- 86,
- 66,
- 0,
- 68,
- 0,
- "IMAGE"
- ],
- [
- 87,
- 67,
- 0,
- 68,
- 1,
- "IMAGE"
- ],
- [
- 89,
- 68,
- 0,
- 69,
- 0,
- "IMAGE"
- ],
- [
- 91,
- 64,
- 0,
- 69,
- 1,
- "INT"
- ],
- [
- 92,
- 65,
- 0,
- 69,
- 2,
- "INT"
- ],
- [
- 210,
- 51,
- 0,
- 40,
- 8,
- "INT"
- ],
- [
- 211,
- 51,
- 0,
- 41,
- 5,
- "INT"
- ],
- [
- 212,
- 52,
- 0,
- 40,
- 9,
- "INT"
- ],
- [
- 213,
- 52,
- 0,
- 41,
- 6,
- "INT"
- ],
- [
- 214,
- 54,
- 0,
- 40,
- 12,
- "INT"
- ],
- [
- 215,
- 54,
- 0,
- 42,
- 3,
- "INT"
- ],
- [
- 216,
- 53,
- 0,
- 40,
- 13,
- "INT"
- ],
- [
- 217,
- 53,
- 0,
- 42,
- 4,
- "INT"
- ],
- [
- 223,
- 104,
- 0,
- 87,
- 0,
- "IMAGE"
- ],
- [
- 224,
- 104,
- 0,
- 86,
- 0,
- "IMAGE"
- ],
- [
- 225,
- 104,
- 0,
- 19,
- 0,
- "IMAGE"
- ],
- [
- 424,
- 98,
- 0,
- 130,
- 6,
- "FLOAT"
- ],
- [
- 439,
- 133,
- 0,
- 136,
- 0,
- "PARAMETER_INPUTS"
- ],
- [
- 440,
- 143,
- 0,
- 133,
- 0,
- "PARAMETER_INPUTS"
- ],
- [
- 463,
- 153,
- 1,
- 40,
- 2,
- "STRING"
- ],
- [
- 464,
- 153,
- 1,
- 40,
- 4,
- "STRING"
- ],
- [
- 465,
- 153,
- 2,
- 40,
- 3,
- "STRING"
- ],
- [
- 466,
- 153,
- 4,
- 40,
- 5,
- "STRING"
- ],
- [
- 467,
- 153,
- 4,
- 40,
- 6,
- "STRING"
- ],
- [
- 468,
- 153,
- 4,
- 40,
- 7,
- "STRING"
- ],
- [
- 469,
- 153,
- 5,
- 42,
- 2,
- "STRING"
- ],
- [
- 470,
- 153,
- 5,
- 41,
- 3,
- "STRING"
- ],
- [
- 471,
- 153,
- 5,
- 41,
- 4,
- "STRING"
- ],
- [
- 472,
- 153,
- 3,
- 41,
- 1,
- "STRING"
- ],
- [
- 473,
- 153,
- 3,
- 41,
- 2,
- "STRING"
- ],
- [
- 474,
- 153,
- 3,
- 42,
- 1,
- "STRING"
- ],
- [
- 501,
- 161,
- 1,
- 51,
- 1,
- "FLOAT"
- ],
- [
- 502,
- 161,
- 1,
- 52,
- 1,
- "FLOAT"
- ],
- [
- 503,
- 161,
- 2,
- 54,
- 1,
- "FLOAT"
- ],
- [
- 504,
- 161,
- 2,
- 53,
- 1,
- "FLOAT"
- ],
- [
- 505,
- 145,
- 3,
- 75,
- 2,
- "FLOAT"
- ],
- [
- 506,
- 145,
- 3,
- 77,
- 2,
- "FLOAT"
- ],
- [
- 507,
- 145,
- 4,
- 76,
- 2,
- "FLOAT"
- ],
- [
- 508,
- 145,
- 4,
- 78,
- 2,
- "FLOAT"
- ],
- [
- 533,
- 170,
- 0,
- 172,
- 0,
- "*"
- ],
- [
- 534,
- 131,
- 0,
- 170,
- 0,
- "*"
- ],
- [
- 537,
- 153,
- 0,
- 161,
- 0,
- "PARAMETERS"
- ],
- [
- 553,
- 172,
- 0,
- 152,
- 0,
- "PARAMETERS"
- ],
- [
- 561,
- 174,
- 0,
- 183,
- 0,
- "*"
- ],
- [
- 562,
- 176,
- 0,
- 182,
- 0,
- "*"
- ],
- [
- 563,
- 175,
- 0,
- 181,
- 0,
- "*"
- ],
- [
- 564,
- 177,
- 0,
- 184,
- 0,
- "*"
- ],
- [
- 587,
- 188,
- 0,
- 145,
- 0,
- "PARAMETERS"
- ],
- [
- 588,
- 178,
- 0,
- 185,
- 0,
- "*"
- ],
- [
- 598,
- 189,
- 0,
- 195,
- 0,
- "*"
- ],
- [
- 603,
- 181,
- 0,
- 196,
- 0,
- "*"
- ],
- [
- 605,
- 183,
- 0,
- 197,
- 0,
- "*"
- ],
- [
- 611,
- 195,
- 0,
- 198,
- 0,
- "*"
- ],
- [
- 614,
- 199,
- 0,
- 46,
- 1,
- "VAE"
- ],
- [
- 616,
- 200,
- 0,
- 189,
- 0,
- "*"
- ],
- [
- 617,
- 188,
- 0,
- 200,
- 0,
- "*"
- ],
- [
- 618,
- 190,
- 0,
- 201,
- 0,
- "*"
- ],
- [
- 619,
- 201,
- 0,
- 188,
- 0,
- "*"
- ],
- [
- 621,
- 152,
- 0,
- 202,
- 0,
- "*"
- ],
- [
- 622,
- 202,
- 0,
- 190,
- 0,
- "*"
- ],
- [
- 623,
- 186,
- 0,
- 66,
- 0,
- "UPSCALE_MODEL"
- ],
- [
- 633,
- 207,
- 0,
- 208,
- 0,
- "*"
- ],
- [
- 634,
- 46,
- 0,
- 207,
- 0,
- "*"
- ],
- [
- 647,
- 76,
- 0,
- 213,
- 0,
- "*"
- ],
- [
- 648,
- 77,
- 0,
- 212,
- 0,
- "*"
- ],
- [
- 649,
- 78,
- 0,
- 211,
- 0,
- "*"
- ],
- [
- 662,
- 40,
- 0,
- 219,
- 0,
- "*"
- ],
- [
- 663,
- 40,
- 1,
- 220,
- 0,
- "*"
- ],
- [
- 664,
- 40,
- 2,
- 221,
- 0,
- "*"
- ],
- [
- 665,
- 40,
- 3,
- 222,
- 0,
- "*"
- ],
- [
- 666,
- 41,
- 0,
- 223,
- 0,
- "*"
- ],
- [
- 667,
- 41,
- 1,
- 224,
- 0,
- "*"
- ],
- [
- 668,
- 42,
- 0,
- 225,
- 0,
- "*"
- ],
- [
- 669,
- 42,
- 1,
- 226,
- 0,
- "*"
- ],
- [
- 670,
- 219,
- 0,
- 227,
- 0,
- "*"
- ],
- [
- 671,
- 220,
- 0,
- 228,
- 0,
- "*"
- ],
- [
- 672,
- 221,
- 0,
- 229,
- 0,
- "*"
- ],
- [
- 673,
- 222,
- 0,
- 230,
- 0,
- "*"
- ],
- [
- 674,
- 223,
- 0,
- 231,
- 0,
- "*"
- ],
- [
- 675,
- 224,
- 0,
- 232,
- 0,
- "*"
- ],
- [
- 676,
- 225,
- 0,
- 233,
- 0,
- "*"
- ],
- [
- 677,
- 226,
- 0,
- 234,
- 0,
- "*"
- ],
- [
- 678,
- 227,
- 0,
- 55,
- 0,
- "CONDITIONING"
- ],
- [
- 679,
- 228,
- 0,
- 56,
- 0,
- "CONDITIONING"
- ],
- [
- 680,
- 229,
- 0,
- 57,
- 0,
- "CONDITIONING"
- ],
- [
- 681,
- 230,
- 0,
- 58,
- 0,
- "CONDITIONING"
- ],
- [
- 682,
- 227,
- 0,
- 75,
- 1,
- "CONDITIONING"
- ],
- [
- 683,
- 228,
- 0,
- 76,
- 1,
- "CONDITIONING"
- ],
- [
- 684,
- 229,
- 0,
- 77,
- 1,
- "CONDITIONING"
- ],
- [
- 685,
- 230,
- 0,
- 78,
- 1,
- "CONDITIONING"
- ],
- [
- 686,
- 231,
- 0,
- 75,
- 0,
- "CONDITIONING"
- ],
- [
- 687,
- 232,
- 0,
- 76,
- 0,
- "CONDITIONING"
- ],
- [
- 688,
- 233,
- 0,
- 77,
- 0,
- "CONDITIONING"
- ],
- [
- 689,
- 234,
- 0,
- 78,
- 0,
- "CONDITIONING"
- ],
- [
- 690,
- 46,
- 0,
- 235,
- 0,
- "IMAGE"
- ],
- [
- 693,
- 198,
- 0,
- 237,
- 0,
- "*"
- ],
- [
- 694,
- 237,
- 0,
- 209,
- 0,
- "*"
- ],
- [
- 695,
- 179,
- 0,
- 238,
- 0,
- "*"
- ],
- [
- 696,
- 238,
- 0,
- 186,
- 0,
- "*"
- ],
- [
- 697,
- 180,
- 0,
- 239,
- 0,
- "*"
- ],
- [
- 698,
- 239,
- 0,
- 187,
- 0,
- "*"
- ],
- [
- 699,
- 239,
- 0,
- 210,
- 0,
- "*"
- ],
- [
- 701,
- 240,
- 0,
- 66,
- 1,
- "IMAGE"
- ],
- [
- 702,
- 240,
- 0,
- 67,
- 1,
- "IMAGE"
- ],
- [
- 703,
- 209,
- 0,
- 241,
- 0,
- "*"
- ],
- [
- 704,
- 69,
- 0,
- 243,
- 0,
- "IMAGE"
- ],
- [
- 705,
- 187,
- 0,
- 244,
- 0,
- "*"
- ],
- [
- 706,
- 244,
- 0,
- 67,
- 0,
- "UPSCALE_MODEL"
- ],
- [
- 708,
- 245,
- 0,
- 206,
- 0,
- "*"
- ],
- [
- 710,
- 183,
- 0,
- 248,
- 0,
- "*"
- ],
- [
- 711,
- 181,
- 0,
- 247,
- 0,
- "*"
- ],
- [
- 712,
- 248,
- 0,
- 205,
- 0,
- "*"
- ],
- [
- 713,
- 247,
- 0,
- 204,
- 0,
- "*"
- ],
- [
- 714,
- 105,
- 0,
- 249,
- 0,
- "*"
- ],
- [
- 715,
- 249,
- 0,
- 104,
- 0,
- "*"
- ],
- [
- 716,
- 182,
- 0,
- 250,
- 0,
- "*"
- ],
- [
- 717,
- 250,
- 0,
- 40,
- 0,
- "CLIP"
- ],
- [
- 718,
- 250,
- 0,
- 41,
- 0,
- "CLIP"
- ],
- [
- 719,
- 184,
- 0,
- 251,
- 0,
- "*"
- ],
- [
- 720,
- 251,
- 0,
- 40,
- 1,
- "CLIP"
- ],
- [
- 721,
- 251,
- 0,
- 42,
- 0,
- "CLIP"
- ],
- [
- 722,
- 136,
- 0,
- 270,
- 0,
- "PARAMETER_INPUTS"
- ],
- [
- 723,
- 3,
- 0,
- 270,
- 3,
- "STRING"
- ],
- [
- 724,
- 5,
- 0,
- 270,
- 4,
- "STRING"
- ],
- [
- 725,
- 6,
- 0,
- 270,
- 5,
- "STRING"
- ],
- [
- 726,
- 7,
- 0,
- 270,
- 6,
- "STRING"
- ],
- [
- 727,
- 8,
- 0,
- 270,
- 7,
- "STRING"
- ],
- [
- 729,
- 268,
- 0,
- 270,
- 1,
- "IMAGE"
- ],
- [
- 730,
- 269,
- 1,
- 270,
- 2,
- "MASK"
- ],
- [
- 732,
- 271,
- 0,
- 199,
- 0,
- "*"
- ],
- [
- 733,
- 185,
- 0,
- 271,
- 0,
- "*"
- ],
- [
- 734,
- 271,
- 0,
- 245,
- 0,
- "*"
- ],
- [
- 735,
- 150,
- 0,
- 272,
- 0,
- "PARAMETER_INPUTS"
- ],
- [
- 736,
- 272,
- 0,
- 143,
- 0,
- "PARAMETER_INPUTS"
- ],
- [
- 756,
- 281,
- 0,
- 282,
- 0,
- "IMAGE"
- ],
- [
- 758,
- 282,
- 0,
- 283,
- 0,
- "LATENT"
- ],
- [
- 760,
- 286,
- 0,
- 284,
- 0,
- "IMAGE"
- ],
- [
- 761,
- 284,
- 0,
- 285,
- 0,
- "IMAGE"
- ],
- [
- 762,
- 185,
- 0,
- 287,
- 0,
- "*"
- ],
- [
- 764,
- 285,
- 0,
- 288,
- 0,
- "MASK"
- ],
- [
- 765,
- 288,
- 0,
- 283,
- 1,
- "MASK"
- ],
- [
- 767,
- 291,
- 0,
- 290,
- 0,
- "PARAMETERS"
- ],
- [
- 768,
- 293,
- 7,
- 286,
- 0,
- "MASK"
- ],
- [
- 769,
- 293,
- 6,
- 281,
- 0,
- "IMAGE"
- ],
- [
- 770,
- 290,
- 2,
- 281,
- 1,
- "INT"
- ],
- [
- 771,
- 290,
- 2,
- 284,
- 1,
- "INT"
- ],
- [
- 772,
- 290,
- 3,
- 281,
- 2,
- "INT"
- ],
- [
- 773,
- 290,
- 3,
- 284,
- 2,
- "INT"
- ],
- [
- 774,
- 287,
- 0,
- 294,
- 0,
- "*"
- ],
- [
- 775,
- 294,
- 0,
- 282,
- 1,
- "VAE"
- ],
- [
- 776,
- 291,
- 0,
- 296,
- 0,
- "*"
- ],
- [
- 777,
- 283,
- 0,
- 295,
- 0,
- "*"
- ],
- [
- 778,
- 282,
- 0,
- 297,
- 0,
- "*"
- ],
- [
- 779,
- 297,
- 0,
- 298,
- 0,
- "*"
- ],
- [
- 780,
- 295,
- 0,
- 289,
- 0,
- "*"
- ],
- [
- 781,
- 231,
- 0,
- 55,
- 1,
- "CONDITIONING"
- ],
- [
- 782,
- 232,
- 0,
- 56,
- 1,
- "CONDITIONING"
- ],
- [
- 783,
- 233,
- 0,
- 57,
- 1,
- "CONDITIONING"
- ],
- [
- 784,
- 234,
- 0,
- 58,
- 1,
- "CONDITIONING"
- ],
- [
- 785,
- 44,
- 0,
- 299,
- 0,
- "*"
- ],
- [
- 787,
- 290,
- 0,
- 293,
- 0,
- "PARAMETERS"
- ],
- [
- 791,
- 228,
- 0,
- 301,
- 0,
- "*"
- ],
- [
- 792,
- 229,
- 0,
- 302,
- 0,
- "*"
- ],
- [
- 793,
- 230,
- 0,
- 303,
- 0,
- "*"
- ],
- [
- 794,
- 58,
- 0,
- 304,
- 0,
- "*"
- ],
- [
- 795,
- 57,
- 0,
- 305,
- 0,
- "*"
- ],
- [
- 796,
- 56,
- 0,
- 306,
- 0,
- "*"
- ],
- [
- 797,
- 55,
- 0,
- 307,
- 0,
- "*"
- ],
- [
- 798,
- 303,
- 0,
- 308,
- 0,
- "*"
- ],
- [
- 799,
- 302,
- 0,
- 309,
- 0,
- "*"
- ],
- [
- 800,
- 301,
- 0,
- 310,
- 0,
- "*"
- ],
- [
- 801,
- 300,
- 0,
- 311,
- 0,
- "*"
- ],
- [
- 806,
- 312,
- 0,
- 240,
- 0,
- "*"
- ],
- [
- 819,
- 316,
- 0,
- 194,
- 0,
- "*"
- ],
- [
- 820,
- 317,
- 0,
- 193,
- 0,
- "*"
- ],
- [
- 821,
- 315,
- 0,
- 192,
- 0,
- "*"
- ],
- [
- 822,
- 314,
- 0,
- 191,
- 0,
- "*"
- ],
- [
- 823,
- 218,
- 0,
- 316,
- 0,
- "*"
- ],
- [
- 824,
- 217,
- 0,
- 317,
- 0,
- "*"
- ],
- [
- 825,
- 216,
- 0,
- 315,
- 0,
- "*"
- ],
- [
- 826,
- 215,
- 0,
- 314,
- 0,
- "*"
- ],
- [
- 827,
- 227,
- 0,
- 321,
- 1,
- "CONDITIONING"
- ],
- [
- 828,
- 227,
- 0,
- 313,
- 0,
- "CONDITIONING"
- ],
- [
- 829,
- 228,
- 0,
- 318,
- 0,
- "CONDITIONING"
- ],
- [
- 830,
- 228,
- 0,
- 322,
- 1,
- "CONDITIONING"
- ],
- [
- 832,
- 229,
- 0,
- 323,
- 1,
- "CONDITIONING"
- ],
- [
- 833,
- 230,
- 0,
- 324,
- 1,
- "CONDITIONING"
- ],
- [
- 834,
- 229,
- 0,
- 319,
- 0,
- "CONDITIONING"
- ],
- [
- 835,
- 230,
- 0,
- 320,
- 0,
- "CONDITIONING"
- ],
- [
- 836,
- 231,
- 0,
- 313,
- 1,
- "CONDITIONING"
- ],
- [
- 837,
- 232,
- 0,
- 318,
- 1,
- "CONDITIONING"
- ],
- [
- 838,
- 233,
- 0,
- 319,
- 1,
- "CONDITIONING"
- ],
- [
- 839,
- 234,
- 0,
- 320,
- 1,
- "CONDITIONING"
- ],
- [
- 840,
- 231,
- 0,
- 321,
- 0,
- "CONDITIONING"
- ],
- [
- 841,
- 232,
- 0,
- 322,
- 0,
- "CONDITIONING"
- ],
- [
- 842,
- 233,
- 0,
- 323,
- 0,
- "CONDITIONING"
- ],
- [
- 843,
- 234,
- 0,
- 324,
- 0,
- "CONDITIONING"
- ],
- [
- 844,
- 75,
- 0,
- 214,
- 0,
- "*"
- ],
- [
- 845,
- 324,
- 0,
- 329,
- 0,
- "*"
- ],
- [
- 846,
- 323,
- 0,
- 330,
- 0,
- "*"
- ],
- [
- 847,
- 322,
- 0,
- 331,
- 0,
- "*"
- ],
- [
- 848,
- 321,
- 0,
- 332,
- 0,
- "*"
- ],
- [
- 849,
- 313,
- 0,
- 328,
- 0,
- "*"
- ],
- [
- 850,
- 318,
- 0,
- 327,
- 0,
- "*"
- ],
- [
- 851,
- 319,
- 0,
- 326,
- 0,
- "*"
- ],
- [
- 852,
- 320,
- 0,
- 325,
- 0,
- "*"
- ],
- [
- 881,
- 145,
- 0,
- 334,
- 0,
- "PARAMETERS"
- ],
- [
- 910,
- 299,
- 0,
- 335,
- 0,
- "LATENT"
- ],
- [
- 912,
- 340,
- 1,
- 335,
- 3,
- "INT"
- ],
- [
- 913,
- 298,
- 0,
- 335,
- 1,
- "LATENT"
- ],
- [
- 914,
- 289,
- 0,
- 335,
- 2,
- "LATENT"
- ],
- [
- 916,
- 104,
- 0,
- 341,
- 0,
- "*"
- ],
- [
- 918,
- 342,
- 0,
- 343,
- 0,
- "*"
- ],
- [
- 919,
- 343,
- 0,
- 312,
- 0,
- "*"
- ],
- [
- 924,
- 349,
- 6,
- 353,
- 2,
- "LORA_NAME"
- ],
- [
- 925,
- 152,
- 1,
- 353,
- 3,
- "FLOAT"
- ],
- [
- 926,
- 152,
- 1,
- 353,
- 4,
- "FLOAT"
- ],
- [
- 929,
- 353,
- 0,
- 174,
- 0,
- "*"
- ],
- [
- 930,
- 353,
- 1,
- 176,
- 0,
- "*"
- ],
- [
- 931,
- 154,
- 0,
- 349,
- 0,
- "MODEL_NAMES"
- ],
- [
- 932,
- 349,
- 1,
- 350,
- 0,
- "CHECKPOINT_NAME"
- ],
- [
- 933,
- 350,
- 0,
- 353,
- 0,
- "MODEL"
- ],
- [
- 934,
- 350,
- 1,
- 353,
- 1,
- "CLIP"
- ],
- [
- 935,
- 349,
- 2,
- 355,
- 0,
- "CHECKPOINT_NAME"
- ],
- [
- 936,
- 355,
- 0,
- 175,
- 0,
- "*"
- ],
- [
- 937,
- 355,
- 1,
- 177,
- 0,
- "*"
- ],
- [
- 938,
- 349,
- 3,
- 351,
- 0,
- "VAE_NAME"
- ],
- [
- 939,
- 351,
- 0,
- 178,
- 0,
- "*"
- ],
- [
- 940,
- 349,
- 4,
- 352,
- 0,
- "UPSCALER_NAME"
- ],
- [
- 941,
- 349,
- 5,
- 356,
- 0,
- "UPSCALER_NAME"
- ],
- [
- 942,
- 352,
- 0,
- 179,
- 0,
- "*"
- ],
- [
- 943,
- 356,
- 0,
- 180,
- 0,
- "*"
- ],
- [
- 944,
- 357,
- 0,
- 131,
- 0,
- "PARAMETER_INPUTS"
- ],
- [
- 945,
- 270,
- 0,
- 357,
- 0,
- "PARAMETER_INPUTS"
- ],
- [
- 948,
- 359,
- 1,
- 358,
- 9,
- "INT"
- ],
- [
- 950,
- 359,
- 4,
- 358,
- 10,
- "INT"
- ],
- [
- 951,
- 359,
- 5,
- 358,
- 11,
- "FLOAT"
- ],
- [
- 957,
- 359,
- 6,
- 358,
- 7,
- "SAMPLER_NAME"
- ],
- [
- 958,
- 359,
- 7,
- 358,
- 8,
- "SCHEDULER_NAME"
- ],
- [
- 959,
- 359,
- 2,
- 44,
- 0,
- "INT"
- ],
- [
- 960,
- 359,
- 3,
- 44,
- 1,
- "INT"
- ],
- [
- 961,
- 359,
- 8,
- 360,
- 1,
- "ENABLE_STATE"
- ],
- [
- 962,
- 359,
- 9,
- 360,
- 2,
- "SAVE_FOLDER"
- ],
- [
- 963,
- 46,
- 0,
- 360,
- 0,
- "IMAGE"
- ],
- [
- 965,
- 359,
- 0,
- 340,
- 0,
- "PARAMETERS"
- ],
- [
- 966,
- 335,
- 0,
- 358,
- 6,
- "LATENT"
- ],
- [
- 967,
- 218,
- 0,
- 358,
- 5,
- "CONDITIONING"
- ],
- [
- 968,
- 217,
- 0,
- 358,
- 4,
- "CONDITIONING"
- ],
- [
- 969,
- 216,
- 0,
- 358,
- 2,
- "CONDITIONING"
- ],
- [
- 970,
- 215,
- 0,
- 358,
- 1,
- "CONDITIONING"
- ],
- [
- 971,
- 196,
- 0,
- 358,
- 3,
- "MODEL"
- ],
- [
- 972,
- 197,
- 0,
- 358,
- 0,
- "MODEL"
- ],
- [
- 973,
- 358,
- 0,
- 46,
- 0,
- "LATENT"
- ],
- [
- 974,
- 69,
- 0,
- 364,
- 0,
- "IMAGE"
- ],
- [
- 975,
- 366,
- 8,
- 364,
- 1,
- "ENABLE_STATE"
- ],
- [
- 976,
- 366,
- 7,
- 64,
- 1,
- "FLOAT"
- ],
- [
- 977,
- 366,
- 7,
- 65,
- 1,
- "FLOAT"
- ],
- [
- 978,
- 209,
- 0,
- 365,
- 0,
- "PARAMETERS"
- ],
- [
- 979,
- 365,
- 0,
- 366,
- 0,
- "PARAMETERS"
- ],
- [
- 980,
- 365,
- 2,
- 64,
- 0,
- "INT"
- ],
- [
- 981,
- 365,
- 3,
- 65,
- 0,
- "INT"
- ],
- [
- 983,
- 363,
- 0,
- 361,
- 0,
- "IMAGE"
- ],
- [
- 984,
- 363,
- 0,
- 105,
- 0,
- "*"
- ],
- [
- 985,
- 363,
- 0,
- 236,
- 0,
- "IMAGE"
- ],
- [
- 986,
- 368,
- 6,
- 361,
- 1,
- "ENABLE_STATE"
- ],
- [
- 987,
- 368,
- 7,
- 363,
- 20,
- "FLOAT"
- ],
- [
- 988,
- 368,
- 5,
- 363,
- 11,
- "INT"
- ],
- [
- 989,
- 368,
- 4,
- 363,
- 18,
- "INT"
- ],
- [
- 990,
- 368,
- 3,
- 106,
- 1,
- "FLOAT"
- ],
- [
- 991,
- 368,
- 3,
- 107,
- 1,
- "FLOAT"
- ],
- [
- 992,
- 368,
- 2,
- 363,
- 15,
- "FLOAT"
- ],
- [
- 993,
- 368,
- 1,
- 363,
- 12,
- "INT"
- ],
- [
- 994,
- 367,
- 3,
- 363,
- 19,
- "FLOAT"
- ],
- [
- 995,
- 367,
- 2,
- 363,
- 14,
- "FLOAT"
- ],
- [
- 996,
- 362,
- 5,
- 363,
- 13,
- "FLOAT"
- ],
- [
- 997,
- 362,
- 2,
- 106,
- 0,
- "INT"
- ],
- [
- 998,
- 362,
- 3,
- 107,
- 0,
- "INT"
- ],
- [
- 999,
- 362,
- 6,
- 363,
- 8,
- "SAMPLER_NAME"
- ],
- [
- 1000,
- 362,
- 7,
- 363,
- 9,
- "SCHEDULER_NAME"
- ],
- [
- 1001,
- 107,
- 0,
- 363,
- 17,
- "INT"
- ],
- [
- 1002,
- 106,
- 0,
- 363,
- 16,
- "INT"
- ],
- [
- 1003,
- 210,
- 0,
- 363,
- 10,
- "UPSCALE_MODEL"
- ],
- [
- 1004,
- 208,
- 0,
- 363,
- 6,
- "IMAGE"
- ],
- [
- 1005,
- 206,
- 0,
- 363,
- 7,
- "VAE"
- ],
- [
- 1006,
- 205,
- 0,
- 363,
- 0,
- "MODEL"
- ],
- [
- 1007,
- 204,
- 0,
- 363,
- 3,
- "MODEL"
- ],
- [
- 1008,
- 191,
- 0,
- 363,
- 1,
- "CONDITIONING"
- ],
- [
- 1009,
- 192,
- 0,
- 363,
- 2,
- "CONDITIONING"
- ],
- [
- 1010,
- 193,
- 0,
- 363,
- 4,
- "CONDITIONING"
- ],
- [
- 1011,
- 194,
- 0,
- 363,
- 5,
- "CONDITIONING"
- ],
- [
- 1012,
- 198,
- 0,
- 362,
- 0,
- "PARAMETERS"
- ],
- [
- 1013,
- 362,
- 0,
- 367,
- 0,
- "PARAMETERS"
- ],
- [
- 1014,
- 367,
- 0,
- 368,
- 0,
- "PARAMETERS"
- ],
- [
- 1017,
- 369,
- 1,
- 358,
- 13,
- "FLOAT"
- ],
- [
- 1018,
- 369,
- 2,
- 358,
- 12,
- "FLOAT"
- ],
- [
- 1019,
- 369,
- 3,
- 358,
- 16,
- "FLOAT"
- ],
- [
- 1020,
- 369,
- 4,
- 358,
- 15,
- "INT"
- ],
- [
- 1021,
- 369,
- 5,
- 358,
- 14,
- "INT"
- ],
- [
- 1022,
- 369,
- 6,
- 44,
- 2,
- "INT"
- ],
- [
- 1023,
- 189,
- 0,
- 369,
- 0,
- "PARAMETERS"
- ],
- [
- 1024,
- 369,
- 0,
- 359,
- 0,
- "PARAMETERS"
- ],
- [
- 1025,
- 190,
- 0,
- 370,
- 0,
- "PARAMETERS"
- ],
- [
- 1026,
- 370,
- 2,
- 40,
- 10,
- "INT"
- ],
- [
- 1027,
- 370,
- 3,
- 40,
- 11,
- "INT"
- ],
- [
- 1028,
- 370,
- 2,
- 41,
- 7,
- "INT"
- ],
- [
- 1029,
- 370,
- 3,
- 41,
- 8,
- "INT"
- ],
- [
- 1031,
- 370,
- 2,
- 54,
- 0,
- "INT"
- ],
- [
- 1033,
- 370,
- 3,
- 53,
- 0,
- "INT"
- ],
- [
- 1034,
- 370,
- 2,
- 51,
- 0,
- "INT"
- ],
- [
- 1035,
- 370,
- 3,
- 52,
- 0,
- "INT"
- ],
- [
- 1036,
- 370,
- 0,
- 153,
- 0,
- "PARAMETERS"
- ],
- [
- 1037,
- 362,
- 9,
- 361,
- 2,
- "SAVE_FOLDER"
- ],
- [
- 1038,
- 365,
- 9,
- 364,
- 2,
- "SAVE_FOLDER"
- ],
- [
- 1039,
- 200,
- 0,
- 291,
- 0,
- "*"
- ],
- [
- 1040,
- 339,
- 0,
- 371,
- 0,
- "*"
- ],
- [
- 1041,
- 338,
- 0,
- 372,
- 0,
- "*"
- ],
- [
- 1043,
- 337,
- 0,
- 374,
- 0,
- "*"
- ],
- [
- 1049,
- 336,
- 0,
- 373,
- 0,
- "*"
- ],
- [
- 1050,
- 311,
- 0,
- 379,
- 0,
- "*"
- ],
- [
- 1051,
- 328,
- 0,
- 380,
- 0,
- "*"
- ],
- [
- 1052,
- 332,
- 0,
- 381,
- 0,
- "*"
- ],
- [
- 1053,
- 214,
- 0,
- 382,
- 0,
- "*"
- ],
- [
- 1054,
- 307,
- 0,
- 383,
- 0,
- "*"
- ],
- [
- 1055,
- 379,
- 0,
- 337,
- 0,
- "CONDITIONING"
- ],
- [
- 1056,
- 380,
- 0,
- 337,
- 1,
- "CONDITIONING"
- ],
- [
- 1057,
- 381,
- 0,
- 337,
- 2,
- "CONDITIONING"
- ],
- [
- 1058,
- 382,
- 0,
- 337,
- 3,
- "CONDITIONING"
- ],
- [
- 1059,
- 383,
- 0,
- 337,
- 4,
- "CONDITIONING"
- ],
- [
- 1060,
- 310,
- 0,
- 384,
- 0,
- "*"
- ],
- [
- 1061,
- 327,
- 0,
- 385,
- 0,
- "*"
- ],
- [
- 1062,
- 331,
- 0,
- 386,
- 0,
- "*"
- ],
- [
- 1063,
- 213,
- 0,
- 387,
- 0,
- "*"
- ],
- [
- 1064,
- 306,
- 0,
- 388,
- 0,
- "*"
- ],
- [
- 1065,
- 388,
- 0,
- 336,
- 4,
- "CONDITIONING"
- ],
- [
- 1066,
- 387,
- 0,
- 336,
- 3,
- "CONDITIONING"
- ],
- [
- 1067,
- 386,
- 0,
- 336,
- 2,
- "CONDITIONING"
- ],
- [
- 1068,
- 385,
- 0,
- 336,
- 1,
- "CONDITIONING"
- ],
- [
- 1069,
- 384,
- 0,
- 336,
- 0,
- "CONDITIONING"
- ],
- [
- 1070,
- 309,
- 0,
- 389,
- 0,
- "*"
- ],
- [
- 1071,
- 326,
- 0,
- 390,
- 0,
- "*"
- ],
- [
- 1072,
- 330,
- 0,
- 391,
- 0,
- "*"
- ],
- [
- 1073,
- 212,
- 0,
- 392,
- 0,
- "*"
- ],
- [
- 1074,
- 305,
- 0,
- 393,
- 0,
- "*"
- ],
- [
- 1075,
- 393,
- 0,
- 338,
- 4,
- "CONDITIONING"
- ],
- [
- 1076,
- 392,
- 0,
- 338,
- 3,
- "CONDITIONING"
- ],
- [
- 1077,
- 391,
- 0,
- 338,
- 2,
- "CONDITIONING"
- ],
- [
- 1078,
- 390,
- 0,
- 338,
- 1,
- "CONDITIONING"
- ],
- [
- 1079,
- 389,
- 0,
- 338,
- 0,
- "CONDITIONING"
- ],
- [
- 1081,
- 325,
- 0,
- 395,
- 0,
- "*"
- ],
- [
- 1082,
- 329,
- 0,
- 396,
- 0,
- "*"
- ],
- [
- 1083,
- 211,
- 0,
- 397,
- 0,
- "*"
- ],
- [
- 1084,
- 304,
- 0,
- 398,
- 0,
- "*"
- ],
- [
- 1085,
- 398,
- 0,
- 339,
- 4,
- "CONDITIONING"
- ],
- [
- 1086,
- 397,
- 0,
- 339,
- 3,
- "CONDITIONING"
- ],
- [
- 1087,
- 396,
- 0,
- 339,
- 2,
- "CONDITIONING"
- ],
- [
- 1088,
- 395,
- 0,
- 339,
- 1,
- "CONDITIONING"
- ],
- [
- 1089,
- 394,
- 0,
- 339,
- 0,
- "CONDITIONING"
- ],
- [
- 1090,
- 418,
- 0,
- 378,
- 4,
- "CONDITIONING"
- ],
- [
- 1091,
- 417,
- 0,
- 378,
- 3,
- "CONDITIONING"
- ],
- [
- 1092,
- 416,
- 0,
- 378,
- 2,
- "CONDITIONING"
- ],
- [
- 1093,
- 415,
- 0,
- 378,
- 1,
- "CONDITIONING"
- ],
- [
- 1094,
- 414,
- 0,
- 378,
- 0,
- "CONDITIONING"
- ],
- [
- 1095,
- 413,
- 0,
- 377,
- 4,
- "CONDITIONING"
- ],
- [
- 1096,
- 412,
- 0,
- 377,
- 3,
- "CONDITIONING"
- ],
- [
- 1097,
- 411,
- 0,
- 377,
- 2,
- "CONDITIONING"
- ],
- [
- 1098,
- 410,
- 0,
- 377,
- 1,
- "CONDITIONING"
- ],
- [
- 1099,
- 409,
- 0,
- 377,
- 0,
- "CONDITIONING"
- ],
- [
- 1100,
- 408,
- 0,
- 375,
- 4,
- "CONDITIONING"
- ],
- [
- 1101,
- 407,
- 0,
- 375,
- 3,
- "CONDITIONING"
- ],
- [
- 1102,
- 406,
- 0,
- 375,
- 2,
- "CONDITIONING"
- ],
- [
- 1103,
- 405,
- 0,
- 375,
- 1,
- "CONDITIONING"
- ],
- [
- 1104,
- 404,
- 0,
- 375,
- 0,
- "CONDITIONING"
- ],
- [
- 1105,
- 403,
- 0,
- 376,
- 4,
- "CONDITIONING"
- ],
- [
- 1106,
- 402,
- 0,
- 376,
- 3,
- "CONDITIONING"
- ],
- [
- 1107,
- 401,
- 0,
- 376,
- 2,
- "CONDITIONING"
- ],
- [
- 1108,
- 400,
- 0,
- 376,
- 1,
- "CONDITIONING"
- ],
- [
- 1109,
- 399,
- 0,
- 376,
- 0,
- "CONDITIONING"
- ],
- [
- 1110,
- 334,
- 2,
- 419,
- 0,
- "*"
- ],
- [
- 1111,
- 419,
- 0,
- 337,
- 5,
- "INT"
- ],
- [
- 1112,
- 334,
- 2,
- 420,
- 0,
- "*"
- ],
- [
- 1113,
- 420,
- 0,
- 336,
- 5,
- "INT"
- ],
- [
- 1114,
- 334,
- 2,
- 421,
- 0,
- "*"
- ],
- [
- 1115,
- 421,
- 0,
- 338,
- 5,
- "INT"
- ],
- [
- 1116,
- 334,
- 2,
- 422,
- 0,
- "*"
- ],
- [
- 1117,
- 422,
- 0,
- 339,
- 5,
- "INT"
- ],
- [
- 1118,
- 227,
- 0,
- 300,
- 0,
- "*"
- ],
- [
- 1128,
- 427,
- 0,
- 215,
- 0,
- "*"
- ],
- [
- 1129,
- 428,
- 0,
- 216,
- 0,
- "*"
- ],
- [
- 1130,
- 429,
- 0,
- 217,
- 0,
- "*"
- ],
- [
- 1131,
- 430,
- 0,
- 218,
- 0,
- "*"
- ],
- [
- 1132,
- 431,
- 0,
- 376,
- 5,
- "INT"
- ],
- [
- 1133,
- 432,
- 0,
- 375,
- 5,
- "INT"
- ],
- [
- 1134,
- 433,
- 0,
- 377,
- 5,
- "INT"
- ],
- [
- 1135,
- 434,
- 0,
- 378,
- 5,
- "INT"
- ],
- [
- 1136,
- 334,
- 2,
- 431,
- 0,
- "*"
- ],
- [
- 1137,
- 334,
- 2,
- 432,
- 0,
- "*"
- ],
- [
- 1138,
- 334,
- 2,
- 433,
- 0,
- "*"
- ],
- [
- 1139,
- 334,
- 2,
- 434,
- 0,
- "*"
- ],
- [
- 1140,
- 376,
- 0,
- 438,
- 0,
- "*"
- ],
- [
- 1141,
- 375,
- 0,
- 437,
- 0,
- "*"
- ],
- [
- 1142,
- 377,
- 0,
- 436,
- 0,
- "*"
- ],
- [
- 1143,
- 378,
- 0,
- 435,
- 0,
- "*"
- ],
- [
- 1144,
- 374,
- 0,
- 439,
- 0,
- "CONDITIONING"
- ],
- [
- 1145,
- 373,
- 0,
- 440,
- 0,
- "CONDITIONING"
- ],
- [
- 1146,
- 372,
- 0,
- 441,
- 0,
- "CONDITIONING"
- ],
- [
- 1147,
- 371,
- 0,
- 442,
- 0,
- "CONDITIONING"
- ],
- [
- 1148,
- 438,
- 0,
- 439,
- 1,
- "CONDITIONING"
- ],
- [
- 1149,
- 437,
- 0,
- 440,
- 1,
- "CONDITIONING"
- ],
- [
- 1150,
- 436,
- 0,
- 441,
- 1,
- "CONDITIONING"
- ],
- [
- 1151,
- 435,
- 0,
- 442,
- 1,
- "CONDITIONING"
- ],
- [
- 1156,
- 439,
- 0,
- 423,
- 0,
- "*"
- ],
- [
- 1157,
- 440,
- 0,
- 424,
- 0,
- "*"
- ],
- [
- 1158,
- 441,
- 0,
- 425,
- 0,
- "*"
- ],
- [
- 1159,
- 442,
- 0,
- 426,
- 0,
- "*"
- ],
- [
- 1160,
- 446,
- 0,
- 450,
- 0,
- "*"
- ],
- [
- 1161,
- 447,
- 0,
- 451,
- 0,
- "*"
- ],
- [
- 1162,
- 448,
- 0,
- 452,
- 0,
- "*"
- ],
- [
- 1163,
- 449,
- 0,
- 453,
- 0,
- "*"
- ],
- [
- 1164,
- 231,
- 0,
- 446,
- 0,
- "*"
- ],
- [
- 1165,
- 232,
- 0,
- 447,
- 0,
- "*"
- ],
- [
- 1166,
- 233,
- 0,
- 448,
- 0,
- "*"
- ],
- [
- 1167,
- 234,
- 0,
- 449,
- 0,
- "*"
- ],
- [
- 1170,
- 450,
- 0,
- 401,
- 0,
- "*"
- ],
- [
- 1175,
- 451,
- 0,
- 406,
- 0,
- "*"
- ],
- [
- 1180,
- 452,
- 0,
- 411,
- 0,
- "*"
- ],
- [
- 1185,
- 453,
- 0,
- 416,
- 0,
- "*"
- ],
- [
- 1197,
- 458,
- 0,
- 454,
- 2,
- "INT"
- ],
- [
- 1198,
- 458,
- 0,
- 455,
- 2,
- "INT"
- ],
- [
- 1199,
- 458,
- 0,
- 456,
- 2,
- "INT"
- ],
- [
- 1200,
- 458,
- 0,
- 457,
- 2,
- "INT"
- ],
- [
- 1201,
- 423,
- 0,
- 454,
- 0,
- "CONDITIONING"
- ],
- [
- 1202,
- 424,
- 0,
- 455,
- 0,
- "CONDITIONING"
- ],
- [
- 1203,
- 425,
- 0,
- 456,
- 0,
- "CONDITIONING"
- ],
- [
- 1204,
- 426,
- 0,
- 457,
- 0,
- "CONDITIONING"
- ],
- [
- 1205,
- 424,
- 0,
- 454,
- 1,
- "CONDITIONING"
- ],
- [
- 1206,
- 423,
- 0,
- 455,
- 1,
- "CONDITIONING"
- ],
- [
- 1207,
- 426,
- 0,
- 456,
- 1,
- "CONDITIONING"
- ],
- [
- 1208,
- 425,
- 0,
- 457,
- 1,
- "CONDITIONING"
- ],
- [
- 1209,
- 454,
- 0,
- 427,
- 0,
- "*"
- ],
- [
- 1210,
- 455,
- 0,
- 428,
- 0,
- "*"
- ],
- [
- 1211,
- 456,
- 0,
- 429,
- 0,
- "*"
- ],
- [
- 1212,
- 457,
- 0,
- 430,
- 0,
- "*"
- ],
- [
- 1238,
- 328,
- 0,
- 399,
- 0,
- "*"
- ],
- [
- 1240,
- 326,
- 0,
- 409,
- 0,
- "*"
- ],
- [
- 1241,
- 331,
- 0,
- 404,
- 0,
- "*"
- ],
- [
- 1242,
- 329,
- 0,
- 414,
- 0,
- "*"
- ],
- [
- 1243,
- 332,
- 0,
- 400,
- 0,
- "*"
- ],
- [
- 1244,
- 330,
- 0,
- 410,
- 0,
- "*"
- ],
- [
- 1245,
- 327,
- 0,
- 405,
- 0,
- "*"
- ],
- [
- 1246,
- 325,
- 0,
- 415,
- 0,
- "*"
- ],
- [
- 1255,
- 460,
- 0,
- 442,
- 2,
- "INT"
- ],
- [
- 1256,
- 460,
- 0,
- 441,
- 2,
- "INT"
- ],
- [
- 1257,
- 460,
- 0,
- 440,
- 2,
- "INT"
- ],
- [
- 1258,
- 460,
- 0,
- 439,
- 2,
- "INT"
- ],
- [
- 1259,
- 334,
- 3,
- 460,
- 0,
- "*"
- ],
- [
- 1260,
- 308,
- 0,
- 394,
- 0,
- "*"
- ],
- [
- 1261,
- 214,
- 0,
- 402,
- 0,
- "*"
- ],
- [
- 1262,
- 212,
- 0,
- 412,
- 0,
- "*"
- ],
- [
- 1263,
- 306,
- 0,
- 407,
- 0,
- "*"
- ],
- [
- 1264,
- 304,
- 0,
- 417,
- 0,
- "*"
- ],
- [
- 1265,
- 307,
- 0,
- 403,
- 0,
- "*"
- ],
- [
- 1266,
- 305,
- 0,
- 413,
- 0,
- "*"
- ],
- [
- 1267,
- 213,
- 0,
- 408,
- 0,
- "*"
- ],
- [
- 1268,
- 211,
- 0,
- 418,
- 0,
- "*"
- ]
- ],
- "groups": [
- {
- "title": "Model Loading",
- "bounding": [
- -4600,
- 1900,
- 2401,
- 1800
- ],
- "color": "#88A"
- },
- {
- "title": "Prompt Parsing",
- "bounding": [
- -4599,
- 4000,
- 2399,
- 1900
- ],
- "color": "#8A8"
- },
- {
- "title": "Prompt Processing",
- "bounding": [
- -1899,
- 4001,
- 2498,
- 2798
- ],
- "color": "#b58b2a"
- },
- {
- "title": "Image Generation",
- "bounding": [
- 3001,
- 4001,
- 3199,
- 1198
- ],
- "color": "#b06634"
- },
- {
- "title": "HiRes Fix",
- "bounding": [
- 6601,
- 4001,
- 2698,
- 1598
- ],
- "color": "#A88"
- },
- {
- "title": "Upscaling",
- "bounding": [
- 9700,
- 4000,
- 2700,
- 1199
- ],
- "color": "#8AA"
- },
- {
- "title": "User Interface",
- "bounding": [
- -1599,
- -1199,
- 4898,
- 2398
- ],
- "color": "#444"
- },
- {
- "title": "Image 2 Image and Inpainting",
- "bounding": [
- 902,
- 6901,
- 2698,
- 1099
- ],
- "color": "#a1309b"
- },
- {
- "title": "Experimental Prompt Post-Processing",
- "bounding": [
- 901,
- 4001,
- 1798,
- 2598
- ],
- "color": "#3f789e"
- }
- ],
- "config": {},
- "extra": {},
- "version": 0.4
-}
\ No newline at end of file
diff --git a/workflow/Searge-SDXL-Reborn-v3_991.json b/workflow/Searge-SDXL-Reborn-v3_991.json
new file mode 100644
index 0000000..3d21c84
--- /dev/null
+++ b/workflow/Searge-SDXL-Reborn-v3_991.json
@@ -0,0 +1,6050 @@
+{
+ "last_node_id": 683,
+ "last_link_id": 1681,
+ "nodes": [
+ {
+ "id": 19,
+ "type": "SeargePreviewImageDev",
+ "pos": [
+ 1140,
+ 40
+ ],
+ "size": {
+ "0": 520,
+ "1": 540
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 101,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "images",
+ "type": "IMAGE",
+ "link": 1399,
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "images",
+ "type": "IMAGE",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "title": "Preview Image",
+ "properties": {
+ "Node name for S&R": "SeargePreviewImage"
+ },
+ "widgets_values": [
+ true
+ ]
+ },
+ {
+ "id": 463,
+ "type": "SeargePreviewImageDev",
+ "pos": [
+ 1670,
+ 40
+ ],
+ "size": {
+ "0": 520,
+ "1": 540
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 107,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "images",
+ "type": "IMAGE",
+ "link": 1400,
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "images",
+ "type": "IMAGE",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "title": "High Resolution Preview Image",
+ "properties": {
+ "Node name for S&R": "SeargePreviewImage"
+ },
+ "widgets_values": [
+ true
+ ]
+ },
+ {
+ "id": 87,
+ "type": "SeargePreviewImageDev",
+ "pos": [
+ -1450,
+ -970
+ ],
+ "size": {
+ "0": 900,
+ "1": 1570
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 93,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "images",
+ "type": "IMAGE",
+ "link": 1404,
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "images",
+ "type": "IMAGE",
+ "links": [
+ 1594
+ ],
+ "shape": 3,
+ "slot_index": 0
+ }
+ ],
+ "title": "Vertical Preview Image",
+ "properties": {
+ "Node name for S&R": "SeargePreviewImage"
+ },
+ "widgets_values": [
+ false
+ ]
+ },
+ {
+ "id": 86,
+ "type": "SeargePreviewImageDev",
+ "pos": [
+ 50,
+ -970
+ ],
+ "size": {
+ "0": 1600,
+ "1": 870
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 97,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "images",
+ "type": "IMAGE",
+ "link": 1594,
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "images",
+ "type": "IMAGE",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "title": "Horizontal Preview Image",
+ "properties": {
+ "Node name for S&R": "SeargePreviewImage"
+ },
+ "widgets_values": [
+ false
+ ]
+ },
+ {
+ "id": 498,
+ "type": "Reroute",
+ "pos": [
+ 850,
+ -1050
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 98,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1402,
+ "pos": [
+ 37.5,
+ 0
+ ],
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "IMAGE",
+ "links": [
+ 1399
+ ],
+ "slot_index": 0,
+ "label": "img"
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": true
+ },
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 499,
+ "type": "Reroute",
+ "pos": [
+ 1250,
+ -1050
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 105,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1401,
+ "pos": [
+ 37.5,
+ 0
+ ],
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "IMAGE",
+ "links": [
+ 1400
+ ],
+ "slot_index": 0,
+ "label": "hr img"
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": true
+ },
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 268,
+ "type": "LoadImage",
+ "pos": [
+ -450,
+ 40
+ ],
+ "size": {
+ "0": 400,
+ "1": 470
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 0,
+ "mode": 0,
+ "outputs": [
+ {
+ "name": "IMAGE",
+ "type": "IMAGE",
+ "links": [
+ 1587
+ ],
+ "shape": 3,
+ "slot_index": 0
+ },
+ {
+ "name": "MASK",
+ "type": "MASK",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "title": "Image-to-Image and Inpainting Source Image",
+ "properties": {
+ "Node name for S&R": "LoadImage"
+ },
+ "widgets_values": [
+ "example.png",
+ "image"
+ ],
+ "color": "#432",
+ "bgcolor": "#653"
+ },
+ {
+ "id": 269,
+ "type": "LoadImage",
+ "pos": [
+ -450,
+ 590
+ ],
+ "size": {
+ "0": 400,
+ "1": 470
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 1,
+ "mode": 0,
+ "outputs": [
+ {
+ "name": "IMAGE",
+ "type": "IMAGE",
+ "links": null,
+ "shape": 3
+ },
+ {
+ "name": "MASK",
+ "type": "MASK",
+ "links": [
+ 1588
+ ],
+ "shape": 3
+ }
+ ],
+ "title": "Inpainting Mask - right click -> MaskEditor",
+ "properties": {
+ "Node name for S&R": "LoadImage"
+ },
+ "widgets_values": [
+ "example.png",
+ "image"
+ ],
+ "color": "#232",
+ "bgcolor": "#353"
+ },
+ {
+ "id": 3,
+ "type": "SeargeTextInputV2Dev",
+ "pos": [
+ 10,
+ 40
+ ],
+ "size": {
+ "0": 460,
+ "1": 170
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 2,
+ "mode": 0,
+ "outputs": [
+ {
+ "name": "prompt",
+ "type": "SRG_PROMPT_TEXT",
+ "links": [
+ 1577
+ ],
+ "shape": 3,
+ "slot_index": 0
+ }
+ ],
+ "title": "Main Prompt",
+ "properties": {
+ "Node name for S&R": "MainPrompt"
+ },
+ "widgets_values": [
+ "a close up of a person wearing a suit and tie, peaky blinders (2018), attractive androgynous humanoid, wearing teal beanie, william dafoe, beige fedora, in roger deakins style, fire behind him, jaguar, red ascot and a field cap, robe, perfect face, ripley scott, mummy"
+ ],
+ "color": "#232",
+ "bgcolor": "#353"
+ },
+ {
+ "id": 502,
+ "type": "Reroute",
+ "pos": [
+ -1600,
+ -1100
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 88,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1483,
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "IMAGE",
+ "links": [
+ 1404,
+ 1597
+ ],
+ "slot_index": 0,
+ "label": "img"
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": false
+ },
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 503,
+ "type": "Reroute",
+ "pos": [
+ -1600,
+ -1150
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 100,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1484
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "IMAGE",
+ "links": [
+ 1407
+ ],
+ "label": "up img",
+ "slot_index": 0
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": false
+ },
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 500,
+ "type": "Reroute",
+ "pos": [
+ 700,
+ -1100
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 94,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1597
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "IMAGE",
+ "links": [
+ 1402
+ ],
+ "label": "img"
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": false
+ },
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 497,
+ "type": "Reroute",
+ "pos": [
+ 1100,
+ -1150
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 103,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1407,
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "IMAGE",
+ "links": [
+ 1401
+ ],
+ "label": "hr img",
+ "slot_index": 0
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": false
+ },
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 5,
+ "type": "SeargeTextInputV2Dev",
+ "pos": [
+ 10,
+ 250
+ ],
+ "size": {
+ "0": 460,
+ "1": 170
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 3,
+ "mode": 0,
+ "outputs": [
+ {
+ "name": "prompt",
+ "type": "SRG_PROMPT_TEXT",
+ "links": [
+ 1578
+ ],
+ "shape": 3,
+ "slot_index": 0
+ }
+ ],
+ "title": "Secondary Prompt",
+ "properties": {
+ "Node name for S&R": "SecondaryPrompt"
+ },
+ "widgets_values": [
+ "a close up of a person wearing a suit and tie, peaky blinders, teal color graded, focus on two androids, interstellar movie, wears a destroyed hat, emaciated, england, absolute chad, very very very beautifull face, long dark shadows, late 40s aged, incredible wide screenshot, diamond, sad men"
+ ],
+ "color": "#2a363b",
+ "bgcolor": "#3f5159"
+ },
+ {
+ "id": 6,
+ "type": "SeargeTextInputV2Dev",
+ "pos": [
+ 10,
+ 460
+ ],
+ "size": {
+ "0": 460,
+ "1": 170
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 4,
+ "mode": 0,
+ "outputs": [
+ {
+ "name": "prompt",
+ "type": "SRG_PROMPT_TEXT",
+ "links": [
+ 1579
+ ],
+ "shape": 3
+ }
+ ],
+ "title": "Style - can use as a placeholder",
+ "properties": {
+ "Node name for S&R": "StylePrompt"
+ },
+ "widgets_values": [
+ "photo of . highly detailed, professional, gritty, sharp focus, high budget hollywood movie, inspired by William Brodie"
+ ],
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 7,
+ "type": "SeargeTextInputV2Dev",
+ "pos": [
+ 10,
+ 680
+ ],
+ "size": {
+ "0": 460,
+ "1": 170
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 5,
+ "mode": 0,
+ "outputs": [
+ {
+ "name": "prompt",
+ "type": "SRG_PROMPT_TEXT",
+ "links": [
+ 1580
+ ],
+ "shape": 3,
+ "slot_index": 0
+ }
+ ],
+ "title": "Negative Prompt",
+ "properties": {
+ "Node name for S&R": "NegativePrompt"
+ },
+ "widgets_values": [
+ "dirty, out of focus"
+ ],
+ "color": "#322",
+ "bgcolor": "#533"
+ },
+ {
+ "id": 8,
+ "type": "SeargeTextInputV2Dev",
+ "pos": [
+ 10,
+ 890
+ ],
+ "size": {
+ "0": 460,
+ "1": 170
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 6,
+ "mode": 0,
+ "outputs": [
+ {
+ "name": "prompt",
+ "type": "SRG_PROMPT_TEXT",
+ "links": [
+ 1581,
+ 1582
+ ],
+ "shape": 3
+ }
+ ],
+ "title": "Negative Secondary Prompt and Style",
+ "properties": {
+ "Node name for S&R": "NegativeSecondaryAndStylePrompt"
+ },
+ "widgets_values": [
+ "mud"
+ ],
+ "color": "#332922",
+ "bgcolor": "#593930"
+ },
+ {
+ "id": 524,
+ "type": "SeargeMagicBoxDev",
+ "pos": [
+ -2500,
+ 3130
+ ],
+ "size": {
+ "0": 300,
+ "1": 170
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 52,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1620
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_INPUT",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1622
+ ],
+ "shape": 3,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_OUTPUT",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "title": "Apply Loras",
+ "properties": {
+ "Node name for S&R": "SeargeMagicBox"
+ },
+ "widgets_values": [
+ "apply loras",
+ "data stream",
+ "data stream"
+ ],
+ "color": "#232",
+ "bgcolor": "#353"
+ },
+ {
+ "id": 525,
+ "type": "SeargeMagicBoxDev",
+ "pos": [
+ -2100,
+ 3130
+ ],
+ "size": {
+ "0": 300,
+ "1": 170
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 53,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1622
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_INPUT",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1623
+ ],
+ "shape": 3,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_OUTPUT",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "SeargeMagicBox"
+ },
+ "widgets_values": [
+ "none - skip",
+ "data stream",
+ "data stream"
+ ]
+ },
+ {
+ "id": 526,
+ "type": "SeargeMagicBoxDev",
+ "pos": [
+ -1700,
+ 3130
+ ],
+ "size": {
+ "0": 300,
+ "1": 170
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 54,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1623
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_INPUT",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1624
+ ],
+ "shape": 3,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_OUTPUT",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "title": "Prompt Styling",
+ "properties": {
+ "Node name for S&R": "SeargeMagicBox"
+ },
+ "widgets_values": [
+ "prompt styling",
+ "data stream",
+ "data stream"
+ ],
+ "color": "#322",
+ "bgcolor": "#533"
+ },
+ {
+ "id": 528,
+ "type": "SeargeMagicBoxDev",
+ "pos": [
+ -900,
+ 3130
+ ],
+ "size": {
+ "0": 300,
+ "1": 170
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 56,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1626
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_INPUT",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1627
+ ],
+ "shape": 3,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_OUTPUT",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "title": "CLIP Mixing",
+ "properties": {
+ "Node name for S&R": "SeargeMagicBox"
+ },
+ "widgets_values": [
+ "clip mixing",
+ "data stream",
+ "data stream"
+ ],
+ "color": "#322",
+ "bgcolor": "#533"
+ },
+ {
+ "id": 529,
+ "type": "SeargeMagicBoxDev",
+ "pos": [
+ -500,
+ 3130
+ ],
+ "size": {
+ "0": 300,
+ "1": 170
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 57,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1627
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_INPUT",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1628
+ ],
+ "shape": 3,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_OUTPUT",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "title": "Apply Controlnet and Revision",
+ "properties": {
+ "Node name for S&R": "SeargeMagicBox"
+ },
+ "widgets_values": [
+ "apply controlnet",
+ "data stream",
+ "data stream"
+ ],
+ "color": "#432",
+ "bgcolor": "#653"
+ },
+ {
+ "id": 530,
+ "type": "SeargeMagicBoxDev",
+ "pos": [
+ -100,
+ 3130
+ ],
+ "size": {
+ "0": 300,
+ "1": 170
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 58,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1628,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_INPUT",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1629
+ ],
+ "shape": 3,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_OUTPUT",
+ "links": [],
+ "shape": 3,
+ "slot_index": 1
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "SeargeMagicBox"
+ },
+ "widgets_values": [
+ "none - skip",
+ "data stream",
+ "data stream"
+ ]
+ },
+ {
+ "id": 531,
+ "type": "SeargeMagicBoxDev",
+ "pos": [
+ 300,
+ 3130
+ ],
+ "size": {
+ "0": 300,
+ "1": 170
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 59,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1629,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_INPUT",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1631
+ ],
+ "shape": 3,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_OUTPUT",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "title": "Latent Inputs",
+ "properties": {
+ "Node name for S&R": "SeargeMagicBox"
+ },
+ "widgets_values": [
+ "latent inputs",
+ "data stream",
+ "data stream"
+ ],
+ "color": "#232",
+ "bgcolor": "#353"
+ },
+ {
+ "id": 532,
+ "type": "SeargeMagicBoxDev",
+ "pos": [
+ 700,
+ 3130
+ ],
+ "size": {
+ "0": 300,
+ "1": 170
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 60,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1631,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_INPUT",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1632
+ ],
+ "shape": 3,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_OUTPUT",
+ "links": [],
+ "shape": 3,
+ "slot_index": 1
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "SeargeMagicBox"
+ },
+ "widgets_values": [
+ "none - skip",
+ "data stream",
+ "data stream"
+ ]
+ },
+ {
+ "id": 533,
+ "type": "SeargeMagicBoxDev",
+ "pos": [
+ 1100,
+ 3130
+ ],
+ "size": {
+ "0": 300,
+ "1": 170
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 61,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1632,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_INPUT",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1635
+ ],
+ "shape": 3,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_OUTPUT",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "title": "Sampling",
+ "properties": {
+ "Node name for S&R": "SeargeMagicBox"
+ },
+ "widgets_values": [
+ "sampling",
+ "data stream",
+ "data stream"
+ ],
+ "color": "#232",
+ "bgcolor": "#353"
+ },
+ {
+ "id": 536,
+ "type": "SeargeMagicBoxDev",
+ "pos": [
+ 2300,
+ 3130
+ ],
+ "size": {
+ "0": 300,
+ "1": 170
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 64,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1641,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_INPUT",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1647
+ ],
+ "shape": 3,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_OUTPUT",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "title": "High Resolution",
+ "properties": {
+ "Node name for S&R": "SeargeMagicBox"
+ },
+ "widgets_values": [
+ "high resolution",
+ "data stream",
+ "data stream"
+ ],
+ "color": "#232",
+ "bgcolor": "#353"
+ },
+ {
+ "id": 506,
+ "type": "SeargeMagicBoxDev",
+ "pos": [
+ -2900,
+ 3130
+ ],
+ "size": {
+ "0": 300,
+ "1": 170
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 51,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1619
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_INPUT",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1620
+ ],
+ "shape": 3,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_OUTPUT",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "title": "Load Checkpoints",
+ "properties": {
+ "Node name for S&R": "SeargeMagicBox"
+ },
+ "widgets_values": [
+ "load checkpoints",
+ "data stream",
+ "data stream"
+ ],
+ "color": "#232",
+ "bgcolor": "#353"
+ },
+ {
+ "id": 537,
+ "type": "SeargeMagicBoxDev",
+ "pos": [
+ -3300,
+ 3130
+ ],
+ "size": {
+ "0": 300,
+ "1": 170
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 50,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1665,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_INPUT",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1619
+ ],
+ "shape": 3,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_OUTPUT",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "title": "Pre-Process Data",
+ "properties": {
+ "Node name for S&R": "SeargeMagicBox"
+ },
+ "widgets_values": [
+ "pre-process data",
+ "data stream",
+ "data stream"
+ ],
+ "color": "#2a363b",
+ "bgcolor": "#3f5159"
+ },
+ {
+ "id": 538,
+ "type": "SeargeMagicBoxDev",
+ "pos": [
+ 2700,
+ 3130
+ ],
+ "size": {
+ "0": 300,
+ "1": 170
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 66,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1647,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_INPUT",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1653
+ ],
+ "shape": 3,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_OUTPUT",
+ "links": [
+ 1616
+ ],
+ "shape": 3,
+ "slot_index": 1
+ }
+ ],
+ "title": "VAE Decode Hi-Res",
+ "properties": {
+ "Node name for S&R": "SeargeMagicBox"
+ },
+ "widgets_values": [
+ "vae decode hi-res",
+ "data stream",
+ "custom stage & data stream"
+ ],
+ "color": "#232",
+ "bgcolor": "#353"
+ },
+ {
+ "id": 539,
+ "type": "SeargeMagicBoxDev",
+ "pos": [
+ 3100,
+ 3130
+ ],
+ "size": {
+ "0": 300,
+ "1": 170
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 68,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1653,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_INPUT",
+ "link": null,
+ "slot_index": 1
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1651
+ ],
+ "shape": 3,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_OUTPUT",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "SeargeMagicBox"
+ },
+ "widgets_values": [
+ "none - skip",
+ "data stream",
+ "data stream"
+ ]
+ },
+ {
+ "id": 540,
+ "type": "SeargeMagicBoxDev",
+ "pos": [
+ 3500,
+ 3130
+ ],
+ "size": {
+ "0": 300,
+ "1": 170
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 71,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1651,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_INPUT",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1650
+ ],
+ "shape": 3,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_OUTPUT",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "SeargeMagicBox"
+ },
+ "widgets_values": [
+ "none - skip",
+ "data stream",
+ "data stream"
+ ]
+ },
+ {
+ "id": 541,
+ "type": "SeargeMagicBoxDev",
+ "pos": [
+ 3900,
+ 3130
+ ],
+ "size": {
+ "0": 300,
+ "1": 170
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 74,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1650,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_INPUT",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1654
+ ],
+ "shape": 3,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_OUTPUT",
+ "links": [
+ 1658
+ ],
+ "shape": 3,
+ "slot_index": 1
+ }
+ ],
+ "title": "Upscaling",
+ "properties": {
+ "Node name for S&R": "SeargeMagicBox"
+ },
+ "widgets_values": [
+ "upscaling",
+ "data stream",
+ "custom stage & data stream"
+ ],
+ "color": "#232",
+ "bgcolor": "#353"
+ },
+ {
+ "id": 542,
+ "type": "SeargeMagicBoxDev",
+ "pos": [
+ 4300,
+ 3130
+ ],
+ "size": {
+ "0": 300,
+ "1": 170
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 77,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1654,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_INPUT",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1655
+ ],
+ "shape": 3,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_OUTPUT",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "SeargeMagicBox"
+ },
+ "widgets_values": [
+ "none - skip",
+ "data stream",
+ "data stream"
+ ]
+ },
+ {
+ "id": 543,
+ "type": "SeargeMagicBoxDev",
+ "pos": [
+ 4700,
+ 3130
+ ],
+ "size": {
+ "0": 300,
+ "1": 170
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 81,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1655,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_INPUT",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1656
+ ],
+ "shape": 3,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_OUTPUT",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "title": "Image Saving",
+ "properties": {
+ "Node name for S&R": "SeargeMagicBox"
+ },
+ "widgets_values": [
+ "image saving",
+ "data stream",
+ "data stream"
+ ],
+ "color": "#232",
+ "bgcolor": "#353"
+ },
+ {
+ "id": 544,
+ "type": "SeargeMagicBoxDev",
+ "pos": [
+ 5100,
+ 3130
+ ],
+ "size": {
+ "0": 300,
+ "1": 170
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 85,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1656,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_INPUT",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1458,
+ 1657
+ ],
+ "shape": 3,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_OUTPUT",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "SeargeMagicBox"
+ },
+ "widgets_values": [
+ "none - skip",
+ "data stream",
+ "data stream"
+ ]
+ },
+ {
+ "id": 551,
+ "type": "Reroute",
+ "pos": [
+ 5400,
+ 2930
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 89,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1458,
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "SRG_DATA_STREAM",
+ "links": [],
+ "slot_index": 0,
+ "label": "debug"
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": false
+ },
+ "color": "#222",
+ "bgcolor": "#000"
+ },
+ {
+ "id": 519,
+ "type": "SeargeDebugPrinterDev",
+ "pos": [
+ 5500,
+ 2930
+ ],
+ "size": {
+ "0": 300,
+ "1": 120
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 7,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": null,
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "SeargeDebugPrinter"
+ },
+ "widgets_values": [
+ false,
+ "DONE"
+ ],
+ "color": "#222",
+ "bgcolor": "#000"
+ },
+ {
+ "id": 559,
+ "type": "Reroute",
+ "pos": [
+ -5700,
+ 3600
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 73,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1478,
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "IMAGE",
+ "links": [
+ 1472
+ ],
+ "label": "img",
+ "slot_index": 0
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": false
+ },
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 560,
+ "type": "Reroute",
+ "pos": [
+ -5600,
+ 3500
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 76,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1472,
+ "slot_index": 0,
+ "pos": [
+ 37.5,
+ 0
+ ]
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "IMAGE",
+ "links": [
+ 1473
+ ],
+ "label": "img",
+ "slot_index": 0
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": true
+ },
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 564,
+ "type": "Reroute",
+ "pos": [
+ -5900,
+ 3650
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 79,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1480,
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "IMAGE",
+ "links": [
+ 1481
+ ],
+ "label": "hr img",
+ "slot_index": 0
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": false
+ },
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 565,
+ "type": "Reroute",
+ "pos": [
+ -5700,
+ 3500
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 83,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1481,
+ "slot_index": 0,
+ "pos": [
+ 37.5,
+ 0
+ ]
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "IMAGE",
+ "links": [
+ 1482
+ ],
+ "label": "hr img",
+ "slot_index": 0
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": true
+ },
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 568,
+ "type": "Reroute",
+ "pos": [
+ -5300,
+ -1150
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 96,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1489,
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "IMAGE",
+ "links": [
+ 1484
+ ],
+ "label": "hr img",
+ "slot_index": 0
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": false
+ },
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 567,
+ "type": "Reroute",
+ "pos": [
+ -5300,
+ -1100
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 84,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1487,
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "IMAGE",
+ "links": [
+ 1483
+ ],
+ "label": "img"
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": false
+ },
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 566,
+ "type": "Reroute",
+ "pos": [
+ -5700,
+ -1400
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 87,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1482,
+ "slot_index": 0,
+ "pos": [
+ 37.5,
+ 0
+ ]
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "IMAGE",
+ "links": [
+ 1488
+ ],
+ "label": "hr img",
+ "slot_index": 0
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": true
+ },
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 569,
+ "type": "Reroute",
+ "pos": [
+ -5600,
+ -1350
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 92,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1488,
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "IMAGE",
+ "links": [
+ 1489
+ ],
+ "slot_index": 0,
+ "label": "hr img"
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": false
+ },
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 571,
+ "type": "Reroute",
+ "pos": [
+ 4600,
+ 3550
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 82,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1659,
+ "pos": [
+ 37.5,
+ 0
+ ],
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "IMAGE",
+ "links": [
+ 1613
+ ],
+ "label": "up img",
+ "slot_index": 0
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": true
+ },
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 573,
+ "type": "SeargeCustomAfterVaeDecodeDev",
+ "pos": [
+ 3100,
+ 3430
+ ],
+ "size": {
+ "0": 300,
+ "1": 70
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 69,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "custom_output",
+ "type": "SRG_STAGE_OUTPUT",
+ "link": 1616
+ }
+ ],
+ "outputs": [
+ {
+ "name": "latent_image",
+ "type": "IMAGE",
+ "links": [
+ 1646
+ ],
+ "shape": 3,
+ "slot_index": 0,
+ "label": "image"
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "SeargeCustomAfterVaeDecode"
+ },
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 590,
+ "type": "SeargePipelineTerminatorDev",
+ "pos": [
+ 5500,
+ 3130
+ ],
+ "size": {
+ "0": 300,
+ "1": 70
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 90,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1657,
+ "slot_index": 0
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "SeargePipelineTerminator"
+ },
+ "color": "#233",
+ "bgcolor": "#355"
+ },
+ {
+ "id": 610,
+ "type": "SeargeGenerationParametersDev",
+ "pos": [
+ 480,
+ 40
+ ],
+ "size": {
+ "0": 320,
+ "1": 300
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 27,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1566
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1567
+ ],
+ "shape": 3
+ }
+ ],
+ "title": "Generation Parameters",
+ "properties": {
+ "Node name for S&R": "SeargeGenerationParameters"
+ },
+ "widgets_values": [
+ 56421668291,
+ "increment",
+ "832x1216 (2:3)",
+ 1024,
+ 1024,
+ 30,
+ 7,
+ "1 - DPM++ 2M Karras",
+ "dpmpp_2m",
+ "karras",
+ 0.8
+ ],
+ "color": "#432",
+ "bgcolor": "#653"
+ },
+ {
+ "id": 612,
+ "type": "SeargeImageSavingDev",
+ "pos": [
+ 810,
+ 40
+ ],
+ "size": {
+ "0": 320,
+ "1": 300
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 30,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1567,
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1568
+ ],
+ "shape": 3,
+ "slot_index": 0
+ }
+ ],
+ "title": "Image Saving",
+ "properties": {
+ "Node name for S&R": "SeargeImageSaving"
+ },
+ "widgets_values": [
+ false,
+ "output/Searge-SDXL-%date%",
+ true,
+ true,
+ "generated",
+ true,
+ true,
+ "high-res",
+ true,
+ true,
+ "upscaled"
+ ],
+ "color": "#332922",
+ "bgcolor": "#593930"
+ },
+ {
+ "id": 611,
+ "type": "SeargeOperatingModeDev",
+ "pos": [
+ 480,
+ 380
+ ],
+ "size": {
+ "0": 320,
+ "1": 106
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 24,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1565
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1566
+ ],
+ "shape": 3,
+ "slot_index": 0
+ }
+ ],
+ "title": "Operating Mode",
+ "properties": {
+ "Node name for S&R": "SeargeOperatingMode"
+ },
+ "widgets_values": [
+ "text-to-image",
+ "default - all prompts",
+ 1
+ ],
+ "color": "#322",
+ "bgcolor": "#533"
+ },
+ {
+ "id": 613,
+ "type": "SeargeImage2ImageAndInpaintingDev",
+ "pos": [
+ 810,
+ 380
+ ],
+ "size": {
+ "0": 320,
+ "1": 106
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 33,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1568,
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1569
+ ],
+ "shape": 3,
+ "slot_index": 0
+ }
+ ],
+ "title": "Image to Image and Inpainting",
+ "properties": {
+ "Node name for S&R": "SeargeImage2ImageAndInpainting"
+ },
+ "widgets_values": [
+ 0.5,
+ 8,
+ "masked - full"
+ ],
+ "color": "#323",
+ "bgcolor": "#535"
+ },
+ {
+ "id": 609,
+ "type": "SeargeModelSelectorDev",
+ "pos": [
+ 1140,
+ 620
+ ],
+ "size": {
+ "0": 520,
+ "1": 110
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 38,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1572
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1573
+ ],
+ "shape": 3,
+ "slot_index": 0
+ }
+ ],
+ "title": "Model Selector",
+ "properties": {
+ "Node name for S&R": "SeargeModelSelector"
+ },
+ "widgets_values": [
+ "sd_xl_base_1.0_0.9vae.safetensors",
+ "sd_xl_refiner_1.0_0.9vae.safetensors",
+ "sdxl_vae.safetensors"
+ ],
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 468,
+ "type": "Note",
+ "pos": [
+ 1140,
+ 940
+ ],
+ "size": {
+ "0": 520,
+ "1": 120
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 8,
+ "mode": 0,
+ "title": "Workflow Information",
+ "properties": {
+ "text": ""
+ },
+ "widgets_values": [
+ " Searge-SDXL: EVOLVED Workflow for SDXL 1.0 | Version 3.991 updated on Aug 27, 2023\n\n !!! REQUIRES CUSTOM NODE EXTENSION: https://github.com/SeargeDP/SeargeSDXL !!!\n\n More information about using this workflow is next to the upscaled image preview -=>\n ( 1.25 x 1.2 = 1.5 | 1.5 x 1.333 = 2.0 )"
+ ],
+ "color": "#323",
+ "bgcolor": "#535"
+ },
+ {
+ "id": 619,
+ "type": "SeargeConditionMixingDev",
+ "pos": [
+ 2200,
+ 860
+ ],
+ "size": {
+ "0": 520,
+ "1": 200
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 41,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1575,
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1680
+ ],
+ "shape": 3,
+ "slot_index": 0
+ }
+ ],
+ "title": "Condition Mixing - not implemented",
+ "properties": {
+ "Node name for S&R": "SeargeConditionMixing"
+ },
+ "color": "#322",
+ "bgcolor": "#533"
+ },
+ {
+ "id": 616,
+ "type": "SeargeCustomPromptModeDev",
+ "pos": [
+ 2200,
+ 620
+ ],
+ "size": {
+ "0": 520,
+ "1": 200
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 40,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1574
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1575
+ ],
+ "shape": 3,
+ "slot_index": 0
+ }
+ ],
+ "title": "Custom Prompt Mode - not implemented",
+ "properties": {
+ "Node name for S&R": "SeargeCustomPromptMode"
+ },
+ "color": "#332922",
+ "bgcolor": "#593930"
+ },
+ {
+ "id": 527,
+ "type": "SeargeMagicBoxDev",
+ "pos": [
+ -1300,
+ 3130
+ ],
+ "size": {
+ "0": 300,
+ "1": 170
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 55,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1624
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_INPUT",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1626
+ ],
+ "shape": 3,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_OUTPUT",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "title": "CLIP Conditioning",
+ "properties": {
+ "Node name for S&R": "SeargeMagicBox"
+ },
+ "widgets_values": [
+ "clip conditioning",
+ "data stream",
+ "data stream"
+ ],
+ "color": "#232",
+ "bgcolor": "#353"
+ },
+ {
+ "id": 554,
+ "type": "SeargeCustomAfterVaeDecodeDev",
+ "pos": [
+ 2300,
+ 3430
+ ],
+ "size": {
+ "0": 300,
+ "1": 70
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 65,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "custom_output",
+ "type": "SRG_STAGE_OUTPUT",
+ "link": 1615
+ }
+ ],
+ "outputs": [
+ {
+ "name": "latent_image",
+ "type": "IMAGE",
+ "links": [
+ 1639
+ ],
+ "shape": 3,
+ "slot_index": 0,
+ "label": "image"
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "SeargeCustomAfterVaeDecode"
+ },
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 557,
+ "type": "Reroute",
+ "pos": [
+ 2600,
+ 3550
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 67,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1639,
+ "pos": [
+ 37.5,
+ 0
+ ],
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "IMAGE",
+ "links": [
+ 1476
+ ],
+ "label": "img"
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": true
+ },
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 558,
+ "type": "Reroute",
+ "pos": [
+ 2700,
+ 3600
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 70,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1476,
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "IMAGE",
+ "links": [
+ 1478
+ ],
+ "slot_index": 0,
+ "label": "img"
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": false
+ },
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 534,
+ "type": "SeargeMagicBoxDev",
+ "pos": [
+ 1900,
+ 3130
+ ],
+ "size": {
+ "0": 300,
+ "1": 170
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 63,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1638,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_INPUT",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1641
+ ],
+ "shape": 3,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_OUTPUT",
+ "links": [
+ 1615
+ ],
+ "shape": 3,
+ "slot_index": 1
+ }
+ ],
+ "title": "VAE Decode Sampled",
+ "properties": {
+ "Node name for S&R": "SeargeMagicBox"
+ },
+ "widgets_values": [
+ "vae decode sampled",
+ "data stream",
+ "custom stage & data stream"
+ ],
+ "color": "#232",
+ "bgcolor": "#353"
+ },
+ {
+ "id": 535,
+ "type": "SeargeMagicBoxDev",
+ "pos": [
+ 1500,
+ 3130
+ ],
+ "size": {
+ "0": 300,
+ "1": 170
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 62,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1635,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_INPUT",
+ "link": null
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1638
+ ],
+ "shape": 3,
+ "slot_index": 0
+ },
+ {
+ "name": "custom_stage",
+ "type": "SRG_STAGE_OUTPUT",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "title": "Latent Detailer",
+ "properties": {
+ "Node name for S&R": "SeargeMagicBox"
+ },
+ "widgets_values": [
+ "latent detailer",
+ "data stream",
+ "data stream"
+ ],
+ "color": "#232",
+ "bgcolor": "#353"
+ },
+ {
+ "id": 634,
+ "type": "SeargePreviewImageDev",
+ "pos": [
+ 2200,
+ 40
+ ],
+ "size": {
+ "0": 520,
+ "1": 540
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 109,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "images",
+ "type": "IMAGE",
+ "link": 1596,
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "images",
+ "type": "IMAGE",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "title": "Upscaled Preview Image",
+ "properties": {
+ "Node name for S&R": "SeargePreviewImage"
+ },
+ "widgets_values": [
+ true
+ ]
+ },
+ {
+ "id": 126,
+ "type": "Note",
+ "pos": [
+ 2730,
+ 40
+ ],
+ "size": {
+ "0": 520,
+ "1": 540
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 9,
+ "mode": 0,
+ "title": "Workflow Information",
+ "properties": {
+ "text": ""
+ },
+ "widgets_values": [
+ "\n Searge-SDXL v20230827.0815-beta-unstable-prerelease-0.007-sneak-preview-5\n\n [TODO: add description here]\n"
+ ],
+ "color": "#222",
+ "bgcolor": "#000"
+ },
+ {
+ "id": 635,
+ "type": "Reroute",
+ "pos": [
+ 1650,
+ -1050
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 108,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1595,
+ "pos": [
+ 37.5,
+ 0
+ ],
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "IMAGE",
+ "links": [
+ 1596
+ ],
+ "label": "up img",
+ "slot_index": 0
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": true
+ },
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 636,
+ "type": "Reroute",
+ "pos": [
+ 1500,
+ -1200
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 106,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1598,
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "IMAGE",
+ "links": [
+ 1595
+ ],
+ "label": "up img",
+ "slot_index": 0
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": false
+ },
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 637,
+ "type": "Reroute",
+ "pos": [
+ -5300,
+ -1200
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 104,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1599,
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "IMAGE",
+ "links": [
+ 1598
+ ],
+ "label": "up img",
+ "slot_index": 0
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": false
+ },
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 638,
+ "type": "Reroute",
+ "pos": [
+ -5800,
+ -1600
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 99,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1601,
+ "slot_index": 0,
+ "pos": [
+ 37.5,
+ 0
+ ]
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "IMAGE",
+ "links": [
+ 1600
+ ],
+ "label": "up img"
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": true
+ },
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 639,
+ "type": "Reroute",
+ "pos": [
+ -5700,
+ -1550
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 102,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1600,
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "IMAGE",
+ "links": [
+ 1599
+ ],
+ "slot_index": 0,
+ "label": "up img"
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": false
+ },
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 640,
+ "type": "Reroute",
+ "pos": [
+ -5800,
+ 3500
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 95,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1602,
+ "slot_index": 0,
+ "pos": [
+ 37.5,
+ 0
+ ]
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "IMAGE",
+ "links": [
+ 1601
+ ],
+ "slot_index": 0,
+ "label": "up img"
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": true
+ },
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 563,
+ "type": "Reroute",
+ "pos": [
+ 3400,
+ 3650
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 75,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1612,
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "IMAGE",
+ "links": [
+ 1480
+ ],
+ "label": "hr img",
+ "slot_index": 0
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": false
+ },
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 642,
+ "type": "Reroute",
+ "pos": [
+ 4600,
+ 3700
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 86,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1613,
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "IMAGE",
+ "links": [
+ 1603
+ ],
+ "slot_index": 0,
+ "label": "up img"
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": false
+ },
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 645,
+ "type": "Reroute",
+ "pos": [
+ 3400,
+ 3550
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 72,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1646,
+ "slot_index": 0,
+ "pos": [
+ 37.5,
+ 0
+ ]
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "IMAGE",
+ "links": [
+ 1612
+ ],
+ "label": "hr img",
+ "slot_index": 0
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": true
+ },
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 484,
+ "type": "SeargeSeparatorDev",
+ "pos": [
+ 480,
+ 520
+ ],
+ "size": {
+ "0": 650,
+ "1": 30
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 10,
+ "mode": 0,
+ "title": "Advanced settings are below, commonly used settings are above",
+ "properties": {
+ "Node name for S&R": "SeargeSeparator"
+ },
+ "color": "#222",
+ "bgcolor": "#000"
+ },
+ {
+ "id": 614,
+ "type": "SeargeConditioningParametersDev",
+ "pos": [
+ 480,
+ 590
+ ],
+ "size": {
+ "0": 320,
+ "1": 250
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 21,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1564
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1565
+ ],
+ "shape": 3,
+ "slot_index": 0
+ }
+ ],
+ "title": "Conditioning Parameters",
+ "properties": {
+ "Node name for S&R": "SeargeConditioningParameters"
+ },
+ "widgets_values": [
+ 2,
+ 1.5,
+ 2,
+ 1.5,
+ 0.75,
+ 6,
+ 2.5,
+ "gaussian",
+ 0.1
+ ],
+ "color": "#232",
+ "bgcolor": "#353"
+ },
+ {
+ "id": 618,
+ "type": "SeargeHighResolutionDev",
+ "pos": [
+ 810,
+ 590
+ ],
+ "size": {
+ "0": 320,
+ "1": 250
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 35,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1569,
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1570
+ ],
+ "shape": 3,
+ "slot_index": 0
+ }
+ ],
+ "title": "High Resolution",
+ "properties": {
+ "Node name for S&R": "SeargeHighResolution"
+ },
+ "widgets_values": [
+ "none",
+ "1.25x",
+ 0.25,
+ 0.1,
+ 0.5,
+ 0.1,
+ 0.2,
+ "none",
+ "none"
+ ],
+ "color": "#233",
+ "bgcolor": "#355"
+ },
+ {
+ "id": 615,
+ "type": "SeargeAdvancedParametersDev",
+ "pos": [
+ 480,
+ 880
+ ],
+ "size": {
+ "0": 320,
+ "1": 180
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 19,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1576
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1564
+ ],
+ "shape": 3,
+ "slot_index": 0
+ }
+ ],
+ "title": "Advanced Parameters (0 = disable)",
+ "properties": {
+ "Node name for S&R": "SeargeAdvancedParameters"
+ },
+ "widgets_values": [
+ "rescale",
+ 0.5,
+ 0.15,
+ 0.1,
+ 0.2,
+ "none"
+ ],
+ "color": "#2a363b",
+ "bgcolor": "#3f5159"
+ },
+ {
+ "id": 617,
+ "type": "SeargePromptStylesDev",
+ "pos": [
+ 810,
+ 880
+ ],
+ "size": {
+ "0": 320,
+ "1": 180
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 36,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1570,
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1571
+ ],
+ "shape": 3,
+ "slot_index": 0
+ }
+ ],
+ "title": "Prompt Styles - not implemented",
+ "properties": {
+ "Node name for S&R": "SeargePromptStyles"
+ },
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 522,
+ "type": "Reroute",
+ "pos": [
+ -4400,
+ 3050
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 48,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1420,
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1422
+ ],
+ "label": "data",
+ "slot_index": 0
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": false
+ },
+ "color": "#222",
+ "bgcolor": "#000"
+ },
+ {
+ "id": 521,
+ "type": "Reroute",
+ "pos": [
+ 4700,
+ 3050
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 47,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1643
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1420
+ ],
+ "label": "data"
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": false
+ },
+ "color": "#222",
+ "bgcolor": "#000"
+ },
+ {
+ "id": 648,
+ "type": "Reroute",
+ "pos": [
+ 4600,
+ 2900
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 46,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1642,
+ "pos": [
+ 37.5,
+ 0
+ ]
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1643
+ ],
+ "label": "data",
+ "slot_index": 0
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": true
+ },
+ "color": "#222",
+ "bgcolor": "#000"
+ },
+ {
+ "id": 649,
+ "type": "Reroute",
+ "pos": [
+ 4500,
+ 860
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 44,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1667
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1645
+ ],
+ "slot_index": 0,
+ "label": "data"
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": false
+ },
+ "color": "#222",
+ "bgcolor": "#000"
+ },
+ {
+ "id": 520,
+ "type": "Reroute",
+ "pos": [
+ 4600,
+ 1000
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 45,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1645,
+ "pos": [
+ 37.5,
+ 0
+ ]
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1642
+ ],
+ "slot_index": 0,
+ "label": "data"
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": true
+ },
+ "color": "#222",
+ "bgcolor": "#000"
+ },
+ {
+ "id": 641,
+ "type": "Reroute",
+ "pos": [
+ -6100,
+ 3700
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 91,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1603,
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "IMAGE",
+ "links": [
+ 1602
+ ],
+ "label": "up img",
+ "slot_index": 0
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": false
+ },
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 562,
+ "type": "Reroute",
+ "pos": [
+ -5600,
+ -1200
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 80,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1473,
+ "slot_index": 0,
+ "pos": [
+ 37.5,
+ 0
+ ]
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "IMAGE",
+ "links": [
+ 1487
+ ],
+ "label": "img"
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": true
+ },
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 666,
+ "type": "SeargePreviewImageDev",
+ "pos": [
+ 390,
+ 1200
+ ],
+ "size": {
+ "0": 300,
+ "1": 370
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 23,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "images",
+ "type": "IMAGE",
+ "link": 1671
+ }
+ ],
+ "outputs": [
+ {
+ "name": "images",
+ "type": "IMAGE",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "title": "Preprocessor Preview",
+ "properties": {
+ "Node name for S&R": "SeargePreviewImage"
+ },
+ "widgets_values": [
+ true
+ ],
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 658,
+ "type": "LoadImage",
+ "pos": [
+ 80,
+ 1200
+ ],
+ "size": {
+ "0": 300,
+ "1": 370
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 11,
+ "mode": 0,
+ "outputs": [
+ {
+ "name": "IMAGE",
+ "type": "IMAGE",
+ "links": [
+ 1670
+ ],
+ "shape": 3,
+ "slot_index": 0
+ },
+ {
+ "name": "MASK",
+ "type": "MASK",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "title": "Controlnet or Revision Source",
+ "properties": {
+ "Node name for S&R": "LoadImage"
+ },
+ "widgets_values": [
+ "example.png",
+ "image"
+ ],
+ "color": "#432",
+ "bgcolor": "#653"
+ },
+ {
+ "id": 668,
+ "type": "LoadImage",
+ "pos": [
+ 720,
+ 1200
+ ],
+ "size": {
+ "0": 300,
+ "1": 370
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 12,
+ "mode": 0,
+ "outputs": [
+ {
+ "name": "IMAGE",
+ "type": "IMAGE",
+ "links": [
+ 1672
+ ],
+ "shape": 3,
+ "slot_index": 0
+ },
+ {
+ "name": "MASK",
+ "type": "MASK",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "title": "Controlnet or Revision Source",
+ "properties": {
+ "Node name for S&R": "LoadImage"
+ },
+ "widgets_values": [
+ "example.png",
+ "image"
+ ],
+ "color": "#432",
+ "bgcolor": "#653"
+ },
+ {
+ "id": 667,
+ "type": "SeargePreviewImageDev",
+ "pos": [
+ 1030,
+ 1200
+ ],
+ "size": {
+ "0": 300,
+ "1": 370
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 26,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "images",
+ "type": "IMAGE",
+ "link": 1673
+ }
+ ],
+ "outputs": [
+ {
+ "name": "images",
+ "type": "IMAGE",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "title": "Preprocessor Preview",
+ "properties": {
+ "Node name for S&R": "SeargePreviewImage"
+ },
+ "widgets_values": [
+ true
+ ],
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 669,
+ "type": "LoadImage",
+ "pos": [
+ 1360,
+ 1200
+ ],
+ "size": {
+ "0": 300,
+ "1": 370
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 13,
+ "mode": 0,
+ "outputs": [
+ {
+ "name": "IMAGE",
+ "type": "IMAGE",
+ "links": [
+ 1674
+ ],
+ "shape": 3,
+ "slot_index": 0
+ },
+ {
+ "name": "MASK",
+ "type": "MASK",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "title": "Controlnet or Revision Source",
+ "properties": {
+ "Node name for S&R": "LoadImage"
+ },
+ "widgets_values": [
+ "example.png",
+ "image"
+ ],
+ "color": "#432",
+ "bgcolor": "#653"
+ },
+ {
+ "id": 670,
+ "type": "SeargePreviewImageDev",
+ "pos": [
+ 1670,
+ 1200
+ ],
+ "size": {
+ "0": 300,
+ "1": 370
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 29,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "images",
+ "type": "IMAGE",
+ "link": 1675
+ }
+ ],
+ "outputs": [
+ {
+ "name": "images",
+ "type": "IMAGE",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "title": "Preprocessor Preview",
+ "properties": {
+ "Node name for S&R": "SeargePreviewImage"
+ },
+ "widgets_values": [
+ true
+ ],
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 671,
+ "type": "LoadImage",
+ "pos": [
+ 2000,
+ 1200
+ ],
+ "size": {
+ "0": 300,
+ "1": 370
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 14,
+ "mode": 0,
+ "outputs": [
+ {
+ "name": "IMAGE",
+ "type": "IMAGE",
+ "links": [
+ 1676
+ ],
+ "shape": 3,
+ "slot_index": 0
+ },
+ {
+ "name": "MASK",
+ "type": "MASK",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "title": "Controlnet or Revision Source",
+ "properties": {
+ "Node name for S&R": "LoadImage"
+ },
+ "widgets_values": [
+ "example.png",
+ "image"
+ ],
+ "color": "#432",
+ "bgcolor": "#653"
+ },
+ {
+ "id": 672,
+ "type": "SeargePreviewImageDev",
+ "pos": [
+ 2310,
+ 1200
+ ],
+ "size": {
+ "0": 300,
+ "1": 370
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 32,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "images",
+ "type": "IMAGE",
+ "link": 1677
+ }
+ ],
+ "outputs": [
+ {
+ "name": "images",
+ "type": "IMAGE",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "title": "Preprocessor Preview",
+ "properties": {
+ "Node name for S&R": "SeargePreviewImage"
+ },
+ "widgets_values": [
+ true
+ ],
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 673,
+ "type": "LoadImage",
+ "pos": [
+ 2640,
+ 1200
+ ],
+ "size": {
+ "0": 300,
+ "1": 370
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 15,
+ "mode": 0,
+ "outputs": [
+ {
+ "name": "IMAGE",
+ "type": "IMAGE",
+ "links": [
+ 1678
+ ],
+ "shape": 3,
+ "slot_index": 0
+ },
+ {
+ "name": "MASK",
+ "type": "MASK",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "title": "Controlnet or Revision Source",
+ "properties": {
+ "Node name for S&R": "LoadImage"
+ },
+ "widgets_values": [
+ "example.png",
+ "image"
+ ],
+ "color": "#432",
+ "bgcolor": "#653"
+ },
+ {
+ "id": 647,
+ "type": "LoadImageMask",
+ "pos": [
+ -450,
+ 1100
+ ],
+ "size": {
+ "0": 400,
+ "1": 470
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 16,
+ "mode": 0,
+ "outputs": [
+ {
+ "name": "MASK",
+ "type": "MASK",
+ "links": [
+ 1660
+ ],
+ "shape": 3
+ }
+ ],
+ "title": "Upload Inpainting Mask (as grayscale image)",
+ "properties": {
+ "Node name for S&R": "LoadImageMask"
+ },
+ "widgets_values": [
+ "example.png",
+ "green",
+ "image"
+ ],
+ "color": "#233",
+ "bgcolor": "#355"
+ },
+ {
+ "id": 674,
+ "type": "SeargePreviewImageDev",
+ "pos": [
+ 2950,
+ 1200
+ ],
+ "size": {
+ "0": 300,
+ "1": 370
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 34,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "images",
+ "type": "IMAGE",
+ "link": 1679
+ }
+ ],
+ "outputs": [
+ {
+ "name": "images",
+ "type": "IMAGE",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "title": "Preprocessor Preview",
+ "properties": {
+ "Node name for S&R": "SeargePreviewImage"
+ },
+ "widgets_values": [
+ true
+ ],
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 676,
+ "type": "SeargeCustomAfterUpscalingDev",
+ "pos": [
+ 4300,
+ 3430
+ ],
+ "size": {
+ "0": 300,
+ "1": 70
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 78,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "custom_output",
+ "type": "SRG_STAGE_OUTPUT",
+ "link": 1658
+ }
+ ],
+ "outputs": [
+ {
+ "name": "image",
+ "type": "IMAGE",
+ "links": [
+ 1659
+ ],
+ "shape": 3,
+ "slot_index": 0
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "SeargeCustomAfterUpscaling"
+ },
+ "color": "#223",
+ "bgcolor": "#335"
+ },
+ {
+ "id": 620,
+ "type": "SeargeUpscaleModelsDev",
+ "pos": [
+ 1140,
+ 770
+ ],
+ "size": {
+ "0": 520,
+ "1": 130
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 37,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1571
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1572
+ ],
+ "shape": 3,
+ "slot_index": 0
+ }
+ ],
+ "title": "Upscale Models Selector",
+ "properties": {
+ "Node name for S&R": "SeargeUpscaleModels"
+ },
+ "widgets_values": [
+ "1x-ITF-SkinDiffDetail-Lite-v1.pth",
+ "4x_Nickelback_70000G.pth",
+ "4x-UltraSharp.pth",
+ "4x_NMKD-Siax_200k.pth"
+ ],
+ "color": "#432",
+ "bgcolor": "#653"
+ },
+ {
+ "id": 621,
+ "type": "SeargeLorasDev",
+ "pos": [
+ 1670,
+ 770
+ ],
+ "size": {
+ "0": 520,
+ "1": 290
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 39,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1573,
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1574
+ ],
+ "shape": 3,
+ "slot_index": 0
+ }
+ ],
+ "title": "Lora Selector",
+ "properties": {
+ "Node name for S&R": "SeargeLoras"
+ },
+ "widgets_values": [
+ "sd_xl_offset_example-lora_1.0.safetensors",
+ 0.5,
+ "none",
+ 0.5,
+ "none",
+ 0.5,
+ "none",
+ 0.5,
+ "none",
+ 0.5
+ ],
+ "color": "#2a363b",
+ "bgcolor": "#3f5159"
+ },
+ {
+ "id": 523,
+ "type": "Reroute",
+ "pos": [
+ -4300,
+ 3130
+ ],
+ "size": [
+ 75,
+ 26
+ ],
+ "flags": {
+ "pinned": true
+ },
+ "order": 49,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "",
+ "type": "*",
+ "link": 1422,
+ "slot_index": 0
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1665
+ ],
+ "slot_index": 0,
+ "label": "data"
+ }
+ ],
+ "properties": {
+ "showOutputText": false,
+ "horizontal": false
+ },
+ "color": "#222",
+ "bgcolor": "#000"
+ },
+ {
+ "id": 628,
+ "type": "SeargePipelineStartDev",
+ "pos": [
+ 4100,
+ 860
+ ],
+ "size": {
+ "0": 300,
+ "1": 140
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 43,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1681
+ },
+ {
+ "name": "additional_data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1668
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1667
+ ],
+ "shape": 3,
+ "slot_index": 0
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "SeargePipelineStart"
+ },
+ "widgets_values": [
+ "3.991-dev"
+ ],
+ "color": "#222",
+ "bgcolor": "#000"
+ },
+ {
+ "id": 626,
+ "type": "SeargeImageAdapterV2Dev",
+ "pos": [
+ -400,
+ 1630
+ ],
+ "size": {
+ "0": 300,
+ "1": 170
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 18,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": null
+ },
+ {
+ "name": "source_image",
+ "type": "IMAGE",
+ "link": 1587,
+ "slot_index": 1
+ },
+ {
+ "name": "image_mask",
+ "type": "MASK",
+ "link": 1588,
+ "slot_index": 2
+ },
+ {
+ "name": "uploaded_mask",
+ "type": "MASK",
+ "link": 1660,
+ "slot_index": 3
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1669
+ ],
+ "shape": 3,
+ "slot_index": 0
+ },
+ {
+ "name": "image_inputs",
+ "type": "SRG_DATA_STREAM",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "title": "Image Adapter",
+ "properties": {
+ "Node name for S&R": "SeargeImageAdapterV2"
+ },
+ "color": "#222",
+ "bgcolor": "#000"
+ },
+ {
+ "id": 622,
+ "type": "SeargePromptAdapterV2Dev",
+ "pos": [
+ -400,
+ -270
+ ],
+ "size": {
+ "0": 300,
+ "1": 170
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 17,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": null,
+ "slot_index": 0
+ },
+ {
+ "name": "main_prompt",
+ "type": "SRG_PROMPT_TEXT",
+ "link": 1577
+ },
+ {
+ "name": "secondary_prompt",
+ "type": "SRG_PROMPT_TEXT",
+ "link": 1578
+ },
+ {
+ "name": "style_prompt",
+ "type": "SRG_PROMPT_TEXT",
+ "link": 1579
+ },
+ {
+ "name": "negative_main_prompt",
+ "type": "SRG_PROMPT_TEXT",
+ "link": 1580
+ },
+ {
+ "name": "negative_secondary_prompt",
+ "type": "SRG_PROMPT_TEXT",
+ "link": 1581
+ },
+ {
+ "name": "negative_style_prompt",
+ "type": "SRG_PROMPT_TEXT",
+ "link": 1582
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1576
+ ],
+ "shape": 3,
+ "slot_index": 0
+ },
+ {
+ "name": "prompts",
+ "type": "SRG_DATA_STREAM",
+ "links": null,
+ "shape": 3
+ }
+ ],
+ "title": "Prompt Adapter",
+ "properties": {
+ "Node name for S&R": "SeargePromptAdapterV2"
+ },
+ "color": "#222",
+ "bgcolor": "#000"
+ },
+ {
+ "id": 683,
+ "type": "SeargeControlnetModelsDev",
+ "pos": [
+ 2730,
+ 860
+ ],
+ "size": {
+ "0": 520,
+ "1": 200
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 42,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1680
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1681
+ ],
+ "shape": 3,
+ "slot_index": 0
+ }
+ ],
+ "title": "Controlnet Models Selector",
+ "properties": {
+ "Node name for S&R": "SeargeControlnetModelsDev"
+ },
+ "widgets_values": [
+ "clip_vision_g.safetensors",
+ "control-lora-canny-rank256.safetensors",
+ "control-lora-depth-rank256.safetensors",
+ "control-lora-recolor-rank256.safetensors",
+ "control-lora-sketch-rank256.safetensors",
+ "none"
+ ],
+ "color": "#323",
+ "bgcolor": "#535"
+ },
+ {
+ "id": 678,
+ "type": "SeargeControlnetAdapterV2Dev",
+ "pos": [
+ 230,
+ 1630
+ ],
+ "size": {
+ "0": 310,
+ "1": 270
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 20,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1669
+ },
+ {
+ "name": "source_image",
+ "type": "IMAGE",
+ "link": 1670,
+ "slot_index": 1
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1664
+ ],
+ "shape": 3
+ },
+ {
+ "name": "preview",
+ "type": "IMAGE",
+ "links": [
+ 1671
+ ],
+ "shape": 3,
+ "slot_index": 1
+ }
+ ],
+ "title": "Controlnet and Revision Adapter",
+ "properties": {
+ "Node name for S&R": "SeargeControlnetAdapterV2Dev"
+ },
+ "widgets_values": [
+ "none",
+ true,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ false
+ ],
+ "color": "#323",
+ "bgcolor": "#535"
+ },
+ {
+ "id": 679,
+ "type": "SeargeControlnetAdapterV2Dev",
+ "pos": [
+ 870,
+ 1630
+ ],
+ "size": {
+ "0": 310,
+ "1": 270
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 22,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1664,
+ "slot_index": 0
+ },
+ {
+ "name": "source_image",
+ "type": "IMAGE",
+ "link": 1672,
+ "slot_index": 1
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1663
+ ],
+ "shape": 3
+ },
+ {
+ "name": "preview",
+ "type": "IMAGE",
+ "links": [
+ 1673
+ ],
+ "shape": 3,
+ "slot_index": 1
+ }
+ ],
+ "title": "Controlnet and Revision Adapter",
+ "properties": {
+ "Node name for S&R": "SeargeControlnetAdapterV2Dev"
+ },
+ "widgets_values": [
+ "none",
+ true,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ false
+ ],
+ "color": "#323",
+ "bgcolor": "#535"
+ },
+ {
+ "id": 680,
+ "type": "SeargeControlnetAdapterV2Dev",
+ "pos": [
+ 1510,
+ 1630
+ ],
+ "size": {
+ "0": 310,
+ "1": 270
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 25,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1663,
+ "slot_index": 0
+ },
+ {
+ "name": "source_image",
+ "type": "IMAGE",
+ "link": 1674,
+ "slot_index": 1
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1662
+ ],
+ "shape": 3
+ },
+ {
+ "name": "preview",
+ "type": "IMAGE",
+ "links": [
+ 1675
+ ],
+ "shape": 3,
+ "slot_index": 1
+ }
+ ],
+ "title": "Controlnet and Revision Adapter",
+ "properties": {
+ "Node name for S&R": "SeargeControlnetAdapterV2Dev"
+ },
+ "widgets_values": [
+ "none",
+ true,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ false
+ ],
+ "color": "#323",
+ "bgcolor": "#535"
+ },
+ {
+ "id": 681,
+ "type": "SeargeControlnetAdapterV2Dev",
+ "pos": [
+ 2150,
+ 1630
+ ],
+ "size": {
+ "0": 310,
+ "1": 270
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 28,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1662,
+ "slot_index": 0
+ },
+ {
+ "name": "source_image",
+ "type": "IMAGE",
+ "link": 1676,
+ "slot_index": 1
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1661
+ ],
+ "shape": 3
+ },
+ {
+ "name": "preview",
+ "type": "IMAGE",
+ "links": [
+ 1677
+ ],
+ "shape": 3,
+ "slot_index": 1
+ }
+ ],
+ "title": "Controlnet and Revision Adapter",
+ "properties": {
+ "Node name for S&R": "SeargeControlnetAdapterV2Dev"
+ },
+ "widgets_values": [
+ "none",
+ true,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ false
+ ],
+ "color": "#323",
+ "bgcolor": "#535"
+ },
+ {
+ "id": 682,
+ "type": "SeargeControlnetAdapterV2Dev",
+ "pos": [
+ 2790,
+ 1630
+ ],
+ "size": {
+ "0": 310,
+ "1": 270
+ },
+ "flags": {
+ "pinned": true
+ },
+ "order": 31,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "link": 1661,
+ "slot_index": 0
+ },
+ {
+ "name": "source_image",
+ "type": "IMAGE",
+ "link": 1678,
+ "slot_index": 1
+ }
+ ],
+ "outputs": [
+ {
+ "name": "data",
+ "type": "SRG_DATA_STREAM",
+ "links": [
+ 1668
+ ],
+ "shape": 3,
+ "slot_index": 0
+ },
+ {
+ "name": "preview",
+ "type": "IMAGE",
+ "links": [
+ 1679
+ ],
+ "shape": 3,
+ "slot_index": 1
+ }
+ ],
+ "title": "Controlnet and Revision Adapter",
+ "properties": {
+ "Node name for S&R": "SeargeControlnetAdapterV2Dev"
+ },
+ "widgets_values": [
+ "none",
+ true,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ false
+ ],
+ "color": "#323",
+ "bgcolor": "#535"
+ }
+ ],
+ "links": [
+ [
+ 424,
+ 98,
+ 0,
+ 130,
+ 6,
+ "FLOAT"
+ ],
+ [
+ 1399,
+ 498,
+ 0,
+ 19,
+ 0,
+ "IMAGE"
+ ],
+ [
+ 1400,
+ 499,
+ 0,
+ 463,
+ 0,
+ "IMAGE"
+ ],
+ [
+ 1401,
+ 497,
+ 0,
+ 499,
+ 0,
+ "*"
+ ],
+ [
+ 1402,
+ 500,
+ 0,
+ 498,
+ 0,
+ "*"
+ ],
+ [
+ 1404,
+ 502,
+ 0,
+ 87,
+ 0,
+ "IMAGE"
+ ],
+ [
+ 1407,
+ 503,
+ 0,
+ 497,
+ 0,
+ "*"
+ ],
+ [
+ 1420,
+ 521,
+ 0,
+ 522,
+ 0,
+ "*"
+ ],
+ [
+ 1422,
+ 522,
+ 0,
+ 523,
+ 0,
+ "*"
+ ],
+ [
+ 1458,
+ 544,
+ 0,
+ 551,
+ 0,
+ "*"
+ ],
+ [
+ 1472,
+ 559,
+ 0,
+ 560,
+ 0,
+ "*"
+ ],
+ [
+ 1473,
+ 560,
+ 0,
+ 562,
+ 0,
+ "*"
+ ],
+ [
+ 1476,
+ 557,
+ 0,
+ 558,
+ 0,
+ "*"
+ ],
+ [
+ 1478,
+ 558,
+ 0,
+ 559,
+ 0,
+ "*"
+ ],
+ [
+ 1480,
+ 563,
+ 0,
+ 564,
+ 0,
+ "*"
+ ],
+ [
+ 1481,
+ 564,
+ 0,
+ 565,
+ 0,
+ "*"
+ ],
+ [
+ 1482,
+ 565,
+ 0,
+ 566,
+ 0,
+ "*"
+ ],
+ [
+ 1483,
+ 567,
+ 0,
+ 502,
+ 0,
+ "*"
+ ],
+ [
+ 1484,
+ 568,
+ 0,
+ 503,
+ 0,
+ "*"
+ ],
+ [
+ 1487,
+ 562,
+ 0,
+ 567,
+ 0,
+ "*"
+ ],
+ [
+ 1488,
+ 566,
+ 0,
+ 569,
+ 0,
+ "*"
+ ],
+ [
+ 1489,
+ 569,
+ 0,
+ 568,
+ 0,
+ "*"
+ ],
+ [
+ 1564,
+ 615,
+ 0,
+ 614,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1565,
+ 614,
+ 0,
+ 611,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1566,
+ 611,
+ 0,
+ 610,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1567,
+ 610,
+ 0,
+ 612,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1568,
+ 612,
+ 0,
+ 613,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1569,
+ 613,
+ 0,
+ 618,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1570,
+ 618,
+ 0,
+ 617,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1571,
+ 617,
+ 0,
+ 620,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1572,
+ 620,
+ 0,
+ 609,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1573,
+ 609,
+ 0,
+ 621,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1574,
+ 621,
+ 0,
+ 616,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1575,
+ 616,
+ 0,
+ 619,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1576,
+ 622,
+ 0,
+ 615,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1577,
+ 3,
+ 0,
+ 622,
+ 1,
+ "SRG_PROMPT_TEXT"
+ ],
+ [
+ 1578,
+ 5,
+ 0,
+ 622,
+ 2,
+ "SRG_PROMPT_TEXT"
+ ],
+ [
+ 1579,
+ 6,
+ 0,
+ 622,
+ 3,
+ "SRG_PROMPT_TEXT"
+ ],
+ [
+ 1580,
+ 7,
+ 0,
+ 622,
+ 4,
+ "SRG_PROMPT_TEXT"
+ ],
+ [
+ 1581,
+ 8,
+ 0,
+ 622,
+ 5,
+ "SRG_PROMPT_TEXT"
+ ],
+ [
+ 1582,
+ 8,
+ 0,
+ 622,
+ 6,
+ "SRG_PROMPT_TEXT"
+ ],
+ [
+ 1587,
+ 268,
+ 0,
+ 626,
+ 1,
+ "IMAGE"
+ ],
+ [
+ 1588,
+ 269,
+ 1,
+ 626,
+ 2,
+ "MASK"
+ ],
+ [
+ 1594,
+ 87,
+ 0,
+ 86,
+ 0,
+ "IMAGE"
+ ],
+ [
+ 1595,
+ 636,
+ 0,
+ 635,
+ 0,
+ "*"
+ ],
+ [
+ 1596,
+ 635,
+ 0,
+ 634,
+ 0,
+ "IMAGE"
+ ],
+ [
+ 1597,
+ 502,
+ 0,
+ 500,
+ 0,
+ "*"
+ ],
+ [
+ 1598,
+ 637,
+ 0,
+ 636,
+ 0,
+ "*"
+ ],
+ [
+ 1599,
+ 639,
+ 0,
+ 637,
+ 0,
+ "*"
+ ],
+ [
+ 1600,
+ 638,
+ 0,
+ 639,
+ 0,
+ "*"
+ ],
+ [
+ 1601,
+ 640,
+ 0,
+ 638,
+ 0,
+ "*"
+ ],
+ [
+ 1602,
+ 641,
+ 0,
+ 640,
+ 0,
+ "*"
+ ],
+ [
+ 1603,
+ 642,
+ 0,
+ 641,
+ 0,
+ "*"
+ ],
+ [
+ 1612,
+ 645,
+ 0,
+ 563,
+ 0,
+ "*"
+ ],
+ [
+ 1613,
+ 571,
+ 0,
+ 642,
+ 0,
+ "*"
+ ],
+ [
+ 1615,
+ 534,
+ 1,
+ 554,
+ 0,
+ "SRG_STAGE_OUTPUT"
+ ],
+ [
+ 1616,
+ 538,
+ 1,
+ 573,
+ 0,
+ "SRG_STAGE_OUTPUT"
+ ],
+ [
+ 1619,
+ 537,
+ 0,
+ 506,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1620,
+ 506,
+ 0,
+ 524,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1622,
+ 524,
+ 0,
+ 525,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1623,
+ 525,
+ 0,
+ 526,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1624,
+ 526,
+ 0,
+ 527,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1626,
+ 527,
+ 0,
+ 528,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1627,
+ 528,
+ 0,
+ 529,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1628,
+ 529,
+ 0,
+ 530,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1629,
+ 530,
+ 0,
+ 531,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1631,
+ 531,
+ 0,
+ 532,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1632,
+ 532,
+ 0,
+ 533,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1635,
+ 533,
+ 0,
+ 535,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1638,
+ 535,
+ 0,
+ 534,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1639,
+ 554,
+ 0,
+ 557,
+ 0,
+ "*"
+ ],
+ [
+ 1641,
+ 534,
+ 0,
+ 536,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1642,
+ 520,
+ 0,
+ 648,
+ 0,
+ "*"
+ ],
+ [
+ 1643,
+ 648,
+ 0,
+ 521,
+ 0,
+ "*"
+ ],
+ [
+ 1645,
+ 649,
+ 0,
+ 520,
+ 0,
+ "*"
+ ],
+ [
+ 1646,
+ 573,
+ 0,
+ 645,
+ 0,
+ "*"
+ ],
+ [
+ 1647,
+ 536,
+ 0,
+ 538,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1650,
+ 540,
+ 0,
+ 541,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1651,
+ 539,
+ 0,
+ 540,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1653,
+ 538,
+ 0,
+ 539,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1654,
+ 541,
+ 0,
+ 542,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1655,
+ 542,
+ 0,
+ 543,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1656,
+ 543,
+ 0,
+ 544,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1657,
+ 544,
+ 0,
+ 590,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1658,
+ 541,
+ 1,
+ 676,
+ 0,
+ "SRG_STAGE_OUTPUT"
+ ],
+ [
+ 1659,
+ 676,
+ 0,
+ 571,
+ 0,
+ "*"
+ ],
+ [
+ 1660,
+ 647,
+ 0,
+ 626,
+ 3,
+ "MASK"
+ ],
+ [
+ 1661,
+ 681,
+ 0,
+ 682,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1662,
+ 680,
+ 0,
+ 681,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1663,
+ 679,
+ 0,
+ 680,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1664,
+ 678,
+ 0,
+ 679,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1665,
+ 523,
+ 0,
+ 537,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1667,
+ 628,
+ 0,
+ 649,
+ 0,
+ "*"
+ ],
+ [
+ 1668,
+ 682,
+ 0,
+ 628,
+ 1,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1669,
+ 626,
+ 0,
+ 678,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1670,
+ 658,
+ 0,
+ 678,
+ 1,
+ "IMAGE"
+ ],
+ [
+ 1671,
+ 678,
+ 1,
+ 666,
+ 0,
+ "IMAGE"
+ ],
+ [
+ 1672,
+ 668,
+ 0,
+ 679,
+ 1,
+ "IMAGE"
+ ],
+ [
+ 1673,
+ 679,
+ 1,
+ 667,
+ 0,
+ "IMAGE"
+ ],
+ [
+ 1674,
+ 669,
+ 0,
+ 680,
+ 1,
+ "IMAGE"
+ ],
+ [
+ 1675,
+ 680,
+ 1,
+ 670,
+ 0,
+ "IMAGE"
+ ],
+ [
+ 1676,
+ 671,
+ 0,
+ 681,
+ 1,
+ "IMAGE"
+ ],
+ [
+ 1677,
+ 681,
+ 1,
+ 672,
+ 0,
+ "IMAGE"
+ ],
+ [
+ 1678,
+ 673,
+ 0,
+ 682,
+ 1,
+ "IMAGE"
+ ],
+ [
+ 1679,
+ 682,
+ 1,
+ 674,
+ 0,
+ "IMAGE"
+ ],
+ [
+ 1680,
+ 619,
+ 0,
+ 683,
+ 0,
+ "SRG_DATA_STREAM"
+ ],
+ [
+ 1681,
+ 683,
+ 0,
+ 628,
+ 0,
+ "SRG_DATA_STREAM"
+ ]
+ ],
+ "groups": [],
+ "config": {},
+ "extra": {},
+ "version": 0.4
+}
\ No newline at end of file