# OpenVibe.Exchange — environment (production: /etc/openvibe/exchange.env). Names only; never commit values. NODE_ENV=production PORT=5150 HOST=127.0.0.1 BASE_URL=https://openvibe.exchange TRUST_PROXY=2 # PostgreSQL (ADR-035), written by OpenVibe.Host roles/data/add-service.sh: the runtime role through PgBouncer, # the owner on a direct connection (migrations), and Valkey (shared limit counters). # Without DATABASE_URL, development uses an embedded PGlite database in data/pglite. DATABASE_URL= DATABASE_DIRECT_URL= VALKEY_URL= VALKEY_PREFIX=ov:exchange: # Per-address limits (server/app.js) and the chat's per-person limit on top. #EXCHANGE_RATE_LIMIT_PER_MIN=300 #EXCHANGE_CHAT_PER_DAY=40 #EXCHANGE_CHAT_MODELS=3 #EXCHANGE_CHAT_MAX_CHARS=8000 # OpenVibe.Network: SSO (OAuth client `exchange`, PKCE S256) and its JWKS; the client-credentials token for # OpenVibe.AI is made from the same client secret (Network grants it ai.run.create, ns ai.complete). OV_NETWORK_URL=https://openvibe.network OV_NETWORK_INTERNAL_URL=http://127.0.0.1:4000 # OV_NETWORK_ISSUER=https://openvibe.network OV_OAUTH_CLIENT_ID=exchange OV_OAUTH_CLIENT_SECRET= # OV_OAUTH_REDIRECT_URI=https://openvibe.exchange/auth/callback # EXCHANGE_AUDIENCE=openvibe.exchange # OV_SESSION_AUDIENCE=openvibe.network # EXCHANGE_PGLITE_DIR=./data/pglite # OpenVibe.AI: the public catalog and usage reads, and the ai.complete runs a chat or a Try it makes on the # person's behalf. The reads are public; the runs carry this service's token (OV_OAUTH_CLIENT_SECRET). #OV_AI_URL=https://ai.openvibe.services #OV_AI_AUDIENCE=openvibe.ai #OV_AI_SCOPE=ai.run.create # OpenVibe.Sources: the github source's repository rankings and its live GitHub search (category code). # Exchange's own client-credentials grant (sources.item.read) reads it over loopback; nothing here calls GitHub. #OV_SOURCES_URL=http://127.0.0.1:4720 #OV_SOURCES_AUDIENCE=openvibe.sources #OV_SOURCES_SCOPE=sources.item.read #EXCHANGE_CODE_REPOS_CACHE_MS=60000 #EXCHANGE_CODE_SEARCH_CACHE_MS=600000 #EXCHANGE_CODE_SEARCH_PER_MIN=20 # The owner console uses this Exchange service grant to read/write AI's admin JSON API. # Network grants these capabilities to the existing `exchange` client; keep this scope to the needed AI capabilities. #OV_AI_CONSOLE_SCOPE=ai.usage.read ai.workflow.manage ai.provider.manage #EXCHANGE_AI_TIMEOUT_MS=30000 #EXCHANGE_AI_WAIT_MS=25000 # OpenVibe.Report: the public AI performance rows behind a model's Measured panel, and a signed-in person's own # AI usage (their Network session token is forwarded; no service token is involved). A public row floor of 20 # calls in 30 days; the performance rows are cached for five minutes. #OV_REPORT_URL=https://openvibe.report #EXCHANGE_REPORT_TIMEOUT_MS=2000 #EXCHANGE_REPORT_CACHE_MS=300000 # /openapi.json reads the API host's document and keeps it for ten minutes. #OV_EXCHANGE_API_URL=https://api.openvibe.exchange #OV_EXCHANGE_OPENAPI_URL=https://api.openvibe.exchange/openapi.json #EXCHANGE_OPENAPI_CACHE_MS=600000 #EXCHANGE_OPENAPI_TIMEOUT_MS=15000 # OpenVibe.Events: account export/deletion deliveries to POST /internal/events. The secret signs a delivery # (comma-separated for rotation, 32+ characters each; unset makes the route answer 503). EXCHANGE_EVENTS_SECRET= EXCHANGE_EVENTS_URL= #EXCHANGE_EVENTS_ENDPOINT=http://127.0.0.1:5150/internal/events #EXCHANGE_EVENTS_INTERVAL_MS=5000 # A restore drill starts no subscriptions and creates no Events subscription. # EXCHANGE_DRILL=0 # OpenVibe.Chat: the companions' answers are read aloud in each character's own voice. The call carries # the person's own Network token, so the read-aloud is on their own allowance and on Chat's per-person rate # limit. The site's own voices only; a cloned voice is never asked for here. #OV_CHAT_URL=https://openvibe.chat #EXCHANGE_TTS_TIMEOUT_MS=20000 # The companions' images (step 6 of the design): OFF until an image provider is configured. While the switch is # off no provider is ever called and the route refuses with the reason. #EXCHANGE_COMPANIONS_IMAGES_ENABLED=false #EXCHANGE_COMPANIONS_IMAGES_PROVIDER= # optional: defaults to true in production # COOKIE_SECURE=true # openvibe.compare: the comparison site is served by this same service behind its own name (its vhost # deploy/nginx/openvibe.compare.conf proxies to this process). The host makes a request the compare site's. #COMPARE_HOST=openvibe.compare #COMPARE_BASE_URL=https://openvibe.compare # IndexNow (openvibe-shared/indexnow): a key lets a new page or a changed sitemap be submitted for recrawl. # Unset → off; nothing is mounted and nothing is sent. The key file is served at /.txt. #INDEXNOW_KEY=