From 26e6c325aafaa07d233c9194f069e354ff3b98f1 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 17 Aug 2023 18:00:27 -0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fix(manager.py):=20add=20support?= =?UTF-8?q?=20for=20registering=20factory=20dependencies=20to=20handle=20s?= =?UTF-8?q?ervice=20dependencies=20=E2=9C=A8=20feat(manager.py):=20add=20s?= =?UTF-8?q?upport=20for=20handling=20service=20dependencies=20when=20creat?= =?UTF-8?q?ing=20services=20=F0=9F=94=A7=20chore(manager.py):=20comment=20?= =?UTF-8?q?out=20validation=20for=20creating=20services=20before=20the=20s?= =?UTF-8?q?ettings=20service=20=F0=9F=94=A7=20chore(utils.py):=20add=20get?= =?UTF-8?q?=5Fsession=5Fmanager()=20function=20to=20retrieve=20the=20sessi?= =?UTF-8?q?on=20manager=20service?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/services/manager.py | 68 ++++++++++++++++-------- src/backend/langflow/services/schema.py | 1 + src/backend/langflow/services/utils.py | 4 ++ 3 files changed, 51 insertions(+), 22 deletions(-) diff --git a/src/backend/langflow/services/manager.py b/src/backend/langflow/services/manager.py index 1fc87ac7d..d02f0fd1c 100644 --- a/src/backend/langflow/services/manager.py +++ b/src/backend/langflow/services/manager.py @@ -1,5 +1,5 @@ from langflow.services.schema import ServiceType -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, List if TYPE_CHECKING: from langflow.services.factory import ServiceFactory @@ -13,13 +13,19 @@ class ServiceManager: def __init__(self): self.services = {} self.factories = {} + self.dependencies = {} - def register_factory(self, service_factory: "ServiceFactory"): + def register_factory( + self, service_factory: "ServiceFactory", dependencies: List[ServiceType] = None + ): """ - Registers a new factory. + Registers a new factory with dependencies. """ - if service_factory.service_class.name not in self.factories: - self.factories[service_factory.service_class.name] = service_factory + if dependencies is None: + dependencies = [] + service_name = service_factory.service_class.name + self.factories[service_name] = service_factory + self.dependencies[service_name] = dependencies def get(self, service_name: ServiceType): """ @@ -32,17 +38,25 @@ class ServiceManager: def _create_service(self, service_name: ServiceType): """ - Create a new service given its name. + Create a new service given its name, handling dependencies. """ self._validate_service_creation(service_name) - if service_name == ServiceType.SETTINGS_MANAGER: - self.services[service_name] = self.factories[service_name].create() - else: - settings_service = self.get(ServiceType.SETTINGS_MANAGER) - self.services[service_name] = self.factories[service_name].create( - settings_service - ) + # Create dependencies first + for dependency in self.dependencies.get(service_name, []): + if dependency not in self.services: + self._create_service(dependency) + + # Collect the dependent services + dependent_services = { + dep.value: self.services[dep] + for dep in self.dependencies.get(service_name, []) + } + + # Create the actual service + self.services[service_name] = self.factories[service_name].create( + **dependent_services + ) def _validate_service_creation(self, service_name: ServiceType): """ @@ -53,13 +67,13 @@ class ServiceManager: f"No factory registered for the service class '{service_name.name}'" ) - if ( - ServiceType.SETTINGS_MANAGER not in self.factories - and service_name != ServiceType.SETTINGS_MANAGER - ): - raise ValueError( - f"Cannot create service '{service_name.name}' before the settings service" - ) + # if ( + # ServiceType.SETTINGS_MANAGER not in self.factories + # and service_name != ServiceType.SETTINGS_MANAGER + # ): + # raise ValueError( + # f"Cannot create service '{service_name.name}' before the settings service" + # ) def update(self, service_name: ServiceType): """ @@ -81,11 +95,21 @@ def initialize_services(): from langflow.services.cache import factory as cache_factory from langflow.services.chat import factory as chat_factory from langflow.services.settings import factory as settings_factory + from langflow.services.session import factory as session_manager_factory service_manager.register_factory(settings_factory.SettingsManagerFactory()) - service_manager.register_factory(database_factory.DatabaseManagerFactory()) - service_manager.register_factory(cache_factory.CacheManagerFactory()) + service_manager.register_factory( + database_factory.DatabaseManagerFactory(), + dependencies=[ServiceType.SETTINGS_MANAGER], + ) + service_manager.register_factory( + cache_factory.CacheManagerFactory(), dependencies=[ServiceType.SETTINGS_MANAGER] + ) service_manager.register_factory(chat_factory.ChatManagerFactory()) + service_manager.register_factory( + session_manager_factory.SessionManagerFactory(), + dependencies=[ServiceType.CACHE_MANAGER], + ) # Test cache connection service_manager.get(ServiceType.CACHE_MANAGER) diff --git a/src/backend/langflow/services/schema.py b/src/backend/langflow/services/schema.py index 695763afc..852175f46 100644 --- a/src/backend/langflow/services/schema.py +++ b/src/backend/langflow/services/schema.py @@ -11,3 +11,4 @@ class ServiceType(str, Enum): SETTINGS_MANAGER = "settings_manager" DATABASE_MANAGER = "database_manager" CHAT_MANAGER = "chat_manager" + SESSION_MANAGER = "session_manager" diff --git a/src/backend/langflow/services/utils.py b/src/backend/langflow/services/utils.py index 1c5796fb4..befa31f07 100644 --- a/src/backend/langflow/services/utils.py +++ b/src/backend/langflow/services/utils.py @@ -20,3 +20,7 @@ def get_session(): def get_cache_manager(): return service_manager.get(ServiceType.CACHE_MANAGER) + + +def get_session_manager(): + return service_manager.get(ServiceType.SESSION_MANAGER)