From bcc3bb4cf1a215033a36bb46a1ff65a5a35edf8a Mon Sep 17 00:00:00 2001 From: LAOGOU-666 <441059767@qq.com> Date: Tue, 28 Oct 2025 22:12:24 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=90=8E=E5=8F=B0=E6=A8=A1?= =?UTF-8?q?=E5=BC=8Fbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- py/lgutils.py | 106 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 72 insertions(+), 34 deletions(-) diff --git a/py/lgutils.py b/py/lgutils.py index 43bed19..64985e2 100644 --- a/py/lgutils.py +++ b/py/lgutils.py @@ -110,48 +110,86 @@ def build_prompt_for_nodes(workflow, output_node_ids): # 处理 widget 值 widgets_values = node.get("widgets_values", []) + node_input_list = node.get("inputs", []) + node_type = node["type"] + if widgets_values: - # 获取节点类的输入定义 - node_type = node["type"] + # 获取节点类的完整输入定义 if node_type in nodes.NODE_CLASS_MAPPINGS: node_class = nodes.NODE_CLASS_MAPPINGS[node_type] if hasattr(node_class, "INPUT_TYPES"): try: - try: - input_types_result = node_class.INPUT_TYPES() - except: - # 有些节点的 INPUT_TYPES 需要参数 - input_types_result = {} + input_types_result = node_class.INPUT_TYPES() + except: + input_types_result = {} + + required_inputs = input_types_result.get("required", {}) + optional_inputs = input_types_result.get("optional", {}) + + # 创建一个集合来记录哪些输入有 link + inputs_with_links = set() + inputs_with_widgets = {} # 记录有显式 widget 的输入 + for input_item in node_input_list: + name = input_item.get("name") + if "link" in input_item: + inputs_with_links.add(name) + if "widget" in input_item: + inputs_with_widgets[name] = input_item["widget"] + + # 按照节点类定义的顺序遍历所有输入 + widget_index = 0 + + # 先处理 required 输入 + for param_name, param_def in required_inputs.items(): + # 如果这个输入有 link,跳过 + if param_name in node_inputs: + # 但如果它也有显式 widget,需要消费 widgets_values + if param_name in inputs_with_widgets: + widget_index += 1 + # 检查 control_after_generate + if isinstance(param_def, (list, tuple)) and len(param_def) > 1: + param_config = param_def[1] + if isinstance(param_config, dict) and param_config.get("control_after_generate", False): + widget_index += 1 + continue - required_inputs = input_types_result.get("required", {}) - optional_inputs = input_types_result.get("optional", {}) + # 从 widgets_values 中读取值 + if widget_index < len(widgets_values): + value = widgets_values[widget_index] + node_inputs[param_name] = value + widget_index += 1 + + # 检查是否有 control_after_generate + if isinstance(param_def, (list, tuple)) and len(param_def) > 1: + param_config = param_def[1] + if isinstance(param_config, dict) and param_config.get("control_after_generate", False): + widget_index += 1 + + # 再处理 optional 输入 + for param_name, param_def in optional_inputs.items(): + # 如果这个输入有 link,跳过 + if param_name in node_inputs: + # 但如果它也有显式 widget,需要消费 widgets_values + if param_name in inputs_with_widgets: + widget_index += 1 + # 检查 control_after_generate + if isinstance(param_def, (list, tuple)) and len(param_def) > 1: + param_config = param_def[1] + if isinstance(param_config, dict) and param_config.get("control_after_generate", False): + widget_index += 1 + continue - # 收集所有输入定义(按顺序) - all_inputs = {} - all_inputs.update(required_inputs) - all_inputs.update(optional_inputs) - - # 将 widget 值映射到参数名 - widget_index = 0 - for param_name, param_def in all_inputs.items(): - if param_name not in node_inputs: # 只处理未连接的输入 - if widget_index < len(widgets_values): - value = widgets_values[widget_index] - node_inputs[param_name] = value + # 从 widgets_values 中读取值 + if widget_index < len(widgets_values): + value = widgets_values[widget_index] + node_inputs[param_name] = value + widget_index += 1 + + # 检查是否有 control_after_generate + if isinstance(param_def, (list, tuple)) and len(param_def) > 1: + param_config = param_def[1] + if isinstance(param_config, dict) and param_config.get("control_after_generate", False): widget_index += 1 - - # 处理 control_after_generate(额外的 widget) - # param_def 格式: ("TYPE", {config}) 或 ("TYPE",) - if isinstance(param_def, (list, tuple)) and len(param_def) > 1: - param_config = param_def[1] - if isinstance(param_config, dict): - if param_config.get("control_after_generate", False): - # 跳过 control_after_generate widget(在 widgets_values 中占一个位置) - widget_index += 1 - except Exception as widget_error: - print(f"[GroupExecutor] 处理节点 {node_id} 的 widget 值时出错: {widget_error}") - import traceback - traceback.print_exc() prompt[str(node_id)] = { "class_type": node["type"],