├── .github └── workflows │ └── publish.yml ├── .gitignore ├── LICENSE ├── README.md ├── __init__.py ├── cyclist.py ├── js └── cyclist.js ├── pyproject.toml ├── screenshots ├── Interrupt_message.png ├── LoopManager.png └── New_Cycle_button.png ├── util_nodes.py └── workflows ├── CatStack.json ├── CatStack.png ├── CatStackNoUE.json ├── ChimeraMaker.json ├── ChimeraMaker.png ├── GenUntilGood.json ├── GenUntilGood.png ├── GenUntilGoodNoWAS.json ├── GenUntilGoodNoWAS.png ├── GenUntilRight.json ├── GenUntilRight.png ├── LoRABurnTest.json ├── LoRABurnTest.png ├── MultiplePersons.json ├── MultiplePersons.png ├── README.md ├── TimeLimit.json ├── TimeLimit.png ├── UpscaleToMegapixels.json ├── UpscaleToMegapixels.png ├── UpscaleToResolution.json └── UpscaleToResolution.png /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish to Comfy registry 2 | on: 3 | workflow_dispatch: 4 | push: 5 | branches: 6 | - main 7 | paths: 8 | - "pyproject.toml" 9 | 10 | jobs: 11 | publish-node: 12 | name: Publish Custom Node to registry 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Check out code 16 | uses: actions/checkout@v4 17 | - name: Publish Custom Node 18 | uses: Comfy-Org/publish-node-action@main 19 | with: 20 | ## Add your own personal access token to your Github Repository secrets and reference it here. 21 | personal_access_token: ${{ secrets.REGISTRY_ACCESS_TOKEN }} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__/ 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Pos13 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Cyclist :bicyclist: 2 | 3 | [ComfyUI](https://github.com/comfyanonymous/ComfyUI) already has an option to infinitely repeat a workflow. This extension adds an ability to reuse generated results to cycle over them again and again. With this tool, you can automate whatever iterative loop action you have in mind: building grids, animating frame-by-frame, changing conditions every step, etc. 4 | 5 | > [!WARNING] 6 | > This repository is archived, because I am not going to support it. The extension probably still works on your version of ComfyUI, at least partially. 7 | 8 | ## General Usage 9 | 10 | 1. Put a loading node where you want to provide a result from previous run. 11 | - Optionally, connect a fallback input in case nothing is there to load yet (usually, at first iteration). 12 | 2. Put a saving node in the end of your workflow. 13 | 3. Put an **Interrupt** node if you want to stop generation when certain conditions are met. 14 | 4. Done! Press "_Queue Prompt_". And again. And again, maybe. 15 | - Optionally, check "_Extra options_" and "_Auto Queue_" checkboxes to let ComfyUI infinitely repeat a workflow by itself.[^1] 16 | - If you want to start a loop from scratch, press the "_New Cycle_" button introduced in this workflow. It will increment all filenames and loop IDs, if it can.[^2]. Alternatively, use **Loop Manager** to do this automatically. 17 | 18 | ![Screenshot of ComfyUI options with "New Cycle" button.](https://github.com/Pos13/comfyui-cyclist/blob/main/screenshots/New_Cycle_button.png) 19 | 20 | > [!WARNING] 21 | > Check [Known Issues](#known-issues) at the bottom of this page to learn about non-obvious behaviour. 22 | 23 | ## Installation 24 | 25 | __Option 1__: Use [ComfyUI Manager](https://github.com/ltdrdata/ComfyUI-Manager). 26 | 27 | __Option 2__: 28 | - Install git 29 | - Navigate to your `/ComfyUI/custom_nodes/` folder 30 | - Run `git clone https://github.com/Pos13/comfyui-cyclist/` console command in it 31 | 32 | ## Nodes and example workflows 33 | 34 | **Loop Manager**: Simply provides a string. This string — loop_id — can be used as a name of a variable to put into memory, or as a filename. If the "_increment_" value is set on "_by_interrupt_node_", loop_id will automatically change when **Interrupt** node procs, to prevent overriding end result. If the "_increment_" value is set on "_on_any_interrupt_", loop_id will change in the same situation, plus when you manually cancel queue. Useful to skip failures. 35 | 36 | ![Loop Manager](https://github.com/Pos13/comfyui-cyclist/blob/main/screenshots/LoopManager.png) 37 | 38 | **Memorize Int/Float/String**: These simple nodes save something in memory. Information is lost if you restart ComfyUI. Variables are exclusive to provided loop ID. You can store exactly one Int, one Float, one String and one Conditioning for every loop ID. Change ID to save a new variable of this type. 39 | 40 | **Recall Int/Float/String**: These nodes are for loading information from memory. If nothing is there, fallback input is used instead. Fallback is optional. Example: 41 | 42 |
43 | ${\color{blue}Workflow\ to\ generate\ an\ image\ until\ it\ gets\ a\ high\ score}$ 44 | 45 | Every time an image is generated, it gets a score made by [Image Reward Score](https://github.com/ZaneA/ComfyUI-ImageReward) node. Score is saved by **Memorize Float** node. Next gen, it's loaded and compared to user-provided target score. If greater, process is stopped. 46 | 47 | ![Workflow to generate Image until it gets a high score](https://github.com/Pos13/comfyui-cyclist/blob/main/workflows/GenUntilGoodNoWAS.png) 48 | 49 |

50 | 51 | **Convert To**: Takes any input and tries to output an int, float, boolean and string representation of it. Boolean and string can always be cast into, but incorrect int or float will raise an error. 52 | 53 | **Compare Anything**: Takes two inputs of any kinds and a compare operation. Outputs True or False boolean value. 54 | - Integers are compared as usual. 55 | - Floats are compared with 1-09 is precision. 56 | - Strings are compared alphabetically. 57 | - Images and latents are compared by total pixel amount across whole batch. 58 | - Everything else is casted to string before comparison. 59 | - If types are different, it tries to cast inputs into the same type in this order: to boolean, to float, to string. 60 | 61 | **Int/Float Math**: Just a handfull of arithmetic operations betwen two numbers. 62 | 63 |
64 | ${\color{blue}Workflow\ to\ generate\ an\ image\ until\ it\ gets\ a\ high\ score,\ but\ always\ save\ the\ best\ attempt}$ 65 | 66 | This is slightly modified version of the workflow above. Not a score is saved, but an image. Every new run it is compared with a new image to let [WAS Node Suite](https://github.com/WASasquatch/was-node-suite-comfyui) to choose the best. 67 | 68 | - **Convert To** node is used to cast boolean -> float -> number, as WAS only work with number representation of boolean. 69 | - **Compare Anything** node compares float scores. 70 | - **Float Math** node is used to provide float constant, as Primitive node can't be connected to unspecified input. "Adding zero" just outputs upper value. 71 | 72 | ![Workflow to generate Image until it gets a high score, but always save best attempt](https://github.com/Pos13/comfyui-cyclist/blob/main/workflows/GenUntilGood.png) 73 | 74 |

75 | 76 | **Recall/Memorize Conditioning**: Works the same way other Recall/Memorize nodes work. It stores conditioning to memory, not to disc. 77 | 78 |
79 | ${\color{blue}Workflow\ to\ generate\ ugly\ animal\ crossbreeds}$ 80 | 81 | [Impact Pack](https://github.com/ltdrdata/ComfyUI-Impact-Pack) is used to generate random animal words. These words are used to add a new conditioning for an image. 82 | 83 | Don't use _Auto Queue_ here! You'd probably want to click "_Queue Prompt_" manually, and press "_New Cycle_" whenever result is already good enough. 84 | 85 | ![Workflow to generate ugly animal crossbreeds](https://github.com/Pos13/comfyui-cyclist/blob/main/workflows/ChimeraMaker.png) 86 | 87 |

88 | 89 | **Interrupt**: Put this onto any link, output is unchanged "_any_in_" input.[^3] When this node is activated by workflow, it stops it if "_stop_" input is true. You can convert "_stop_" from widget to input with right-clicking the node. 90 | 91 | Be aware where you put **Interrupt** node! You want it to prevent some heavy computing, so place it in the way of any thing required for such computing. Also, you can only place it _after_ the nodes used to provide "_any_in_" or "_stop_" inputs, because ComfyUI will not execute a workflow with a loop. 92 | 93 | The best place for **Interrupt** node is right after important "Reload/Recall" node. 94 | 95 | Multiple **Interrupt** nodes are allowed, and sometimes wanted.[^4] 96 | 97 | Triggered **Interrupt** will show this message: 98 | 99 | ![Interrupt message](screenshots/Interrupt_message.png) 100 | 101 | **Save Image (Override)**: This node works similarly to default Save Image node, but filename remains the same, without counter. It saves image to your output folder![^5] 102 | 103 | **Reload Image**: Loads image by filename, from "_\ComfyUI\output_" folder. If file does not exists, fallback input is used instead. Fallback is optional. Image is loaded in RGBA, with transparency channel.[^6] 104 | 105 |
106 | ${\color{blue}Workflow\ to\ generate\ an\ image\ until\ right\ things\ are\ recognised}$ 107 | 108 | Before generating a new image, "BLIP Interrogate" node from [WAS Node Suite](https://github.com/WASasquatch/was-node-suite-comfyui) tries to analyze previous result. If answers are right, generation stops. 109 | 110 | Workflow page at civitai: [https://civitai.com/models/342128](https://civitai.com/models/342128) 111 | 112 | ![Workflow to generate image until right things are recognised](https://github.com/Pos13/comfyui-cyclist/blob/main/workflows/GenUntilRight.png) 113 | 114 |

115 | 116 | **Save Model (Override)**: This node works similarly to default Save Model node, but filename remains the same, without counter. It saves model to your default `models/checkpoints` folder! 117 | 118 |
119 | ${\color{blue}Workflow\ to\ apply\ LoRAs\ to\ the\ model\ until\ it\ breaks}$ 120 | 121 | This workflow is for testing model's LoRA compatibility. Apply more and more random LoRAS. Applied LoRA's names are saved in images' filenames. [WAS Node Suite](https://github.com/WASasquatch/was-node-suite-comfyui) is used. 122 | 123 | Don't use _Auto Queue_ here! You'd probably want to click "_Queue Prompt_" manually, and press "_New Cycle_" whenever result is already ~~good~~ bad enough. 124 | 125 | ![Workflow to apply LoRAs to the model until it breaks](https://github.com/Pos13/comfyui-cyclist/blob/main/workflows/LoRABurnTest.png) 126 | 127 |

128 | 129 | **Save Latent (Override)**: This node works similarly to default Save Latent node, but filename remains the same, without counter. It saves latent file to your output/latent folder! 130 | 131 |
132 | ${\color{blue}Workflow\ to\ gradually\ upscale\ image\ until\ megapixel\ count\ is\ met}$ 133 | 134 | This workflow uses latent upscale by x1.375 times over and over, until image becomes big enough. You'd want to set megapixel count according to your VRAM and patience amount. [WAS Node Suite](https://github.com/WASasquatch/was-node-suite-comfyui) is used to calculate latent size. 135 | 136 | Notice disabled nodes! Enable them only after the whole cycle is done to save time and not calculate intermediate results. Enabling them will not disrupt normal cycle flow in any way. No early interrupts, no extra iterations. 137 | 138 | ![Workflow to gradually upscale image until megapixel count is met](https://github.com/Pos13/comfyui-cyclist/blob/main/workflows/UpscaleToMegapixels.png) 139 | 140 |

141 | 142 | **Generation Timer**: This node measures time spent on generation. Outputs floats. 143 | - Timer starts right before every generation, when workflow is checked. 144 | - Timer stops when the last "Save/Memorize" node in the workflow procs. 145 | 146 | Mutiple **Generation Timers** can be used, but you better assign them to different loops.[^7][^8] 147 | 148 | **Force Timer Stop**: This node tells the timer to stop whenever any input is provided, no matter what. You can use it to measure time spent by certain blocks, not the whole workflow. But the start is always at generation start. 149 | 150 | **Force Timer Stop** node is not necessary to use **Generation Timer**, as long as you have any "Save/Memorize" node. 151 | 152 |
153 | ${\color{blue}Workflow\ that\ works\ for\ certain\ amount\ of\ time}$ 154 | 155 | This is almost a default ComfyUI workflow! Just set amount of time you want your PC to work generating images, check "_Extra options_" and "_Auto Queue_" checkboxes, and press "_Queue Prompt_" button. 156 | 157 | Workflow page at civitai: [https://civitai.com/models/342065](https://civitai.com/models/342065) 158 | 159 | ![Workflow that works for certain amount of time](https://github.com/Pos13/comfyui-cyclist/blob/main/workflows/TimeLimit.png) 160 | 161 |

162 | 163 | ## Other workflows 164 | 165 |
166 | ${\color{blue}Workflow\ to\ evenly\ upscale\ to\ exact\ resolution}$ 167 | 168 | Set a width and height, and image will upscale to it. But not in one go: it calculates how many iterations should be made to not add too many pixels to width or height, and performs exactly that many iterations. You can gradually change denoise, CFG scale and steps count from first to last iterations. Uses [pythongosssss' Custom Scripts](https://github.com/pythongosssss/ComfyUI-Custom-Scripts) for math and display. 169 | 170 | It's a little wild :sweat_smile:. 171 | 172 | ![Workflow to evenly upscale to exact resolution](https://github.com/Pos13/comfyui-cyclist/blob/main/workflows/UpscaleToResolution.png) 173 | 174 |

175 | 176 |
177 | ${\color{blue}Workflow\ to\ stack\ cats}$ 178 | 179 | SDXL Turbo is used to make the amount of very noisy cats _fast_. They pile on noisy background one-by-one, top to bottom. After the cycle is done, unmute the top group of node to generate final result. 180 | 181 | [Use Everywhere](https://github.com/chrisgoringe/cg-use-everywhere) nodes hide links. Version without is [exists](https://github.com/Pos13/comfyui-cyclist/blob/main/workflows/CatStackNoUE.json), but it's messy. 182 | 183 | ![Workflow to stack cats](https://github.com/Pos13/comfyui-cyclist/blob/main/workflows/CatStack.png) 184 | 185 |

186 | 187 | > [!NOTE] 188 | > All example workflows (and more) can be found in the [workflows folder](workflows/). But for possible updates, comments and questions about workflows you better navigate to my [Civitai page](https://civitai.com/user/Postpos/models). 189 | 190 | ## Known Issues 191 | 192 | [^1]: For now, "_Auto Queue_" checkbox unchecks automatically on interrupt. This prevents accidental short-circuits. Yes, you have to check it back manually every time you start a new cycle. 193 | [^2]: Pressing "_New Cycle_" button will change a string in every "_filename_" and "_loop_id_" widget. It also will detect Primitives connected to them, and update them too. But nothing else. It will not update the string provided by any type of "String Const" or "String Op" or "Recall String" node. 194 | [^3]: Reroutes and Primitives don't work well with unspecified inputs. It is possible to juggle them to set different input and output types on **Interrupt** node. It's on you to not to. 195 | [^4]: Bypassing **Interrupt** node does not work. Just disconnect "_stop_" input instead. 196 | [^5]: Image batches are not supported yet. It's planned. 197 | [^6]: Some nodes don't support RGBA (**Upscale Image (Using Model)**, for example). You can use **Images to RGB** node from [WAS Node Suite](https://github.com/WASasquatch/was-node-suite-comfyui) to fix that. 198 | [^7]: **Generation Timer** does not output the same time intervals as ComfyUI does. It doesn't account for anything happening before **Generation Timer** node is checked and after the last "Save/Memorize" (or assigned **Force Timer Stop** node) is executed. 199 | [^8]: **Generation Timer** only works if "_loop_id_" is in widget form, not input. I can't get around this limitition. 200 | -------------------------------------------------------------------------------- /__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | @author: Pos13 3 | @title: Cyclist 4 | @nickname: comfyui-cyclist 5 | @description: This extension provides tools to iterate generation results between runs. In general, it's for cycles. 6 | """ 7 | 8 | #import inspect 9 | from .cyclist import * 10 | from .util_nodes import * 11 | 12 | WEB_DIRECTORY = "./js" 13 | NODE_CLASS_MAPPINGS = { 14 | "LoopManager": LoopManager, 15 | "Interrupt": CyclistInterrupt, 16 | 17 | "ReloadImage": ReloadImage, 18 | "OverrideImage": OverrideImage, 19 | "ReloadLatent": ReloadLatent, 20 | "OverrideLatent": OverrideLatent, 21 | "ReloadModel": ReloadModel, 22 | "OverrideModel": OverrideModel, 23 | 24 | "RecallString": RecallString, 25 | "MemorizeString": MemorizeString, 26 | "RecallInt": RecallInt, 27 | "MemorizeInt": MemorizeInt, 28 | "RecallFloat": RecallFloat, 29 | "MemorizeFloat": MemorizeFloat, 30 | "RecallConditioning": RecallConditioning, 31 | "MemorizeConditioning": MemorizeConditioning, 32 | 33 | "CyclistMathInt": CyclistMathInt, 34 | "CyclistMathFloat": CyclistMathFloat, 35 | "CyclistTypeCast": CyclistTypeCast, 36 | "CyclistCompare": CyclistCompare, 37 | "CyclistTimer": CyclistTimer, 38 | "CyclistTimerStop": CyclistTimerStop 39 | } 40 | NODE_DISPLAY_NAME_MAPPINGS = { 41 | "LoopManager": "Loop Manager", 42 | "Interrupt": "Interrupt", 43 | "RecallString": "Recall String", 44 | "MemorizeString": "Memorize String", 45 | "RecallInt": "Recall Int", 46 | "MemorizeInt": "Memorize Int", 47 | "RecallFloat": "Recall Float", 48 | "MemorizeFloat": "Memorize Float", 49 | "RecallConditioning": "Recall Conditioning", 50 | "MemorizeConditioning": "Memorize Conditioning", 51 | "ReloadLatent": "Reload Latent", 52 | "OverrideLatent": "Save Latent (Override)", 53 | "ReloadImage": "Reload Image", 54 | "OverrideImage": "Save Image (Override)", 55 | "ReloadModel": "Reload Model", 56 | "OverrideModel": "Save Model (Override)", 57 | "CyclistTimer": "Generation Timer", 58 | "CyclistTimerStop": "Force Timer Stop", 59 | "CyclistMathFloat": "Float Math", 60 | "CyclistMathInt": "Int Math", 61 | "CyclistTypeCast": "Convert to", 62 | "CyclistCompare": "Compare Anything" 63 | } 64 | # Sadly, this automatic mapping is abandoned for Manager compatibility 65 | """NODE_CLASS_MAPPINGS = {} 66 | 67 | for name, obj in (list(reversed(inspect.getmembers(cyclist))) + inspect.getmembers(util_nodes)): 68 | if inspect.isclass(obj): 69 | if hasattr(obj, 'NODE_NAME'): 70 | node_name = getattr(obj, 'NODE_NAME', name) 71 | NODE_CLASS_MAPPINGS[node_name] = obj""" 72 | 73 | __all__ = ['NODE_CLASS_MAPPINGS', 'NODE_DISPLAY_NAME_MAPPINGS', 'WEB_DIRECTORY'] 74 | -------------------------------------------------------------------------------- /js/cyclist.js: -------------------------------------------------------------------------------- 1 | import { app } from "../../../scripts/app.js"; 2 | import { api } from "../../../scripts/api.js"; 3 | import { $el } from "../../../scripts/ui.js"; 4 | import { ComfyButton } from "../../../scripts/ui/components/button.js"; 5 | import { ComfyWidgets } from "../../../scripts/widgets.js"; 6 | 7 | var cyclist_states = {} 8 | 9 | function drawBadge(ctx, text, color="green") { 10 | if (text) { 11 | // Badge in pythongosssss/WD14 style 12 | ctx.save() 13 | ctx.font = "12px sans-serif" 14 | const sz = ctx.measureText(text) 15 | ctx.fillStyle = color 16 | ctx.beginPath() 17 | ctx.roundRect(0, -LiteGraph.NODE_TITLE_HEIGHT - 20, sz.width + 12, 20, 5) 18 | ctx.fill() 19 | ctx.fillStyle = "white" 20 | ctx.fillText(text, 6, -LiteGraph.NODE_TITLE_HEIGHT - 6) 21 | ctx.restore() 22 | } 23 | } 24 | 25 | app.registerExtension({ 26 | name: "comfyui.cyclist", 27 | async setup() { 28 | function replace_counter(str) { 29 | let counter = str.match(/\d+$/) 30 | if (counter) return str.replace(/\d+$/, String(parseInt(counter) + 1)) 31 | else return str + "_2"; 32 | } 33 | 34 | function InterruptListener(event) { 35 | let show_popup = false // Should be extra sure it will not trigger if not working with cycles 36 | let popup_text = "" 37 | if (cyclist_states["InterruptMessage"]) { 38 | show_popup = true 39 | popup_text = cyclist_states["InterruptMessage"] 40 | } 41 | for (var node_index in app.graph._nodes) { 42 | let node = app.graph._nodes[node_index] 43 | if (node.type === "LoopManager") { 44 | let increment = "never" 45 | let inc_widget = node.widgets?.find((w) => w.name === 'increment') 46 | if (inc_widget) { 47 | increment = inc_widget.value 48 | } 49 | else if (cyclist_states["LoopManagerNode" + String(node.id)]) { 50 | increment = cyclist_states["LoopManagerNode" + String(node.id)] 51 | } 52 | if (increment && (increment === "on_any_interrupt" || cyclist_states["InterruptMessage"] && increment === "by_interrupt_node")) { 53 | let id_widget = node.widgets?.find((w) => w.name === 'loop_id') 54 | if (id_widget) { 55 | let new_value = replace_counter(id_widget.value) 56 | show_popup = true 57 | if (popup_text != "") popup_text += "\n" 58 | popup_text += "loop_id changed: \"" + id_widget.value + "\" -> \"" + new_value + "\"" 59 | id_widget.value = new_value 60 | } 61 | } 62 | } 63 | } 64 | cyclist_states["InterruptMessage"] = null 65 | if (show_popup) app.ui.dialog.show(popup_text) 66 | } 67 | api.addEventListener("execution_interrupted", InterruptListener); 68 | 69 | function popupMessageHandler(event) { 70 | if (event.detail.stop) { 71 | //app.ui.dialog.show(event.detail.message) 72 | cyclist_states["InterruptMessage"] = event.detail.message 73 | cyclist_states["InterruptNode"+app.runningNodeId] = "Interrupt was here!" 74 | if (app.ui.autoQueueMode === "instant") { 75 | // Prevent short circuit in "insant" mode: queue, interrupt, queue, interrupt... 76 | app.ui.autoQueueEnabled = false 77 | let auto_queue_checkbox = document.getElementById("autoQueueCheckbox") 78 | if(auto_queue_checkbox) auto_queue_checkbox.checked = false 79 | } 80 | let auto_queue_new_radio = document.getElementsByClassName("comfyui-queue-mode") 81 | if (auto_queue_new_radio) { 82 | document.querySelector('div.comfyui-queue-mode input[value=""]').click(); 83 | } 84 | } 85 | else { 86 | cyclist_states["InterruptMessage"] = null 87 | cyclist_states["InterruptNode"+app.runningNodeId] = null 88 | } 89 | } 90 | api.addEventListener("cyclist.message.popup", popupMessageHandler); 91 | 92 | function updateTimerHandler(event) { 93 | let postfix = event.detail.mode.charAt(0) 94 | let rounding = 2 95 | if (event.detail.mode === "milliseconds") rounding = 0; 96 | let last_time = `${event.detail.last_time.toFixed(rounding)}${postfix}` 97 | let total_time = `${event.detail.total_time.toFixed(rounding)}${postfix}` 98 | cyclist_states[event.detail.loop_id+".LoopTimer"] = `${last_time} | ${total_time}` 99 | } 100 | api.addEventListener("cyclist.timer.update", updateTimerHandler); 101 | 102 | const btns = document.querySelector(".comfy-menu-btns") 103 | $el("button", { 104 | id: "cyclist-new-cycle-button", 105 | textContent: "New Cycle", 106 | parent: btns, 107 | onclick: newCycle 108 | }); 109 | const newCycleButton = new ComfyButton({ 110 | content: "New Cycle (cyclist)", 111 | icon: "recycle", 112 | tooltip: "New Cycle (cyclist)", 113 | classList: "comfyui-button comfyui-cyclist-new-cycle-button", 114 | action: () => newCycle(), 115 | }); 116 | if (typeof app.menu?.viewGroup !== 'undefined' && app.menu?.viewGroup !== null) { 117 | app.menu.viewGroup.append(newCycleButton) 118 | } 119 | async function newCycle() { 120 | let already_incremented = [] 121 | for (var node_index in app.graph._nodes) { 122 | let c_node = app.graph._nodes[node_index] 123 | let c_node_prototype = Object.getPrototypeOf(c_node) 124 | if (c_node_prototype.IS_CYCLIST_IO) { 125 | // - if it's disconnected or widget - increment loop id 126 | // - if connected to other node - don't increment 127 | // - except it's Primitive or Const - increment that node's widget directly 128 | let new_value = "" 129 | let connected = false 130 | if (c_node && c_node.inputs) { 131 | let loop_input = c_node.inputs.find((i) => i.name === "loop_id" || i.name === "filename"); 132 | if (loop_input && loop_input.link) { 133 | let loop_link = app.graph.links[loop_input.link] 134 | if (loop_link) { 135 | let origin_node = app.graph._nodes_by_id[loop_link.origin_id] 136 | if (origin_node && origin_node.type === "PrimitiveNode") { 137 | let value_widget = origin_node?.widgets.find((w) => w.name === "value") 138 | new_value = replace_counter(value_widget.value) 139 | if (!already_incremented.includes(loop_link.origin_id)) { 140 | value_widget.value = new_value 141 | already_incremented.push(loop_link.origin_id) 142 | origin_node.onResize?.(origin_node.size) // Redraw 143 | } 144 | } else { 145 | connected = true 146 | } 147 | } 148 | } 149 | } 150 | let loop_id_widget = c_node?.widgets.find((w) => w.name === "loop_id" || w.name === "filename"); 151 | if (!connected && loop_id_widget && !already_incremented.includes(c_node.id)) { 152 | if (new_value === "") new_value = replace_counter(loop_id_widget.value); 153 | loop_id_widget.value = new_value 154 | already_incremented.push(c_node.id) 155 | c_node.onResize?.(c_node.size) 156 | } 157 | } 158 | } 159 | } 160 | }, 161 | 162 | async beforeRegisterNodeDef(nodeType, nodeData, app) { 163 | function getLoopID(node) { 164 | let loop_id_widget = node.widgets?.find((w) => w.name === 'loop_id') 165 | if (!loop_id_widget) loop_id_widget = node.widgets?.find((w) => w.name === 'filename'); 166 | let loop_id_input = node.inputs?.find((i) => i.name === 'loop_id') 167 | if (!loop_id_input) loop_id_input = node.inputs?.find((i) => i.name === 'filename') 168 | if (loop_id_input) { 169 | if (!loop_id_input.link) return null 170 | let loop_link = app.graph.links[loop_id_input.link] 171 | if (!loop_link) return null 172 | let origin_node = node 173 | do { 174 | origin_node = app.graph._nodes_by_id[loop_link.origin_id] 175 | if (origin_node && origin_node.type === "PrimitiveNode") { 176 | loop_id_widget = origin_node?.widgets.find((w) => w.name === "value") 177 | } 178 | if (origin_node && origin_node.type === "LoopManager") { 179 | loop_id_widget = origin_node?.widgets.find((w) => w.name === "loop_id") 180 | } 181 | if (origin_node && origin_node.type === "Reroute") { 182 | loop_id_input = origin_node.inputs[0] 183 | if (!loop_id_input.link) return null 184 | loop_link = app.graph.links[loop_id_input.link] 185 | if (!loop_link) return null 186 | } 187 | } while (origin_node.type === "Reroute"); 188 | } 189 | if (loop_id_widget) return loop_id_widget.value; 190 | return null 191 | }; 192 | if (nodeData.name === "LoopManager") { 193 | nodeType.prototype.IS_CYCLIST_IO = true 194 | 195 | const onExecuted = nodeType.prototype.onExecuted 196 | nodeType.prototype.onExecuted = function (message) { 197 | onExecuted?.apply(this, arguments) 198 | 199 | let memory_widget = this.widgets?.find((w) => w.name === 'memory_content') 200 | if (!memory_widget) { 201 | const new_widget = ComfyWidgets["STRING"](this, "memory_content", ["STRING", { multiline: true }], app).widget 202 | new_widget.inputEl.readOnly = true 203 | new_widget.inputEl.style.opacity = 0.6 204 | //new_widget.value = message.memory_content[0] 205 | //this.addCustomWidget(new_widget) 206 | 207 | memory_widget = this.widgets?.find((w) => w.name === 'memory_content') 208 | } 209 | if (memory_widget) memory_widget.value = message.memory_content[0]; 210 | this.onResize?.(this.size); 211 | 212 | cyclist_states["LoopManagerNode" + String(this.id)] = message.increment[0] 213 | }; 214 | 215 | nodeType.prototype.computeSize = () => [220, 100] // Hardcoded min width/height 216 | }; 217 | if (nodeData.category === "cyclist/Write") { 218 | nodeType.prototype.IS_CYCLIST_IO = true 219 | 220 | const onExecuted = nodeType.prototype.onExecuted; 221 | nodeType.prototype.onExecuted = function (message) { 222 | onExecuted?.apply(this, arguments) 223 | let state = "Iteration: " + String(message.counter[0]) 224 | //let state_id_node = String(this.id) 225 | //cyclist_states[state_id_node] = state 226 | 227 | let to_memory_input = this.inputs?.find((i) => i.name === "to_memory") 228 | if (!to_memory_input && this.inputs && this.inputs.length > 0) to_memory_input = this.inputs[0]; 229 | if (to_memory_input) { 230 | let state_id_loop = message.loop_id[0] + "." + to_memory_input.type 231 | cyclist_states[state_id_loop] = state 232 | } 233 | 234 | for (var node_index in app.graph._nodes) { 235 | if (app.graph._nodes[node_index].type === "LoopManager") { 236 | let memory_widget = app.graph._nodes[node_index].widgets?.find((w) => w.name === 'memory_content') 237 | if (memory_widget) memory_widget.value = message.memory_content[0] 238 | } 239 | } 240 | }; 241 | const onDrawForeground = nodeType.prototype.onDrawForeground; 242 | nodeType.prototype.onDrawForeground = function (ctx) { 243 | const r = onDrawForeground?.apply?.(this, arguments) 244 | 245 | let loop_id = getLoopID(this) 246 | let to_memory_input = this.inputs?.find((i) => i.name === "to_memory") 247 | if (!to_memory_input && this.inputs && this.inputs.length > 0) to_memory_input = this.inputs[0]; 248 | if (loop_id && to_memory_input) drawBadge(ctx, cyclist_states[loop_id + "." + to_memory_input.type]) 249 | //if (!state) state = cyclist_states[String(this.id)] 250 | 251 | return r 252 | } 253 | } 254 | if (nodeData.category === "cyclist/Read") { 255 | nodeType.prototype.IS_CYCLIST_IO = true 256 | 257 | const onDrawForeground = nodeType.prototype.onDrawForeground; 258 | nodeType.prototype.onDrawForeground = function (ctx) { 259 | const r = onDrawForeground?.apply?.(this, arguments) 260 | 261 | let loop_id = getLoopID(this) 262 | let to_memory_output = null 263 | if (this.outputs && this.outputs.length > 0) to_memory_output = this.outputs[0]; 264 | if (loop_id && to_memory_output) drawBadge(ctx, cyclist_states[loop_id + "." + to_memory_output.type]) 265 | //if (!state) state = cyclist_states[String(this.id)] 266 | 267 | return r 268 | } 269 | } 270 | if (nodeData.name === "CyclistTimer") { 271 | nodeType.prototype.IS_CYCLIST_IO = true 272 | 273 | const onDrawForeground = nodeType.prototype.onDrawForeground; 274 | nodeType.prototype.onDrawForeground = function (ctx) { 275 | const r = onDrawForeground?.apply?.(this, arguments) 276 | 277 | let loop_id = getLoopID(this) 278 | if (loop_id) drawBadge(ctx, cyclist_states[loop_id + ".LoopTimer"]) 279 | //if (!state) state = cyclist_states[String(this.id)] 280 | 281 | return r 282 | } 283 | } 284 | if (nodeData.name === "CyclistTimerStop") { 285 | nodeType.prototype.IS_CYCLIST_IO = true 286 | } 287 | if (nodeData.name === "Interrupt") { 288 | const onDrawForeground = nodeType.prototype.onDrawForeground; 289 | nodeType.prototype.onDrawForeground = function (ctx) { 290 | const r = onDrawForeground?.apply?.(this, arguments) 291 | 292 | let state = null 293 | if (cyclist_states["InterruptNode"+this.id]) state = cyclist_states["InterruptNode"+this.id]; 294 | let stop_widget = this.widgets?.find((w) => w.name === 'stop') 295 | let stop_input = this.inputs.find((i) => i.name === "stop"); 296 | if (stop_widget && !stop_input) { 297 | if (stop_widget.value === true) state = "Will interrupt!"; 298 | else state = null 299 | } 300 | 301 | drawBadge(ctx, state, "red") 302 | 303 | return r 304 | } 305 | 306 | nodeType.prototype.computeSize = () => [150, 60] // Hardcoded min width/height 307 | 308 | const onConnectionsChange = nodeType.prototype.onConnectionsChange; 309 | // type: input/output=1/2; index=0/1/2/...; connected: connect/disconnect=true/false; link_info.origin_id=other node id 310 | nodeType.prototype.onConnectionsChange = function (type, index, connected, link_info) { 311 | if (index === 0) { 312 | let input = this.inputs[0] 313 | let output = this.outputs[0] 314 | 315 | function Reset(input, output) { 316 | if (input) { 317 | input.type = "*" 318 | } 319 | if (output) { 320 | output.type = "*" 321 | output.name = "*" 322 | } 323 | } 324 | 325 | if ((type === LiteGraph.OUTPUT && !input.link) || (type === LiteGraph.INPUT && (!output.links || output.links.length === 0))) { 326 | // Return to default on full disconnect 327 | if (!connected) { 328 | Reset(input, output) 329 | } else { 330 | // New input, empty output 331 | if (type === LiteGraph.INPUT) { 332 | try { 333 | let app_link = app.graph.links[input.link] 334 | let input_node = app.graph.getNodeById(app_link.origin_id) 335 | let node_output_slot = input_node.outputs[app_link.origin_slot] 336 | let new_type = node_output_slot.type 337 | output.type = new_type 338 | output.name = new_type 339 | } catch (error) { 340 | Reset(null, output) 341 | } 342 | // New output, empty input 343 | } else { 344 | try { 345 | let app_link = app.graph.links[link_info.id] 346 | let output_node = app.graph.getNodeById(app_link.target_id) 347 | let node_input_slot = output_node.inputs[app_link.target_slot] 348 | let new_type = node_input_slot.type 349 | input.type = new_type 350 | } catch (error) { 351 | Reset(input, null) 352 | } 353 | } 354 | } 355 | } 356 | input.color_on = LGraphCanvas.link_type_colors[input.type] 357 | output.color_on = LGraphCanvas.link_type_colors[output.type] 358 | } 359 | return onConnectionsChange?.apply(this, arguments); 360 | } 361 | } 362 | }, 363 | 364 | async nodeCreated(node, app) { 365 | if (node.comfyClass === "Interrupt") node.setSize([150, 60]); 366 | } 367 | }) -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "comfyui-cyclist" 3 | description = "This extension provides tools to iterate generation results between runs. In general, it's for cycles." 4 | version = "1.0.0" 5 | license = { file = "LICENSE" } 6 | 7 | [project.urls] 8 | Repository = "https://github.com/Pos13/comfyui-cyclist" 9 | # Used by Comfy Registry https://comfyregistry.org 10 | 11 | [tool.comfy] 12 | PublisherId = "pos13" 13 | DisplayName = "comfyui-cyclist" 14 | Icon = "" 15 | -------------------------------------------------------------------------------- /screenshots/Interrupt_message.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pos13/comfyui-cyclist/6b6accd84fcd69cb6b04e7f6b500a90c28171fca/screenshots/Interrupt_message.png -------------------------------------------------------------------------------- /screenshots/LoopManager.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pos13/comfyui-cyclist/6b6accd84fcd69cb6b04e7f6b500a90c28171fca/screenshots/LoopManager.png -------------------------------------------------------------------------------- /screenshots/New_Cycle_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pos13/comfyui-cyclist/6b6accd84fcd69cb6b04e7f6b500a90c28171fca/screenshots/New_Cycle_button.png -------------------------------------------------------------------------------- /util_nodes.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import logging 3 | import math 4 | import torch 5 | 6 | class CyclistMathFloat: 7 | """Node for simple floating point math operations between two vars. Does not check if values are safe to math.""" 8 | 9 | @classmethod 10 | def INPUT_TYPES(s): 11 | return { "required": { "operation": (["addition", "subtraction", "multiplication", "division", "exponentiation", "max", "min"],), 12 | "float_1": ("FLOAT", {"default": 1.0, "min": -sys.float_info.max, "max": sys.float_info.max, "step": 0.01, "round": False, "display": "number"}), 13 | "float_2": ("FLOAT", {"default": 1.0, "min": -sys.float_info.max, "max": sys.float_info.max, "step": 0.01, "round": False, "display": "number"})}} 14 | 15 | RETURN_TYPES = ("FLOAT", ) 16 | FUNCTION = "calc" 17 | CATEGORY = "cyclist/Utilities" 18 | 19 | #NODE_NAME = "Float Math" 20 | 21 | def calc(self, operation, float_1, float_2): 22 | if operation == "addition": 23 | return (float_1 + float_2,) 24 | elif operation == "subtraction": 25 | return (float_1 - float_2,) 26 | elif operation == "multiplication": 27 | return (float_1 * float_2,) 28 | elif operation == "division": 29 | return (float_1 / float_2,) 30 | elif operation == "exponentiation": 31 | return (float_1 ** float_2,) 32 | elif operation == "max": 33 | if float_1 > float_2: 34 | return (float_1,) 35 | else: 36 | return (float_2,) 37 | elif operation == "min": 38 | if float_1 < float_2: 39 | return (float_1,) 40 | else: 41 | return (float_2,) 42 | else: 43 | raise Exception("Float math operation is not in the list") 44 | return (1.0,) 45 | 46 | class CyclistMathInt: 47 | """Node for simple integer math operations between two vars. Does not check if values are safe to math. Works as python operations.""" 48 | 49 | @classmethod 50 | def INPUT_TYPES(s): 51 | return { "required": { "operation": (["addition", "subtraction", "multiplication", "floor division", "modulo", "exponentiation", "max", "min"],), 52 | "int_1": ("INT", {"default": 1, "min": -sys.maxsize, "max": sys.maxsize}), 53 | "int_2": ("INT", {"default": 1, "min": -sys.maxsize, "max": sys.maxsize})}} 54 | 55 | RETURN_TYPES = ("INT", ) 56 | FUNCTION = "calc" 57 | CATEGORY = "cyclist/Utilities" 58 | 59 | #NODE_NAME = "Int Math" 60 | 61 | def calc(self, operation, int_1, int_2): 62 | if operation == "addition": 63 | return (int_1 + int_2,) 64 | elif operation == "subtraction": 65 | return (int_1 - int_2,) 66 | elif operation == "multiplication": 67 | return (int_1 * int_2,) 68 | elif operation == "floor division": 69 | return (int_1 // int_2,) 70 | elif operation == "modulo": 71 | return (int_1 % int_2,) 72 | elif operation == "exponentiation": 73 | return (int_1 ** int_2,) 74 | elif operation == "max": 75 | if int_1 > int_2: 76 | return (int_1,) 77 | else: 78 | return (int_2,) 79 | elif operation == "min": 80 | if int_1 < int_2: 81 | return (int_1,) 82 | else: 83 | return (int_2,) 84 | else: 85 | raise Exception("Int math operation is not in the list") 86 | return (0,) 87 | 88 | # 'required' input can't be '*', unless it can. Thanks, @pythongossss 89 | class AnyType(str): 90 | def __ne__(self, __value: object) -> bool: 91 | return False 92 | 93 | class CyclistTypeCast: 94 | """Tries to cast any input into str, int, float and bool. Int returns mathematically rounded. Float and int return None on fails.""" 95 | 96 | @classmethod 97 | def INPUT_TYPES(s): 98 | return {"required": {"anything": (AnyType("*"), )}} 99 | 100 | RETURN_TYPES = ("STRING", "INT", "FLOAT", "BOOLEAN") 101 | FUNCTION = "cast" 102 | CATEGORY = "cyclist/Utilities" 103 | 104 | #NODE_NAME = "Convert to" 105 | 106 | def cast(self, anything): 107 | res_str, res_int, res_float, res_bool = my_cast(anything) 108 | if res_int is None: 109 | logging.warn(f"Can't cast {type(anything)} to int") 110 | if res_float is None: 111 | logging.warn(f"Can't cast {type(anything)} to float") 112 | return res_str, res_int, res_float, res_bool 113 | 114 | def my_cast(anything): 115 | try: 116 | result_float = float(anything) 117 | result_int = int(round(result_float)) 118 | except: 119 | result_float = None 120 | result_int = None 121 | try: 122 | result_bool = bool(anything) 123 | except: 124 | if anything is None: 125 | result_bool = False 126 | else: 127 | result_bool = True 128 | return (str(anything), result_int, result_float, result_bool) 129 | 130 | class CyclistCompare: 131 | """Tries to compare any two inputs. If different types provided, they would be cast to equal types. Order of prefered casts: bool, float, str.""" 132 | 133 | @classmethod 134 | def INPUT_TYPES(s): 135 | return { "required": {"condition": (["equals", "not equals", "greater than", "less than", "greater or equals", "less or equals"],), 136 | "thing1": (AnyType("*"), ), 137 | "thing2": (AnyType("*"), )}} 138 | 139 | RETURN_TYPES = ("BOOLEAN", ) 140 | FUNCTION = "compare" 141 | CATEGORY = "cyclist/Utilities" 142 | 143 | #NODE_NAME = "Compare Anything" 144 | 145 | def compare(self, condition, thing1, thing2): 146 | str1, int1, float1, bool1 = my_cast(thing1) 147 | str2, int2, float2, bool2 = my_cast(thing2) 148 | if torch.is_tensor(thing1): 149 | tensor1 = thing1 150 | elif isinstance(thing1, dict) and "samples" in thing1 and torch.is_tensor(thing1["samples"]): 151 | tensor1 = thing1["samples"] 152 | else: 153 | tensor1 = None 154 | if torch.is_tensor(thing2): 155 | tensor2 = thing2 156 | elif isinstance(thing2, dict) and "samples" in thing2 and torch.is_tensor(thing2["samples"]): 157 | tensor2 = thing2["samples"] 158 | else: 159 | tensor2 = None 160 | 161 | if isinstance(thing1, bool) or isinstance(thing2, bool): 162 | return (self.compare_bool(bool1, bool2, condition), ) 163 | elif isinstance(thing1, str) or isinstance(thing2, str): 164 | if not float1 is None and not float2 is None: 165 | return (self.compare_float(float1, float2, condition), ) 166 | else: 167 | return (self.compare_str(str1, str2, condition), ) 168 | elif isinstance(thing1, float) or isinstance(thing2, float): 169 | return (self.compare_float(float1, float2, condition), ) 170 | elif isinstance(thing1, int) and isinstance(thing2, int): 171 | return (self.compare_int(int1, int2, condition), ) 172 | elif not tensor1 is None and not tensor2 is None: 173 | if (tensor1.dim() == 4 and tensor1.size()[1] != 4) or (tensor2.dim() == 4 and tensor2.size()[1] != 4): 174 | return (self.compare_tensors(tensor1, tensor2, condition, as_images=True), ) # Assume at least one is image 175 | else: 176 | return (self.compare_tensors(tensor1, tensor2, condition), ) 177 | else: 178 | try: 179 | if condition == "equals": 180 | result = thing1 == thing2 181 | elif condition == "not equals": 182 | result = thing1 != thing2 183 | elif condition == "greater than": 184 | result = thing1 > thing2 185 | elif condition == "less than": 186 | result = thing1 < thing2 187 | elif condition == "greater or equals": 188 | result = thing1 >= thing2 189 | elif condition == "less or equals": 190 | result = thing1 <= thing2 191 | else: 192 | raise Exception("Compare operation is not in the list") 193 | if not isinstance(result, bool): 194 | raise Exception("Comparison ends in a non-boolean return") 195 | return (result, ) 196 | except: 197 | logging.warn("'Compare Anything' node doesn't really know how to compare these inputs, so it falls back to compare string representations.") 198 | return (self.compare_str(str1, str2, condition), ) 199 | 200 | def compare_bool(self, a, b, condition): 201 | if condition == "equals": 202 | return a == b 203 | elif condition == "not equals": 204 | return a != b 205 | elif condition == "greater than": 206 | return a == True and b == False 207 | elif condition == "less than": 208 | return a == False and b == True 209 | elif condition == "greater or equals": 210 | return True 211 | elif condition == "less or equals": 212 | return True 213 | else: 214 | raise Exception("Compare operation is not in the list") 215 | 216 | def compare_str(self, a, b, condition): 217 | if condition == "equals": 218 | return a == b 219 | elif condition == "not equals": 220 | return a != b 221 | elif condition == "greater than": 222 | return a > b 223 | elif condition == "less than": 224 | return a < b 225 | elif condition == "greater or equals": 226 | return a >= b 227 | elif condition == "less or equals": 228 | return a <= b 229 | else: 230 | raise Exception("Compare operation is not in the list") 231 | 232 | def compare_float(self, a, b, condition): 233 | if condition == "equals": 234 | return math.isclose(a, b) 235 | elif condition == "not equals": 236 | return not math.isclose(a, b) 237 | elif condition == "greater than": 238 | return a > b 239 | elif condition == "less than": 240 | return a < b 241 | elif condition == "greater or equals": 242 | return a >= b or math.isclose(a, b) 243 | elif condition == "less or equals": 244 | return a <= b or math.isclose(a, b) 245 | else: 246 | raise Exception("Compare operation is not in the list") 247 | 248 | def compare_int(self, a, b, condition): 249 | if condition == "equals": 250 | return a == b 251 | elif condition == "not equals": 252 | return a != b 253 | elif condition == "greater than": 254 | return a > b 255 | elif condition == "less than": 256 | return a < b 257 | elif condition == "greater or equals": 258 | return a >= b 259 | elif condition == "less or equals": 260 | return a <= b 261 | else: 262 | raise Exception("Compare operation is not in the list") 263 | 264 | def compare_tensors(self, a, b, condition, as_images=False): 265 | if condition == "equals": 266 | return torch.equal(a, b) 267 | elif condition == "not equals": 268 | return not torch.equal(a, b) 269 | else: 270 | size1 = 1 271 | if as_images: 272 | all_sizes1 = a.size()[:3] # Only comparing pixels count, not channels count 273 | else: 274 | all_sizes1 = a.size() 275 | for i in all_sizes1: 276 | size1 *= i 277 | size2 = 1 278 | if as_images: 279 | all_sizes2 = b.size()[:3] # Only comparing pixels count, not channels count 280 | else: 281 | all_sizes2 = b.size() 282 | for i in all_sizes2: 283 | size2 *= i 284 | 285 | if condition == "greater than": 286 | return size1 > size2 287 | elif condition == "less than": 288 | return size1 < size2 289 | elif condition == "greater or equals": 290 | return size1 > size2 or torch.equal(a, b) 291 | elif condition == "less or equals": 292 | return size1 < size2 or torch.equal(a, b) 293 | else: 294 | raise Exception("Compare operation is not in the list") -------------------------------------------------------------------------------- /workflows/CatStack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pos13/comfyui-cyclist/6b6accd84fcd69cb6b04e7f6b500a90c28171fca/workflows/CatStack.png -------------------------------------------------------------------------------- /workflows/ChimeraMaker.json: -------------------------------------------------------------------------------- 1 | { 2 | "last_node_id": 86, 3 | "last_link_id": 153, 4 | "nodes": [ 5 | { 6 | "id": 26, 7 | "type": "Reroute", 8 | "pos": [ 9 | 890, 10 | 20 11 | ], 12 | "size": [ 13 | 82, 14 | 26 15 | ], 16 | "flags": {}, 17 | "order": 4, 18 | "mode": 0, 19 | "inputs": [ 20 | { 21 | "name": "", 22 | "type": "*", 23 | "link": 28 24 | } 25 | ], 26 | "outputs": [ 27 | { 28 | "name": "MODEL", 29 | "type": "MODEL", 30 | "links": [ 31 | 29 32 | ], 33 | "slot_index": 0 34 | } 35 | ], 36 | "properties": { 37 | "showOutputText": true, 38 | "horizontal": false 39 | } 40 | }, 41 | { 42 | "id": 25, 43 | "type": "Reroute", 44 | "pos": [ 45 | 1205, 46 | 60 47 | ], 48 | "size": [ 49 | 75, 50 | 26 51 | ], 52 | "flags": {}, 53 | "order": 8, 54 | "mode": 0, 55 | "inputs": [ 56 | { 57 | "name": "", 58 | "type": "*", 59 | "link": 26 60 | } 61 | ], 62 | "outputs": [ 63 | { 64 | "name": "VAE", 65 | "type": "VAE", 66 | "links": [ 67 | 27 68 | ], 69 | "slot_index": 0 70 | } 71 | ], 72 | "properties": { 73 | "showOutputText": true, 74 | "horizontal": false 75 | } 76 | }, 77 | { 78 | "id": 5, 79 | "type": "EmptyLatentImage", 80 | "pos": [ 81 | 520, 82 | 410 83 | ], 84 | "size": { 85 | "0": 210, 86 | "1": 110 87 | }, 88 | "flags": {}, 89 | "order": 0, 90 | "mode": 0, 91 | "outputs": [ 92 | { 93 | "name": "LATENT", 94 | "type": "LATENT", 95 | "links": [ 96 | 120 97 | ], 98 | "slot_index": 0 99 | } 100 | ], 101 | "title": "Size", 102 | "properties": { 103 | "Node name for S&R": "EmptyLatentImage" 104 | }, 105 | "widgets_values": [ 106 | 512, 107 | 512, 108 | 1 109 | ], 110 | "color": "#223", 111 | "bgcolor": "#335" 112 | }, 113 | { 114 | "id": 3, 115 | "type": "KSampler", 116 | "pos": [ 117 | 1000, 118 | 130 119 | ], 120 | "size": { 121 | "0": 280, 122 | "1": 262 123 | }, 124 | "flags": {}, 125 | "order": 12, 126 | "mode": 0, 127 | "inputs": [ 128 | { 129 | "name": "model", 130 | "type": "MODEL", 131 | "link": 29 132 | }, 133 | { 134 | "name": "positive", 135 | "type": "CONDITIONING", 136 | "link": 138 137 | }, 138 | { 139 | "name": "negative", 140 | "type": "CONDITIONING", 141 | "link": 6 142 | }, 143 | { 144 | "name": "latent_image", 145 | "type": "LATENT", 146 | "link": 120 147 | } 148 | ], 149 | "outputs": [ 150 | { 151 | "name": "LATENT", 152 | "type": "LATENT", 153 | "links": [ 154 | 7 155 | ], 156 | "slot_index": 0 157 | } 158 | ], 159 | "properties": { 160 | "Node name for S&R": "KSampler" 161 | }, 162 | "widgets_values": [ 163 | 618650275299421, 164 | "randomize", 165 | 18, 166 | 4.5, 167 | "euler_ancestral", 168 | "normal", 169 | 1 170 | ] 171 | }, 172 | { 173 | "id": 7, 174 | "type": "CLIPTextEncode", 175 | "pos": [ 176 | 520, 177 | 290 178 | ], 179 | "size": { 180 | "0": 210, 181 | "1": 76 182 | }, 183 | "flags": {}, 184 | "order": 6, 185 | "mode": 0, 186 | "inputs": [ 187 | { 188 | "name": "clip", 189 | "type": "CLIP", 190 | "link": 5 191 | } 192 | ], 193 | "outputs": [ 194 | { 195 | "name": "CONDITIONING", 196 | "type": "CONDITIONING", 197 | "links": [ 198 | 6 199 | ], 200 | "slot_index": 0 201 | } 202 | ], 203 | "title": "Negative", 204 | "properties": { 205 | "Node name for S&R": "CLIPTextEncode" 206 | }, 207 | "widgets_values": [ 208 | "pencil sketch, black and white, greyscale" 209 | ], 210 | "color": "#232", 211 | "bgcolor": "#353" 212 | }, 213 | { 214 | "id": 8, 215 | "type": "VAEDecode", 216 | "pos": [ 217 | 1310, 218 | 130 219 | ], 220 | "size": { 221 | "0": 140, 222 | "1": 50 223 | }, 224 | "flags": {}, 225 | "order": 14, 226 | "mode": 0, 227 | "inputs": [ 228 | { 229 | "name": "samples", 230 | "type": "LATENT", 231 | "link": 7 232 | }, 233 | { 234 | "name": "vae", 235 | "type": "VAE", 236 | "link": 27 237 | } 238 | ], 239 | "outputs": [ 240 | { 241 | "name": "IMAGE", 242 | "type": "IMAGE", 243 | "links": [ 244 | 141 245 | ], 246 | "slot_index": 0 247 | } 248 | ], 249 | "properties": { 250 | "Node name for S&R": "VAEDecode" 251 | } 252 | }, 253 | { 254 | "id": 6, 255 | "type": "CLIPTextEncode", 256 | "pos": [ 257 | 520, 258 | 150 259 | ], 260 | "size": { 261 | "0": 210, 262 | "1": 90 263 | }, 264 | "flags": {}, 265 | "order": 5, 266 | "mode": 0, 267 | "inputs": [ 268 | { 269 | "name": "clip", 270 | "type": "CLIP", 271 | "link": 3 272 | } 273 | ], 274 | "outputs": [ 275 | { 276 | "name": "CONDITIONING", 277 | "type": "CONDITIONING", 278 | "links": [ 279 | 137 280 | ], 281 | "slot_index": 0 282 | } 283 | ], 284 | "title": "Positive", 285 | "properties": { 286 | "Node name for S&R": "CLIPTextEncode" 287 | }, 288 | "widgets_values": [ 289 | "photo of a cute animal" 290 | ], 291 | "color": "#232", 292 | "bgcolor": "#353" 293 | }, 294 | { 295 | "id": 82, 296 | "type": "OverrideImage", 297 | "pos": [ 298 | 1480, 299 | 130 300 | ], 301 | "size": [ 302 | 320, 303 | 270 304 | ], 305 | "flags": {}, 306 | "order": 16, 307 | "mode": 0, 308 | "inputs": [ 309 | { 310 | "name": "image", 311 | "type": "IMAGE", 312 | "link": 141 313 | }, 314 | { 315 | "name": "filename", 316 | "type": "STRING", 317 | "link": 152, 318 | "widget": { 319 | "name": "filename" 320 | } 321 | } 322 | ], 323 | "properties": { 324 | "Node name for S&R": "OverrideImage" 325 | }, 326 | "widgets_values": [ 327 | "Chimera_1" 328 | ] 329 | }, 330 | { 331 | "id": 80, 332 | "type": "RecallConditioning", 333 | "pos": [ 334 | 760, 335 | 150 336 | ], 337 | "size": [ 338 | 210, 339 | 50 340 | ], 341 | "flags": {}, 342 | "order": 10, 343 | "mode": 0, 344 | "inputs": [ 345 | { 346 | "name": "fallback", 347 | "type": "CONDITIONING", 348 | "link": 137 349 | }, 350 | { 351 | "name": "loop_id", 352 | "type": "STRING", 353 | "link": 150, 354 | "widget": { 355 | "name": "loop_id" 356 | } 357 | } 358 | ], 359 | "outputs": [ 360 | { 361 | "name": "CONDITIONING", 362 | "type": "CONDITIONING", 363 | "links": [ 364 | 138, 365 | 147 366 | ], 367 | "shape": 3, 368 | "slot_index": 0 369 | } 370 | ], 371 | "properties": { 372 | "Node name for S&R": "RecallConditioning" 373 | }, 374 | "widgets_values": [ 375 | "Chimera_1" 376 | ] 377 | }, 378 | { 379 | "id": 77, 380 | "type": "ImpactWildcardProcessor", 381 | "pos": [ 382 | 170, 383 | 400 384 | ], 385 | "size": { 386 | "0": 300, 387 | "1": 222 388 | }, 389 | "flags": {}, 390 | "order": 1, 391 | "mode": 0, 392 | "outputs": [ 393 | { 394 | "name": "STRING", 395 | "type": "STRING", 396 | "links": [ 397 | 134 398 | ], 399 | "shape": 3, 400 | "slot_index": 0 401 | } 402 | ], 403 | "properties": { 404 | "Node name for S&R": "ImpactWildcardProcessor" 405 | }, 406 | "widgets_values": [ 407 | "__jumbo/creatures/animals__", 408 | "llama", 409 | true, 410 | 1108012394795937, 411 | "randomize", 412 | "Select the Wildcard to add to the text" 413 | ], 414 | "color": "#232", 415 | "bgcolor": "#353" 416 | }, 417 | { 418 | "id": 4, 419 | "type": "CheckpointLoaderSimple", 420 | "pos": [ 421 | 170, 422 | 20 423 | ], 424 | "size": { 425 | "0": 300, 426 | "1": 100 427 | }, 428 | "flags": {}, 429 | "order": 2, 430 | "mode": 0, 431 | "outputs": [ 432 | { 433 | "name": "MODEL", 434 | "type": "MODEL", 435 | "links": [ 436 | 28 437 | ], 438 | "slot_index": 0 439 | }, 440 | { 441 | "name": "CLIP", 442 | "type": "CLIP", 443 | "links": [ 444 | 3, 445 | 5, 446 | 135 447 | ], 448 | "slot_index": 1 449 | }, 450 | { 451 | "name": "VAE", 452 | "type": "VAE", 453 | "links": [ 454 | 26 455 | ], 456 | "slot_index": 2 457 | } 458 | ], 459 | "properties": { 460 | "Node name for S&R": "CheckpointLoaderSimple" 461 | }, 462 | "widgets_values": [ 463 | "526mixV15.safetensors" 464 | ], 465 | "color": "#223", 466 | "bgcolor": "#335" 467 | }, 468 | { 469 | "id": 79, 470 | "type": "CLIPTextEncode", 471 | "pos": [ 472 | 520, 473 | 570 474 | ], 475 | "size": { 476 | "0": 210, 477 | "1": 54 478 | }, 479 | "flags": {}, 480 | "order": 7, 481 | "mode": 0, 482 | "inputs": [ 483 | { 484 | "name": "clip", 485 | "type": "CLIP", 486 | "link": 135 487 | }, 488 | { 489 | "name": "text", 490 | "type": "STRING", 491 | "link": 134, 492 | "widget": { 493 | "name": "text" 494 | } 495 | } 496 | ], 497 | "outputs": [ 498 | { 499 | "name": "CONDITIONING", 500 | "type": "CONDITIONING", 501 | "links": [ 502 | 148 503 | ], 504 | "shape": 3, 505 | "slot_index": 0 506 | } 507 | ], 508 | "properties": { 509 | "Node name for S&R": "CLIPTextEncode" 510 | }, 511 | "widgets_values": [ 512 | "" 513 | ] 514 | }, 515 | { 516 | "id": 83, 517 | "type": "ConditioningConcat", 518 | "pos": [ 519 | 1000, 520 | 550 521 | ], 522 | "size": { 523 | "0": 253.60000610351562, 524 | "1": 50 525 | }, 526 | "flags": {}, 527 | "order": 13, 528 | "mode": 0, 529 | "inputs": [ 530 | { 531 | "name": "conditioning_to", 532 | "type": "CONDITIONING", 533 | "link": 147 534 | }, 535 | { 536 | "name": "conditioning_from", 537 | "type": "CONDITIONING", 538 | "link": 148 539 | } 540 | ], 541 | "outputs": [ 542 | { 543 | "name": "CONDITIONING", 544 | "type": "CONDITIONING", 545 | "links": [ 546 | 144 547 | ], 548 | "shape": 3, 549 | "slot_index": 0 550 | } 551 | ], 552 | "properties": { 553 | "Node name for S&R": "ConditioningConcat" 554 | } 555 | }, 556 | { 557 | "id": 81, 558 | "type": "MemorizeConditioning", 559 | "pos": [ 560 | 1480, 561 | 550 562 | ], 563 | "size": [ 564 | 210, 565 | 50 566 | ], 567 | "flags": {}, 568 | "order": 15, 569 | "mode": 0, 570 | "inputs": [ 571 | { 572 | "name": "to_memory", 573 | "type": "CONDITIONING", 574 | "link": 144 575 | }, 576 | { 577 | "name": "loop_id", 578 | "type": "STRING", 579 | "link": 153, 580 | "widget": { 581 | "name": "loop_id" 582 | } 583 | } 584 | ], 585 | "properties": { 586 | "Node name for S&R": "MemorizeConditioning" 587 | }, 588 | "widgets_values": [ 589 | "Chimera_1" 590 | ] 591 | }, 592 | { 593 | "id": 85, 594 | "type": "Reroute", 595 | "pos": [ 596 | 720, 597 | 670 598 | ], 599 | "size": [ 600 | 90.4, 601 | 26 602 | ], 603 | "flags": {}, 604 | "order": 9, 605 | "mode": 0, 606 | "inputs": [ 607 | { 608 | "name": "", 609 | "type": "*", 610 | "link": 149, 611 | "widget": { 612 | "name": "value" 613 | } 614 | } 615 | ], 616 | "outputs": [ 617 | { 618 | "name": "STRING", 619 | "type": "STRING", 620 | "links": [ 621 | 150, 622 | 151 623 | ], 624 | "slot_index": 0 625 | } 626 | ], 627 | "properties": { 628 | "showOutputText": true, 629 | "horizontal": false 630 | } 631 | }, 632 | { 633 | "id": 86, 634 | "type": "Reroute", 635 | "pos": [ 636 | 1170, 637 | 670 638 | ], 639 | "size": [ 640 | 90.4, 641 | 26 642 | ], 643 | "flags": {}, 644 | "order": 11, 645 | "mode": 0, 646 | "inputs": [ 647 | { 648 | "name": "", 649 | "type": "*", 650 | "link": 151, 651 | "widget": { 652 | "name": "value" 653 | } 654 | } 655 | ], 656 | "outputs": [ 657 | { 658 | "name": "STRING", 659 | "type": "STRING", 660 | "links": [ 661 | 152, 662 | 153 663 | ], 664 | "slot_index": 0 665 | } 666 | ], 667 | "properties": { 668 | "showOutputText": true, 669 | "horizontal": false 670 | } 671 | }, 672 | { 673 | "id": 84, 674 | "type": "LoopManager", 675 | "pos": [ 676 | 170, 677 | 670 678 | ], 679 | "size": [ 680 | 300, 681 | 140 682 | ], 683 | "flags": {}, 684 | "order": 3, 685 | "mode": 0, 686 | "outputs": [ 687 | { 688 | "name": "STRING", 689 | "type": "STRING", 690 | "links": [ 691 | 149 692 | ], 693 | "shape": 3, 694 | "slot_index": 0 695 | } 696 | ], 697 | "properties": { 698 | "Node name for S&R": "LoopManager" 699 | }, 700 | "widgets_values": [ 701 | "Chimera_2", 702 | "never", 703 | "Chimera_2:\n(#7)CONDITIONING: -- exists --\n(#7)IMAGE: Chimera_2.png\n\nChimera_1:\n(#4)CONDITIONING: -- exists --\n(#4)IMAGE: Chimera_1.png\n\nCatStack_2:\n(#1)INT: 1\n(#1)LATENT: CatStack_2.latent\n(#1)IMAGE: CatStack_2.png\n\nCatStack_1:\n(#6)INT: 6\n(#4)LATENT: CatStack_1.latent\n(#2)IMAGE: CatStack_1.png" 704 | ] 705 | } 706 | ], 707 | "links": [ 708 | [ 709 | 3, 710 | 4, 711 | 1, 712 | 6, 713 | 0, 714 | "CLIP" 715 | ], 716 | [ 717 | 5, 718 | 4, 719 | 1, 720 | 7, 721 | 0, 722 | "CLIP" 723 | ], 724 | [ 725 | 6, 726 | 7, 727 | 0, 728 | 3, 729 | 2, 730 | "CONDITIONING" 731 | ], 732 | [ 733 | 7, 734 | 3, 735 | 0, 736 | 8, 737 | 0, 738 | "LATENT" 739 | ], 740 | [ 741 | 26, 742 | 4, 743 | 2, 744 | 25, 745 | 0, 746 | "*" 747 | ], 748 | [ 749 | 27, 750 | 25, 751 | 0, 752 | 8, 753 | 1, 754 | "VAE" 755 | ], 756 | [ 757 | 28, 758 | 4, 759 | 0, 760 | 26, 761 | 0, 762 | "*" 763 | ], 764 | [ 765 | 29, 766 | 26, 767 | 0, 768 | 3, 769 | 0, 770 | "MODEL" 771 | ], 772 | [ 773 | 120, 774 | 5, 775 | 0, 776 | 3, 777 | 3, 778 | "LATENT" 779 | ], 780 | [ 781 | 134, 782 | 77, 783 | 0, 784 | 79, 785 | 1, 786 | "STRING" 787 | ], 788 | [ 789 | 135, 790 | 4, 791 | 1, 792 | 79, 793 | 0, 794 | "CLIP" 795 | ], 796 | [ 797 | 137, 798 | 6, 799 | 0, 800 | 80, 801 | 0, 802 | "CONDITIONING" 803 | ], 804 | [ 805 | 138, 806 | 80, 807 | 0, 808 | 3, 809 | 1, 810 | "CONDITIONING" 811 | ], 812 | [ 813 | 141, 814 | 8, 815 | 0, 816 | 82, 817 | 0, 818 | "IMAGE" 819 | ], 820 | [ 821 | 144, 822 | 83, 823 | 0, 824 | 81, 825 | 0, 826 | "CONDITIONING" 827 | ], 828 | [ 829 | 147, 830 | 80, 831 | 0, 832 | 83, 833 | 0, 834 | "CONDITIONING" 835 | ], 836 | [ 837 | 148, 838 | 79, 839 | 0, 840 | 83, 841 | 1, 842 | "CONDITIONING" 843 | ], 844 | [ 845 | 149, 846 | 84, 847 | 0, 848 | 85, 849 | 0, 850 | "*" 851 | ], 852 | [ 853 | 150, 854 | 85, 855 | 0, 856 | 80, 857 | 1, 858 | "STRING" 859 | ], 860 | [ 861 | 151, 862 | 85, 863 | 0, 864 | 86, 865 | 0, 866 | "*" 867 | ], 868 | [ 869 | 152, 870 | 86, 871 | 0, 872 | 82, 873 | 1, 874 | "STRING" 875 | ], 876 | [ 877 | 153, 878 | 86, 879 | 0, 880 | 81, 881 | 1, 882 | "STRING" 883 | ] 884 | ], 885 | "groups": [], 886 | "config": {}, 887 | "extra": {}, 888 | "version": 0.4 889 | } -------------------------------------------------------------------------------- /workflows/ChimeraMaker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pos13/comfyui-cyclist/6b6accd84fcd69cb6b04e7f6b500a90c28171fca/workflows/ChimeraMaker.png -------------------------------------------------------------------------------- /workflows/GenUntilGood.json: -------------------------------------------------------------------------------- 1 | { 2 | "last_node_id": 71, 3 | "last_link_id": 121, 4 | "nodes": [ 5 | { 6 | "id": 3, 7 | "type": "KSampler", 8 | "pos": [ 9 | 1030, 10 | 210 11 | ], 12 | "size": { 13 | "0": 280, 14 | "1": 262 15 | }, 16 | "flags": {}, 17 | "order": 21, 18 | "mode": 0, 19 | "inputs": [ 20 | { 21 | "name": "model", 22 | "type": "MODEL", 23 | "link": 29 24 | }, 25 | { 26 | "name": "positive", 27 | "type": "CONDITIONING", 28 | "link": 4 29 | }, 30 | { 31 | "name": "negative", 32 | "type": "CONDITIONING", 33 | "link": 6 34 | }, 35 | { 36 | "name": "latent_image", 37 | "type": "LATENT", 38 | "link": 39 39 | } 40 | ], 41 | "outputs": [ 42 | { 43 | "name": "LATENT", 44 | "type": "LATENT", 45 | "links": [ 46 | 7 47 | ], 48 | "slot_index": 0 49 | } 50 | ], 51 | "properties": { 52 | "Node name for S&R": "KSampler" 53 | }, 54 | "widgets_values": [ 55 | 360572502491967, 56 | "randomize", 57 | 26, 58 | 7, 59 | "dpmpp_3m_sde_gpu", 60 | "karras", 61 | 1 62 | ] 63 | }, 64 | { 65 | "id": 6, 66 | "type": "CLIPTextEncode", 67 | "pos": [ 68 | 790, 69 | 210 70 | ], 71 | "size": { 72 | "0": 210, 73 | "1": 54 74 | }, 75 | "flags": {}, 76 | "order": 9, 77 | "mode": 0, 78 | "inputs": [ 79 | { 80 | "name": "clip", 81 | "type": "CLIP", 82 | "link": 3 83 | }, 84 | { 85 | "name": "text", 86 | "type": "STRING", 87 | "link": 73, 88 | "widget": { 89 | "name": "text" 90 | } 91 | } 92 | ], 93 | "outputs": [ 94 | { 95 | "name": "CONDITIONING", 96 | "type": "CONDITIONING", 97 | "links": [ 98 | 4 99 | ], 100 | "slot_index": 0 101 | } 102 | ], 103 | "title": "Positive", 104 | "properties": { 105 | "Node name for S&R": "CLIPTextEncode" 106 | }, 107 | "widgets_values": [ 108 | "abstract concept art of a woman vaulting over a block wearing helmet, dynamic pose ,TRON aesthetic, canvas, exotic design, polygons, electric sparks, illustration masterpiece, 8K wallpaper, art by Benedick Bana, Jarek Kubicki, Paul Catherall" 109 | ] 110 | }, 111 | { 112 | "id": 7, 113 | "type": "CLIPTextEncode", 114 | "pos": [ 115 | 790, 116 | 300 117 | ], 118 | "size": { 119 | "0": 210, 120 | "1": 76 121 | }, 122 | "flags": {}, 123 | "order": 10, 124 | "mode": 0, 125 | "inputs": [ 126 | { 127 | "name": "clip", 128 | "type": "CLIP", 129 | "link": 5 130 | } 131 | ], 132 | "outputs": [ 133 | { 134 | "name": "CONDITIONING", 135 | "type": "CONDITIONING", 136 | "links": [ 137 | 6 138 | ], 139 | "slot_index": 0 140 | } 141 | ], 142 | "title": "Negative", 143 | "properties": { 144 | "Node name for S&R": "CLIPTextEncode" 145 | }, 146 | "widgets_values": [ 147 | "blurry" 148 | ], 149 | "color": "#232", 150 | "bgcolor": "#353" 151 | }, 152 | { 153 | "id": 29, 154 | "type": "Interrupt", 155 | "pos": [ 156 | 850, 157 | 460 158 | ], 159 | "size": [ 160 | 150, 161 | 60 162 | ], 163 | "flags": {}, 164 | "order": 20, 165 | "mode": 0, 166 | "inputs": [ 167 | { 168 | "name": "any_in", 169 | "type": "*", 170 | "link": 38, 171 | "color_on": "" 172 | }, 173 | { 174 | "name": "stop", 175 | "type": "BOOLEAN", 176 | "link": 105, 177 | "widget": { 178 | "name": "stop" 179 | } 180 | } 181 | ], 182 | "outputs": [ 183 | { 184 | "name": "LATENT", 185 | "type": "LATENT", 186 | "links": [ 187 | 39 188 | ], 189 | "shape": 3, 190 | "slot_index": 0, 191 | "color_on": "#FF9CF9" 192 | } 193 | ], 194 | "properties": { 195 | "Node name for S&R": "Interrupt" 196 | }, 197 | "widgets_values": [ 198 | false 199 | ] 200 | }, 201 | { 202 | "id": 25, 203 | "type": "Reroute", 204 | "pos": [ 205 | 1240, 206 | 120 207 | ], 208 | "size": [ 209 | 75, 210 | 26 211 | ], 212 | "flags": {}, 213 | "order": 11, 214 | "mode": 0, 215 | "inputs": [ 216 | { 217 | "name": "", 218 | "type": "*", 219 | "link": 26 220 | } 221 | ], 222 | "outputs": [ 223 | { 224 | "name": "VAE", 225 | "type": "VAE", 226 | "links": [ 227 | 27 228 | ], 229 | "slot_index": 0 230 | } 231 | ], 232 | "properties": { 233 | "showOutputText": true, 234 | "horizontal": false 235 | } 236 | }, 237 | { 238 | "id": 8, 239 | "type": "VAEDecode", 240 | "pos": [ 241 | 1340, 242 | 210 243 | ], 244 | "size": { 245 | "0": 140, 246 | "1": 50 247 | }, 248 | "flags": {}, 249 | "order": 22, 250 | "mode": 0, 251 | "inputs": [ 252 | { 253 | "name": "samples", 254 | "type": "LATENT", 255 | "link": 7 256 | }, 257 | { 258 | "name": "vae", 259 | "type": "VAE", 260 | "link": 27 261 | } 262 | ], 263 | "outputs": [ 264 | { 265 | "name": "IMAGE", 266 | "type": "IMAGE", 267 | "links": [ 268 | 86 269 | ], 270 | "slot_index": 0 271 | } 272 | ], 273 | "properties": { 274 | "Node name for S&R": "VAEDecode" 275 | } 276 | }, 277 | { 278 | "id": 50, 279 | "type": "Text Multiline", 280 | "pos": [ 281 | 360, 282 | 230 283 | ], 284 | "size": { 285 | "0": 360, 286 | "1": 150 287 | }, 288 | "flags": {}, 289 | "order": 0, 290 | "mode": 0, 291 | "outputs": [ 292 | { 293 | "name": "STRING", 294 | "type": "STRING", 295 | "links": [ 296 | 71, 297 | 73 298 | ], 299 | "shape": 3, 300 | "slot_index": 0 301 | } 302 | ], 303 | "title": "Positive", 304 | "properties": { 305 | "Node name for S&R": "Text Multiline" 306 | }, 307 | "widgets_values": [ 308 | "abstract concept art of a woman vaulting over a block wearing helmet, dynamic pose ,TRON aesthetic, canvas, exotic design, polygons, electric sparks, illustration masterpiece, 8K wallpaper, art by Benedick Bana, Jarek Kubicki, Paul Catherall" 309 | ], 310 | "color": "#232", 311 | "bgcolor": "#353" 312 | }, 313 | { 314 | "id": 30, 315 | "type": "Reroute", 316 | "pos": [ 317 | 700, 318 | 320 319 | ], 320 | "size": [ 321 | 90.4, 322 | 26 323 | ], 324 | "flags": {}, 325 | "order": 7, 326 | "mode": 0, 327 | "inputs": [ 328 | { 329 | "name": "", 330 | "type": "*", 331 | "link": 71, 332 | "pos": [ 333 | 45.2, 334 | 0 335 | ], 336 | "widget": { 337 | "name": "value" 338 | } 339 | } 340 | ], 341 | "outputs": [ 342 | { 343 | "name": "STRING", 344 | "type": "STRING", 345 | "links": [ 346 | 72 347 | ], 348 | "slot_index": 0 349 | } 350 | ], 351 | "properties": { 352 | "showOutputText": true, 353 | "horizontal": true 354 | } 355 | }, 356 | { 357 | "id": 13, 358 | "type": "ImageRewardLoader", 359 | "pos": [ 360 | 130, 361 | 760 362 | ], 363 | "size": { 364 | "0": 210, 365 | "1": 60 366 | }, 367 | "flags": {}, 368 | "order": 1, 369 | "mode": 0, 370 | "outputs": [ 371 | { 372 | "name": "IMAGEREWARD_MODEL", 373 | "type": "IMAGEREWARD_MODEL", 374 | "links": [ 375 | 47, 376 | 90 377 | ], 378 | "shape": 3, 379 | "slot_index": 0 380 | } 381 | ], 382 | "properties": { 383 | "Node name for S&R": "ImageRewardLoader" 384 | }, 385 | "widgets_values": [ 386 | "ImageReward-v1.0" 387 | ] 388 | }, 389 | { 390 | "id": 46, 391 | "type": "Text to Console", 392 | "pos": [ 393 | 1150, 394 | 710 395 | ], 396 | "size": { 397 | "0": 210, 398 | "1": 60 399 | }, 400 | "flags": {}, 401 | "order": 27, 402 | "mode": 0, 403 | "inputs": [ 404 | { 405 | "name": "text", 406 | "type": "STRING", 407 | "link": 66, 408 | "widget": { 409 | "name": "text" 410 | } 411 | } 412 | ], 413 | "outputs": [ 414 | { 415 | "name": "STRING", 416 | "type": "STRING", 417 | "links": null, 418 | "shape": 3 419 | } 420 | ], 421 | "properties": { 422 | "Node name for S&R": "Text to Console" 423 | }, 424 | "widgets_values": [ 425 | "", 426 | "Score" 427 | ] 428 | }, 429 | { 430 | "id": 60, 431 | "type": "Reroute", 432 | "pos": [ 433 | 850, 434 | 690 435 | ], 436 | "size": [ 437 | 82, 438 | 26 439 | ], 440 | "flags": {}, 441 | "order": 24, 442 | "mode": 0, 443 | "inputs": [ 444 | { 445 | "name": "", 446 | "type": "*", 447 | "link": 95, 448 | "pos": [ 449 | 41, 450 | 0 451 | ] 452 | } 453 | ], 454 | "outputs": [ 455 | { 456 | "name": "IMAGE", 457 | "type": "IMAGE", 458 | "links": [ 459 | 96 460 | ], 461 | "slot_index": 0 462 | } 463 | ], 464 | "properties": { 465 | "showOutputText": true, 466 | "horizontal": true 467 | } 468 | }, 469 | { 470 | "id": 51, 471 | "type": "Reroute", 472 | "pos": [ 473 | -220, 474 | 450 475 | ], 476 | "size": [ 477 | 90.4, 478 | 26 479 | ], 480 | "flags": {}, 481 | "order": 14, 482 | "mode": 0, 483 | "inputs": [ 484 | { 485 | "name": "", 486 | "type": "*", 487 | "link": 72, 488 | "pos": [ 489 | 45.2, 490 | 0 491 | ], 492 | "widget": { 493 | "name": "value" 494 | } 495 | } 496 | ], 497 | "outputs": [ 498 | { 499 | "name": "STRING", 500 | "type": "STRING", 501 | "links": [ 502 | 79 503 | ], 504 | "slot_index": 0 505 | } 506 | ], 507 | "properties": { 508 | "showOutputText": true, 509 | "horizontal": true 510 | } 511 | }, 512 | { 513 | "id": 4, 514 | "type": "CheckpointLoaderSimple", 515 | "pos": [ 516 | 360, 517 | 80 518 | ], 519 | "size": { 520 | "0": 360, 521 | "1": 100 522 | }, 523 | "flags": {}, 524 | "order": 2, 525 | "mode": 0, 526 | "outputs": [ 527 | { 528 | "name": "MODEL", 529 | "type": "MODEL", 530 | "links": [ 531 | 28 532 | ], 533 | "slot_index": 0 534 | }, 535 | { 536 | "name": "CLIP", 537 | "type": "CLIP", 538 | "links": [ 539 | 3, 540 | 5 541 | ], 542 | "slot_index": 1 543 | }, 544 | { 545 | "name": "VAE", 546 | "type": "VAE", 547 | "links": [ 548 | 26 549 | ], 550 | "slot_index": 2 551 | } 552 | ], 553 | "properties": { 554 | "Node name for S&R": "CheckpointLoaderSimple" 555 | }, 556 | "widgets_values": [ 557 | "XL\\sd_xl_base_1.0.safetensors" 558 | ], 559 | "color": "#223", 560 | "bgcolor": "#335" 561 | }, 562 | { 563 | "id": 26, 564 | "type": "Reroute", 565 | "pos": [ 566 | 920, 567 | 80 568 | ], 569 | "size": [ 570 | 82, 571 | 26 572 | ], 573 | "flags": {}, 574 | "order": 8, 575 | "mode": 0, 576 | "inputs": [ 577 | { 578 | "name": "", 579 | "type": "*", 580 | "link": 28 581 | } 582 | ], 583 | "outputs": [ 584 | { 585 | "name": "MODEL", 586 | "type": "MODEL", 587 | "links": [ 588 | 29 589 | ], 590 | "slot_index": 0 591 | } 592 | ], 593 | "properties": { 594 | "showOutputText": true, 595 | "horizontal": false 596 | } 597 | }, 598 | { 599 | "id": 5, 600 | "type": "EmptyLatentImage", 601 | "pos": [ 602 | 610, 603 | 460 604 | ], 605 | "size": { 606 | "0": 210, 607 | "1": 110 608 | }, 609 | "flags": {}, 610 | "order": 3, 611 | "mode": 0, 612 | "outputs": [ 613 | { 614 | "name": "LATENT", 615 | "type": "LATENT", 616 | "links": [ 617 | 38 618 | ], 619 | "slot_index": 0 620 | } 621 | ], 622 | "title": "Size", 623 | "properties": { 624 | "Node name for S&R": "EmptyLatentImage" 625 | }, 626 | "widgets_values": [ 627 | 1344, 628 | 768, 629 | 1 630 | ], 631 | "color": "#223", 632 | "bgcolor": "#335" 633 | }, 634 | { 635 | "id": 45, 636 | "type": "EmptyImage", 637 | "pos": [ 638 | -120, 639 | 900 640 | ], 641 | "size": { 642 | "0": 210, 643 | "1": 130 644 | }, 645 | "flags": {}, 646 | "order": 4, 647 | "mode": 0, 648 | "outputs": [ 649 | { 650 | "name": "IMAGE", 651 | "type": "IMAGE", 652 | "links": [ 653 | 100 654 | ], 655 | "shape": 3, 656 | "slot_index": 0 657 | } 658 | ], 659 | "properties": { 660 | "Node name for S&R": "EmptyImage" 661 | }, 662 | "widgets_values": [ 663 | 512, 664 | 512, 665 | 1, 666 | 0 667 | ] 668 | }, 669 | { 670 | "id": 55, 671 | "type": "Reroute", 672 | "pos": [ 673 | -120, 674 | 1040 675 | ], 676 | "size": [ 677 | 90.4, 678 | 26 679 | ], 680 | "flags": {}, 681 | "order": 16, 682 | "mode": 0, 683 | "inputs": [ 684 | { 685 | "name": "", 686 | "type": "*", 687 | "link": 79, 688 | "widget": { 689 | "name": "value" 690 | } 691 | } 692 | ], 693 | "outputs": [ 694 | { 695 | "name": "STRING", 696 | "type": "STRING", 697 | "links": [ 698 | 80 699 | ], 700 | "slot_index": 0 701 | } 702 | ], 703 | "properties": { 704 | "showOutputText": true, 705 | "horizontal": false 706 | } 707 | }, 708 | { 709 | "id": 56, 710 | "type": "Reroute", 711 | "pos": [ 712 | 249.6, 713 | 1040 714 | ], 715 | "size": [ 716 | 90.4, 717 | 26 718 | ], 719 | "flags": {}, 720 | "order": 17, 721 | "mode": 0, 722 | "inputs": [ 723 | { 724 | "name": "", 725 | "type": "*", 726 | "link": 80, 727 | "widget": { 728 | "name": "value" 729 | } 730 | } 731 | ], 732 | "outputs": [ 733 | { 734 | "name": "STRING", 735 | "type": "STRING", 736 | "links": [ 737 | 81, 738 | 92 739 | ], 740 | "slot_index": 0 741 | } 742 | ], 743 | "properties": { 744 | "showOutputText": true, 745 | "horizontal": false 746 | } 747 | }, 748 | { 749 | "id": 64, 750 | "type": "CyclistCompare", 751 | "pos": [ 752 | 610, 753 | 660 754 | ], 755 | "size": { 756 | "0": 210, 757 | "1": 80 758 | }, 759 | "flags": {}, 760 | "order": 19, 761 | "mode": 0, 762 | "inputs": [ 763 | { 764 | "name": "thing1", 765 | "type": "*", 766 | "link": 103 767 | }, 768 | { 769 | "name": "thing2", 770 | "type": "*", 771 | "link": 104 772 | } 773 | ], 774 | "outputs": [ 775 | { 776 | "name": "BOOLEAN", 777 | "type": "BOOLEAN", 778 | "links": [ 779 | 105 780 | ], 781 | "shape": 3, 782 | "slot_index": 0 783 | } 784 | ], 785 | "properties": { 786 | "Node name for S&R": "CyclistCompare" 787 | }, 788 | "widgets_values": [ 789 | "less than" 790 | ] 791 | }, 792 | { 793 | "id": 34, 794 | "type": "ImageRewardScore", 795 | "pos": [ 796 | 370, 797 | 830 798 | ], 799 | "size": { 800 | "0": 210, 801 | "1": 74 802 | }, 803 | "flags": {}, 804 | "order": 18, 805 | "mode": 0, 806 | "inputs": [ 807 | { 808 | "name": "model", 809 | "type": "IMAGEREWARD_MODEL", 810 | "link": 47 811 | }, 812 | { 813 | "name": "images", 814 | "type": "IMAGE", 815 | "link": 101 816 | }, 817 | { 818 | "name": "prompt", 819 | "type": "STRING", 820 | "link": 81, 821 | "widget": { 822 | "name": "prompt" 823 | } 824 | } 825 | ], 826 | "outputs": [ 827 | { 828 | "name": "SCORE_FLOAT", 829 | "type": "FLOAT", 830 | "links": [ 831 | 104, 832 | 108 833 | ], 834 | "shape": 3, 835 | "slot_index": 0 836 | }, 837 | { 838 | "name": "SCORE_STRING", 839 | "type": "STRING", 840 | "links": [], 841 | "shape": 3, 842 | "slot_index": 1 843 | } 844 | ], 845 | "properties": { 846 | "Node name for S&R": "ImageRewardScore" 847 | }, 848 | "widgets_values": [ 849 | "abstract concept art of a woman vaulting over a block wearing helmet, dynamic pose ,TRON aesthetic, canvas, exotic design, polygons, electric sparks, illustration masterpiece, 8K wallpaper, art by Benedick Bana, Jarek Kubicki, Paul Catherall" 850 | ] 851 | }, 852 | { 853 | "id": 63, 854 | "type": "CyclistMathFloat", 855 | "pos": [ 856 | 370, 857 | 660 858 | ], 859 | "size": { 860 | "0": 210, 861 | "1": 110 862 | }, 863 | "flags": {}, 864 | "order": 5, 865 | "mode": 0, 866 | "outputs": [ 867 | { 868 | "name": "FLOAT", 869 | "type": "FLOAT", 870 | "links": [ 871 | 103 872 | ], 873 | "shape": 3, 874 | "slot_index": 0 875 | } 876 | ], 877 | "title": "Target Score", 878 | "properties": { 879 | "Node name for S&R": "CyclistMathFloat" 880 | }, 881 | "widgets_values": [ 882 | "addition", 883 | 0.7, 884 | 0 885 | ], 886 | "color": "#232", 887 | "bgcolor": "#353" 888 | }, 889 | { 890 | "id": 65, 891 | "type": "CyclistCompare", 892 | "pos": [ 893 | 1150, 894 | 810 895 | ], 896 | "size": { 897 | "0": 210, 898 | "1": 80 899 | }, 900 | "flags": {}, 901 | "order": 26, 902 | "mode": 0, 903 | "inputs": [ 904 | { 905 | "name": "thing1", 906 | "type": "*", 907 | "link": 107 908 | }, 909 | { 910 | "name": "thing2", 911 | "type": "*", 912 | "link": 108 913 | } 914 | ], 915 | "outputs": [ 916 | { 917 | "name": "BOOLEAN", 918 | "type": "BOOLEAN", 919 | "links": [ 920 | 114 921 | ], 922 | "shape": 3, 923 | "slot_index": 0 924 | } 925 | ], 926 | "properties": { 927 | "Node name for S&R": "CyclistCompare" 928 | }, 929 | "widgets_values": [ 930 | "greater than" 931 | ] 932 | }, 933 | { 934 | "id": 59, 935 | "type": "Reroute", 936 | "pos": [ 937 | 1460, 938 | 520 939 | ], 940 | "size": [ 941 | 82, 942 | 26 943 | ], 944 | "flags": {}, 945 | "order": 23, 946 | "mode": 0, 947 | "inputs": [ 948 | { 949 | "name": "", 950 | "type": "*", 951 | "link": 86, 952 | "pos": [ 953 | 41, 954 | 0 955 | ] 956 | } 957 | ], 958 | "outputs": [ 959 | { 960 | "name": "IMAGE", 961 | "type": "IMAGE", 962 | "links": [ 963 | 95, 964 | 115 965 | ], 966 | "slot_index": 0 967 | } 968 | ], 969 | "properties": { 970 | "showOutputText": true, 971 | "horizontal": true 972 | } 973 | }, 974 | { 975 | "id": 62, 976 | "type": "ReloadImage", 977 | "pos": [ 978 | 130, 979 | 900 980 | ], 981 | "size": [ 982 | 210, 983 | 50 984 | ], 985 | "flags": {}, 986 | "order": 12, 987 | "mode": 0, 988 | "inputs": [ 989 | { 990 | "name": "fallback", 991 | "type": "IMAGE", 992 | "link": 100 993 | }, 994 | { 995 | "name": "filename", 996 | "type": "STRING", 997 | "link": 117, 998 | "widget": { 999 | "name": "filename" 1000 | } 1001 | } 1002 | ], 1003 | "outputs": [ 1004 | { 1005 | "name": "IMAGE", 1006 | "type": "IMAGE", 1007 | "links": [ 1008 | 101, 1009 | 113 1010 | ], 1011 | "shape": 3, 1012 | "slot_index": 0 1013 | } 1014 | ], 1015 | "properties": { 1016 | "Node name for S&R": "ReloadImage" 1017 | }, 1018 | "widgets_values": [ 1019 | "AestheticArt_1" 1020 | ] 1021 | }, 1022 | { 1023 | "id": 15, 1024 | "type": "ImageRewardScore", 1025 | "pos": [ 1026 | 910, 1027 | 760 1028 | ], 1029 | "size": { 1030 | "0": 210, 1031 | "1": 74 1032 | }, 1033 | "flags": {}, 1034 | "order": 25, 1035 | "mode": 0, 1036 | "inputs": [ 1037 | { 1038 | "name": "model", 1039 | "type": "IMAGEREWARD_MODEL", 1040 | "link": 90 1041 | }, 1042 | { 1043 | "name": "images", 1044 | "type": "IMAGE", 1045 | "link": 96 1046 | }, 1047 | { 1048 | "name": "prompt", 1049 | "type": "STRING", 1050 | "link": 92, 1051 | "widget": { 1052 | "name": "prompt" 1053 | } 1054 | } 1055 | ], 1056 | "outputs": [ 1057 | { 1058 | "name": "SCORE_FLOAT", 1059 | "type": "FLOAT", 1060 | "links": [ 1061 | 107 1062 | ], 1063 | "shape": 3, 1064 | "slot_index": 0 1065 | }, 1066 | { 1067 | "name": "SCORE_STRING", 1068 | "type": "STRING", 1069 | "links": [ 1070 | 66 1071 | ], 1072 | "shape": 3, 1073 | "slot_index": 1 1074 | } 1075 | ], 1076 | "properties": { 1077 | "Node name for S&R": "ImageRewardScore" 1078 | }, 1079 | "widgets_values": [ 1080 | "abstract concept art of a woman vaulting over a block wearing helmet, dynamic pose ,TRON aesthetic, canvas, exotic design, polygons, electric sparks, illustration masterpiece, 8K wallpaper, art by Benedick Bana, Jarek Kubicki, Paul Catherall" 1081 | ] 1082 | }, 1083 | { 1084 | "id": 68, 1085 | "type": "Image Input Switch", 1086 | "pos": [ 1087 | 1390, 1088 | 880 1089 | ], 1090 | "size": [ 1091 | 210, 1092 | 70 1093 | ], 1094 | "flags": {}, 1095 | "order": 28, 1096 | "mode": 0, 1097 | "inputs": [ 1098 | { 1099 | "name": "image_a", 1100 | "type": "IMAGE", 1101 | "link": 115 1102 | }, 1103 | { 1104 | "name": "image_b", 1105 | "type": "IMAGE", 1106 | "link": 113 1107 | }, 1108 | { 1109 | "name": "boolean", 1110 | "type": "BOOLEAN", 1111 | "link": 114, 1112 | "widget": { 1113 | "name": "boolean" 1114 | } 1115 | } 1116 | ], 1117 | "outputs": [ 1118 | { 1119 | "name": "IMAGE", 1120 | "type": "IMAGE", 1121 | "links": [ 1122 | 116 1123 | ], 1124 | "shape": 3, 1125 | "slot_index": 0 1126 | } 1127 | ], 1128 | "properties": { 1129 | "Node name for S&R": "Image Input Switch" 1130 | }, 1131 | "widgets_values": [ 1132 | false 1133 | ] 1134 | }, 1135 | { 1136 | "id": 70, 1137 | "type": "Reroute", 1138 | "pos": [ 1139 | 130, 1140 | 960 1141 | ], 1142 | "size": [ 1143 | 90.4, 1144 | 26 1145 | ], 1146 | "flags": {}, 1147 | "order": 13, 1148 | "mode": 0, 1149 | "inputs": [ 1150 | { 1151 | "name": "", 1152 | "type": "*", 1153 | "link": 118, 1154 | "widget": { 1155 | "name": "value" 1156 | } 1157 | } 1158 | ], 1159 | "outputs": [ 1160 | { 1161 | "name": "STRING", 1162 | "type": "STRING", 1163 | "links": [ 1164 | 120 1165 | ], 1166 | "slot_index": 0 1167 | } 1168 | ], 1169 | "properties": { 1170 | "showOutputText": true, 1171 | "horizontal": false 1172 | } 1173 | }, 1174 | { 1175 | "id": 69, 1176 | "type": "LoopManager", 1177 | "pos": [ 1178 | -120, 1179 | 660 1180 | ], 1181 | "size": [ 1182 | 220, 1183 | 200 1184 | ], 1185 | "flags": {}, 1186 | "order": 6, 1187 | "mode": 0, 1188 | "outputs": [ 1189 | { 1190 | "name": "STRING", 1191 | "type": "STRING", 1192 | "links": [ 1193 | 117, 1194 | 118 1195 | ], 1196 | "shape": 3, 1197 | "slot_index": 0 1198 | } 1199 | ], 1200 | "properties": { 1201 | "Node name for S&R": "LoopManager" 1202 | }, 1203 | "widgets_values": [ 1204 | "AestheticArt_2", 1205 | "by_interrupt_node", 1206 | "AestheticArt_1:\n(#7)IMAGE: AestheticArt_1.png" 1207 | ], 1208 | "color": "#232", 1209 | "bgcolor": "#353" 1210 | }, 1211 | { 1212 | "id": 71, 1213 | "type": "Reroute", 1214 | "pos": [ 1215 | 1500, 1216 | 960 1217 | ], 1218 | "size": [ 1219 | 90.4, 1220 | 26 1221 | ], 1222 | "flags": {}, 1223 | "order": 15, 1224 | "mode": 0, 1225 | "inputs": [ 1226 | { 1227 | "name": "", 1228 | "type": "*", 1229 | "link": 120, 1230 | "widget": { 1231 | "name": "value" 1232 | } 1233 | } 1234 | ], 1235 | "outputs": [ 1236 | { 1237 | "name": "STRING", 1238 | "type": "STRING", 1239 | "links": [ 1240 | 121 1241 | ], 1242 | "slot_index": 0 1243 | } 1244 | ], 1245 | "properties": { 1246 | "showOutputText": true, 1247 | "horizontal": false 1248 | } 1249 | }, 1250 | { 1251 | "id": 67, 1252 | "type": "OverrideImage", 1253 | "pos": [ 1254 | 1640, 1255 | 670 1256 | ], 1257 | "size": [ 1258 | 630, 1259 | 400 1260 | ], 1261 | "flags": {}, 1262 | "order": 29, 1263 | "mode": 0, 1264 | "inputs": [ 1265 | { 1266 | "name": "image", 1267 | "type": "IMAGE", 1268 | "link": 116 1269 | }, 1270 | { 1271 | "name": "filename", 1272 | "type": "STRING", 1273 | "link": 121, 1274 | "widget": { 1275 | "name": "filename" 1276 | } 1277 | } 1278 | ], 1279 | "properties": { 1280 | "Node name for S&R": "OverrideImage" 1281 | }, 1282 | "widgets_values": [ 1283 | "AestheticArt_1" 1284 | ] 1285 | } 1286 | ], 1287 | "links": [ 1288 | [ 1289 | 3, 1290 | 4, 1291 | 1, 1292 | 6, 1293 | 0, 1294 | "CLIP" 1295 | ], 1296 | [ 1297 | 4, 1298 | 6, 1299 | 0, 1300 | 3, 1301 | 1, 1302 | "CONDITIONING" 1303 | ], 1304 | [ 1305 | 5, 1306 | 4, 1307 | 1, 1308 | 7, 1309 | 0, 1310 | "CLIP" 1311 | ], 1312 | [ 1313 | 6, 1314 | 7, 1315 | 0, 1316 | 3, 1317 | 2, 1318 | "CONDITIONING" 1319 | ], 1320 | [ 1321 | 7, 1322 | 3, 1323 | 0, 1324 | 8, 1325 | 0, 1326 | "LATENT" 1327 | ], 1328 | [ 1329 | 26, 1330 | 4, 1331 | 2, 1332 | 25, 1333 | 0, 1334 | "*" 1335 | ], 1336 | [ 1337 | 27, 1338 | 25, 1339 | 0, 1340 | 8, 1341 | 1, 1342 | "VAE" 1343 | ], 1344 | [ 1345 | 28, 1346 | 4, 1347 | 0, 1348 | 26, 1349 | 0, 1350 | "*" 1351 | ], 1352 | [ 1353 | 29, 1354 | 26, 1355 | 0, 1356 | 3, 1357 | 0, 1358 | "MODEL" 1359 | ], 1360 | [ 1361 | 38, 1362 | 5, 1363 | 0, 1364 | 29, 1365 | 0, 1366 | "*" 1367 | ], 1368 | [ 1369 | 39, 1370 | 29, 1371 | 0, 1372 | 3, 1373 | 3, 1374 | "LATENT" 1375 | ], 1376 | [ 1377 | 47, 1378 | 13, 1379 | 0, 1380 | 34, 1381 | 0, 1382 | "IMAGEREWARD_MODEL" 1383 | ], 1384 | [ 1385 | 66, 1386 | 15, 1387 | 1, 1388 | 46, 1389 | 0, 1390 | "STRING" 1391 | ], 1392 | [ 1393 | 71, 1394 | 50, 1395 | 0, 1396 | 30, 1397 | 0, 1398 | "*" 1399 | ], 1400 | [ 1401 | 72, 1402 | 30, 1403 | 0, 1404 | 51, 1405 | 0, 1406 | "*" 1407 | ], 1408 | [ 1409 | 73, 1410 | 50, 1411 | 0, 1412 | 6, 1413 | 1, 1414 | "STRING" 1415 | ], 1416 | [ 1417 | 79, 1418 | 51, 1419 | 0, 1420 | 55, 1421 | 0, 1422 | "*" 1423 | ], 1424 | [ 1425 | 80, 1426 | 55, 1427 | 0, 1428 | 56, 1429 | 0, 1430 | "*" 1431 | ], 1432 | [ 1433 | 81, 1434 | 56, 1435 | 0, 1436 | 34, 1437 | 2, 1438 | "STRING" 1439 | ], 1440 | [ 1441 | 86, 1442 | 8, 1443 | 0, 1444 | 59, 1445 | 0, 1446 | "*" 1447 | ], 1448 | [ 1449 | 90, 1450 | 13, 1451 | 0, 1452 | 15, 1453 | 0, 1454 | "IMAGEREWARD_MODEL" 1455 | ], 1456 | [ 1457 | 92, 1458 | 56, 1459 | 0, 1460 | 15, 1461 | 2, 1462 | "STRING" 1463 | ], 1464 | [ 1465 | 95, 1466 | 59, 1467 | 0, 1468 | 60, 1469 | 0, 1470 | "*" 1471 | ], 1472 | [ 1473 | 96, 1474 | 60, 1475 | 0, 1476 | 15, 1477 | 1, 1478 | "IMAGE" 1479 | ], 1480 | [ 1481 | 100, 1482 | 45, 1483 | 0, 1484 | 62, 1485 | 0, 1486 | "IMAGE" 1487 | ], 1488 | [ 1489 | 101, 1490 | 62, 1491 | 0, 1492 | 34, 1493 | 1, 1494 | "IMAGE" 1495 | ], 1496 | [ 1497 | 103, 1498 | 63, 1499 | 0, 1500 | 64, 1501 | 0, 1502 | "*" 1503 | ], 1504 | [ 1505 | 104, 1506 | 34, 1507 | 0, 1508 | 64, 1509 | 1, 1510 | "*" 1511 | ], 1512 | [ 1513 | 105, 1514 | 64, 1515 | 0, 1516 | 29, 1517 | 1, 1518 | "BOOLEAN" 1519 | ], 1520 | [ 1521 | 107, 1522 | 15, 1523 | 0, 1524 | 65, 1525 | 0, 1526 | "*" 1527 | ], 1528 | [ 1529 | 108, 1530 | 34, 1531 | 0, 1532 | 65, 1533 | 1, 1534 | "*" 1535 | ], 1536 | [ 1537 | 113, 1538 | 62, 1539 | 0, 1540 | 68, 1541 | 1, 1542 | "IMAGE" 1543 | ], 1544 | [ 1545 | 114, 1546 | 65, 1547 | 0, 1548 | 68, 1549 | 2, 1550 | "BOOLEAN" 1551 | ], 1552 | [ 1553 | 115, 1554 | 59, 1555 | 0, 1556 | 68, 1557 | 0, 1558 | "IMAGE" 1559 | ], 1560 | [ 1561 | 116, 1562 | 68, 1563 | 0, 1564 | 67, 1565 | 0, 1566 | "IMAGE" 1567 | ], 1568 | [ 1569 | 117, 1570 | 69, 1571 | 0, 1572 | 62, 1573 | 1, 1574 | "STRING" 1575 | ], 1576 | [ 1577 | 118, 1578 | 69, 1579 | 0, 1580 | 70, 1581 | 0, 1582 | "*" 1583 | ], 1584 | [ 1585 | 120, 1586 | 70, 1587 | 0, 1588 | 71, 1589 | 0, 1590 | "*" 1591 | ], 1592 | [ 1593 | 121, 1594 | 71, 1595 | 0, 1596 | 67, 1597 | 1, 1598 | "STRING" 1599 | ] 1600 | ], 1601 | "groups": [ 1602 | { 1603 | "title": "Is result already good enough to stop?", 1604 | "bounding": [ 1605 | -130, 1606 | 586, 1607 | 960, 1608 | 490 1609 | ], 1610 | "color": "#3f789e", 1611 | "font_size": 24, 1612 | "locked": false 1613 | }, 1614 | { 1615 | "title": "Generate", 1616 | "bounding": [ 1617 | 350, 1618 | 6, 1619 | 1212, 1620 | 574 1621 | ], 1622 | "color": "#3f789e", 1623 | "font_size": 24, 1624 | "locked": false 1625 | }, 1626 | { 1627 | "title": "Is the new picture better than old?", 1628 | "bounding": [ 1629 | 840, 1630 | 636, 1631 | 770, 1632 | 360 1633 | ], 1634 | "color": "#3f789e", 1635 | "font_size": 24, 1636 | "locked": false 1637 | } 1638 | ], 1639 | "config": {}, 1640 | "extra": {}, 1641 | "version": 0.4 1642 | } -------------------------------------------------------------------------------- /workflows/GenUntilGood.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pos13/comfyui-cyclist/6b6accd84fcd69cb6b04e7f6b500a90c28171fca/workflows/GenUntilGood.png -------------------------------------------------------------------------------- /workflows/GenUntilGoodNoWAS.json: -------------------------------------------------------------------------------- 1 | { 2 | "last_node_id": 52, 3 | "last_link_id": 63, 4 | "nodes": [ 5 | { 6 | "id": 3, 7 | "type": "KSampler", 8 | "pos": [ 9 | 1030, 10 | 190 11 | ], 12 | "size": { 13 | "0": 280, 14 | "1": 262 15 | }, 16 | "flags": {}, 17 | "order": 16, 18 | "mode": 0, 19 | "inputs": [ 20 | { 21 | "name": "model", 22 | "type": "MODEL", 23 | "link": 29 24 | }, 25 | { 26 | "name": "positive", 27 | "type": "CONDITIONING", 28 | "link": 4 29 | }, 30 | { 31 | "name": "negative", 32 | "type": "CONDITIONING", 33 | "link": 6 34 | }, 35 | { 36 | "name": "latent_image", 37 | "type": "LATENT", 38 | "link": 39 39 | } 40 | ], 41 | "outputs": [ 42 | { 43 | "name": "LATENT", 44 | "type": "LATENT", 45 | "links": [ 46 | 7 47 | ], 48 | "slot_index": 0 49 | } 50 | ], 51 | "properties": { 52 | "Node name for S&R": "KSampler" 53 | }, 54 | "widgets_values": [ 55 | 893654773718923, 56 | "randomize", 57 | 26, 58 | 7, 59 | "dpmpp_3m_sde_gpu", 60 | "karras", 61 | 1 62 | ] 63 | }, 64 | { 65 | "id": 6, 66 | "type": "CLIPTextEncode", 67 | "pos": [ 68 | 790, 69 | 190 70 | ], 71 | "size": { 72 | "0": 210, 73 | "1": 54 74 | }, 75 | "flags": {}, 76 | "order": 9, 77 | "mode": 0, 78 | "inputs": [ 79 | { 80 | "name": "clip", 81 | "type": "CLIP", 82 | "link": 3 83 | }, 84 | { 85 | "name": "text", 86 | "type": "STRING", 87 | "link": 37, 88 | "widget": { 89 | "name": "text" 90 | } 91 | } 92 | ], 93 | "outputs": [ 94 | { 95 | "name": "CONDITIONING", 96 | "type": "CONDITIONING", 97 | "links": [ 98 | 4 99 | ], 100 | "slot_index": 0 101 | } 102 | ], 103 | "title": "Positive", 104 | "properties": { 105 | "Node name for S&R": "CLIPTextEncode" 106 | }, 107 | "widgets_values": [ 108 | "abstract concept art of a woman vaulting over a block wearing helmet, dynamic pose ,TRON aesthetic, canvas, exotic design, polygons, electric sparks, illustration masterpiece, 8K wallpaper, art by Benedick Bana, Jarek Kubicki, Paul Catherall" 109 | ] 110 | }, 111 | { 112 | "id": 7, 113 | "type": "CLIPTextEncode", 114 | "pos": [ 115 | 790, 116 | 280 117 | ], 118 | "size": { 119 | "0": 210, 120 | "1": 76 121 | }, 122 | "flags": {}, 123 | "order": 10, 124 | "mode": 0, 125 | "inputs": [ 126 | { 127 | "name": "clip", 128 | "type": "CLIP", 129 | "link": 5 130 | } 131 | ], 132 | "outputs": [ 133 | { 134 | "name": "CONDITIONING", 135 | "type": "CONDITIONING", 136 | "links": [ 137 | 6 138 | ], 139 | "slot_index": 0 140 | } 141 | ], 142 | "title": "Negative", 143 | "properties": { 144 | "Node name for S&R": "CLIPTextEncode" 145 | }, 146 | "widgets_values": [ 147 | "blurry" 148 | ], 149 | "color": "#232", 150 | "bgcolor": "#353" 151 | }, 152 | { 153 | "id": 29, 154 | "type": "Interrupt", 155 | "pos": [ 156 | 850, 157 | 400 158 | ], 159 | "size": [ 160 | 150, 161 | 60 162 | ], 163 | "flags": {}, 164 | "order": 15, 165 | "mode": 0, 166 | "inputs": [ 167 | { 168 | "name": "any_in", 169 | "type": "*", 170 | "link": 38, 171 | "color_on": "" 172 | }, 173 | { 174 | "name": "stop", 175 | "type": "BOOLEAN", 176 | "link": 57, 177 | "widget": { 178 | "name": "stop" 179 | } 180 | } 181 | ], 182 | "outputs": [ 183 | { 184 | "name": "LATENT", 185 | "type": "LATENT", 186 | "links": [ 187 | 39 188 | ], 189 | "shape": 3, 190 | "slot_index": 0, 191 | "color_on": "#FF9CF9" 192 | } 193 | ], 194 | "properties": { 195 | "Node name for S&R": "Interrupt" 196 | }, 197 | "widgets_values": [ 198 | false 199 | ] 200 | }, 201 | { 202 | "id": 5, 203 | "type": "EmptyLatentImage", 204 | "pos": [ 205 | 340, 206 | 400 207 | ], 208 | "size": { 209 | "0": 210, 210 | "1": 110 211 | }, 212 | "flags": {}, 213 | "order": 0, 214 | "mode": 0, 215 | "outputs": [ 216 | { 217 | "name": "LATENT", 218 | "type": "LATENT", 219 | "links": [ 220 | 38 221 | ], 222 | "slot_index": 0 223 | } 224 | ], 225 | "title": "Size", 226 | "properties": { 227 | "Node name for S&R": "EmptyLatentImage" 228 | }, 229 | "widgets_values": [ 230 | 1344, 231 | 768, 232 | 1 233 | ], 234 | "color": "#223", 235 | "bgcolor": "#335" 236 | }, 237 | { 238 | "id": 26, 239 | "type": "Reroute", 240 | "pos": [ 241 | 920, 242 | 60 243 | ], 244 | "size": [ 245 | 82, 246 | 26 247 | ], 248 | "flags": {}, 249 | "order": 8, 250 | "mode": 0, 251 | "inputs": [ 252 | { 253 | "name": "", 254 | "type": "*", 255 | "link": 28 256 | } 257 | ], 258 | "outputs": [ 259 | { 260 | "name": "MODEL", 261 | "type": "MODEL", 262 | "links": [ 263 | 29 264 | ], 265 | "slot_index": 0 266 | } 267 | ], 268 | "properties": { 269 | "showOutputText": true, 270 | "horizontal": false 271 | } 272 | }, 273 | { 274 | "id": 25, 275 | "type": "Reroute", 276 | "pos": [ 277 | 1240, 278 | 100 279 | ], 280 | "size": [ 281 | 75, 282 | 26 283 | ], 284 | "flags": {}, 285 | "order": 11, 286 | "mode": 0, 287 | "inputs": [ 288 | { 289 | "name": "", 290 | "type": "*", 291 | "link": 26 292 | } 293 | ], 294 | "outputs": [ 295 | { 296 | "name": "VAE", 297 | "type": "VAE", 298 | "links": [ 299 | 27 300 | ], 301 | "slot_index": 0 302 | } 303 | ], 304 | "properties": { 305 | "showOutputText": true, 306 | "horizontal": false 307 | } 308 | }, 309 | { 310 | "id": 16, 311 | "type": "PrimitiveNode", 312 | "pos": [ 313 | 340, 314 | 210 315 | ], 316 | "size": { 317 | "0": 380, 318 | "1": 140 319 | }, 320 | "flags": {}, 321 | "order": 1, 322 | "mode": 0, 323 | "outputs": [ 324 | { 325 | "name": "STRING", 326 | "type": "STRING", 327 | "links": [ 328 | 37, 329 | 42 330 | ], 331 | "slot_index": 0, 332 | "widget": { 333 | "name": "text" 334 | } 335 | } 336 | ], 337 | "title": "Positive", 338 | "properties": { 339 | "Run widget replace on values": false 340 | }, 341 | "widgets_values": [ 342 | "abstract concept art of a woman vaulting over a block wearing helmet, dynamic pose ,TRON aesthetic, canvas, exotic design, polygons, electric sparks, illustration masterpiece, 8K wallpaper, art by Benedick Bana, Jarek Kubicki, Paul Catherall" 343 | ], 344 | "color": "#232", 345 | "bgcolor": "#353" 346 | }, 347 | { 348 | "id": 4, 349 | "type": "CheckpointLoaderSimple", 350 | "pos": [ 351 | 340, 352 | 60 353 | ], 354 | "size": { 355 | "0": 380, 356 | "1": 100 357 | }, 358 | "flags": {}, 359 | "order": 2, 360 | "mode": 0, 361 | "outputs": [ 362 | { 363 | "name": "MODEL", 364 | "type": "MODEL", 365 | "links": [ 366 | 28 367 | ], 368 | "slot_index": 0 369 | }, 370 | { 371 | "name": "CLIP", 372 | "type": "CLIP", 373 | "links": [ 374 | 3, 375 | 5 376 | ], 377 | "slot_index": 1 378 | }, 379 | { 380 | "name": "VAE", 381 | "type": "VAE", 382 | "links": [ 383 | 26 384 | ], 385 | "slot_index": 2 386 | } 387 | ], 388 | "properties": { 389 | "Node name for S&R": "CheckpointLoaderSimple" 390 | }, 391 | "widgets_values": [ 392 | "XL\\sd_xl_base_1.0.safetensors" 393 | ], 394 | "color": "#223", 395 | "bgcolor": "#335" 396 | }, 397 | { 398 | "id": 8, 399 | "type": "VAEDecode", 400 | "pos": [ 401 | 1340, 402 | 190 403 | ], 404 | "size": { 405 | "0": 140, 406 | "1": 50 407 | }, 408 | "flags": {}, 409 | "order": 17, 410 | "mode": 0, 411 | "inputs": [ 412 | { 413 | "name": "samples", 414 | "type": "LATENT", 415 | "link": 7 416 | }, 417 | { 418 | "name": "vae", 419 | "type": "VAE", 420 | "link": 27 421 | } 422 | ], 423 | "outputs": [ 424 | { 425 | "name": "IMAGE", 426 | "type": "IMAGE", 427 | "links": [ 428 | 45, 429 | 56 430 | ], 431 | "slot_index": 0 432 | } 433 | ], 434 | "properties": { 435 | "Node name for S&R": "VAEDecode" 436 | } 437 | }, 438 | { 439 | "id": 45, 440 | "type": "CyclistMathFloat", 441 | "pos": [ 442 | 340, 443 | 560 444 | ], 445 | "size": { 446 | "0": 210, 447 | "1": 110 448 | }, 449 | "flags": {}, 450 | "order": 3, 451 | "mode": 0, 452 | "outputs": [ 453 | { 454 | "name": "FLOAT", 455 | "type": "FLOAT", 456 | "links": [ 457 | 54 458 | ], 459 | "shape": 3, 460 | "slot_index": 0 461 | } 462 | ], 463 | "title": "Target Score", 464 | "properties": { 465 | "Node name for S&R": "CyclistMathFloat" 466 | }, 467 | "widgets_values": [ 468 | "addition", 469 | 0.5, 470 | 0 471 | ], 472 | "color": "#232", 473 | "bgcolor": "#353" 474 | }, 475 | { 476 | "id": 46, 477 | "type": "CyclistCompare", 478 | "pos": [ 479 | 580, 480 | 560 481 | ], 482 | "size": { 483 | "0": 210, 484 | "1": 80 485 | }, 486 | "flags": {}, 487 | "order": 14, 488 | "mode": 0, 489 | "inputs": [ 490 | { 491 | "name": "thing1", 492 | "type": "*", 493 | "link": 54 494 | }, 495 | { 496 | "name": "thing2", 497 | "type": "*", 498 | "link": 58 499 | } 500 | ], 501 | "outputs": [ 502 | { 503 | "name": "BOOLEAN", 504 | "type": "BOOLEAN", 505 | "links": [ 506 | 57 507 | ], 508 | "shape": 3, 509 | "slot_index": 0 510 | } 511 | ], 512 | "properties": { 513 | "Node name for S&R": "CyclistCompare" 514 | }, 515 | "widgets_values": [ 516 | "less than" 517 | ] 518 | }, 519 | { 520 | "id": 48, 521 | "type": "RecallFloat", 522 | "pos": [ 523 | 340, 524 | 720 525 | ], 526 | "size": [ 527 | 210, 528 | 60 529 | ], 530 | "flags": {}, 531 | "order": 12, 532 | "mode": 0, 533 | "inputs": [ 534 | { 535 | "name": "loop_id", 536 | "type": "STRING", 537 | "link": 61, 538 | "widget": { 539 | "name": "loop_id" 540 | } 541 | } 542 | ], 543 | "outputs": [ 544 | { 545 | "name": "FLOAT", 546 | "type": "FLOAT", 547 | "links": [ 548 | 58 549 | ], 550 | "shape": 3, 551 | "slot_index": 0 552 | } 553 | ], 554 | "properties": { 555 | "Node name for S&R": "RecallFloat" 556 | }, 557 | "widgets_values": [ 558 | "Score_1", 559 | -7 560 | ] 561 | }, 562 | { 563 | "id": 47, 564 | "type": "OverrideImage", 565 | "pos": [ 566 | 1590, 567 | 190 568 | ], 569 | "size": [ 570 | 320, 571 | 270 572 | ], 573 | "flags": {}, 574 | "order": 19, 575 | "mode": 0, 576 | "inputs": [ 577 | { 578 | "name": "image", 579 | "type": "IMAGE", 580 | "link": 56 581 | }, 582 | { 583 | "name": "filename", 584 | "type": "STRING", 585 | "link": 60, 586 | "widget": { 587 | "name": "filename" 588 | } 589 | } 590 | ], 591 | "properties": { 592 | "Node name for S&R": "OverrideImage" 593 | }, 594 | "widgets_values": [ 595 | "AestheticArt_1" 596 | ] 597 | }, 598 | { 599 | "id": 50, 600 | "type": "LoopManager", 601 | "pos": [ 602 | 90, 603 | 780 604 | ], 605 | "size": [ 606 | 220, 607 | 120 608 | ], 609 | "flags": {}, 610 | "order": 4, 611 | "mode": 0, 612 | "outputs": [ 613 | { 614 | "name": "STRING", 615 | "type": "STRING", 616 | "links": [ 617 | 61, 618 | 62 619 | ], 620 | "shape": 3, 621 | "slot_index": 0 622 | } 623 | ], 624 | "properties": { 625 | "Node name for S&R": "LoopManager" 626 | }, 627 | "widgets_values": [ 628 | "Score_2", 629 | "by_interrupt_node", 630 | "Score_1:\n(#4)FLOAT: 0.9399489164352417\n\nAestheticArt_1:\n(#11)IMAGE: AestheticArt_1.png" 631 | ] 632 | }, 633 | { 634 | "id": 30, 635 | "type": "Reroute", 636 | "pos": [ 637 | 850, 638 | 590 639 | ], 640 | "size": [ 641 | 90.4, 642 | 26 643 | ], 644 | "flags": {}, 645 | "order": 7, 646 | "mode": 0, 647 | "inputs": [ 648 | { 649 | "name": "", 650 | "type": "*", 651 | "link": 42, 652 | "widget": { 653 | "name": "value" 654 | } 655 | } 656 | ], 657 | "outputs": [ 658 | { 659 | "name": "STRING", 660 | "type": "STRING", 661 | "links": [ 662 | 41 663 | ], 664 | "slot_index": 0 665 | } 666 | ], 667 | "properties": { 668 | "showOutputText": true, 669 | "horizontal": false 670 | } 671 | }, 672 | { 673 | "id": 13, 674 | "type": "ImageRewardLoader", 675 | "pos": [ 676 | 1100, 677 | 530 678 | ], 679 | "size": { 680 | "0": 210, 681 | "1": 60 682 | }, 683 | "flags": {}, 684 | "order": 5, 685 | "mode": 0, 686 | "outputs": [ 687 | { 688 | "name": "IMAGEREWARD_MODEL", 689 | "type": "IMAGEREWARD_MODEL", 690 | "links": [ 691 | 10 692 | ], 693 | "shape": 3, 694 | "slot_index": 0 695 | } 696 | ], 697 | "properties": { 698 | "Node name for S&R": "ImageRewardLoader" 699 | }, 700 | "widgets_values": [ 701 | "ImageReward-v1.0" 702 | ] 703 | }, 704 | { 705 | "id": 49, 706 | "type": "MemorizeFloat", 707 | "pos": [ 708 | 1590, 709 | 550 710 | ], 711 | "size": [ 712 | 210, 713 | 50 714 | ], 715 | "flags": {}, 716 | "order": 20, 717 | "mode": 0, 718 | "inputs": [ 719 | { 720 | "name": "to_memory", 721 | "type": "FLOAT", 722 | "link": 59, 723 | "widget": { 724 | "name": "to_memory" 725 | } 726 | }, 727 | { 728 | "name": "loop_id", 729 | "type": "STRING", 730 | "link": 63, 731 | "widget": { 732 | "name": "loop_id" 733 | } 734 | } 735 | ], 736 | "properties": { 737 | "Node name for S&R": "MemorizeFloat" 738 | }, 739 | "widgets_values": [ 740 | "Score_1", 741 | 0 742 | ] 743 | }, 744 | { 745 | "id": 15, 746 | "type": "ImageRewardScore", 747 | "pos": [ 748 | 1340, 749 | 550 750 | ], 751 | "size": [ 752 | 220, 753 | 70 754 | ], 755 | "flags": {}, 756 | "order": 18, 757 | "mode": 0, 758 | "inputs": [ 759 | { 760 | "name": "model", 761 | "type": "IMAGEREWARD_MODEL", 762 | "link": 10 763 | }, 764 | { 765 | "name": "images", 766 | "type": "IMAGE", 767 | "link": 45 768 | }, 769 | { 770 | "name": "prompt", 771 | "type": "STRING", 772 | "link": 41, 773 | "widget": { 774 | "name": "prompt" 775 | } 776 | } 777 | ], 778 | "outputs": [ 779 | { 780 | "name": "SCORE_FLOAT", 781 | "type": "FLOAT", 782 | "links": [ 783 | 59 784 | ], 785 | "shape": 3, 786 | "slot_index": 0 787 | }, 788 | { 789 | "name": "SCORE_STRING", 790 | "type": "STRING", 791 | "links": [], 792 | "shape": 3, 793 | "slot_index": 1 794 | } 795 | ], 796 | "properties": { 797 | "Node name for S&R": "ImageRewardScore" 798 | }, 799 | "widgets_values": [ 800 | "abstract concept art of a woman vaulting over a block wearing helmet, dynamic pose ,TRON aesthetic, canvas, exotic design, polygons, electric sparks, illustration masterpiece, 8K wallpaper, art by Benedick Bana, Jarek Kubicki, Paul Catherall" 801 | ] 802 | }, 803 | { 804 | "id": 52, 805 | "type": "Reroute", 806 | "pos": [ 807 | 1460, 808 | 780 809 | ], 810 | "size": [ 811 | 90.4, 812 | 26 813 | ], 814 | "flags": {}, 815 | "order": 13, 816 | "mode": 0, 817 | "inputs": [ 818 | { 819 | "name": "", 820 | "type": "*", 821 | "link": 62, 822 | "widget": { 823 | "name": "value" 824 | } 825 | } 826 | ], 827 | "outputs": [ 828 | { 829 | "name": "STRING", 830 | "type": "STRING", 831 | "links": [ 832 | 63 833 | ], 834 | "slot_index": 0 835 | } 836 | ], 837 | "properties": { 838 | "showOutputText": true, 839 | "horizontal": false 840 | } 841 | }, 842 | { 843 | "id": 51, 844 | "type": "LoopManager", 845 | "pos": [ 846 | 1340, 847 | 290 848 | ], 849 | "size": [ 850 | 220, 851 | 200 852 | ], 853 | "flags": {}, 854 | "order": 6, 855 | "mode": 0, 856 | "outputs": [ 857 | { 858 | "name": "STRING", 859 | "type": "STRING", 860 | "links": [ 861 | 60 862 | ], 863 | "shape": 3, 864 | "slot_index": 0 865 | } 866 | ], 867 | "title": "Loop Manager (filename)", 868 | "properties": { 869 | "Node name for S&R": "LoopManager" 870 | }, 871 | "widgets_values": [ 872 | "AestheticArt_2", 873 | "by_interrupt_node", 874 | "Score_1:\n(#4)FLOAT: 0.9399489164352417\n\nAestheticArt_1:\n(#11)IMAGE: AestheticArt_1.png" 875 | ], 876 | "color": "#232", 877 | "bgcolor": "#353" 878 | } 879 | ], 880 | "links": [ 881 | [ 882 | 3, 883 | 4, 884 | 1, 885 | 6, 886 | 0, 887 | "CLIP" 888 | ], 889 | [ 890 | 4, 891 | 6, 892 | 0, 893 | 3, 894 | 1, 895 | "CONDITIONING" 896 | ], 897 | [ 898 | 5, 899 | 4, 900 | 1, 901 | 7, 902 | 0, 903 | "CLIP" 904 | ], 905 | [ 906 | 6, 907 | 7, 908 | 0, 909 | 3, 910 | 2, 911 | "CONDITIONING" 912 | ], 913 | [ 914 | 7, 915 | 3, 916 | 0, 917 | 8, 918 | 0, 919 | "LATENT" 920 | ], 921 | [ 922 | 10, 923 | 13, 924 | 0, 925 | 15, 926 | 0, 927 | "IMAGEREWARD_MODEL" 928 | ], 929 | [ 930 | 26, 931 | 4, 932 | 2, 933 | 25, 934 | 0, 935 | "*" 936 | ], 937 | [ 938 | 27, 939 | 25, 940 | 0, 941 | 8, 942 | 1, 943 | "VAE" 944 | ], 945 | [ 946 | 28, 947 | 4, 948 | 0, 949 | 26, 950 | 0, 951 | "*" 952 | ], 953 | [ 954 | 29, 955 | 26, 956 | 0, 957 | 3, 958 | 0, 959 | "MODEL" 960 | ], 961 | [ 962 | 37, 963 | 16, 964 | 0, 965 | 6, 966 | 1, 967 | "STRING" 968 | ], 969 | [ 970 | 38, 971 | 5, 972 | 0, 973 | 29, 974 | 0, 975 | "*" 976 | ], 977 | [ 978 | 39, 979 | 29, 980 | 0, 981 | 3, 982 | 3, 983 | "LATENT" 984 | ], 985 | [ 986 | 41, 987 | 30, 988 | 0, 989 | 15, 990 | 2, 991 | "STRING" 992 | ], 993 | [ 994 | 42, 995 | 16, 996 | 0, 997 | 30, 998 | 0, 999 | "*" 1000 | ], 1001 | [ 1002 | 45, 1003 | 8, 1004 | 0, 1005 | 15, 1006 | 1, 1007 | "IMAGE" 1008 | ], 1009 | [ 1010 | 54, 1011 | 45, 1012 | 0, 1013 | 46, 1014 | 0, 1015 | "*" 1016 | ], 1017 | [ 1018 | 56, 1019 | 8, 1020 | 0, 1021 | 47, 1022 | 0, 1023 | "IMAGE" 1024 | ], 1025 | [ 1026 | 57, 1027 | 46, 1028 | 0, 1029 | 29, 1030 | 1, 1031 | "BOOLEAN" 1032 | ], 1033 | [ 1034 | 58, 1035 | 48, 1036 | 0, 1037 | 46, 1038 | 1, 1039 | "*" 1040 | ], 1041 | [ 1042 | 59, 1043 | 15, 1044 | 0, 1045 | 49, 1046 | 0, 1047 | "FLOAT" 1048 | ], 1049 | [ 1050 | 60, 1051 | 51, 1052 | 0, 1053 | 47, 1054 | 1, 1055 | "STRING" 1056 | ], 1057 | [ 1058 | 61, 1059 | 50, 1060 | 0, 1061 | 48, 1062 | 0, 1063 | "STRING" 1064 | ], 1065 | [ 1066 | 62, 1067 | 50, 1068 | 0, 1069 | 52, 1070 | 0, 1071 | "*" 1072 | ], 1073 | [ 1074 | 63, 1075 | 52, 1076 | 0, 1077 | 49, 1078 | 1, 1079 | "STRING" 1080 | ] 1081 | ], 1082 | "groups": [], 1083 | "config": {}, 1084 | "extra": {}, 1085 | "version": 0.4 1086 | } -------------------------------------------------------------------------------- /workflows/GenUntilGoodNoWAS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pos13/comfyui-cyclist/6b6accd84fcd69cb6b04e7f6b500a90c28171fca/workflows/GenUntilGoodNoWAS.png -------------------------------------------------------------------------------- /workflows/GenUntilRight.json: -------------------------------------------------------------------------------- 1 | { 2 | "last_node_id": 79, 3 | "last_link_id": 133, 4 | "nodes": [ 5 | { 6 | "id": 29, 7 | "type": "Interrupt", 8 | "pos": [ 9 | 820, 10 | 460 11 | ], 12 | "size": [ 13 | 150, 14 | 60 15 | ], 16 | "flags": {}, 17 | "order": 17, 18 | "mode": 0, 19 | "inputs": [ 20 | { 21 | "name": "any_in", 22 | "type": "*", 23 | "link": 38, 24 | "color_on": "" 25 | }, 26 | { 27 | "name": "stop", 28 | "type": "BOOLEAN", 29 | "link": 116, 30 | "widget": { 31 | "name": "stop" 32 | } 33 | } 34 | ], 35 | "outputs": [ 36 | { 37 | "name": "LATENT", 38 | "type": "LATENT", 39 | "links": [ 40 | 39 41 | ], 42 | "shape": 3, 43 | "slot_index": 0, 44 | "color_on": "#FF9CF9" 45 | } 46 | ], 47 | "properties": { 48 | "Node name for S&R": "Interrupt" 49 | }, 50 | "widgets_values": [ 51 | false 52 | ] 53 | }, 54 | { 55 | "id": 26, 56 | "type": "Reroute", 57 | "pos": [ 58 | 888, 59 | 20 60 | ], 61 | "size": [ 62 | 82, 63 | 26 64 | ], 65 | "flags": {}, 66 | "order": 6, 67 | "mode": 0, 68 | "inputs": [ 69 | { 70 | "name": "", 71 | "type": "*", 72 | "link": 28 73 | } 74 | ], 75 | "outputs": [ 76 | { 77 | "name": "MODEL", 78 | "type": "MODEL", 79 | "links": [ 80 | 29 81 | ], 82 | "slot_index": 0 83 | } 84 | ], 85 | "properties": { 86 | "showOutputText": true, 87 | "horizontal": false 88 | } 89 | }, 90 | { 91 | "id": 6, 92 | "type": "CLIPTextEncode", 93 | "pos": [ 94 | 570, 95 | 150 96 | ], 97 | "size": { 98 | "0": 400, 99 | "1": 120 100 | }, 101 | "flags": {}, 102 | "order": 7, 103 | "mode": 0, 104 | "inputs": [ 105 | { 106 | "name": "clip", 107 | "type": "CLIP", 108 | "link": 3 109 | } 110 | ], 111 | "outputs": [ 112 | { 113 | "name": "CONDITIONING", 114 | "type": "CONDITIONING", 115 | "links": [ 116 | 4 117 | ], 118 | "slot_index": 0 119 | } 120 | ], 121 | "title": "Positive", 122 | "properties": { 123 | "Node name for S&R": "CLIPTextEncode" 124 | }, 125 | "widgets_values": [ 126 | "2girls, (two women cuddling together on a couch), (hug, hugging:1.2), {white skin and blonde hair|ebony skin and black hair}, {dress|skirt|shirt}, interracial, perfect, closed eyes, (yuri:0.9), highres, aesthetic lightning, (living room background)" 127 | ], 128 | "color": "#232", 129 | "bgcolor": "#353" 130 | }, 131 | { 132 | "id": 25, 133 | "type": "Reroute", 134 | "pos": [ 135 | 1225, 136 | 60 137 | ], 138 | "size": [ 139 | 75, 140 | 26 141 | ], 142 | "flags": {}, 143 | "order": 9, 144 | "mode": 0, 145 | "inputs": [ 146 | { 147 | "name": "", 148 | "type": "*", 149 | "link": 26 150 | } 151 | ], 152 | "outputs": [ 153 | { 154 | "name": "VAE", 155 | "type": "VAE", 156 | "links": [ 157 | 27 158 | ], 159 | "slot_index": 0 160 | } 161 | ], 162 | "properties": { 163 | "showOutputText": true, 164 | "horizontal": false 165 | } 166 | }, 167 | { 168 | "id": 5, 169 | "type": "EmptyLatentImage", 170 | "pos": [ 171 | 590, 172 | 460 173 | ], 174 | "size": { 175 | "0": 210, 176 | "1": 110 177 | }, 178 | "flags": {}, 179 | "order": 0, 180 | "mode": 0, 181 | "outputs": [ 182 | { 183 | "name": "LATENT", 184 | "type": "LATENT", 185 | "links": [ 186 | 38 187 | ], 188 | "slot_index": 0 189 | } 190 | ], 191 | "title": "Size", 192 | "properties": { 193 | "Node name for S&R": "EmptyLatentImage" 194 | }, 195 | "widgets_values": [ 196 | 768, 197 | 512, 198 | 1 199 | ], 200 | "color": "#223", 201 | "bgcolor": "#335" 202 | }, 203 | { 204 | "id": 72, 205 | "type": "Logic Comparison AND", 206 | "pos": [ 207 | 590, 208 | 620 209 | ], 210 | "size": { 211 | "0": 210, 212 | "1": 54 213 | }, 214 | "flags": {}, 215 | "order": 16, 216 | "mode": 0, 217 | "inputs": [ 218 | { 219 | "name": "boolean_a", 220 | "type": "BOOLEAN", 221 | "link": 128, 222 | "widget": { 223 | "name": "boolean_a" 224 | } 225 | }, 226 | { 227 | "name": "boolean_b", 228 | "type": "BOOLEAN", 229 | "link": 127, 230 | "widget": { 231 | "name": "boolean_b" 232 | } 233 | } 234 | ], 235 | "outputs": [ 236 | { 237 | "name": "BOOLEAN", 238 | "type": "BOOLEAN", 239 | "links": [ 240 | 116 241 | ], 242 | "shape": 3, 243 | "slot_index": 0 244 | } 245 | ], 246 | "title": "Logic AND", 247 | "properties": { 248 | "Node name for S&R": "Logic Comparison AND" 249 | }, 250 | "widgets_values": [ 251 | false, 252 | false 253 | ] 254 | }, 255 | { 256 | "id": 64, 257 | "type": "BLIP Model Loader", 258 | "pos": [ 259 | -150, 260 | 530 261 | ], 262 | "size": { 263 | "0": 210, 264 | "1": 60 265 | }, 266 | "flags": {}, 267 | "order": 1, 268 | "mode": 0, 269 | "outputs": [ 270 | { 271 | "name": "BLIP_MODEL", 272 | "type": "BLIP_MODEL", 273 | "links": [ 274 | 103, 275 | 118 276 | ], 277 | "shape": 3, 278 | "slot_index": 0 279 | } 280 | ], 281 | "properties": { 282 | "Node name for S&R": "BLIP Model Loader" 283 | }, 284 | "widgets_values": [ 285 | "interrogate" 286 | ] 287 | }, 288 | { 289 | "id": 62, 290 | "type": "BLIP Analyze Image", 291 | "pos": [ 292 | 90, 293 | 340 294 | ], 295 | "size": { 296 | "0": 210, 297 | "1": 120.00003051757812 298 | }, 299 | "flags": {}, 300 | "order": 12, 301 | "mode": 0, 302 | "inputs": [ 303 | { 304 | "name": "image", 305 | "type": "IMAGE", 306 | "link": 120 307 | }, 308 | { 309 | "name": "blip_model", 310 | "type": "BLIP_MODEL", 311 | "link": 103 312 | } 313 | ], 314 | "outputs": [ 315 | { 316 | "name": "STRING", 317 | "type": "STRING", 318 | "links": [ 319 | 123 320 | ], 321 | "shape": 3, 322 | "slot_index": 0 323 | } 324 | ], 325 | "properties": { 326 | "Node name for S&R": "BLIP Analyze Image" 327 | }, 328 | "widgets_values": [ 329 | "interrogate", 330 | "How many persons are there?" 331 | ], 332 | "color": "#232", 333 | "bgcolor": "#353" 334 | }, 335 | { 336 | "id": 68, 337 | "type": "EmptyImage", 338 | "pos": [ 339 | -390, 340 | 340 341 | ], 342 | "size": { 343 | "0": 210, 344 | "1": 130 345 | }, 346 | "flags": {}, 347 | "order": 2, 348 | "mode": 0, 349 | "outputs": [ 350 | { 351 | "name": "IMAGE", 352 | "type": "IMAGE", 353 | "links": [ 354 | 122 355 | ], 356 | "shape": 3, 357 | "slot_index": 0 358 | } 359 | ], 360 | "properties": { 361 | "Node name for S&R": "EmptyImage" 362 | }, 363 | "widgets_values": [ 364 | 512, 365 | 512, 366 | 1, 367 | 0 368 | ] 369 | }, 370 | { 371 | "id": 70, 372 | "type": "BLIP Analyze Image", 373 | "pos": [ 374 | 90, 375 | 510 376 | ], 377 | "size": { 378 | "0": 210, 379 | "1": 120.00003051757812 380 | }, 381 | "flags": {}, 382 | "order": 13, 383 | "mode": 0, 384 | "inputs": [ 385 | { 386 | "name": "image", 387 | "type": "IMAGE", 388 | "link": 121 389 | }, 390 | { 391 | "name": "blip_model", 392 | "type": "BLIP_MODEL", 393 | "link": 118 394 | } 395 | ], 396 | "outputs": [ 397 | { 398 | "name": "STRING", 399 | "type": "STRING", 400 | "links": [ 401 | 125 402 | ], 403 | "shape": 3, 404 | "slot_index": 0 405 | } 406 | ], 407 | "properties": { 408 | "Node name for S&R": "BLIP Analyze Image" 409 | }, 410 | "widgets_values": [ 411 | "interrogate", 412 | "Do they hug?" 413 | ], 414 | "color": "#232", 415 | "bgcolor": "#353" 416 | }, 417 | { 418 | "id": 76, 419 | "type": "CyclistCompare", 420 | "pos": [ 421 | 330, 422 | 510 423 | ], 424 | "size": { 425 | "0": 210, 426 | "1": 80 427 | }, 428 | "flags": {}, 429 | "order": 15, 430 | "mode": 0, 431 | "inputs": [ 432 | { 433 | "name": "thing1", 434 | "type": "*", 435 | "link": 125 436 | }, 437 | { 438 | "name": "thing2", 439 | "type": "*", 440 | "link": 126 441 | } 442 | ], 443 | "outputs": [ 444 | { 445 | "name": "BOOLEAN", 446 | "type": "BOOLEAN", 447 | "links": [ 448 | 127 449 | ], 450 | "shape": 3, 451 | "slot_index": 0 452 | } 453 | ], 454 | "properties": { 455 | "Node name for S&R": "CyclistCompare" 456 | }, 457 | "widgets_values": [ 458 | "equals" 459 | ] 460 | }, 461 | { 462 | "id": 75, 463 | "type": "CyclistCompare", 464 | "pos": [ 465 | 330, 466 | 340 467 | ], 468 | "size": { 469 | "0": 210, 470 | "1": 80 471 | }, 472 | "flags": {}, 473 | "order": 14, 474 | "mode": 0, 475 | "inputs": [ 476 | { 477 | "name": "thing1", 478 | "type": "*", 479 | "link": 123 480 | }, 481 | { 482 | "name": "thing2", 483 | "type": "*", 484 | "link": 124 485 | } 486 | ], 487 | "outputs": [ 488 | { 489 | "name": "BOOLEAN", 490 | "type": "BOOLEAN", 491 | "links": [ 492 | 128 493 | ], 494 | "shape": 3, 495 | "slot_index": 0 496 | } 497 | ], 498 | "properties": { 499 | "Node name for S&R": "CyclistCompare" 500 | }, 501 | "widgets_values": [ 502 | "equals" 503 | ] 504 | }, 505 | { 506 | "id": 8, 507 | "type": "VAEDecode", 508 | "pos": [ 509 | 1330, 510 | 130 511 | ], 512 | "size": { 513 | "0": 140, 514 | "1": 50 515 | }, 516 | "flags": {}, 517 | "order": 19, 518 | "mode": 0, 519 | "inputs": [ 520 | { 521 | "name": "samples", 522 | "type": "LATENT", 523 | "link": 7 524 | }, 525 | { 526 | "name": "vae", 527 | "type": "VAE", 528 | "link": 27 529 | } 530 | ], 531 | "outputs": [ 532 | { 533 | "name": "IMAGE", 534 | "type": "IMAGE", 535 | "links": [ 536 | 129 537 | ], 538 | "slot_index": 0 539 | } 540 | ], 541 | "properties": { 542 | "Node name for S&R": "VAEDecode" 543 | } 544 | }, 545 | { 546 | "id": 4, 547 | "type": "CheckpointLoaderSimple", 548 | "pos": [ 549 | 240, 550 | 20 551 | ], 552 | "size": { 553 | "0": 300, 554 | "1": 100 555 | }, 556 | "flags": {}, 557 | "order": 3, 558 | "mode": 0, 559 | "outputs": [ 560 | { 561 | "name": "MODEL", 562 | "type": "MODEL", 563 | "links": [ 564 | 28 565 | ], 566 | "slot_index": 0 567 | }, 568 | { 569 | "name": "CLIP", 570 | "type": "CLIP", 571 | "links": [ 572 | 3, 573 | 5 574 | ], 575 | "slot_index": 1 576 | }, 577 | { 578 | "name": "VAE", 579 | "type": "VAE", 580 | "links": [ 581 | 26 582 | ], 583 | "slot_index": 2 584 | } 585 | ], 586 | "properties": { 587 | "Node name for S&R": "CheckpointLoaderSimple" 588 | }, 589 | "widgets_values": [ 590 | "aZovyaRPGArtistTools_v4.safetensors" 591 | ], 592 | "color": "#223", 593 | "bgcolor": "#335" 594 | }, 595 | { 596 | "id": 7, 597 | "type": "CLIPTextEncode", 598 | "pos": [ 599 | 570, 600 | 320 601 | ], 602 | "size": { 603 | "0": 400, 604 | "1": 90 605 | }, 606 | "flags": {}, 607 | "order": 8, 608 | "mode": 0, 609 | "inputs": [ 610 | { 611 | "name": "clip", 612 | "type": "CLIP", 613 | "link": 5 614 | } 615 | ], 616 | "outputs": [ 617 | { 618 | "name": "CONDITIONING", 619 | "type": "CONDITIONING", 620 | "links": [ 621 | 6 622 | ], 623 | "slot_index": 0 624 | } 625 | ], 626 | "title": "Negative", 627 | "properties": { 628 | "Node name for S&R": "CLIPTextEncode" 629 | }, 630 | "widgets_values": [ 631 | "embedding:easynegative, embedding:ng_deepnegative_v1_75T, (child, childish, loli, lolicon), embedding:AS-Adult-neg:0.8, (low quality, worst quality), blurry, text, (naked, nsfw, nude, topless, breasts)" 632 | ], 633 | "color": "#232", 634 | "bgcolor": "#353" 635 | }, 636 | { 637 | "id": 77, 638 | "type": "OverrideImage", 639 | "pos": [ 640 | 1500, 641 | 130 642 | ], 643 | "size": [ 644 | 320, 645 | 270 646 | ], 647 | "flags": {}, 648 | "order": 20, 649 | "mode": 0, 650 | "inputs": [ 651 | { 652 | "name": "image", 653 | "type": "IMAGE", 654 | "link": 129 655 | }, 656 | { 657 | "name": "filename", 658 | "type": "STRING", 659 | "link": 132, 660 | "widget": { 661 | "name": "filename" 662 | } 663 | } 664 | ], 665 | "properties": { 666 | "Node name for S&R": "OverrideImage" 667 | }, 668 | "widgets_values": [ 669 | "BLIPTested_1" 670 | ] 671 | }, 672 | { 673 | "id": 74, 674 | "type": "Text String", 675 | "pos": [ 676 | 90, 677 | 720 678 | ], 679 | "size": { 680 | "0": 210, 681 | "1": 190 682 | }, 683 | "flags": {}, 684 | "order": 4, 685 | "mode": 0, 686 | "outputs": [ 687 | { 688 | "name": "STRING", 689 | "type": "STRING", 690 | "links": [ 691 | 124 692 | ], 693 | "shape": 3, 694 | "slot_index": 0 695 | }, 696 | { 697 | "name": "STRING", 698 | "type": "STRING", 699 | "links": [ 700 | 126 701 | ], 702 | "shape": 3, 703 | "slot_index": 1 704 | }, 705 | { 706 | "name": "STRING", 707 | "type": "STRING", 708 | "links": null, 709 | "shape": 3 710 | }, 711 | { 712 | "name": "STRING", 713 | "type": "STRING", 714 | "links": null, 715 | "shape": 3 716 | } 717 | ], 718 | "title": "Right Answers", 719 | "properties": { 720 | "Node name for S&R": "Text String" 721 | }, 722 | "widgets_values": [ 723 | "two", 724 | "yes", 725 | "", 726 | "" 727 | ], 728 | "color": "#232", 729 | "bgcolor": "#353" 730 | }, 731 | { 732 | "id": 73, 733 | "type": "ReloadImage", 734 | "pos": [ 735 | -150, 736 | 340 737 | ], 738 | "size": [ 739 | 210, 740 | 60 741 | ], 742 | "flags": {}, 743 | "order": 11, 744 | "mode": 0, 745 | "inputs": [ 746 | { 747 | "name": "fallback", 748 | "type": "IMAGE", 749 | "link": 122 750 | }, 751 | { 752 | "name": "filename", 753 | "type": "STRING", 754 | "link": 133, 755 | "widget": { 756 | "name": "filename" 757 | } 758 | } 759 | ], 760 | "outputs": [ 761 | { 762 | "name": "IMAGE", 763 | "type": "IMAGE", 764 | "links": [ 765 | 120, 766 | 121 767 | ], 768 | "shape": 3, 769 | "slot_index": 0 770 | } 771 | ], 772 | "properties": { 773 | "Node name for S&R": "ReloadImage" 774 | }, 775 | "widgets_values": [ 776 | "BLIPTested_1" 777 | ] 778 | }, 779 | { 780 | "id": 79, 781 | "type": "Reroute", 782 | "pos": [ 783 | 1209.6, 784 | 670 785 | ], 786 | "size": [ 787 | 90.4, 788 | 26 789 | ], 790 | "flags": {}, 791 | "order": 10, 792 | "mode": 0, 793 | "inputs": [ 794 | { 795 | "name": "", 796 | "type": "*", 797 | "link": 131, 798 | "widget": { 799 | "name": "value" 800 | } 801 | } 802 | ], 803 | "outputs": [ 804 | { 805 | "name": "STRING", 806 | "type": "STRING", 807 | "links": [ 808 | 132 809 | ], 810 | "slot_index": 0 811 | } 812 | ], 813 | "properties": { 814 | "showOutputText": true, 815 | "horizontal": false 816 | } 817 | }, 818 | { 819 | "id": 3, 820 | "type": "KSampler", 821 | "pos": [ 822 | 1020, 823 | 130 824 | ], 825 | "size": { 826 | "0": 280, 827 | "1": 262 828 | }, 829 | "flags": {}, 830 | "order": 18, 831 | "mode": 0, 832 | "inputs": [ 833 | { 834 | "name": "model", 835 | "type": "MODEL", 836 | "link": 29 837 | }, 838 | { 839 | "name": "positive", 840 | "type": "CONDITIONING", 841 | "link": 4 842 | }, 843 | { 844 | "name": "negative", 845 | "type": "CONDITIONING", 846 | "link": 6 847 | }, 848 | { 849 | "name": "latent_image", 850 | "type": "LATENT", 851 | "link": 39 852 | } 853 | ], 854 | "outputs": [ 855 | { 856 | "name": "LATENT", 857 | "type": "LATENT", 858 | "links": [ 859 | 7 860 | ], 861 | "slot_index": 0 862 | } 863 | ], 864 | "properties": { 865 | "Node name for S&R": "KSampler" 866 | }, 867 | "widgets_values": [ 868 | 263288782866168, 869 | "randomize", 870 | 26, 871 | 7, 872 | "dpmpp_3m_sde_gpu", 873 | "karras", 874 | 1 875 | ] 876 | }, 877 | { 878 | "id": 78, 879 | "type": "LoopManager", 880 | "pos": [ 881 | -390, 882 | 670 883 | ], 884 | "size": [ 885 | 220, 886 | 240 887 | ], 888 | "flags": {}, 889 | "order": 5, 890 | "mode": 0, 891 | "outputs": [ 892 | { 893 | "name": "STRING", 894 | "type": "STRING", 895 | "links": [ 896 | 131, 897 | 133 898 | ], 899 | "shape": 3, 900 | "slot_index": 0 901 | } 902 | ], 903 | "properties": { 904 | "Node name for S&R": "LoopManager" 905 | }, 906 | "widgets_values": [ 907 | "BLIPTested_1", 908 | "by_interrupt_node", 909 | "BLIPTested_15:\n(#1)IMAGE: BLIPTested_15.png\n\nBLIPTested_14:\n(#1)IMAGE: BLIPTested_14.png\n\nScore_1:\n(#4)FLOAT: 0.9399489164352417\n\nAestheticArt_1:\n(#11)IMAGE: AestheticArt_1.png" 910 | ], 911 | "color": "#232", 912 | "bgcolor": "#353" 913 | } 914 | ], 915 | "links": [ 916 | [ 917 | 3, 918 | 4, 919 | 1, 920 | 6, 921 | 0, 922 | "CLIP" 923 | ], 924 | [ 925 | 4, 926 | 6, 927 | 0, 928 | 3, 929 | 1, 930 | "CONDITIONING" 931 | ], 932 | [ 933 | 5, 934 | 4, 935 | 1, 936 | 7, 937 | 0, 938 | "CLIP" 939 | ], 940 | [ 941 | 6, 942 | 7, 943 | 0, 944 | 3, 945 | 2, 946 | "CONDITIONING" 947 | ], 948 | [ 949 | 7, 950 | 3, 951 | 0, 952 | 8, 953 | 0, 954 | "LATENT" 955 | ], 956 | [ 957 | 26, 958 | 4, 959 | 2, 960 | 25, 961 | 0, 962 | "*" 963 | ], 964 | [ 965 | 27, 966 | 25, 967 | 0, 968 | 8, 969 | 1, 970 | "VAE" 971 | ], 972 | [ 973 | 28, 974 | 4, 975 | 0, 976 | 26, 977 | 0, 978 | "*" 979 | ], 980 | [ 981 | 29, 982 | 26, 983 | 0, 984 | 3, 985 | 0, 986 | "MODEL" 987 | ], 988 | [ 989 | 38, 990 | 5, 991 | 0, 992 | 29, 993 | 0, 994 | "*" 995 | ], 996 | [ 997 | 39, 998 | 29, 999 | 0, 1000 | 3, 1001 | 3, 1002 | "LATENT" 1003 | ], 1004 | [ 1005 | 103, 1006 | 64, 1007 | 0, 1008 | 62, 1009 | 1, 1010 | "BLIP_MODEL" 1011 | ], 1012 | [ 1013 | 116, 1014 | 72, 1015 | 0, 1016 | 29, 1017 | 1, 1018 | "BOOLEAN" 1019 | ], 1020 | [ 1021 | 118, 1022 | 64, 1023 | 0, 1024 | 70, 1025 | 1, 1026 | "BLIP_MODEL" 1027 | ], 1028 | [ 1029 | 120, 1030 | 73, 1031 | 0, 1032 | 62, 1033 | 0, 1034 | "IMAGE" 1035 | ], 1036 | [ 1037 | 121, 1038 | 73, 1039 | 0, 1040 | 70, 1041 | 0, 1042 | "IMAGE" 1043 | ], 1044 | [ 1045 | 122, 1046 | 68, 1047 | 0, 1048 | 73, 1049 | 0, 1050 | "IMAGE" 1051 | ], 1052 | [ 1053 | 123, 1054 | 62, 1055 | 0, 1056 | 75, 1057 | 0, 1058 | "*" 1059 | ], 1060 | [ 1061 | 124, 1062 | 74, 1063 | 0, 1064 | 75, 1065 | 1, 1066 | "*" 1067 | ], 1068 | [ 1069 | 125, 1070 | 70, 1071 | 0, 1072 | 76, 1073 | 0, 1074 | "*" 1075 | ], 1076 | [ 1077 | 126, 1078 | 74, 1079 | 1, 1080 | 76, 1081 | 1, 1082 | "*" 1083 | ], 1084 | [ 1085 | 127, 1086 | 76, 1087 | 0, 1088 | 72, 1089 | 1, 1090 | "BOOLEAN" 1091 | ], 1092 | [ 1093 | 128, 1094 | 75, 1095 | 0, 1096 | 72, 1097 | 0, 1098 | "BOOLEAN" 1099 | ], 1100 | [ 1101 | 129, 1102 | 8, 1103 | 0, 1104 | 77, 1105 | 0, 1106 | "IMAGE" 1107 | ], 1108 | [ 1109 | 131, 1110 | 78, 1111 | 0, 1112 | 79, 1113 | 0, 1114 | "*" 1115 | ], 1116 | [ 1117 | 132, 1118 | 79, 1119 | 0, 1120 | 77, 1121 | 1, 1122 | "STRING" 1123 | ], 1124 | [ 1125 | 133, 1126 | 78, 1127 | 0, 1128 | 73, 1129 | 1, 1130 | "STRING" 1131 | ] 1132 | ], 1133 | "groups": [ 1134 | { 1135 | "title": "Test the result", 1136 | "bounding": [ 1137 | -400, 1138 | 266, 1139 | 950, 1140 | 654 1141 | ], 1142 | "color": "#3f789e", 1143 | "font_size": 24, 1144 | "locked": false 1145 | } 1146 | ], 1147 | "config": {}, 1148 | "extra": {}, 1149 | "version": 0.4 1150 | } -------------------------------------------------------------------------------- /workflows/GenUntilRight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pos13/comfyui-cyclist/6b6accd84fcd69cb6b04e7f6b500a90c28171fca/workflows/GenUntilRight.png -------------------------------------------------------------------------------- /workflows/LoRABurnTest.json: -------------------------------------------------------------------------------- 1 | { 2 | "last_node_id": 107, 3 | "last_link_id": 212, 4 | "nodes": [ 5 | { 6 | "id": 94, 7 | "type": "SaveImage", 8 | "pos": [ 9 | 1810, 10 | 100 11 | ], 12 | "size": { 13 | "0": 320, 14 | "1": 270 15 | }, 16 | "flags": {}, 17 | "order": 18, 18 | "mode": 0, 19 | "inputs": [ 20 | { 21 | "name": "images", 22 | "type": "IMAGE", 23 | "link": 158 24 | }, 25 | { 26 | "name": "filename_prefix", 27 | "type": "STRING", 28 | "link": 159, 29 | "widget": { 30 | "name": "filename_prefix" 31 | } 32 | } 33 | ], 34 | "properties": {}, 35 | "widgets_values": [ 36 | "ComfyUI" 37 | ] 38 | }, 39 | { 40 | "id": 8, 41 | "type": "VAEDecode", 42 | "pos": [ 43 | 1640, 44 | 100 45 | ], 46 | "size": { 47 | "0": 140, 48 | "1": 50 49 | }, 50 | "flags": {}, 51 | "order": 17, 52 | "mode": 0, 53 | "inputs": [ 54 | { 55 | "name": "samples", 56 | "type": "LATENT", 57 | "link": 7 58 | }, 59 | { 60 | "name": "vae", 61 | "type": "VAE", 62 | "link": 165 63 | } 64 | ], 65 | "outputs": [ 66 | { 67 | "name": "IMAGE", 68 | "type": "IMAGE", 69 | "links": [ 70 | 158 71 | ], 72 | "slot_index": 0 73 | } 74 | ], 75 | "properties": { 76 | "Node name for S&R": "VAEDecode" 77 | } 78 | }, 79 | { 80 | "id": 97, 81 | "type": "Reroute", 82 | "pos": [ 83 | 1535, 84 | 30 85 | ], 86 | "size": [ 87 | 75, 88 | 26 89 | ], 90 | "flags": {}, 91 | "order": 13, 92 | "mode": 0, 93 | "inputs": [ 94 | { 95 | "name": "", 96 | "type": "*", 97 | "link": 167 98 | } 99 | ], 100 | "outputs": [ 101 | { 102 | "name": "VAE", 103 | "type": "VAE", 104 | "links": [ 105 | 165 106 | ], 107 | "slot_index": 0 108 | } 109 | ], 110 | "properties": { 111 | "showOutputText": true, 112 | "horizontal": false 113 | } 114 | }, 115 | { 116 | "id": 96, 117 | "type": "Reroute", 118 | "pos": [ 119 | 630, 120 | 30 121 | ], 122 | "size": [ 123 | 75, 124 | 26 125 | ], 126 | "flags": {}, 127 | "order": 8, 128 | "mode": 0, 129 | "inputs": [ 130 | { 131 | "name": "", 132 | "type": "*", 133 | "link": 191 134 | } 135 | ], 136 | "outputs": [ 137 | { 138 | "name": "VAE", 139 | "type": "VAE", 140 | "links": [ 141 | 167 142 | ], 143 | "slot_index": 0 144 | } 145 | ], 146 | "properties": { 147 | "showOutputText": true, 148 | "horizontal": false 149 | } 150 | }, 151 | { 152 | "id": 81, 153 | "type": "PrimitiveNode", 154 | "pos": [ 155 | 390, 156 | 250 157 | ], 158 | "size": { 159 | "0": 210, 160 | "1": 110 161 | }, 162 | "flags": {}, 163 | "order": 0, 164 | "mode": 0, 165 | "outputs": [ 166 | { 167 | "name": "COMBO", 168 | "type": "COMBO", 169 | "links": [ 170 | 144 171 | ], 172 | "slot_index": 0, 173 | "widget": { 174 | "name": "lora_name" 175 | } 176 | } 177 | ], 178 | "properties": { 179 | "Run widget replace on values": false 180 | }, 181 | "widgets_values": [ 182 | "Style\\wowifierV2.safetensors", 183 | "randomize", 184 | "style" 185 | ], 186 | "color": "#232", 187 | "bgcolor": "#353" 188 | }, 189 | { 190 | "id": 6, 191 | "type": "CLIPTextEncode", 192 | "pos": [ 193 | 900, 194 | 160 195 | ], 196 | "size": { 197 | "0": 390, 198 | "1": 140 199 | }, 200 | "flags": {}, 201 | "order": 10, 202 | "mode": 0, 203 | "inputs": [ 204 | { 205 | "name": "clip", 206 | "type": "CLIP", 207 | "link": 168 208 | } 209 | ], 210 | "outputs": [ 211 | { 212 | "name": "CONDITIONING", 213 | "type": "CONDITIONING", 214 | "links": [ 215 | 137 216 | ], 217 | "slot_index": 0 218 | } 219 | ], 220 | "title": "Positive", 221 | "properties": { 222 | "Node name for S&R": "CLIPTextEncode" 223 | }, 224 | "widgets_values": [ 225 | "old concrete sky scrapers, metropolis cityscape, mega dystopian city, manufacturing, commercial factories, blade runner, cyberpunk 2077, cinematic movie still, best quality, masterpiece digital art, (detailed, leishe, laser, bismuth, no humans, firemagic, marble, ivory, ebony, gold, gemstone, crystall, circuitboard, Azulejo, stained glass, gothpunk, noirstyle, uv_fluorescence, by mooncryptowow:0.4)" 226 | ], 227 | "color": "#232", 228 | "bgcolor": "#353" 229 | }, 230 | { 231 | "id": 7, 232 | "type": "CLIPTextEncode", 233 | "pos": [ 234 | 900, 235 | 350 236 | ], 237 | "size": { 238 | "0": 390, 239 | "1": 90 240 | }, 241 | "flags": {}, 242 | "order": 11, 243 | "mode": 0, 244 | "inputs": [ 245 | { 246 | "name": "clip", 247 | "type": "CLIP", 248 | "link": 169 249 | } 250 | ], 251 | "outputs": [ 252 | { 253 | "name": "CONDITIONING", 254 | "type": "CONDITIONING", 255 | "links": [ 256 | 6 257 | ], 258 | "slot_index": 0 259 | } 260 | ], 261 | "title": "Negative", 262 | "properties": { 263 | "Node name for S&R": "CLIPTextEncode" 264 | }, 265 | "widgets_values": [ 266 | "low quality, worst quality, pencil sketch, black and white, greyscale, blurry" 267 | ], 268 | "color": "#232", 269 | "bgcolor": "#353" 270 | }, 271 | { 272 | "id": 5, 273 | "type": "EmptyLatentImage", 274 | "pos": [ 275 | 1080, 276 | 490 277 | ], 278 | "size": { 279 | "0": 210, 280 | "1": 110 281 | }, 282 | "flags": {}, 283 | "order": 1, 284 | "mode": 0, 285 | "outputs": [ 286 | { 287 | "name": "LATENT", 288 | "type": "LATENT", 289 | "links": [ 290 | 120 291 | ], 292 | "slot_index": 0 293 | } 294 | ], 295 | "title": "Size", 296 | "properties": { 297 | "Node name for S&R": "EmptyLatentImage" 298 | }, 299 | "widgets_values": [ 300 | 512, 301 | 512, 302 | 1 303 | ], 304 | "color": "#223", 305 | "bgcolor": "#335" 306 | }, 307 | { 308 | "id": 3, 309 | "type": "KSampler", 310 | "pos": [ 311 | 1330, 312 | 100 313 | ], 314 | "size": { 315 | "0": 280, 316 | "1": 262 317 | }, 318 | "flags": {}, 319 | "order": 15, 320 | "mode": 0, 321 | "inputs": [ 322 | { 323 | "name": "model", 324 | "type": "MODEL", 325 | "link": 166 326 | }, 327 | { 328 | "name": "positive", 329 | "type": "CONDITIONING", 330 | "link": 137 331 | }, 332 | { 333 | "name": "negative", 334 | "type": "CONDITIONING", 335 | "link": 6 336 | }, 337 | { 338 | "name": "latent_image", 339 | "type": "LATENT", 340 | "link": 120 341 | } 342 | ], 343 | "outputs": [ 344 | { 345 | "name": "LATENT", 346 | "type": "LATENT", 347 | "links": [ 348 | 7 349 | ], 350 | "slot_index": 0 351 | } 352 | ], 353 | "properties": { 354 | "Node name for S&R": "KSampler" 355 | }, 356 | "widgets_values": [ 357 | 1059267796500844, 358 | "fixed", 359 | 35, 360 | 6, 361 | "dpmpp_2m", 362 | "karras", 363 | 1 364 | ] 365 | }, 366 | { 367 | "id": 4, 368 | "type": "CheckpointLoaderSimple", 369 | "pos": [ 370 | 40, 371 | 100 372 | ], 373 | "size": { 374 | "0": 320, 375 | "1": 100 376 | }, 377 | "flags": {}, 378 | "order": 2, 379 | "mode": 0, 380 | "outputs": [ 381 | { 382 | "name": "MODEL", 383 | "type": "MODEL", 384 | "links": [ 385 | 186 386 | ], 387 | "slot_index": 0 388 | }, 389 | { 390 | "name": "CLIP", 391 | "type": "CLIP", 392 | "links": [ 393 | 188 394 | ], 395 | "slot_index": 1 396 | }, 397 | { 398 | "name": "VAE", 399 | "type": "VAE", 400 | "links": [], 401 | "slot_index": 2 402 | } 403 | ], 404 | "properties": { 405 | "Node name for S&R": "CheckpointLoaderSimple" 406 | }, 407 | "widgets_values": [ 408 | "megaModelWith4800X_v17.safetensors" 409 | ], 410 | "color": "#232", 411 | "bgcolor": "#353" 412 | }, 413 | { 414 | "id": 86, 415 | "type": "Lora Loader", 416 | "pos": [ 417 | 640, 418 | 100 419 | ], 420 | "size": { 421 | "0": 210, 422 | "1": 122 423 | }, 424 | "flags": {}, 425 | "order": 7, 426 | "mode": 0, 427 | "inputs": [ 428 | { 429 | "name": "model", 430 | "type": "MODEL", 431 | "link": 187 432 | }, 433 | { 434 | "name": "clip", 435 | "type": "CLIP", 436 | "link": 189 437 | }, 438 | { 439 | "name": "lora_name", 440 | "type": "COMBO", 441 | "link": 144, 442 | "widget": { 443 | "name": "lora_name" 444 | } 445 | } 446 | ], 447 | "outputs": [ 448 | { 449 | "name": "MODEL", 450 | "type": "MODEL", 451 | "links": [ 452 | 166, 453 | 193 454 | ], 455 | "shape": 3, 456 | "slot_index": 0 457 | }, 458 | { 459 | "name": "CLIP", 460 | "type": "CLIP", 461 | "links": [ 462 | 168, 463 | 169, 464 | 194 465 | ], 466 | "shape": 3, 467 | "slot_index": 1 468 | }, 469 | { 470 | "name": "NAME_STRING", 471 | "type": "STRING", 472 | "links": [ 473 | 157 474 | ], 475 | "shape": 3, 476 | "slot_index": 2 477 | } 478 | ], 479 | "properties": { 480 | "Node name for S&R": "Lora Loader" 481 | }, 482 | "widgets_values": [ 483 | "Style\\wowifierV2.safetensors", 484 | 0.9, 485 | 0.9 486 | ] 487 | }, 488 | { 489 | "id": 102, 490 | "type": "ReloadModel", 491 | "pos": [ 492 | 390, 493 | 100 494 | ], 495 | "size": { 496 | "0": 210, 497 | "1": 100 498 | }, 499 | "flags": {}, 500 | "order": 5, 501 | "mode": 0, 502 | "inputs": [ 503 | { 504 | "name": "fallback_m", 505 | "type": "MODEL", 506 | "link": 186 507 | }, 508 | { 509 | "name": "fallback_c", 510 | "type": "CLIP", 511 | "link": 188 512 | }, 513 | { 514 | "name": "fallback_v", 515 | "type": "VAE", 516 | "link": 190 517 | }, 518 | { 519 | "name": "filename", 520 | "type": "STRING", 521 | "link": 210, 522 | "widget": { 523 | "name": "filename" 524 | } 525 | } 526 | ], 527 | "outputs": [ 528 | { 529 | "name": "MODEL", 530 | "type": "MODEL", 531 | "links": [ 532 | 187 533 | ], 534 | "shape": 3, 535 | "slot_index": 0 536 | }, 537 | { 538 | "name": "CLIP", 539 | "type": "CLIP", 540 | "links": [ 541 | 189 542 | ], 543 | "shape": 3, 544 | "slot_index": 1 545 | }, 546 | { 547 | "name": "VAE", 548 | "type": "VAE", 549 | "links": [ 550 | 191, 551 | 195 552 | ], 553 | "shape": 3, 554 | "slot_index": 2 555 | } 556 | ], 557 | "properties": { 558 | "Node name for S&R": "ReloadModel" 559 | }, 560 | "widgets_values": [ 561 | "ForLoop_1" 562 | ] 563 | }, 564 | { 565 | "id": 103, 566 | "type": "OverrideModel", 567 | "pos": [ 568 | 640, 569 | 300 570 | ], 571 | "size": { 572 | "0": 210, 573 | "1": 94 574 | }, 575 | "flags": {}, 576 | "order": 12, 577 | "mode": 0, 578 | "inputs": [ 579 | { 580 | "name": "model", 581 | "type": "MODEL", 582 | "link": 193 583 | }, 584 | { 585 | "name": "clip", 586 | "type": "CLIP", 587 | "link": 194 588 | }, 589 | { 590 | "name": "vae", 591 | "type": "VAE", 592 | "link": 195 593 | }, 594 | { 595 | "name": "filename", 596 | "type": "STRING", 597 | "link": 211, 598 | "widget": { 599 | "name": "filename" 600 | } 601 | } 602 | ], 603 | "properties": { 604 | "Node name for S&R": "OverrideModel" 605 | }, 606 | "widgets_values": [ 607 | "ForLoop_1" 608 | ] 609 | }, 610 | { 611 | "id": 106, 612 | "type": "MemorizeString", 613 | "pos": [ 614 | 1150, 615 | 800 616 | ], 617 | "size": { 618 | "0": 210, 619 | "1": 54 620 | }, 621 | "flags": {}, 622 | "order": 16, 623 | "mode": 0, 624 | "inputs": [ 625 | { 626 | "name": "to_memory", 627 | "type": "STRING", 628 | "link": 208, 629 | "widget": { 630 | "name": "to_memory" 631 | } 632 | }, 633 | { 634 | "name": "loop_id", 635 | "type": "STRING", 636 | "link": 209, 637 | "widget": { 638 | "name": "loop_id" 639 | } 640 | } 641 | ], 642 | "properties": { 643 | "Node name for S&R": "MemorizeString" 644 | }, 645 | "widgets_values": [ 646 | "ForLoop_1", 647 | "" 648 | ] 649 | }, 650 | { 651 | "id": 104, 652 | "type": "RecallString", 653 | "pos": [ 654 | 670, 655 | 690 656 | ], 657 | "size": { 658 | "0": 210, 659 | "1": 54 660 | }, 661 | "flags": {}, 662 | "order": 9, 663 | "mode": 0, 664 | "inputs": [ 665 | { 666 | "name": "loop_id", 667 | "type": "STRING", 668 | "link": 206, 669 | "widget": { 670 | "name": "loop_id" 671 | } 672 | }, 673 | { 674 | "name": "fallback", 675 | "type": "STRING", 676 | "link": 207, 677 | "widget": { 678 | "name": "fallback" 679 | } 680 | } 681 | ], 682 | "outputs": [ 683 | { 684 | "name": "STRING", 685 | "type": "STRING", 686 | "links": [ 687 | 198 688 | ], 689 | "shape": 3, 690 | "slot_index": 0 691 | } 692 | ], 693 | "properties": { 694 | "Node name for S&R": "RecallString" 695 | }, 696 | "widgets_values": [ 697 | "ForLoop_1", 698 | "" 699 | ] 700 | }, 701 | { 702 | "id": 91, 703 | "type": "Text Concatenate", 704 | "pos": [ 705 | 910, 706 | 690 707 | ], 708 | "size": { 709 | "0": 210, 710 | "1": 142 711 | }, 712 | "flags": {}, 713 | "order": 14, 714 | "mode": 0, 715 | "inputs": [ 716 | { 717 | "name": "text_a", 718 | "type": "STRING", 719 | "link": 198, 720 | "widget": { 721 | "name": "text_a" 722 | } 723 | }, 724 | { 725 | "name": "text_b", 726 | "type": "STRING", 727 | "link": 157, 728 | "widget": { 729 | "name": "text_b" 730 | } 731 | }, 732 | { 733 | "name": "text_c", 734 | "type": "STRING", 735 | "link": null, 736 | "widget": { 737 | "name": "text_c" 738 | } 739 | }, 740 | { 741 | "name": "text_d", 742 | "type": "STRING", 743 | "link": null, 744 | "widget": { 745 | "name": "text_d" 746 | } 747 | } 748 | ], 749 | "outputs": [ 750 | { 751 | "name": "STRING", 752 | "type": "STRING", 753 | "links": [ 754 | 159, 755 | 208 756 | ], 757 | "shape": 3, 758 | "slot_index": 0 759 | } 760 | ], 761 | "title": "Concat Filename", 762 | "properties": { 763 | "Node name for S&R": "Text Concatenate" 764 | }, 765 | "widgets_values": [ 766 | "-", 767 | "true", 768 | "", 769 | "", 770 | "", 771 | "" 772 | ] 773 | }, 774 | { 775 | "id": 105, 776 | "type": "Reroute", 777 | "pos": [ 778 | 550, 779 | 820 780 | ], 781 | "size": [ 782 | 90.4, 783 | 26 784 | ], 785 | "flags": {}, 786 | "order": 6, 787 | "mode": 0, 788 | "inputs": [ 789 | { 790 | "name": "", 791 | "type": "*", 792 | "link": 212, 793 | "widget": { 794 | "name": "value" 795 | } 796 | } 797 | ], 798 | "outputs": [ 799 | { 800 | "name": "STRING", 801 | "type": "STRING", 802 | "links": [ 803 | 206, 804 | 207, 805 | 209 806 | ], 807 | "slot_index": 0 808 | } 809 | ], 810 | "properties": { 811 | "showOutputText": true, 812 | "horizontal": false 813 | } 814 | }, 815 | { 816 | "id": 90, 817 | "type": "VAELoader", 818 | "pos": [ 819 | 40, 820 | 250 821 | ], 822 | "size": [ 823 | 320, 824 | 60 825 | ], 826 | "flags": {}, 827 | "order": 3, 828 | "mode": 0, 829 | "outputs": [ 830 | { 831 | "name": "VAE", 832 | "type": "VAE", 833 | "links": [ 834 | 190 835 | ], 836 | "shape": 3, 837 | "slot_index": 0 838 | } 839 | ], 840 | "properties": { 841 | "Node name for S&R": "VAELoader" 842 | }, 843 | "widgets_values": [ 844 | "vae-ft-mse-840000-ema-pruned.vae.pt" 845 | ] 846 | }, 847 | { 848 | "id": 107, 849 | "type": "LoopManager", 850 | "pos": [ 851 | 40, 852 | 360 853 | ], 854 | "size": [ 855 | 320, 856 | 240 857 | ], 858 | "flags": {}, 859 | "order": 4, 860 | "mode": 0, 861 | "outputs": [ 862 | { 863 | "name": "STRING", 864 | "type": "STRING", 865 | "links": [ 866 | 210, 867 | 211, 868 | 212 869 | ], 870 | "shape": 3, 871 | "slot_index": 0 872 | } 873 | ], 874 | "properties": { 875 | "Node name for S&R": "LoopManager" 876 | }, 877 | "widgets_values": [ 878 | "BurnTest_1", 879 | "never", 880 | "BurnTest_2:\n(#3)STRING: BurnTest_2-UV_fluorescence-LyCORIS-FiveDecorsAIx3-FiveDecorsAIx3\n(#3)MODEL: BurnTest_2.safetensors\n\nBurnTest_1:\n(#5)STRING: BurnTest_1-add_detail-FiveDecorsAIx3-wowifierV2-LASER-V1-LASER-V1\n(#5)MODEL: BurnTest_1.safetensors\n\nBLIPTested_15:\n(#1)IMAGE: BLIPTested_15.png\n\nBLIPTested_14:\n(#1)IMAGE: BLIPTested_14.png\n\nScore_1:\n(#4)FLOAT: 0.9399489164352417\n\nAestheticArt_1:\n(#11)IMAGE: AestheticArt_1.png" 881 | ] 882 | } 883 | ], 884 | "links": [ 885 | [ 886 | 6, 887 | 7, 888 | 0, 889 | 3, 890 | 2, 891 | "CONDITIONING" 892 | ], 893 | [ 894 | 7, 895 | 3, 896 | 0, 897 | 8, 898 | 0, 899 | "LATENT" 900 | ], 901 | [ 902 | 120, 903 | 5, 904 | 0, 905 | 3, 906 | 3, 907 | "LATENT" 908 | ], 909 | [ 910 | 137, 911 | 6, 912 | 0, 913 | 3, 914 | 1, 915 | "CONDITIONING" 916 | ], 917 | [ 918 | 144, 919 | 81, 920 | 0, 921 | 86, 922 | 2, 923 | "COMBO" 924 | ], 925 | [ 926 | 157, 927 | 86, 928 | 2, 929 | 91, 930 | 1, 931 | "STRING" 932 | ], 933 | [ 934 | 158, 935 | 8, 936 | 0, 937 | 94, 938 | 0, 939 | "IMAGE" 940 | ], 941 | [ 942 | 159, 943 | 91, 944 | 0, 945 | 94, 946 | 1, 947 | "STRING" 948 | ], 949 | [ 950 | 165, 951 | 97, 952 | 0, 953 | 8, 954 | 1, 955 | "VAE" 956 | ], 957 | [ 958 | 166, 959 | 86, 960 | 0, 961 | 3, 962 | 0, 963 | "MODEL" 964 | ], 965 | [ 966 | 167, 967 | 96, 968 | 0, 969 | 97, 970 | 0, 971 | "*" 972 | ], 973 | [ 974 | 168, 975 | 86, 976 | 1, 977 | 6, 978 | 0, 979 | "CLIP" 980 | ], 981 | [ 982 | 169, 983 | 86, 984 | 1, 985 | 7, 986 | 0, 987 | "CLIP" 988 | ], 989 | [ 990 | 186, 991 | 4, 992 | 0, 993 | 102, 994 | 0, 995 | "MODEL" 996 | ], 997 | [ 998 | 187, 999 | 102, 1000 | 0, 1001 | 86, 1002 | 0, 1003 | "MODEL" 1004 | ], 1005 | [ 1006 | 188, 1007 | 4, 1008 | 1, 1009 | 102, 1010 | 1, 1011 | "CLIP" 1012 | ], 1013 | [ 1014 | 189, 1015 | 102, 1016 | 1, 1017 | 86, 1018 | 1, 1019 | "CLIP" 1020 | ], 1021 | [ 1022 | 190, 1023 | 90, 1024 | 0, 1025 | 102, 1026 | 2, 1027 | "VAE" 1028 | ], 1029 | [ 1030 | 191, 1031 | 102, 1032 | 2, 1033 | 96, 1034 | 0, 1035 | "*" 1036 | ], 1037 | [ 1038 | 193, 1039 | 86, 1040 | 0, 1041 | 103, 1042 | 0, 1043 | "MODEL" 1044 | ], 1045 | [ 1046 | 194, 1047 | 86, 1048 | 1, 1049 | 103, 1050 | 1, 1051 | "CLIP" 1052 | ], 1053 | [ 1054 | 195, 1055 | 102, 1056 | 2, 1057 | 103, 1058 | 2, 1059 | "VAE" 1060 | ], 1061 | [ 1062 | 198, 1063 | 104, 1064 | 0, 1065 | 91, 1066 | 0, 1067 | "STRING" 1068 | ], 1069 | [ 1070 | 206, 1071 | 105, 1072 | 0, 1073 | 104, 1074 | 0, 1075 | "STRING" 1076 | ], 1077 | [ 1078 | 207, 1079 | 105, 1080 | 0, 1081 | 104, 1082 | 1, 1083 | "STRING" 1084 | ], 1085 | [ 1086 | 208, 1087 | 91, 1088 | 0, 1089 | 106, 1090 | 0, 1091 | "STRING" 1092 | ], 1093 | [ 1094 | 209, 1095 | 105, 1096 | 0, 1097 | 106, 1098 | 1, 1099 | "STRING" 1100 | ], 1101 | [ 1102 | 210, 1103 | 107, 1104 | 0, 1105 | 102, 1106 | 3, 1107 | "STRING" 1108 | ], 1109 | [ 1110 | 211, 1111 | 107, 1112 | 0, 1113 | 103, 1114 | 3, 1115 | "STRING" 1116 | ], 1117 | [ 1118 | 212, 1119 | 107, 1120 | 0, 1121 | 105, 1122 | 0, 1123 | "*" 1124 | ] 1125 | ], 1126 | "groups": [ 1127 | { 1128 | "title": "Make new model", 1129 | "bounding": [ 1130 | 30, 1131 | -14, 1132 | 830, 1133 | 621 1134 | ], 1135 | "color": "#3f789e", 1136 | "font_size": 24, 1137 | "locked": false 1138 | }, 1139 | { 1140 | "title": "Generate image", 1141 | "bounding": [ 1142 | 890, 1143 | -14, 1144 | 1250, 1145 | 624 1146 | ], 1147 | "color": "#3f789e", 1148 | "font_size": 24, 1149 | "locked": false 1150 | }, 1151 | { 1152 | "title": "Make image filename", 1153 | "bounding": [ 1154 | 540, 1155 | 616, 1156 | 830, 1157 | 244 1158 | ], 1159 | "color": "#3f789e", 1160 | "font_size": 24, 1161 | "locked": false 1162 | } 1163 | ], 1164 | "config": {}, 1165 | "extra": {}, 1166 | "version": 0.4 1167 | } -------------------------------------------------------------------------------- /workflows/LoRABurnTest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pos13/comfyui-cyclist/6b6accd84fcd69cb6b04e7f6b500a90c28171fca/workflows/LoRABurnTest.png -------------------------------------------------------------------------------- /workflows/MultiplePersons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pos13/comfyui-cyclist/6b6accd84fcd69cb6b04e7f6b500a90c28171fca/workflows/MultiplePersons.png -------------------------------------------------------------------------------- /workflows/README.md: -------------------------------------------------------------------------------- 1 | # Example Workflows 2 | 3 | ## Cat Stack 4 | 5 | [Workflow JSON](./CatStack.json) 6 | [Workflow without UseEverywhere](./CatStackNoUE.json) 7 | ![Cat Stack Workflow](./CatStack.png) 8 | 9 | ## Chimera Maker 10 | 11 | [Workflow JSON](./ChimeraMaker.json) 12 | ![Chimera Maker Workflow](./ChimeraMaker.png) 13 | 14 | ## Generate Until Good 15 | 16 | [Workflow JSON](./GenUntilGood.json) 17 | ![GenUntilGood Workflow](./GenUntilGood.png) 18 | 19 | ### Without WAS 20 | 21 | [Workflow JSON](./GenUntilGoodNoWAS.json) 22 | ![GenUntilGoodNoWAS Workflow](./GenUntilGoodNoWAS.png) 23 | 24 | ## Generate Until Right 25 | 26 | [Workflow JSON](./GenUntilRight.json) 27 | ![GenUntilRight Workflow](./GenUntilRight.png) 28 | 29 | ## LoRA Burn Test 30 | 31 | [Workflow JSON](./LoRABurnTest.json) 32 | ![LoRABurnTest Workflow](./LoRABurnTest.png) 33 | 34 | ## Multiple Persons 35 | 36 | [Workflow JSON](./MultiplePersons.json) 37 | ![Multiple Persons Workflow](./MultiplePersons.png) 38 | 39 | ## Time Limit 40 | 41 | [Workflow JSON](./TimeLimit.json) 42 | ![Time Limit Workflow](./TimeLimit.png) 43 | 44 | ## Upscale to Megapixels 45 | 46 | [Workflow JSON](./UpscaleToMegapixels.json) 47 | ![UpscaleToMegapixels Workflow](./UpscaleToMegapixels.png) 48 | 49 | ## Upscale to Resolution 50 | 51 | [Workflow JSON](./UpscaleToResolution.json) 52 | ![UpscaleToResolution Workflow](./UpscaleToResolution.png) 53 | -------------------------------------------------------------------------------- /workflows/TimeLimit.json: -------------------------------------------------------------------------------- 1 | { 2 | "last_node_id": 115, 3 | "last_link_id": 209, 4 | "nodes": [ 5 | { 6 | "id": 6, 7 | "type": "CLIPTextEncode", 8 | "pos": [ 9 | 900, 10 | 160 11 | ], 12 | "size": { 13 | "0": 390, 14 | "1": 140 15 | }, 16 | "flags": {}, 17 | "order": 4, 18 | "mode": 0, 19 | "inputs": [ 20 | { 21 | "name": "clip", 22 | "type": "CLIP", 23 | "link": 190 24 | } 25 | ], 26 | "outputs": [ 27 | { 28 | "name": "CONDITIONING", 29 | "type": "CONDITIONING", 30 | "links": [ 31 | 137 32 | ], 33 | "slot_index": 0 34 | } 35 | ], 36 | "title": "Positive", 37 | "properties": { 38 | "Node name for S&R": "CLIPTextEncode" 39 | }, 40 | "widgets_values": [ 41 | "old concrete sky scrapers, metropolis cityscape, mega dystopian city, manufacturing, commercial factories, blade runner, cyberpunk 2077, cinematic movie still, best quality, masterpiece digital art, (detailed, leishe, laser, bismuth, no humans, firemagic, marble, ivory, ebony, gold, gemstone, crystall, circuitboard, Azulejo, stained glass, gothpunk, noirstyle, uv_fluorescence, by mooncryptowow:0.4)" 42 | ], 43 | "color": "#232", 44 | "bgcolor": "#353" 45 | }, 46 | { 47 | "id": 7, 48 | "type": "CLIPTextEncode", 49 | "pos": [ 50 | 900, 51 | 350 52 | ], 53 | "size": { 54 | "0": 390, 55 | "1": 90 56 | }, 57 | "flags": {}, 58 | "order": 5, 59 | "mode": 0, 60 | "inputs": [ 61 | { 62 | "name": "clip", 63 | "type": "CLIP", 64 | "link": 191 65 | } 66 | ], 67 | "outputs": [ 68 | { 69 | "name": "CONDITIONING", 70 | "type": "CONDITIONING", 71 | "links": [ 72 | 6 73 | ], 74 | "slot_index": 0 75 | } 76 | ], 77 | "title": "Negative", 78 | "properties": { 79 | "Node name for S&R": "CLIPTextEncode" 80 | }, 81 | "widgets_values": [ 82 | "low quality, worst quality, pencil sketch, black and white, greyscale, blurry" 83 | ], 84 | "color": "#232", 85 | "bgcolor": "#353" 86 | }, 87 | { 88 | "id": 102, 89 | "type": "SaveImage", 90 | "pos": [ 91 | 1810, 92 | 100 93 | ], 94 | "size": { 95 | "0": 320, 96 | "1": 270 97 | }, 98 | "flags": {}, 99 | "order": 10, 100 | "mode": 0, 101 | "inputs": [ 102 | { 103 | "name": "images", 104 | "type": "IMAGE", 105 | "link": 189 106 | } 107 | ], 108 | "properties": {}, 109 | "widgets_values": [ 110 | "ComfyUI" 111 | ] 112 | }, 113 | { 114 | "id": 4, 115 | "type": "CheckpointLoaderSimple", 116 | "pos": [ 117 | 550, 118 | 100 119 | ], 120 | "size": { 121 | "0": 320, 122 | "1": 100 123 | }, 124 | "flags": {}, 125 | "order": 0, 126 | "mode": 0, 127 | "outputs": [ 128 | { 129 | "name": "MODEL", 130 | "type": "MODEL", 131 | "links": [ 132 | 186 133 | ], 134 | "slot_index": 0 135 | }, 136 | { 137 | "name": "CLIP", 138 | "type": "CLIP", 139 | "links": [ 140 | 190, 141 | 191 142 | ], 143 | "slot_index": 1 144 | }, 145 | { 146 | "name": "VAE", 147 | "type": "VAE", 148 | "links": [ 149 | 194 150 | ], 151 | "slot_index": 2 152 | } 153 | ], 154 | "properties": { 155 | "Node name for S&R": "CheckpointLoaderSimple" 156 | }, 157 | "widgets_values": [ 158 | "526mixV15.safetensors" 159 | ], 160 | "color": "#232", 161 | "bgcolor": "#353" 162 | }, 163 | { 164 | "id": 5, 165 | "type": "EmptyLatentImage", 166 | "pos": [ 167 | 900, 168 | 490 169 | ], 170 | "size": { 171 | "0": 210, 172 | "1": 110 173 | }, 174 | "flags": {}, 175 | "order": 1, 176 | "mode": 0, 177 | "outputs": [ 178 | { 179 | "name": "LATENT", 180 | "type": "LATENT", 181 | "links": [ 182 | 195 183 | ], 184 | "slot_index": 0 185 | } 186 | ], 187 | "title": "Size", 188 | "properties": { 189 | "Node name for S&R": "EmptyLatentImage" 190 | }, 191 | "widgets_values": [ 192 | 512, 193 | 512, 194 | 1 195 | ], 196 | "color": "#223", 197 | "bgcolor": "#335" 198 | }, 199 | { 200 | "id": 104, 201 | "type": "Interrupt", 202 | "pos": [ 203 | 1140, 204 | 490 205 | ], 206 | "size": [ 207 | 150, 208 | 60 209 | ], 210 | "flags": {}, 211 | "order": 7, 212 | "mode": 0, 213 | "inputs": [ 214 | { 215 | "name": "any_in", 216 | "type": "*", 217 | "link": 195, 218 | "color_on": "" 219 | }, 220 | { 221 | "name": "stop", 222 | "type": "BOOLEAN", 223 | "link": 208, 224 | "widget": { 225 | "name": "stop" 226 | } 227 | } 228 | ], 229 | "outputs": [ 230 | { 231 | "name": "LATENT", 232 | "type": "LATENT", 233 | "links": [ 234 | 196 235 | ], 236 | "shape": 3, 237 | "color_on": "#FF9CF9", 238 | "slot_index": 0 239 | } 240 | ], 241 | "properties": { 242 | "Node name for S&R": "Interrupt" 243 | }, 244 | "widgets_values": [ 245 | false 246 | ] 247 | }, 248 | { 249 | "id": 3, 250 | "type": "KSampler", 251 | "pos": [ 252 | 1330, 253 | 100 254 | ], 255 | "size": { 256 | "0": 280, 257 | "1": 262 258 | }, 259 | "flags": {}, 260 | "order": 8, 261 | "mode": 0, 262 | "inputs": [ 263 | { 264 | "name": "model", 265 | "type": "MODEL", 266 | "link": 186 267 | }, 268 | { 269 | "name": "positive", 270 | "type": "CONDITIONING", 271 | "link": 137 272 | }, 273 | { 274 | "name": "negative", 275 | "type": "CONDITIONING", 276 | "link": 6 277 | }, 278 | { 279 | "name": "latent_image", 280 | "type": "LATENT", 281 | "link": 196 282 | } 283 | ], 284 | "outputs": [ 285 | { 286 | "name": "LATENT", 287 | "type": "LATENT", 288 | "links": [ 289 | 7 290 | ], 291 | "slot_index": 0 292 | } 293 | ], 294 | "properties": { 295 | "Node name for S&R": "KSampler" 296 | }, 297 | "widgets_values": [ 298 | 1079134092701188, 299 | "randomize", 300 | 35, 301 | 6, 302 | "dpmpp_2m", 303 | "karras", 304 | 1 305 | ] 306 | }, 307 | { 308 | "id": 112, 309 | "type": "CyclistMathInt", 310 | "pos": [ 311 | 660, 312 | 490 313 | ], 314 | "size": { 315 | "0": 210, 316 | "1": 110 317 | }, 318 | "flags": {}, 319 | "order": 2, 320 | "mode": 0, 321 | "outputs": [ 322 | { 323 | "name": "INT", 324 | "type": "INT", 325 | "links": [ 326 | 206 327 | ], 328 | "shape": 3, 329 | "slot_index": 0 330 | } 331 | ], 332 | "title": "Max Time", 333 | "properties": { 334 | "Node name for S&R": "CyclistMathInt" 335 | }, 336 | "widgets_values": [ 337 | "addition", 338 | 20, 339 | 0 340 | ], 341 | "color": "#232", 342 | "bgcolor": "#353" 343 | }, 344 | { 345 | "id": 113, 346 | "type": "CyclistTimer", 347 | "pos": [ 348 | 660, 349 | 650 350 | ], 351 | "size": { 352 | "0": 210, 353 | "1": 102 354 | }, 355 | "flags": {}, 356 | "order": 3, 357 | "mode": 0, 358 | "outputs": [ 359 | { 360 | "name": "last gen time", 361 | "type": "FLOAT", 362 | "links": null, 363 | "shape": 3 364 | }, 365 | { 366 | "name": "total loop time", 367 | "type": "FLOAT", 368 | "links": [ 369 | 207 370 | ], 371 | "shape": 3, 372 | "slot_index": 1 373 | } 374 | ], 375 | "properties": { 376 | "Node name for S&R": "CyclistTimer" 377 | }, 378 | "widgets_values": [ 379 | "ForLoop_1", 380 | "seconds" 381 | ] 382 | }, 383 | { 384 | "id": 114, 385 | "type": "CyclistCompare", 386 | "pos": [ 387 | 900, 388 | 650 389 | ], 390 | "size": { 391 | "0": 210, 392 | "1": 80 393 | }, 394 | "flags": {}, 395 | "order": 6, 396 | "mode": 0, 397 | "inputs": [ 398 | { 399 | "name": "thing1", 400 | "type": "*", 401 | "link": 206 402 | }, 403 | { 404 | "name": "thing2", 405 | "type": "*", 406 | "link": 207 407 | } 408 | ], 409 | "outputs": [ 410 | { 411 | "name": "BOOLEAN", 412 | "type": "BOOLEAN", 413 | "links": [ 414 | 208 415 | ], 416 | "shape": 3, 417 | "slot_index": 0 418 | } 419 | ], 420 | "properties": { 421 | "Node name for S&R": "CyclistCompare" 422 | }, 423 | "widgets_values": [ 424 | "less than" 425 | ] 426 | }, 427 | { 428 | "id": 115, 429 | "type": "CyclistTimerStop", 430 | "pos": [ 431 | 1810, 432 | 420 433 | ], 434 | "size": { 435 | "0": 210, 436 | "1": 60 437 | }, 438 | "flags": {}, 439 | "order": 11, 440 | "mode": 0, 441 | "inputs": [ 442 | { 443 | "name": "any_in", 444 | "type": "*", 445 | "link": 209 446 | } 447 | ], 448 | "properties": { 449 | "Node name for S&R": "CyclistTimerStop" 450 | }, 451 | "widgets_values": [ 452 | "ForLoop_1" 453 | ] 454 | }, 455 | { 456 | "id": 8, 457 | "type": "VAEDecode", 458 | "pos": [ 459 | 1640, 460 | 100 461 | ], 462 | "size": { 463 | "0": 140, 464 | "1": 50 465 | }, 466 | "flags": {}, 467 | "order": 9, 468 | "mode": 0, 469 | "inputs": [ 470 | { 471 | "name": "samples", 472 | "type": "LATENT", 473 | "link": 7 474 | }, 475 | { 476 | "name": "vae", 477 | "type": "VAE", 478 | "link": 194 479 | } 480 | ], 481 | "outputs": [ 482 | { 483 | "name": "IMAGE", 484 | "type": "IMAGE", 485 | "links": [ 486 | 189, 487 | 209 488 | ], 489 | "slot_index": 0 490 | } 491 | ], 492 | "properties": { 493 | "Node name for S&R": "VAEDecode" 494 | } 495 | } 496 | ], 497 | "links": [ 498 | [ 499 | 6, 500 | 7, 501 | 0, 502 | 3, 503 | 2, 504 | "CONDITIONING" 505 | ], 506 | [ 507 | 7, 508 | 3, 509 | 0, 510 | 8, 511 | 0, 512 | "LATENT" 513 | ], 514 | [ 515 | 137, 516 | 6, 517 | 0, 518 | 3, 519 | 1, 520 | "CONDITIONING" 521 | ], 522 | [ 523 | 186, 524 | 4, 525 | 0, 526 | 3, 527 | 0, 528 | "MODEL" 529 | ], 530 | [ 531 | 189, 532 | 8, 533 | 0, 534 | 102, 535 | 0, 536 | "IMAGE" 537 | ], 538 | [ 539 | 190, 540 | 4, 541 | 1, 542 | 6, 543 | 0, 544 | "CLIP" 545 | ], 546 | [ 547 | 191, 548 | 4, 549 | 1, 550 | 7, 551 | 0, 552 | "CLIP" 553 | ], 554 | [ 555 | 194, 556 | 4, 557 | 2, 558 | 8, 559 | 1, 560 | "VAE" 561 | ], 562 | [ 563 | 195, 564 | 5, 565 | 0, 566 | 104, 567 | 0, 568 | "*" 569 | ], 570 | [ 571 | 196, 572 | 104, 573 | 0, 574 | 3, 575 | 3, 576 | "LATENT" 577 | ], 578 | [ 579 | 206, 580 | 112, 581 | 0, 582 | 114, 583 | 0, 584 | "*" 585 | ], 586 | [ 587 | 207, 588 | 113, 589 | 1, 590 | 114, 591 | 1, 592 | "*" 593 | ], 594 | [ 595 | 208, 596 | 114, 597 | 0, 598 | 104, 599 | 1, 600 | "BOOLEAN" 601 | ], 602 | [ 603 | 209, 604 | 8, 605 | 0, 606 | 115, 607 | 0, 608 | "*" 609 | ] 610 | ], 611 | "groups": [], 612 | "config": {}, 613 | "extra": {}, 614 | "version": 0.4 615 | } -------------------------------------------------------------------------------- /workflows/TimeLimit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pos13/comfyui-cyclist/6b6accd84fcd69cb6b04e7f6b500a90c28171fca/workflows/TimeLimit.png -------------------------------------------------------------------------------- /workflows/UpscaleToMegapixels.json: -------------------------------------------------------------------------------- 1 | { 2 | "last_node_id": 37, 3 | "last_link_id": 72, 4 | "nodes": [ 5 | { 6 | "id": 23, 7 | "type": "VAEDecode", 8 | "pos": [ 9 | 690, 10 | 820 11 | ], 12 | "size": { 13 | "0": 140, 14 | "1": 50 15 | }, 16 | "flags": {}, 17 | "order": 10, 18 | "mode": 2, 19 | "inputs": [ 20 | { 21 | "name": "samples", 22 | "type": "LATENT", 23 | "link": 64 24 | }, 25 | { 26 | "name": "vae", 27 | "type": "VAE", 28 | "link": 58 29 | } 30 | ], 31 | "outputs": [ 32 | { 33 | "name": "IMAGE", 34 | "type": "IMAGE", 35 | "links": [ 36 | 36 37 | ], 38 | "shape": 3, 39 | "slot_index": 0 40 | } 41 | ], 42 | "properties": { 43 | "Node name for S&R": "VAEDecode" 44 | } 45 | }, 46 | { 47 | "id": 24, 48 | "type": "SaveImage", 49 | "pos": [ 50 | 860, 51 | 820 52 | ], 53 | "size": { 54 | "0": 560, 55 | "1": 510 56 | }, 57 | "flags": {}, 58 | "order": 12, 59 | "mode": 2, 60 | "inputs": [ 61 | { 62 | "name": "images", 63 | "type": "IMAGE", 64 | "link": 36 65 | } 66 | ], 67 | "title": "Save Image (Final Result)", 68 | "properties": {}, 69 | "widgets_values": [ 70 | "UpscaleTotal" 71 | ] 72 | }, 73 | { 74 | "id": 14, 75 | "type": "VAELoader", 76 | "pos": [ 77 | -100, 78 | 840 79 | ], 80 | "size": { 81 | "0": 350, 82 | "1": 60 83 | }, 84 | "flags": {}, 85 | "order": 0, 86 | "mode": 0, 87 | "outputs": [ 88 | { 89 | "name": "VAE", 90 | "type": "VAE", 91 | "links": [ 92 | 18, 93 | 58 94 | ], 95 | "shape": 3, 96 | "slot_index": 0 97 | } 98 | ], 99 | "properties": { 100 | "Node name for S&R": "VAELoader" 101 | }, 102 | "widgets_values": [ 103 | "vae-ft-mse-840000-ema-pruned.vae.pt" 104 | ], 105 | "color": "#223", 106 | "bgcolor": "#335" 107 | }, 108 | { 109 | "id": 27, 110 | "type": "Note", 111 | "pos": [ 112 | 1120, 113 | 670 114 | ], 115 | "size": { 116 | "0": 210, 117 | "1": 110 118 | }, 119 | "flags": {}, 120 | "order": 1, 121 | "mode": 0, 122 | "title": "Rough megapixel standarts", 123 | "properties": { 124 | "text": "" 125 | }, 126 | "widgets_values": [ 127 | "HD: 1\nFullHD: 2\n2K QHD: 3.67\n4K UHD: 8.3\n8K: 33.18\n\n15625 is latent megapixel" 128 | ], 129 | "color": "#432", 130 | "bgcolor": "#653" 131 | }, 132 | { 133 | "id": 4, 134 | "type": "CheckpointLoaderSimple", 135 | "pos": [ 136 | -100, 137 | 140 138 | ], 139 | "size": { 140 | "0": 350, 141 | "1": 100 142 | }, 143 | "flags": {}, 144 | "order": 2, 145 | "mode": 0, 146 | "outputs": [ 147 | { 148 | "name": "MODEL", 149 | "type": "MODEL", 150 | "links": [ 151 | 16 152 | ], 153 | "slot_index": 0 154 | }, 155 | { 156 | "name": "CLIP", 157 | "type": "CLIP", 158 | "links": [ 159 | 14 160 | ], 161 | "slot_index": 1 162 | }, 163 | { 164 | "name": "VAE", 165 | "type": "VAE", 166 | "links": [], 167 | "slot_index": 2 168 | } 169 | ], 170 | "properties": { 171 | "Node name for S&R": "CheckpointLoaderSimple" 172 | }, 173 | "widgets_values": [ 174 | "aZovyaRPGArtistTools_v4.safetensors" 175 | ], 176 | "color": "#223", 177 | "bgcolor": "#335" 178 | }, 179 | { 180 | "id": 6, 181 | "type": "CLIPTextEncode", 182 | "pos": [ 183 | 610, 184 | 190 185 | ], 186 | "size": { 187 | "0": 560, 188 | "1": 100 189 | }, 190 | "flags": {}, 191 | "order": 7, 192 | "mode": 0, 193 | "inputs": [ 194 | { 195 | "name": "clip", 196 | "type": "CLIP", 197 | "link": 15 198 | } 199 | ], 200 | "outputs": [ 201 | { 202 | "name": "CONDITIONING", 203 | "type": "CONDITIONING", 204 | "links": [ 205 | 13 206 | ], 207 | "slot_index": 0 208 | } 209 | ], 210 | "title": "Positive", 211 | "properties": { 212 | "Node name for S&R": "CLIPTextEncode" 213 | }, 214 | "widgets_values": [ 215 | "Zeppelin hovering foreground an incredibly detailed artistic representation of a solarpunk village on a floating rock above a grand river. Digital art, small village on a cliff outcropping, moss, steampunk homes, zeppelin in the sky, style of John Blanche, highly detailed." 216 | ], 217 | "color": "#232", 218 | "bgcolor": "#353" 219 | }, 220 | { 221 | "id": 10, 222 | "type": "LoadImage", 223 | "pos": [ 224 | -60, 225 | 450 226 | ], 227 | "size": [ 228 | 310, 229 | 310 230 | ], 231 | "flags": {}, 232 | "order": 3, 233 | "mode": 0, 234 | "outputs": [ 235 | { 236 | "name": "IMAGE", 237 | "type": "IMAGE", 238 | "links": [ 239 | 10 240 | ], 241 | "shape": 3, 242 | "slot_index": 0 243 | }, 244 | { 245 | "name": "MASK", 246 | "type": "MASK", 247 | "links": null, 248 | "shape": 3 249 | } 250 | ], 251 | "properties": { 252 | "Node name for S&R": "LoadImage" 253 | }, 254 | "widgets_values": [ 255 | "SDXL_00003_.png", 256 | "image" 257 | ], 258 | "color": "#232", 259 | "bgcolor": "#353" 260 | }, 261 | { 262 | "id": 7, 263 | "type": "CLIPTextEncode", 264 | "pos": [ 265 | 610, 266 | 330 267 | ], 268 | "size": { 269 | "0": 560, 270 | "1": 76 271 | }, 272 | "flags": {}, 273 | "order": 8, 274 | "mode": 0, 275 | "inputs": [ 276 | { 277 | "name": "clip", 278 | "type": "CLIP", 279 | "link": 34 280 | } 281 | ], 282 | "outputs": [ 283 | { 284 | "name": "CONDITIONING", 285 | "type": "CONDITIONING", 286 | "links": [ 287 | 6 288 | ], 289 | "slot_index": 0 290 | } 291 | ], 292 | "title": "Negative", 293 | "properties": { 294 | "Node name for S&R": "CLIPTextEncode" 295 | }, 296 | "widgets_values": [ 297 | "embedding:easynegative:0.7, (low quality, worst quality:1.1), (blurry:1.1), sketch" 298 | ], 299 | "color": "#232", 300 | "bgcolor": "#353" 301 | }, 302 | { 303 | "id": 11, 304 | "type": "VAEEncode", 305 | "pos": [ 306 | 280, 307 | 450 308 | ], 309 | "size": { 310 | "0": 140, 311 | "1": 46 312 | }, 313 | "flags": {}, 314 | "order": 6, 315 | "mode": 0, 316 | "inputs": [ 317 | { 318 | "name": "pixels", 319 | "type": "IMAGE", 320 | "link": 10 321 | }, 322 | { 323 | "name": "vae", 324 | "type": "VAE", 325 | "link": 18 326 | } 327 | ], 328 | "outputs": [ 329 | { 330 | "name": "LATENT", 331 | "type": "LATENT", 332 | "links": [ 333 | 60 334 | ], 335 | "shape": 3, 336 | "slot_index": 0 337 | } 338 | ], 339 | "properties": { 340 | "Node name for S&R": "VAEEncode" 341 | } 342 | }, 343 | { 344 | "id": 21, 345 | "type": "LatentUpscaleBy", 346 | "pos": [ 347 | 1520, 348 | 450 349 | ], 350 | "size": { 351 | "0": 210, 352 | "1": 82 353 | }, 354 | "flags": {}, 355 | "order": 16, 356 | "mode": 0, 357 | "inputs": [ 358 | { 359 | "name": "samples", 360 | "type": "LATENT", 361 | "link": 63 362 | } 363 | ], 364 | "outputs": [ 365 | { 366 | "name": "LATENT", 367 | "type": "LATENT", 368 | "links": [ 369 | 29 370 | ], 371 | "shape": 3, 372 | "slot_index": 0 373 | } 374 | ], 375 | "properties": { 376 | "Node name for S&R": "LatentUpscaleBy" 377 | }, 378 | "widgets_values": [ 379 | "bilinear", 380 | 1.375 381 | ] 382 | }, 383 | { 384 | "id": 22, 385 | "type": "Interrupt", 386 | "pos": [ 387 | 1340, 388 | 450 389 | ], 390 | "size": [ 391 | 150, 392 | 60 393 | ], 394 | "flags": {}, 395 | "order": 15, 396 | "mode": 0, 397 | "inputs": [ 398 | { 399 | "name": "any_in", 400 | "type": "*", 401 | "link": 62, 402 | "color_on": "" 403 | }, 404 | { 405 | "name": "stop", 406 | "type": "BOOLEAN", 407 | "link": 71, 408 | "widget": { 409 | "name": "stop" 410 | } 411 | } 412 | ], 413 | "outputs": [ 414 | { 415 | "name": "LATENT", 416 | "type": "LATENT", 417 | "links": [ 418 | 63 419 | ], 420 | "shape": 3, 421 | "color_on": "#FF9CF9", 422 | "slot_index": 0 423 | } 424 | ], 425 | "properties": { 426 | "Node name for S&R": "Interrupt" 427 | }, 428 | "widgets_values": [ 429 | false 430 | ], 431 | "color": "#322", 432 | "bgcolor": "#533" 433 | }, 434 | { 435 | "id": 16, 436 | "type": "Latent Size to Number", 437 | "pos": [ 438 | 690, 439 | 510 440 | ], 441 | "size": { 442 | "0": 180, 443 | "1": 130 444 | }, 445 | "flags": {}, 446 | "order": 11, 447 | "mode": 0, 448 | "inputs": [ 449 | { 450 | "name": "samples", 451 | "type": "LATENT", 452 | "link": 65 453 | } 454 | ], 455 | "outputs": [ 456 | { 457 | "name": "tensor_w_num", 458 | "type": "NUMBER", 459 | "links": null, 460 | "shape": 3 461 | }, 462 | { 463 | "name": "tensor_h_num", 464 | "type": "NUMBER", 465 | "links": null, 466 | "shape": 3 467 | }, 468 | { 469 | "name": "FLOAT", 470 | "type": "FLOAT", 471 | "links": [ 472 | 67 473 | ], 474 | "shape": 3, 475 | "slot_index": 2 476 | }, 477 | { 478 | "name": "FLOAT", 479 | "type": "FLOAT", 480 | "links": [ 481 | 68 482 | ], 483 | "shape": 3, 484 | "slot_index": 3 485 | }, 486 | { 487 | "name": "INT", 488 | "type": "INT", 489 | "links": [], 490 | "shape": 3, 491 | "slot_index": 4 492 | }, 493 | { 494 | "name": "INT", 495 | "type": "INT", 496 | "links": [], 497 | "shape": 3, 498 | "slot_index": 5 499 | } 500 | ], 501 | "properties": { 502 | "Node name for S&R": "Latent Size to Number" 503 | } 504 | }, 505 | { 506 | "id": 35, 507 | "type": "CyclistMathFloat", 508 | "pos": [ 509 | 890, 510 | 670 511 | ], 512 | "size": { 513 | "0": 210, 514 | "1": 110 515 | }, 516 | "flags": {}, 517 | "order": 4, 518 | "mode": 0, 519 | "outputs": [ 520 | { 521 | "name": "FLOAT", 522 | "type": "FLOAT", 523 | "links": [ 524 | 70 525 | ], 526 | "shape": 3, 527 | "slot_index": 0 528 | } 529 | ], 530 | "title": "Max Megapixels", 531 | "properties": { 532 | "Node name for S&R": "CyclistMathFloat" 533 | }, 534 | "widgets_values": [ 535 | "multiplication", 536 | 2, 537 | 15625 538 | ], 539 | "color": "#232", 540 | "bgcolor": "#353" 541 | }, 542 | { 543 | "id": 36, 544 | "type": "CyclistCompare", 545 | "pos": [ 546 | 1120, 547 | 550 548 | ], 549 | "size": { 550 | "0": 210, 551 | "1": 80 552 | }, 553 | "flags": {}, 554 | "order": 14, 555 | "mode": 0, 556 | "inputs": [ 557 | { 558 | "name": "thing1", 559 | "type": "*", 560 | "link": 69 561 | }, 562 | { 563 | "name": "thing2", 564 | "type": "*", 565 | "link": 70 566 | } 567 | ], 568 | "outputs": [ 569 | { 570 | "name": "BOOLEAN", 571 | "type": "BOOLEAN", 572 | "links": [ 573 | 71 574 | ], 575 | "shape": 3, 576 | "slot_index": 0 577 | } 578 | ], 579 | "properties": { 580 | "Node name for S&R": "CyclistCompare" 581 | }, 582 | "widgets_values": [ 583 | "greater or equals" 584 | ] 585 | }, 586 | { 587 | "id": 3, 588 | "type": "KSampler", 589 | "pos": [ 590 | 1760, 591 | 150 592 | ], 593 | "size": { 594 | "0": 280, 595 | "1": 262 596 | }, 597 | "flags": {}, 598 | "order": 17, 599 | "mode": 0, 600 | "inputs": [ 601 | { 602 | "name": "model", 603 | "type": "MODEL", 604 | "link": 17 605 | }, 606 | { 607 | "name": "positive", 608 | "type": "CONDITIONING", 609 | "link": 13 610 | }, 611 | { 612 | "name": "negative", 613 | "type": "CONDITIONING", 614 | "link": 6 615 | }, 616 | { 617 | "name": "latent_image", 618 | "type": "LATENT", 619 | "link": 29 620 | } 621 | ], 622 | "outputs": [ 623 | { 624 | "name": "LATENT", 625 | "type": "LATENT", 626 | "links": [ 627 | 72 628 | ], 629 | "slot_index": 0 630 | } 631 | ], 632 | "properties": { 633 | "Node name for S&R": "KSampler" 634 | }, 635 | "widgets_values": [ 636 | 506038019252104, 637 | "randomize", 638 | 26, 639 | 6.8, 640 | "dpmpp_3m_sde_gpu", 641 | "exponential", 642 | 0.68 643 | ] 644 | }, 645 | { 646 | "id": 13, 647 | "type": "LoraLoader", 648 | "pos": [ 649 | 280, 650 | 140 651 | ], 652 | "size": { 653 | "0": 300, 654 | "1": 130 655 | }, 656 | "flags": {}, 657 | "order": 5, 658 | "mode": 0, 659 | "inputs": [ 660 | { 661 | "name": "model", 662 | "type": "MODEL", 663 | "link": 16 664 | }, 665 | { 666 | "name": "clip", 667 | "type": "CLIP", 668 | "link": 14 669 | } 670 | ], 671 | "outputs": [ 672 | { 673 | "name": "MODEL", 674 | "type": "MODEL", 675 | "links": [ 676 | 17 677 | ], 678 | "shape": 3, 679 | "slot_index": 0 680 | }, 681 | { 682 | "name": "CLIP", 683 | "type": "CLIP", 684 | "links": [ 685 | 15, 686 | 34 687 | ], 688 | "shape": 3, 689 | "slot_index": 1 690 | } 691 | ], 692 | "properties": { 693 | "Node name for S&R": "LoraLoader" 694 | }, 695 | "widgets_values": [ 696 | "Style\\add_detail.safetensors", 697 | 0.66, 698 | 0.6599999999999999 699 | ] 700 | }, 701 | { 702 | "id": 34, 703 | "type": "CyclistMathFloat", 704 | "pos": [ 705 | 890, 706 | 550 707 | ], 708 | "size": { 709 | "0": 210, 710 | "1": 80 711 | }, 712 | "flags": {}, 713 | "order": 13, 714 | "mode": 0, 715 | "inputs": [ 716 | { 717 | "name": "float_1", 718 | "type": "FLOAT", 719 | "link": 67, 720 | "widget": { 721 | "name": "float_1" 722 | } 723 | }, 724 | { 725 | "name": "float_2", 726 | "type": "FLOAT", 727 | "link": 68, 728 | "widget": { 729 | "name": "float_2" 730 | } 731 | } 732 | ], 733 | "outputs": [ 734 | { 735 | "name": "FLOAT", 736 | "type": "FLOAT", 737 | "links": [ 738 | 69 739 | ], 740 | "shape": 3, 741 | "slot_index": 0 742 | } 743 | ], 744 | "title": "Pixel Size", 745 | "properties": { 746 | "Node name for S&R": "CyclistMathFloat" 747 | }, 748 | "widgets_values": [ 749 | "multiplication", 750 | 1, 751 | 1 752 | ] 753 | }, 754 | { 755 | "id": 33, 756 | "type": "ReloadLatent", 757 | "pos": [ 758 | 450, 759 | 450 760 | ], 761 | "size": { 762 | "0": 210, 763 | "1": 60 764 | }, 765 | "flags": {}, 766 | "order": 9, 767 | "mode": 0, 768 | "inputs": [ 769 | { 770 | "name": "fallback", 771 | "type": "LATENT", 772 | "link": 60 773 | } 774 | ], 775 | "outputs": [ 776 | { 777 | "name": "LATENT", 778 | "type": "LATENT", 779 | "links": [ 780 | 62, 781 | 64, 782 | 65 783 | ], 784 | "shape": 3, 785 | "slot_index": 0 786 | } 787 | ], 788 | "properties": { 789 | "Node name for S&R": "ReloadLatent" 790 | }, 791 | "widgets_values": [ 792 | "UpscaleTotal_1" 793 | ] 794 | }, 795 | { 796 | "id": 37, 797 | "type": "OverrideLatent", 798 | "pos": [ 799 | 2070, 800 | 150 801 | ], 802 | "size": { 803 | "0": 210, 804 | "1": 60 805 | }, 806 | "flags": {}, 807 | "order": 18, 808 | "mode": 0, 809 | "inputs": [ 810 | { 811 | "name": "samples", 812 | "type": "LATENT", 813 | "link": 72 814 | } 815 | ], 816 | "properties": { 817 | "Node name for S&R": "OverrideLatent" 818 | }, 819 | "widgets_values": [ 820 | "UpscaleTotal_1" 821 | ] 822 | } 823 | ], 824 | "links": [ 825 | [ 826 | 6, 827 | 7, 828 | 0, 829 | 3, 830 | 2, 831 | "CONDITIONING" 832 | ], 833 | [ 834 | 10, 835 | 10, 836 | 0, 837 | 11, 838 | 0, 839 | "IMAGE" 840 | ], 841 | [ 842 | 13, 843 | 6, 844 | 0, 845 | 3, 846 | 1, 847 | "CONDITIONING" 848 | ], 849 | [ 850 | 14, 851 | 4, 852 | 1, 853 | 13, 854 | 1, 855 | "CLIP" 856 | ], 857 | [ 858 | 15, 859 | 13, 860 | 1, 861 | 6, 862 | 0, 863 | "CLIP" 864 | ], 865 | [ 866 | 16, 867 | 4, 868 | 0, 869 | 13, 870 | 0, 871 | "MODEL" 872 | ], 873 | [ 874 | 17, 875 | 13, 876 | 0, 877 | 3, 878 | 0, 879 | "MODEL" 880 | ], 881 | [ 882 | 18, 883 | 14, 884 | 0, 885 | 11, 886 | 1, 887 | "VAE" 888 | ], 889 | [ 890 | 29, 891 | 21, 892 | 0, 893 | 3, 894 | 3, 895 | "LATENT" 896 | ], 897 | [ 898 | 34, 899 | 13, 900 | 1, 901 | 7, 902 | 0, 903 | "CLIP" 904 | ], 905 | [ 906 | 36, 907 | 23, 908 | 0, 909 | 24, 910 | 0, 911 | "IMAGE" 912 | ], 913 | [ 914 | 58, 915 | 14, 916 | 0, 917 | 23, 918 | 1, 919 | "VAE" 920 | ], 921 | [ 922 | 60, 923 | 11, 924 | 0, 925 | 33, 926 | 0, 927 | "LATENT" 928 | ], 929 | [ 930 | 62, 931 | 33, 932 | 0, 933 | 22, 934 | 0, 935 | "*" 936 | ], 937 | [ 938 | 63, 939 | 22, 940 | 0, 941 | 21, 942 | 0, 943 | "LATENT" 944 | ], 945 | [ 946 | 64, 947 | 33, 948 | 0, 949 | 23, 950 | 0, 951 | "LATENT" 952 | ], 953 | [ 954 | 65, 955 | 33, 956 | 0, 957 | 16, 958 | 0, 959 | "LATENT" 960 | ], 961 | [ 962 | 67, 963 | 16, 964 | 2, 965 | 34, 966 | 0, 967 | "FLOAT" 968 | ], 969 | [ 970 | 68, 971 | 16, 972 | 3, 973 | 34, 974 | 1, 975 | "FLOAT" 976 | ], 977 | [ 978 | 69, 979 | 34, 980 | 0, 981 | 36, 982 | 0, 983 | "*" 984 | ], 985 | [ 986 | 70, 987 | 35, 988 | 0, 989 | 36, 990 | 1, 991 | "*" 992 | ], 993 | [ 994 | 71, 995 | 36, 996 | 0, 997 | 22, 998 | 1, 999 | "BOOLEAN" 1000 | ], 1001 | [ 1002 | 72, 1003 | 3, 1004 | 0, 1005 | 37, 1006 | 0, 1007 | "LATENT" 1008 | ] 1009 | ], 1010 | "groups": [], 1011 | "config": {}, 1012 | "extra": {}, 1013 | "version": 0.4 1014 | } -------------------------------------------------------------------------------- /workflows/UpscaleToMegapixels.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pos13/comfyui-cyclist/6b6accd84fcd69cb6b04e7f6b500a90c28171fca/workflows/UpscaleToMegapixels.png -------------------------------------------------------------------------------- /workflows/UpscaleToResolution.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pos13/comfyui-cyclist/6b6accd84fcd69cb6b04e7f6b500a90c28171fca/workflows/UpscaleToResolution.png --------------------------------------------------------------------------------