# ┌─────────────────────────────────────────────────────────────────────────────┐ # │ OmniRoute — .env Contract │ # │ This file documents EVERY environment variable read by the runtime. │ # │ Copy to .env and adjust values. Lines starting with # are commented out │ # │ (optional / off-by-default). Uncomment only what you need. │ # │ Reference: docs/ENVIRONMENT.md for full details and usage scenarios. │ # └─────────────────────────────────────────────────────────────────────────────┘ # ═══════════════════════════════════════════════════════════════════════════════ # 1. REQUIRED SECRETS — Must be set before first run! # ═══════════════════════════════════════════════════════════════════════════════ # These secrets are critical for security. Generate strong, unique values. # JWT signing key for dashboard session tokens. # Used by: src/lib/auth — signs/verifies all authenticated session cookies. # Generate: openssl rand -base64 48 JWT_SECRET= # Encryption key for API keys stored in the database. # Used by: src/lib/db/apiKeys.ts — encrypts API key values at rest in SQLite. # Generate: openssl rand -hex 32 API_KEY_SECRET= # Initial admin login password — CHANGE THIS before first use! # Used by: bootstrap only — sets the initial dashboard password on first boot. # After first login you can change it from Dashboard → Settings → Security. # Default: CHANGEME (insecure, for local dev only) INITIAL_PASSWORD=CHANGEME # ═══════════════════════════════════════════════════════════════════════════════ # 2. STORAGE & DATABASE # ═══════════════════════════════════════════════════════════════════════════════ # OmniRoute uses SQLite for all persistence. These variables control where # data lives, encryption, and cleanup policies. # Base directory for all persistent data (SQLite DB, logs, backups). # Used by: src/lib/db/core.ts — resolves the SQLite database file path. # Default: ~/.omniroute/ | Override for Docker or custom installations. # Hint: When running in Docker, consider mounting a host directory here for data persistence across container restarts # also if you want to share the same database as "npm run dev" use "./data" # DATA_DIR=/var/lib/omniroute # Encryption key for SQLite database encryption at rest. # Used by: src/lib/db/encryption.ts — encrypts the entire SQLite database. # Generate: openssl rand -hex 32 | Leave empty to disable DB encryption. STORAGE_ENCRYPTION_KEY= # Version tag for the encryption key — allows future key rotation. # Used by: scripts/bootstrap-env.mjs, electron/main.js — persists key version. # Default: v1 | Increment when rotating STORAGE_ENCRYPTION_KEY. STORAGE_ENCRYPTION_KEY_VERSION=v1 # Automatic SQLite backup on startup. # Used by: src/lib/db/backup.ts — creates a timestamped backup before migrations. # Default: false (backups enabled) | Set true to skip backup on every restart. DISABLE_SQLITE_AUTO_BACKUP=false # ── Redis (Rate Limiting) ── # Redis connection URL for the rate limiter backend. # Used by: src/shared/utils/rateLimiter.ts # Default: redis://localhost:6379 (or redis://redis:6379 in Docker) REDIS_URL=redis://localhost:6379 # ═══════════════════════════════════════════════════════════════════════════════ # 3. NETWORK & PORTS # ═══════════════════════════════════════════════════════════════════════════════ # OmniRoute can run on a single port (default) or split Dashboard/API ports. # Canonical port for both Dashboard UI and API (single-port mode). # Used by: src/lib/runtime/ports.ts — base port for the Next.js server. # Default: 20128 PORT=20128 # Split-port mode: serve Dashboard and API on separate ports for network isolation. # Used by: src/lib/runtime/ports.ts — overrides PORT for each service. # API_PORT=20129 # API_HOST=0.0.0.0 # DASHBOARD_PORT=20128 # Port for the real-time WebSocket live monitoring server. # Used by: src/server/ws/liveServer.ts, src/app/api/v1/ws/route.ts # Default: 20129 # LIVE_WS_PORT=20129 # Bind address for the live WebSocket server. # Default: 127.0.0.1 (loopback only). Set to 0.0.0.0 to expose on LAN — # remember to also configure LIVE_WS_ALLOWED_ORIGINS when doing so. # LIVE_WS_HOST=127.0.0.1 # Comma-separated extra origins allowed to open a live WebSocket. The # loopback dashboard origins are already permitted by default; use this # var when fronting the server with a domain (e.g. https://omni.local). # LIVE_WS_ALLOWED_ORIGINS=https://omni.local,https://dashboard.example.com # Disable the standalone live WebSocket helper used by scripts/start-ws-server.mjs. # Used by: scripts/start-ws-server.mjs (CI/embedded harness toggle). # OMNIROUTE_DISABLE_LIVE_WS=0 # Enable the real-time dashboard WebSocket server. # Used by: src/server/ws/liveServer.ts, scripts/start-ws-server.mjs # Default: ON. Set to 0 or false to disable startup of the live WS server. # Combine with LIVE_WS_HOST / LIVE_WS_ALLOWED_ORIGINS above when exposing # beyond loopback. # OMNIROUTE_ENABLE_LIVE_WS=1 # Per-(token,IP) relay rate limit, requests/minute. In-memory, per instance. # 0 or negative disables the IP-dimension gate (per-token DB limit still applies). # Default: 30 # Used by: src/app/api/v1/relay/chat/completions/route.ts # RELAY_IP_PER_MINUTE=30 # Use Turbopack in local dev. Next 16.2.4 can fail to compile next/font/google # through the custom dev runner without this on Windows. OMNIROUTE_USE_TURBOPACK=1 # Skip the SQLite integrity health check on startup (faster boot on large DBs). # Used by: src/lib/db/core.ts, src/lib/db/healthCheck.ts. Set to 1 to skip. # OMNIROUTE_SKIP_DB_HEALTHCHECK=1 # Interval (ms) for the background credential health check scheduler. # Default: 300000 (5 minutes). Minimum: 10000 (10 seconds). # Used by: open-sse/config/constants.ts, src/lib/credentialHealth/scheduler.ts # CREDENTIAL_HEALTH_CHECK_INTERVAL=300000 # TTL (ms) for cached credential health status. # Default: 300000 (5 minutes). # Used by: open-sse/config/constants.ts, src/lib/credentialHealth/cache.ts # CREDENTIAL_HEALTH_CACHE_TTL=300000 # Set to 1 or true to disable background periodic testing of provider connections. # Default: false # Used by: src/lib/credentialHealth/scheduler.ts # OMNIROUTE_DISABLE_CREDENTIAL_HEALTH_CHECK=false # Set to "true" to emit `[ProxyFetch]` debug logs from the Vercel relay path # in open-sse/utils/proxyFetch.ts. Off by default to avoid leaking routing # hints in production logs. # OMNIROUTE_PROXY_FETCH_DEBUG=true # Docker production port mappings (docker-compose.prod.yml only). # These set the HOST-side published ports. Container ports use PORT/API_PORT. # PROD_DASHBOARD_PORT=20130 # PROD_API_PORT=20131 # Runtime override used by Electron and wrapped environments. # OMNIROUTE_PORT takes precedence over PORT when running inside wrappers. # Used by: src/lib/runtime/ports.ts — preserves canonical port in Electron. # OMNIROUTE_PORT=20128 # Hostname/bind address for the Next.js server. # Used by: scripts/dev/run-next.mjs (HOST), Playwright runner (HOSTNAME). # Default: 0.0.0.0 (HOST) / 127.0.0.1 (HOSTNAME inside tests). #HOST=0.0.0.0 #HOSTNAME=127.0.0.1 # Environment mode — affects Next.js behavior, logging verbosity, and caching. # Values: production | development | Default: production NODE_ENV=production # ═══════════════════════════════════════════════════════════════════════════════ # 4. SECURITY & AUTHENTICATION # ═══════════════════════════════════════════════════════════════════════════════ # Salt for generating unique machine IDs (fingerprint diversification). # Used by: src/lib/auth — combined with hardware identifiers for machine-id hash. # Default: endpoint-proxy-salt | Change per-deployment for isolation. MACHINE_ID_SALT=endpoint-proxy-salt # Salt for deriving CLI machine-ID auth tokens (HMAC-SHA256). # Used by: src/lib/machineToken.ts — rotates the local CLI auth token without # touching code. Set to a new value to invalidate existing CLI tokens. # Default: omniroute-cli-auth-v1 # OMNIROUTE_CLI_SALT=omniroute-cli-auth-v1 # Set true when running behind HTTPS (reverse proxy with TLS termination). # Used by: src/lib/auth — sets the Secure flag on session cookies. # Default: false | MUST be true in any non-localhost deployment. AUTH_COOKIE_SECURE=false # Require an API key for all /v1/* proxy endpoints. # Used by: API middleware — rejects unauthenticated requests to the proxy API. # Default: false | Set true for multi-user/public deployments. REQUIRE_API_KEY=false # Allow revealing full API key values in the Dashboard UI. # Used by: Dashboard providers page — controls show/hide of key values. # Default: false | Security risk if enabled on shared instances. ALLOW_API_KEY_REVEAL=false # Shared secret for the internal Codex Responses WebSocket bridge. # Used by: src/app/api/internal/codex-responses-ws/route.ts — authenticates # bridge requests between the Electron/browser WS relay and OmniRoute. # ⚠️ REQUIRED for production — if unset, all WS bridge requests are rejected. # Generate: openssl rand -base64 32 # OMNIROUTE_WS_BRIDGE_SECRET= # Per-process secret that proves the trusted peer-IP stamp came from OmniRoute's # own HTTP server (scripts/dev/peer-stamp.mjs). The custom server stamps the real # TCP peer IP as `|`; the authz middleware trusts the locality only # when the token matches. Used by: src/server/authz/policies/management.ts. # Auto-generated per boot — leave UNSET in normal use. Only set it to pin a fixed # value across processes (e.g. a multi-process setup that must share the stamp). # OMNIROUTE_PEER_STAMP_TOKEN= # Comma-separated API key IDs that skip request logging (GDPR/compliance). # Used by: src/lib/compliance/index.ts — suppresses logs for specific keys. # NO_LOG_API_KEY_IDS=key_abc123,key_def456 # Fallback per-day request budget applied to API keys whose `rate_limits` # column is null. Default (unset/empty/malformed) preserves the legacy # 1000/day, 5000/week, 20000/month windows so existing deployments do not # silently lose rate limiting on upgrade. # Set explicitly to "0" to opt out entirely (unlimited fallback). Any # positive integer N enables N/day, 5N/week, 20N/month. # Used by: src/shared/utils/apiKeyPolicy.ts — checkRateLimit() fallback. # DEFAULT_RATE_LIMIT_PER_DAY=1000 # Maximum request body size in bytes (rejects larger payloads). # Used by: src/shared/middleware/bodySizeGuard.ts — prevents oversized uploads. # Default: 10485760 (10 MB) # MAX_BODY_SIZE_BYTES=10485760 # CORS configuration — controls which origins can call the API. # Used by: Next.js middleware — sets Access-Control-Allow-Origin header. # Default: * (all origins) | Restrict for production security. # CORS_ORIGIN=https://your-domain.com # Allow provider URLs pointing to private/local networks (localhost, 192.168.x.x, etc.). # REQUIRED for self-hosted providers: LM Studio, Ollama, vLLM, Llamafile, Triton, etc. # Used by: src/shared/network/outboundUrlGuard.ts — disables SSRF guard for provider calls. # Default: false (blocked) | Set true to enable local providers. # OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS=true # Legacy alias toggling the SSRF guard. Used by: src/shared/network/outboundUrlGuard.ts # When unset, OmniRoute uses the per-feature defaults. Set to "false"/"0" to disable. # OUTBOUND_SSRF_GUARD_ENABLED=true # ═══════════════════════════════════════════════════════════════════════════════ # 5. INPUT SANITIZATION & PII PROTECTION (FASE-01) # ═══════════════════════════════════════════════════════════════════════════════ # Multi-layer defense: request-side injection guard + response-side PII sanitizer. # ── Request-Side: Prompt Injection Guard ── # Scans incoming messages for prompt injection patterns before routing. # Used by: src/middleware/promptInjectionGuard.ts # INPUT_SANITIZER_ENABLED=true # INPUT_SANITIZER_MODE=warn # warn = log only | block = reject request | redact = strip patterns # Legacy alias for INPUT_SANITIZER_MODE (same effect). # INJECTION_GUARD_MODE=warn # PII detection in incoming requests (emails, phone numbers, SSNs, etc.). # Used by: src/middleware/promptInjectionGuard.ts — extends injection guard. # PII_REDACTION_ENABLED=false # ── Response-Side: PII Sanitizer ── # Scans LLM responses for leaked PII before returning to the client. # Used by: src/lib/piiSanitizer.ts # PII_RESPONSE_SANITIZATION=false # PII_RESPONSE_SANITIZATION_MODE=redact # redact = mask PII | warn = log only | block = drop response # ═══════════════════════════════════════════════════════════════════════════════ # 6. TOOL & ROUTING POLICIES # ═══════════════════════════════════════════════════════════════════════════════ # Tool policy mode — controls which tools LLMs can invoke via function calling. # Used by: src/lib/toolPolicy.ts — enforces allowlist/denylist on tool_choice. # Values: allowlist | denylist | disabled | Default: disabled # TOOL_POLICY_MODE=disabled # Payload manipulation rules JSON file. # Used by: open-sse/services/payloadRules.ts — injects/removes upstream payload fields per model/protocol. # Default: ./config/payloadRules.json # OMNIROUTE_PAYLOAD_RULES_PATH=./config/payloadRules.json # Reload interval for payloadRules.json mtime checks in milliseconds. # Used by: open-sse/services/payloadRules.ts — keeps file-based rules hot-reloadable without restart. # Default: 5000 | Minimum: 1000 # OMNIROUTE_PAYLOAD_RULES_RELOAD_MS=5000 # ═══════════════════════════════════════════════════════════════════════════════ # 7. URLS & CLOUD SYNC # ═══════════════════════════════════════════════════════════════════════════════ # URLs used for internal sync jobs, OAuth callbacks, and cloud relay. # Internal base URL — used by server-side sync jobs to call /api/sync/cloud. # Used by: src/lib/cloudSync.ts, src/lib/initCloudSync.ts # Default: http://localhost:20128 BASE_URL=http://localhost:20128 # Cloud relay URL — premium feature for remote config sync. # Used by: src/lib/cloudSync.ts — pushes/pulls settings from OmniRoute Cloud. CLOUD_URL= # Timeout for cloud sync HTTP requests in milliseconds. # Used by: src/lib/cloudSync.ts — fetchWithTimeout wrapper. # Default: 12000 (12 seconds) # CLOUD_SYNC_TIMEOUT_MS=12000 # Public-facing base URL — CRITICAL for reverse proxy / OAuth callback setups. # Used by: OAuth redirect_uri computation, Dashboard UI links, cloud/model sync. # Set to your public URL when behind nginx/Caddy (e.g., https://omniroute.example.com). # # Dashboard display behavior: when this variable is unset, the dashboard # auto-detects the base URL shown in curl examples and CLI tool snippets # from window.location.origin (the host the user is browsing). Setting it # explicitly is only required when running behind a reverse proxy with a # different public hostname, or when OAuth callbacks must point to a # canonical URL. # # Default: http://localhost:20128 NEXT_PUBLIC_BASE_URL=http://localhost:20128 # Browser-facing OmniRoute origin for generated assets in API responses. # Used by: chatgpt-web image generation cache URLs (/v1/chatgpt-web/image/). # Set this when OpenWebUI or another relay reaches OmniRoute by an internal URL # but the user's browser must fetch images from a LAN, tunnel, or public origin. # Do not include /v1; if included accidentally it will be normalized away. # OMNIROUTE_PUBLIC_BASE_URL=http://192.168.0.15:20128 # Max wait time for an async chatgpt-web image to land via the celsius # WebSocket, in milliseconds. Default 180000 (3 minutes). Increase during # upstream queue-deep windows ("Lots of people are creating images right now"). # OMNIROUTE_CGPT_WEB_IMAGE_TIMEOUT_MS=180000 # Total in-memory byte budget for the chatgpt-web image cache (used to serve # /v1/chatgpt-web/image/), in megabytes. Default 256. Lower this if you # run OmniRoute on a memory-constrained host; raise it if image generation # is heavy and clients are racing the 30-minute TTL. # OMNIROUTE_CGPT_WEB_IMAGE_CACHE_MAX_MB=256 # Public cloud URL — client-side mirror of CLOUD_URL. NEXT_PUBLIC_CLOUD_URL= # Legacy alias — fallback for NEXT_PUBLIC_BASE_URL in sync schedulers. # NEXT_PUBLIC_APP_URL=http://localhost:20128 # Public callback URL for asynchronous image/audio jobs (kie.ai, etc.). # Used by: open-sse/utils/kieTask.ts — overrides callbackUrlFromBaseUrl(). # Honor order: KIE_CALLBACK_URL → OMNIROUTE_KIE_CALLBACK_URL → OMNIROUTE_PUBLIC_URL. #KIE_CALLBACK_URL= #OMNIROUTE_KIE_CALLBACK_URL= #OMNIROUTE_PUBLIC_URL= # Upstream quota endpoints used by the Usage page. Override only for # debugging or when routing through a corporate mirror. Used by: # open-sse/services/usage.ts. #OMNIROUTE_CROF_USAGE_URL=https://crof.ai/usage_api/ #OMNIROUTE_GEMINI_CLI_USAGE_URL=https://cloudcode-pa.googleapis.com/v1internal:loadCodeAssist #OMNIROUTE_CODEWHISPERER_BASE_URL=https://codewhisperer.us-east-1.amazonaws.com #OMNIROUTE_OPENCODE_QUOTA_URL=https://opencode.ai/zen/go/v1/quota #OMNIROUTE_OPENCODE_GO_QUOTA_URL=https://api.z.ai/api/monitor/usage/quota/limit # ═══════════════════════════════════════════════════════════════════════════════ # 8. OUTBOUND PROXY (Upstream Provider Calls) # ═══════════════════════════════════════════════════════════════════════════════ # Route upstream LLM API calls through an HTTP/SOCKS5 proxy. # Useful for corporate egress, geo-routing, or IP masking. # Enable SOCKS5 proxy support in both server and client components. # Used by: open-sse/executors — wraps fetch() calls through the proxy agent. ENABLE_SOCKS5_PROXY=true NEXT_PUBLIC_ENABLE_SOCKS5_PROXY=true # Standard proxy variables (lowercase variants also supported). # HTTP_PROXY=http://127.0.0.1:7890 # HTTPS_PROXY=http://127.0.0.1:7890 # ALL_PROXY=socks5://127.0.0.1:7890 # NO_PROXY=localhost,127.0.0.1 # TLS fingerprint spoofing (opt-in) — mimics Chrome 124 TLS handshake via wreq-js. # Reduces risk of JA3/JA4 fingerprint-based blocking by providers (e.g., Google). # Used by: open-sse/executors — replaces Node.js default TLS fingerprint. # ENABLE_TLS_FINGERPRINT=true # Allow the Claude Turnstile Playwright browser context to ignore HTTPS certificate errors. # Only enable for local debugging or trusted MITM/corporate proxy environments. # Used by: open-sse/services/claudeTurnstileSolver.ts # OMNIROUTE_TURNSTILE_IGNORE_TLS_ERRORS=false # ═══════════════════════════════════════════════════════════════════════════════ # 9. CLI TOOL INTEGRATION # ═══════════════════════════════════════════════════════════════════════════════ # Control how OmniRoute discovers and launches CLI sidecars (Claude, Codex, etc.). # Used by: src/shared/services/cliRuntime.ts # CLI discovery mode: auto = search PATH | manual = use explicit paths below. # CLI_MODE=auto # Additional PATH entries for finding CLI binaries (colon-separated). # CLI_EXTRA_PATHS=/host-cli/bin:/usr/local/bin # Home directory override for reading CLI config files (~/.claude, etc.). # CLI_CONFIG_HOME=/root # Allow OmniRoute to write CLI config files (token refresh, etc.). # CLI_ALLOW_CONFIG_WRITES=true # Override binary paths for individual CLI tools. # CLI_CLAUDE_BIN=claude # CLI_CODEX_BIN=codex # CLI_DROID_BIN=droid # CLI_OPENCLAW_BIN=openclaw # CLI_CURSOR_BIN=agent # CLI_CLINE_BIN=cline # CLI_CONTINUE_BIN=cn # CLI_QODER_BIN=qoder # CLI_QWEN_BIN=qwen # ═══════════════════════════════════════════════════════════════════════════════ # 10. INTERNAL AGENT & MCP INTEGRATIONS # ═══════════════════════════════════════════════════════════════════════════════ # Used by MCP server, A2A skills, and CLI sidecars to call the running instance. # Explicit base URL for MCP/A2A tools to reach OmniRoute (overrides localhost auto-detect). # For browser-visible generated image URLs, prefer OMNIROUTE_PUBLIC_BASE_URL above. # Used by: open-sse/mcp-server/server.ts, src/lib/a2a/ # OMNIROUTE_BASE_URL=http://localhost:20128 # API key for internal tool calls (MCP tools, A2A skills). # OMNIROUTE_API_KEY= # API key ID for MCP audit logging. # Used by: open-sse/mcp-server/audit.ts — tags audit events with a key identity. # OMNIROUTE_API_KEY_ID= # Legacy alias for OMNIROUTE_API_KEY. # ROUTER_API_KEY= # Enforce scope-based access control on MCP tool calls. # Used by: open-sse/mcp-server/server.ts — rejects calls outside allowed scopes. # OMNIROUTE_MCP_ENFORCE_SCOPES=false # Comma-separated scopes granted to this MCP connection. # Full list: admin, combos, health, models, routing, budget, metrics, pricing, memory, skills # OMNIROUTE_MCP_SCOPES=admin,combos,health # Compress MCP tool descriptions before serializing the manifest. # Used by: open-sse/mcp-server/descriptionCompressor.ts — reduces token spend # for clients that read the full tool catalog. # Accepted disabling values: 0, false, off. Default: enabled. # OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS=1 # Algorithm/profile used when description compression is enabled. # Used by: open-sse/mcp-server/descriptionCompressor.ts # Set to 0/false/off to skip compression entirely. Default: rtk # OMNIROUTE_MCP_DESCRIPTION_COMPRESSION=rtk # Model catalog sync interval in hours. # Used by: src/shared/services/modelSyncScheduler.ts — periodic model refresh. # Default: 24 # MODEL_SYNC_INTERVAL_HOURS=24 # Provider limits sync interval in minutes (rate limit windows, quotas). # Used by: src/server-init.ts — polls provider health endpoints. # Default: 70 PROVIDER_LIMITS_SYNC_INTERVAL_MINUTES=70 # Disable all background services (sync, pricing, model refresh). # Used by: src/instrumentation-node.ts, src/lib/initCloudSync.ts # Useful for: CI builds, test environments, or resource-constrained containers. # OMNIROUTE_DISABLE_BACKGROUND_SERVICES=false # Force runtime background tasks (healthchecks/sync) even under automated test # detection. Used by: src/lib/config/runtimeSettings.ts — overrides the test # heuristic in instrumentation-node.ts. Default: unset (tests skip background). #OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS=1 # Background job interval for budget reset checks (ms). Default: 600000 (10m). # Used by: src/lib/jobs/budgetResetJob.ts. Floor: 10000. #OMNIROUTE_BUDGET_RESET_JOB_INTERVAL_MS=600000 # Reasoning cache cleanup cadence (ms). Default: 1800000 (30m). Floor: 60000. # Used by: src/lib/jobs/reasoningCacheCleanupJob.ts. #OMNIROUTE_REASONING_CACHE_CLEANUP_INTERVAL_MS=1800000 # Spend write batcher cadence (ms) and buffer size before forced flush. # Used by: src/lib/spend/batchWriter.ts. Defaults: 60000 ms / 1000 entries. #OMNIROUTE_SPEND_FLUSH_INTERVAL_MS=60000 #OMNIROUTE_SPEND_MAX_BUFFER_SIZE=1000 # Batch request processor retry, backoff, and concurrency settings. # Used by: open-sse/services/batchProcessor.ts. Defaults shown. #BATCH_RETRY_DURATION_MS=86400000 #BATCH_BACKOFF_BASE_MS=5000 #BATCH_BACKOFF_MAX_MS=3600000 #BATCH_MAX_CONCURRENT=1 # Config hot-reload polling interval (ms). Default: 5000. # Used by: src/lib/config/hotReload.ts. Lower than 1000ms is rejected. #OMNIROUTE_CONFIG_HOT_RELOAD_MS=5000 # Override the migrations directory used by src/lib/db/migrationRunner.ts. # Default: /src/lib/db/migrations. #OMNIROUTE_MIGRATIONS_DIR= # Trust user-managed RTK project filter rules without strict signature checks. # Used by: open-sse/services/compression/engines/rtk/filterLoader.ts. Default: 0. #OMNIROUTE_RTK_TRUST_PROJECT_FILTERS=0 # Skip the postinstall native-runtime warm-up (useful in CI / headless installs). Default: 0. # Used by: scripts/postinstall.mjs. #OMNIROUTE_SKIP_POSTINSTALL=0 # Skip the DB healthcheck entirely on startup (useful for short-lived tasks / tests). # Used by: src/lib/db/core.ts, src/lib/db/healthCheck.ts. Set to 1 to disable. Default: 0. #OMNIROUTE_SKIP_DB_HEALTHCHECK=0 # Force a DB healthcheck regardless of cadence. Default: 0. # Used by: src/lib/db/core.ts::shouldRunDbHealthCheck(). #OMNIROUTE_FORCE_DB_HEALTHCHECK=0 # DB healthcheck cadence override (ms). Default: 21600000 (6h). # Used by: src/lib/db/core.ts::getDbHealthCheckIntervalMs(). #OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS=21600000 # Skip the Redis-backed auth cache used by API key lookups (forces DB reads). # Used by: src/lib/db/apiKeys.ts. Set to 1 to disable. Default: enabled. #OMNIROUTE_DISABLE_REDIS_AUTH_CACHE=0 # Flag set by bootstrap script after initial setup is complete. # Used by: src/app/(dashboard)/dashboard/page.tsx — shows setup wizard vs. dashboard. # OMNIROUTE_BOOTSTRAPPED=false # Allow request body to override the Antigravity project field. # Used by: open-sse/executors/antigravity.ts — escape hatch for multi-project setups. # OMNIROUTE_ALLOW_BODY_PROJECT_OVERRIDE=0 # Adjust how Antigravity advertises remaining credits. Used by: # open-sse/services/antigravityCredits.ts — accepts forced override strings. # Default: empty (use upstream-reported credits). #ANTIGRAVITY_CREDITS= # Override the path to the Antigravity CLI (agy) token file read by the # "auto-detect local login" import. Used by: # src/app/api/providers/agy-auth/apply-local/route.ts — for non-standard installs. # Default: ~/.gemini/antigravity-cli/antigravity-oauth-token #AGY_TOKEN_FILE= # ═══════════════════════════════════════════════════════════════════════════════ # 11. OAUTH PROVIDER CREDENTIALS # ═══════════════════════════════════════════════════════════════════════════════ # Built-in default credentials for localhost development. # For remote/VPS deployments, register your own at each provider's developer console. # The bootstrap-env script auto-populates these in .env if missing. # Can also be overridden via data/provider-credentials.json where supported. # ── Claude Code (Anthropic) ── CLAUDE_OAUTH_CLIENT_ID=9d1c250a-e61b-44d9-88ed-5944d1962f5e # Custom redirect URI override for Claude OAuth callback. # CLAUDE_CODE_REDIRECT_URI=https://platform.claude.com/oauth/code/callback # ── Codex / OpenAI ── CODEX_OAUTH_CLIENT_ID=app_EMoamEEZ73f0CkXaXp7hrann # ── Gemini / Gemini CLI / Antigravity / Windsurf (all Google-based) ── # These providers ship public OAuth client_id/secret values (or Firebase Web # keys) embedded in their public CLIs/binaries. Defaults are baked into the # code via open-sse/utils/publicCreds.ts — leave the env vars unset to use # them. Only set these if you registered your own OAuth app and want to use # your own credentials instead. See docs/security/PUBLIC_CREDS.md for context. # # GEMINI_OAUTH_CLIENT_ID= # GEMINI_OAUTH_CLIENT_SECRET= # GEMINI_CLI_OAUTH_CLIENT_ID= # GEMINI_CLI_OAUTH_CLIENT_SECRET= # ANTIGRAVITY_OAUTH_CLIENT_ID= # ANTIGRAVITY_OAUTH_CLIENT_SECRET= # WINDSURF_FIREBASE_API_KEY= # ── Qwen (Alibaba) ── QWEN_OAUTH_CLIENT_ID=f0304373b74a44d2b584a3fb70ca9e56 # ── Kimi Coding (Moonshot) ── KIMI_CODING_OAUTH_CLIENT_ID=17e5f671-d194-4dfb-9706-5516cb48c098 # ── GitHub Copilot ── GITHUB_OAUTH_CLIENT_ID=Iv1.b507a08c87ecfe98 # ── GitLab Duo ── # Register an OAuth app at: https://gitlab.com/-/profile/applications # Set redirect URI to: http://localhost:20128/callback (or your NEXT_PUBLIC_BASE_URL + /callback) # Required scopes: api, read_user, openid, profile, email # GITLAB_DUO_OAUTH_CLIENT_ID=*** # GITLAB_DUO_OAUTH_CLIENT_SECRET=*** # optional — PKCE flow does not require a secret # # Self-managed GitLab Duo instance overrides. # Used by: src/lib/oauth/gitlab.ts and src/lib/oauth/constants/oauth.ts — # fall back to these when the _DUO_ variants above are unset. #GITLAB_DUO_BASE_URL=https://gitlab.com #GITLAB_BASE_URL=https://gitlab.com #GITLAB_OAUTH_CLIENT_ID= #GITLAB_OAUTH_CLIENT_SECRET= # ── Qoder ── # Public OAuth client secret embedded in the Qoder CLI binary. Required only # when QODER_OAUTH_AUTHORIZE_URL / TOKEN_URL / USERINFO_URL / CLIENT_ID are # also set (see QODER_CONFIG.enabled in src/lib/oauth/constants/oauth.ts). # Extract the value from the public Qoder CLI binary if you intend to use it. # QODER_OAUTH_CLIENT_SECRET= # ── Qoder Browser OAuth (experimental) ── # OmniRoute only enables the browser OAuth flow when ALL 5 variables below are set: # - QODER_OAUTH_AUTHORIZE_URL # - QODER_OAUTH_TOKEN_URL # - QODER_OAUTH_USERINFO_URL # - QODER_OAUTH_CLIENT_ID # - QODER_OAUTH_CLIENT_SECRET # # Redirect URI to register in the Qoder OAuth app: # - Localhost dev with PORT=20128: http://localhost:20128/callback # - LAN access (example): http://192.168.0.15:20128/callback # - Public domain (recommended): https://omniroute.example.com/callback # # Behind reverse proxy / public domain, also set NEXT_PUBLIC_BASE_URL to the same public origin. # If these values are not available, prefer QODER_PERSONAL_ACCESS_TOKEN below. # QODER_OAUTH_AUTHORIZE_URL= # QODER_OAUTH_TOKEN_URL= # QODER_OAUTH_USERINFO_URL= # QODER_OAUTH_CLIENT_ID= # QODER_OAUTH_CLIENT_SECRET= # ── Qoder Personal Access Token (direct API key fallback) ── # Used by: open-sse/executors/qoder.ts — bypasses OAuth when set. # QODER_PERSONAL_ACCESS_TOKEN= # QODER_CLI_WORKSPACE= # OMNIROUTE_QODER_WORKSPACE= # ── Blackbox Web validated-token override (issue #2252) ── # Used by: open-sse/executors/blackbox-web.ts. Blackbox `/api/chat` rejects # requests whose `validated` field doesn't match the frontend `tk` token, # returning HTTP 403 even with a valid session cookie + active subscription. # Set this to the `tk` value exported from app.blackbox.ai's Next.js bundle # to bypass the random-UUID fallback. Leave empty to keep the legacy behavior. # BLACKBOX_WEB_VALIDATED_TOKEN= # ── Vision Bridge OpenAI-compatible endpoint override (issue #2232) ── # Used by: src/lib/guardrails/visionBridgeHelpers.ts. By default the # vision-bridge guardrail sends non-Anthropic image-description calls to # `https://api.openai.com/v1`, which fails with 401 if your operator doesn't # have an OpenAI key or wants to use a different vision model # (e.g., `google/gemini-2.0-flash` via the Gemini OpenAI-compat endpoint, or # any model registered in OmniRoute via the self-loop endpoint). # # Set these two env vars to point the bridge at any OpenAI-compatible URL: # - VISION_BRIDGE_BASE_URL=http://localhost:20128/v1 (OmniRoute self-loop) # - VISION_BRIDGE_BASE_URL=https://generativelanguage.googleapis.com/v1beta/openai # - VISION_BRIDGE_BASE_URL=https://openrouter.ai/api/v1 # Anthropic models (anthropic/*) keep their dedicated path and are unaffected. # VISION_BRIDGE_BASE_URL= # VISION_BRIDGE_API_KEY= # ───────────────────────────────────────────────────────────────────────────── # ⚠️ GOOGLE OAUTH (Antigravity, Gemini CLI) & OTHER PROVIDERS — REMOTE SERVERS # ───────────────────────────────────────────────────────────────────────────── # The default Client IDs above ONLY work when OmniRoute runs on localhost. # For remote/VPS hosting (including Docker containers on remote servers): # 1. By default, the browser will attempt OAuth redirects back to localhost, which will fail. # 2. Set NEXT_PUBLIC_BASE_URL=https://your-domain.com to fix the redirect URI. # 3. You MUST create your own OAuth App in each provider's developer console (Google Cloud, etc.) # and set the Authorized redirect URI to your domain (e.g., https://your-domain.com/callback). # 4. Replace the _OAUTH_CLIENT_ID and _SECRET values above with your own credentials. # ───────────────────────────────────────────────────────────────────────────── # ── OAuth sidecar/CLI bridge (internal) ── # Used by: src/lib/oauth/config/index.ts — internal CLI↔OmniRoute auth bridge. # OMNIROUTE_SERVER=http://localhost:20128 # OMNIROUTE_TOKEN= # OMNIROUTE_USER_ID=cli # CLI_TOKEN= # legacy alias for OMNIROUTE_TOKEN # CLI_USER_ID= # legacy alias for OMNIROUTE_USER_ID # SERVER_URL= # legacy alias for OMNIROUTE_SERVER # ═══════════════════════════════════════════════════════════════════════════════ # 12. PROVIDER USER-AGENT OVERRIDES # ═══════════════════════════════════════════════════════════════════════════════ # Customize the User-Agent header sent to each upstream provider. # Format: {PROVIDER_ID}_USER_AGENT=custom-value # Used by: open-sse/executors/base.ts — buildHeaders() dynamic lookup. # Update these when providers release new CLI versions to avoid blocks. CLAUDE_USER_AGENT="claude-cli/2.1.146 (external, cli)" CODEX_USER_AGENT="codex-cli/0.132.0 (Windows 10.0.26200; x64)" GITHUB_USER_AGENT="GitHubCopilotChat/0.45.1" ANTIGRAVITY_USER_AGENT="antigravity/2.0.1 linux/arm64 google-api-nodejs-client/10.3.0" KIRO_USER_AGENT="AWS-SDK-JS/3.0.0 kiro-ide/1.0.0" # Optional override for the Kiro social device-code OAuth clientId. Kiro's # device endpoint accepts any non-empty string and behaves like a User-Agent # rather than a secret. Only override if AWS ever starts enforcing this field. # Used by: src/lib/oauth/constants/oauth.ts (KIRO_CONFIG.socialClientId). # KIRO_OAUTH_CLIENT_ID=kiro-cli QODER_USER_AGENT="Qoder-Cli" QWEN_USER_AGENT="QwenCode/0.15.11 (linux; x64)" CURSOR_USER_AGENT="Cursor/3.4" GEMINI_CLI_USER_AGENT="google-api-nodejs-client/10.3.0" # Override Codex client version sent in headers independently of the # CODEX_USER_AGENT string. Used by: open-sse/config/codexClient.ts. # CODEX_CLIENT_VERSION=0.132.0 # ═══════════════════════════════════════════════════════════════════════════════ # 13. CLI FINGERPRINT COMPATIBILITY (Anti-Detection) # ═══════════════════════════════════════════════════════════════════════════════ # When enabled, OmniRoute reorders HTTP headers and JSON body fields to match # the exact signature of official CLI tools, reducing account flagging risk. # Your proxy IP is preserved — you get both stealth AND IP masking. # Used by: open-sse/config/cliFingerprints.ts, open-sse/executors/base.ts # Enable per-provider: # CLI_COMPAT_CODEX=1 # CLI_COMPAT_CLAUDE=1 # CLI_COMPAT_GITHUB=1 # CLI_COMPAT_ANTIGRAVITY=1 # CLI_COMPAT_CURSOR=1 # CLI_COMPAT_KIMI_CODING=1 # CLI_COMPAT_KILOCODE=1 # CLI_COMPAT_CLINE=1 # CLI_COMPAT_QWEN=1 # Or enable for all providers at once: # CLI_COMPAT_ALL=1 # ── Kimi Coding CLI identity overrides ── # Used by: src/lib/oauth/providers/kimi-coding.ts — sent in OAuth + API headers. # Leave unset to use the captured defaults baked into the OmniRoute build. #KIMI_CLI_VERSION=1.36.0 #KIMI_CODING_DEVICE_ID= # ═══════════════════════════════════════════════════════════════════════════════ # 14. API KEY PROVIDERS # ═══════════════════════════════════════════════════════════════════════════════ # API keys for direct-authentication providers. # Preferred setup: Dashboard → Providers → Add API Key. # Setting here is an alternative for Docker/headless deployments. # Static API keys for direct-authentication providers wired through the runtime. # OmniRoute loads provider credentials from the encrypted database or # data/provider-credentials.json. The variables below are documented escape # hatches that are referenced in code today. # DEEPSEEK_API_KEY= # NVIDIA_API_KEY= # Windsurf / Devin CLI direct API key. # Used by: open-sse/executors/devin-cli.ts — bypasses OAuth when set. # WINDSURF_API_KEY= # Embedding Providers (optional — used by /v1/embeddings) # OpenAI/Mistral/Together/Fireworks/NVIDIA configured via Dashboard → Providers # also work for embeddings. # ═══════════════════════════════════════════════════════════════════════════════ # 15. TIMEOUT SETTINGS # ═══════════════════════════════════════════════════════════════════════════════ # All timeout values are in milliseconds. # Used by: src/shared/utils/runtimeTimeouts.ts — centralized timeout resolution. # # Hierarchy: REQUEST_TIMEOUT_MS acts as a global override. # If set, it becomes the default for FETCH_TIMEOUT_MS and STREAM_IDLE_TIMEOUT_MS. # The fine-grained variables below override their respective defaults only when set. # ── Global shortcut ── # REQUEST_TIMEOUT_MS=600000 # Overrides both fetch and stream idle defaults # ── Upstream fetch (provider calls) ── # FETCH_TIMEOUT_MS=600000 # Total request timeout (default: 600000 = 10 min) # # Also drives anthropic-compatible-cc-* X-Stainless-Timeout. # FETCH_HEADERS_TIMEOUT_MS=600000 # Time to receive response headers # FETCH_BODY_TIMEOUT_MS=600000 # Time to receive full response body # FETCH_CONNECT_TIMEOUT_MS=30000 # TCP connection establishment (default: 30s) # FETCH_KEEPALIVE_TIMEOUT_MS=4000 # Keep-alive socket idle timeout (default: 4s) # Default timeout (ms) for src/shared/utils/fetchTimeout.ts. Acts as the # fallback when FETCH_TIMEOUT_MS is unset. Default: 120000 (2 min). # OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS=120000 # ── ChatGPT TLS sidecar (Firefox-fingerprinted client) ── # Used by: open-sse/services/chatgptTlsClient.ts — wire-level timeout for # the bogdanfinn/tls-client koffi binding and the JS-side grace window # layered on top of it when the native library is wedged. # OMNIROUTE_CHATGPT_TLS_TIMEOUT_MS=60000 # OMNIROUTE_CHATGPT_TLS_GRACE_MS=10000 # ── Claude TLS sidecar (Chromium-fingerprinted client) ── # Used by: open-sse/services/claudeTlsClient.ts — wire-level timeout for # the bogdanfinn/tls-client koffi binding and the JS-side grace window # layered on top of it when the native library is wedged. # OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS=60000 # OMNIROUTE_CLAUDE_TLS_GRACE_MS=10000 # ── Perplexity TLS sidecar (Firefox-fingerprinted client) ── # Used by: open-sse/services/perplexityTlsClient.ts — wire-level timeout for # the bogdanfinn/tls-client koffi binding and the JS-side grace window # layered on top of it when the native library is wedged. # OMNIROUTE_PPLX_TLS_TIMEOUT_MS=30000 # OMNIROUTE_PPLX_TLS_GRACE_MS=10000 # ── Circuit breaker thresholds and reset windows ── # Used by: open-sse/config/constants.ts → src/lib/resilience/settings.ts. # Defaults match historical PROVIDER_PROFILES values (post-scaling for # 500+ connections). Lower the threshold to react faster, raise it to # tolerate more transient failures before short-circuiting. # OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD=8 # OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS=60000 # OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD=12 # OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS=30000 # OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD=2 # OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS=15000 # ── Stream idle detection ── # STREAM_IDLE_TIMEOUT_MS=600000 # Max silence between SSE chunks (default: 600000) # # Extended-thinking models rarely pause >90s. # ── TLS client (wreq-js fingerprint proxy) ── # TLS_CLIENT_TIMEOUT_MS=600000 # Inherits from FETCH_TIMEOUT_MS by default # ── API Bridge (/v1 proxy server) ── # API_BRIDGE_PROXY_TIMEOUT_MS=600000 # Proxy hop timeout (default: 10min) # API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS=600000 # Overall server request timeout (default: 10min) # API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS=60000 # Time to send response headers # API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS=5000 # Keep-alive idle timeout # API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS=0 # Raw socket timeout (0 = disabled) # ── Graceful shutdown ── # Time to wait for in-flight requests before force-exiting on SIGTERM/SIGINT. # Used by: src/lib/gracefulShutdown.ts # Default: 30000 (30 seconds) # SHUTDOWN_TIMEOUT_MS=30000 # ═══════════════════════════════════════════════════════════════════════════════ # 16. LOGGING # ═══════════════════════════════════════════════════════════════════════════════ # Used by: src/lib/logEnv.ts, src/lib/logRotation.ts, src/shared/utils/logger.ts # Application log level — controls console and file log verbosity. # Values: debug | info | warn | error | Default: info # APP_LOG_LEVEL=info # Log output format. # Values: text | json | Default: text # APP_LOG_FORMAT=text # Write logs to file in addition to stdout. # Default: true | Set false to disable file logging. APP_LOG_TO_FILE=true # Path to the application log file. # Default: logs/application/app.log (relative to project root / DATA_DIR) # APP_LOG_FILE_PATH=logs/application/app.log # Maximum single log file size before rotation. # Accepts: plain bytes or suffixed (50M, 1G, 512K). Default: 50M # APP_LOG_MAX_FILE_SIZE=50M # Days to keep rotated application log files before auto-deletion. # Default: 7 # APP_LOG_RETENTION_DAYS=7 # Maximum number of rotated log file backups to keep. # Default: 20 # APP_LOG_MAX_FILES=20 # How often OmniRoute checks whether the active log file has exceeded # APP_LOG_MAX_FILE_SIZE and triggers a rotation. Set lower for very verbose # services to prevent log files from growing large between checks. # Accepts milliseconds. Default: 60000 (1 minute) # APP_LOG_ROTATION_CHECK_INTERVAL_MS=60000 # Days to keep request/call log entries in the database before auto-cleanup. # Default: 7 # CALL_LOG_RETENTION_DAYS=7 # Maximum call log entries stored in-memory buffer. # Default: 10000 # CALL_LOG_MAX_ENTRIES=10000 # Maximum rows in the call_logs SQLite table before oldest entries are pruned. # Default: 100000 # CALL_LOGS_TABLE_MAX_ROWS=100000 # Whether call log pipeline capture stores stream chunks when enabled in settings. # Only applies when call_log_pipeline_enabled=true. # Default: true # CALL_LOG_PIPELINE_CAPTURE_STREAM_CHUNKS=true # Maximum call log artifact size for pipeline captures, in KB. # Only applies when call_log_pipeline_enabled=true. # Default: 512 # CALL_LOG_PIPELINE_MAX_SIZE_KB=512 # Call log payload truncation limits — controls how much of request/response # bodies is retained in the database. # Used by: open-sse/handlers/chatCore.ts — cloneBoundedChatLogPayload() # CHAT_LOG_TEXT_LIMIT=65536 # Max string length before truncation (default: 64 KB) # CHAT_LOG_ARRAY_TAIL_ITEMS=24 # Number of array items retained from tail (default: 24) # CHAT_LOG_MAX_DEPTH=6 # Max nesting depth before truncation (default: 6) # CHAT_LOG_MAX_OBJECT_KEYS=80 # Max object keys retained (default: 80, 0 = no limit) # Maximum rows in the proxy_logs SQLite table. # Default: 100000 # PROXY_LOGS_TABLE_MAX_ROWS=100000 # ═══════════════════════════════════════════════════════════════════════════════ # 17. MEMORY OPTIMIZATION (Low-RAM / Docker) # ═══════════════════════════════════════════════════════════════════════════════ # Node.js V8 heap limit in MB. # Used by: Docker entrypoint — sets --max-old-space-size. # Default: 256 (Docker) | system default (npm) # OMNIROUTE_MEMORY_MB=256 # ── CLI helpers (bin/cli/) ── # Override UI language for CLI output. Accepts BCP-47 locale (e.g. en, pt-BR). # Falls back to LC_ALL / LC_MESSAGES / LANG / en if unset. # OMNIROUTE_LANG=en # Show server logs inline when running in supervised mode (omniroute serve). # Set to "1" to forward server stdout/stderr to the terminal. # Equivalent to the --log flag on `omniroute serve`. # OMNIROUTE_SHOW_LOG=1 # Bearer token injected as x-omniroute-cli-token header for machine-auth (task 8.12). # Auto-generated on first run if machine-id is available; set manually to override. # OMNIROUTE_CLI_TOKEN= # Per-attempt HTTP timeout for CLI → server calls (milliseconds). Default: 30000. # OMNIROUTE_HTTP_TIMEOUT_MS=30000 # Set to 1 to print retry/backoff details to stderr during CLI commands. # OMNIROUTE_VERBOSE=0 # Custom directory for CLI plugin discovery (omniroute-cmd-* packages). # Default: ~/.omniroute/plugins/ Override in dev/CI to point at a local plugin tree. # OMNIROUTE_PLUGIN_PATH= # ── Prompt cache (system prompt deduplication) ── # Used by: open-sse/services — caches identical system prompts across requests. # PROMPT_CACHE_MAX_SIZE=50 # Max cached entries (default: 50) # PROMPT_CACHE_MAX_BYTES=2097152 # Max total cache size in bytes (default: 2 MB) # PROMPT_CACHE_TTL_MS=300000 # Cache entry TTL (default: 5 minutes) # ── Semantic cache (deterministic response dedup, temperature=0) ── # Used by: open-sse/services — caches identical temperature=0 responses. # SEMANTIC_CACHE_MAX_SIZE=100 # Max cached entries (default: 100) # SEMANTIC_CACHE_MAX_BYTES=4194304 # Max total cache size in bytes (default: 4 MB) # SEMANTIC_CACHE_TTL_MS=1800000 # Cache entry TTL (default: 30 minutes) # ── In-memory log buffers ── # Maximum recent stream events kept in memory for the Dashboard live view. # STREAM_HISTORY_MAX=50 # ── Context length default ── # Global fallback max context length for models without explicit config. # Used by: open-sse/services/contextManager.ts # CONTEXT_LENGTH_DEFAULT=128000 # ── Usage token buffer ── # Extra token headroom reserved when tracking usage quotas (prevents over-limit). # Used by: open-sse/utils/usageTracking.ts # USAGE_TOKEN_BUFFER=100 # ═══════════════════════════════════════════════════════════════════════════════ # 18. PRICING SYNC # ═══════════════════════════════════════════════════════════════════════════════ # Automatic model pricing synchronization from external sources. # Used by: src/lib/pricingSync.ts # Enable periodic pricing data sync. Default: false (opt-in only). # PRICING_SYNC_ENABLED=false # Sync interval in seconds. Default: 86400 (24 hours). # PRICING_SYNC_INTERVAL=86400 # Comma-separated data sources. Default: litellm # PRICING_SYNC_SOURCES=litellm # ═══════════════════════════════════════════════════════════════════════════════ # 19. MODEL SYNC (Dev) # ═══════════════════════════════════════════════════════════════════════════════ # Development-time model catalog sync interval in seconds. # Used by: src/lib/modelsDevSync.ts # Default: 86400 (24 hours) # MODELS_DEV_SYNC_INTERVAL=86400 # ═══════════════════════════════════════════════════════════════════════════════ # 20. PROVIDER-SPECIFIC SETTINGS # ═══════════════════════════════════════════════════════════════════════════════ # ── OpenRouter ── # OpenRouter model catalog cache TTL in ms. # Used by: src/lib/catalog/openrouterCatalog.ts # Default: 86400000 (24 hours) # OPENROUTER_CATALOG_TTL_MS=86400000 # ── NanoBanana (Image Generation) ── # Polling config for async image generation jobs. # Used by: open-sse/handlers/imageGeneration.ts # NANOBANANA_POLL_TIMEOUT_MS=120000 # Max wait for job completion (default: 120s) # NANOBANANA_POLL_INTERVAL_MS=2500 # Poll frequency (default: 2.5s) # ── AWS Bedrock (Kiro / Audio) ── # Region used to construct AWS Bedrock endpoints. Used by: # src/lib/providers/validation.ts and open-sse/handlers/audioSpeech.ts. # AWS_REGION takes precedence over AWS_DEFAULT_REGION when both are set. # AWS_REGION=us-east-1 # AWS_DEFAULT_REGION=us-east-1 # ── Cloudflare Workers AI ── # Account ID override for Cloudflare Workers AI executor. # Used by: open-sse/executors/cloudflare-ai.ts # CLOUDFLARE_ACCOUNT_ID= # ── Cloudflare Tunnel (cloudflared) ── # Custom path to cloudflared binary for tunnel management. # Used by: src/lib/cloudflaredTunnel.ts # CLOUDFLARED_BIN=/usr/local/bin/cloudflared # ── Search cache ── # TTL for search API response caching (Perplexity, Brave, etc.). # Used by: open-sse/services/searchCache.ts # Default: 300000 (5 minutes) # SEARCH_CACHE_TTL_MS=300000 # ── OpenAI-compatible multi-connection ── # Allow multiple simultaneous connections per OpenAI-compatible provider node. # Used by: src/app/api/providers/route.ts # ALLOW_MULTI_CONNECTIONS_PER_COMPAT_NODE=false # ── CC-compatible provider (experimental) ── # Enable the Claude Code compatible provider endpoint. # This is only for third-party relays that accept Claude Code clients exclusively. # OmniRoute rewrites requests to pass those relays' Claude Code client validation. # If you only want to use Claude Code CLI, or you are not sure what these relays are, # keep this disabled and add a regular Anthropic-compatible provider instead. # Used by: src/shared/utils/featureFlags.ts # ENABLE_CC_COMPATIBLE_PROVIDER=false # ── 9router embedded service ── # Override the host/port where the embedded 9router instance listens. # Rarely needed — defaults match the bootstrap config (127.0.0.1:20130). # Used by: open-sse/executors/ninerouter.ts # NINEROUTER_HOST=127.0.0.1 # NINEROUTER_PORT=20130 # ── Embedded service WebSocket proxy ── # Standalone WebSocket proxy that tunnels WS connections to embedded services. # Binds to loopback by default. Only change EMBED_WS_PROXY_HOST if you know # what you are doing — exposing this to non-loopback bypasses local-only policy. # Used by: src/lib/services/embedWsProxy.ts # EMBED_WS_PROXY_HOST=127.0.0.1 # EMBED_WS_PROXY_PORT=20131 # ── CLIProxyAPI bridge (legacy) ── # Connection settings for external CLIProxyAPI instances. # Used by: open-sse/executors/cliproxyapi.ts # CLIPROXYAPI_HOST=127.0.0.1 # CLIPROXYAPI_PORT=5544 # CLIPROXYAPI_CONFIG_DIR=~/.cli-proxy-api # ── Local hostnames (Docker networking) ── # Comma-separated additional hostnames treated as "local" for provider routing. # Used by: open-sse/config/providerRegistry.ts — allows Docker service names. # LOCAL_HOSTNAMES=omlx,mlx-audio # ═══════════════════════════════════════════════════════════════════════════════ # 21. PROXY HEALTH # ═══════════════════════════════════════════════════════════════════════════════ # Fine-tune proxy health checking behavior. # Used by: src/lib/proxyHealth.ts # Timeout for fast-fail health checks (ms). Default: 2000 # PROXY_FAST_FAIL_TIMEOUT_MS=2000 # Health check result cache TTL (ms). Default: 30000 (30s) # PROXY_HEALTH_CACHE_TTL_MS=30000 # Rate limit maximum wait time before failing a request (ms). Default: 120000 (2 min) # Used by: open-sse/services/rateLimitManager.ts # RATE_LIMIT_MAX_WAIT_MS=120000 # Force the auto-enable rate limit safety net on/off regardless of the persisted # Dashboard setting. Used by: open-sse/services/rateLimitManager.ts. # Accepted values: true|1|on (force on), false|0|off (force off), unset (use Dashboard). # RATE_LIMIT_AUTO_ENABLE= # Stagger interval (ms) between provider token healthchecks at startup. # Used by: src/lib/tokenHealthCheck.ts. Default: 3000. # HEALTHCHECK_STAGGER_MS=3000 # ═══════════════════════════════════════════════════════════════════════════════ # 22. DEBUGGING # ═══════════════════════════════════════════════════════════════════════════════ # These variables enable verbose debugging output. NEVER enable in production. # Cursor executor verbose debug (decoded SSE chunks, etc.). # CURSOR_STREAM_DEBUG is kept as a backward-compatible alias. # Used by: open-sse/executors/cursor.ts # CURSOR_DEBUG=1 # CURSOR_STREAM_DEBUG=1 # When CURSOR_DEBUG=1, also append raw decoded chunks to this file path. # CURSOR_DUMP_FILE=/tmp/cursor-stream.log # Cursor stream idle timeout (ms). Default: 300000 (5 min). # Used by: open-sse/executors/cursor.ts. # CURSOR_STREAM_TIMEOUT_MS=300000 # Cursor state DB path override (for cursor version detection). # Used by: open-sse/utils/cursorVersionDetector.ts. Default: probed automatically. # CURSOR_STATE_DB_PATH= # Direct Cursor bearer token used by scripts/ad-hoc/cursor-tap.cjs (developer tooling). # CURSOR_TOKEN= # Log Responses API SSE-to-JSON translation details. # DEBUG_RESPONSES_SSE_TO_JSON=true # Log request shape (content-type + content-length) for large chat payloads. # Used by: src/app/api/v1/chat/completions/route.ts. Set to "0" to silence. # Default: enabled. # OMNIROUTE_LOG_REQUEST_SHAPE=1 # Write raw (untruncated) request/response JSON in call log artifacts. # When enabled, serializeArtifactForStorage skips size-based truncation. # Also enabled automatically when APP_LOG_LEVEL=debug. # WARNING: produces large files — use only for temporary debugging. # CHAT_DEBUG_FILE=true # Enable E2E test mode — relaxes auth and enables test harness hooks. # NEXT_PUBLIC_OMNIROUTE_E2E_MODE=true # ═══════════════════════════════════════════════════════════════════════════════ # 23. GITHUB INTEGRATION (Issue Reporting) # ═══════════════════════════════════════════════════════════════════════════════ # Allow users to report issues directly from the Dashboard to GitHub. # Used by: src/app/api/v1/issues/report/route.ts # GitHub repository in owner/repo format. # GITHUB_ISSUES_REPO=owner/repo # GitHub Personal Access Token with issues:write scope. # GITHUB_ISSUES_TOKEN=ghp_xxxx # Generic GitHub access token consumed by issue triage / agent helpers. # Used by: src/app/api/v1/issues/* and src/lib/cloudAgent/* — falls back to # GITHUB_ISSUES_TOKEN when unset. # GITHUB_TOKEN= # ═══════════════════════════════════════════════════════════════════════════════ # 24. PROVIDER QUOTAS, TUNNELS & SANDBOXED SKILLS # ═══════════════════════════════════════════════════════════════════════════════ # Provider quota endpoints, network tunnels (Tailscale, Ngrok, MITM debug # proxy), 1Proxy egress pool, skills sandbox runtime, and miscellaneous CLI # binaries referenced by the executor layer or the dashboard runtime. # ── Alibaba (Bailian) coding plan quota ── # Host/full URL override used by: open-sse/services/bailianQuotaFetcher.ts. # When unset the fetcher uses the production Alibaba endpoints. # ALIBABA_CODING_PLAN_HOST= # ALIBABA_CODING_PLAN_QUOTA_URL= # ── Context window tuning ── # Tokens reserved for completion output when computing prompt budgets. # Used by: open-sse/services/contextManager.ts. Default: 1024. # CONTEXT_RESERVE_TOKENS=1024 # ── Model alias rewriting (legacy compatibility) ── # Toggle the legacy model-alias compatibility layer used by older clients. # Used by: open-sse/services/model.ts. Default: enabled. # MODEL_ALIAS_COMPAT_ENABLED=true # ── Devin CLI binary path ── # Used by: open-sse/executors/devin-cli.ts. Default: looked up via PATH. # CLI_DEVIN_BIN=devin # ── Command Code (custom CLI) callback ── # Local port used for OAuth-style callbacks from the Command Code CLI helper. # Used by: src/app/api/providers/command-code/auth/shared.ts. # COMMAND_CODE_CALLBACK_PORT= # ── MITM debug proxy (development only) ── # Used by: src/mitm/server.cjs — captures upstream traffic for inspection. # MITM_LOCAL_PORT=443 # MITM_DISABLE_TLS_VERIFY=0 # ── 1Proxy egress pool ── # Used by: src/lib/oneproxySync.ts — fetches proxy nodes from the OmniRoute # CrofAI 1Proxy service. Disable, override URL, or tune the import quality. # ONEPROXY_ENABLED=true # ONEPROXY_API_URL=https://1proxy-api.aitradepulse.com # ONEPROXY_MAX_PROXIES=500 # ONEPROXY_MIN_QUALITY_THRESHOLD=50 # ── Free Proxy Pool (1proxy source) ── # Used by: src/lib/freeProxyProviders/oneproxy.ts # Set FREE_PROXY_1PROXY_ENABLED=false to disable this source. # FREE_PROXY_1PROXY_ENABLED=true # FREE_PROXY_1PROXY_API_URL=https://1proxy-api.aitradepulse.com/api/v1/proxies/advanced # FREE_PROXY_1PROXY_MAX=500 # FREE_PROXY_1PROXY_MIN_QUALITY=50 # ── Free Proxy Pool (Proxifly source) ── # Used by: src/lib/freeProxyProviders/proxifly.ts # Enabled by default; set to false to disable. # FREE_PROXY_PROXIFLY_ENABLED=true # FREE_PROXY_PROXIFLY_QUANTITY=100 # FREE_PROXY_PROXIFLY_ANONYMITY=elite # ── Free Proxy Pool (IPLocate source) ── # Used by: src/lib/freeProxyProviders/iplocate.ts # Opt-in only; must set FREE_PROXY_IPLOCATE_ENABLED=true to activate. # FREE_PROXY_IPLOCATE_ENABLED=false # FREE_PROXY_IPLOCATE_BASE_URL=https://raw.githubusercontent.com/iplocate/free-proxy-list/main/protocols # ── Vercel Relay ── # Used by: src/app/api/settings/proxy/vercel-deploy/route.ts # Hides the "Deploy Relay" button when set to false. # NEXT_PUBLIC_VERCEL_RELAY_ENABLED=true # VERCEL_API_BASE=https://api.vercel.com # Default project name pre-filled in the Vercel Relay deploy modal. # NEXT_PUBLIC_VERCEL_RELAY_DEFAULT_PROJECT=omniroute-relay # ── Tailscale tunnel binaries ── # Optional explicit paths to tailscale/tailscaled binaries used by the # dashboard's tunnel manager. Used by: src/lib/tailscaleTunnel.ts. # TAILSCALE_BIN=/usr/local/bin/tailscale # TAILSCALED_BIN=/usr/local/bin/tailscaled # ── Ngrok tunnel ── # Used by: src/lib/ngrokTunnel.ts — authenticates outbound tunnels. # NGROK_AUTHTOKEN= # ── Database backups ── # Used by: src/lib/db/backup.ts. # DB_BACKUP_MAX_FILES=20 # DB_BACKUP_RETENTION_DAYS=0 # ── TLS sidecar override ── # Used by: open-sse/services/chatgptTlsClient.ts tests. Production deployments # should leave this unset; the sidecar is auto-managed. # OMNIROUTE_TLS_PROXY_URL= # ── Skills sandbox (experimental) ── # Used by: src/lib/skills/builtins.ts. All values support comma lists where # noted in the source. # SKILLS_MAX_FILE_BYTES=1048576 # SKILLS_MAX_HTTP_RESPONSE_BYTES=256000 # SKILLS_MAX_SANDBOX_OUTPUT_CHARS=100000 # SKILLS_SANDBOX_TIMEOUT_MS=10000 # SKILLS_SANDBOX_NETWORK_ENABLED=0 # SKILLS_ALLOWED_SANDBOX_IMAGES= # ═══════════════════════════════════════════════════════════════════════════════ # 25. TEST & E2E # ═══════════════════════════════════════════════════════════════════════════════ # Used by scripts/dev/run-next-playwright.mjs, scripts/dev/smoke-electron-packaged.mjs, # scripts/dev/run-ecosystem-tests.mjs and scripts/build/uninstall.mjs. # Production deployments should leave every value below unset. # E2E bootstrap mode for the Playwright runner. Accepted: auth | fresh | reuse. # Default (when unset): auth. # OMNIROUTE_E2E_BOOTSTRAP_MODE=auth # Admin password injected into the Playwright test environment. # Falls back to INITIAL_PASSWORD when unset. # OMNIROUTE_E2E_PASSWORD= # Disable the local healthcheck poll during Playwright runs (default: true). # OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK=true # Disable the OAuth token healthcheck loop during tests (default: true). # OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK=true # Silence healthcheck noise in Playwright stdout (default: true). # OMNIROUTE_HIDE_HEALTHCHECK_LOGS=true # Skip the Next.js production build before Playwright starts (CI optimization). # OMNIROUTE_PLAYWRIGHT_SKIP_BUILD=0 # Skip the OmniRoute uninstall hook (used by CI to keep node_modules intact). # OMNIROUTE_SKIP_UNINSTALL_HOOK=0 # Ecosystem/protocol test orchestrators wait this long (ms) for the server to # become healthy. Default: 180000. # ECOSYSTEM_SERVER_WAIT_MS=180000 # Docs translation pipeline (used by scripts/i18n/run-translation.mjs). # OpenAI-compatible base URL, e.g. https://cloud.omniroute.online/v1 # OMNIROUTE_TRANSLATION_API_URL= # Bearer token for the translation backend (NEVER commit a real key here). # OMNIROUTE_TRANSLATION_API_KEY= # Model id, e.g. gpt-4o-mini or cx/gpt-5.4-mini. # OMNIROUTE_TRANSLATION_MODEL=gpt-4o-mini # Per-request timeout in milliseconds (default 60000). # OMNIROUTE_TRANSLATION_TIMEOUT_MS=60000 # Number of parallel translation requests (default 4). # OMNIROUTE_TRANSLATION_CONCURRENCY=4 # ─── Cloud Sync hardening (v3.8.6) ────────────────────────────────────────── # Shared secret used to verify the HMAC-SHA256 of the Cloud sync response body # (the Cloud endpoint must sign each response with the same secret and place # the hex digest in the X-Cloud-Sig header). When unset, v3.8.6 logs a warning # but accepts unsigned responses for back-compat. v3.9 will make this required. # OMNIROUTE_CLOUD_SYNC_SECRET= # # Set to "true" to allow the Cloud Sync endpoint to overwrite local OAuth # tokens (accessToken / refreshToken / providerSpecificData). Default OFF — # only non-credential metadata is synced. See docs/security/SOCKET_DEV_FINDINGS.md §5. # OMNIROUTE_CLOUD_SYNC_SECRETS=false # ─── Zed import legacy compat (v3.8.6) ────────────────────────────────────── # Set to "true" to fall back to the v3.8.5 one-step "import everything from # the keychain" behaviour. Default OFF — the new 2-step confirmation flow # requires `confirmedAccounts` in the request body. See SOCKET_DEV_FINDINGS.md §2. # OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP=false # ─── Build profile (build-time only) ──────────────────────────────────────── # Set to "minimal" before `npm run build` to physically remove four optional # privileged modules (MITM cert install, Zed keychain import, Cloud Sync, # 9router installer) from the standalone bundle. The resulting artifact is # intended to be published as `omniroute-secure`. See SECURITY.md. # OMNIROUTE_BUILD_PROFILE=full # Electron smoke harness (used by scripts/dev/smoke-electron-packaged.mjs). # ELECTRON_SMOKE_URL=http://127.0.0.1:20128/login # ELECTRON_SMOKE_TIMEOUT_MS=45000 # ELECTRON_SMOKE_SETTLE_MS=2000 # ELECTRON_SMOKE_APP_EXECUTABLE= # ELECTRON_SMOKE_DATA_DIR= # ELECTRON_SMOKE_KEEP_DATA=0 # ELECTRON_SMOKE_STREAM_LOGS=0 # Playground Studio # Default model used by the improve-prompt route (optional; falls back to model in request body). PLAYGROUND_IMPROVE_PROMPT_DEFAULT_MODEL= # Maximum number of parallel compare columns in the Compare tab. PLAYGROUND_COMPARE_MAX_COLUMNS=4 # Memory engine (plan 21) # MEMORY_EMBEDDING_CACHE_TTL_MS=300000 # default 5 min # MEMORY_EMBEDDING_CACHE_MAX=1000 # default 1000 entries # MEMORY_TRANSFORMERS_MODEL=Xenova/all-MiniLM-L6-v2 # MEMORY_STATIC_MODEL=minishlab/potion-base-8M # HF repo id (download once) # MEMORY_STATIC_CACHE_DIR= # default /embeddings # MEMORY_VEC_TOP_K=20 # default top-K for vector search # MEMORY_RRF_K=60 # RRF k constant (sqlite-vec hybrid recipe) # HF_HUB_ENDPOINT=https://huggingface.co # override Hugging Face Hub base URL for static potion downloads # AgentBridge + Traffic Inspector (Group A) # AgentBridge AGENTBRIDGE_UPSTREAM_CA_CERT= # Inspector INSPECTOR_BUFFER_SIZE=1000 INSPECTOR_HTTP_PROXY_PORT=8080 INSPECTOR_HTTP_PROXY_AUTOSTART=false INSPECTOR_TLS_INTERCEPT=false INSPECTOR_SYSTEM_PROXY_GUARD_MINUTES=30 INSPECTOR_MAX_BODY_KB=1024 INSPECTOR_MASK_SECRETS=true INSPECTOR_LLM_HOSTS_EXTRA= INSPECTOR_INTERNAL_INGEST_TOKEN= # Quota Sharing (Group B — planos 16+22) QUOTA_STORE_DRIVER=sqlite # sqlite | redis # QUOTA_STORE_REDIS_URL= # ex.: redis://localhost:6379 (apenas quando driver=redis) # QUOTA_SATURATION_THRESHOLD=0.5 # 0..1; >= threshold ativa modo strict (sem empréstimo) # QUOTA_SOFT_DEPRIORITIZE_FACTOR=0.7 # 0..1; multiplicador do score quando soft policy ativa # QUOTA_CONSUMPTION_RETENTION_DAYS=14 # GC de buckets quota_consumption.updated_at antigos