From cf2940be05954427a89547203968014002b743e3 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 17 Aug 2023 17:58:10 -0300 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(session):=20add=20SessionManag?= =?UTF-8?q?erFactory,=20SessionManager,=20and=20related=20methods?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Added `SessionManagerFactory` class in `src/backend/langflow/services/session/factory.py` to create instances of `SessionManager`. - Added `SessionManager` class in `src/backend/langflow/services/session/manager.py` to manage sessions. - Added `load_session`, `generate_key`, `update_session`, and `clear_session` methods to `SessionManager` to handle session-related logic. These changes were made to introduce session management functionality to the application. --- .../langflow/services/session/__init__.py | 0 .../langflow/services/session/factory.py | 14 +++++++ .../langflow/services/session/manager.py | 38 +++++++++++++++++++ 3 files changed, 52 insertions(+) create mode 100644 src/backend/langflow/services/session/__init__.py create mode 100644 src/backend/langflow/services/session/factory.py create mode 100644 src/backend/langflow/services/session/manager.py diff --git a/src/backend/langflow/services/session/__init__.py b/src/backend/langflow/services/session/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/backend/langflow/services/session/factory.py b/src/backend/langflow/services/session/factory.py new file mode 100644 index 000000000..42b33e70f --- /dev/null +++ b/src/backend/langflow/services/session/factory.py @@ -0,0 +1,14 @@ +from typing import TYPE_CHECKING +from langflow.services.session.manager import SessionManager +from langflow.services.factory import ServiceFactory + +if TYPE_CHECKING: + from langflow.services.cache.manager import BaseCacheManager + + +class SessionManagerFactory(ServiceFactory): + def __init__(self): + super().__init__(SessionManager) + + def create(self, cache_manager: "BaseCacheManager"): + return SessionManager(cache_manager) diff --git a/src/backend/langflow/services/session/manager.py b/src/backend/langflow/services/session/manager.py new file mode 100644 index 000000000..39cefba24 --- /dev/null +++ b/src/backend/langflow/services/session/manager.py @@ -0,0 +1,38 @@ +from langflow.interface.run import build_sorted_vertices +from langflow.services.base import Service +from langflow.services.cache.utils import compute_dict_hash + + +class SessionManager(Service): + name = "session_manager" + + def __init__(self, cache_manager): + self.cache_manager = cache_manager + + def load_session(self, session_id, data_graph): + key = self.generate_key(session_id, data_graph) + + # Check if the data is cached + if key in self.cache_manager: + return self.cache_manager.get(key) + + # If not cached, build the graph and cache it + graph, artifacts = build_sorted_vertices(data_graph) + self.cache_manager.set(key, (graph, artifacts)) + + return graph, artifacts + + def generate_key(self, session_id, data_graph): + # Hash the JSON and combine it with the session_id to create a unique key + json_hash = compute_dict_hash(data_graph) + return f"{session_id}{':' if session_id else ''}{json_hash}" + + def update_session(self, session_id, data_graph, value): + key = self.generate_key(session_id, data_graph) + self.cache_manager.set(key, value) + + def clear_session(self, session_id, data_graph): + key = self.generate_key(session_id, data_graph) + self.cache_manager.delete(key) + + # Additional methods to handle session-related logic