Configuration reference

Every environment variable of a self-hosted Future AGI install: its default in each setup, which setups read it, and what breaks when it is wrong.

In this page

Every environment variable you can set on a self-hosted Future AGI install: what it does, its default, which setup reads it, and what goes wrong when it is wrong. Environment variables covers the keys you are most likely to set, grouped by what you want to do, and how .env is read.

📝
TL;DR

Nothing is required for a local install. ./bin/install creates .env from .env.example, generates every secret and starts the Standalone setup on http://localhost:3000. Come back here when you want LLM keys, a public URL, email, or a production deployment.

How configuration works

Setups. The Setups column of every table below says who reads a key:

CodeSetupFiles
SStandalone, the default: one app container plus Postgres and ClickHousedocker-compose.yml (./bin/install)
DDistributed, for scale: one container per service, PeerDB, per-queue workersdocker-compose.distributed.yml (./bin/install --distributed)
HHelm: Distributed on Kubernetesdeploy/helm/futureagi; set application keys through the chart’s values
devHot-reload development onlydocker-compose.dev.yml, docker-compose.distributed.dev.yml (./bin/dev)

A key marked S or D but not H only exists in the Compose files (ports, image tags, CPU and memory limits, installer settings); the Helm chart has its own values for those.

Where values come from, why an empty value is not always unset, and how to apply a change: How .env is read.

1. Generated by the installer

On a fresh install (no volumes of this Compose project yet) ./bin/install fills every key below that is empty or still a CHANGEME- placeholder with a random value and writes it to .env. It never changes a value afterwards. On an existing install it fills only INTEGRATION_ENCRYPTION_KEY, AGENTCC_WEBHOOK_SECRET and, on Standalone, REDIS_PASSWORD, which is safe while they are unset, and warns about the rest. --wipe-volumes and ./bin/uninstall --wipe-data make the next install fresh again, and a value already in .env is kept even then.

Without the installer, set them yourself before the first start: openssl rand -hex 32 for each, and python3 -c "import base64, os; print(base64.urlsafe_b64encode(os.urandom(32)).decode())" for INTEGRATION_ENCRYPTION_KEY. Left empty, the stack runs on the defaults below, which are published in the open-source repository and therefore not secret.

Every secret below can change at any time (set it in .env, then docker compose up -d), except PG_PASSWORD, INTEGRATION_ENCRYPTION_KEY and CH_PASSWORD once in use: their rows say what breaks.

Secrets

KeyDefault if emptySetupsWhat it does, and what breaks if it is wrong
SECRET_KEYlocal-dev-only-not-for-production-replace-meS D HSigns logins, tokens and password-reset links. Changing it signs everyone out. With ENV_TYPE other than local, the app refuses to start on Django’s built-in default.
PG_PASSWORDfutureagiS D HPostgres password. Written into the Postgres volume on the first start: changing it later gives password authentication failed until you restore the old value or wipe the volume.
MINIO_ROOT_PASSWORDfutureagi (.env.example ships the placeholder CHANGEME-set-by-bin-install, which the installer replaces)S D HObject storage password: datasets, exports, media. Compose derives S3_SECRET_KEY from it. A CHANGEME- value next to existing volumes makes the installer stop and ask.
AGENTCC_INTERNAL_API_KEYlocal-dev-only-shared-secret-replace-meS D HShared secret for app-to-gateway calls, and through the gateway your provider keys. Both sides read the same value, so it can change at any time.
AGENTCC_ADMIN_TOKENlocal-dev-only-admin-token-replace-meS D HBearer token for the LLM gateway’s admin API. The gateway also sends it when it loads keys from the app.
AGENTCC_WEBHOOK_SECRETS: a random one on every start; D: empty, and the app refuses the gateway’s request logs, so the gateway’s logs and analytics stay emptyS D HShared secret the LLM gateway sends its request logs to the app with. Both read it on start, so it can change at any time. Helm: secrets.agentccWebhookSecret when set, else the key of that name in secrets.existingSecret when that is set, else generated.
INTEGRATION_ENCRYPTION_KEYEmpty. With ENV_TYPE=local, every process start makes a throwaway key, so saved integration credentials do not survive a restart. Other ENV_TYPEs: connecting an integration fails.S D HFernet key (32 random bytes, URL-safe base64) that encrypts stored integration credentials. Changing it strands what was saved with the old key; those integrations must be connected again.
REDIS_PASSWORDlocal-dev-only-redis-passwordSPassword of the Redis inside the app container, which code evals can reach. Only letters, digits and - _ . ~ (it is part of the Redis URLs); anything else stops the container at start. Distributed runs Redis without a password on the internal network.
CH_PASSWORDEmpty: ClickHouse’s default user has no password, and code evals can then read and change every traceS D HPassword of ClickHouse’s default user. ClickHouse reads it at every start, and the app, the collector and the bootstrap jobs log in with it; PeerDB’s init job stores it in the ch_dest peer when it creates that. Generated on a fresh install only: an install made before the installer generated one keeps running without it, and on an existing install the installer stops whenever the value differs from the password ClickHouse runs with. No <, > or &: ClickHouse reads it into its XML configuration. Changing it later stops Distributed’s Postgres → ClickHouse sync until that peer carries the new one too, and removing it leaves the dictionaries spans are read through on the old one. To set or change one later, see INSTALLATION.md. Helm: clickhouse.password, else generated.

Choices the installer records

KeyDefaultSetupsWhat it does
COMPOSE_FILEunset: Standalone (docker-compose.yml)S DRead by Docker Compose. ./bin/install --distributed writes docker-compose.distributed.yml so plain docker compose commands keep using Distributed. An install keeps its setup: moving data between Standalone and Distributed is not supported, and the installer refuses. A COMPOSE_FILE exported in your shell wins over .env; the installer stops unless it lists the chosen setup’s file and not the other one.
COMPOSE_PROJECT_NAMEfutureagiS DRead by Docker Compose; prefixes container, volume and network names. ./bin/install --new-instance writes futureagi-2, futureagi-3, … to run an isolated second copy. Changing it on an existing install points it at new, empty volumes.

The installer also writes FUTURE_AGI_VERSION=local (and, for Distributed, the other image tags) after --from-source, and a free host port when a default port is taken. See Images and Host ports.

Installer inputs from your shell

Read by ./bin/install from the shell environment, not from .env.

KeyDefaultSetupsWhat it does
FAGI_ADMIN_EMAIL, FAGI_ADMIN_NAME, FAGI_ADMIN_PASSWORDunsetS D HWith -y (non-interactive), create the first account from these three. If any is missing, account creation is skipped. Helm: the bootstrap job reads them from bootstrap.admin.existingSecret and creates the account only if no user with that email exists; with the email set, a missing name or password, a malformed email, or a password the sign-up rules reject fails the job, which says why.
SKIP_USER_CREATION0S D1 skips the first-account prompt (same as --skip-user-creation).
CIunsetS DAny value makes the installer non-interactive (same as -y).

LLM provider keys

Server-wide keys for built-in evals, the prompt playground and other platform features that call an LLM. Workspaces can also add their own provider keys in the UI; some eval paths prefer the server-wide key when both exist. One provider is enough to start.

The LLM gateway in the bundled config (agentcc-gateway/config.example.yaml) routes OpenAI only. To route other providers through it, copy that file, enable them and point AGENTCC_CONFIG_PATH at the copy (Application behaviour).

KeyDefaultSetupsWhat it does
OPENAI_API_KEYemptyS D HOpenAI key for the app and the gateway’s default route.
ANTHROPIC_API_KEYemptyS D HAnthropic key for the app; for the gateway, enable Anthropic in its config.
GOOGLE_API_KEYemptyS D HGemini (Google AI Studio) key. The gateway receives it as GEMINI_API_KEY.
AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEYemptyS D HAWS Bedrock credentials.
AWS_REGIONus-east-1S D HRegion for Bedrock calls.

A wrong key does not stop anything from starting: the calls that use it fail with the provider’s authentication error.

Public URLs

Needed as soon as anyone opens the UI from anything other than http://localhost:3000: a server IP, a domain, or a reverse proxy. With plain ports the UI is http://<host>:3000 and the API http://<host>:8000.

KeyDefaultSetupsWhat it does, and what breaks if it is wrong
VITE_HOST_APIempty: the UI calls http://localhost:<BACKEND_PORT> (8000); Helm: urls.apiS D HURL the browser uses to reach the API, e.g. https://api.example.com. Written into the UI’s config.js at container start, no rebuild. Wrong or unset on a remote host: the UI loads but every API call fails (often reported as a CORS error). Required by the production overlay and by docker-compose.frontend.yml (UI only).
BASE_URLhttp://localhost:8000S D HThe API’s own public URL: SSO and OAuth callbacks, the MCP and SDK endpoints shown in the UI, trusted CSRF origins. Wrong: SSO sign-in redirects fail and copied snippets point at localhost.
FRONTEND_URLunset: those links use APP_URL (http:// for a loopback host); Helm: urls.appS D HThe UI’s URL, e.g. https://app.example.com: links in digest, annotation, discussion and rule-run emails, MCP OAuth consent redirects, and the setup check that warns about plain HTTP. Required by the production overlay.
APP_URLlocalhost:<FRONTEND_PORT> (localhost:3000) in both compose files; Helm: urls.appS D HThe UI’s address, as host[:port] (app.example.com) or a full URL (https://app.example.com). Invite, verification and password-reset links, the links in app emails and the SSO redirects back to the UI are built from it. A scheme you write is kept. Without one, links use http:// for localhost and loopback addresses, and otherwise https://, or http:// while ENV_TYPE is local or test. So write the full URL when that guess is wrong: https://... for a UI behind TLS with the default ENV_TYPE=local, http://... for a plain-HTTP host with ENV_TYPE=production. Wrong: invite and reset links open the wrong address.
MINIO_URLhttp://localhost:9005 (follows MINIO_API_PORT); Helm: urls.objects, else the ingress’s objects host or the external endpoint, else http://localhost:<objectStorage.bundled.service.downloadPort>S D HBase URL of every stored-file link the browser opens (uploads, exports, audio and image previews). Object storage listens on 127.0.0.1 only, so a remote browser needs a reverse proxy in front of port 9005 and this set to its URL. See Opening the UI from another machine in INSTALLATION.md. Wrong: file previews and downloads fail while the rest works.
FI_COLLECTOR_PUBLIC_URLhttp://localhost:<FI_COLLECTOR_OTLP_HTTP_PORT> (http://localhost:4318); Helm: urls.otlp, else the OTLP host of the ingress or the Gateway API routes, else http://localhost:4318 (the port-forward)S D HOTLP/HTTP base URL of the trace collector as SDKs outside the stack reach it: what the in-app SDK snippet, the first-run setup screen, the installer’s and the app’s start-up summaries hand out as FI_BASE_URL. The collector listens on 127.0.0.1 in both Compose setups, so SDKs on other machines need a reverse proxy in front of port 4318 and this set to its URL. Wrong: copied snippets send traces to an address that does not answer.

Email

Without email the install still works: invites return a link for you to share, and “Forgot password” answers with the command an administrator runs to set a new password:

  • Standalone: docker compose exec app python manage.py reset_password --email <address>
  • Distributed: docker compose exec backend python manage.py reset_password --email <address>
  • Helm: kubectl -n <namespace> exec -it deploy/<release>-backend -c backend -- python manage.py reset_password --email <address>

With email delivery configured (MAILGUN_API_KEY, or an EMAIL_BACKEND other than the console or dummy backend), “Forgot password” emails the reset link instead, and answers the same whether or not the address has an account.

KeyDefaultSetupsWhat it does
MAILGUN_API_KEYempty: emails are written to the app log instead of sentS D HMailgun API key. Setting it switches the app to the Mailgun backend.
MAILGUN_SENDER_DOMAINemptyS D HYour Mailgun sending domain, e.g. mg.example.com.
DEFAULT_FROM_EMAILempty: Future AGI <noreply@<MAILGUN_SENDER_DOMAIN>>S D HSender of every app email (invites, verification, password resets), on MAILGUN_SENDER_DOMAIN: Mailgun rejects senders on other domains. Helm: config.email.fromEmail.
DEFAULT_REPLY_TO_EMAILempty: no Reply-To header, so replies go to the senderS D HReply-To address of app emails, e.g. support@example.com. Helm: config.email.replyTo.
SERVER_EMAILemptyS D HSender of Django’s own error emails.
EMAIL_BACKENDMailgun when MAILGUN_API_KEY is set, otherwise the console backendS D HAdvanced: any Django email backend class path. Mailgun is the supported provider; SMTP host settings are not read from the environment.

3. Optional integrations

Each of these is off until you set it.

Extra services

KeyDefaultSetupsWhat it does
COMPOSE_PROFILESemptyS DRead by Docker Compose, comma-separated. Standalone: sandbox runs code evals in the privileged nsjail code-executor container instead of the app container (use it when people who write code evals must not trust one another; set it in .env, not only with --profile, because the app reads it to route evals); ml adds the serving embedding-model container (a few GB of RAM) for embedding-based evals and knowledge bases. Distributed: all adds the per-queue workers, the Temporal UI and the PeerDB UI; workers, observability and peerdb add one group each.

Google Cloud and Vertex AI

Gemini, Imagen and embeddings on Vertex AI work in every setup. The partner models on Vertex (Claude, Llama, Mistral, Model Garden) need the Vertex AI SDK, which Standalone’s app image leaves out; see Backend variants.

KeyDefaultSetupsWhat it does
GOOGLE_APPLICATION_CREDENTIALSempty (mounts /dev/null)S D HAbsolute host path of a GCP service-account JSON, mounted read-only. Standalone mounts it at /etc/futureagi/secrets/vertex.json and points the variable there for every process in app (API, worker, gateway); without a file the variable is unset there, so Google’s other credential sources apply. Distributed mounts it into agentcc-gateway and worker-simulation-runner only: the backend and the other workers receive the host path, so mount the file at that path with a compose override if they need it. Never commit the file.
GOOGLE_CLOUD_PROJECTemptyS D HGCP project for Vertex AI calls.
GOOGLE_CLOUD_LOCATIONglobal (hosted agent authoring: us-central1)S D HVertex AI region.
GOOGLE_GENAI_USE_VERTEXAITrue for hosted agent jobsS D HMakes Google GenAI clients inside hosted agent sandboxes use Vertex AI.
CLOUD_ML_REGIONus-east5 (dev overlay: global)S D H devVertex region for Claude-on-Vertex in hosted agent authoring.

Other model and voice providers

KeyDefaultSetupsWhat it does
OPENROUTER_API_KEYemptyS D HOpenRouter key for the app.
HUGGINGFACE_API_TOKENemptyS D HHugging Face token for models pulled from the Hub.
PERPLEXITY_API_KEY, GROQ_API_KEY, XAI_API_KEYemptyS D HKeys the gateway config can reference as ${...} once you enable those providers in it (see AGENTCC_CONFIG_PATH).
DEEPGRAM_API_KEY, CARTESIA_API_KEYemptyS D HSpeech providers for voice simulations.

Enterprise Edition

KeyDefaultSetupsWhat it does
EE_LICENSE_KEYempty: the open-source feature setS D HEnterprise Edition license key. Helm: license.existingSecret (or license.key) with edition: ee; the chart gives it to the backend, every worker and the bootstrap job.
FUTURE_AGI_LICENSE_URLhttps://api.futureagi.comS D HLicense activation and heartbeat server. Helm: license.url.
FUTURE_AGI_ENTERPRISE_HEARTBEAT_DISABLEDfalseS D Htrue stops the license heartbeat. Helm: license.heartbeat: false, or global.airgap.
EE_LICENSE_PUBLIC_KEY, EE_LICENSE_PUBLIC_KEYS, EE_LICENSE_KEY_IDbuilt-in keyringS D HAdvanced: override the public keys a license is verified against. Only on instruction from Future AGI.
EE_LICENSE_CLOCK_SKEW_SECONDS300S D HAdvanced: clock skew tolerated when checking a license’s validity window.

Agent simulations in hosted sandboxes

Agent simulations can build and run the agent under test in a remote sandbox from Daytona or E2B. Off until you set that provider’s key.

Distributed and Helm run the default backend image, which has the Daytona and E2B SDKs and git. Standalone’s app image is built on the slim backend, which has neither: there, hosted runs answer 501 sandbox_sdk_missing, and runs from a GitHub source 501 git_unavailable, until you build the app image on the default backend (Backend variants).

KeyDefaultSetupsWhat it does
HOSTED_SANDBOX_PROVIDERdaytonaS D Hdaytona or e2b. Any other value is refused.
DAYTONA_API_KEYemptyS D HDaytona API key.
DAYTONA_API_URL, DAYTONA_TARGET, DAYTONA_ORGANIZATION_IDDaytona’s defaultsS D HDaytona endpoint, region and organization.
ALK_DAYTONA_SNAPSHOT, ALK_DAYTONA_SNAPSHOT_DIGESTemptyS D HPre-built Daytona snapshot for the sandbox and its pinned digest.
ALK_DAYTONA_DOCKERFILEemptyS D HBuild the sandbox from a Dockerfile instead of a snapshot. Development only; leave empty in production.
E2B_API_KEYemptyS D HE2B API key.
ALK_E2B_TEMPLATE_REFERENCE, ALK_E2B_TEMPLATE_BUILD_IDemptyS D HE2B template for the sandbox. The reference must end with the exact build ID.
ALK_E2B_TEMPLATE_CPU_UNITS, ALK_E2B_TEMPLATE_MEMORY_MB, ALK_E2B_TEMPLATE_DISK_GB4, 8192, 10S D HSize of the E2B sandbox.
ALK_E2B_MAX_TTL_SECONDS0S D HYour E2B plan’s limit on a sandbox’s lifetime. Required for E2B: at 0 every E2B job fails with a configuration error.
HARNESS_PROVIDERdaytona in the compose files (hosted in code; both mean the platform-managed path)S D Hsandbox sends jobs to an out-of-process sandbox server instead (development).
HARNESS_PUBLIC_BASE_URLemptyS D HPublic URL sandboxes use to call back into the platform.
ALK_HARNESSclaudeS D HAgent that authors the environment inside the sandbox.
ALK_HARNESS_MODELderived from ALK_HARNESS and the gateway settings (dev overlay’s local sandbox server: claude-sonnet-4-6)S D H devModel the authoring agent uses.
ALK_HOSTED_AGENTCC_BASE_URL, AGENTCC_BASE_URLemptyS D HGateway URL reachable from inside the sandbox, for authoring through the gateway. The first wins.
ALK_HOSTED_AGENTCC_MODELvertex_ai/gemini-3.7-flashS D HModel requested through that gateway.
AGENTCC_HARNESS_API_KEYempty (falls back to AGENTCC_INTERNAL_API_KEY)S D HPlatform-owned gateway key for sandbox authoring.
SIMULATOR_LLM_PROVIDER, SIMULATOR_LLM_MODELvertex, gemini-3.8-flashS D HLLM that plays the simulated user.
SIMULATOR_LLM_THINKINGempty: the least deliberation the model accepts by defaultS D HThat LLM’s thinking level or token budget. Set it to go lower where the model allows, e.g. minimal on gemini-3.5-flash-lite (gemini-3.7-flash refuses it).
ALK_HOSTED_BASE_EGRESS_DOMAINSemptyS D HExtra domains a sandbox may reach, comma-separated.
ALK_HOSTED_WEBRTC_EGRESS_CIDRSemptyS D HCIDRs a sandbox may reach for WebRTC media, comma-separated.
ALK_HOSTED_EGRESS_UNRESTRICTEDfalseS D Htrue lifts the sandbox egress allow-list.
ALK_HOSTED_AUTHORING_MAX_DURATION_SECONDS3600S D HLongest an authoring run may take.
ALK_HOSTED_AUTHORING_TIMEOUTempty: ALK_HOSTED_AUTHORING_MAX_DURATION_SECONDS + 300S D HTimeout of the whole authoring step, in seconds.
ALK_HOSTED_SANDBOX_TTL_SECONDS7200S D HLifetime of a job’s sandbox.
ALK_HOSTED_PROVIDER_UNREACHABLE_GRACE_SECONDS180S D HSeconds a running sandbox may stay unreachable through its provider’s API before the job fails it (sandbox_unreachable) and replaces it from its infrastructure retries. Raise it for long runs that must ride out a brief provider outage.
ALK_HOSTED_CHAT_TTL_SECONDS1800S D HLifetime of an interactive chat sandbox.
ALK_HOSTED_BUNDLE_DIRemptyS D HDirectory of pre-authored environment bundles (<dir>/<owner>__<repo>/manifest.json).
HARNESS_PARALLELISM_ENABLEDfalseS D Htrue lets one sandbox run several of a simulation’s scenarios at once. Parallelism stays off, and a run that asks for it runs one scenario at a time, unless this is true and the sandbox’s image is in HARNESS_PARALLEL_SNAPSHOT_DIGESTS. A Daytona sandbox built from ALK_DAYTONA_DOCKERFILE (development) needs only this flag.
HARNESS_PARALLEL_SNAPSHOT_DIGESTSempty: no image qualifiesS D HSandbox images cleared for parallel scenarios, comma-separated: Daytona snapshot digests (ALK_DAYTONA_SNAPSHOT_DIGEST, or a profile’s snapshot_digest) and E2B template build IDs (ALK_E2B_TEMPLATE_BUILD_ID).
HARNESS_MAX_WORLD_SLOTS8S D HMost scenarios one sandbox runs at once, 1 to 8: any other value fails every hosted run. The sandbox’s CPU and memory can lower it further.
HARNESS_RESOURCE_PROFILES[]: every run uses the provider’s fixed sandbox sizeS D HMeasured sandbox sizes, a JSON array of objects with name, cpu_units, memory_mb, disk_gb, max_parallelism, connectors (the agent connectors it serves) and, except for sandboxes built from ALK_DAYTONA_DOCKERFILE, snapshot_name and snapshot_digest. A run gets the profile that runs the most of its scenarios at once, and the smallest of those. A value that is not JSON, an empty one included, stops the app from starting; an invalid profile fails every hosted run.

Voice simulations (Distributed)

Hosted voice runs execute in the worker-simulation-runner container, which runs its own image. Standalone skips its queue (TEMPORAL_EXCLUDED_QUEUES). Check the runner’s effective environment with scripts/verify-simulation-runner-deployment.sh --env-only. Never give the runner FI_API_KEY or FI_SECRET_KEY: results would be filed under the wrong organization.

The LiveKit and SIP trunk keys (S below) also reach the API: phone runs in hosted sandboxes (above) dial out through the platform’s trunk, never a customer’s, so Standalone’s app and Distributed’s backend read them too.

KeyDefaultSetupsWhat it does
LIVEKIT_URL, LIVEKIT_API_KEY, LIVEKIT_API_SECRETemptyS D HLiveKit project the simulator joins. Must own the SIP trunk below. The API also hands it to phone runs in hosted sandboxes, which is why Standalone’s app reads it.
INTERNAL_API_SECRETemptyD HBearer the runner uses to report results to the platform.
LIVEKIT_OUTBOUND_TRUNK_IDemptyS D HOutbound SIP trunk (the platform dials the customer’s agent).
PSTN_CALLER_NUMBERemptyS D HE.164 caller id provisioned on that trunk.
SIP_OUTBOUND_TRUNK_ID, SIP_OUTBOUND_FROM_NUMBERemptyS D HFallbacks for LIVEKIT_OUTBOUND_TRUNK_ID and PSTN_CALLER_NUMBER when a phone run in a hosted sandbox dials out; those two win when set.
ALK_SIM_SLOT_LEASE_SCRIPTemptyD HPath inside the runner to the lease script for inbound (Retell) runs. Unset: the SDK provisions a dispatch rule per run.
SIM_SLOT_LEASE_STOREthe lease script’s own per-container defaultD HWhere that script records leases; point every runner at one shared location. Read by the lease script, not by the platform.
HOSTED_RUNNER_ENABLEDfalse (the runner container: true)D HSend eligible simulation runs to the runner.
HOSTED_RUNNER_VOICE_ENABLEDfalseD HSend voice runs to the runner too. Needs HOSTED_RUNNER_ENABLED.
HOSTED_RUNNER_MAX_CASES500 (0 = no cap)D HMost scenario rows one hosted voice run may reserve.
HOSTED_RUNNER_MAX_WALLCLOCK_SECONDS21600 (0 = no cap)D HLongest one hosted voice run may hold a runner slot.
HOSTED_RUNNER_LEASED_ROOM_REUSEfalseD HServe a multi-row phone run over one leased room. Only once a runner kit that supports it is deployed.
HOSTED_RUNNER_LEASED_ROOM_MAX_CASES25 (0 = no cap)D HTighter row cap for leased-number phone runs.
HOSTED_RUNNER_LEASED_ROOM_MAX_WALLCLOCK_SECONDS14400 (0 = no cap)D HTighter time cap for leased-number phone runs.
HOSTED_RUNNER_PARENT_SLACK_SECONDS600D HSeconds the workflow timeout and number lease exceed the run’s own budget. An empty value stops the worker at import: leave it unset instead.
SIMULATOR_CONVERSATION_DIRECTIONsimulator_firstD HWho speaks first in a simulated call.
ALK_RUNNER_MAX_CONCURRENCY4DConcurrent runs per runner container (also its activity slots).
ALK_RUNNER_PYTHON/opt/alk-venv/bin/pythonDInterpreter of the runner’s SDK environment.
TEMPORAL_SIMRUNNER_MAX_WORKFLOWS8DWorkflow task slots of the runner.
SIMULATION_RUNNER_GRACEFUL_SHUTDOWN_TIMEOUT300DSeconds the runner drains in-flight calls on stop.
SIMULATION_RUNNER_STOP_GRACE_PERIOD330sDDocker’s stop timeout for the runner. Keep it above the drain timeout, or a call in flight is cut and its leased number stays taken.
VAPI_API_KEY, VAPI_PHONE_NUMBER_IDemptyS D HVapi account for voice simulations through Vapi.
VAPI_API_BASE_URLVapi’s public APIS D HVapi API endpoint.
SYSTEM_VOICE_PROVIDERvapiS D HProvider of the simulator side of a voice call. Calls to LiveKit agents always use LiveKit.

Deployment telemetry

Deployment telemetry is on by default, so Future AGI knows how many installs run which version. It never sends traces, prompts, completions, datasets or any other content. What it sends and when, what the opt-out still sends, and how to see what your install sent: Telemetry and outbound connections.

KeyDefaultSetupsWhat it does
FUTURE_AGI_TELEMETRY_DISABLEDfalseS D Htrue opts out (1, yes and on also work): no email addresses and no heartbeats are sent, and buffered heartbeats are deleted; one minimal registration remains (what it contains). ./bin/install --no-telemetry (.\bin\install.ps1 -NoTelemetry) writes it before anything starts. Helm: config.telemetry=false.
FUTURE_AGI_TELEMETRY_URLhttps://api.futureagi.comS D HWhere registrations and heartbeats go. Change it only to test against another receiver.
FUTURE_AGI_TELEMETRY_INTERVAL_HOURS6S D HHeartbeat interval: 1, 2, 3, 4, 6, 8, 12 or 24. Other values fall back to 6.
FUTURE_AGI_TELEMETRY_JITTER_SECONDS1800S D HMaximum random delay added to each scheduled run, so installs do not all send at once.
FUTURE_AGI_TELEMETRY_TIMEOUT_SECONDS5S D HTimeout of each request. ./bin/install runs its create_user with 2 unless this is set, so an unreachable telemetry URL delays the first account only briefly.
FUTURE_AGI_TELEMETRY_BUFFER_DIRS: /data/telemetry; D: /tmp/futureagi-deployment-telemetry; H: futureagi-deployment-telemetry under the system temp dirS D HWhere undelivered heartbeats wait for the next attempt, in a directory only the app’s user can read. Files older than 30 days are deleted.
FUTURE_AGI_DEPLOYMENT_TYPES D: docker; H: detected: kubernetesS D HReported as deployment_type in telemetry. Unset, it is detected: kubernetes, docker or bare_metal.

Integrations of Future AGI’s hosted service

These power Future AGI’s own cloud service. Leave them empty when you self-host: empty means the feature is skipped and nothing is sent.

KeyDefaultSetupsWhat it does
HUBSPOT_API_TOKENempty: skippedS D HAdds a HubSpot contact at signup and marks it at login.
SLACK_WEBHOOK_CHANNELempty: skippedS D HSlack incoming webhook for new-signup notices.
ERROR_LOGS_WEBHOOKemptyS D HSlack incoming webhook for selected error reports. Never used with ENV_TYPE=local.
MIX_PANEL_TOKENempty: offS D HServer-side Mixpanel product analytics.
POSTHOG_API_KEYempty: offS D HServer-side PostHog product analytics.
POSTHOG_HOSThttps://us.i.posthog.comS D HPostHog endpoint.
SENTRY_DSNempty: offS D HSend errors to your Sentry project.
SENTRY_ENABLEDon outside ENV_TYPE=local, but only with a DSNS D Hfalse turns Sentry off even with a DSN.
USAGE_EVENTS_ENABLEDfalse in both compose files and the chart (config.usageEvents)S D HBilling usage events, one per trace export and per metered action, on the Redis stream usage:events. The app and fi-collector (Standalone runs it inside app) read it. Only Future AGI Cloud drains that stream: turned on anywhere else, it grows until it reaches USAGE_EVENTS_MAX_LEN, taking Redis memory the cache and locks need. Unset, the app turns it on only when the image ships that consumer, and fi-collector turns it on.
USAGE_EVENTS_MAX_LEN1000000S D HMost entries kept on usage:events (about 160 bytes each) while its consumer is behind or stopped. A positive integer in plain digits; blank means the default. The app and fi-collector refuse to start on zero, a negative number or text.

Browser-side analytics (Mixpanel, PostHog, Sentry, ad pixels) are build-time settings of the UI image. The published images are built without them, so the UI sends nothing to those services. VITE_MIXPANEL_SESSION_REPLAY_PERCENT and VITE_SESSION_REPLAY_BLOCKED_PATH_PREFIXES only matter in an image built with a Mixpanel token.

Sign-up and sign-in

KeyDefaultSetupsWhat it does
OSS_RETURN_PASSWORD_RESET_LINKfalseS D Htrue returns the password-reset link in the browser instead of emailing it, even when email is configured. The endpoint takes no authentication, so anyone who can reach the instance can take over any account. Only on a laptop or a network where everyone is trusted. ./bin/install warns when .env sets it, and the Standalone start-up summary marks it UNSAFE.
RECAPTCHA_ENABLEDfalse in the compose files; Helm: config.recaptcha (false)S D HreCAPTCHA on sign-up, login and token refresh. Needs RECAPTCHA_SECRET_KEY and a UI image built with VITE_GOOGLE_SITE_KEY; the published images have none, so turning it on there rejects every sign-up and login. The Helm chart refuses to render config.recaptcha=true without RECAPTCHA_SECRET_KEY (in secrets.extra or config.extraEnv) or a config.extraEnvFrom source.
RECAPTCHA_SECRET_KEYemptyS D HreCAPTCHA server key.
AUTH0_CLIENT_ID, AUTH0_CLIENT_SECRETempty: no Google sign-inS D HGoogle sign-in: the OAuth client of a Google Cloud “Web application” (the app names Google’s settings AUTH0_*). Redirect URI: <API URL>/saml2_auth/auth/callback/. Helm: auth.google.
GITHUB_CLIENT_ID, GITHUB_CLIENT_SECRETempty: no GitHub sign-inS D HGitHub sign-in: a GitHub OAuth app. Redirect URI: <API URL>/saml2_auth/github/callback/. Helm: auth.github.
MICROSOFT_CLIENT_ID, MICROSOFT_CLIENT_SECRETempty: no Microsoft sign-inS D HMicrosoft sign-in: a multi-tenant Entra app registration (the common endpoint). Redirect URI: <API URL>/saml2_auth/microsoft/callback/. Helm: auth.microsoft.
VITE_HELP_LINKempty: the community DiscordS D HWhere the sidebar’s Help entry points.

4. Advanced tuning

Defaults are the values the compose files and the app use when a key is unset.

Images

Helm pins every image to the chart’s appVersion; override it with the chart value image.tag. The keys below are the Compose equivalents.

KeyDefaultSetupsWhat it does
FUTURE_AGI_VERSIONlatestS DTag of the Future AGI images (futureagi/standalone in Standalone, built on the slim backend; futureagi/future-agi, the default backend, in Distributed; see backend variants). Pin a release such as v1.42.0; local means images built from this checkout by ./bin/install --from-source (needed for a development branch: published images are built from main). Also reported as the version in telemetry.
FRONTEND_VERSION, AGENTCC_GATEWAY_VERSION, SERVING_VERSION, CODE_EXECUTOR_VERSIONlatestS DTags of the UI, gateway, embedding-server and code-executor images. Standalone uses only SERVING_VERSION (ml profile) and CODE_EXECUTOR_VERSION (sandbox profile).
FI_COLLECTOR_VERSIONlocal (built from ./fi-collector)DTag of the trace collector image. The production overlay requires a published, reviewed tag.
SIMULATION_RUNNER_VERSIONlatestDTag of the simulation runner image. Required by the production overlay.

Host ports

./bin/install checks every port the chosen setup publishes and offers a free one when a default is taken. Ports marked 127.0.0.1 only accept connections from the Docker host; the rest listen on all interfaces. Under ./bin/dev --distributed, Postgres, ClickHouse, Redis, MinIO and Temporal listen on all interfaces too.

KeyDefaultSetupsWhat it publishes
FRONTEND_PORT3000S D devUI. An unset APP_URL follows it.
BACKEND_PORT8000S D devAPI. An unset VITE_HOST_API follows it; when the installer moves this port it also rewrites a VITE_HOST_API that names localhost. A VITE_HOST_API naming another host is yours to update.
AGENTCC_GATEWAY_PORT8090S D devLLM gateway (OpenAI-compatible).
FI_COLLECTOR_OTLP_PORT4317S D devOTLP gRPC trace ingest, 127.0.0.1.
FI_COLLECTOR_OTLP_HTTP_PORT4318S D devOTLP HTTP trace ingest, 127.0.0.1. An unset FI_COLLECTOR_PUBLIC_URL follows it.
MINIO_API_PORT9005S D devObject storage API, 127.0.0.1. MINIO_URL follows it.
FI_COLLECTOR_ADMIN_PORT9464DCollector health and metrics, 127.0.0.1.
SERVING_PORT8080DEmbedding model server.
CODE_EXECUTOR_PORT8060DCode executor, 127.0.0.1: it runs any code it is sent, without authentication.
PG_PORT5432D devPostgres, 127.0.0.1.
CH_HTTP_PORT, CH_PORT8123, 9000D devClickHouse HTTP and native, 127.0.0.1.
REDIS_PORT6379D devRedis, 127.0.0.1.
MINIO_CONSOLE_PORT9006D devMinIO console, 127.0.0.1.
TEMPORAL_PORT7233D devTemporal gRPC, 127.0.0.1.
TEMPORAL_UI_PORT8085DTemporal UI (all or observability profile, or ./bin/dev --distributed).
PEERDB_PORT9900DPeerDB, 127.0.0.1.
PEERDB_UI_PORT3001DPeerDB UI (all or peerdb profile, or ./bin/dev --distributed).
PROPERTY_CATALOG_KAFKA_PORT29092DKafka of the observed-attribute catalog, 127.0.0.1.

Standalone publishes no Postgres, ClickHouse, Redis, Temporal or code-eval sandbox port, and its ml and sandbox profiles publish none either.

Standalone sizing

KeyDefaultSetupsWhat it does
FI_APP_TEMPORAL_MAX_CONCURRENT_ACTIVITIES8SActivity slots per queue of the app’s embedded Temporal worker. Each running activity can hold a Postgres connection: raise it only on a larger host.
FI_APP_TEMPORAL_MAX_CONCURRENT_WORKFLOW_TASKS8SWorkflow-task slots per queue of the embedded worker.
GRANIAN_THREADS2S D HAPI server threads.
REDIS_MAXMEMORY128mbSMemory cap of the app container’s Redis (cache and locks; nothing in it must survive a restart). At the cap it evicts the least recently used keys (allkeys-lru).
SPAN_LIST_PAGE_WALL_MS, TRACE_LIST_PAGE_WALL_MS, SESSION_LIST_PAGE_WALL_MSStandalone: 15000; elsewhere 5000S D HHow long a span, trace or session list page may search before it answers with the rows found so far and a cursor for the rest (marked degraded). Standalone’s ClickHouse runs two threads a query, so it waits longer. Between 100 and 60000.
FI_ADOPT_DISTRIBUTED_INSTALL_DATAunsetStrue makes Standalone take over a Postgres database created by Distributed. Uploads in the old MinIO volume and in-flight workflows are left behind. Moving an install between setups is otherwise refused.

Distributed sizing

KeyDefaultSetupsWhat it does
GRANIAN_WORKERS1D HAPI server processes.
ENABLE_HTTP, ENABLE_GRPCtrue, trueD HRun the backend’s HTTP server and its gRPC server (port 50051).
TEMPORAL_ALL_QUEUEStrueD Htrue: the single worker polls every queue except TEMPORAL_EXCLUDED_QUEUES. false: it polls only the default queue, so run the per-queue workers (all or workers profile) for the rest.
TEMPORAL_MAX_CONCURRENT_ACTIVITIES, TEMPORAL_MAX_CONCURRENT_WORKFLOW_TASKS50, 50D HSlots of the all-queues worker. Standalone ignores these (see FI_APP_TEMPORAL_*).
TEMPORAL_DEFAULT_MAX_ACTIVITIES, TEMPORAL_DEFAULT_MAX_WORKFLOWS100, 100DSlots of worker-default.
TEMPORAL_TASKS_S_MAX_ACTIVITIES, TEMPORAL_TASKS_S_MAX_WORKFLOWS200, 200DSlots of worker-tasks-s.
TEMPORAL_TASKS_L_MAX_ACTIVITIES, TEMPORAL_TASKS_L_MAX_WORKFLOWS50, 50DSlots of worker-tasks-l.
TEMPORAL_TASKS_XL_MAX_ACTIVITIES, TEMPORAL_TASKS_XL_MAX_WORKFLOWS10, 20DSlots of worker-tasks-xl.
TEMPORAL_TRACE_MAX_ACTIVITIES, TEMPORAL_TRACE_MAX_WORKFLOWS100, 100DSlots of worker-trace-ingestion.
TEMPORAL_COMPASS_MAX_ACTIVITIES, TEMPORAL_COMPASS_MAX_WORKFLOWS50, 50DSlots of worker-agent-compass.
FI_COLLECTOR_CPUS, FI_COLLECTOR_MEMORY1.0, 1GDCPU and memory limit of the trace collector.

Databases and storage

The Postgres and ClickHouse hosts are set by the compose files. To use a managed database, override PG_HOST, PGBOUNCER_HOST or CH_HOST in a docker-compose.override.yml: values in .env do not reach those keys.

KeyDefaultSetupsWhat it does
PG_USER, PG_DBfutureagi, futureagiS D HPostgres user and database. Set before the first start; changing them later points the app at a database that does not exist.
CH_DATABASEdefaultS D HClickHouse database. CH25_DATABASE and FI_CH_DATABASE follow it unless set.
CH25_DATABASECH_DATABASES D HDatabase of the v2 trace schema. Keep it equal to FI_CH_DATABASE.
FI_CH_DATABASECH25_DATABASES D HDatabase the trace collector writes. A different database from the app’s means traces never show up.
CH_USERNAMEdefaultS D HClickHouse user of the app. Helm: clickhouse.user, which must stay default with the bundled ClickHouse.
CH_ENABLEDtrueD HRead analytics from ClickHouse. Do not turn off: trace views need it.
CH_USE_REPLICATED_ENGINESfalseD HCreate Replicated table engines, for a ClickHouse cluster.
CH25_EVAL_LOGGER_TABLEtracer_eval_loggerS D HTable of eval results in the v2 schema. Do not change.
CH25_QUERY_TYPES_V2_ONLYevery query typeS D HQuery types served only from the v2 schema. Do not change.
MINIO_ROOT_USERfutureagiS D HObject storage user; S3_ACCESS_KEY follows it. Set before the first start.
STORAGE_BACKENDminioS D HObject storage flavour: minio, s3 or gcs. The compose files wire the bundled MinIO; the others need your own S3_* values in a compose override.
PGSSLMODEpreferS D HTLS mode of the trace collector’s Postgres connections. Use verify-full for a remote Postgres.
PGSSLROOTCERT, PGSSLCERT, PGSSLKEYemptyS D HCertificate paths inside the collector container; mount the files read-only in a compose override. Helm: with postgres.external.sslMode verify-ca or verify-full and a global.caBundle, the chart sets PGSSLROOTCERT itself; otherwise mount the CA through the extraVolumes and extraVolumeMounts of backend, worker, bootstrap and fiCollector, and set PGSSLROOTCERT in config.extraEnv and fiCollector.extraEnv (example in the chart README).
PGBOUNCER_READ_HOST, PGBOUNCER_READ_PORT, PG_READ_DBunset: no replicaS D HA read replica (or a pooler in front of one) for opted-in reads; same user and password as the primary. Helm: postgres.readReplica.
READ_REPLICA_OPT_INempty: nothing reads from the replicaS D HModel class names and feature: keys routed to the replica, comma-separated. Helm: postgres.readReplica.optIn.
PG_DIRECT_HOST, PG_DIRECT_PORTunsetS D HA direct (unpooled) Postgres connection for migrations when PGBOUNCER_HOST is a transaction-mode pooler. Helm sets it on the bootstrap job when postgres.pooler is on.
AGENTCC_REDIS_ADDRESS, AGENTCC_REDIS_PASSWORD, AGENTCC_REDIS_DBunset: state in memoryD HRedis the LLM gateway keeps rate limits, budgets and other shared state in, as host:port; needed as soon as it runs more than one replica. No TLS. Helm: agentccGateway.redis (on by default with more than one replica, database 4); with redis.external.tls, a Redis without TLS set here through agentccGateway.extraEnv.

Application behaviour

KeyDefaultSetupsWhat it does
ENV_TYPElocalS D Hlocal keeps the self-host fallbacks: the default SECRET_KEY is accepted, a throwaway INTEGRATION_ENCRYPTION_KEY is made, links use http://. Any other value (the production overlay uses production) turns them off: the app refuses to start without a real SECRET_KEY, and links use https://.
DEBUGS: false; D: on while ENV_TYPE=localS D HDjango debug pages. Never on for an instance others can reach. The production overlay turns it off.
LOG_LEVELINFOS D HApplication log level.
LOG_STREAMstdoutS D Hstderr sends the application’s logs to stderr, for a one-off manage.py command whose output you redirect (sqlmigrate, dumpdata); ./bin/dev manage sets it. Leave it unset for the services: some log collectors (GKE, for one) mark every stderr line as an error.
ALLOWED_HOSTS*S D HHost names the API answers to, comma-separated. Standalone adds 127.0.0.1,localhost to a list without *, because the container’s own health checks call the API on loopback. Distributed adds nothing: include backend,localhost,127.0.0.1 yourself, since the workers call the API as backend (live updates, harness callbacks) and ./bin/install checks it on localhost. Helm: config.allowedHosts, to which the chart adds localhost, its service names, the API host and the pod’s own IP ($(POD_IP), the Host of load balancer health checks that probe pods directly); empty (the default) means the API host once the API has a public URL, else *.
CORS_ALLOWED_ORIGINSempty: any originS D HBrowser origins allowed to call the API, comma-separated (e.g. https://app.example.com). Setting it turns off allow-all. Helm: config.corsAllowedOrigins; empty (the default) means the UI’s origin once the UI has a public URL, else any origin; * keeps any origin.
CORS_ALLOWED_ORIGIN_REGEXESemptyS D HSame, as regular expressions.
EXTRA_CSRF_ORIGINSemptyS D HExtra trusted CSRF origins, comma-separated.
AGENTCC_CONFIG_PATHagentcc-gateway/config.example.yamlS DGateway provider config, relative to the repository root, mounted into the gateway. Copy the example to enable Anthropic, Gemini, Bedrock, Vertex and others; the copy is git-ignored. A path that does not exist stops the stack from starting.
AGENTCC_ALLOW_PRIVATE_PROVIDER_URLSfalse; Helm: agentccGateway.allowPrivateProviderURLsS D Htrue lets org providers use base URLs on private networks (RFC 1918 addresses, Docker service names): a local Ollama or vLLM, see INSTALLATION.md. Read by the gateway and the API; a gateway or API from before this setting ignores it and refuses every private address. Loopback, link-local and cloud metadata addresses stay refused. Anyone who can add a provider can then reach every service on that network, ClickHouse included (its default user has no password while CH_PASSWORD is empty, as on installs made before the installer generated one), so turn it on only when they are all trusted.
AGENTCC_SYNC_INTERVAL60s (Helm: 60s, from agentccGateway.config.control_plane.sync_interval)S D HA Go duration (60s, 5m): the gateway also re-reads keys and org settings from the app this often, so a gateway that started before the app (Distributed on a slow host) or several gateway replicas catch up. A gateway from before this setting ignores it and syncs only on start: its control plane sync enabled log line shows an interval of 0s. Helm sets it in the gateway’s config file, which every gateway reads.
APP_VERSIONunsetS D HThe running version, reported by the license check, Sentry and the model server. Helm sets it to the backend image tag.
SIM_COLLECTOR_OTLP_ENDPOINTfi-collector:4317D HOTLP/gRPC host:port where simulations and voice calls send their spans. Helm sets it to the release’s collector.
OTEL_ENABLEDfalseS D HExport the platform’s own OpenTelemetry traces (monitoring Future AGI itself, not your application’s traces).
FAST_STARTUPfalseD HSkip start-up checks in the backend containers.
TEMPORAL_TEST_EXECUTION_ENABLEDtrueS D HRun test executions as Temporal workflows.
ERROR_LOCALIZER_BACKENDS: legacy; D H: claude_agent_sdkS D HWhich error localizer explains a failed eval. claude_agent_sdk needs the localizer extra, which Standalone’s slim image leaves out (Backend variants); legacy is the original localizer and cannot localize simulation call audio.
EXACT_AGGREGATION_TASK_QUEUEexact_aggregationS D HQueue of exact analytics, which a dedicated single-slot worker serves.
TEMPORAL_EXCLUDED_QUEUESsimulation_runnerS D HQueues the general worker does not poll. The runner queue needs its own image.
TEMPORAL_NAMESPACEdefaultD HTemporal namespace.
FI_CDC_MODES: outbox (D always uses PeerDB)SHow Postgres changes reach ClickHouse. Standalone uses capture triggers drained by a Temporal schedule; do not change.
CODE_EXECUTOR_URLhttp://code-executor:8060 (the app’s built-in sandbox; sandbox profile: the nsjail container)SWhere code evals run. The built-in sandbox runs Python only; JavaScript evals need the sandbox profile. Point it at your own executor only if you run one.
CODE_EXECUTOR_EGRESS_PORTS80,443STCP ports code evals in the built-in sandbox may connect to, comma-separated; they can listen on none. Landlock enforces it where the Docker host runs Linux 6.7 or later; on older kernels evals reach every port, and the app’s log says so at start. A malformed list stops the sandbox. The nsjail sandbox (sandbox profile) does not apply it. See INSTALLATION.md.
CODE_EXECUTOR_LOCAL_FALLBACKfalse (Standalone: fixed false)D Htrue runs code evals inside the worker when code-executor cannot be reached, next to the platform’s secrets. Off, they fail with Code executor unavailable. Only for installs that cannot run the privileged code-executor and where everyone who can write code evals is trusted; ignored on Future AGI Cloud. See INSTALLATION.md. Helm: codeExecutor.localFallback.
MODEL_SERVING_URLhttp://serving:8080S D HEmbedding model server. Without the ml profile the features that need it are unavailable.
WEBSOCKET_ENDPOINThttp://backend/call-websocket/D HWhere workers post live updates for browsers. It must reach the backend from every container; change it only when the backend runs under another name or port. Standalone fixes it inside the container.
ALK_RUNNER_API_URLS: http://127.0.0.1:8000; D: http://backendS D HPlatform URL the simulation runner reports results to.

Observed-attribute catalog

The span attributes and values that trace filters, dashboard widgets and task filters suggest (including values of built-in properties such as the model). The bootstrap creates the catalog database and its two users. Standalone and Helm collectors write it directly (FI_OBSERVED_CATALOG_MODE=direct, through a local spool); Distributed’s collector publishes to Kafka and fi-property-catalog-consumer writes it. Spans stored before an install collected them can be indexed later with fi-observed-catalog-backfill (INSTALLATION.md).

KeyDefaultSetupsWhat it does
PROPERTY_CATALOG_DATABASEproperty_catalogS D HClickHouse database of the catalog.
PROPERTY_CATALOG_API_PASSWORDoss-observed-reader-local-onlyS D HPassword of the catalog’s read-only ClickHouse user. Required by the production overlay; reuse the provisioned value, never rotate it on retained data.
PROPERTY_CATALOG_CONSUMER_PASSWORDoss-observed-writer-local-onlyS D HPassword of the catalog’s writer user: the collector (S, H) or the Kafka consumer (D). Same rules.
OBSERVED_CATALOG_KAFKA_TOPICfutureagi.observed-attributes.v1D HTopic the collector publishes observations to.
OBSERVED_CATALOG_KAFKA_GROUPfutureagi.observed-attributes.consumer.v1D HConsumer group of the catalog writer.
OBSERVED_CATALOG_MAX_SPOOL_FILES, OBSERVED_CATALOG_MAX_SPOOL_BYTES10000, 536870912D HLocal spool limits of the collector while Kafka is unreachable. Standalone reads them as FI_OBSERVED_CATALOG_MAX_SPOOL_FILES and FI_OBSERVED_CATALOG_MAX_SPOOL_BYTES (while ClickHouse is unreachable).
FI_OBSERVED_CATALOG_MAX_KEYS_PER_SPAN, FI_OBSERVED_CATALOG_MAX_ARRAY_MEMBERS_PER_SPAN128, 256S D HMost attribute keys and array members observed per span.
ERROR_FEED_KAFKA_TOPICerror-feed.trace-available.v1D HTopic announcing new traces to the error feed. Must differ from the catalog topic.
PROPERTY_CATALOG_KAFKA_PARTITIONS6DPartitions of both topics.
PROPERTY_CATALOG_KAFKA_RETENTION_MS, PROPERTY_CATALOG_KAFKA_RETENTION_HOURS259200000, 72DTopic retention and the broker’s log retention.
PROPERTY_CATALOG_KAFKA_CPUS, PROPERTY_CATALOG_KAFKA_MEMORY, PROPERTY_CATALOG_KAFKA_HEAP_OPTS1.0, 1G, -Xms256m -Xmx512mDKafka container limits and JVM heap.
PROPERTY_CATALOG_CONSUMER_CPUS, PROPERTY_CATALOG_CONSUMER_MEMORY0.5, 512MDCatalog writer container limits.

Installer

KeyDefaultSetupsWhat it does
INSTALL_READY_TIMEOUT_SECONDS600 (60 to 1800)S DHow long ./bin/install waits for the stack to become ready. The wait extends while first-boot migrations are still running.
INSTALL_STABILITY_SECONDS15 (5 to 120)S DHow long the stack must stay ready before the installer reports success.
INSTALL_READY_MAX_SECONDS3600 (300 to 7200)S DHard limit on the wait, extensions included. It matches the app healthcheck’s start_period: on a slow or busy host a first boot’s migrations can take over half an hour.

Fine-grained limits

  • Application limits. About 230 bounded numeric settings (page sizes, timeouts, batch sizes, read budgets) are declared with their default, minimum and maximum in futureagi/tfc/settings/runtime_setting_specs.py. Any of them can be set by name in .env (Standalone and Distributed pass .env to the app). A value outside its bounds stops the app at start with a message naming the key.
  • UI limits. The VITE_* timeouts and page sizes listed in frontend/docker-entrypoint.sh, with defaults in frontend/.env.example, are read when the UI container starts. Standalone takes them from .env; Distributed passes only VITE_HOST_API and VITE_HELP_LINK to the frontend container, so set others in a compose override. Out-of-range values fall back to the default.

Proxy, CA bundle and air-gap

The processes honour the standard proxy and trust-store variables. Set them in a compose override; the Helm chart sets them from global.proxy, global.caBundle and global.airgap.

KeyDefaultSetupsWhat it does
HTTP_PROXY, HTTPS_PROXY, NO_PROXY (and lowercase)unsetS D HOutbound proxy and the hosts that bypass it, object storage included; object storage on a loopback address (Standalone’s) is always reached directly. On Distributed, list the internal hosts in NO_PROXY (minio,code-executor,serving,agentcc-gateway,fi-collector,localhost,127.0.0.1), or their calls go to the proxy. Helm: global.proxy, which builds NO_PROXY from the cluster’s names, the release’s Services and the datastore hosts plus global.proxy.noProxy. The LLM gateway does not use a proxy yet.
SSL_CERT_FILE, REQUESTS_CA_BUNDLE, CURL_CA_BUNDLE, NODE_EXTRA_CA_CERTSthe image’s trust storeS D HA PEM bundle to trust instead of the image’s (so it must include the public roots). Helm: global.caBundle, mounted at /etc/futureagi/ca/ca.crt.
LITELLM_LOCAL_MODEL_COST_MAPunset: fetched at startS D HTrue uses litellm’s bundled model price list instead of downloading it. Helm: on with global.airgap.
HF_HUB_OFFLINE, TRANSFORMERS_OFFLINEunsetS D H1 stops the model server from downloading models; pre-seed its cache first. Helm: on (serving only) with global.airgap.

Development overlays (./bin/dev)

Read only by docker-compose.dev.yml and docker-compose.distributed.dev.yml.

KeyDefaultSetupsWhat it does
VITE_ENVIRONMENTdevelopmentdevEnvironment name the Vite dev server builds with.
VITE_GOOGLE_SITE_KEYemptydevreCAPTCHA site key for the Vite dev server.
BACKEND_GRPC_PORT50051devPublished gRPC port of the development backend.
FLOWER_PORT5555devPublished port 5555 of the development backend (task monitor).
PGBOUNCER_PORT6432devPublished PgBouncer port (Distributed dev). The app’s own PGBOUNCER_PORT is set by the compose files.
DEV_API_PROXY_OTLP_MAX_BODY_SIZE, DEV_API_PROXY_CONNECT_TIMEOUT, DEV_API_PROXY_READ_TIMEOUT, DEV_API_PROXY_SEND_TIMEOUT16m, 5s, 30s, 30sdevLimits of the development API proxy.
DOCKER_SOCKET/var/run/docker.sockdevHost Docker socket the local sandbox server (local-sandbox profile) builds with.
ALK_HOST_WORKSPACE_ROOTrequired by the local sandbox serverdevHost directory holding the agent repositories the local sandbox server builds.
ALK_SANDBOX_MAX_CONCURRENCY, ALK_SANDBOX_PORT1, 8788devConcurrency and published port of the local sandbox server.
FI_API_KEY, FI_SECRET_KEYrequired by the local sandbox serverdevOrganization API key pair the local sandbox server files results with. Never set on the simulation runner.

5. Internal: set by the compose files

The compose files set these in environment: blocks, which win over .env, or supervisord sets them inside the app container. Changing them in .env does nothing. Change what they are derived from instead, or use a docker-compose.override.yml if you really mean it.

KeySet toSetupsDerived from / why
PG_HOST, PG_PORT, PGBOUNCER_HOST, PGBOUNCER_PORTpostgres, 5432S DThe bundled Postgres.
CH_HOST, CH_HTTP_PORT, CH_USERclickhouse, 8123, defaultS DThe bundled ClickHouse. CH_PORT is 9000 inside the network (its host port in Distributed is the key of the same name).
REDIS_HOST, REDIS_URL, REDIS_CACHE_URL, REDIS_LOCK_URL, REDIS_STATE_URL, CHANNEL_LAYER_BACKEND, CHANNEL_REDIS_URLthe bundled Redis, databases 0 to 3S DREDIS_PASSWORD in Standalone.
TEMPORAL_HOST127.0.0.1:7233 (S), temporal:7233 (D)S DThe bundled Temporal.
S3_ENDPOINT_URL, S3_ACCESS_KEY, S3_SECRET_KEY, S3_BUCKETthe bundled MinIO, bucket futureagiS DMINIO_ROOT_USER, MINIO_ROOT_PASSWORD.
FI_PG_WRITE, FI_PG_READ, FI_CH_URL, FI_CH_USERNAME, FI_CH_PASSWORD, FI_AUTH_REDIS_ADDR, FI_AUTH_REDIS_PASSWORD, FI_GRPC_ADDR, FI_HTTP_ADDR, FI_ADMIN_ADDR, FI_DEAD_LETTER_FILE, FI_ERROR_FEED_KAFKA_BROKERS and the other FI_* collector settingsthe collector’s addresses and credentialsS DPG_*, REDIS_PASSWORD, CH_DATABASE, CH_USERNAME, CH_PASSWORD, the catalog keys above.
FI_OBSERVED_CATALOG_MODE, FI_OBSERVED_CATALOG_CH_URL, FI_OBSERVED_CATALOG_CH_DATABASE, FI_OBSERVED_CATALOG_CH_USERNAME, FI_OBSERVED_CATALOG_CH_PASSWORD, FI_OBSERVED_CATALOG_SPOOL_DIRS: direct, the catalog’s writer user, spool in /data/collector/observed-catalog; D: kafka and the FI_OBSERVED_CATALOG_KAFKA_* broker and topicS DHow the collector hands on observed attributes. PROPERTY_CATALOG_DATABASE, PROPERTY_CATALOG_CONSUMER_PASSWORD, OBSERVED_CATALOG_KAFKA_TOPIC. FI_PROPERTY_CATALOG_MODE stays disabled: the collector refuses any other value of this retired key.
FI_COLLECTOR_HOST127.0.0.1 (S), fi-collector (D)S DThe setup checks probe the collector there, on its container port 4317 whatever FI_COLLECTOR_OTLP_PORT publishes on the host.
PROPERTY_CATALOG_CH_HOST, PROPERTY_CATALOG_CH_PORT, PROPERTY_CATALOG_CH_USER, PROPERTY_CATALOG_CH_PASSWORDthe catalog’s read-only ClickHouse userS DPROPERTY_CATALOG_API_PASSWORD.
DJANGO_SETTINGS_MODULE, SERVICE_TYPE, NO_STARTUP_DB_MUTATIONS, FI_SKIP_CH25_MIGRATIONfixedS DOnly the bootstrap jobs change the database schema.
FI_EMBEDDED_TEMPORAL_WORKER, TEMPORAL_GRACEFUL_SHUTDOWN_TIMEOUTfixedSThe embedded worker and its drain.
TEMPORAL_TASK_QUEUEone queue per workerDPer-queue workers.
GEMINI_API_KEYGOOGLE_API_KEYS DThe gateway’s name for the Gemini key.
AGENTCC_INTERNAL_URL, AGENTCC_GATEWAY_INTERNAL_URLhttp://127.0.0.1:8080 (S), http://agentcc-gateway:8080 (D)S DThe gateway’s container port, where the app and workers call it. A host-facing URL (the published AGENTCC_GATEWAY_PORT, :8090) exported in the shell must not replace this service-to-service route. Helm sets both to the gateway’s Service.
AGENTCC_CONTROL_PLANE_URL, AGENTCC_CONTROL_PLANE_TOKEN, AGENTCC_SYNC_ON_STARTUPthe API (http://127.0.0.1:8000 in S, http://backend in D), AGENTCC_ADMIN_TOKEN, trueS DThe gateway loads the keys and org settings made in the UI from the app: on start, retrying while the app comes up, and then every minute (AGENTCC_SYNC_INTERVAL, on a gateway that reads it). It posts its request logs there too. Standalone starts its gateway after the bootstrap, so the app is up by then.

Legacy and retired keys

Safe to leave in an old .env; nothing needs them.

KeyStatus
FUTURE_AGI_CLOUD_API_KEY, FUTURE_AGI_CLOUD_API_URLRetired: the compose files no longer pass them, and no code reads them.
RABBITMQ_USER, RABBITMQ_PASSWORDRetired with RabbitMQ; live updates use Redis.
HOSTED_RUNNER_MAX_DURATION_SECONDSRetired: no code reads it. Use HOSTED_RUNNER_MAX_WALLCLOCK_SECONDS.
CH25_DROP_LEGACY_CDC_CHAINLegacy. Kept for explicit migration tooling; installs never read it at start.
COMPOSE_PROFILES=fullOlder name of the Distributed all profile; still accepted. On Standalone it has no effect.

Older .env.example files also carried keys for features this page now documents in their own section (voice simulation, hosted sandboxes, image tags). Keeping them does no harm; empty values fall back to the defaults above, except where a row says otherwise.

Production

Start from Distributed with the production overlay or the Helm chart. deploy/docker-compose.production.yml layered on docker-compose.distributed.yml, with values in deploy/.env.production, refuses to start while a required value is empty (deploy/README.md). Standalone suits a single host; the same checklist applies to it. Work through the production checklist.

Note

This page is generated from deploy/env-reference.toml in the future-agi repository. To correct a row, open a pull request there.

Dive deeper

Was this page helpful?

Questions & Discussion