891f44c1a9
llama-server only reuses a byte-identical prompt prefix. Several things changed the prefix every turn, forcing most of the prompt to be re-prefilled: - Memories: rank still chooses which memories fit the budget, but the chosen ones are emitted in stored order, so the block is identical across queries. - History trimming: the conversation-evidence summary is only included when turns were actually dropped (it duplicated retained turns otherwise). On overflow, old turns are dropped at stable cut points down to ~65% of the budget, so the retained prefix holds for several turns instead of shifting by one turn every request. - Tools: TOOL_ROUTING_MODE=static (default) binds the full role-appropriate tool set in registration order with no discovery tool; admin gating is unchanged. TOOL_ROUTING_MODE=dynamic keeps the keyword router. - Observability: per-call model_calls in the stream_request log now include cached_prompt_tokens when the provider reports cache reads. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
195 lines
7.8 KiB
Bash
195 lines
7.8 KiB
Bash
# Database Configuration
|
|
# PostgreSQL is recommended (required for OIDC features)
|
|
DATABASE_URL=postgres://raggr:changeme@postgres:5432/raggr
|
|
|
|
# PostgreSQL credentials (if using docker-compose postgres service)
|
|
POSTGRES_USER=raggr
|
|
POSTGRES_PASSWORD=changeme
|
|
POSTGRES_DB=raggr
|
|
|
|
# JWT Configuration
|
|
JWT_SECRET_KEY=your-secret-key-here
|
|
|
|
# Metrics Configuration
|
|
# Bearer token for the /metrics endpoint (Prometheus scrape + app token gate).
|
|
# Generate with: openssl rand -hex 32
|
|
# Leave empty to keep /metrics returning 403 (fail-closed).
|
|
METRICS_TOKEN=
|
|
|
|
# Paperless Configuration
|
|
PAPERLESS_TOKEN=your-paperless-token
|
|
BASE_URL=192.168.1.5:8000
|
|
|
|
# llama-server Configuration (OpenAI-compatible API)
|
|
# If set, uses llama-server as the primary LLM backend with OpenAI as fallback
|
|
LLAMA_SERVER_URL=http://192.168.1.213:8080/v1
|
|
LLAMA_MODEL_NAME=llama-3.1-8b-instruct
|
|
# Abandon a turn when an in-flight model call produces no output (prefill included)
|
|
# for this long. Thinking tokens count as output, so long reasoning is fine.
|
|
TTFT_TIMEOUT_SECONDS=30
|
|
# Context estimates include system instructions and tool definitions.
|
|
# Set the window to the smallest backend context; leave room for generation.
|
|
CONTEXT_WINDOW_TOKENS=32768
|
|
PROMPT_BUDGET_TOKENS=16000
|
|
RESPONSE_RESERVE_TOKENS=4096
|
|
# static: bind every role-appropriate tool on each call (stable, cacheable prompt
|
|
# prefix). dynamic: keyword-route tool groups per call with a discovery tool.
|
|
TOOL_ROUTING_MODE=static
|
|
# Optional durable summary sidecar; defaults to CHECKPOINT_DB_PATH + .summaries.db
|
|
# Store on the same persistent shared volume as the checkpoints.
|
|
# CONVERSATION_SUMMARY_DB_PATH=/app/checkpoints/conversation-summaries.db
|
|
|
|
# Embedding Server Configuration
|
|
# If set, uses a custom OpenAI-compatible embedding server (e.g. llama-server)
|
|
# Falls back to OpenAI embeddings if not set
|
|
EMBEDDING_SERVER_URL=http://192.168.1.7:8086/v1
|
|
EMBEDDING_MODEL_NAME=all-minilm
|
|
|
|
# OpenAI Configuration
|
|
OPENAI_API_KEY=your-openai-api-key
|
|
|
|
# Tavily Configuration (for web search)
|
|
TAVILY_API_KEY=your-tavily-api-key
|
|
|
|
# Immich Configuration
|
|
IMMICH_URL=http://192.168.1.5:2283
|
|
IMMICH_API_KEY=your-immich-api-key
|
|
SEARCH_QUERY=simba cat
|
|
DOWNLOAD_DIR=./simba_photos
|
|
|
|
# OIDC Configuration (Authelia)
|
|
OIDC_ISSUER=https://auth.example.com
|
|
OIDC_CLIENT_ID=simbarag
|
|
OIDC_CLIENT_SECRET=your-client-secret-here
|
|
OIDC_REDIRECT_URI=http://localhost:8080/
|
|
OIDC_USE_DISCOVERY=true
|
|
|
|
# Optional: Manual OIDC endpoints (if discovery is disabled)
|
|
# OIDC_AUTHORIZATION_ENDPOINT=https://auth.example.com/api/oidc/authorization
|
|
# OIDC_TOKEN_ENDPOINT=https://auth.example.com/api/oidc/token
|
|
# OIDC_USERINFO_ENDPOINT=https://auth.example.com/api/oidc/userinfo
|
|
# OIDC_JWKS_URI=https://auth.example.com/api/oidc/jwks
|
|
|
|
# YNAB Configuration
|
|
# Get your Personal Access Token from https://app.ynab.com/settings/developer
|
|
YNAB_ACCESS_TOKEN=your-ynab-personal-access-token
|
|
# Optional: Specify a budget ID, or leave empty to use the default/first budget
|
|
YNAB_BUDGET_ID=
|
|
# Seconds between background YNAB delta syncs (agent tools also sync on demand)
|
|
YNAB_SYNC_INTERVAL=900
|
|
|
|
# Mealie Configuration
|
|
# Base URL for your Mealie instance (e.g., http://192.168.1.5:9000 or https://mealie.example.com)
|
|
MEALIE_BASE_URL=http://192.168.1.5:9000
|
|
# Get your API token from Mealie's user settings page
|
|
MEALIE_API_TOKEN=your-mealie-api-token
|
|
# Group slug used in recipe page links (/g/<slug>/r/<recipe>); defaults to "home"
|
|
MEALIE_GROUP_SLUG=home
|
|
|
|
# Email Integration
|
|
# Email Encryption Key (32-byte URL-safe base64)
|
|
# Generate with: python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
|
|
FERNET_KEY=your-fernet-key-here
|
|
|
|
# Twilio Configuration (WhatsApp)
|
|
TWILIO_ACCOUNT_SID=your-twilio-account-sid
|
|
TWILIO_AUTH_TOKEN=your-twilio-auth-token
|
|
TWILIO_WHATSAPP_NUMBER=whatsapp:+14155238886
|
|
# Comma-separated list of WhatsApp numbers allowed to use the service (e.g., whatsapp:+1234567890)
|
|
# Use * to allow any number
|
|
ALLOWED_WHATSAPP_NUMBERS=
|
|
# Set to false to disable Twilio signature validation in development
|
|
TWILIO_SIGNATURE_VALIDATION=true
|
|
# If behind a reverse proxy, set this to your public webhook URL so signature validation works
|
|
# TWILIO_WEBHOOK_URL=https://your-domain.com/api/whatsapp/webhook
|
|
# Rate limiting: max messages per window (default: 10 messages per 60 seconds)
|
|
# WHATSAPP_RATE_LIMIT_MAX=10
|
|
# WHATSAPP_RATE_LIMIT_WINDOW=60
|
|
|
|
# Mailgun Configuration (Email channel)
|
|
MAILGUN_API_KEY=
|
|
MAILGUN_DOMAIN=
|
|
MAILGUN_WEBHOOK_SIGNING_KEY=
|
|
EMAIL_HMAC_SECRET=
|
|
# Rate limiting: max emails per window (default: 5 per 300 seconds)
|
|
# EMAIL_RATE_LIMIT_MAX=5
|
|
# EMAIL_RATE_LIMIT_WINDOW=300
|
|
# Set to false to disable Mailgun signature validation in development
|
|
MAILGUN_SIGNATURE_VALIDATION=true
|
|
|
|
# SendBlue Configuration (iMessage)
|
|
SENDBLUE_API_KEY=your-sendblue-api-key
|
|
SENDBLUE_API_SECRET=your-sendblue-api-secret
|
|
SENDBLUE_FROM_NUMBER=+1XXXXXXXXXX
|
|
SENDBLUE_WEBHOOK_SECRET=your-sendblue-webhook-secret
|
|
# Set to false to disable SendBlue signature validation in development
|
|
SENDBLUE_SIGNATURE_VALIDATION=true
|
|
# Comma-separated list of iMessage numbers allowed to use the service (E.164 format)
|
|
# Use * to allow any number
|
|
ALLOWED_IMESSAGE_NUMBERS=
|
|
# Rate limiting: max messages per window (default: 10 messages per 60 seconds)
|
|
# IMESSAGE_RATE_LIMIT_MAX=10
|
|
# IMESSAGE_RATE_LIMIT_WINDOW=60
|
|
|
|
# Google Calendar + Gmail Configuration (Python SDK)
|
|
# Run scripts/google_auth.py to generate token.json from your OAuth2 credentials:
|
|
# python scripts/google_auth.py --credentials credentials.json --token token.json
|
|
# Then mount token.json into the container (see docker-compose.yml).
|
|
# If GOOGLE_TOKEN_FILE points to a valid token, both Calendar and Gmail are enabled.
|
|
GOOGLE_TOKEN_FILE=/app/config/google-token.json
|
|
|
|
# Cronicle Integration
|
|
# Shared secret for Cronicle to authenticate cron job trigger requests.
|
|
# Generate with: openssl rand -hex 32
|
|
CRON_SECRET=
|
|
# Cronicle server URL and API key (from Cronicle Admin → API Keys)
|
|
# Used to auto-register scheduled jobs on startup.
|
|
CRONICLE_URL=http://cronicle:3012
|
|
CRONICLE_API_KEY=
|
|
|
|
# SimbaKit / PetKit Configuration
|
|
# PetKit account credentials (used by SimbaKit to poll device data)
|
|
PETKIT_USERNAME=your-petkit-email
|
|
PETKIT_PASSWORD=your-petkit-password
|
|
PETKIT_REGION=US
|
|
PETKIT_TIMEZONE=America/New_York
|
|
# Internal URL for SimbaKit service (Docker network)
|
|
SIMBAKIT_URL=http://simbakit:8585
|
|
|
|
# Homebox inventory (admin-only agent tools via homebox-mcp, needs Homebox >= 0.26)
|
|
# API key from Homebox Profile -> API Keys (starts with hb_). Leave empty to disable.
|
|
HOMEBOX_URL=https://homebox.example.com
|
|
HOMEBOX_TOKEN=
|
|
|
|
# BookStack wiki (admin-only agent tools via bookstack-mcp: read, create, update; no deletes)
|
|
# API token from BookStack Profile -> API Tokens (user needs the "Access System API" permission).
|
|
# Leave empty to disable.
|
|
BOOKSTACK_BASE_URL=https://bookstack.example.com
|
|
BOOKSTACK_TOKEN_ID=
|
|
BOOKSTACK_TOKEN_SECRET=
|
|
|
|
# Obsidian Configuration (headless sync)
|
|
# Obsidian account credentials (used for `ob login` on container startup)
|
|
OBSIDIAN_EMAIL=your-obsidian-email
|
|
OBSIDIAN_PASSWORD=your-obsidian-password
|
|
# Vault ID to sync (found in Obsidian sync settings)
|
|
OBSIDIAN_VAULT_ID=your-vault-id
|
|
# End-to-end encryption password (if vault uses E2E encryption)
|
|
OBSIDIAN_E2E_PASSWORD=
|
|
# Device name shown in Obsidian sync activity
|
|
OBSIDIAN_DEVICE_NAME=simbarag
|
|
# Set to true to run continuous sync in the background
|
|
OBSIDIAN_CONTINUOUS_SYNC=false
|
|
# Local path to Obsidian vault (where files are synced)
|
|
OBSIDIAN_VAULT_PATH=/app/data/obsidian
|
|
# Vault name for obsidian://open links in the artifact panel (optional; no link if unset)
|
|
OBSIDIAN_VAULT_NAME=
|
|
|
|
# LangGraph checkpoint store (SQLite). Must be on a persistent volume.
|
|
# Both blue and green containers share this volume via docker-compose.
|
|
CHECKPOINT_DB_PATH=/app/checkpoints/checkpoints.db
|
|
|
|
# Beli restaurant recommendations
|
|
# Beli account credentials for each profile are stored encrypted in the database.
|
|
# No additional env vars needed — auth is done via the Beli API at login time.
|