# --------------------------------------------------------------------------- # Required # --------------------------------------------------------------------------- OPENAI_API_KEY=sk-*** # --------------------------------------------------------------------------- # Owner identity # Comma-separated list of identities that should be considered as the owner. # --------------------------------------------------------------------------- # OWNER_ID=owner@example.com # --------------------------------------------------------------------------- # Owner display name # The display name of the owner, used in the agent's prompt. # --------------------------------------------------------------------------- # OWNER_NAME= # --------------------------------------------------------------------------- # Owner timezone (IANA name, e.g. America/Los_Angeles, Europe/London). # Anchors "today", due/overdue math, and relative-date resolution to your local # day instead of UTC. Unset or invalid falls back to UTC (warned once at startup). # Override per request in natural language ("rundown in GMT"). # --------------------------------------------------------------------------- # OWNER_TIMEZONE=America/Los_Angeles # --------------------------------------------------------------------------- # JWT verification for AgentOS. # AgentOS enables RBAC whenever RUNTIME_ENV=prd. # Without this key, AgentOS refuses to serve traffic. # Generate the keypair at os.agno.com (your OS → Settings → Token Based Authorization) # and paste the full PEM block, no surrounding quotes. # --------------------------------------------------------------------------- # JWT_VERIFICATION_KEY= # --------------------------------------------------------------------------- # AgentOS URL used by the scheduler and MCP server. Set this to the public URL of your AgentOS instance. # --------------------------------------------------------------------------- # AGENTOS_URL=http://127.0.0.1:8000 # --------------------------------------------------------------------------- # Web context provider # The `web` context provider uses Parallel's MCP server. # Leave PARALLEL_API_KEY unset to use the keyless /mcp endpoint (ok for dev). # Set it to switch to the authenticated SDK (higher rate ceiling) — recommended # for production / public deploys. Get a key at: # https://platform.parallel.ai/settings?tab=api-keys # --------------------------------------------------------------------------- # PARALLEL_API_KEY= # --------------------------------------------------------------------------- # Slack context provider # Set both SLACK_BOT_TOKEN and SLACK_SIGNING_SECRET to enable the Slack interface. # SLACK_BOT_TOKEN is the Bot User OAuth Token (xoxb-***) and also activates the # `slack` context provider (query_slack) on its own. # SLACK_SIGNING_SECRET is the Signing Secret (Basic Information → App Credentials). # --------------------------------------------------------------------------- # SLACK_BOT_TOKEN= # SLACK_SIGNING_SECRET= # Optional: a Slack *user* token (xoxp-***, scope search:read) unlocks # workspace-wide message search for query_slack; without it reads fall back to # channel/thread history. # SLACK_USER_TOKEN= # --------------------------------------------------------------------------- # Knowledge base # Filesystem-backed by default (knowledge/, gitignored). # Pointing it at a Git-backed specs repo by setting the following variables: # KNOWLEDGE_REPO_URL git remote, e.g. https://github.com/you/your-specs.git # KNOWLEDGE_GITHUB_TOKEN GitHub token with push access to that repo # KNOWLEDGE_BRANCH branch to commit to (default: main) # KNOWLEDGE_LOCAL_PATH local checkout path (default: managed temp dir) # --------------------------------------------------------------------------- # KNOWLEDGE_REPO_URL= # KNOWLEDGE_GITHUB_TOKEN= # KNOWLEDGE_BRANCH=main # KNOWLEDGE_LOCAL_PATH= # --------------------------------------------------------------------------- # Gmail + Google Calendar # Lets @context read your inbox and calendar, draft emails (it never sends — # you send from Gmail), and propose calendar changes (they go to your approvals # queue). A few minutes to set up — full guide in docs/GOOGLE.md. # # 1. Create a Google OAuth client (with the Gmail + Calendar APIs on). # 2. Mint the consent tokens once: python scripts/google_mint_tokens.py # --------------------------------------------------------------------------- # GOOGLE_CLIENT_ID= # GOOGLE_CLIENT_SECRET= # GOOGLE_PROJECT_ID= # # Token caches (written by the mint script). Default to gmail_token.json / # calendar_token.json at the repo root; override the path, or ship the minted # tokens as base64 so they survive a deploy (the entrypoint restores them). # GMAIL_TOKEN_FILE= # CALENDAR_TOKEN_FILE= # GMAIL_TOKEN_JSON_B64= # CALENDAR_TOKEN_JSON_B64= # --------------------------------------------------------------------------- # Scheduled digests (Slack) # When SLACK_BOT_TOKEN is set, @context auto-arms two schedules that DM the # owner their read-only briefs: a daily rundown and a weekly week-plan. # Override the timing with UTC cron expressions (defaults shown). # DAILY_DIGEST_CRON default "0 13 * * *" (13:00 UTC daily) # WEEKLY_DIGEST_CRON default "0 22 * * 0" (Sunday 22:00 UTC) # --------------------------------------------------------------------------- # DAILY_DIGEST_CRON=0 13 * * * # WEEKLY_DIGEST_CRON=0 22 * * 0 # --------------------------------------------------------------------------- # Scheduler-to-OS auth token. Auto-generated per process when unset — fine # for one replica. Running multiple replicas behind one URL (railway.json # ships one by default)? Set it so every replica accepts every replica's scheduler # calls, e.g.: openssl rand -base64 32 # --------------------------------------------------------------------------- # INTERNAL_SERVICE_TOKEN= # --------------------------------------------------------------------------- # MCP OAuth (production MCP clients). See docs/MCP.md. # # MCP_CONNECT_SECRET arms the flow: the deployment becomes its own OAuth 2.1 # authorization server on /mcp (dynamic client registration + PKCE), and MCP # clients — claude.ai, ChatGPT, Claude Code, Codex, Cursor — connect by URL # and get approved once on a consent page gated by this secret. On a # single-owner deploy the secret is an owner credential, so treat it like one. # At least 16 chars; generate with: openssl rand -base64 32 # Unset ⇒ no OAuth (local dev stays keyless-as-owner; prd /mcp stays JWT-only). # Requires AGENTOS_URL to be the exact public HTTPS origin. # # AGENTOS_MCP_SIGNING_KEY (optional) pins the HS256 signing root for the # issued access/refresh tokens. At least 32 chars (openssl rand -base64 32); # unset, a key is generated and persisted in Postgres. Pin it in production — # and know that rotating it revokes EVERY issued token (the kill switch); # rotating MCP_CONNECT_SECRET only gates future consents. # --------------------------------------------------------------------------- # MCP_CONNECT_SECRET= # AGENTOS_MCP_SIGNING_KEY= # --------------------------------------------------------------------------- # Performance tuning (advanced — defaults are fine for most deploys) # THREAD_POOL_WORKERS asyncio executor size for sync provider I/O (default: 64) # USE_CONTEXT_TIMEOUT hard ceiling (s) for one use_context MCP run (default: 55) # PROVIDER_TIMEOUT per-source ceiling (s) for a best-effort query_ (default: 20) # BACKBONE_TIMEOUT per-source ceiling (s) for a backbone read, the CRM (default: 35) # --------------------------------------------------------------------------- # THREAD_POOL_WORKERS=64 # USE_CONTEXT_TIMEOUT=55 # PROVIDER_TIMEOUT=20 # BACKBONE_TIMEOUT=35 # --------------------------------------------------------------------------- # Database — defaults match docker compose # --------------------------------------------------------------------------- # DB_HOST=localhost # DB_PORT=5432 # DB_USER=context # DB_PASS=context # DB_DATABASE=context # DB_DRIVER=postgresql+psycopg # --------------------------------------------------------------------------- # Dev ergonomics — compose sets all three for local development. # RUNTIME_ENV "dev" enables hot-reload and disables JWT (default: prd) # AGNO_DEBUG verbose Agno debug logs (default: False) # WAIT_FOR_DB entrypoint blocks until Postgres is reachable (default: False) # --------------------------------------------------------------------------- # RUNTIME_ENV=prd # AGNO_DEBUG=False # WAIT_FOR_DB=False