From 036818e9b9681786abd7ed1ec7b43b8d44945568 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Mon, 12 Jun 2023 09:30:20 -0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A7=20refactor(chat.py):=20rename=20po?= =?UTF-8?q?st=5Fbuild=20to=20stream=5Fbuild=20to=20improve=20semantics=20?= =?UTF-8?q?=F0=9F=90=9B=20fix(chat.py):=20fix=20generator=5Fbuild=20method?= =?UTF-8?q?=20to=20yield=20node=5Frepr=20and=20node=5Fid=20=E2=9C=A8=20fea?= =?UTF-8?q?t(chat.py):=20add=20valid=20and=20id=20fields=20to=20error=20re?= =?UTF-8?q?sponse=20to=20improve=20error=20handling=20=F0=9F=94=A7=20refac?= =?UTF-8?q?tor(manager.py):=20change=20logger.exception=20to=20logger.erro?= =?UTF-8?q?r=20to=20log=20exceptions=20=F0=9F=94=A7=20refactor(graph/base.?= =?UTF-8?q?py):=20add=20logging=20to=20generator=5Fbuild=20method=20to=20i?= =?UTF-8?q?mprove=20debugging=20=F0=9F=94=A7=20refactor(vertex/base.py):?= =?UTF-8?q?=20rename=20cache.base=20to=20cache.utils=20to=20improve=20sema?= =?UTF-8?q?ntics=20The=20post=5Fbuild=20method=20in=20chat.py=20was=20rena?= =?UTF-8?q?med=20to=20stream=5Fbuild=20to=20better=20reflect=20its=20funct?= =?UTF-8?q?ionality.=20The=20generator=5Fbuild=20method=20in=20graph/base.?= =?UTF-8?q?py=20was=20fixed=20to=20yield=20node=5Frepr=20and=20node=5Fid?= =?UTF-8?q?=20instead=20of=20node.=5Fbuilt=5Fobject=5Frepr()=20and=20node.?= =?UTF-8?q?id.=20The=20error=20response=20in=20chat.py=20now=20includes=20?= =?UTF-8?q?valid=20and=20id=20fields=20to=20improve=20error=20handling.=20?= =?UTF-8?q?logger.exception=20in=20manager.py=20was=20changed=20to=20logge?= =?UTF-8?q?r.error=20to=20log=20exceptions.=20The=20generator=5Fbuild=20me?= =?UTF-8?q?thod=20in=20graph/base.py=20now=20logs=20the=20sorted=20vertice?= =?UTF-8?q?s=20to=20improve=20debugging.=20The=20cache.base=20module=20in?= =?UTF-8?q?=20vertex/base.py=20was=20renamed=20to=20cache.utils=20to=20bet?= =?UTF-8?q?ter=20reflect=20its=20functionality.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/api/v1/chat.py | 16 ++++++++++------ src/backend/langflow/chat/manager.py | 6 +++--- src/backend/langflow/graph/graph/base.py | 5 ++++- src/backend/langflow/graph/vertex/base.py | 2 +- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/backend/langflow/api/v1/chat.py b/src/backend/langflow/api/v1/chat.py index 2c085c187..1dc75b7bc 100644 --- a/src/backend/langflow/api/v1/chat.py +++ b/src/backend/langflow/api/v1/chat.py @@ -31,7 +31,7 @@ async def websocket_endpoint(client_id: str, websocket: WebSocket): @router.post("/build/{client_id}", response_class=StreamingResponse) -async def post_build(client_id: str, graph_data: dict): +async def stream_build(client_id: str, graph_data: dict): """Build langchain object from data_graph.""" async def event_stream(graph_data): @@ -42,13 +42,15 @@ async def post_build(client_id: str, graph_data: dict): logger.debug("Building langchain object") graph = Graph.from_payload(graph_data) - for node in graph.generator_build(): - logger.debug(f"Building node {node.name}") + for node_repr, node_id in graph.generator_build(): + logger.debug( + f"Building node {node_repr[:50]}{'...' if len(node_repr) > 50 else ''}" + ) response = json.dumps( { "valid": True, - "params": str(node._built_object_repr()), - "id": node.id, + "params": node_repr, + "id": node_id, } ) yield f"data: {response}\n\n" # SSE format @@ -57,7 +59,9 @@ async def post_build(client_id: str, graph_data: dict): except Exception as exc: logger.exception(exc) - error_response = json.dumps({"error": str(exc)}) + error_response = json.dumps( + {"valid": False, "params": str(exc), "id": node_id} + ) yield f"data: {error_response}\n\n" # SSE format return StreamingResponse(event_stream(graph_data), media_type="text/event-stream") diff --git a/src/backend/langflow/chat/manager.py b/src/backend/langflow/chat/manager.py index 614588968..8bd776538 100644 --- a/src/backend/langflow/chat/manager.py +++ b/src/backend/langflow/chat/manager.py @@ -199,8 +199,8 @@ class ChatManager: except Exception as e: # Handle any exceptions that might occur - logger.exception(e) - self.close_connection( + logger.error(e) + await self.close_connection( client_id=client_id, code=status.WS_1011_INTERNAL_ERROR, reason=str(e)[:120], @@ -213,5 +213,5 @@ class ChatManager: reason="Client disconnected", ) except Exception as e: - logger.exception(e) + logger.error(e) self.disconnect(client_id) diff --git a/src/backend/langflow/graph/graph/base.py b/src/backend/langflow/graph/graph/base.py index dba948693..d81613fff 100644 --- a/src/backend/langflow/graph/graph/base.py +++ b/src/backend/langflow/graph/graph/base.py @@ -10,6 +10,7 @@ from langflow.graph.vertex.types import ( ) from langflow.interface.tools.constants import FILE_TOOLS from langflow.utils import payload +from langflow.utils.logger import logger class Graph: @@ -146,8 +147,10 @@ class Graph: """Builds each node in the graph and yields it.""" sorted_vertices = self.topological_sort() + logger.info("Sorted vertices: %s", sorted_vertices) for node in sorted_vertices: - yield node.build() + node.build() + yield node._built_object_repr(), node.id def get_node_neighbors(self, node: Vertex) -> Dict[Vertex, int]: """Returns the neighbors of a node.""" diff --git a/src/backend/langflow/graph/vertex/base.py b/src/backend/langflow/graph/vertex/base.py index bb6ff34dc..2900ba538 100644 --- a/src/backend/langflow/graph/vertex/base.py +++ b/src/backend/langflow/graph/vertex/base.py @@ -1,4 +1,4 @@ -from langflow.cache import base as cache_utils +from langflow.cache import utils as cache_utils from langflow.graph.vertex.constants import DIRECT_TYPES from langflow.interface import loading from langflow.interface.listing import ALL_TYPES_DICT