import os from pathlib import Path from dotenv import load_dotenv from openai import OpenAI load_dotenv() ROOT = Path(__file__).parent OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") DEEPGRAM_API_KEY = os.getenv("DEEPGRAM_API_KEY") PUSHOVER_USER = os.getenv("PUSHOVER_USER") PUSHOVER_TOKEN = os.getenv("PUSHOVER_TOKEN") OPENAI_MODEL = os.getenv("OPENAI_MODEL", "gpt-4.1-mini") EMBEDDING_MODEL = os.getenv("EMBEDDING_MODEL", "text-embedding-3-small") DEEPGRAM_STT_MODEL = os.getenv("DEEPGRAM_STT_MODEL", "nova-3") DEEPGRAM_TTS_MODEL = os.getenv("DEEPGRAM_TTS_MODEL", "aura-2-thalia-en") RAG_N_RESULTS = int(os.getenv("RAG_N_RESULTS", "3")) RAG_CHUNK_SIZE = int(os.getenv("RAG_CHUNK_SIZE", "500")) RAG_CHUNK_OVERLAP = int(os.getenv("RAG_CHUNK_OVERLAP", "50")) RAG_DEBUG = os.getenv("RAG_DEBUG", "").lower() in ("1", "true", "yes") _default_chroma = "chroma_db_twin" if os.getenv("SPACE_ID") and not os.getenv("CHROMA_PATH"): _default_chroma = "/tmp/chroma_db_twin" CHROMA_PATH = Path(os.getenv("CHROMA_PATH", _default_chroma)) if not CHROMA_PATH.is_absolute(): CHROMA_PATH = ROOT / CHROMA_PATH openai_client: OpenAI | None = None deepgram_client = None def ensure_openai_client() -> OpenAI: global openai_client if OPENAI_API_KEY is None: raise RuntimeError("OPENAI_API_KEY is missing. Copy .env.example to .env and add your key.") if openai_client is None: openai_client = OpenAI(api_key=OPENAI_API_KEY) return openai_client def ensure_deepgram_client(): global deepgram_client if DEEPGRAM_API_KEY is None: raise RuntimeError("DEEPGRAM_API_KEY is missing. Copy .env.example to .env and add your key.") if deepgram_client is None: from deepgram import DeepgramClient deepgram_client = DeepgramClient(api_key=DEEPGRAM_API_KEY) return deepgram_client def ensure_clients() -> None: """Validate env vars and initialize API clients (called at app startup).""" ensure_openai_client() ensure_deepgram_client()