import os from typing import Dict, Any, Optional from dotenv import dotenv_values from pydantic import BaseModel, ConfigDict from pydantic_settings import BaseSettings def load_env_config(): # Try to load from .env file first, then fall back to environment variables env_file_config = dotenv_values() env_vars = dict(os.environ) # Merge .env file values with environment variables (env vars take precedence) return {**env_file_config, **env_vars} def get_config() -> Dict[str, Any]: env_config = load_env_config() config_model = GlobalConfig.model_construct() final_config = {**config_model.model_dump(), **env_config} return final_config class AppConfig(BaseModel): """Application configurations.""" app_name: str = "Creative AdGenesis" app_version: str = "0.1.0" app_description: str = ( "Creative AdGenesis" ) debug_mode: bool = False class GlobalConfig(BaseSettings): """Typed global core object.""" APP_CONFIG: AppConfig = AppConfig() model_config = ConfigDict(extra="ignore") # Environment APP_ENV: Optional[str] = "dev" DEBUG: Optional[bool] = False MONGO_DB: Optional[str] = None MONGO_URI: Optional[str] = None # Cloudflare R2 R2_BUCKET_NAME: Optional[str] = None R2_ACCESS_KEY: Optional[str] = None R2_SECRET_KEY: Optional[str] = None R2_ENDPOINT: Optional[str] = None # OpenAI OPENAI_API_KEY: Optional[str] = None # Replicate REPLICATE_API_KEY: Optional[str] = None GEMINI_API_KEY: Optional[str] = None # Custom NEW_BASE: Optional[str] = None # Load configurations config_data = get_config() cnf = GlobalConfig(**config_data) app_cnf = cnf.APP_CONFIG