From 01438d82e0c8189dc18516008cc5a1b3eb7c8817 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 5 Oct 2023 12:34:54 -0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fix(base.py):=20add=20exception?= =?UTF-8?q?=20logging=20to=20provide=20more=20information=20in=20case=20of?= =?UTF-8?q?=20KeyError=20=F0=9F=90=9B=20fix(utils.py):=20fix=20bug=20where?= =?UTF-8?q?=20ungrouped=20nodes=20were=20not=20added=20to=20the=20queue=20?= =?UTF-8?q?for=20future=20processing=20=E2=9C=A8=20feat(utils.py):=20add?= =?UTF-8?q?=20functionality=20to=20keep=20track=20of=20processed=20nodes?= =?UTF-8?q?=20to=20avoid=20duplicate=20processing=20=E2=9C=A8=20feat(utils?= =?UTF-8?q?.py):=20add=20functionality=20to=20process=20nodes=20in=20a=20b?= =?UTF-8?q?readth-first=20manner=20to=20ensure=20correct=20order=20of=20pr?= =?UTF-8?q?ocessing=20=E2=9C=A8=20feat(utils.py):=20add=20functionality=20?= =?UTF-8?q?to=20update=20source=20handles=20correctly=20when=20ungrouping?= =?UTF-8?q?=20nodes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/graph/graph/base.py | 1 + src/backend/langflow/graph/graph/utils.py | 24 ++++++++++++++++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/backend/langflow/graph/graph/base.py b/src/backend/langflow/graph/graph/base.py index 1a2ce2625..a36c095de 100644 --- a/src/backend/langflow/graph/graph/base.py +++ b/src/backend/langflow/graph/graph/base.py @@ -50,6 +50,7 @@ class Graph: edges = payload["edges"] return cls(nodes, edges) except KeyError as exc: + logger.exception(exc) raise ValueError( f"Invalid payload. Expected keys 'nodes' and 'edges'. Found {list(payload.keys())}" ) from exc diff --git a/src/backend/langflow/graph/graph/utils.py b/src/backend/langflow/graph/graph/utils.py index fa03519cc..2288e4130 100644 --- a/src/backend/langflow/graph/graph/utils.py +++ b/src/backend/langflow/graph/graph/utils.py @@ -1,3 +1,4 @@ +from collections import deque import copy @@ -50,20 +51,37 @@ def ungroup_node(group_node_data, base_flow): base_flow["nodes"] = nodes base_flow["edges"] = edges + return nodes + def process_flow(flow_object): cloned_flow = copy.deepcopy(flow_object) + processed_nodes = set() # To keep track of processed nodes def process_node(node): + node_id = node.get("id") + + # If node already processed, skip + if node_id in processed_nodes: + return + if ( node.get("data") and node["data"].get("node") and node["data"]["node"].get("flow") ): process_flow(node["data"]["node"]["flow"]["data"]) - ungroup_node(node["data"], cloned_flow) + new_nodes = ungroup_node(node["data"], cloned_flow) + # Add new nodes to the queue for future processing + nodes_to_process.extend(new_nodes) - for node in cloned_flow["nodes"]: + # Mark node as processed + processed_nodes.add(node_id) + + nodes_to_process = deque(cloned_flow["nodes"]) + + while nodes_to_process: + node = nodes_to_process.popleft() process_node(node) return cloned_flow @@ -204,7 +222,7 @@ def get_updated_edges(base_flow, g_nodes, group_node_id): new_edge = update_target_handle(new_edge, g_nodes, group_node_id) if new_edge["source"] == group_node_id: - new_edge = update_source_handle(new_edge, g_nodes) + new_edge = update_source_handle(new_edge, base_flow) if edge["target"] == group_node_id or edge["source"] == group_node_id: updated_edges.append(new_edge)