From 6f72c4c6ff01ee6d19670eb032548d9c4803ed01 Mon Sep 17 00:00:00 2001 From: pythongosssss <125205205+pythongosssss@users.noreply.github.com> Date: Wed, 29 Mar 2023 18:53:24 +0100 Subject: [PATCH] Allows nodes to return ui data and output data Fire executed event on node when message received --- execution.py | 7 +++++-- web/scripts/app.js | 30 +++++++++++++++++++----------- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/execution.py b/execution.py index 2b26a0f7..79c9a3ac 100644 --- a/execution.py +++ b/execution.py @@ -65,8 +65,11 @@ def recursive_execute(server, prompt, outputs, current_item, extra_data={}): nodes.before_node_execution() outputs[unique_id] = getattr(obj, obj.FUNCTION)(**input_data_all) - if "ui" in outputs[unique_id] and server.client_id is not None: - server.send_sync("executed", { "node": unique_id, "output": outputs[unique_id]["ui"] }, server.client_id) + if "ui" in outputs[unique_id]: + if server.client_id is not None: + server.send_sync("executed", { "node": unique_id, "output": outputs[unique_id]["ui"] }, server.client_id) + if "result" in outputs[unique_id]: + outputs[unique_id] = outputs[unique_id]["result"] return executed + [unique_id] def recursive_will_execute(prompt, outputs, current_item): diff --git a/web/scripts/app.js b/web/scripts/app.js index 3b1f5450..63fc22da 100644 --- a/web/scripts/app.js +++ b/web/scripts/app.js @@ -617,6 +617,10 @@ class ComfyApp { api.addEventListener("executed", ({ detail }) => { this.nodeOutputs[detail.node] = detail.output; + const node = this.graph.getNodeById(detail.node); + if (node.onExecuted) { + node.onExecuted(detail.output); + } }); api.init(); @@ -739,18 +743,22 @@ class ComfyApp { const inputData = inputs[inputName]; const type = inputData[0]; - if (Array.isArray(type)) { - // Enums - Object.assign(config, widgets.COMBO(this, inputName, inputData, app) || {}); - } else if (`${type}:${inputName}` in widgets) { - // Support custom widgets by Type:Name - Object.assign(config, widgets[`${type}:${inputName}`](this, inputName, inputData, app) || {}); - } else if (type in widgets) { - // Standard type widgets - Object.assign(config, widgets[type](this, inputName, inputData, app) || {}); - } else { - // Node connection inputs + if(inputData[1]?.forceInput) { this.addInput(inputName, type); + } else { + if (Array.isArray(type)) { + // Enums + Object.assign(config, widgets.COMBO(this, inputName, inputData, app) || {}); + } else if (`${type}:${inputName}` in widgets) { + // Support custom widgets by Type:Name + Object.assign(config, widgets[`${type}:${inputName}`](this, inputName, inputData, app) || {}); + } else if (type in widgets) { + // Standard type widgets + Object.assign(config, widgets[type](this, inputName, inputData, app) || {}); + } else { + // Node connection inputs + this.addInput(inputName, type); + } } }