""" Universal API key loader with cascading fallbacks. Resolves Docker env-loading issues by checking multiple sources. Pattern: env var → /tmp/{name}_key.txt → /root/.secrets/sentinel_enrichment_keys.env → None """ import os def load_key(name: str) -> str: """Load an API key with multiple fallback sources. Checks in order: 1. Environment variable (os.getenv) 2. File-based fallback at /tmp/{name}_key.txt (Docker workaround) 3. Secrets file at /root/.secrets/sentinel_enrichment_keys.env Returns empty string if not found. """ # 1. Environment variable key = os.getenv(name, "") if key: return key # 2. File-based fallback (works around Docker env sanitization) file_path = f"/tmp/{name.lower().replace('_api_key', '')}_key.txt" try: if os.path.exists(file_path): with open(file_path) as f: key = f.read().strip() if key: return key except Exception: pass # 3. Central secrets file secrets_path = "/root/.secrets/sentinel_enrichment_keys.env" try: if os.path.exists(secrets_path): with open(secrets_path) as f: for line in f: if line.startswith(f"{name}="): key = line.split("=", 1)[1].split("#")[0].strip() if key: return key except Exception: pass return "" # Enrichment key service name → env var mapping SERVICE_KEYS = { "nansen": "NANSEN_API_KEY", "chainaware": "CHAIN_AWARE_API_KEY", "dune": "DUNE_API_KEY", "santiment": "SANTIMENT_API_KEY", "thegraph": "THEGRAPH_API_KEY", "defi": "DEFI_API_KEY", "webacy": "WEBACY_API_KEY", "lunarcrush": "LUNARCRUSH_API_KEY", "arkham": "ARKHAM_API_KEY", "blowfish": "BLOWFISH_API_KEY", }