from typing import Optional import torch from transformers import pipeline from configs.config import settings from configs.exceptions import ConfigurationError, ModelLoadError from configs.logging import get_logger logger = get_logger("model_loader") device_id = 0 if torch.cuda.is_available() else -1 logger.info("device_selected", device_id=device_id, cuda=torch.cuda.is_available()) class ModelLoader: def __init__(self) -> None: self.sentiment_model: Optional[object] = None self.topic_model: Optional[object] = None self.action_model: Optional[object] = None self.device: int = device_id def _load_one(self, name: str, repo: str, hf_token: str): try: logger.info("loading_model", name=name, repo=repo) model = pipeline( "text-classification", model=repo, device=self.device, top_k=3, token=hf_token, ) logger.info("model_loaded", name=name) return model except Exception as e: logger.error("model_load_failed", name=name, reason=str(e)) raise ModelLoadError(name, str(e)) def load_models(self) -> None: hf_token = settings.HF_TOKEN if not hf_token: raise ConfigurationError("HF_TOKEN", "Environment variable not found") self.sentiment_model = self._load_one("sentiment", settings.HF_MODEL_SENTIMENT, hf_token) self.topic_model = self._load_one("topic", settings.HF_MODEL_TOPIC, hf_token) self.action_model = self._load_one("action", settings.HF_MODEL_ACTION, hf_token) logger.info("all_models_loaded") def is_ready(self) -> bool: return ( self.sentiment_model is not None and self.topic_model is not None and self.action_model is not None )