# Copy to .env and fill in. .env is gitignored and must never be committed. # # Note: values are read with python-dotenv, which tolerates characters that a # plain `source .env` in bash would choke on (parentheses, spaces). Don't assume # shell scripts can source this file. # ── Database ────────────────────────────────────────────────────────────────── PG_HOST=localhost PG_PORT=5432 PG_DB=plenum PG_USER=plenum PG_PASSWORD= # Guardrails applied to every pooled connection. The defaults suit an interactive # API; batch jobs may want a larger work_mem and no statement timeout. PG_POOL_MINCONN=1 PG_POOL_MAXCONN=6 PG_APPLICATION_NAME=plenum PG_WORK_MEM=32MB PG_TEMP_FILE_LIMIT=1GB PG_STATEMENT_TIMEOUT_MS=30000 PG_LOCK_TIMEOUT_MS=5000 PG_IDLE_IN_TRANSACTION_SESSION_TIMEOUT_MS=10000 # ── Chat model ──────────────────────────────────────────────────────────────── # Any OpenAI-compatible endpoint, including the /v1 suffix. LLM_DIRECT_URL=http://localhost:8000/v1 # Bearer token for the endpoint above. Leave empty for an unauthenticated local server. LLM_BEARER= # The orchestrator and the final answer. Worth the strongest model you have. LLM_MODEL_SMART= # Summarising tool results and other mechanical work. A smaller model is fine. LLM_MODEL_FAST= # Fallback when neither of the above is set. LLM_MODEL= # ── Embeddings ──────────────────────────────────────────────────────────────── # Separate endpoint, because embedding usually runs on a different server than chat. EMBEDDING_BASE_URL=http://localhost:8003/v1 EMBEDDING_API_KEY= # Must produce vectors of the width declared as embeddings.dimension in # parliament.yaml. Changing this requires re-embedding the whole corpus. LLM_MODEL_EMBEDDING= # ── Optional: additional providers ──────────────────────────────────────────── # Only needed for providers listed in providers.yaml with user_api_key: false. # Keys that users supply in the browser are never stored server-side. BERGET_API_KEY= BERGET_BASE_URL= BERGET_MODEL= GOOGLE_GEMINI_KEY= # ── Application ─────────────────────────────────────────────────────────────── # HMAC secret for the zero-knowledge login challenge. Generate with: # python -c "import secrets; print(secrets.token_hex(32))" AUTH_PRELOGIN_SECRET= # Where downloaded corpora live. Defaults to ./data. Point this at an existing # download to reuse it rather than fetching again. PLENUM_DATA_DIR= # Use a parliament.yaml / prompt tree outside the repository, so a deployment's # own values never show up in a diff against upstream. # PARLIAMENT_CONFIG=/etc/plenum/parliament.yaml # PROMPTS_DIR=/etc/plenum/prompts # Re-read prompt files on every call. Development only. # PROMPTS_RELOAD=1 # ── Deep research tuning ────────────────────────────────────────────────────── # All optional; the defaults in backend/services/research/ are sensible. Listed # here so they are discoverable rather than only findable by grep. # RESEARCH_PROPOSAL_COUNT=6 # threads proposed after the scout pass # RESEARCH_FOLLOWUP_COUNT=3 # follow-up threads suggested after a dig # RESEARCH_MAX_THREADS=12 # hard cap per board # RESEARCH_TARGET_DEPTH=2 # how many dig rounds a thread gets # RESEARCH_SCOUT_ROUNDS=2 # RESEARCH_SCOUT_MATERIAL_CHARS=40000 # RESEARCH_TRIP_MAX_TURNS=14 # tool-call turns per thread before forcing an answer # RESEARCH_TOOL_RESULT_CHARS=8000 # per-result truncation fed back to the model # RESEARCH_ANSWER_MAX_TOKENS=1500 # RESEARCH_REPORT_MAX_TOKENS=4000 # RESEARCH_MAX_RUNNING_JOBS=3 # server-wide concurrency # RESEARCH_MAX_BYO_JOBS_PER_OWNER=1 # concurrency for users on their own API key # RESEARCH_MAX_JOB_RUNTIME_SECS=3600 # RESEARCH_HEARTBEAT_SECS=20 # RESEARCH_STALE_HEARTBEAT_SECS=180 # after this, a job is considered dead and reaped