"""Central configuration, loaded from the environment / .env file.""" import os from dotenv import load_dotenv load_dotenv() def _require(name: str) -> str: value = os.getenv(name) if not value: raise RuntimeError( f"Missing required environment variable {name!r}. " "Copy .env.example to .env and fill it in." ) return value # --- Database --- DB_SERVER = _require("DB_SERVER") DB_PORT = os.getenv("DB_PORT", "1433") DB_NAME = _require("DB_NAME") DB_USER = _require("DB_USER") DB_PASSWORD = _require("DB_PASSWORD") DB_DRIVER = os.getenv("DB_DRIVER", "ODBC Driver 18 for SQL Server") # --- LLM backend (OpenAI-compatible: Groq, ngrok AI Gateway, OpenAI, etc.) --- # Default: Groq free tier. Swap LLM_BASE_URL/LLM_MODEL to use another backend. LLM_BASE_URL = os.getenv("LLM_BASE_URL", "https://api.groq.com/openai/v1") LLM_API_KEY = os.getenv("LLM_API_KEY", "") LLM_MODEL = os.getenv("LLM_MODEL", "llama-3.3-70b-versatile") # Price per 1M tokens for cost roll-ups (defaults = Groq Llama 3.3 70B paid rate). # On the free tier your real cost is $0 — these power the projected-cost metric. LLM_PRICE_IN = float(os.getenv("LLM_PRICE_IN", "0.59")) LLM_PRICE_OUT = float(os.getenv("LLM_PRICE_OUT", "0.79")) # --- Monitoring --- # If set, /api/metrics requires header X-Metrics-Token: (empty = open). METRICS_TOKEN = os.getenv("METRICS_TOKEN", "") # --- Behaviour --- MAX_RESULT_ROWS = int(os.getenv("MAX_RESULT_ROWS", "200")) QUERY_TIMEOUT = int(os.getenv("QUERY_TIMEOUT", "30")) # Comma-separated list of web origins allowed to call the API (for embedding the # widget on another site). Use "*" for any origin (dev only). In production set # this to your site, e.g. "https://www.antern.com,https://antern.com". ALLOWED_ORIGINS = [ o.strip() for o in os.getenv("ALLOWED_ORIGINS", "*").split(",") if o.strip() ] def connection_string() -> str: """Build a pyodbc connection string. Password is wrapped in braces so special characters (e.g. & in the password) are handled safely.""" return ( f"DRIVER={{{DB_DRIVER}}};" f"SERVER={DB_SERVER},{DB_PORT};" f"DATABASE={DB_NAME};" f"UID={DB_USER};" f"PWD={{{DB_PASSWORD}}};" "Encrypt=yes;" "TrustServerCertificate=yes;" f"Connection Timeout=15;" )