feat: pass settings items to backend on queue prompt

This commit is contained in:
ltdrdata 2023-06-01 22:33:34 +09:00
parent 5c38958e49
commit b729184c49
5 changed files with 22 additions and 10 deletions

View File

@ -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

View File

@ -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):

View File

@ -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])

View File

@ -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) {

View File

@ -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);