# Copy this file to .env and fill in your real values. # .env is never committed — only this .example file is. # Every command needed to provision the cloud side is in commands/commands.md. PROJECT_ID=your-gcp-project-id LOCATION=us-central1 # Vertex AI region (read by the app) REGION=us-central1 # Cloud Run deploy region (used by commands/commands.md / gcloud only) # Cloud Storage — where the raw HR policy documents live GCS_BUCKET_NAME=your-bucket-name # Jina AI — embeddings + reranker JINA_API_KEY=your-jina-api-key-here # Models — optional overrides (defaults in hr_assistant/config.py). # gemini-2.5-flash retires ~2026-10-20 — set LLM_MODEL_NAME to a Gemini 3.x # Flash model before then (no code change — llm.py prefixes it "vertex_ai/"). # FALLBACK_MODEL_NAME is the Groq model llm.py's LiteLLM router falls back to # if the Vertex call errors (prefixed "groq/"). Changing EMBEDDING_MODEL_NAME # also needs `python ingest.py --force` (vector dimension changes). # LLM_MODEL_NAME=gemini-2.5-flash # FALLBACK_MODEL_NAME=openai/gpt-oss-20b # EMBEDDING_MODEL_NAME=jina-embeddings-v2-base-en # RERANKER_MODEL_NAME=jina-reranker-v2-base-multilingual # Qdrant Cloud — the vector store QDRANT_URL=https://your-cluster-url.qdrant.io QDRANT_API_KEY=your-qdrant-api-key-here QDRANT_COLLECTION_NAME=hr_policies # --- Guardrails / cache (the secure pipeline app.py + main.py run) --- # Separate Qdrant collection holding HR docs + the noise corpus together # (used by demo_reliability.py / redteam_test.py) QDRANT_NOISY_COLLECTION_NAME=hr_policies_noisy_demo # Input/output safety guardrail — runs on EVERY request now. "model_armor" # (default, needs the template provisioned — see commands/commands.md Phase 5), # "gemini_lite" (one Gemini call, no extra GCP setup — good for local dev), # or "none" (disabled). GUARDRAIL_PROVIDER=model_armor MODEL_ARMOR_LOCATION=us MODEL_ARMOR_TEMPLATE_ID=hr-assistant-guardrail # Optional tuning — all have sensible defaults; leave unset unless tuning. # GUARDRAIL_FAIL_OPEN_INPUT=false # on a provider ERROR: input fails closed # GUARDRAIL_FAIL_OPEN_OUTPUT=true # output fails open # GUARDRAIL_HISTORY_TURNS=6 # recent USER turns screened with each question (0 = off) # SEMANTIC_CACHE_MAX_ENTRIES=500 # oldest evicted past this # SEMANTIC_CACHE_TTL_SECONDS=3600 # cache entry lifetime (0 = never expire) # LangSmith — tracing for the app + datasets/experiments for evaluate.py. # Free API key at smith.langchain.com. Set LANGSMITH_TRACING=true to send # traces; the app shows a green/grey status line in the sidebar. LANGSMITH_TRACING=false LANGSMITH_ENDPOINT=https://api.smith.langchain.com LANGSMITH_API_KEY=your-langsmith-api-key-here LANGSMITH_PROJECT=hr-policy-assistant # Groq — used two places: the evaluate.py judge (gpt-oss-120b, a different # family from the app's Gemini) and the app's fallback model # (FALLBACK_MODEL_NAME, if the Vertex Gemini call errors). Free key at # console.groq.com. The app runs without it — the fallback just can't fire. GROQ_API_KEY=your-groq-api-key-here # GROQ_BASE_URL=https://api.groq.com/openai/v1 # JUDGE_MODEL_NAME=openai/gpt-oss-120b