From ccc457dbdb31ceeff80457c876e9a74af052f104 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 12 Dec 2023 10:01:13 -0300 Subject: [PATCH] Add format_elapsed_time function to utils.py and display build duration in stream_build --- src/backend/langflow/api/utils.py | 18 ++++++++++++++++++ src/backend/langflow/api/v1/chat.py | 16 ++++++++++++---- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/backend/langflow/api/utils.py b/src/backend/langflow/api/utils.py index 8921cdb6e..141c79229 100644 --- a/src/backend/langflow/api/utils.py +++ b/src/backend/langflow/api/utils.py @@ -169,3 +169,21 @@ async def check_langflow_version(component: StoreComponentCreate): f"Your version of Langflow ({component.last_tested_version}) is outdated. " f"Please update to the latest version ({langflow_version}) and try again." ) + + +def format_elapsed_time(elapsed_time) -> str: + # Format elapsed time to human readable format coming from + # perf_counter() + # If the elapsed time is less than 1 second, return ms + # If the elapsed time is less than 1 minute, return seconds rounded to 2 decimals + time_str = "" + if elapsed_time < 1: + elapsed_time = int(round(elapsed_time * 1000)) + time_str = f"{elapsed_time} ms" + elif elapsed_time < 60: + elapsed_time = round(elapsed_time, 2) + time_str = f"{elapsed_time} seconds" + else: + elapsed_time = round(elapsed_time / 60, 2) + time_str = f"{elapsed_time} minutes" + return time_str diff --git a/src/backend/langflow/api/v1/chat.py b/src/backend/langflow/api/v1/chat.py index f47eaef91..61db84769 100644 --- a/src/backend/langflow/api/v1/chat.py +++ b/src/backend/langflow/api/v1/chat.py @@ -1,6 +1,11 @@ +import time + from fastapi import APIRouter, Depends, HTTPException, Query, WebSocket, WebSocketException, status from fastapi.responses import StreamingResponse -from langflow.api.utils import build_input_keys_response +from loguru import logger +from sqlmodel import Session + +from langflow.api.utils import build_input_keys_response, format_elapsed_time from langflow.api.v1.schemas import BuildStatus, BuiltResponse, InitResponse, StreamData from langflow.graph.graph.base import Graph from langflow.services.auth.utils import get_current_active_user, get_current_user_by_jwt @@ -8,8 +13,6 @@ from langflow.services.cache.service import BaseCacheService from langflow.services.cache.utils import update_build_status from langflow.services.chat.service import ChatService from langflow.services.deps import get_cache_service, get_chat_service, get_session -from loguru import logger -from sqlmodel import Session router = APIRouter(tags=["Chat"]) @@ -151,12 +154,16 @@ async def stream_build( "log": f"Building node {vertex.vertex_type}", } yield str(StreamData(event="log", data=log_dict)) + # time this + start_time = time.perf_counter() if vertex.is_task: vertex = await try_running_celery_task(vertex, user_id) else: await vertex.build(user_id=user_id) + time_elapded = format_elapsed_time(time.perf_counter() - start_time) params = vertex._built_object_repr() valid = True + logger.debug(f"Building node {str(vertex.vertex_type)}") logger.debug(f"Output: {params[:100]}{'...' if len(params) > 100 else ''}") if vertex.artifacts: @@ -174,9 +181,10 @@ async def stream_build( if vertex_id in graph.top_level_vertices: response = { "valid": valid, - "params": params, + "params": f"Duration: {time_elapded}\n{params}", "id": vertex_id, "progress": round(i / number_of_nodes, 2), + "duration": time_elapded, } yield str(StreamData(event="message", data=response))