import logging from functools import lru_cache from typing import Union, Optional from pydantic_settings import BaseSettings, SettingsConfigDict from pydantic import SecretStr, PostgresDsn, DirectoryPath, Field, validator logger = logging.getLogger(__name__) class Settings(BaseSettings): model_config = SettingsConfigDict(env_file="/home/abdullah/Documents/hdd/projects/ansari/ansari-backend/.env", env_file_encoding="utf-8", case_sensitive=True) DATABASE_URL: PostgresDsn = Field(default="postgresql://mwk@localhost:5432/mwk") MAX_THREAD_NAME_LENGTH: int = Field(default=100) SECRET_KEY: SecretStr = Field(default="secret") ALGORITHM: str = Field(default="HS256") ENCODING: str = Field(default="utf-8") ACCESS_TOKEN_EXPIRY_HOURS: int = Field(default=2) REFRESH_TOKEN_EXPIRY_HOURS: int = Field(default=24*90) ORIGINS: Union[str, list[str]] = Field(default=["https://ansari.chat", "http://ansari.chat"], env="ORIGINS") API_SERVER_PORT: int = Field(default=8000) OPENAI_API_KEY: SecretStr PGPASSWORD: SecretStr KALEMAT_API_KEY: SecretStr VECTARA_AUTH_TOKEN: SecretStr VECTARA_CUSTOMER_ID: str VECTARA_CORPUS_ID: str DISCORD_TOKEN: Optional[SecretStr] = Field(default=None) SENDGRID_API_KEY: Optional[SecretStr] = Field(default=None) LANGFUSE_SECRET_KEY: Optional[SecretStr] = Field(default=None) template_dir: DirectoryPath = Field(default="resources/templates") diskcache_dir: DirectoryPath = Field(default="diskcache_dir") MODEL: str = Field(default="gpt-4o-2024-05-13") MAX_FUNCTION_TRIES: int = Field(default=3) MAX_FAILURES: int = Field(default=1) SYSTEM_PROMPT_FILE_NAME: str = Field(default="system_msg_fn") @validator("ORIGINS", pre=True) def parse_origins(cls, v): if isinstance(v, str): return [origin.strip() for origin in v.strip('"').split(",")] elif isinstance(v, list): return v raise ValueError(f"Invalid ORIGINS format: {v}. Expected a comma-separated string or a list.") @lru_cache() def get_settings() -> Settings: try: settings = Settings() return settings except Exception as e: logger.error(f"Error loading settings: {e}") raise