diff --git a/src/backend/langflow/api/v1/chat.py b/src/backend/langflow/api/v1/chat.py index 690cad60b..e61f77fa2 100644 --- a/src/backend/langflow/api/v1/chat.py +++ b/src/backend/langflow/api/v1/chat.py @@ -164,6 +164,7 @@ async def stream_build( } yield str(StreamData(event="log", data=log_dict)) vertex.build(user_id) + params = vertex._built_object_repr() valid = True logger.debug(f"Building node {str(vertex.vertex_type)}") @@ -181,14 +182,18 @@ async def stream_build( valid = False flow_data_store[flow_id]["status"] = BuildStatus.FAILURE - response = { - "valid": valid, - "params": params, - "id": vertex.id, - "progress": round(i / number_of_nodes, 2), - } + vertex_id = ( + vertex.parent_node_id if vertex.parent_is_top_level else vertex.id + ) + if vertex_id in graph.top_level_nodes: + response = { + "valid": valid, + "params": params, + "id": vertex_id, + "progress": round(i / number_of_nodes, 2), + } - yield str(StreamData(event="message", data=response)) + yield str(StreamData(event="message", data=response)) langchain_object = graph.build() # Now we need to check the input_keys to send them to the client diff --git a/src/backend/langflow/graph/graph/base.py b/src/backend/langflow/graph/graph/base.py index f10101336..5d2688a0a 100644 --- a/src/backend/langflow/graph/graph/base.py +++ b/src/backend/langflow/graph/graph/base.py @@ -25,8 +25,9 @@ class Graph: ) -> None: self._nodes = nodes self._edges = edges - self._graph_data = {"nodes": nodes, "edges": edges} - self._graph_data = process_flow(self._graph_data) + self.raw_graph_data = {"nodes": nodes, "edges": edges} + self.top_level_nodes = [node.get("id") for node in nodes] + self._graph_data = process_flow(self.raw_graph_data) self._nodes = self._graph_data["nodes"] self._edges = self._graph_data["edges"] self._build_graph() @@ -210,7 +211,9 @@ class Graph: node_lc_type: str = node_data["node"]["template"]["_type"] # type: ignore VertexClass = self._get_vertex_class(node_type, node_lc_type) - nodes.append(VertexClass(node)) + vertex = VertexClass(node) + vertex.set_top_level(self.top_level_nodes) + nodes.append(vertex) return nodes diff --git a/src/backend/langflow/graph/graph/utils.py b/src/backend/langflow/graph/graph/utils.py index 36eb34470..e5d44db6f 100644 --- a/src/backend/langflow/graph/graph/utils.py +++ b/src/backend/langflow/graph/graph/utils.py @@ -9,12 +9,22 @@ def find_last_node(data): return next((n for n in nodes if all(e["source"] != n["id"] for e in edges)), None) +def add_parent_node_id(nodes, parent_node_id): + """ + This function receives a list of nodes and adds a parent_node_id to each node. + """ + for node in nodes: + node["parent_node_id"] = parent_node_id + + def ungroup_node(group_node_data, base_flow): template, flow = ( group_node_data["node"]["template"], group_node_data["node"]["flow"], ) + parent_node_id = group_node_data["id"] g_nodes = flow["data"]["nodes"] + add_parent_node_id(g_nodes, parent_node_id) g_edges = flow["data"]["edges"] # Redirect edges to the correct proxy node diff --git a/src/backend/langflow/graph/vertex/base.py b/src/backend/langflow/graph/vertex/base.py index 0f9a5e8a9..b10788693 100644 --- a/src/backend/langflow/graph/vertex/base.py +++ b/src/backend/langflow/graph/vertex/base.py @@ -26,6 +26,11 @@ class Vertex: self._built_object = UnbuiltObject() self._built = False self.artifacts: Dict[str, Any] = {} + self.parent_node_id: Optional[str] = self._data.get("parent_node_id") + self.parent_is_top_level = False + + def set_top_level(self, top_level_nodes: List[str]) -> None: + self.parent_is_top_level = self.parent_node_id in top_level_nodes def _parse_data(self) -> None: self.data = self._data["data"]