Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix existing singletons #162

Merged
merged 2 commits into from
Jul 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 2 additions & 4 deletions backend/app/models/assistant/chat_assistant.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):

Expand Down Expand Up @@ -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
Expand Down
7 changes: 2 additions & 5 deletions backend/app/models/user_task_execution_inputs_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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:
Expand Down
3 changes: 1 addition & 2 deletions backend/app/routes/image.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):

Expand All @@ -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):
Expand Down
16 changes: 10 additions & 6 deletions mojodex_core/db.py
Original file line number Diff line number Diff line change
Expand Up @@ -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




Expand Down
15 changes: 9 additions & 6 deletions mojodex_core/email_sender/email_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 []
Expand All @@ -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):
Expand Down
2 changes: 2 additions & 0 deletions mojodex_core/knowledge_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
12 changes: 8 additions & 4 deletions mojodex_core/llm_engine/providers/model_loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
"""
Expand Down
14 changes: 9 additions & 5 deletions mojodex_core/push_notification/push_notification_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
10 changes: 10 additions & 0 deletions mojodex_core/user_storage_manager/user_images_file_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down