From 671f3d7100ba4a4863811fc86344f723afe4ccf7 Mon Sep 17 00:00:00 2001 From: KellyRoussel Date: Thu, 4 Jul 2024 11:15:47 +0200 Subject: [PATCH 1/2] fix existing singletons --- mojodex_core/db.py | 16 ++++++++++------ mojodex_core/email_sender/email_service.py | 15 +++++++++------ mojodex_core/knowledge_manager.py | 2 ++ .../llm_engine/providers/model_loader.py | 12 ++++++++---- .../push_notification_service.py | 14 +++++++++----- 5 files changed, 38 insertions(+), 21 deletions(-) diff --git a/mojodex_core/db.py b/mojodex_core/db.py index d056dfc8..4afe28c6 100644 --- a/mojodex_core/db.py +++ b/mojodex_core/db.py @@ -6,20 +6,24 @@ class MojodexCoreDB: _instance = None + _initialized = False def __new__(cls, *args, **kwargs): if not cls._instance: cls._instance = super(MojodexCoreDB, cls).__new__( cls, *args, **kwargs) + cls._instance._initialized = False return cls._instance def __init__(self) -> None: - - try: - connection_string = f"postgresql+psycopg2://{os.environ['DBUSER']}:{os.environ['DBPASS']}@{os.environ['DBHOST']}:5432/{os.environ['DBNAME']}" - self.engine = create_engine(connection_string) - except Exception as e: - logging.warning(f"Error initializing db_session :: {e}") + if not self.__class__._initialized: + try: + connection_string = f"postgresql+psycopg2://{os.environ['DBUSER']}:{os.environ['DBPASS']}@{os.environ['DBHOST']}:5432/{os.environ['DBNAME']}" + self.engine = create_engine(connection_string) + except Exception as e: + logging.warning(f"Error initializing db_session :: {e}") + self.__class__._initialized = True + diff --git a/mojodex_core/email_sender/email_service.py b/mojodex_core/email_sender/email_service.py index 7bd90f38..e44130ef 100644 --- a/mojodex_core/email_sender/email_service.py +++ b/mojodex_core/email_sender/email_service.py @@ -7,6 +7,7 @@ class EmailService: # Singleton _instance = None + _initialized = False admin_email_receivers = os.environ["ADMIN_EMAIL_RECEIVERS"].split(",") if "ADMIN_EMAIL_RECEIVERS" in os.environ else [] technical_email_receivers = os.environ["TECHNICAL_EMAIL_RECEIVERS"].split(",") if "TECHNICAL_EMAIL_RECEIVERS" in os.environ else [] @@ -16,15 +17,17 @@ def __new__(cls, *args, **kwargs): if not cls._instance: cls._instance = super(EmailService, cls).__new__( cls, *args, **kwargs) + cls._instance._initialized = False return cls._instance def __init__(self): - self.email_service_logger = MojodexCoreLogger("email_service_logger") - try: - self._email_sender: EmailSender = self._configure_email_sender() - except Exception as e: - self.email_service_logger.error(f"Error initializing email service :: {e}") - + if not self.__class__._initialized: + self.email_service_logger = MojodexCoreLogger("email_service_logger") + try: + self._email_sender: EmailSender = self._configure_email_sender() + except Exception as e: + self.email_service_logger.error(f"Error initializing email service :: {e}") + self.__class__._initialized = True @property def configured(self): diff --git a/mojodex_core/knowledge_manager.py b/mojodex_core/knowledge_manager.py index 1ed401c4..0c505838 100644 --- a/mojodex_core/knowledge_manager.py +++ b/mojodex_core/knowledge_manager.py @@ -3,11 +3,13 @@ class KnowledgeManager: _instance = None + _initialized = False def __new__(cls, *args, **kwargs): if not cls._instance: cls._instance = super(KnowledgeManager, cls).__new__( cls, *args, **kwargs) + cls._instance._initialized = False return cls._instance @property diff --git a/mojodex_core/llm_engine/providers/model_loader.py b/mojodex_core/llm_engine/providers/model_loader.py index eab40436..1e9df446 100644 --- a/mojodex_core/llm_engine/providers/model_loader.py +++ b/mojodex_core/llm_engine/providers/model_loader.py @@ -18,18 +18,22 @@ class ModelLoader: llm_conf_filename = "models.conf" _instance = None + _initialized = False def __new__(cls, *args, **kwargs): if not cls._instance: cls._instance = super(ModelLoader, cls).__new__( cls, *args, **kwargs) + cls._instance._initialized = False return cls._instance def __init__(self): - self.providers = self._get_providers() - self.main_llm: LLM = self.get_main_llm_provider() - self.main_vision_llm: LLM = self.get_main_vision_llm_provider() - self.embedding_provider: EmbeddingProvider = self._get_embedding_provider() + if not self.__class__._initialized: + self.providers = self._get_providers() + self.main_llm: LLM = self.get_main_llm_provider() + self.main_vision_llm: LLM = self.get_main_vision_llm_provider() + self.embedding_provider: EmbeddingProvider = self._get_embedding_provider() + self.__class__._initialized = True def get_main_llm_provider(self): """ diff --git a/mojodex_core/push_notification/push_notification_service.py b/mojodex_core/push_notification/push_notification_service.py index fc347d64..fa453a26 100644 --- a/mojodex_core/push_notification/push_notification_service.py +++ b/mojodex_core/push_notification/push_notification_service.py @@ -8,19 +8,23 @@ class PushNotificationService: # Singleton _instance = None + _initialized = False def __new__(cls, *args, **kwargs): if not cls._instance: cls._instance = super(PushNotificationService, cls).__new__( cls, *args, **kwargs) + cls._instance._initialized = False return cls._instance def __init__(self): - try: - self.push_notification_logger = MojodexCoreLogger("push_notification_logger") - self._push_notification_sender: PushNotificationSender = self._configure_push_notification_sender() - except Exception as e: - self.push_notification_logger.error(f"Error initializing push notification client :: {e}") + if not self.__class__._initialized: + try: + self.push_notification_logger = MojodexCoreLogger("push_notification_logger") + self._push_notification_sender: PushNotificationSender = self._configure_push_notification_sender() + except Exception as e: + self.push_notification_logger.error(f"Error initializing push notification client :: {e}") + self.__class__._initialized = True @property def configured(self): From e2489c3f42ecccddd32e2e3cc2830cd46d410538 Mon Sep 17 00:00:00 2001 From: KellyRoussel Date: Thu, 4 Jul 2024 11:26:35 +0200 Subject: [PATCH 2/2] user_imahes_file_manager to singleton --- backend/app/models/assistant/chat_assistant.py | 6 ++---- .../app/models/user_task_execution_inputs_manager.py | 7 ++----- backend/app/routes/image.py | 3 +-- .../user_storage_manager/user_images_file_manager.py | 10 ++++++++++ 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/backend/app/models/assistant/chat_assistant.py b/backend/app/models/assistant/chat_assistant.py index 1f407377..5fb6f708 100644 --- a/backend/app/models/assistant/chat_assistant.py +++ b/backend/app/models/assistant/chat_assistant.py @@ -3,7 +3,7 @@ from mojodex_core.llm_engine.providers.openai_vision_llm import VisionMessagesData from abc import ABC, abstractmethod from mojodex_core.llm_engine.providers.model_loader import ModelLoader - +from mojodex_core.user_storage_manager.user_images_file_manager import UserImagesFileManager class ChatAssistant(ABC): @@ -66,10 +66,8 @@ def _call_llm(self, conversation_list, user_id, session_id, user_task_execution_ def __call_vision_llm(self, conversation_list, temperature, max_tokens, user_id, session_id, user_task_execution_pk, task_name_for_system): try: - from mojodex_core.user_storage_manager.user_images_file_manager import UserImagesFileManager - user_image_file_manager = UserImagesFileManager() initial_system_message_data = [VisionMessagesData(role="system", text=self._mpt.prompt, images_path=[ - user_image_file_manager.get_image_file_path(image, user_id, session_id) + UserImagesFileManager().get_image_file_path(image, user_id, session_id) for image in self.input_images])] conversation_messages_data = [ VisionMessagesData(role=message["role"], text=message["content"], images_path=[]) for message in diff --git a/backend/app/models/user_task_execution_inputs_manager.py b/backend/app/models/user_task_execution_inputs_manager.py index f3f2de8a..8e2b3335 100644 --- a/backend/app/models/user_task_execution_inputs_manager.py +++ b/backend/app/models/user_task_execution_inputs_manager.py @@ -7,9 +7,6 @@ class UserTaskExecutionInputsManager: image_type = "image" multiple_images_type = "multiple_images" - def __init__(self): - self.user_image_file_manager = UserImagesFileManager() - def construct_inputs_from_request(self, user_task_execution_json_input_values, inputs, files, user_id, session_id): try: # ensure inputs is a list of dicts and each dict has the required fields (input_name and input_value) @@ -43,13 +40,13 @@ def construct_inputs_from_request(self, user_task_execution_json_input_values, i if input["type"] == self.image_type: if input["input_name"] == image_input: filename = input["value"] - self.user_image_file_manager.store_image_file(files[image_input], filename, user_id, session_id) + UserImagesFileManager().store_image_file(files[image_input], filename, user_id, session_id) if input["type"] == self.multiple_images_type: image_name = "_".join(image_input.split("_")[:-1]) image_index = int(image_input.split("_")[-1]) if input["input_name"] == image_name: filename = input["value"][image_index] - self.user_image_file_manager.store_image_file(files[image_input], filename, user_id, session_id) + UserImagesFileManager().store_image_file(files[image_input], filename, user_id, session_id) return user_task_execution_json_input_values except Exception as e: diff --git a/backend/app/routes/image.py b/backend/app/routes/image.py index 831d478f..5b4b1fc5 100644 --- a/backend/app/routes/image.py +++ b/backend/app/routes/image.py @@ -11,7 +11,6 @@ class Image(Resource): def __init__(self): Image.method_decorators = [authenticate()] - self.user_image_file_manager = UserImagesFileManager() def get(self, user_id): @@ -25,7 +24,7 @@ def get(self, user_id): # Logic try: - images_storage = self.user_image_file_manager.get_images_storage_path(user_id, session_id) + images_storage = UserImagesFileManager().get_images_storage_path(user_id, session_id) filepath = os.path.join(images_storage, filename) if not os.path.isfile(filepath): diff --git a/mojodex_core/user_storage_manager/user_images_file_manager.py b/mojodex_core/user_storage_manager/user_images_file_manager.py index 3ea63155..b2faddcb 100644 --- a/mojodex_core/user_storage_manager/user_images_file_manager.py +++ b/mojodex_core/user_storage_manager/user_images_file_manager.py @@ -3,6 +3,16 @@ class UserImagesFileManager(UserStorageManager): + _instance = None + _initialized = False + + def __new__(cls, *args, **kwargs): + if not cls._instance: + cls._instance = super(UserImagesFileManager, cls).__new__( + cls, *args, **kwargs) + cls._instance._initialized = False + return cls._instance + def get_images_storage_path(self, user_id, session_id): try: