from loguru import logger from pydantic import Field, MongoDsn, NonNegativeFloat, NonNegativeInt, PositiveInt, SecretStr from pydantic_settings import BaseSettings, SettingsConfigDict from types import MappingProxyType from typing import Literal, Mapping, Optional, Self class Settings(BaseSettings): """ Application settings loaded from environment variables. """ def __init__(self: Self, **data) -> None: super().__init__(**data) logger.debug("Created {}", self.__class__.__name__) if self.__pydantic_extra__: logger.warning("Extra unrecognized environment variables were provided: {}", ", ".join(self.__pydantic_extra__)) # Logging Configuration ― not actually used to configure Loguru, but defined to prevent warnings about “unknown” environment variables LOG_LEVEL: Literal["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"] = Field(default_factory=lambda data: "DEBUG" if data.get("DEBUG", False) else "INFO") LOG_FORMAT: Literal["text", "json"] = "json" # APScheduler Configuration SCHEDULER_TIMEZONE: Optional[str] = "UTC" # Slack Configuration SLACK_BOT_TOKEN: SecretStr SLACK_APP_TOKEN: SecretStr # Vectorization Configuration EMBEDDING_MODEL: str VECTOR_DIMENSION: PositiveInt CHUNK_SIZE: PositiveInt CHUNK_OVERLAP: NonNegativeInt TOP_K_MATCHES: PositiveInt # MongoDB Configuration MONGODB_URI: SecretStr # TODO: Contemplate switching to MongoDsn type for the main URL, and separate out the credentials to SecretStr variables. MONGODB_NAME: str SCORE_THRESHOLD: NonNegativeFloat # Hugging Face Configuration HF_API_TOKEN: Optional[SecretStr] = None # TODO: Currently, this is unused. # OpenAI Configuration OPENAI_API_KEY: SecretStr CHAT_MODEL: str MAX_TOKENS: PositiveInt TEMPERATURE: NonNegativeFloat SYSTEM_PROMPT: str # Google Drive Configuration GOOGLE_DRIVE_ROOT_ID: str GOOGLE_PROJECT_ID: str GOOGLE_PRIVATE_KEY_ID: SecretStr GOOGLE_PRIVATE_KEY: SecretStr GOOGLE_CLIENT_ID: str GOOGLE_CLIENT_EMAIL: str GOOGLE_AUTH_URI: str = "https://accounts.google.com/o/oauth2/auth" GOOGLE_TOKEN_URI: str = "https://oauth2.googleapis.com/token" GOOGLE_AUTH_PROVIDER_CERT_URL: str = "https://www.googleapis.com/oauth2/v1/certs" GOOGLE_CLIENT_CERT_URL: str = "https://www.googleapis.com/robot/v1/metadata/x509/ctp-slack-bot-714%40voltaic-reducer-294821.iam.gserviceaccount.com" GOOGLE_UNIVERSE_DOMAIN: str = "googleapis.com" # File Monitoring Configuration FILE_MONITOR_ROOT_PATH: str = "" model_config = SettingsConfigDict( env_file=".env", env_file_encoding="utf-8", case_sensitive=True, extra="allow", frozen=True ) def get_extra_environment_variables(self: Self) -> Mapping[str, str]: return MappingProxyType(self.__pydantic_extra__)