From e7c37fea4f349c09b831d0f5d1b1d16adbace119 Mon Sep 17 00:00:00 2001 From: igorrCarvalho Date: Tue, 27 Feb 2024 21:05:09 -0300 Subject: [PATCH 1/4] Feat: Add Ctrl D and Ctrl P keyboard shortcuts --- .../components/PageComponent/index.tsx | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/frontend/src/pages/FlowPage/components/PageComponent/index.tsx b/src/frontend/src/pages/FlowPage/components/PageComponent/index.tsx index ba12a25ea..8c3f99c46 100644 --- a/src/frontend/src/pages/FlowPage/components/PageComponent/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/PageComponent/index.tsx @@ -87,8 +87,30 @@ export default function Page({ const [lastSelection, setLastSelection] = useState(null); + const setNode = useFlowStore((state) => state.setNode); useEffect(() => { const onKeyDown = (event: KeyboardEvent) => { + const selectedNode = nodes.filter((obj) => obj.selected); + if ((event.ctrlKey || event.metaKey) && event.key === "p" && selectedNode.length > 0) { + event.preventDefault(); + setNode(selectedNode[0].id, (old) => ({ + ...old, + data: { + ...old.data, + node: { + ...old.data.node, + pinned: old.data?.node?.pinned ? false : true, + }, + }, + })); + } + if ((event.ctrlKey || event.metaKey) && event.key === "d" && selectedNode.length > 0) { + event.preventDefault(); + paste({nodes: selectedNode, edges: []}, { + x: position.current.x, + y: position.current.y, + }); + } if (!isWrappedWithClass(event, "noundo")) { if ( (event.key === "y" || (event.key === "z" && event.shiftKey)) && From 116518202c306b7f82138fda4e5728f82add8070 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 27 Feb 2024 21:25:27 -0300 Subject: [PATCH 2/4] Refactor vertex streaming logic in build_vertex_stream function --- src/backend/langflow/api/v1/chat.py | 36 ++++++++++++++++++----------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/src/backend/langflow/api/v1/chat.py b/src/backend/langflow/api/v1/chat.py index e1b52aeb5..beb9b19b2 100644 --- a/src/backend/langflow/api/v1/chat.py +++ b/src/backend/langflow/api/v1/chat.py @@ -185,15 +185,16 @@ async def build_vertex( chat_service.clear_cache(flow_id) # Log the vertex build - background_tasks.add_task( - log_vertex_build, - flow_id=flow_id, - vertex_id=vertex_id, - valid=valid, - params=params, - data=result_data_response, - artifacts=artifacts, - ) + if not vertex.will_stream: + background_tasks.add_task( + log_vertex_build, + flow_id=flow_id, + vertex_id=vertex_id, + valid=valid, + params=params, + data=result_data_response, + artifacts=artifacts, + ) timedelta = time.perf_counter() - start_time duration = format_elapsed_time(timedelta) @@ -243,22 +244,31 @@ async def build_vertex_stream( vertex: "ChatVertex" = graph.get_vertex(vertex_id) if not hasattr(vertex, "stream"): raise ValueError(f"Vertex {vertex_id} does not support streaming") - if not vertex.pinned or not vertex._built: + if isinstance(vertex._built_result, str) and vertex._built_result: + stream_data = StreamData( + event="message", + data={"message": f"Streaming vertex {vertex_id}"}, + ) + yield str(stream_data) + stream_data = StreamData( + event="message", + data={"chunk": vertex._built_result}, + ) + yield str(stream_data) + + elif not vertex.pinned or not vertex._built: logger.debug(f"Streaming vertex {vertex_id}") stream_data = StreamData( event="message", data={"message": f"Streaming vertex {vertex_id}"}, ) yield str(stream_data) - number_of_chunks = 0 async for chunk in vertex.stream(): stream_data = StreamData( event="message", data={"chunk": chunk}, ) - number_of_chunks += 1 yield str(stream_data) - logger.debug(f"Number of chunks: {number_of_chunks}") elif vertex.result is not None: stream_data = StreamData( event="message", From a9d183bab0e17c9d433634b46cd06e66f775e9d4 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 27 Feb 2024 21:25:37 -0300 Subject: [PATCH 3/4] Refactor typing imports and add 'will_stream' attribute to Vertex class --- src/backend/langflow/graph/vertex/base.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/backend/langflow/graph/vertex/base.py b/src/backend/langflow/graph/vertex/base.py index dd308f9f1..b917889a4 100644 --- a/src/backend/langflow/graph/vertex/base.py +++ b/src/backend/langflow/graph/vertex/base.py @@ -2,16 +2,13 @@ import ast import inspect import types from enum import Enum -from typing import TYPE_CHECKING, Any, Callable, Coroutine, Dict, List, Optional +from typing import (TYPE_CHECKING, Any, Callable, Coroutine, Dict, List, + Optional) from loguru import logger -from langflow.graph.schema import ( - INPUT_COMPONENTS, - OUTPUT_COMPONENTS, - InterfaceComponentTypes, - ResultData, -) +from langflow.graph.schema import (INPUT_COMPONENTS, OUTPUT_COMPONENTS, + InterfaceComponentTypes, ResultData) from langflow.graph.utils import UnbuiltObject, UnbuiltResult from langflow.graph.vertex.utils import generate_result from langflow.interface.initialize import loading @@ -44,6 +41,7 @@ class Vertex: ) -> None: # is_external means that the Vertex send or receives data from # an external source (e.g the chat) + self.will_stream = False self.updated_raw_params = False self.id: str = data["id"] self.is_input = any( From b55be2aba02b40faac57d3a1ee7768ce1d7b3f2f Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 27 Feb 2024 21:26:18 -0300 Subject: [PATCH 4/4] Refactor ChatVertex to include streaming capability --- src/backend/langflow/graph/vertex/types.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/backend/langflow/graph/vertex/types.py b/src/backend/langflow/graph/vertex/types.py index 100390d11..0b2be3ab0 100644 --- a/src/backend/langflow/graph/vertex/types.py +++ b/src/backend/langflow/graph/vertex/types.py @@ -11,7 +11,7 @@ from langflow.graph.utils import UnbuiltObject, flatten_list from langflow.graph.vertex.base import StatefulVertex, StatelessVertex from langflow.interface.utils import extract_input_variables_from_prompt from langflow.schema import Record -from langflow.services.monitor.utils import log_message +from langflow.services.monitor.utils import log_vertex_build from langflow.utils.schemas import ChatOutputResponse @@ -394,6 +394,8 @@ class ChatVertex(StatelessVertex): sender_name=sender_name, stream_url=stream_url, ) + + self.will_stream = stream_url is not None if artifacts: self.artifacts = artifacts.model_dump() if isinstance(self._built_object, (AsyncIterator, Iterator)): @@ -434,13 +436,15 @@ class ChatVertex(StatelessVertex): self._built_result = complete_message # Update artifacts with the message # and remove the stream_url + self._finalize_build() logger.debug(f"Streamed message: {complete_message}") - await log_message( - sender=self.params.get("sender", ""), - sender_name=self.params.get("sender_name", ""), - message=complete_message, - session_id=self.params.get("session_id", ""), + await log_vertex_build( + flow_id=self.graph.flow_id, + vertex_id=self.id, + valid=True, + params=self._built_object_repr(), + data=self.result, artifacts=self.artifacts, )