Skip to content

Docs — Configuration

Configuration

Aphrodite reads runtime configuration from environment variables. You do not need an env file for a local /health trial; the defaults bind to 127.0.0.1:9079 with the public module set.

Copy the example file only when you need non-default host/port, module selection, CORS, production Discord verification, or ACP auth:

cp config/aphrodite.env.example config/aphrodite.env

config/aphrodite.env is local operator configuration and must not be committed.

Core service settings

VariableDefaultUsed byPurpose
APHRODITE_HOST127.0.0.1aphrodite.config.load_configBind host used by CLI/service configuration.
APHRODITE_PORT9079aphrodite.config.load_configBind port. Invalid values fall back to 9079.
APHRODITE_MODULESimage_gen,skillopt,acp_relayaphrodite.config.load_config, aphrodite.app.build_routerModule selection for the dispatch router: unset/empty uses the default trio; +name appends to the built-in modules; a bare comma-separated list replaces them — use bare only to intentionally reduce the set. Unknown names register a placeholder handler.
APHRODITE_CORS_ORIGINSnone (CORS disabled)aphrodite.config.load_config, aphrodite.app.create_appComma-separated browser origins allowed to call HTTP routes cross-origin. Unset → no CORS middleware (loopback-only). Use * to allow any origin (credentials are then disabled per the CORS spec).
HERMES_HOME~/.hermesaphrodite.config, aphrodite.pathsLocates the external Hermes home. If it points at <root>/profiles/<name>, hermes_root() collapses to <root> for shared plugin discovery.
APHRODITE_PUBLIC_BASE_URLnonereadiness/preflight helpersPublic HTTPS origin for endpoint preflight. Do not include /discord/interactions; Aphrodite appends that path when checking the Discord endpoint.

Adapter extension settings

VariableDefaultUsed byPurpose
APHRODITE_ADAPTER_AUTH_TOKENnoneaphrodite.app.create_appBearer token required by discovered adapter HTTP routers when requires_auth is true. Auth-required routes fail closed with 503 when unset; requests must send Authorization: Bearer <token> when set.
APHRODITE_TRUSTED_ADAPTERSnoneadapter discovery, aphrodite doctor, aphrodite modulesComma-separated allowlist of third-party adapter entry-point names that may load. Use with APHRODITE_MODULES=+name to enable only trusted installed adapters; untrusted/configured adapters are surfaced by diagnostics instead of silently loading.
APHRODITE_ADAPTER_LIFESPAN_TIMEOUT30adapter lifespan runnerPer-adapter startup/shutdown timeout in seconds. Lifespan failures and timeouts are isolated and reported so one adapter does not take down unrelated adapters.

Discord interaction and authorization settings

VariableDefaultUsed byPurpose
APHRODITE_DISCORD_PUBLIC_KEYnoneaphrodite.app, aphrodite.discord.signatureDiscord application Ed25519 public key for inbound /discord/interactions signature verification. Production interactions fail closed with 503 when unset.
APHRODITE_DISCORD_BOT_TOKENnonepreflight helpersOutbound Discord bot token used by read-only deployment preflight checks.
APHRODITE_DISCORD_EXPECTED_BOT_IDnoneendpoint/preflight helpersOptional expected bot id checked by live-publish preflight.
APHRODITE_DISCORD_EXPECTED_BOT_USERNAMEnoneendpoint/preflight helpersOptional expected bot username checked by live-publish preflight.

Module runtime overrides

Image generation

VariableDefaultPurpose
APHRODITE_IMAGE_GEN_MODELprofile config or gpt-image-2-mediumSelects one of gpt-image-2-low, gpt-image-2-medium, or gpt-image-2-high.
OPENAI_IMAGE_MODELprofile config or gpt-image-2-mediumSecondary model override checked after APHRODITE_IMAGE_GEN_MODEL.

image_gen authentication is not configured with OPENAI_API_KEY. The HTTP route reads a Hermes Codex/OpenAI OAuth token through the private agent stack; without that private auth it returns auth_required. To use image generation without the Hermes auth stack, call generate_image(payload, client=<your OpenAI client>) programmatically.

SkillOpt

VariableDefaultPurpose
APHRODITE_SKILLOPT_DATA_ROOTdata/skillopt under the repository rootStorage root for SkillOpt runs and evaluations.
SKILLOPT_REPOnoneRepository containing scripts/train.py when a train request does not provide an explicit command.

ACP relay

VariableDefaultPurpose
APHRODITE_ACP_PROFILEforgeHermes profile used when spawning hermes -p <profile> acp.
APHRODITE_ACP_MODEL(unset)Optional model override; only used with APHRODITE_ACP_PROVIDER. When unset, the relay uses the Hermes profile’s configured engine.
APHRODITE_ACP_PROVIDER(unset)Optional provider override; only used with APHRODITE_ACP_MODEL. When unset, the relay uses the Hermes profile’s configured engine.
APHRODITE_ACP_HERMES_BINdiscovered hermes executableBinary used to spawn the external ACP runtime.
APHRODITE_ACP_DB<hermes_root>/aphrodite/acp_relay.sqlite3SQLite conversation store path.
APHRODITE_ACP_CWDshared Hermes rootWorking directory for the ACP subprocess and the base directory for gated request cwd overrides.
APHRODITE_ACP_TURN_TIMEOUT240.0Per-turn timeout in seconds.
APHRODITE_ACP_AUTH_TOKEN(unset; no auth)Optional bearer token for /acp/*. When unset, /acp routes remain open for local use; when set, requests must send Authorization: Bearer <token>.
APHRODITE_ACP_ALLOWED_PROFILES(unset; any profile)Optional comma-separated allowlist for requested conversation profiles. When unset, any profile may be requested.
APHRODITE_ACP_ALLOW_CWD_OVERRIDEfalseAllows request payloads to override cwd only when true; by default request cwd values are ignored and the configured relay cwd is used.
APHRODITE_ACP_AUTO_APPROVEtrueAuto-approves ACP permission prompts and sets HERMES_YOLO_MODE=1 for the subprocess unless already set. Set false to deny permission prompts.
APHRODITE_ACP_ACCEPT_HOOKStrueSets HERMES_ACCEPT_HOOKS=1 for the subprocess unless already set. Set false to avoid accepting Hermes hooks automatically.

The ACP transport sets HERMES_YOLO_MODE=1 and HERMES_ACCEPT_HOOKS=1 in the subprocess environment only while APHRODITE_ACP_AUTO_APPROVE and APHRODITE_ACP_ACCEPT_HOOKS are true. Both default to true so existing headless forge flows keep running.

All /acp/* routes require Authorization: Bearer <token> only when APHRODITE_ACP_AUTH_TOKEN is set. With the default unset token, the routes are open for local deployments.

GET /acp/conversations supports pagination with limit and offset query parameters. limit defaults to 50 and is clamped to a maximum of 200; offset defaults to 0.

POST /acp/conversations/{conversation_id}/turns accepts an idempotency key either in the Idempotency-Key header or as idempotency_key in the JSON payload. The header wins when both are present. A repeated key for the same conversation returns the stored successful response instead of running the transport again.