# Copy this to .env and fill in. Do NOT commit .env. # Voice + Indic translation — Sarvam AI (STT, TTS, Indic translation) SARVAM_API_KEY=sk_your_sarvam_api_key_here # (legacy — embeddings now run locally via BGE-small; this is kept only for back-compat # with old extracted/ artifacts.) VOYAGE_API_KEY=pa-your_voyage_key_here # NVIDIA NIM — single provider for the entire reasoning stack: # Brain = qwen/qwen3-next-80b-a3b-instruct (Qwen 80B, primary) # Judge = mistralai/mistral-large-3-675b-instruct-2512 (Mistral Large 3, different family from brain) # Free tier: 40 req/min, no daily cap, no card. Get a key at https://build.nvidia.com. NVIDIA_NIM_API_KEY=nvapi-your_nim_key_here # --------------------------------------------------------------------------- # CROSS-PROVIDER FALLBACKS (optional but recommended) # --------------------------------------------------------------------------- # Last-resort entries appended to BRAIN_CHAIN + FAST_BRAIN_CHAIN + JUDGE_CHAIN # so the brain + judge survive a FULL NIM outage (regional ingress brownout, # pool-wide 5xx, DNS, etc.). NIM remains primary — these only get hit after # every NIM candidate in the chain has failed. Both keys are optional: if # unset the corresponding fallback is simply skipped and the chain continues. # OpenRouter — aggregates dozens of free + paid OSS models behind one API. # Free-tier model 'openai/gpt-oss-120b' is the cross-provider fallback used # in BRAIN_CHAIN + JUDGE_CHAIN. Get a key at https://openrouter.ai/keys OPENROUTER_API_KEY=sk-or-your_openrouter_key_here # Groq — LPU inference, lowest TTFT of any free-tier 70B option. # 'llama-3.3-70b-versatile' is the cross-provider fallback used at the bottom # of BRAIN_CHAIN + FAST_BRAIN_CHAIN + JUDGE_CHAIN. Get a key at # https://console.groq.com/keys GROQ_API_KEY=gsk_your_groq_key_here # Hugging Face — used by tools/upload_*.py for Space + dataset sync HF_TOKEN=hf_your_token_here # --------------------------------------------------------------------------- # Admin control panel (LLM control UI) # --------------------------------------------------------------------------- # The /admin/llm-control.html page + /api/admin/* endpoints are HIDDEN from # non-allowlisted callers. BOTH gates must pass: # 1. Client IP must match one of the IPs in ADMIN_IP_ALLOWLIST (comma-sep) # 2. Request must include header X-Admin-Password matching ADMIN_PASSWORD # Unauthorized requests get 404 (not 401) so the existence of /api/admin/* is # concealed. Set BOTH or admin endpoints are disabled by default. # Find your public IP at https://api.ipify.org (run from where you'll use admin) ADMIN_IP_ALLOWLIST=your.public.ip.here # A strong unique passphrase. Min 16 chars recommended. Keep out of git. ADMIN_PASSWORD=replace_with_a_strong_random_passphrase