From 5162b7807e90c3bc892df996990e5ecfa950a263 Mon Sep 17 00:00:00 2001 From: "Dr.Lt.Data" Date: Wed, 28 Jun 2023 23:14:38 +0900 Subject: [PATCH] robust patch * cut execution path instead of crash if result is empty list --- execution.py | 23 ++++++++++++++++++----- worklist_execution.py | 8 ++++++-- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/execution.py b/execution.py index bc7b57907..cb03a18b4 100644 --- a/execution.py +++ b/execution.py @@ -58,8 +58,12 @@ def map_node_over_list(obj, input_data_all, func, allow_interrupt=False): # get a slice of inputs, repeat last input when list isn't long enough def slice_dict(d, i): d_new = dict() - for k,v in d.items(): - d_new[k] = v[i if len(v) > i else -1] + + for k, v in d.items(): + if not v: + return None + else: + d_new[k] = v[i if len(v) > i else -1] return d_new results = [] @@ -71,15 +75,24 @@ def map_node_over_list(obj, input_data_all, func, allow_interrupt=False): for i in range(max_len_input): if allow_interrupt: nodes.before_node_execution() - results.append(getattr(obj, func)(**slice_dict(input_data_all, i))) + + params = slice_dict(input_data_all, i) + + if params is None: + return None + + results.append(getattr(obj, func)(**params)) return results + def get_output_data(obj, input_data_all): - results = [] uis = [] return_values = map_node_over_list(obj, input_data_all, obj.FUNCTION, allow_interrupt=True) + if return_values is None: + return None, None + for r in return_values: if isinstance(r, dict): if 'ui' in r: @@ -103,7 +116,7 @@ def get_output_data(obj, input_data_all): else: output.append([o[i] for o in results]) - ui = dict() + ui = dict() if len(uis) > 0: ui = {k: [y for x in uis for y in x[k]] for k in uis[0].keys()} return output, ui diff --git a/worklist_execution.py b/worklist_execution.py index 5b7bfd6a5..9cf2eeebb 100644 --- a/worklist_execution.py +++ b/worklist_execution.py @@ -242,12 +242,16 @@ def worklist_execute(server, prompt, outputs, extra_data, prompt_id, outputs_ui, output_data, output_ui = get_output_data(obj, input_data_all) - outputs[unique_id] = output_data - if len(output_ui) > 0: + if output_ui is not None and len(output_ui) > 0: outputs_ui[unique_id] = output_ui if server.client_id is not None: server.send_sync("executed", {"node": unique_id, "output": output_ui, "prompt_id": prompt_id}, server.client_id) + + if output_data is None: + return + + outputs[unique_id] = output_data executed.add(unique_id) result = exception_helper(unique_id, input_data_all, executed, outputs, task)