Skip to content

Runtime configuration reference

alquimia-runtime is configured through environment variables (and an optional .env file). Environment variables always take precedence over values in .env.

The following secrets must be set before the runtime starts. They are never committed to version control.

SecretPurpose
API_TOKENBearer token for all authenticated endpoints. Required at startup in every runtime mode (master, worker, all) and with every AUTH_PROVIDER, including keycloak
POSTGRES_USERNAME / POSTGRES_PASSWORDPostgreSQL credentials. POSTGRES_PASSWORD may be omitted only when VAULT_POSTGRES_ENABLED=true
BLOB_S3_ACCESS_KEY / BLOB_S3_SECRET_KEYS3-compatible blob storage credentials
KAFKA_SIGNING_KEY64-character hex key shared across all runtime instances. Used to sign and verify events between masters and workers

Vault credentials depend on VAULT_AUTH_METHOD: a static VAULT_TOKEN is only used with token auth (local development). Kubernetes deployments use Vault Kubernetes auth instead; see External services.

Optionally, set ENCRYPTION_KEY (64-character hex) to enable application-layer AES-256-GCM encryption of Redis conversations and PostgreSQL worklog data at rest. Leave it empty to store data in plaintext.

VariableRequiredDefaultDescription
BACKEND_SERVER_HOSTNo0.0.0.0Bind address
BACKEND_SERVER_PORTNo8080Listen port
BACKEND_SERVER_WORKERSNo1Uvicorn worker count
BACKEND_TIMEOUT_KEEP_ALIVENo300Keep-alive timeout (seconds)
DEBUGNofalseEnable debug mode and verbose logging
RESPONSE_MAX_RETRIESNo3Max retries for inference responses
A2A_MAX_DEPTHNo5Maximum agent-to-agent call depth
MAX_FILE_CONTENT_SIZENo20971520Max knowledge file upload size in bytes (default 20 MB)
VariableRequiredDefaultDescription
ALQUIMIA_RUNTIME_MODENomastermaster serves the external API (registry read/write); worker consumes Kafka events and opens the registry read-only. Use all for single-process local deployments

In production, run master and worker as separate deployments so they can scale independently. Setting ALQUIMIA_RUNTIME_MODE=worker prevents the local registry from being mutated by inference pods.

The master must run exactly one replica with the Recreate deployment strategy: it is the single writer of the TinyDB registry (guarded by a Redis Redlock). Scale throughput with workers only, up to the partition count of the alquimia.events topic (6 in the shipped manifests); extra workers beyond that sit idle.

VariableRequiredDefaultDescription
API_TOKENYes—Bearer token for all authenticated endpoints. Required on masters and workers, whatever AUTH_PROVIDER is set to
AUTH_PROVIDERNoapi_tokenAuth backend: api_token, jwt, or keycloak
JWT_SECRETConditional""Required when AUTH_PROVIDER=jwt
JWT_ALGORITHMNoHS256JWT signing algorithm
KEYCLOAK_SERVER_URLConditional""Required when AUTH_PROVIDER=keycloak
KEYCLOAK_REALMConditional""Keycloak realm
KEYCLOAK_CLIENT_IDConditional""Keycloak client ID
KEYCLOAK_CLIENT_SECRETConditional""Keycloak client secret
KEYCLOAK_ADMIN_CLIENT_SECRETNo""Falls back to KEYCLOAK_CLIENT_SECRET
KEYCLOAK_CALLBACK_URINo""OAuth callback URI
KEYCLOAK_ACCEPTED_AUDIENCESNoalquimia-runtimeComma-separated accepted token audiences. Must not be empty and must not contain account (startup fails)
KEYCLOAK_ROLE_SOURCE_CLIENTSNoalquimia-runtime,alquimia-studio-service,alquimia-ciComma-separated Keycloak client IDs whose client roles are honoured in addition to realm roles
IS_ALLOWED_CREDENTIALSNotrueCORS allow credentials
ALLOWED_ORIGINSNo["*"]CORS allowed origins. Cannot be ["*"] when IS_ALLOWED_CREDENTIALS=true
ALLOWED_METHODSNo["*"]CORS allowed methods
ALLOWED_HEADERSNo["*"]CORS allowed headers

See Authentication & authorization for the conceptual model and deployment patterns.

Channel webhook endpoints (/event/infer/{assistant_id}/{channel_id}) do not use the global bearer token. The runtime delegates authentication to the channel implementation from alquimia-core.

VariableRequiredDefaultDescription
CHANNEL_AUTH_REQUIREDNotrueRequire every channel to implement provider-specific auth
CHANNEL_MAX_BODY_SIZENo1048576Max channel webhook body size in bytes (default 1 MB)
CHANNEL_RATE_LIMIT_ENABLEDNotrueEnable per-source rate limiting
CHANNEL_RATE_LIMIT_REQUESTSNo60Allowed requests per source per window
CHANNEL_RATE_LIMIT_WINDOW_SECONDSNo60Rate-limit window

See Channels and Connect a channel for provider-specific setup.

The WS /streaming/{assistant_id}/{channel_id} endpoint is used for held-call audio streams such as Twilio Media Streams. The settings below replace the old STREAMING_* variables from earlier runtime versions; the previous names are no longer read.

VariableRequiredDefaultDescription
STREAMING_CHANNEL_AUTH_REQUIREDNotrueRequire channel-specific authentication (for example, Twilio Account SID validation)
STREAMING_CHANNEL_RATE_LIMIT_ENABLEDNotrueEnable per-source concurrent session limits
STREAMING_CHANNEL_MAX_SESSIONS_PER_SOURCENo10Maximum concurrent streaming sessions allowed from a single source
STREAMING_CHANNEL_MAX_SESSION_SECONDSNo3600Maximum lifetime of a streaming session in seconds

See Connect a messaging or voice channel and Runtime API overview for the WebSocket path and message flow.

VariableRequiredDefaultDescription
SPIFFE_ENABLEDNofalseEnable SPIFFE workload identity
SPIFFE_SOCKET_PATHNo/tmp/spire-agent/public/api.sockPath to the SPIFFE Workload API socket
SPIFFE_TRUST_DOMAINNoalquimia.aiSPIFFE trust domain
AGENTSPACE_PROVISIONING_ENABLEDNofalseAutomate SPIRE entries and Vault roles per agentspace
AGENTSPACE_PROVISIONING_INTERVAL_SECONDSNo300Reconciliation interval
AGENTSPACE_PROVISIONING_K8S_NAMESPACENospireNamespace for ClusterStaticEntry CRDs
AGENTSPACE_PROVISIONING_VAULT_JWT_AUTH_PATHNojwtVault JWT auth mount path

When AGENTSPACE_PROVISIONING_ENABLED=true, the master creates or updates SPIRE ClusterStaticEntry CRDs, scoped Vault ACL policies, and JWT auth roles for each agentspace. A background reconciler runs every AGENTSPACE_PROVISIONING_INTERVAL_SECONDS seconds to converge state with the registry list. This is what produces per-agentspace, per-tier identities that agents use to authenticate to Vault.

See Workload hardening and Authorization policies for the Zero Trust deployment pattern.

VariableRequiredDefaultDescription
KAFKA_BOOTSTRAP_SERVERSNolocalhost:9092Broker address(es)
KAFKA_TOPICNoalquimia.eventsTopic for agent events
KAFKA_CONSUMER_GROUPNoalquimia-workersConsumer group for workers
KAFKA_SIGNING_KEYYes""64-character hex signing key shared by all instances
KAFKA_SECURITY_PROTOCOLNoPLAINTEXTSASL_SSL or SSL in production
KAFKA_SASL_MECHANISMNo""SASL mechanism, e.g. SCRAM-SHA-256
KAFKA_SASL_USERNAMENo""SASL username
KAFKA_SASL_PASSWORDNo""SASL password
KAFKA_SSL_CA_FILENo""Path to CA certificate for broker verification
KAFKA_SSL_CERT_FILENo""Path to client certificate for mTLS
KAFKA_SSL_KEY_FILENo""Path to client key for mTLS
KAFKA_SSL_VERIFYNotrueVerify broker certificate hostname
KAFKA_DLQ_TOPICNoalquimia.events.dlqDead-letter topic. Receives events that fail HMAC signature verification and events whose processing raised an error; they are routed there rather than dropped
VariableRequiredDefaultDescription
REDIS_URLNoredis://localhost:6379Redis connection URL. See the TLS caution below before using rediss://
REDIS_TTLNo86400Default TTL for Redis keys (seconds)
POSTGRES_HOSTNolocalhostPostgreSQL host
POSTGRES_PORTNo5432PostgreSQL port
POSTGRES_DBNoalquimiaDatabase name
POSTGRES_USERNAMEYes—Database user
POSTGRES_PASSWORDConditional""Database password. Required unless VAULT_POSTGRES_ENABLED=true, in which case credentials are leased from Vault
POSTGRES_SCHEMANopostgresqlSQLAlchemy schema prefix
DB_POOL_SIZENo60Connection pool size, per process
DB_MAX_POOL_CONNo80Not read by the runtime; the effective per-process ceiling is DB_POOL_SIZE + DB_POOL_OVERFLOW
DB_POOL_OVERFLOWNo20Pool overflow limit, per process
DB_POOL_PRE_PINGNotruePre-ping connections before use
DB_POOL_RECYCLENo1800Connection recycle interval (seconds)
DB_TIMEOUTNo5Query timeout (seconds)
DB_CREATE_ON_STARTUPNofalseAuto-create tables on startup (dev only)
IS_DB_ECHO_LOGNofalseLog all SQL statements
QDRANT_URLNohttp://localhost:6333Qdrant vector store URL
QDRANT_API_KEYNo—Qdrant API key (optional)
ALQUIMIA_KNOWLEDGE_PROVIDERRecommendedqdrantKnowledge-base backend: qdrant, redis, or in_memory. The runtime exports this value to alquimia-core, where it replaces the connector declared on every topic-based, connector-backed knowledge base in the process. Set it explicitly: alquimia-core on its own (CLI/SDK) has no single default — inference keeps the spec’s connector, ingest/rebuild fall back to qdrant, and version rehydration is skipped when it is unset
VAULT_ADDRNovaultHashiCorp Vault address. Use a full URL with scheme and port (for example https://vault.internal:8200); alquimia-core uses the value verbatim
VAULT_MOUNT_POINTNosecretVault KV v2 mount point. cubbyhole does not work (it is a per-token store)
VAULT_AUTH_METHODNotokenVault login method: token, kubernetes, or jwt. Use kubernetes in Kubernetes
VAULT_TOKENConditional""Static Vault token; only used with VAULT_AUTH_METHOD=token (local development). The alquimia-vault Secret was removed from the Kubernetes manifests in favour of Kubernetes auth
VAULT_K8S_ROLEConditional""Vault Kubernetes auth role for the runtime’s own Vault client. Required with kubernetes auth
VAULT_AUTH_ROLEConditional—Vault auth role for the alquimia-core secret resolver (registry secret resolution). Required with kubernetes or jwt auth, in addition to VAULT_K8S_ROLE
VAULT_K8S_TOKEN_PATHNo/var/run/secrets/kubernetes.io/serviceaccount/tokenService-account token used for Kubernetes auth. Point it at a projected token with audience vault
VAULT_JWT_ROLEConditional""Vault JWT auth role for the runtime; required with jwt auth
VAULT_JWT_SVIDConditional""JWT-SVID used for jwt auth. In runtime ≤ 0.5.4 this must contain the token itself, not a file path
VariableRequiredDefaultDescription
BLOB_S3_ENDPOINT_URLYes""S3-compatible endpoint, e.g. http://alarik:8080
BLOB_S3_PROVIDERNoMiniorclone S3 provider name. Keep the default Minio for Alarik and other S3-compatible servers; it is the rclone provider name for generic S3-compatible endpoints, not a MinIO dependency
BLOB_S3_ACCESS_KEYYes""S3 access key
BLOB_S3_SECRET_KEYYes""S3 secret key
BLOB_S3_BUCKET_NAMEYes""Bucket name
BLOB_S3_REGION_NAMENous-east-1S3 region
BLOB_S3_SECURENotrueUse TLS for S3 connections. Has no effect when BLOB_S3_ENDPOINT_URL starts with http://; use an https:// endpoint in production
VariableRequiredDefaultDescription
ALQUIMIA_REGISTRY_DIRNo~/.local/share/alquimiaLocal path for TinyDB registry files
ALQUIMIA_EMBEDDINGS_CONFIG_DIRNo$ALQUIMIA_REGISTRY_DIRDirectory containing embeddings.yaml. The Kubernetes manifests mount it at /var/lib/alquimia/embeddings.yaml and set this to /var/lib/alquimia
ALQUIMIA_OCI_REGISTRY_DEFAULTNoghcr.ioDefault OCI registry for push/pull
ALQUIMIA_OCI_NAMESPACE_AGENTSPACESNoagentsDeployment-owned namespace for agentspace artifacts and their index anchor (0.5.3+)
ALQUIMIA_OCI_NAMESPACE_BRAINSNobrainsDeployment-owned namespace for brain artifacts and their index anchor (0.5.3+)
ALQUIMIA_REGISTRY_SECRET_RESOLVERNovaultSecret resolver backend: vault or env. env reads directly from environment variables
ALQUIMIA_OCI_SIGNATURE_POLICYNorequiredSignature verification policy: required, warn, or off. required aborts on missing/invalid signatures; warn logs and continues; off skips verification. With required and no verification key or keyless identity configured, every pull fails
ALQUIMIA_OCI_COSIGN_PUBKEYNo—Cosign public key (path or KMS/env:// reference) used to verify signatures on pull. Falls back to ALQUIMIA_OCI_COSIGN_KEY
ALQUIMIA_OCI_COSIGN_KEYNo—Cosign signing (private) key used on push. Only works as the verification fallback for KMS/env:// references; for on-disk key pairs set ALQUIMIA_OCI_COSIGN_PUBKEY
ALQUIMIA_OCI_COSIGN_CERT_IDENTITYNo—Keyless verification certificate identity (use with _CERT_OIDC_ISSUER)
ALQUIMIA_OCI_COSIGN_CERT_OIDC_ISSUERNo—Keyless verification OIDC issuer
ALQUIMIA_OCI_INDEX_ENABLEDNofalseEnable OCI 1.1 referrers-based namespace index lifecycle: attach on push, detach on delete, discover for listings (0.5.3+)
ALQUIMIA_OCI_SUBPROCESS_TIMEOUTNo120Timeout in seconds for OCI push/delete_manifest/pull subprocesses running in the asyncio thread pool (0.5.4+)
ALQUIMIA_OCI_COSIGN_SIGN_PUSHNoautoauto signs on push only when a key or keyless identity is configured; true always tries; false never signs
ALQUIMIA_OCI_COSIGN_TLOG_UPLOADNofalseUpload key-based signatures to the public Rekor transparency log
ALQUIMIA_OCI_COSIGN_HOMENotemp dirWritable directory cosign uses as HOME (needed with a read-only root filesystem)
ALQUIMIA_OCI_REFERRERS_FALLBACKNoerrorBehaviour when the registry lacks native OCI referrers support. Only the exact value warn enables ORAS’s fallback; any other value behaves as error. warn accepts silently lost index writes under concurrent attaches
ALQUIMIA_OCI_DEV_MODENofalseEnable insecure ORAS transport flags (dev only)
ORAS_PLAIN_HTTPNofalseUse plain HTTP for ORAS (ignored unless ALQUIMIA_OCI_DEV_MODE=true; keep off in production)
ORAS_INSECURENofalseSkip TLS verification for ORAS (ignored unless ALQUIMIA_OCI_DEV_MODE=true; keep off in production)

Registry credentials for ORAS and cosign come from the Docker config ($DOCKER_CONFIG/config.json, default ~/.docker/config.json).

When ALQUIMIA_REGISTRY_KEY is set, the local TinyDB registry files (metadata.json, <agentspace>/dist.json) are transparently encrypted with AES-256-GCM. The key is a Base64-encoded AES-256 key sourced from Vault or another secret injector.

VariableRequiredDefaultDescription
ALQUIMIA_REGISTRY_KEYNo—Base64-encoded AES-256 key for encryption at rest
ALQUIMIA_REGISTRY_KEY_IDNodefaultKey identifier stored in the ciphertext envelope (rotation support)

Encryption at rest protects against volume or bucket exposure. It does not protect against a compromised runtime process, which can still read decrypted data through the registry APIs. In production, run workers with ALQUIMIA_RUNTIME_MODE=worker so the registry is mounted read-only.

Changing ALQUIMIA_REGISTRY_KEY_ID alongside a new key causes the next write to re-encrypt with the new envelope. If ALQUIMIA_REGISTRY_KEY is absent, the registry falls back to plaintext for backward compatibility.

Registered topic files are stored outside the registry in a pluggable storage backend selected at deployment time.

VariableRequiredDefaultDescription
ALQUIMIA_FILE_STORAGE_PROVIDERNolocalStorage backend: local or s3
ALQUIMIA_FILE_STORAGE_LOCAL_DIRNo$ALQUIMIA_REGISTRY_DIR/filesLocal filesystem root for local provider
ALQUIMIA_FILE_STORAGE_S3_ENDPOINT_URLConditional—Required for s3
ALQUIMIA_FILE_STORAGE_S3_ACCESS_KEYConditional—Required for s3
ALQUIMIA_FILE_STORAGE_S3_SECRET_KEYConditional—Required for s3
ALQUIMIA_FILE_STORAGE_S3_BUCKETConditional—Required for s3
ALQUIMIA_FILE_STORAGE_S3_REGIONNous-east-1AWS region for s3

The same provider is used by search_mode="direct" file reads and by alquimia registry topics add-file.

In alquimia-core ≤ 0.5.6 the s3 provider does not use the AWS default credential chain: set the endpoint URL, access key, and secret key explicitly, even on AWS.

VariableRequiredDefaultDescription
BRAIN_STORENomemoryWhere served brains live: memory, or layout:<root>
BRAIN_CACHE_TTLNo300Seconds before a cached brain is revalidated
BRAIN_CACHE_MAX_BRAINSNo4LRU cache size limit
BRAIN_WARMUP_ENABLEDNotrueOpen registered brains at worker startup
VariableRequiredDefaultDescription
OTEL_COLLECTOR_ENDPOINT_TRACESNo—OTLP HTTP endpoint for traces
OTEL_COLLECTOR_ENDPOINT_LOGSNotraces endpointOTLP HTTP endpoint for logs
OTEL_COLLECTOR_ENDPOINTNo—OTLP HTTP endpoint for metrics
OTEL_ALQUIMIA_SERVICE_NAMENoalquimiaService name reported to OTEL
OTEL_ALQUIMIA_METER_NAMENoalquimia-metricsMeter name for metrics
OTEL_EXPORTER_INTERVAL_MILLISNo5000Metrics export push interval
OTEL_EXCLUDED_ATTRIBUTESNo""Comma-separated metric attribute keys to strip before export

See Observability for how the signals correlate.