Skip to main content

Navin Enterprise (navin-enterprise)

The Navin Enterprise AI platform: Control Plane API, background worker, GPU media worker and portal, on top of LiteLLM (gateway in front of the model providers), OPA, OpenFGA and Keycloak. FinOps and reasoning effort rules are code of the platform, not settings.

Generated from catalog/services/navin-enterprise.yaml: do not edit by hand.

Summary​

Version1.0.0
Useinstall and configure
Layerinfrastructure (shown apart)
CategoryNavin Enterprise
Installation methodspodman, python
External connectionno
Sandbox onlyno

Licence​

SPDX identifierLicenseRef-Navin-Enterprise
Licence policylicence of the publisher
Licence exception-
Licence exceptions of its dependenciesLEX-013 (pending, awaiting the client), LEX-014 (pending, awaiting the client), LEX-017 (pending, awaiting the client), LEX-021 (pending, awaiting the client)
Platform componentcontrol-plane-api

Packages and artifacts​

A package the project of the service publishes (its image, its binary archive, its Python or OS package) carries the licence of the service; a third-party package carries the licence written on its row, read from the official upstream metadata.

KindPackageVersionLicenceDetails
container imageharbor.example.internal/eai/control-plane1.0.0LicenseRef-Navin-Enterpriseimage key control-plane, used by migrate, control-plane, worker
container imageharbor.example.internal/eai/worker1.0.0LicenseRef-Navin-Enterpriseimage key worker, used by media-worker
container imageharbor.example.internal/eai/portal1.0.0LicenseRef-Navin-Enterpriseimage key portal, used by portal
Python packageeai1.0.0LicenseRef-Navin-Enterpriseinterpreters, in order of preference python3.11, python3.12
Python packageragas0.3.2Apache-2.0interpreters, in order of preference python3.11, python3.12
Python packagelangchain-openai0.3.28MITinterpreters, in order of preference python3.11, python3.12
Python packagedatasets4.0.0Apache-2.0interpreters, in order of preference python3.11, python3.12

Images are pinned by tag in the descriptor, and by digest when the descriptor declares one (the offline bundle then refuses a pulled image that does not carry it); the digest is recorded in the mirror of the Manager when the offline bundle is imported, and every pull or load is checked against it.

Supported systems and architectures​

MethodOperating systemsArchitectures
podmanRHEL family (dnf), Debian family (apt), Arch Linux (pacman)x86_64, aarch64 (not restricted by the descriptor)
pythonRHEL family (dnf), Debian family (apt), Arch Linux (pacman)x86_64, aarch64 (not restricted by the descriptor)

Certified host systems: RHEL 8/9/10, Rocky Linux 8/9/10, AlmaLinux 8/9/10, Oracle Linux 8/9, CentOS Stream 9/10, Ubuntu 22.04/24.04, Debian 12, Arch Linux (rolling). The host preflight accepts these systems (other releases of a known family give a warning, end of life releases are refused) and the x86_64 and aarch64 architectures.

GPU: NVIDIA GPU given to the component as CDI devices (nvidia.com/gpu): media-worker.

Prerequisites​

Host​

  • at least 4096 MB of memory (blocking, memory).
  • at least 1 NVIDIA GPU with 0 MB of memory (blocking, gpu).
  • a synchronized clock (warning, time_sync).

Programs the commands and checks of the service start on the host, outside the managed roots: add them to allowed_commands of the agent (see Security of the Navin agent), else the agent refuses them with command_not_allowed: /usr/bin/systemctl.

Network and ports​

ComponentPort namePortOpened in the host firewall
control-planeapi8080/tcpyes
workermetrics9464/tcpyes
media-workermetrics9465/tcpyes
portalhttp3000/tcpyes

Services and connections needed​

Details and resolution: see Dependencies.

Installation methods and modes​

MethodDefaultWhat the method uses
podmanyesthe container images of the descriptor, run by Podman under systemd
python-a Python virtual environment holding the Python packages of the descriptor

Components​

ComponentKindInstallation methodsPorts
Database migration (migrate)one shotpodman, python-
Control Plane API (control-plane)masterpodman, python8080/tcp
Background worker (worker)masterpodman, python9464/tcp
GPU media worker (media-worker)workerpodman9465/tcp
Portal (portal)masterpodman3000/tcp

Standard (standard) (default)​

One API, one worker, one portal; media workers optional.

What the mode deploys:

ComponentPlacement
migratemin 1, max 1
control-planemin 1, max 1
workermin 1, max 1
media-workermin 0
portalmin 1, max 1

High availability (ha)​

Three API and portal replicas behind HAProxy; the worker keeps one active leader (PostgreSQL advisory lock).

What the mode deploys:

ComponentPlacement
migratemin 1, max 1
control-planemin 2, recommended 3
workermin 1, max 2, recommended 2
media-workermin 0
portalmin 2, recommended 3

Install this service​

The install wizard of the Navin Manager plans, validates and runs the installation; you need the services:install permission on the cluster.

  1. Open the wizard. In Clusters, choose the row action Install services of the target cluster. The wizard opens on its first step, Service.

  2. Choose the service. On the Service step, select Navin Enterprise. The card shows the licence LicenseRef-Navin-Enterprise and the dependencies the installation needs. Pick the Method among podman, python (default podman).

  3. Choose the hosts and the mode. On the Hosts step, tick the hosts, then choose the Mode: standard (default), ha. Each mode deploys the components listed in Installation methods and modes. With several components, place each one on its hosts in Component placement (Suggest placement proposes a placement that respects the cardinalities).

  4. Bind the dependencies. On the Bindings step, choose for each dependency (database, redis, litellm, opa, openfga, oidc, qdrant, clickhouse, storage, temporal, livekit, asterisk_ami, asterisk_ari, kamailio, livekit_sip, mem0, cognee, opik, otel, openbao, nats, presidio, docling, clamav, yarax) Install with the platform or Use an existing connection; an optional dependency can stay on No binding.

  5. Configure. On the Configure step, review the parameters (see Configuration parameters); the required ones are rag_embedding_model, memory_embedding_model. Passwords left empty with a generated default are generated and sealed by the Manager.

  6. Review and install. On the Install step the Manager validates the plan and shows the installation order; when it says "The plan is valid. Ready to install.", choose Install. A highly available mode is installed only when its HA checks pass.

  7. Verify. The operation ends when the health checks of every instance pass (see Health checks); the service then shows as running in Services.

High availability​

Clusterreplicas (replication)
High availabilityexternal (external)
Failoverload balancer (load-balancer)
Replicationshared store (shared-store)
Quorumnone (none)
Discoverydatabase (database)
Entry pointload balancer (load-balancer)
Official documentationhttps://docs.haproxy.org/3.2/configuration.html
Referenceshttps://www.postgresql.org/docs/16/high-availability.html

Prerequisites​

PrerequisiteMust be highly availableModesDescription
databaseyeshaThe replicas share their state in PostgreSQL, which must itself be highly available (Patroni cluster).
redisyeshaThe rate limit counters of the replicas live in Redis, which must itself be highly available (Sentinel).
clamavyeshaEvery upload is scanned before ingestion (enforce mode); at least two ClamAV gateways keep uploads flowing when one fails.
yaraxyeshaEvery upload is matched against the YARA-X rules before ingestion; at least two workers keep uploads flowing when one fails.
haproxyyeshaThe API and portal replicas are reached through HAProxy behind a Keepalived virtual IP.

Topology per mode​

ModesHighest catalog levelDistributionQuorum componentFault domainsDescription
standardstandalone (standalone)single (single)-1One API, one worker and one portal, no fault tolerance.
haha (ha)active-active (active-active)-3Stateless API and portal replicas behind HAProxy; the worker runs active-passive through a PostgreSQL advisory lock.

Notes​

  • The replicas hold no local state; the high availability of the platform is bounded by the one of PostgreSQL, Redis and the scanners.

Configuration parameters​

General​

ParameterTypeDefaultAllowed valuesRequiredSecretRestartDescription
Environment (environment)enumproddev, test, staging, prodnononodev, test, staging or prod; prod refuses unsafe settings at startup. (EAI_ENVIRONMENT)
Default language (default_locale)enumfren, frnononoLanguage of the messages when the request does not choose one. (EAI_DEFAULT_LOCALE)
Log level (log_level)enumINFODEBUG, INFO, WARNING, ERRORnononoVerbosity of the Navin logs. (EAI_LOG_LEVEL)

Network​

ParameterTypeDefaultAllowed valuesRequiredSecretRestartDescription
API port (api_port)port8080-nonoyesListening port of the Control Plane API. (EAI_PORT)
Portal port (portal_port)port3000-nonoyesListening port of the portal.
Public API URL (public_api_url)urlhttps://{{ host.fqdn }}:{{ config.api_port }}-nononoAddress of the API as the browsers see it (NEXT_PUBLIC_EAI_API_URL, usually the APISIX gateway).
Public portal URL (public_portal_url)urlhttps://{{ host.fqdn }}:{{ config.portal_port }}-nononoAddress of the portal (NEXT_PUBLIC_BASE_URL and default CORS origin).
CORS origins (cors_origins)list[]-nononoBrowser origins allowed to call the API (empty: the public portal URL). (EAI_CORS_ORIGINS)
Allowed hosts (allowed_hosts)list["*"]-nononoHost header allowlist of the API. (EAI_ALLOWED_HOSTS)
Trusted proxies (trusted_proxies)list["127.0.0.1/32", "::1/128"]-nononoPeers allowed to set X-Forwarded-For and X-SPIFFE-ID (APISIX and HAProxy hosts). (EAI_TRUSTED_PROXIES)

Database​

ParameterTypeDefaultAllowed valuesRequiredSecretRestartDescription
Pool minimum (db_pool_min)int1min 0nononoMinimum PostgreSQL connections per process. (EAI_DB_POOL_MIN)
Pool maximum (db_pool_max)int10min 1, max 500nononoMaximum PostgreSQL connections per process. (EAI_DB_POOL_MAX)

Security​

ParameterTypeDefaultAllowed valuesRequiredSecretRestartDescription
TLS (tls_enabled)boolfalse-nonoyesServe the Control Plane API (uvicorn), the portal (HTTPS front in the portal container, Next.js standalone has no TLS listener) and the Prometheus listeners of the workers in HTTPS with the host certificate issued by the Manager CA. Chain: browser to the bank HTTPS gateway (public_portal_url and public_api_url name the gateway, which presents the certificate of the bank and trusts the Manager CA towards the hosts), gateway or HAProxy to the API and the portal in HTTPS (Manager CA), API and workers to their providers in HTTPS, rediss, tls or verify-full with the public roots plus the Manager CA. Off: plain HTTP on the hosts, behind a gateway that terminates TLS.
SPIFFE authentication (auth_spiffe)boolfalse-nononoAccept workload identities from SPIRE (X-SPIFFE-ID from trusted proxies). (EAI_AUTH_SPIFFE)
OIDC audience (oidc_audience)stringcontrol-plane-nononoAudience required in the access tokens. (EAI_OIDC_AUDIENCE)
Group synchronisation (oidc_group_sync)booltrue-nononoApply the directory group mappings at each OIDC authentication. (EAI_OIDC_GROUP_SYNC)
Portal client (portal_client_id)stringportal-nononoOIDC public client of the portal.
Master key (master_key)passwordgenerated-noyesnoEncryption key of the platform secrets stored in the database. (EAI_MASTER_KEY)
Default policy decision (policy_default)enumdenyallow, denynononoDecision when OPA gives no answer. (EAI_POLICY_DEFAULT)
API documentation (docs_enabled)boolfalse-nononoServe /docs, /redoc and /openapi.json. (EAI_DOCS_ENABLED)
Security headers (security_headers_enabled)booltrue-nononoAdd the security headers to every answer. (EAI_SECURITY_HEADERS_ENABLED)
HSTS (hsts_enabled)booltrue-nononoSend Strict-Transport-Security. (EAI_HSTS_ENABLED)
HSTS lifetime (hsts_max_age_seconds)int31536000min 0nononomax-age of HSTS in seconds. (EAI_HSTS_MAX_AGE_SECONDS)
Maximum body (max_body_bytes)int10485760min 1024nononoLargest request body in bytes. (EAI_MAX_BODY_BYTES)
Maximum upload (max_upload_bytes)int104857600min 1024nononoLargest media, document or import upload in bytes. (EAI_MAX_UPLOAD_BYTES)
JSON depth (max_json_depth)int64min 4, max 1024nononoDeepest JSON nesting accepted. (EAI_MAX_JSON_DEPTH)
Rate limits (rate_limit_enabled)booltrue-nononoEnforce the request rate limits. (EAI_RATE_LIMIT_ENABLED)
Requests per minute (rate_limit_per_minute)int1200min 1nononoPer principal, or per client IP when anonymous. (EAI_RATE_LIMIT_PER_MINUTE)
Gateway requests per minute (rate_limit_gateway_per_minute)int600min 1nononoPer principal on /v1/gateway/*. (EAI_RATE_LIMIT_GATEWAY_PER_MINUTE)
Authentication failures per minute (rate_limit_auth_failures_per_minute)int20min 1nononoPer client IP, then 429. (EAI_RATE_LIMIT_AUTH_FAILURES_PER_MINUTE)
JWT algorithms (jwt_algorithms)list["RS256", "PS256", "ES256"]-nononoSignature algorithms accepted in the tokens. (EAI_JWT_ALGORITHMS)
JWT leeway (jwt_leeway_seconds)int30min 0, max 300nononoClock skew tolerated on token times, in seconds. (EAI_JWT_LEEWAY_SECONDS)
Private egress allowlist (egress_private_allowlist)list[]-nononoExtra private destinations (host, host:port, *.suffix or CIDR); the bound LiteLLM is always added. (EAI_EGRESS_PRIVATE_ALLOWLIST)
Public egress ports (egress_allowed_ports)list[443]-nononoPorts allowed for public destinations. (EAI_EGRESS_ALLOWED_PORTS)
Plain HTTP egress (egress_allow_http)boolfalse-nononoAllow plain HTTP to public destinations (never in prod). (EAI_EGRESS_ALLOW_HTTP)
Egress DNS timeout (egress_dns_timeout_seconds)float3.0min 0.1, max 60nononoSeconds allowed for the DNS check of an outbound call. (EAI_EGRESS_DNS_TIMEOUT_SECONDS)
Prompt injection mode (prompt_injection_default_mode)enumblockoff, detect, blocknononoDefault of the tenants: off, detect or block. (EAI_PROMPT_INJECTION_DEFAULT_MODE)
Streaming DLP holdback (stream_dlp_holdback_chars)int128min 0, max 8192nononoCharacters held back at the end of a stream for the DLP. (EAI_STREAM_DLP_HOLDBACK_CHARS)
Portal idle timeout (idle_timeout_minutes)int30min 1, max 1440nononoMinutes of inactivity before the portal signs out (NEXT_PUBLIC_EAI_IDLE_TIMEOUT_MINUTES).
File scan timeout (file_scan_timeout_seconds)int60min 5, max 900, snononoTimeout of one scan per engine and per instance before the next instance is tried (EAI_FILE_SCAN_TIMEOUT_SECONDS).
Largest scanned file (file_scan_max_bytes)int52428800min 1024, max 4194304000nononoPlatform limit of an uploaded file in bytes (EAI_FILE_SCAN_MAX_BYTES); a tenant policy can only lower it. The rendered value is the lower of this one and the StreamMaxLength of ClamAV; the archive limits of the platform (EAI_FILE_SCAN_ARCHIVE_MAX_MEMBER_BYTES, EAI_FILE_SCAN_ARCHIVE_MAX_TOTAL_BYTES) come from the MaxFileSize and MaxScanSize of ClamAV. Keep the YARA-X limit at least as high.

Models and media​

ParameterTypeDefaultAllowed valuesRequiredSecretRestartDescription
RAG embedding model (rag_embedding_model)string--yesnonoRegistry model of a new knowledge base, an embedding model served through the LiteLLM gateway (local-hash-256 is refused in production). (EAI_RAG_EMBEDDING_MODEL)
Memory embedding model (memory_embedding_model)string--yesnonoEmbedding model of the agent memory, a registry model served through the LiteLLM gateway. (EAI_MEMORY_EMBEDDING_MODEL)
Rerank model (rag_rerank_model)string(empty)-nononoRegistry model with the rerank capability (empty: none). (EAI_RAG_RERANK_MODEL)
Embedding batch (embeddings_batch_size)int64min 1, max 2048nononoTexts per gateway call. (EAI_EMBEDDINGS_BATCH_SIZE)
Media job kinds (media_kinds)list["stt", "diarization", "tts"]-nononoOne to three of stt, diarization, tts handled by the media worker (--kind).
Media stream (media_stream)stringEAI_MULTIMODAL-nononoNATS JetStream stream of the media jobs (--stream).

Integrations​

ParameterTypeDefaultAllowed valuesRequiredSecretRestartDescription
OpenBao token (openbao_token)password--noyesnoToken of the Control Plane in OpenBao (AppRole or periodic token, never the root token). (EAI_OPENBAO_TOKEN)
Voice worker token (voice_worker_token)password--noyesnoAPI key of a tenant with the scope telephony:voice-worker, created in Navin Enterprise. The Manager seals it and gives it only to the livekit-agents workers (worker_token of the api endpoint); empty: the workers refuse to start.
OpenBao KV mount (openbao_kv_mount)stringsecret-nononoMount of the KV secrets engine. (EAI_OPENBAO_KV_MOUNT)
OpenBao Transit mount (openbao_transit_mount)stringtransit-nononoMount of the Transit engine. (EAI_OPENBAO_TRANSIT_MOUNT)
Audit signing key (openbao_audit_signing_key)stringeai-audit-export-nononoTransit key signing the WORM audit exports. (EAI_OPENBAO_AUDIT_SIGNING_KEY)
Audit signing (audit_signing)enumautoauto, transit, hmacnononoauto (Transit when OpenBao is bound, else HMAC), transit or hmac. (EAI_AUDIT_SIGNING)
OpenFGA store (openfga_store_id)string(empty)-nononoStore id (empty: created at the first start). (EAI_OPENFGA_STORE_ID)
OpenFGA model (openfga_model_id)string(empty)-nononoAuthorisation model id (empty: the latest). (EAI_OPENFGA_MODEL_ID)
Temporal namespace (temporal_namespace)stringdefault-nononoNamespace of the schedules (when Temporal is bound). (EAI_TEMPORAL_NAMESPACE)
Temporal task queue (temporal_task_queue)stringeai-nononoTask queue of the workflows. (EAI_TEMPORAL_TASK_QUEUE)
Opik project (opik_project)stringnavin-evaluations-nononoProject of the evaluation traces (when Opik is bound). (OPIK_PROJECT_NAME)
Audit bucket (s3_bucket)stringeai-audit-worm-nononoBucket of the WORM audit archive and of the media (object lock enabled). (EAI_S3_BUCKET)
S3 KMS key (s3_kms_key_id)string(empty)-nononoServer side encryption key id (empty: bucket default). (EAI_S3_KMS_KEY_ID)
ClickHouse table (clickhouse_table)stringeai_events-nononoTable of the analytics export. (EAI_CLICKHOUSE_TABLE)

Observability and SIEM​

ParameterTypeDefaultAllowed valuesRequiredSecretRestartDescription
Metrics token (metrics_token)passwordgenerated-noyesnoBearer token of GET /metrics (required outside dev and test). (EAI_METRICS_TOKEN)
Traces (otel_enabled)booltrue-nononoExport OpenTelemetry spans (when the collector is bound). (EAI_OTEL_ENABLED)
SIEM actions (siem_forward_actions)stringsecurity.*,policy.*,incident.*,approval.*,secret.*,api_key.*,audit.*,dlp.*,authz.write,authz.delete,member.*,provider.disable,model.disable,agent.kill,agent.suspend,multimodal.dlp-nononoAudit actions forwarded to the SIEM (denials and failures always are). (EAI_SIEM_FORWARD_ACTIONS)
SIEM syslog host (siem_syslog_host)string(empty)-nononoSyslog receiver of the SIEM (empty: off). (EAI_SIEM_SYSLOG_HOST)
SIEM syslog port (siem_syslog_port)port6514-nononoPort of the syslog receiver. (EAI_SIEM_SYSLOG_PORT)
SIEM syslog protocol (siem_syslog_proto)enumtlsudp, tcp, tlsnononoudp, tcp or tls. (EAI_SIEM_SYSLOG_PROTO)
Worker metrics port (worker_metrics_port)port9464-nononoPrometheus port of python -m eai.worker (EAI_WORKER_METRICS_PORT).
Media worker metrics port (media_worker_metrics_port)port9465-nononoPrometheus port of python -m eai.media_worker (EAI_MEDIA_WORKER_METRICS_PORT).

FinOps and audit​

ParameterTypeDefaultAllowed valuesRequiredSecretRestartDescription
Budget alert thresholds (finops_alert_thresholds)string50,80,100-nononoPercent of a budget or quota raising an alert (the FinOps rules themselves are code). (EAI_FINOPS_ALERT_THRESHOLDS)
WORM retention (audit_worm_retention_days)int365min 1nononoDays the WORM audit exports are kept. (EAI_AUDIT_WORM_RETENTION_DAYS)

Background tuning​

ParameterTypeDefaultAllowed valuesRequiredSecretRestartDescription
Worker tick (worker_tick_seconds)float5.0min 0.0nononoSeconds between two scheduler passes. (EAI_WORKER_TICK_SECONDS) (advanced)
Scheduler interval (worker_scheduler_interval_seconds)int30min 0nononoSeconds between scheduler runs. (EAI_WORKER_SCHEDULER_INTERVAL_SECONDS) (advanced)
Outbox interval (worker_outbox_interval_seconds)int10min 0nononoSeconds between outbox drains. (EAI_WORKER_OUTBOX_INTERVAL_SECONDS) (advanced)
Quota expiry interval (worker_quota_expiry_interval_seconds)int60min 0nononoSeconds between quota expiry runs. (EAI_WORKER_QUOTA_EXPIRY_INTERVAL_SECONDS) (advanced)
Heartbeat interval (worker_heartbeat_interval_seconds)int60min 0nononoSeconds between heartbeat checks. (EAI_WORKER_HEARTBEAT_INTERVAL_SECONDS) (advanced)
Heartbeat timeout (worker_heartbeat_timeout_seconds)int1800min 0nononoSeconds without heartbeat before an agent is stale. (EAI_WORKER_HEARTBEAT_TIMEOUT_SECONDS) (advanced)
Approval expiry interval (worker_approval_expiry_interval_seconds)int60min 0nononoSeconds between approval expiry runs. (EAI_WORKER_APPROVAL_EXPIRY_INTERVAL_SECONDS) (advanced)
Retention interval (worker_retention_interval_seconds)int86400min 0nononoSeconds between retention runs. (EAI_WORKER_RETENTION_INTERVAL_SECONDS) (advanced)
Worker batch (worker_batch_size)int100min 0nononoRows per worker batch. (EAI_WORKER_BATCH_SIZE) (advanced)
Audit chain check (worker_verify_chain_interval_seconds)int3600min 0nononoSeconds between audit chain verifications. (EAI_WORKER_VERIFY_CHAIN_INTERVAL_SECONDS) (advanced)
Gauges interval (worker_gauges_interval_seconds)int30min 0nononoSeconds between gauge refreshes. (EAI_WORKER_GAUGES_INTERVAL_SECONDS) (advanced)
Reindex interval (worker_embeddings_reindex_interval_seconds)int60min 0nononoSeconds between reindex runs. (EAI_WORKER_EMBEDDINGS_REINDEX_INTERVAL_SECONDS) (advanced)
Media requeue (worker_media_requeue_seconds)int60min 0nononoSeconds between media requeue runs. (EAI_WORKER_MEDIA_REQUEUE_SECONDS) (advanced)
Analytics export interval (worker_analytics_export_seconds)int60min 0nononoSeconds between analytics exports. (EAI_WORKER_ANALYTICS_EXPORT_SECONDS) (advanced)
Analytics batch (analytics_export_batch)int5000min 0nononoRows per ClickHouse insert. (EAI_ANALYTICS_EXPORT_BATCH) (advanced)
Analytics batches per run (analytics_export_max_batches)int20min 0nononoInserts per source and per run. (EAI_ANALYTICS_EXPORT_MAX_BATCHES) (advanced)
Analytics lag (analytics_export_lag_seconds)float5.0min 0.0nononoRows younger than this wait for the next run. (EAI_ANALYTICS_EXPORT_LAG_SECONDS) (advanced)
SIEM forward interval (worker_siem_forward_seconds)int30min 0nononoSeconds between SIEM forwards. (EAI_WORKER_SIEM_FORWARD_SECONDS) (advanced)
SIEM batch (siem_forward_batch)int500min 0nononoAudit events per tenant and per run. (EAI_SIEM_FORWARD_BATCH) (advanced)
WORM export interval (worker_audit_worm_seconds)int3600min 0nononoSeconds between WORM exports. (EAI_WORKER_AUDIT_WORM_SECONDS) (advanced)
Media job lease (media_job_lease_seconds)int900min 0nononoA running job older than this is requeued. (EAI_MEDIA_JOB_LEASE_SECONDS) (advanced)
Media job attempts (media_job_max_attempts)int3min 0nononoClaims before a job fails. (EAI_MEDIA_JOB_MAX_ATTEMPTS) (advanced)
Media poll (media_worker_poll_seconds)float2.0min 0.0nononoDatabase polling interval without NATS. (EAI_MEDIA_WORKER_POLL_SECONDS) (advanced)
Media heartbeat (media_worker_heartbeat_seconds)float60.0min 0.0nononoupdated_at refresh while a job runs. (EAI_MEDIA_WORKER_HEARTBEAT_SECONDS) (advanced)
Realtime token lifetime (realtime_ws_token_ttl_seconds)int300min 0nononoLifetime of a single use ws_token. (EAI_REALTIME_WS_TOKEN_TTL_SECONDS) (advanced)
Realtime message size (realtime_ws_max_message_bytes)int1048576min 0nononoLargest WebSocket message. (EAI_REALTIME_WS_MAX_MESSAGE_BYTES) (advanced)
Realtime event rate (realtime_ws_max_events_per_second)float50.0min 0.0nononoSustained client event rate. (EAI_REALTIME_WS_MAX_EVENTS_PER_SECOND) (advanced)
Realtime burst (realtime_ws_burst)int100min 0nononoClient events allowed in a burst. (EAI_REALTIME_WS_BURST) (advanced)
Realtime session length (realtime_ws_max_session_seconds)int3600min 0nononoConnection duration limit. (EAI_REALTIME_WS_MAX_SESSION_SECONDS) (advanced)
Realtime idle timeout (realtime_ws_idle_timeout_seconds)int120min 0nononoIdle time before closing. (EAI_REALTIME_WS_IDLE_TIMEOUT_SECONDS) (advanced)

Dependencies​

For each active dependency the Manager takes the first of: the binding chosen in the wizard; a service of the same installation that provides it; a service already installed in the cluster; the only connection of the expected type. Otherwise an optional dependency stays unbound, and a required one is added to the installation in its default mode (the column below names the catalog service added).

BindingProvided byConnection typeEndpointOptionalWhen nothing is boundDescription
databasepostgresqlpostgresqlsqlnopostgresql is added to the installationDatabase of the platform (schema eai).
redisredisredisredisnoredis is added to the installationRate limit counters shared by the replicas (rediss with an ACL user in production).
litellmlitellm-adminnolitellm is added to the installationModel gateway: every model call goes through LiteLLM.
opaopa-apinoopa is added to the installationPolicy decision point of the gateways.
openfgaopenfga-httpnoopenfga is added to the installationRelationship based authorisation.
oidckeycloakoidchttpnokeycloak is added to the installationOpenID Connect provider of the users (Keycloak, or LemonLDAP::NG when it is installed instead, or any OIDC provider declared as a connection).
qdrantqdrantqdranthttpnoqdrant is added to the installationVector store of the knowledge bases and of the memory.
clickhouseclickhouseclickhousehttpnoclickhouse is added to the installationAnalytics store (export of usage and costs) and real-time telemetry of the machines and services (database navin_manager).
storageseaweedfss3s3noseaweedfs is added to the installationObject storage of the platform (SeaweedFS by default): media, files and the WORM audit archive.
temporaltemporal-httpyesstays unbound (optional)Durable schedules and workflows.
livekitlivekit-signalyesstays unbound (optional)Realtime voice and video.
asterisk_amiasterisk-amiyesstays unbound (optional)Asterisk Manager Interface of the PBX pool: user name and secret used to deliver the managed files and read the events.
asterisk_ariasterisk-ariyesstays unbound (optional)Asterisk REST Interface of the PBX pool: user name and password of the call control and of the recordings.
kamailiokamailio-sipyesstays unbound (optional)SIP edge: addresses of the Kamailio instances and, once Kamailio declares it on this endpoint, the auth_ephemeral shared secret of the softphone credentials.
livekit_siplivekit-sip-sipyesstays unbound (optional)LiveKit SIP gateway reached by the AI branch of the PBX pools.
mem0mem0-apiyesstays unbound (optional)Mem0 server: persistent facts and memories of the agents, reached with the admin API key of the instance.
cogneecognee-apiyesstays unbound (optional)Cognee API: knowledge graph and relations of the agents, reached with the service API key.
opikopik-apiyesstays unbound (optional)Evaluation tracking (ragas results).
otelotel-collector-otlp_httpyesstays unbound (optional)OpenTelemetry traces over OTLP HTTP.
openbaoopenbao-apiyesstays unbound (optional)Secrets (KV) and audit signing (Transit).
natsnatsnatsclientyesstays unbound (optional)Agent events and media job notices (JetStream).
presidiopresidio-analyzeryesstays unbound (optional)PII detection of the DLP.
doclingdocling-apiyesstays unbound (optional)Document conversion of the ingestion.
clamavclamav-apinoclamav is added to the installationClamAV gateways that scan every uploaded file before ingestion (enforce mode, all instances).
yaraxyara-x-apinoyara-x is added to the installationYARA-X workers that match every uploaded file against the rules before ingestion (enforce mode, all instances).

Endpoints​

EndpointSchemeComponentPortPathTLS parameterBinding parametersBinding secretsProvisioning command
apihttpcontrol-plane8080 (api_port)-tls_enabled-worker_token-
portalhttpportal3000 (portal_port)-tls_enabled---

Commands​

CommandComponentTargetDescription
Apply the migrations (migrate)migratefirst hostRuns python -m eai.migrate (also run before every start by the migrate component).
API logs (logs)control-planechosen hostLast lines of the API journal.
Worker logs (worker_logs)workerchosen hostLast lines of the worker journal.

Health checks​

Liveness (per instance)​

ComponentCheckDetails
control-planeHTTP {{ 'https' if config.tls_enabled else 'http' }}://{{ host.fqdn if config.tls_enabled else (host.ip or '127.0.0.1') }}:{{ config.api_port }}/healthzExpected 200; 60 retries; interval 2 s; timeout 5 s
workerHTTP {{ 'https' if config.tls_enabled else 'http' }}://{{ host.fqdn if config.tls_enabled else (host.ip or '127.0.0.1') }}:{{ config.worker_metrics_port }}/metricsExpected 200; 60 retries; interval 2 s; timeout 5 s
media-workerHTTP {{ 'https' if config.tls_enabled else 'http' }}://{{ host.fqdn if config.tls_enabled else (host.ip or '127.0.0.1') }}:{{ config.media_worker_metrics_port }}/metricsExpected 200; 60 retries; interval 2 s; timeout 5 s
portalHTTP {{ 'https' if config.tls_enabled else 'http' }}://{{ host.fqdn if config.tls_enabled else (host.ip or '127.0.0.1') }}:{{ config.portal_port }}/Expected 200; 60 retries; interval 2 s; timeout 5 s

Readiness (service check)​

CheckDetails
HTTP {{ 'https' if config.tls_enabled else 'http' }}://{{ host.fqdn if config.tls_enabled else (host.ip or '127.0.0.1') }}:{{ config.api_port }}/readyzExpected 200; 10 retries; interval 3 s; timeout 5 s

Preflight checks​

CheckTypeMeaningSeverityComponents
memorymemory_mb {"min": 4096}at least 4096 MB of memoryblockingevery component
api_port_freeport_free {"param": "api_port"}port 8080 free on the hostblockingcontrol-plane
portal_port_freeport_free {"param": "portal_port"}port 3000 free on the hostblockingportal
gpugpu {"min_count": 1}at least 1 NVIDIA GPU with 0 MB of memoryblockingmedia-worker
time_synctime_sync {}a synchronized clockwarningevery component

Uninstall​

Paths removed when the data is purged: {{ paths.data }}, {{ paths.log }}.

  • Portal: {{ config.public_portal_url }}
  • API health: {{ 'https' if config.tls_enabled else 'http' }}://{{ host.fqdn }}:{{ config.api_port }}/healthz

Upstream documentation​