"""Central configuration: loads .env files and exposes API keys + constants.""" import os from pathlib import Path from dotenv import load_dotenv PROJECT_ROOT = Path(__file__).resolve().parent.parent # Keys may live in the root .env or the older code/.env — load both. load_dotenv(PROJECT_ROOT / ".env") load_dotenv(PROJECT_ROOT / "code" / ".env") def _get_key(*names): for name in names: value = os.getenv(name) if value: value = value.strip().strip('"').strip("'") # .env.example placeholders like "your_gemini_key..." are not keys if value and not value.lower().startswith("your_"): return value return None def tomtom_key(): return _get_key("TomTom_api_key", "TOMTOM_API_KEY", "tomtom_api_key", "tomtom_api") def calendarific_key(): return _get_key("calendarific_api_key", "CALENDARIFIC_API_KEY") def geoapify_key(): return _get_key("Geoapify_API", "GEOAPIFY_API", "GEOAPIFY_API_KEY") def ticketmaster_key(): return _get_key("Ticketmaster_API", "TICKETMASTER_API", "TICKETMASTER_API_KEY") def gemini_key(): return _get_key("GEMINI_API_KEY", "GOOGLE_API_KEY", "gemini_api_key") def groq_key(): return _get_key("GROQ_API_KEY", "groq_api_key") def mongodb_uri(): return _get_key("MONGODB_URI", "MONGO_URI") # City scope: Lucknow only (MVP) CITY_NAME = "Lucknow" CITY_STATE = "Uttar Pradesh" CITY_CENTER = {"lat": 26.8467, "lon": 80.9462} TIMEZONE = "Asia/Kolkata" # Fallback chains: each provider tries its strong model first, then a # lighter one (different rate-limit buckets), then moves to the next provider. GEMINI_MODELS = ["gemini-2.5-flash", "gemini-2.5-flash-lite"] GROQ_MODELS = ["llama-3.3-70b-versatile", "llama-3.1-8b-instant"] # Departure sweep settings SWEEP_WINDOW_MIN = 90 SWEEP_STEP_MIN = 15