from pydantic_settings import BaseSettings, SettingsConfigDict from pydantic import field_validator from typing import List, Union import os from dotenv import load_dotenv load_dotenv() class Settings(BaseSettings): model_config = SettingsConfigDict( env_file=".env", case_sensitive=True, extra="ignore" ) PINECONE_API_KEY: str = "" PINECONE_INDEX: str = "mentorme-mentors" PINECONE_ENVIRONMENT: str = "us-east-1-aws" PINECONE_DIMENSION: int = 1024 HOST: str = "0.0.0.0" PORT: int = int(os.getenv("PORT", "7860")) DEBUG: bool = False EMBEDDING_MODEL_NAME: str = "AITeamVN/Vietnamese_Embedding" USE_FP16: bool = True RECOMMENDATION_TOP_K: int = 30 RECOMMENDATION_RERANK_K: int = 15 RECOMMENDATION_FINAL_COUNT: int = 6 SEMANTIC_WEIGHT: float = 1.0 RULE_BASED_WEIGHT: float = 0.0 @property def CORS_ORIGINS(self) -> List[str]: cors_str = os.getenv("CORS_ORIGINS", "*") if cors_str == "*": return ["*"] return [origin.strip() for origin in cors_str.split(",") if origin.strip()] @field_validator("DEBUG", "USE_FP16", mode="before") @classmethod def parse_bool(cls, v: Union[str, bool]) -> bool: if isinstance(v, str): return v.lower() in ("true", "1", "yes", "on") return bool(v) @field_validator("PORT", "PINECONE_DIMENSION", "RECOMMENDATION_TOP_K", "RECOMMENDATION_RERANK_K", "RECOMMENDATION_FINAL_COUNT", mode="before") @classmethod def parse_int(cls, v: Union[str, int]) -> int: if isinstance(v, str): return int(v) return v @field_validator("SEMANTIC_WEIGHT", "RULE_BASED_WEIGHT", mode="before") @classmethod def parse_float(cls, v: Union[str, float]) -> float: if isinstance(v, str): return float(v) return v _settings: Settings = None def get_settings() -> Settings: global _settings if _settings is None: _settings = Settings() return _settings