From b729184c499d929443c311c326d28713c51cb326 Mon Sep 17 00:00:00 2001 From: ltdrdata Date: Thu, 1 Jun 2023 22:33:34 +0900 Subject: [PATCH] feat: pass settings items to backend on queue prompt --- execution.py | 15 +++++++++------ main.py | 2 +- server.py | 4 +++- web/scripts/api.js | 3 ++- web/scripts/app.js | 8 +++++++- 5 files changed, 22 insertions(+), 10 deletions(-) diff --git a/execution.py b/execution.py index 218a84c36..bd8862306 100644 --- a/execution.py +++ b/execution.py @@ -13,7 +13,7 @@ import nodes import comfy.model_management -def get_input_data(inputs, class_def, unique_id, outputs={}, prompt={}, extra_data={}): +def get_input_data(inputs, class_def, unique_id, outputs={}, prompt={}, extra_data={}, settings={}): valid_inputs = class_def.INPUT_TYPES() input_data_all = {} for x in inputs: @@ -39,6 +39,8 @@ def get_input_data(inputs, class_def, unique_id, outputs={}, prompt={}, extra_da input_data_all[x] = [extra_data['extra_pnginfo']] if h[x] == "UNIQUE_ID": input_data_all[x] = [unique_id] + if h[x] == "SETTINGS": + input_data_all[x] = [settings] return input_data_all def map_node_over_list(obj, input_data_all, func, allow_interrupt=False): @@ -110,7 +112,7 @@ def format_value(x): else: return str(x) -def recursive_execute(server, prompt, outputs, current_item, extra_data, executed, prompt_id, outputs_ui): +def recursive_execute(server, prompt, outputs, current_item, extra_data, executed, prompt_id, outputs_ui, settings): unique_id = current_item inputs = prompt[unique_id]['inputs'] class_type = prompt[unique_id]['class_type'] @@ -125,14 +127,14 @@ def recursive_execute(server, prompt, outputs, current_item, extra_data, execute input_unique_id = input_data[0] output_index = input_data[1] if input_unique_id not in outputs: - result = recursive_execute(server, prompt, outputs, input_unique_id, extra_data, executed, prompt_id, outputs_ui) + result = recursive_execute(server, prompt, outputs, input_unique_id, extra_data, executed, prompt_id, outputs_ui, settings) if result[0] is not True: # Another node failed further upstream return result input_data_all = None try: - input_data_all = get_input_data(inputs, class_def, unique_id, outputs, prompt, extra_data) + input_data_all = get_input_data(inputs, class_def, unique_id, outputs, prompt, extra_data, settings) if server.client_id is not None: server.last_node_id = unique_id server.send_sync("executing", { "node": unique_id, "prompt_id": prompt_id }, server.client_id) @@ -259,6 +261,7 @@ class PromptExecutor: self.outputs_ui = {} self.old_prompt = {} self.server = server + self.settings = {} def handle_execution_error(self, prompt_id, prompt, current_outputs, executed, error, ex): node_id = error["node_id"] @@ -302,7 +305,7 @@ class PromptExecutor: d = self.outputs.pop(o) del d - def execute(self, prompt, prompt_id, extra_data={}, execute_outputs=[]): + def execute(self, prompt, prompt_id, extra_data={}, execute_outputs=[], settings={}): nodes.interrupt_processing(False) if "client_id" in extra_data: @@ -350,7 +353,7 @@ class PromptExecutor: # This call shouldn't raise anything if there's an error deep in # the actual SD code, instead it will report the node where the # error was raised - success, error, ex = recursive_execute(self.server, prompt, self.outputs, output_node_id, extra_data, executed, prompt_id, self.outputs_ui) + success, error, ex = recursive_execute(self.server, prompt, self.outputs, output_node_id, extra_data, executed, prompt_id, self.outputs_ui, settings) if success is not True: self.handle_execution_error(prompt_id, prompt, current_outputs, executed, error, ex) break diff --git a/main.py b/main.py index 50d3b9a62..23ec60324 100644 --- a/main.py +++ b/main.py @@ -33,7 +33,7 @@ def prompt_worker(q, server): e = execution.PromptExecutor(server) while True: item, item_id = q.get() - e.execute(item[2], item[1], item[3], item[4]) + e.execute(item[2], item[1], item[3], item[4], item[5]) q.task_done(item_id, e.outputs_ui) async def run(server, address='', port=8188, verbose=True, call_on_start=None): diff --git a/server.py b/server.py index 72c565a63..251c0ea1a 100644 --- a/server.py +++ b/server.py @@ -348,6 +348,8 @@ class PromptServer(): self.number += 1 + settings = json_data['settings'] + if "prompt" in json_data: prompt = json_data["prompt"] valid = execution.validate_prompt(prompt) @@ -360,7 +362,7 @@ class PromptServer(): if valid[0]: prompt_id = str(uuid.uuid4()) outputs_to_execute = valid[2] - self.prompt_queue.put((number, prompt_id, prompt, extra_data, outputs_to_execute)) + self.prompt_queue.put((number, prompt_id, prompt, extra_data, outputs_to_execute, settings)) return web.json_response({"prompt_id": prompt_id}) else: print("invalid prompt:", valid[1]) diff --git a/web/scripts/api.js b/web/scripts/api.js index 378165b3a..8249b122b 100644 --- a/web/scripts/api.js +++ b/web/scripts/api.js @@ -146,11 +146,12 @@ class ComfyApi extends EventTarget { * @param {number} number The index at which to queue the prompt, passing -1 will insert the prompt at the front of the queue * @param {object} prompt The prompt data to queue */ - async queuePrompt(number, { output, workflow }) { + async queuePrompt(number, { output, workflow }, settings) { const body = { client_id: this.clientId, prompt: output, extra_data: { extra_pnginfo: { workflow } }, + settings: settings }; if (number === -1) { diff --git a/web/scripts/app.js b/web/scripts/app.js index 8a9c7ca49..7c8583460 100644 --- a/web/scripts/app.js +++ b/web/scripts/app.js @@ -1340,8 +1340,14 @@ export class ComfyApp { for (let i = 0; i < batchCount; i++) { const p = await this.graphToPrompt(); + const settings = {}; + for(let key in localStorage) { + if(key.startsWith("Comfy.Settings")) + settings[key.slice(15)] = localStorage[key]; + } + try { - await api.queuePrompt(number, p); + await api.queuePrompt(number, p, settings); } catch (error) { const formattedError = this.#formatPromptError(error) this.ui.dialog.show(formattedError);