# ── LLM Provider ───────────────────────────────────────────────────────────── # Set LLM_PROVIDER to one of: groq | openrouter | anthropic LLM_PROVIDER=groq # API key for the chosen provider (use one of the three lines below) GROQ_API_KEY=your_groq_api_key_here # OPENROUTER_API_KEY=your_openrouter_api_key_here # ANTHROPIC_API_KEY=your_anthropic_api_key_here # Optional: override the model (defaults shown per provider) # Groq default: llama-3.3-70b-versatile # OpenRouter default: meta-llama/llama-3.3-70b-instruct # Anthropic default: claude-sonnet-4-20250514 # LLM_MODEL=llama-3.3-70b-versatile # ── Transcription (optional, for Safari/iOS fallback) ──────────────────────── OPENAI_API_KEY=your_openai_api_key_here_optional OPENAI_TRANSCRIBE_MODEL=gpt-4o-mini-transcribe # ── TTS ─────────────────────────────────────────────────────────────────────── # Cartesia is the primary path (~200ms first byte). The backend reuses a # per-turn `context_id` for streaming continuation so all chunks of one LLM # turn share the same voice context — saves ~30-50ms of per-chunk overhead. CARTESIA_API_KEY=your_cartesia_api_key_here CARTESIA_VOICE_ID=db6b0ed5-d5d3-463d-ae85-518a07d3c2b4 CARTESIA_MODEL_ID=sonic-2 # Kokoro fallback (only used if Cartesia is missing/unreachable). KOKORO_URL=http://localhost:8880 KOKORO_VOICE=af_heart # ── STT (Deepgram streaming, lowest mic-release-to-final latency) ───────────── DEEPGRAM_API_KEY=your_deepgram_api_key_here # Trailing-silence (ms) before Deepgram fires `is_final`. Default 100ms — the # frontend buffers all `is_final` segments through the hold and only commits # on mic-release, so aggressive endpointing just makes the post-release flush # land faster. Increase to 300+ if you see false-final fragmentation. DEEPGRAM_ENDPOINTING_MS=100 # ── Frontend / CORS ─────────────────────────────────────────────────────────── VITE_BACKEND_URL=http://localhost:8000 ALLOWED_ORIGINS=*