import json import os from dependency_injector import providers, containers from firebase_admin import credentials from motor.motor_asyncio import AsyncIOMotorClient from openai import AsyncOpenAI from httpx import AsyncClient as HTTPClient from dotenv import load_dotenv from sentence_transformers import SentenceTransformer from ielts_be.repositories.impl import * from ielts_be.services.impl import * from ielts_be.controllers.impl import * load_dotenv() class DependencyInjector: def __init__(self, polly_client: any, http_client: HTTPClient, stt: OpenAIWhisper): self._container = containers.DynamicContainer() self._polly_client = polly_client self._http_client = http_client self._stt = stt def inject(self): self._setup_clients() self._setup_third_parties() self._setup_repositories() self._setup_services() self._setup_controllers() self._container.wire( packages=["ielts_be"] ) return self def _setup_clients(self): self._container.openai_client = providers.Singleton(AsyncOpenAI) self._container.polly_client = providers.Object(self._polly_client) self._container.http_client = providers.Object(self._http_client) self._container.stt = providers.Object(self._stt) def _setup_third_parties(self): self._container.llm = providers.Factory(OpenAI, client=self._container.openai_client) self._container.tts = providers.Factory(AWSPolly, client=self._container.polly_client) """ with open('ielts_be/services/impl/third_parties/elai/conf.json', 'r') as file: elai_conf = json.load(file) with open('ielts_be/services/impl/third_parties/elai/avatars.json', 'r') as file: elai_avatars = json.load(file) with open('ielts_be/services/impl/third_parties/elai/elai_conf.json', 'r') as file: elai_conf = json.load(file) """ with open('ielts_be/services/impl/third_parties/elai/avatars.json', 'r') as file: elai_avatars = json.load(file) with open('ielts_be/services/impl/third_parties/elai/conf.json', 'r') as file: elai_conf = json.load(file) self._container.vid_gen = providers.Factory( ELAI, client=self._container.http_client, token=os.getenv("ELAI_TOKEN"), avatars=elai_avatars, conf=elai_conf ) self._container.ai_detector = providers.Factory( GPTZero, client=self._container.http_client, gpt_zero_key=os.getenv("GPT_ZERO_API_KEY") ) def _setup_repositories(self): cred = credentials.Certificate(os.getenv("GOOGLE_APPLICATION_CREDENTIALS")) firebase_token = cred.get_access_token().access_token self._container.document_store = providers.Factory( MongoDB, mongo_db=AsyncIOMotorClient(os.getenv("MONGODB_URI"))[os.getenv("MONGODB_DB")] ) self._container.firebase_instance = providers.Factory( FirebaseStorage, client=self._container.http_client, token=firebase_token, bucket=os.getenv("FIREBASE_BUCKET") ) def _setup_services(self): self._container.listening_service = providers.Factory( ListeningService, llm=self._container.llm, stt=self._container.stt, tts=self._container.tts, file_storage=self._container.firebase_instance, document_store=self._container.document_store ) self._container.reading_service = providers.Factory(ReadingService, llm=self._container.llm) self._container.speaking_service = providers.Factory( SpeakingService, llm=self._container.llm, file_storage=self._container.firebase_instance, stt=self._container.stt ) self._container.writing_service = providers.Factory( WritingService, llm=self._container.llm, ai_detector=self._container.ai_detector, file_storage=self._container.firebase_instance ) with open('ielts_be/services/impl/exam/level/mc_variants.json', 'r') as file: mc_variants = json.load(file) self._container.level_service = providers.Factory( LevelService, llm=self._container.llm, document_store=self._container.document_store, mc_variants=mc_variants, reading_service=self._container.reading_service, writing_service=self._container.writing_service, speaking_service=self._container.speaking_service, listening_service=self._container.listening_service ) self._container.grade_service = providers.Factory( GradeService, llm=self._container.llm ) embeddings = SentenceTransformer('all-MiniLM-L6-v2') self._container.training_kb = providers.Factory( TrainingContentKnowledgeBase, embeddings=embeddings ) self._container.training_service = providers.Factory( TrainingService, llm=self._container.llm, document_store=self._container.document_store, training_kb=self._container.training_kb ) self._container.user_service = providers.Factory( UserService, document_store=self._container.document_store ) self._container.evaluation_service = providers.Factory( EvaluationService, db=self._container.document_store, writing_service=self._container.writing_service, speaking_service=self._container.speaking_service ) def _setup_controllers(self): self._container.grade_controller = providers.Factory( GradeController, grade_service=self._container.grade_service, evaluation_service=self._container.evaluation_service ) self._container.user_controller = providers.Factory( UserController, user_service=self._container.user_service ) self._container.training_controller = providers.Factory( TrainingController, training_service=self._container.training_service ) self._container.level_controller = providers.Factory( LevelController, level_service=self._container.level_service ) self._container.listening_controller = providers.Factory( ListeningController, listening_service=self._container.listening_service ) self._container.reading_controller = providers.Factory( ReadingController, reading_service=self._container.reading_service ) self._container.speaking_controller = providers.Factory( SpeakingController, speaking_service=self._container.speaking_service, vid_gen=self._container.vid_gen ) self._container.writing_controller = providers.Factory( WritingController, writing_service=self._container.writing_service )