From 338672fd828c51884e377866363ce17e396d8427 Mon Sep 17 00:00:00 2001 From: NumZ Date: Mon, 24 Mar 2025 08:50:35 +0100 Subject: [PATCH] review all process --- README.md | 31 +- docs/assets/workflow2.png | Bin 23091 -> 84294 bytes py/endpoints.py | 256 +++------------- web/js/jsnodes.js | 608 +++++++++++++++++--------------------- workflow.py | 16 +- 5 files changed, 333 insertions(+), 578 deletions(-) diff --git a/README.md b/README.md index 0a55a4e..f793bb6 100644 --- a/README.md +++ b/README.md @@ -37,8 +37,22 @@ The idea came from the frustration users experienced with the many limitations a By solving these problems, my tool makes node management more intuitive, stable, and efficient, allowing you to focus on what matters: creating. ## 🚀 Updates +**2025.03.23** +First of all, I apologize for not maintaining the code regularly. ComfyUI has evolved significantly since my last version, so I've completely revised the code to ensure better integration with ComfyUI and avoid future issues. + +Features in this version: +- 💪 No need to convert your workflows to API format anymore - you can use original workflows directly. +- 💪 Better cache management +- 🗑️ remove "import workflow", no longer usefull since working on standart workflow. +- + +Warning and know issue: +- 🛑 old version will not be compatible, sorry about that +- ⚠️ The word "seed" in input as "INT" will break the node so if you wan't use "seed" as input prefer to give a name like "seed_input" or whatever... + + **2024.11.01 Initial version features :** -- 💪 Convert your workflows into nodes +1 Convert your workflows into nodes - ⛓️ Chain your workflow - 👄 Extra Node that use [LipSync Studio v0.6](https://www.patreon.com/Wav2LipStudio) @@ -93,19 +107,14 @@ After this command be created folder Comfyui-FlowChain ## ⛓️ Workflow Node ![Illustration](docs/assets/workflow2.png) - - Load a workflow in **workflows** list. This field will show all workflows saved in the comfyui user folder: **ComfyUI\user\default\workflows\api**, if you add a new workflow in this folder you have to refresh UI (F5 to refresh web page) to see it in the **workflows** list. - - Workflows have to be saved as **API format** of comfyui, but save it also in normal format because "api formal file" can't be loaded in comfyui as usually. +Select a workflow from the **workflows** dropdown menu. This list displays all compatible workflows saved in your ComfyUI user directory: - +`ComfyUI\user\default\workflows` -If you don't see **"Export (API format)"** options in Comfyui do this : - - go to Settings - - Activate the **Dev Mode** options - -![Illustration](docs/assets/devmode.png) - --You can also Import the file by "copy/paste" your workflow path in "workflow_api_path" and click import, that will add your workflow in the comfyui api path. +For a workflow to be considered **compatible**, it must contain at least one "Workflow Input" or "Workflow Output" node. This ensures the workflow can properly interface with the FlowChain system. +**Note:** After adding new workflows to this directory, you'll need to refresh the ComfyUI interface (press F5) to see them appear in the dropdown list. But once loaded, it will refresh the parent node automatically + ## ⛓️ Input Node ![Illustration](docs/assets/input2.png) diff --git a/docs/assets/workflow2.png b/docs/assets/workflow2.png index 79f95f4467f0cb8ebd1ad4233dfd67b2d22b9889..6aefd7cfd925c2d8e7b6e78cb431973c7f309404 100644 GIT binary patch literal 84294 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 HO@96_#%dG1 literal 23091 zcmd42XIK;6+b;@Y0g)~sy@N;-q<85^QD1@PzCj9)CZOQNT=JPMq=DBT)1oi>%3Ua&AF7sgc;!MS`%LrZ?bHOMQBF;Q5zZmd4d)*8)vec; zZPoUvmEfLaRXyDuI;A_3cO=>B>6~{>Hf@`Z=ej$)d&+wn_U-AKKjyq$$UWJbC1ftl zy0(;CeP+LL?87xf&qhRTz&EW_9r>2mXQvR{?!D&dHS^TSRE7+j>L)acwQ%!NI{{m>`gd40 zdT8|7vYV(Onpi$tvlU5xH@bgMi9?)J#vrO1y=X!zxxO_lc}o);Ra|)sAsz8&+IXAJ z)RzOx!~;J`M!jFs#6ICL{>t()myv|Um`_?PqMDF42z=T;dU{~-aw=xD%K9&nNE%x8QAN(^1-b2bhsfj`VnFBL7i4(7ws`Y@9g}0!6?U1 zWmsT-P+mirwfDt<%EI2p^af|h&V&80WHfa-9!;ZSAk@vS1daFNo-7ZdkP?_h-u)tp zknU50+F4=HcAwm2Qs@q!->L@ede%D=Bgzo z_+3t=CQ(|0DIiYV#VGd*LFl463bbsWbSPd7=&8Il&kIajm(!nMV3H1l^S4&$U(kJe zT_nC@lUNE|H~7x8YXkdGH4%1xx}KuT>1m>}`-p$T{`_bpWu@tOas#8ZUe`)RO&vJ7 z=r93mgpO8!WK8%PcF@X&sb9zR+CKkw3BeM1S-`f`7bCzw&&$0oIGII4oXpD=kN)d( zB_EabD(Zrk?)BYj7XKS5h_T6B{LUC81JlNCI-q^?PDWV;re|%ke&lp3v)TLn56$^6 zcg#|;B`X&Xun44oTSD<6OcOT$4=uE@@r-i638pkY=2%7e2*o-

>hZS-OU1VjT<%}r3xfUN`X3_zB^F`x1$#O< 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 S*Z~+c!xeR%%Q= 5: - links_by_id[link[0]] = { - "id": link[0], - "origin_id": link[1], - "origin_slot": link[2], - "target_id": link[3], - "target_slot": link[4], - "type": link[5] if len(link) > 5 else None - } - - # Map des liens par cible (nœud + slot) - links_by_target = {} - for link_id, link in links_by_id.items(): - key = f"{link['target_id']}-{link['target_slot']}" - links_by_target[key] = link - - # Résultat au format API - api_format = {} - - # Obtenir un ordre d'exécution approximatif (simplifié) - # Remarque: c'est une simplification, le vrai ordre d'exécution est plus complexe - execution_order = simulate_execution_order(standard_workflow) - - # Traiter les nœuds selon l'ordre d'exécution simulé - for node_id in execution_order: - node = nodes_by_id.get(node_id) - if not node: - continue - - # Ignorer les nœuds désactivés (mode NEVER ou BYPASS) - similaire à LGraphEventMode - # Le mode 2 correspond généralement à NEVER, le mode 3 à BYPASS dans LiteGraph - if node.get("mode") in [2, 4]: - continue - - # Initialiser le nœud au format API - api_node = { - "inputs": {}, - "class_type": node.get("type", ""), - "_meta": { - "title": node.get("title", node.get("type", "")) - } - } - - # Traiter les widgets (valeurs des paramètres) - if "widgets_values" in node: - # Si c'est un tableau (ancien format) - if isinstance(node["widgets_values"], list): - # Associer chaque valeur à son nom si disponible - if "widgets" in node and isinstance(node["widgets"], list): - for i, widget in enumerate(node["widgets"]): - if i < len(node["widgets_values"]) and "name" in widget: - api_node["inputs"][widget["name"]] = node["widgets_values"][i] - # Si c'est un objet (format plus récent) - elif isinstance(node["widgets_values"], dict): - for name, value in node["widgets_values"].items(): - # Si la valeur a une structure spécifique avec une propriété "value" - if isinstance(value, dict) and "value" in value: - api_node["inputs"][name] = value["value"] - else: - api_node["inputs"][name] = value - - # Traiter les connexions d'entrée - if "inputs" in node and isinstance(node["inputs"], list): - for slot_index, input_data in enumerate(node["inputs"]): - if not input_data: - continue - - input_name = input_data.get("name", f"input_{slot_index}") - - # Vérifier si cette entrée a un lien - if "link" in input_data and input_data["link"] is not None: - link = links_by_id.get(input_data["link"]) - if link: - # Suivre les redirections (nœuds en bypass) - origin_id, origin_slot = trace_link_through_bypasses( - link["origin_id"], - link["origin_slot"], - nodes_by_id, - links_by_id - ) - - if origin_id is not None: - # Format API pour une connexion: [node_id, output_slot] - api_node["inputs"][input_name] = [str(origin_id), origin_slot] - - # Ajouter le nœud au format API - api_format[str(node_id)] = api_node - - # Nettoyer les liens qui pointent vers des nœuds inexistants - for node_id, node_data in api_format.items(): - inputs_to_remove = [] - - for input_name, input_value in node_data["inputs"].items(): - if isinstance(input_value, list) and len(input_value) == 2: - source_node_id = input_value[0] - if source_node_id not in api_format: - inputs_to_remove.append(input_name) - - for input_name in inputs_to_remove: - del node_data["inputs"][input_name] - - return api_format - - -def simulate_execution_order(workflow): - """ - Simule un ordre d'exécution approximatif des nœuds. - C'est une simplification de graph.computeExecutionOrder(). - """ - # Fonction simplifiée - dans un vrai graphe, cela serait plus complexe - # en impliquant une analyse topologique du graphe de dépendances - - # On construit un graphe de dépendances - nodes_by_id = {node["id"]: node for node in workflow["nodes"]} - dependencies = {node["id"]: set() for node in workflow["nodes"]} - - # Trouver les dépendances de chaque nœud - if "links" in workflow and isinstance(workflow["links"], list): - for link in workflow["links"]: - if len(link) >= 5: - target_id = link[3] # Le nœud qui reçoit la connexion - source_id = link[1] # Le nœud d'origine - if target_id in dependencies: - dependencies[target_id].add(source_id) - - # Tri topologique simplifié - visited = set() - result = [] - - def visit(node_id): - if node_id in visited: - return - visited.add(node_id) - for dep_id in dependencies[node_id]: - if dep_id in dependencies: # S'assurer que le nœud existe - visit(dep_id) - result.append(node_id) - - # Visiter tous les nœuds - for node_id in dependencies: - if node_id not in visited: - visit(node_id) - - return result - - -def trace_link_through_bypasses(origin_id, origin_slot, nodes_by_id, links_by_id): - """ - Suit une chaîne de nœuds en mode BYPASS pour trouver la source réelle. - Simule le comportement de la boucle while dans graphToPrompt. - """ - current_id = origin_id - current_slot = origin_slot - - # Maximum d'itérations pour éviter les boucles infinies - max_iterations = 100 - iterations = 0 - - while iterations < max_iterations: - iterations += 1 - - parent = nodes_by_id.get(current_id) - if not parent: - break - - # Si le nœud parent n'est pas en mode BYPASS, on a trouvé la source - if parent.get("mode") != 3: # 3 est généralement le mode BYPASS - return current_id, current_slot - - # Chercher le lien d'entrée correspondant pour continuer à remonter - if "inputs" in parent and isinstance(parent["inputs"], list): - for i, input_data in enumerate(parent["inputs"]): - if not input_data or "link" not in input_data: - continue - - # Vérifier si le type correspond (simplifié) - # Dans le vrai code, il y a une vérification plus complexe des types - link = links_by_id.get(input_data["link"]) - if link: - # Mise à jour pour la prochaine itération - current_id = link["origin_id"] - current_slot = link["origin_slot"] - break - else: - # Aucun lien compatible trouvé - break - - # Si on arrive ici, soit on a atteint le maximum d'itérations, - # soit on n'a pas trouvé de chemin valide - return origin_id, origin_slot \ No newline at end of file diff --git a/web/js/jsnodes.js b/web/js/jsnodes.js index 1a011da..513a028 100644 --- a/web/js/jsnodes.js +++ b/web/js/jsnodes.js @@ -273,7 +273,7 @@ function addLoadVideoCommon(nodeType, nodeData) { addVideoPreview(nodeType); addPreviewOptions(nodeType); } -function cleanInputs(root_obj, nodeData, reset_value=true) { +function cleanInputs(root_obj, start_index = 2, reset_value=true) { //nodeData.input.required = {}; /* if (!root_obj.inputs) root_obj.inputs = []; @@ -302,13 +302,15 @@ function cleanInputs(root_obj, nodeData, reset_value=true) { } - root_obj.widgets = root_obj.widgets.splice(0,2) + root_obj.widgets = root_obj.widgets.splice(0,start_index) if(reset_value){ + root_obj.widgets_values = []; + /* for (let key in root_obj.widgets_values) { if (key != "workflows"){ delete root_obj.widgets_values[key]; } - } + }*/ const max_node_output = root_obj.outputs.length; for(let i = 0; i { @@ -528,117 +529,63 @@ async function importWorkflow(root_obj, workflow_path, app, nodeData, reset_valu const filename = workflow_path.replace(/\\/g, '/').split("/"); root_obj.title = "Workflow: "+filename[filename.length-1].replace(".json", "").replace(/_/g, " "); - root_obj.local_input_defs = { - required: {}, - optional: {} - }; - /* + return api.fetchApi("/flowchain/workflow?workflow_path="+workflow_path) .then(response => response.json()) - .then(async data => {*/ - cleanInputs(root_obj,nodeData, reset_values); - /* - if (data.error != "none"){ - return false; - }*/ - - //let workflow = data.workflow; - let workflow = app.lipsync_studio[workflow_path].workflow; - - // Si c'est un format standard, le convertir en format API - if ("nodes" in workflow) { - try { - //app.loading_bling = true; - workflow = await convertWorkflowToApiFormat(workflow); - //app.loading_bling = false; - } catch (error) { - console.error("Échec de la conversion du workflow:", error); - return false; - } - } - - if (!workflow) { - console.error('Workflow invalide ou échec de conversion'); - return false; - } - - // Traiter le workflow API - const nodes_input = Object.fromEntries( - Object.entries(workflow).filter(([k, v]) => v.class_type == "WorkflowInput") - ); + .then(async data => { + //cleanInputs(root_obj,nodeData, reset_values); + + let workflow = data.workflow; + app.lipsync_studio[workflow_path] = data; + + // Si c'est un format standard, le convertir en format API + if ("nodes" in workflow) { + try { + workflow = await convertWorkflowToApiFormat(workflow); + } catch (error) { + console.error("Échec de la conversion du workflow:", error); + return false; + } + } + + if (!workflow) { + console.error('Workflow invalide ou échec de conversion'); + return false; + } + /* + // Traiter le workflow API + const nodes_input = Object.fromEntries( + Object.entries(workflow).filter(([k, v]) => v.class_type == "WorkflowInput") + ); - const nodes_output = Object.fromEntries( - Object.entries(workflow).filter(([k, v]) => v.class_type == "WorkflowOutput") - ); - root_obj.widgets[1].value = JSON.stringify(workflow); - //ComfyWidgets.STRING(root_obj, "workflow", ['STRING',{default: JSON.stringify(workflow)},],app,) - //app.hideWidget(root_obj, root_obj.widgets[root_obj.widgets.length - 1], {holdSpace: false}); - // root_obj.widgets[root_obj.widgets.length - 1].hidden = true; - // Ajouter les widgets d'entrée - - Object.entries(nodes_input).forEach(node => { - addWidgetType(root_obj, node[1].inputs, nodeData); - }); + const nodes_output = Object.fromEntries( + Object.entries(workflow).filter(([k, v]) => v.class_type == "WorkflowOutput") + ); + root_obj.widgets[1].value = JSON.stringify(workflow); + + + Object.entries(nodes_input).forEach(node => { + addWidgetType(root_obj, node[1].inputs, nodeData); + }); - // Ajouter les sorties - Object.entries(nodes_output).forEach(node => { - root_obj.addOutput(`${node[1].inputs.Name}`, node[1].inputs.type); - }); + // Ajouter les sorties + Object.entries(nodes_output).forEach(node => { + root_obj.addOutput(`${node[1].inputs.Name}`, node[1].inputs.type); + }); + + - - - root_obj.size[0] = 400; - return JSON.stringify(workflow); - /* + root_obj.size[0] = 400;*/ + return JSON.stringify(workflow); + }) .catch(error => { console.error('Erreur lors de l\'importation:', error); return false; - });*/ -} -/* -function importWorkflow(root_obj, workflow_path, app, reset_values=true){ - const filename = workflow_path.replace(/\\/g, '/').split("/"); - root_obj.title = "Workflow: "+filename[filename.length-1].replace(".json", "").replace(/_/g, " "); - api.fetchApi("/flowchain/workflow?workflow_path="+workflow_path) - .then(response => response.json()) - .then(data =>{ - cleanInputs(root_obj, reset_values); - if (data.error != "none"){ - return false - }else{ - let workflow = data.workflow; - - console.log('Workflow:', workflow); - const nodes_input = Object.fromEntries( - Object.entries(workflow).filter(([k, v]) => v.class_type == "WorkflowInput") - ); - - const nodes_output = Object.fromEntries( - Object.entries(workflow).filter(([k, v]) => v.class_type == "WorkflowOutput") - ); - - Object.fromEntries( - Object.entries(nodes_input).filter((node, idx) => addWidgetType(root_obj, node[1].inputs)) - ); - - Object.fromEntries( - Object.entries(nodes_output).filter((node, idx) =>root_obj.addOutput(`${node[1].inputs.Name}`, node[1].inputs.type)) - ); - - console.log('Nodes:', nodes_input); - - root_obj.size[0] = 400; - return true - } - }) - .catch(error => { - console.error('Error:', error); - throw error; // Rilancia l'errore per consentire al chiamante di gestirlo }); } -*/ -function addWidgetInfo(root_obj, field_name, value, app, nodeData){ + +function addWidgets(root_obj, field_name, value, app){ let type = value.type; if (type == "converted-widget"){ type = value.origType; @@ -662,7 +609,7 @@ function addWidgetInfo(root_obj, field_name, value, app, nodeData){ ComfyWidgets.INT( root_obj, field_name, - ['',{default: value.value, "min": 0, "max": 18446744073709551616, "step": 1},], + ['INT',{default: value.value, "min": 0, "max": 18446744073709551616, "step": 1},], app, ) // Stocker la définition localement @@ -673,7 +620,7 @@ function addWidgetInfo(root_obj, field_name, value, app, nodeData){ ComfyWidgets.FLOAT( root_obj, field_name, - ['',{default: value.value, callback: (val) => console.log('VALUE', val), "min": 0.00, "max": 2048.00, "step": 0.01},], + ['FLOAT',{default: value.value, "min": 0.00, "max": 2048.00, "step": 0.01},], app, ) // Stocker la définition localement @@ -692,6 +639,22 @@ function addWidgetInfo(root_obj, field_name, value, app, nodeData){ // Stocker la définition localement root_obj.local_input_defs.required[field_name] = ["STRING", {}]; } + if (type == "LATENT") root_obj.addInput(field_name, "LATENT"); + if (type == "MODEL") root_obj.addInput(field_name, "MODEL"); + if (type == "CLIP") root_obj.addInput(field_name, "CLIP"); + if (type == "MASK") root_obj.addInput(field_name, "MASK"); + if (type == "CONDITIONING") root_obj.addInput(field_name, "CONDITIONING"); + if (type == "VAE") root_obj.addInput(field_name, "VAE"); +} + +function addOutputs(root_obj, workflow_name){ + const outputs = app.lipsync_studio[workflow_name].outputs; + for (let [key, value] of Object.entries(outputs)){ + const isoutput = root_obj.outputs.find(i => i.name == value.inputs.Name.value); + if (!isoutput){ + root_obj.addOutput(value.inputs.Name.value, value.inputs.type.value); + } + } } // change @@ -710,25 +673,32 @@ function hideWidget( // @ts-expect-error custom widget type widget.type = "converted-widget" + suffix if (holdSpace) { - widget.computeSize = () => [0, LiteGraph.NODE_WIDGET_HEIGHT] + widget.computeSize = () => [0, LiteGraph.NODE_WIDGET_HEIGHT] + widget.serializeValue = (node, index) => { + // Prevent serializing the widget if we have no input linked + if (!node.inputs) { + return undefined + } + let node_input = node.inputs.find((i) => i.widget?.name === widget.name) + + if (!node_input || !node_input.link) { + return undefined + } + return widget.origSerializeValue + ? widget.origSerializeValue(node, index) + : widget.value + } } else { - // -4 is due to the gap litegraph adds between widgets automatically - widget.computeSize = () => [0, -4] - } - widget.serializeValue = (node, index) => { - // Prevent serializing the widget if we have no input linked - if (!node.inputs) { - return undefined - } - let node_input = node.inputs.find((i) => i.widget?.name === widget.name) - - if (!node_input || !node_input.link) { - return undefined - } - return widget.origSerializeValue - ? widget.origSerializeValue(node, index) - : widget.value + // -4 is due to the gap litegraph adds between widgets automatically + widget.computeSize = () => [0, -4] + widget.serializeValue = (node, index) => { + return widget.origSerializeValue + ? widget.origSerializeValue(node, index) + : widget.value + } } + + // Hide any linked widgets, e.g. seed+seedControl if (widget.linkedWidgets) { @@ -738,23 +708,6 @@ function hideWidget( } } - function showWidget(widget) { - // @ts-expect-error custom widget type - widget.type = widget.origType - widget.computeSize = widget.origComputeSize - widget.serializeValue = widget.origSerializeValue - - delete widget.origType - delete widget.origComputeSize - delete widget.origSerializeValue - - // Hide any linked widgets, e.g. seed+seedControl - if (widget.linkedWidgets) { - for (const w of widget.linkedWidgets) { - showWidget(w) - } - } - } function getWidgetType(config) { // Special handling for COMBO so we restrict links based on the entries @@ -778,14 +731,7 @@ function hideWidget( // Add input and store widget config for creating on primitive node const [oldWidth, oldHeight] = node.size - /*const inputIsOptional = !!widget.options?.inputIsOptional - - const input = node.addInput(widget.name, type, { - // @ts-expect-error [GET_CONFIG] is not a valid property of IWidget - widget: { name: widget.name, [GET_CONFIG]: () => config }, - ...(inputIsOptional ? { shape: LiteGraph.SlotShape.HollowCircle } : {}) - }) - */ + for (const widget of node.widgets) { widget.last_y += LiteGraph.NODE_SLOT_HEIGHT } @@ -798,21 +744,34 @@ function hideWidget( return node } - function convertToWidget(node, widget) { - showWidget(widget) - const [oldWidth, oldHeight] = node.size - node.removeInput(node.inputs.findIndex((i) => i.widget?.name === widget.name)) - - for (const widget of node.widgets) { - widget.last_y -= LiteGraph.NODE_SLOT_HEIGHT +export function addInputs(root_obj, inputs, widgets_values){ + + + let start_index = 2; + for (let [key, value] of Object.entries(inputs)){ + const isinput = root_obj.inputs.find(i => i.name == value.inputs[0]); + const isWidget = root_obj.widgets.find(w => w.name == value.inputs[0]); + + if (!isWidget && (!isinput||isinput.widget)){ + if (value.inputs[2]){ + const values = widgets_values[start_index] ?? value.inputs[2]; + const widget_param = {value: values, type: value.inputs[1]} + //const widget_param = {value: widgets_values[start_index], type: value.inputs.default.type} + addWidgets(root_obj, value.inputs[0], widget_param, app); + if (isinput){ + //node.removeInput(node.inputs.findIndex((i) => i.widget?.name === widget.name)) + const config = [value.inputs[2]] + convertToInput(root_obj, root_obj.widgets[start_index], config) + } + start_index += 1; + }else{ + const input_param = {type: value.inputs[1]}; + addWidgets(root_obj, value.inputs[0], input_param, app); + } + } } - - // Restore original size but grow if needed - node.setSize([ - Math.max(oldWidth, node.size[0]), - Math.max(oldHeight, node.size[1]) - ]) - } + +} app.registerExtension({ name: "FlowChain.jsnodes", @@ -823,19 +782,33 @@ app.registerExtension({ switch (nodeData.name) { case "Workflow": - nodeType.prototype.onNodeCreated = function() { + nodeType.prototype.onNodeCreated = function() { chainCallback(this, "onConfigure", function(info) { //let widgetDict = info.widgets_values - if (!info.widgets_values[0] != "None" && !app.loading_bling){ - - if (this.widgets.length==2){ + if (info.widgets_values[0] != "None"){ + //this.widgets[1].value = importWorkflow(this, info.widgets_values[0], app, nodeData) + //if (this.widgets.length==2){ + const inputs = app.lipsync_studio[info.widgets_values[0]].inputs; + addInputs(this, inputs, info.widgets_values); + addOutputs(this, info.widgets_values[0]); + importWorkflow(this, info.widgets_values[0], app, nodeData) + .then(data => { + if (data){ + this.widgets[1].value = data; + const inputs = app.lipsync_studio[info.widgets_values[0]].inputs; + addInputs(this, inputs, info.widgets_values); + addOutputs(this, info.widgets_values[0]); + importWorkflow(this, info.widgets_values[0], app, nodeData) + } + }) + .catch(error => { + console.error('Erreur lors de l\'importation:', error); + }); + + /* if (info.widgets_values[1] != this.widgets[1].value){ this.widgets[1].value = info.widgets_values[1]; - //hideWidget(this, this.widgets[1]) - //ComfyWidgets.STRING(this, "workflow", ['STRING',{default: workflow},],app,); - //this.widgets[1].hidden = true; } - //this.widgets[0].value = info.widgets_values[0]; const inputs = app.lipsync_studio[info.widgets_values[0]].inputs; let start_index = 2; @@ -844,7 +817,7 @@ app.registerExtension({ const isWidget = this.widgets.find(w => w.name == value.inputs.Name.value); if (!isWidget && (!isinput||isinput.widget)){ const widget_param = {value: info.widgets_values[start_index], type: value.inputs.default.type} - addWidgetInfo(this, value.inputs.Name.value, widget_param, app, nodeData); + addWidgets(this, value.inputs.Name.value, widget_param, app, nodeData); if (isinput){ //node.removeInput(node.inputs.findIndex((i) => i.widget?.name === widget.name)) const config = [value.inputs.default.type] @@ -852,154 +825,105 @@ app.registerExtension({ } start_index += 1; } - } - } + }*/ + //} + /* + if(info.widgets_values[0] != "None") + api.fetchApi("/flowchain/workflow?workflow_path="+info.widgets_values[0]) + .then(response => response.json()) + .then(async data => { + cleanInputs(this); + app.lipsync_studio[info.widgets_values[0]] = data; + addInputs(this, info.widgets_values[0], info.widgets_values); + }) + .catch(error => { + console.error('Erreur lors de l\'importation:', error); + });*/ } - - - - - /* - if(info.widgets_values.workflows.value != "None"){ - const workflow_name = info.widgets_values.workflows.value; - this.widgets[0].value = workflow_name; - console.log("workflow_name", workflow_name) - console.log(app.lipsync_studio[workflow_name]) - const inputs = app.lipsync_studio[workflow_name].inputs; - - for (let w of this.widgets) { - if (w.name in widgetDict) { - w.value = widgetDict[w.name].value; - } - } - for (let [key, value] of Object.entries(widgetDict)) { - let widget = this.widgets.find(w => w.name === key); - if(!widget){ - addWidgetInfo(this, key, value, app, nodeData); - widget = this.widgets.find(w => w.name === key); - } - - console.log(key) - - if(widget){ - console.log(info.widgets_values[key]) - console.log(info.widgets_values[key].options) - widget.options = info.widgets_values[key].options; - widget.value = info.widgets_values[key].value; - - } - } - } - - } - if (this.id == -1){ - for (let i = 0; i < this.outputs.length; i++) { - this.outputs[i] = {links: null, name: info.outputs_values[i].name, type: info.outputs_values[i].type}; - } - }else{ - if (info.outputs_values != undefined){ - this.outputs = [...info.outputs_values]; - } - } - this.setSize(info.size);*/ }); chainCallback(this, "onSerialize", function(info) { for (let w of this.inputs){ // if w.name exists in info.widgets_values + if (w.widget){ if (w.type != this.local_input_defs.required[w.name][0]) w.type = this.local_input_defs.required[w.name][0]; } } - - // Créer la structure info.inputs si elle n'existe pas - /* - if (!info.inputs) - info.inputs = {}; - - // Ajouter les valeurs des widgets dans info.inputs - if (this.widgets) { - for (let w of this.widgets) { - // Stocker uniquement la valeur dans info.inputs - info.inputs[w.name] = w.value; - } - } - - // Le reste de votre code existant pour info.widgets_values reste inchangé - info.widgets_values = {}; - if (this.widgets) { - for (let w of this.widgets) { - info.widgets_values[w.name] = { - name: w.name, - options: w.options, - value: w.value, - type: w.type, - origType: w.origType, - last_y: w.last_y - }; - } - } - */ - /* - let inps = {}; - if (info.widgets_values[0] != "None"){ - const workflow_name = info.widgets_values[0]; - inps = app.lipsync_studio[workflow_name].inputs - } - info.widgets_values = {}; - if (!this.widgets) { - return; - } - - for (let w of this.widgets) { - info.widgets_values[w.name] = {name: w.name, options : w.options, value: w.value, type: w.type, origType: w.origType, last_y: w.last_y}; - } - // info.outputs_values = [...this.outputs]; - info.outputs_values = [] - for (let w of this.outputs){ - info.outputs_values.push({links: w.links, name: w.name, type: w.type}); - } - for (let w of this.inputs){ - for (let [key, value] of Object.entries(inps)){ - if (value.inputs.Name == w.name){ - w.type = value.inputs.type; - break; - } - } - } - this.setSize(info.size); - */ }); const workflow_reload = this.title.startsWith("Workflow: ")?true:false; - if (!app.loading_bling){ + - this.widgets[0].options.values = ["None", ...Object.keys(app.lipsync_studio)] - this.widgets[0].callback = ( value ) => { - if (value == "None" || value == ""){ - this.title = "Workflow (FlowChain ⛓️)"; - cleanInputs(this, nodeData); - }else{ - this.widgets[1].value = importWorkflow(this, value, app, nodeData) - } - }; - if (!workflow_reload){ - this.widgets[0].value = "None"; - this.widgets[1].value = ""; + this.widgets[0].options.values = ["None", ...Object.keys(app.lipsync_studio)] + this.widgets[0].callback = ( value ) => { + cleanInputs(this); + if (value == "None"){ + this.title = "Workflow (FlowChain ⛓️)"; + }else{ + this.widgets[1].value = importWorkflow(this, value, app, nodeData); + const inputs = app.lipsync_studio[value].inputs; + addInputs(this, inputs, {}); + addOutputs(this, value); } - //hideWidget(this, this.widgets[1], { holdSpace: false }) - cleanInputs(this, nodeData); - this.color = "#004670"; - this.bgcolor = "#002942"; + }; + if (!workflow_reload){ + this.widgets[0].value = "None"; + this.widgets[1].value = ""; } + hideWidget(this, this.widgets[1], { holdSpace: false }) + cleanInputs(this); + this.color = "#004670"; + this.bgcolor = "#002942"; + } break; case "WorkflowInput": nodeType.prototype.onNodeCreated = function() { chainCallback(this, "onConfigure", function(info) { - let widgetDict = info.widgets_values - if (info.widgets_values.length == undefined) { + let widgetDict = info.widgets_values; + const inputs = {}; + inputs["default"] = { + inputs: ["default", info.widgets_values[1], info.widgets_values[2]] + /* + default:{value: info.widgets_values[2], type: info.widgets_values[1]}, + Name: {value: "default", type: "STRING"}, + type: {value: info.widgets_values[1], type: "COMBO"}*/ + }; + + addInputs(this, inputs, info.widgets_values); + /* + const inputs = {}; + for (let [k, value] of Object.entries(info.widgets_values)) { + if (k == "default"){ + inputs[k] = { + inputs: { + default:{value: value.value, type: info.widgets_values.default.type}, + Name: {value: k, type: "STRING"}, + type: {value: info.widgets_values.default.type, type: "STRING"} + } + }; + }else{ + inputs[k] = { + inputs: { + default:{value: value.value, type: value.type}, + Name: {value: k, type: value.type}, + type: {value: value.type, type: value.type} + } + }; + } + } + let widgetDict = {}; + if(info.widgets_values.default) + widgetDict = [info.widgets_values.Name.value, info.widgets_values.default.type, info.widgets_values.default.value]; + else + widgetDict = [info.widgets_values.Name.value, info.widgets_values.type.value]; + + addInputs(this, inputs, widgetDict);*/ + /*if (info.widgets_values.length == undefined) { + + for (let w of this.widgets) { if (w.name in widgetDict) { w.value = widgetDict[w.name].value; @@ -1011,7 +935,14 @@ app.registerExtension({ let widget = this.widgets.find(w => w.name === key); let type = this.widgets.find(w => w.name === "type"); if(!widget){ - addWidgetInfo(this, key, value, app, nodeData); + let widget_param = {} + if (value.name == "default"){ + widget_param = {value: value.value, type: type.value} + }else{ + widget_param = value; + } + // addWidgets(this, key, widget_param, app); + addInputs(this, {inputs: {Name: {value: key}, type: {value: type.value}}}, widgetDict); widget = this.widgets.find(w => w.name === key); } //this.widgets.push(value); @@ -1046,25 +977,45 @@ app.registerExtension({ this.outputs[0] = {...info.outputs_values}; } } - this.setSize(info.size); - /*for(let i = this.outputs.length - 1; i>0; i--){ - if (this.outputs[i].name == "*"){ - this.removeOutput(i); - } - }*/ + this.setSize(info.size);*/ + }); chainCallback(this, "onSerialize", function(info) { + let widgetDict = info.widgets_values; + + for (let inp of this.inputs){ + // if w.name exists in info.widgets_values + if (inp.widget){ + if (inp.type != this.local_input_defs.required[inp.name][0]){ + inp.type = this.local_input_defs.required[inp.name][0]; + const wid = this.widgets.find(w => w.name == inp.name); + if (wid && wid.origType != this.local_input_defs.required[inp.name][0]) + wid.origType = this.local_input_defs.required[inp.name][0]; + } + } + } + /* info.widgets_values = {}; if (!this.widgets) { return; } for (let w of this.widgets) { - info.widgets_values[w.name] = {name: w.name, options : w.options, value: w.value, type: w.type, origType: w.origType, last_y: w.last_y}; - } + if (w.name == "default"){ + const default_type = this.inputs.find(i => i.name == "default"); + if (default_type) + info.widgets_values[w.name] = {name: w.name, options : w.options, value: w.value, type: default_type.type}; + else + info.widgets_values[w.name] = {name: w.name, options : w.options, value: w.value, type: info.widgets_values.type.value}; + }else{ + info.widgets_values[w.name] = {name: w.name, options : w.options, value: w.value, type: w.type}; + } + }*/ + /* for (let w of this.inputs){ // if w.name exists in info.widgets_values if (info.widgets_values[w.name]){ + w.type = info.widgets_values[w.name].type; if(info.widgets_values[w.name].type == "converted-widget"){ if(info.widgets_values[w.name].origType == "toggle"){ w.type = "BOOLEAN"; @@ -1082,12 +1033,13 @@ app.registerExtension({ info.outputs_values = {links: [...this.outputs[0].links], name: this.outputs[0].name, slot_index: this.outputs[0].slot_index, type: this.outputs[0].type}; } } - this.setSize(info.size); + + this.setSize(info.size);*/ }); this.widgets[1].callback = ( value ) => { // D'abord, déconnecter tous les liens existants - for (let i = 0; i < this.outputs.length; i++) { + /*for (let i = 0; i < this.outputs.length; i++) { const output = this.outputs[i]; if (output.links && output.links.length) { const links = output.links.slice(); @@ -1103,14 +1055,16 @@ app.registerExtension({ this.graph.removeLink(input.link); } } - clearInputs(this); + clearInputs(this);*/ + cleanInputs(this); + switch(value){ case "STRING": this.addOutput("output", "STRING"); ComfyWidgets.STRING( this, "default", - ["STRING",{default: "",callback: (val) => console.log('VALUE', val),},], + ["STRING",{default: "",},], app, ) @@ -1130,7 +1084,7 @@ app.registerExtension({ ComfyWidgets.FLOAT( this, "default", - ['',{default: 0,callback: (val) => console.log('VALUE', val), "min": 0.00, "max": 2048.00, "step": 0.01},], + ['',{default: 0, "min": 0.00, "max": 2048.00, "step": 0.01},], app, ) break; @@ -1170,7 +1124,7 @@ app.registerExtension({ let widget = this.widgets.find(w => w.name === key); let type = this.widgets.find(w => w.name === "type"); if(!widget){ - addWidgetInfo(this, key, value, app, nodeData); + addWidgets(this, key, value, app); widget = this.widgets.find(w => w.name === key); } //this.widgets.push(value); @@ -1183,13 +1137,6 @@ app.registerExtension({ //find if key exists in inputs array in inputs.Name if (info.widgets_values[key].type != "converted-widget"){ this.removeInput(this.inputs.indexOf(input)); - //input.type = info.widgets_values.type.value; - /*widget.type = "converted-widget" - widget.origType = info.widgets_values[key].origType; - widget.origComputeSize = undefined; - widget.last_y = info.widgets_values[key].last_y; - widget.origSerializeValue = nodeType.prototype.serializeValue; - widget.computeSize = () => [0, -4];*/ } break; } @@ -1269,7 +1216,7 @@ app.registerExtension({ let widget = this.widgets.find(w => w.name === key); let type = this.widgets.find(w => w.name === "type"); if(!widget){ - addWidgetInfo(this, key, value, app, nodeData); + addWidgets(this, key, value, app); widget = this.widgets.find(w => w.name === key); } //this.widgets.push(value); @@ -1282,15 +1229,6 @@ app.registerExtension({ //find if key exists in inputs array in inputs.Name if (info.widgets_values[key].type != "converted-widget"){ this.removeInput(this.inputs.indexOf(input)); - //input.type = info.widgets_values.type.value; - /* - widget.type = "converted-widget" - widget.origType = info.widgets_values[key].origType; - widget.origComputeSize = undefined; - widget.last_y = info.widgets_values[key].last_y; - widget.origSerializeValue = nodeType.prototype.serializeValue; - widget.computeSize = () => [0, -4]; - */ } break; } @@ -1312,11 +1250,7 @@ app.registerExtension({ this.outputs[0] = {...info.outputs_values}; } } - /*for(let i = this.outputs.length - 1; i>0; i--){ - if (this.outputs[i].name == "*"){ - this.removeOutput(i); - } - }*/ + }); chainCallback(this, "onSerialize", function(info) { info.widgets_values = {}; diff --git a/workflow.py b/workflow.py index 0e081ef..e13d25e 100644 --- a/workflow.py +++ b/workflow.py @@ -277,12 +277,13 @@ class Workflow(SaveImage): # get max workflow id # coinvert workflow_outputs to list workflow_outputs = list(workflow_outputs.values()) - workflow_node = {"node": {"id":k, **v} for k, v in workflow.items() if v["class_type"] == "Workflow" and v["inputs"]["workflows"] == workflow_name} + # prendre le premier workflow + workflow_node = [{"id":k, **v} for k, v in workflow.items() if v["class_type"] == "Workflow" and v["inputs"]["workflows"] == workflow_name][0] sub_input_nodes = {k: v for k, v in subworkflow.items() if v["class_type"] == "WorkflowInput"} do_not_delete = [] for sub_id, sub_node in sub_input_nodes.items(): - if sub_node["inputs"]["Name"] in workflow_node["node"]["inputs"]: - value = workflow_node["node"]["inputs"][sub_node["inputs"]["Name"]] + if sub_node["inputs"]["Name"] in workflow_node["inputs"]: + value = workflow_node["inputs"][sub_node["inputs"]["Name"]] if type(value) == list: subworkflow = change_subnode(subworkflow, sub_id, value) else: @@ -298,7 +299,7 @@ class Workflow(SaveImage): for input_name, input_value in node["inputs"].items(): if type(input_value) == list: if len(input_value) > 0: - if input_value[0] == workflow_node["node"]["id"]: + if input_value[0] == workflow_node["id"]: for sub_output_id, sub_output_node in sub_output_nodes.items(): if sub_output_node["inputs"]["Name"] == workflow_outputs[input_value[1]]["inputs"]["Name"]: workflow[node_id]["inputs"][input_name] = sub_output_node["inputs"]["default"] @@ -340,8 +341,7 @@ class Workflow(SaveImage): workflow_outputs_sub = {k: v for k, v in subworkflow.items() if v["class_type"] == "WorkflowOutput"} workflow, subworkflow = merge_inputs_outputs(workflow, workflow_name, subworkflow, workflow_outputs_sub) - workflow = {k: v for k, v in workflow.items() if - not (v["class_type"] == "Workflow" and v["inputs"]["workflows"] == workflow_name)} + workflow = {k: v for k, v in workflow.items() if k != key} # add subworkflow to workflow workflow.update(subworkflow) return workflow, max_id @@ -393,16 +393,18 @@ class Workflow(SaveImage): } # Now you can access the original inputs as before - queue_to_use = len(queue_info["queue_pending"]) > 0 and queue_info["queue_pending"] or queue_info["queue_running"] + queue_to_use = queue_info["queue_running"] original_inputs = [v["inputs"] for k, v in queue_to_use[0][2].items() if "workflows" in v["inputs"] and v["inputs"]["workflows"] == workflows][0] # find "workflow" node in queue_info["queue_pending"][-1][3]["extra_png_info"]["workflow"]["nodes"] + """ for node in queue_to_use[-1][3]["extra_pnginfo"]["workflow"]["nodes"]: workflow_name = 'Workflow: ' + original_inputs["workflows"].replace(".json", "").replace("_", " ") if node["type"] == "Workflow" and node["title"] == workflow_name: workflow = node["widgets_values"][1] break + """ else: # Fallback to empty inputs if server instance not available