<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Reference on GENIE.AI</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/reference/</link><description>Recent content in Reference on GENIE.AI</description><generator>Hugo</generator><language>en</language><atom:link href="https://genie-ai-7e342b.opensource.unicc.org/docs/reference/index.xml" rel="self" type="application/rss+xml"/><item><title>Environment variables (single source)</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/reference/env-vars/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/reference/env-vars/</guid><description>&lt;h2 id="purpose"&gt;Purpose&lt;/h2&gt;
&lt;p&gt;This page is the &lt;strong&gt;single source of truth&lt;/strong&gt; for GENIE.AI environment
variables. It supersedes the three divergent tables that previously lived in
&lt;code&gt;deploy/install-guide.md&lt;/code&gt;, &lt;code&gt;deploy/docker-compose-setup.md&lt;/code&gt;, and
&lt;code&gt;deploy/docker-swarm-setup.md&lt;/code&gt; (22 drift errors in Wave 1).&lt;/p&gt;
&lt;p&gt;The defaults are pulled from the root &lt;code&gt;env&lt;/code&gt; file and
&lt;code&gt;docker-compose.yaml&lt;/code&gt;. When a default disagrees with this table, &lt;strong&gt;fix the
source first&lt;/strong&gt; (the file in the repo), then regenerate.&lt;/p&gt;
&lt;h2 id="required-secrets-no-default--must-be-set"&gt;Required secrets (no default — must be set)&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Variable&lt;/th&gt;
 &lt;th&gt;Used by&lt;/th&gt;
 &lt;th&gt;Notes&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ARANGO_PASSWORD&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;backend, dataprep, retriever, document-repository&lt;/td&gt;
 &lt;td&gt;Root DB password. Must be URL-safe; avoid &lt;code&gt;+&lt;/code&gt;, &lt;code&gt;/&lt;/code&gt;, &lt;code&gt;=&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;POSTGRES_PASSWORD&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;postgres (kong-db, keycloak-db)&lt;/td&gt;
 &lt;td&gt;Kong + Keycloak shared PostgreSQL instance&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;KONG_DB_PASSWORD&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;kong-db, kong&lt;/td&gt;
 &lt;td&gt;Dedicated Kong DB user&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;KEYCLOAK_DB_PASSWORD&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;keycloak-db, keycloak&lt;/td&gt;
 &lt;td&gt;Dedicated Keycloak DB user&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;KEYCLOAK_ADMIN_PASSWORD&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;keycloak&lt;/td&gt;
 &lt;td&gt;Master admin console password&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;KEYCLOAK_CLIENT_SECRET&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;backend (BFF)&lt;/td&gt;
 &lt;td&gt;OIDC client secret for &lt;code&gt;genie-app&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;KEYCLOAK_PROXY_CLIENT_SECRET&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;backend (admin proxy)&lt;/td&gt;
 &lt;td&gt;Service account secret for Admin API proxy&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;KC_DATAPREP_CLIENT_SECRET&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;dataprep&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;client_credentials&lt;/code&gt; grant secret&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;EMAIL_HOST&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;keycloak&lt;/td&gt;
 &lt;td&gt;SMTP server hostname&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;EMAIL_PORT&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;keycloak&lt;/td&gt;
 &lt;td&gt;SMTP server port (default 587)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;EMAIL_USER&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;keycloak&lt;/td&gt;
 &lt;td&gt;SMTP username&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;EMAIL_PASSWORD&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;keycloak&lt;/td&gt;
 &lt;td&gt;SMTP password&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;EMAIL_FROM&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;keycloak&lt;/td&gt;
 &lt;td&gt;From address for user-verification emails&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;HUGGING_FACE_HUB_TOKEN&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;vllm, embedding, reranker (via HF_TOKEN)&lt;/td&gt;
 &lt;td&gt;Required to pull models&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;VLLM_API_KEY&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;all OPEA clients&lt;/td&gt;
 &lt;td&gt;Bearer token sent as &lt;code&gt;Authorization: Bearer&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;GRAFANA_ADMIN_PASSWORD&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;grafana&lt;/td&gt;
 &lt;td&gt;Required when &lt;code&gt;ENABLE_OBSERVABILITY=1&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;GENIE_ADMIN_PASSWORD&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;backend (BFF)&lt;/td&gt;
 &lt;td&gt;Realm-level admin bootstrap password — created on first run if absent. See &lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/configure/keycloak-admin-guide/"&gt;Keycloak Admin Guide&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="keycloak-realm--oidc-clients-defaults--override-per-deployment"&gt;Keycloak realm &amp;amp; OIDC clients (defaults — override per deployment)&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Variable&lt;/th&gt;
 &lt;th&gt;Default&lt;/th&gt;
 &lt;th&gt;Used by&lt;/th&gt;
 &lt;th&gt;Notes&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;KEYCLOAK_URL&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;https://localhost/auth&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;backend, frontend, mobile&lt;/td&gt;
 &lt;td&gt;Public URL users reach your Keycloak at. BFF validates tokens against &lt;code&gt;&amp;lt;KEYCLOAK_URL&amp;gt;/realms/&amp;lt;KEYCLOAK_REALM&amp;gt;&lt;/code&gt;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;KEYCLOAK_REALM&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;genie&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;backend, frontend, mobile&lt;/td&gt;
 &lt;td&gt;Realm name. Switch via Keycloak admin console dropdown.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;KEYCLOAK_CLIENT_ID&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;genie-app&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;backend, frontend&lt;/td&gt;
 &lt;td&gt;Web SPA OIDC client id (must match the realm client).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;KC_DATAPREP_CLIENT_ID&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;dataprep-service-client&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;dataprep&lt;/td&gt;
 &lt;td&gt;Service-account client for the &lt;code&gt;client_credentials&lt;/code&gt; grant.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;KC_MOBILE_CLIENT_ID&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;genie-mobile-&amp;lt;institution&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;mobile&lt;/td&gt;
 &lt;td&gt;Mobile OIDC client id (PKCE flow). Per-flavor suffix — see &lt;code&gt;mobile/genie_ai_mobile/lib/config/flavors/&amp;lt;flavor&amp;gt;.dart&lt;/code&gt; (e.g. &lt;code&gt;genie-mobile-itu&lt;/code&gt;).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;KC_MOBILE_REDIRECT_SCHEME&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;com.&amp;lt;institution&amp;gt;.genieai&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;mobile&lt;/td&gt;
 &lt;td&gt;Deep-link scheme registered on Android/iOS for the OIDC redirect. Android package convention (&lt;code&gt;com.&amp;lt;institution&amp;gt;.genieai[.&amp;lt;flavor&amp;gt;]&lt;/code&gt;).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="realm-level-admin-bootstrap-defaults--override-per-deployment"&gt;Realm-level admin bootstrap (defaults — override per deployment)&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Variable&lt;/th&gt;
 &lt;th&gt;Default&lt;/th&gt;
 &lt;th&gt;Used by&lt;/th&gt;
 &lt;th&gt;Notes&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;GENIE_ADMIN_USERNAME&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;genie-admin&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;backend (BFF)&lt;/td&gt;
 &lt;td&gt;Realm-level admin username; created on first run if absent.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;GENIE_ADMIN_EMAIL&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;em&gt;(unset)&lt;/em&gt;&lt;/td&gt;
 &lt;td&gt;backend (BFF)&lt;/td&gt;
 &lt;td&gt;Email for the bootstrap admin user; recommended for &lt;code&gt;emailVerified: true&lt;/code&gt; on first login.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;TRANSLATION_CACHE_PASSWORD&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;em&gt;(random per-service, persisted in volume)&lt;/em&gt;&lt;/td&gt;
 &lt;td&gt;backend (BFF)&lt;/td&gt;
 &lt;td&gt;Password for the translation-cache Redis user (set when a Redis password is enabled).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="deployment-specific"&gt;Deployment-specific&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Variable&lt;/th&gt;
 &lt;th&gt;Default&lt;/th&gt;
 &lt;th&gt;Used by&lt;/th&gt;
 &lt;th&gt;Notes&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;VLLM_TRANSLATION_MODEL_ID&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;google/gemma-3-4b-it&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;translation&lt;/td&gt;
 &lt;td&gt;e.g. &lt;code&gt;facebook/m2m100-418M&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;EMBEDDING_MODEL_ID&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;BAAI/bge-large-en-v1.5&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;embedding&lt;/td&gt;
 &lt;td&gt;Any TEI-supported encoder&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;RERANKER_MODEL_ID&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;BAAI/bge-reranker-v2-m3&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;reranker&lt;/td&gt;
 &lt;td&gt;Any TEI-supported cross-encoder&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;VLLM_LLM_MODEL_ID&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;meta-llama/Meta-Llama-3.1-8B-Instruct&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;vllm&lt;/td&gt;
 &lt;td&gt;Must support guided JSON (&lt;code&gt;response_format={&amp;quot;type&amp;quot;:&amp;quot;json_object&amp;quot;}&lt;/code&gt;)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;MODEL_LLM_TIMEOUT_SECONDS&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;180&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;dataprep, retriever&lt;/td&gt;
 &lt;td&gt;vLLM chat completions. Read by &lt;code&gt;core/model_http_policy.py&lt;/code&gt;. On every shipped topology it is parsed but unused: its only consumer is the retriever&amp;rsquo;s OpenAI-key probe, and no service is given &lt;code&gt;OPENAI_API_KEY&lt;/code&gt;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;MODEL_LLM_MAX_RETRIES&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;dataprep, retriever&lt;/td&gt;
 &lt;td&gt;SDK retries on 408/409/429/5xx and connection errors. &lt;code&gt;0&lt;/code&gt; is honoured as a real value. Values above 10 are rejected.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;MODEL_SUMMARIZER_TIMEOUT_SECONDS&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;600&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;retriever&lt;/td&gt;
 &lt;td&gt;Document summarizer. A NEW ceiling, not the openai default kept. Not lowered: the call has no fallback, so its timeout becomes a 500 on the chat request.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;MODEL_EMBEDDING_TIMEOUT_SECONDS&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;600&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;retriever&lt;/td&gt;
 &lt;td&gt;Embedding client, OpenAI-API branch ONLY. Also a NEW ceiling — &lt;code&gt;langchain-openai&lt;/code&gt; forwards &lt;code&gt;request_timeout&lt;/code&gt; (default &lt;code&gt;None&lt;/code&gt;), which overrides the SDK default. Lowering it yields a silently EMPTY retrieval: the except clause returns &lt;code&gt;[]&lt;/code&gt; ahead of the BM25 leg.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;MODEL_RERANK_TIMEOUT_SECONDS&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;300&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;reranker&lt;/td&gt;
 &lt;td&gt;TEI rerank. Not lowered for the same reason as the summarizer.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;MODEL_AUTH_TIMEOUT_SECONDS&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;300&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;dataprep&lt;/td&gt;
 &lt;td&gt;Keycloak service-account token fetch. Separate from the control-plane budget because every ingestion-log write and status update waits on it, one attempt, no retry, re-raises on failure.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;MODEL_CONTROL_PLANE_TIMEOUT_SECONDS&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;30&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;dataprep, chatqna&lt;/td&gt;
 &lt;td&gt;Ingestion-log writes, doc-status updates, doc-repo callbacks. Not the Keycloak token fetch.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;MODEL_CONNECT_TIMEOUT_SECONDS&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;30&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;dataprep, reranker&lt;/td&gt;
 &lt;td&gt;The CONNECT phase ceiling for every aiohttp session this policy budgeted. &lt;code&gt;aiohttp&lt;/code&gt;&amp;rsquo;s default session already carried 30 s; passing an explicit &lt;code&gt;ClientTimeout(total=...)&lt;/code&gt; drops it, and &lt;code&gt;None&lt;/code&gt; means no limit rather than &amp;ldquo;inherit&amp;rdquo;. Raise for slow DNS or a routed mesh.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;MODEL_PROBE_TIMEOUT_SECONDS&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;10&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;dataprep, retriever, chatqna&lt;/td&gt;
 &lt;td&gt;The &lt;code&gt;/v1/models&lt;/code&gt; probe behind the TTL-cached model-id lookup. Degrades to the configured model id. Raise it on a remote GPU node whose models load slowly — the fallback otherwise picks the configured id instead of the served one.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;RERANKING_STRATEGY&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;slice&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;chatqna&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;slice&lt;/code&gt; / &lt;code&gt;threshold&lt;/code&gt; / &lt;code&gt;slice_threshold&lt;/code&gt; / &lt;code&gt;knee_threshold&lt;/code&gt; / &lt;code&gt;adaptive&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;RERANKER_TOP_N&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;chatqna&lt;/td&gt;
 &lt;td&gt;Top chunks kept by &lt;code&gt;slice&lt;/code&gt;/&lt;code&gt;slice_threshold&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;CONTEXTUAL_RETRIEVAL_ENABLED&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;dataprep&lt;/td&gt;
 &lt;td&gt;On by default; prepends doc-context prefix&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;DATAPREP_CONTEXTUAL_MODEL&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;em&gt;(empty = reuse &lt;code&gt;VLLM_LLM_MODEL_ID&lt;/code&gt;)&lt;/em&gt;&lt;/td&gt;
 &lt;td&gt;dataprep&lt;/td&gt;
 &lt;td&gt;Must support guided JSON&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;DATAPREP_CONTEXTUAL_DOC_BUDGET&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;100000&lt;/code&gt; (Python code) / &lt;code&gt;6000&lt;/code&gt; (compose override)&lt;/td&gt;
 &lt;td&gt;dataprep&lt;/td&gt;
 &lt;td&gt;Max chars fed to context LLM (~1500 tokens; ≤0 disables truncation). &lt;strong&gt;Compose override&lt;/strong&gt; — &lt;code&gt;docker-compose.yaml&lt;/code&gt; sets the per-chunk default to &lt;code&gt;6000&lt;/code&gt; (the doc-level sibling &lt;code&gt;_DOC_LEVEL&lt;/code&gt; stays at &lt;code&gt;100000&lt;/code&gt;); the compose file wins at runtime. To use the full Python default, set &lt;code&gt;DATAPREP_CONTEXTUAL_DOC_BUDGET=100000&lt;/code&gt; in &lt;code&gt;.env&lt;/code&gt; before &lt;code&gt;docker compose --env-file .env up -d&lt;/code&gt; (or &lt;code&gt;env.t4&lt;/code&gt; / &lt;code&gt;env.rtx6000&lt;/code&gt; overlays per &lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/deploy/docker-compose-setup/#6d-with-gpu-specific-settings"&gt;Step 6d&lt;/a&gt;).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;DATAPREP_CONTEXTUAL_MAX_TOKENS&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;512&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;dataprep&lt;/td&gt;
 &lt;td&gt;Per-call max output tokens for context generation&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;CONTEXTUAL_STRATEGY&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;per_chunk&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;dataprep&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;per_chunk&lt;/code&gt; (Anthropic recipe — default) or &lt;code&gt;doc_level&lt;/code&gt; (N× cheaper, same context for every chunk)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;CONTEXTUAL_LABEL_RAW&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;dataprep&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;true&lt;/code&gt; = label raw chunk, use context only for embedding&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;CORS_ALLOWED_ORIGINS&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;http://localhost:3000,http://localhost:8090,http://127.0.0.1:8090,https://${NGINX_PUBLIC_DOMAIN:-localhost}&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;backend&lt;/td&gt;
 &lt;td&gt;Comma-separated origins; localhost dev default&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;CSP_CONNECT_SRC&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;'self' http://localhost:3000 http://localhost:8090 http://127.0.0.1:8090 ws://localhost:3000 ws://localhost:8090&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;nginx&lt;/td&gt;
 &lt;td&gt;Content-Security-Policy &lt;code&gt;connect-src&lt;/code&gt;; localhost dev default&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;NGINX_PUBLIC_DOMAIN&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;localhost&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;nginx&lt;/td&gt;
 &lt;td&gt;Public domain&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;VUE_APP_API_URL&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;/api&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;frontend&lt;/td&gt;
 &lt;td&gt;Frontend API base&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;VUE_APP_AVAILABLE_LOCALES&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;em&gt;(unset = all)&lt;/em&gt;&lt;/td&gt;
 &lt;td&gt;frontend&lt;/td&gt;
 &lt;td&gt;Comma-separated codes (e.g. &lt;code&gt;en,es&lt;/code&gt;) — see &lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/configure/locale-whitelist/"&gt;Restrict active locales&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;KEYCLOAK_SUPPORTED_LOCALES&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;em&gt;(curated default)&lt;/em&gt;&lt;/td&gt;
 &lt;td&gt;keycloak&lt;/td&gt;
 &lt;td&gt;JSON array (e.g. &lt;code&gt;[&amp;quot;en&amp;quot;,&amp;quot;es&amp;quot;]&lt;/code&gt;) — see &lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/configure/locale-whitelist/"&gt;Restrict active locales&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;STREAMING_TRANSLATION_ENABLED&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;chatqna&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;1&lt;/code&gt;/&lt;code&gt;0&lt;/code&gt;; stream translated tokens during generation&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;KC_GRAFANA_CLIENT_ID&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;grafana&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;keycloak, grafana&lt;/td&gt;
 &lt;td&gt;OIDC client ID for Grafana SSO&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;KC_GRAFANA_CLIENT_SECRET&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;em&gt;(required when observability enabled)&lt;/em&gt;&lt;/td&gt;
 &lt;td&gt;keycloak, grafana&lt;/td&gt;
 &lt;td&gt;OIDC client secret&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="observability"&gt;Observability&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Variable&lt;/th&gt;
 &lt;th&gt;Default&lt;/th&gt;
 &lt;th&gt;Used by&lt;/th&gt;
 &lt;th&gt;Notes&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ENABLE_OBSERVABILITY&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;root&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;0&lt;/code&gt;/&lt;code&gt;1&lt;/code&gt; (not &lt;code&gt;true&lt;/code&gt;/&lt;code&gt;false&lt;/code&gt;)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;GRAFANA_ADMIN_USER&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;admin&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;grafana&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;GRAFANA_PORT&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;3002&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;grafana&lt;/td&gt;
 &lt;td&gt;Host port; avoids Backend port conflict&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;VICTORIAMETRICS_RETENTION&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;30d&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;victoriametrics&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;VICTORIALOGS_RETENTION&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;30d&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;victorialogs&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;VICTORIALOGS_URL&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;em&gt;(no in-code default — &lt;code&gt;VictoriaLogsClient&lt;/code&gt; constructor must receive &lt;code&gt;baseURL&lt;/code&gt;; Ansible &lt;code&gt;env.j2:243&lt;/code&gt; sets &lt;code&gt;http://victorialogs:9428&lt;/code&gt;)&lt;/em&gt;&lt;/td&gt;
 &lt;td&gt;backend&lt;/td&gt;
 &lt;td&gt;VL HTTP base URL. Injected by &lt;code&gt;env.j2&lt;/code&gt;; bypass only when running outside Ansible and set it explicitly.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;VICTORIALOGS_TENANT_ID&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;em&gt;(no in-code default — read by &lt;code&gt;shared/lib/melt/victorialogs-client.js:105&lt;/code&gt;, defaults &lt;code&gt;AccountID:0, ProjectID:0&lt;/code&gt; when unset)&lt;/em&gt;&lt;/td&gt;
 &lt;td&gt;backend&lt;/td&gt;
 &lt;td&gt;Tenant header for &lt;code&gt;/select/logsql/*&lt;/code&gt; (&lt;code&gt;AccountID:ProjectID&lt;/code&gt;). Ansible splits &lt;code&gt;VICTORIALOGS_TENANT_ID&lt;/code&gt; into &lt;code&gt;VICTORIALOGS_TENANT_ID_ACCOUNT_ID&lt;/code&gt; + &lt;code&gt;VICTORIALOGS_TENANT_ID_PROJECT_ID&lt;/code&gt; for the underlying VL request.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;VICTORIATRACES_RETENTION&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;30d&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;victoriatraces&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;MELT_PROVIDER&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;victorialogs&lt;/code&gt; (hardcoded constant in &lt;code&gt;components/shared/lib/melt/index.js&lt;/code&gt;)&lt;/td&gt;
 &lt;td&gt;backend&lt;/td&gt;
 &lt;td&gt;Future-proof seam selector for the OTel metrics/logs/traces exporter. Whitelisted by &lt;code&gt;tests/config-validator/&lt;/code&gt; so a deployer may override the env file; the runtime constant is the actual current value. Today there is only one backend implementation.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;OTEL_TRACES_SAMPLER_RATE&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;100.0&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;backend, opea&lt;/td&gt;
 &lt;td&gt;0.0–100.0&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;KONG_TRACING_INSTRUMENTATIONS&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;request&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;kong&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;KONG_TRACING_SAMPLING_RATE&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;1.0&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;kong&lt;/td&gt;
 &lt;td&gt;0.0–1.0&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;OTEL_EXPORTER_OTLP_ENDPOINT&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;http://otel-collector:4318&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;backend, opea, kong&lt;/td&gt;
 &lt;td&gt;Base URL for OTLP&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;OTEL_EXPORTER_OTLP_LOGS_ENDPOINT&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;em&gt;(not set — collector derives &lt;code&gt;/v1/logs&lt;/code&gt; from &lt;code&gt;OTEL_EXPORTER_OTLP_ENDPOINT&lt;/code&gt;)&lt;/em&gt;&lt;/td&gt;
 &lt;td&gt;backend, opea&lt;/td&gt;
 &lt;td&gt;Set only when the logs endpoint must override the inferred one (signal-specific URL is used as-is; no path appended).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;OTEL_EXPORTER_OTLP_TRACES_ENDPOINT&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;em&gt;(not set — collector derives &lt;code&gt;/v1/traces&lt;/code&gt; from &lt;code&gt;OTEL_EXPORTER_OTLP_ENDPOINT&lt;/code&gt;)&lt;/em&gt;&lt;/td&gt;
 &lt;td&gt;backend, opea&lt;/td&gt;
 &lt;td&gt;Set only when the traces endpoint must override the inferred one.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;VL_QUERY_TIMEOUT_MS&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;30000&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;backend&lt;/td&gt;
 &lt;td&gt;axios timeout for VictoriaLogs &lt;code&gt;query&lt;/code&gt; / &lt;code&gt;hits&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="prompts-override-defaults"&gt;Prompts (override defaults)&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Variable&lt;/th&gt;
 &lt;th&gt;Default&lt;/th&gt;
 &lt;th&gt;Used by&lt;/th&gt;
 &lt;th&gt;Notes&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;CHATQNA_SYSTEM_PROMPT&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;em&gt;(built-in)&lt;/em&gt;&lt;/td&gt;
 &lt;td&gt;chatqna&lt;/td&gt;
 &lt;td&gt;LLM system prompt&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;CHATQNA_ABSTENTION_INSTRUCTIONS&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;em&gt;(built-in)&lt;/em&gt;&lt;/td&gt;
 &lt;td&gt;chatqna&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;CHATQNA_ENFORCE_ABSTENTION&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;chatqna&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;LABEL_SELECTOR_SYSTEM_PROMPT&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;em&gt;(built-in)&lt;/em&gt;&lt;/td&gt;
 &lt;td&gt;dataprep&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;{labels_list}&lt;/code&gt; placeholder&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;CONTEXTUAL_RETRIEVAL_PROMPT&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;em&gt;(built-in)&lt;/em&gt;&lt;/td&gt;
 &lt;td&gt;dataprep&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;{document_context}&lt;/code&gt; placeholder&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="service-ports-with-defaults-baked-in"&gt;Service ports (with defaults baked in)&lt;/h2&gt;
&lt;p&gt;See &lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/configure/cors-csp/"&gt;Configure → CORS / CSP / public-domain&lt;/a&gt; for
the &lt;code&gt;nginx&lt;/code&gt; / &lt;code&gt;kong&lt;/code&gt; / &lt;code&gt;keycloak&lt;/code&gt; port map.&lt;/p&gt;</description></item><item><title>Backend HTTP API</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/reference/api-contracts/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/reference/api-contracts/</guid><description>&lt;h2 id="purpose"&gt;Purpose&lt;/h2&gt;
&lt;p&gt;This page is the &lt;strong&gt;canonical HTTP API reference&lt;/strong&gt; for the GENIE.AI backend
(&lt;code&gt;gov-chat-backend&lt;/code&gt;). For each endpoint: the path, the HTTP method, the
required auth, the request shape, the response shape, and the error
semantics.&lt;/p&gt;
&lt;p&gt;For the narrative version with worked examples, see this page itself — this is the single source of truth for the HTTP API.&lt;/p&gt;
&lt;h2 id="component"&gt;Component&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;components/gov-chat-backend/&lt;/code&gt; (Node.js 22, Express, JWT, winston).
&lt;strong&gt;Base URL&lt;/strong&gt;: &lt;code&gt;https://&amp;lt;domain&amp;gt;/api&lt;/code&gt; (via Kong Gateway).
&lt;strong&gt;Internal port&lt;/strong&gt;: 3000 (not exposed in Swarm).
&lt;strong&gt;OpenAPI&lt;/strong&gt;: &lt;code&gt;/api-docs&lt;/code&gt; (Swagger UI served from the BFF itself).&lt;/p&gt;</description></item><item><title>Source Tree Analysis</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/reference/source-tree-analysis/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/reference/source-tree-analysis/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;For developers.&lt;/strong&gt; A walk-through of the repository layout — use it to find where a component lives and what it depends on. Operators and content managers do not need this page.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="table-of-contents"&gt;Table of Contents&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/reference/source-tree-analysis/#overview"&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/reference/source-tree-analysis/#top-level-directory-structure"&gt;Top-Level Directory Structure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/reference/source-tree-analysis/#part-1-frontend-vue-3-web-app"&gt;Part 1: Frontend (Vue 3 Web App)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/reference/source-tree-analysis/#part-2-backend-nodejsexpress-api"&gt;Part 2: Backend (Node.js/Express API)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/reference/source-tree-analysis/#part-3-document-repository"&gt;Part 3: Document Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/reference/source-tree-analysis/#part-4-mobile-flutter-app"&gt;Part 4: Mobile (Flutter App)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/reference/source-tree-analysis/#part-5-aiml-opea-microservices"&gt;Part 5: AI/ML (OPEA Microservices)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/reference/source-tree-analysis/#part-6-api-gateway-kongnginx"&gt;Part 6: API Gateway (Kong/Nginx)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/reference/source-tree-analysis/#integration-points"&gt;Integration Points&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/reference/source-tree-analysis/#configuration--deployment"&gt;Configuration &amp;amp; Deployment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/reference/source-tree-analysis/#testing-structure"&gt;Testing Structure&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;GENIE.AI is a sovereign, DPG-compliant RAG (Retrieval-Augmented Generation) system with multilingual support. The monorepo is organized into 6 main parts:&lt;/p&gt;</description></item><item><title>OPEA protocol extensions</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/reference/opea-protocol/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/reference/opea-protocol/</guid><description>&lt;h2 id="purpose"&gt;Purpose&lt;/h2&gt;
&lt;p&gt;GENIE.AI extends the standard OPEA mega-service protocol with several
GENIE.AI-specific fields and event types. This page is the canonical
reference; the implementation lives in
&lt;code&gt;genie-ai-overlay/core/genieai_api_protocol.py&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="standard-opea-protocol-recap"&gt;Standard OPEA protocol (recap)&lt;/h2&gt;
&lt;p&gt;OPEA&amp;rsquo;s mega-service defines a DAG of microservices. Each downstream service
accepts an &lt;code&gt;asyncio&lt;/code&gt; input that is itself a dict — typically:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;messages&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;role&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;user&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;retriever_parameters&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;reranker_parameters&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The mega-service streams the final LLM response via SSE, plus per-stage
metadata events.&lt;/p&gt;
&lt;h2 id="genieai-extensions"&gt;GENIE.AI extensions&lt;/h2&gt;
&lt;h3 id="retrieval_confidence_score"&gt;&lt;code&gt;retrieval_confidence_score&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Field on the terminal SSE event. Computed as a &lt;strong&gt;rank-weighted
exponential-decay aggregate&lt;/strong&gt; of calibrated reranker scores (top-ranked
chunks dominate — flat mean was tail-sensitive). Individual reranker
scores are calibrated by &lt;code&gt;RERANKER_SCORE_CALIBRATION&lt;/code&gt; before the
aggregate. The citizen-facing &lt;code&gt;confidence_score&lt;/code&gt; field falls back to
&lt;code&gt;self_confidence&lt;/code&gt; when &lt;code&gt;LLM_SELF_CONFIDENCE_ENABLED=true&lt;/code&gt;; the raw
&lt;code&gt;retrieval_confidence_score&lt;/code&gt; is still emitted for admin/eval.&lt;/p&gt;</description></item><item><title>Kong / Nginx routes</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/reference/routes/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/reference/routes/</guid><description>&lt;h2 id="purpose"&gt;Purpose&lt;/h2&gt;
&lt;p&gt;The path-prefix → backend service mapping for every public route. Useful
when configuring an external proxy, a Cloudflare worker, or debugging a 404.&lt;/p&gt;
&lt;h2 id="nginx-tls-termination"&gt;Nginx (TLS termination)&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Path&lt;/th&gt;
 &lt;th&gt;Upstream&lt;/th&gt;
 &lt;th&gt;Notes&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;frontend (Vue SPA)&lt;/td&gt;
 &lt;td&gt;Static; SPA fallback to &lt;code&gt;/index.html&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/api/*&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;kong (port 8000)&lt;/td&gt;
 &lt;td&gt;All API calls&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/grafana/*&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;kong (port 8000)&lt;/td&gt;
 &lt;td&gt;Kong routes to grafana&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/auth/*&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;kong (port 8000)&lt;/td&gt;
 &lt;td&gt;Kong routes to keycloak&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/assets/*&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;frontend&lt;/td&gt;
 &lt;td&gt;Static assets&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/robots.txt&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;nginx&lt;/td&gt;
 &lt;td&gt;Static, served by Nginx&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="kong-api-gateway"&gt;Kong (API gateway)&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Path-prefix&lt;/th&gt;
 &lt;th&gt;Service&lt;/th&gt;
 &lt;th&gt;Auth&lt;/th&gt;
 &lt;th&gt;Rate limit&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/api/*&lt;/code&gt; (fallback)&lt;/td&gt;
 &lt;td&gt;express-api&lt;/td&gt;
 &lt;td&gt;JWT (per-route)&lt;/td&gt;
 &lt;td&gt;service-wide 1000 / min on express-api&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/api/auth/*&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;express-api&lt;/td&gt;
 &lt;td&gt;none (refresh-token cookie)&lt;/td&gt;
 &lt;td&gt;service-wide&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/api/auth/refresh-token&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;express-api&lt;/td&gt;
 &lt;td&gt;none (cookie)&lt;/td&gt;
 &lt;td&gt;service-wide&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/api/auth/login&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;express-api&lt;/td&gt;
 &lt;td&gt;none&lt;/td&gt;
 &lt;td&gt;service-wide&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/api/me&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;express-api&lt;/td&gt;
 &lt;td&gt;JWT&lt;/td&gt;
 &lt;td&gt;service-wide&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/api/queries&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;express-api&lt;/td&gt;
 &lt;td&gt;JWT&lt;/td&gt;
 &lt;td&gt;service-wide&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/api/chat/*&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;express-api&lt;/td&gt;
 &lt;td&gt;JWT&lt;/td&gt;
 &lt;td&gt;service-wide&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/api/admin/*&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;express-api&lt;/td&gt;
 &lt;td&gt;JWT + role &lt;code&gt;admin&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;service-wide&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/Uploads/*&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;backend (&lt;code&gt;express.static&lt;/code&gt;)&lt;/td&gt;
 &lt;td&gt;public&lt;/td&gt;
 &lt;td&gt;none&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Per-route rate limits are NOT configured in Kong — the 1000/min limit is
applied service-wide to &lt;code&gt;express-api&lt;/code&gt;. &lt;code&gt;/api/health&lt;/code&gt; and &lt;code&gt;/api/public/*&lt;/code&gt;
have no dedicated Kong routes; they are reached via the &lt;code&gt;/api&lt;/code&gt; fallback
(&lt;code&gt;api-fallback&lt;/code&gt; route, &lt;code&gt;strip_path: false&lt;/code&gt;).&lt;/p&gt;</description></item><item><title>ArangoDB collections</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/reference/arangodb-collections/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/reference/arangodb-collections/</guid><description>&lt;h2 id="purpose"&gt;Purpose&lt;/h2&gt;
&lt;p&gt;The canonical list of every ArangoDB collection used by GENIE.AI, with
field names and types. Useful when writing an AQL query, debugging a
missing field, or wiring a new microservice.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: this page covers the most-frequently-used collections. The
complete list (defined in &lt;code&gt;001-create-collections.js&lt;/code&gt;) also includes
&lt;code&gt;sessions&lt;/code&gt;, &lt;code&gt;sessionQueries&lt;/code&gt;, &lt;code&gt;userSessions&lt;/code&gt;, &lt;code&gt;userConversations&lt;/code&gt;,
&lt;code&gt;conversationCategories&lt;/code&gt;, &lt;code&gt;queryMessages&lt;/code&gt;, &lt;code&gt;conversationFiles&lt;/code&gt;,
&lt;code&gt;queryCategories&lt;/code&gt;, &lt;code&gt;categoryServices&lt;/code&gt;, &lt;code&gt;serviceTranslations&lt;/code&gt;,
&lt;code&gt;serviceTranslationsEdge&lt;/code&gt;, &lt;code&gt;folders&lt;/code&gt;, &lt;code&gt;userFolders&lt;/code&gt;,
&lt;code&gt;folderConversations&lt;/code&gt;, &lt;code&gt;analytics&lt;/code&gt;, &lt;code&gt;weatherRequests&lt;/code&gt;, &lt;code&gt;labels&lt;/code&gt;,
&lt;code&gt;crawl_job&lt;/code&gt;, &lt;code&gt;crawl_log&lt;/code&gt;, &lt;code&gt;crawl_metrics&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="user-facing-collections"&gt;User-facing collections&lt;/h2&gt;
&lt;h3 id="users"&gt;&lt;code&gt;users&lt;/code&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Field&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Notes&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;_key&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;string&lt;/td&gt;
 &lt;td&gt;ArangoDB-generated; UUID is a convention but any string works&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;iss_sub&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;string&lt;/td&gt;
 &lt;td&gt;Keycloak &lt;code&gt;&amp;lt;iss&amp;gt;&lt;/code&gt; + &lt;code&gt;&amp;lt;sub&amp;gt;&lt;/code&gt; composite (indexed, unique)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;iss&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;string&lt;/td&gt;
 &lt;td&gt;Keycloak issuer URL&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;sub&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;string&lt;/td&gt;
 &lt;td&gt;Keycloak subject&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;email&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;string&lt;/td&gt;
 &lt;td&gt;indexed (non-unique)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;name&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;string&lt;/td&gt;
 &lt;td&gt;Display name (combined from Keycloak &lt;code&gt;name&lt;/code&gt; or &lt;code&gt;preferred_username&lt;/code&gt;)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;emailVerified&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;bool&lt;/td&gt;
 &lt;td&gt;Mirrors Keycloak &lt;code&gt;email_verified&lt;/code&gt; claim&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;roles&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;array&lt;string&gt;&lt;/td&gt;
 &lt;td&gt;Realm roles from Keycloak JWT (&lt;code&gt;decodedToken.realm_access.roles&lt;/code&gt;); e.g. &lt;code&gt;[&amp;quot;Admin&amp;quot;]&lt;/code&gt; / &lt;code&gt;[&amp;quot;dataprep-service&amp;quot;]&lt;/code&gt; / &lt;code&gt;[]&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;active&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;bool&lt;/td&gt;
 &lt;td&gt;False-when-deleted soft-delete marker&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;deleted&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;bool&lt;/td&gt;
 &lt;td&gt;Soft-delete flag&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;createdAt&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;ISO-8601&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;updatedAt&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;ISO-8601&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="conversations"&gt;&lt;code&gt;conversations&lt;/code&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Field&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Notes&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;_key&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;string&lt;/td&gt;
 &lt;td&gt;UUID&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;string&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;lastMessage&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;string&lt;/td&gt;
 &lt;td&gt;Preview of the latest message content&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;created&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;ISO-8601&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;updated&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;ISO-8601&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;messageCount&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;int&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;isStarred&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;bool&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;isArchived&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;bool&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;category&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;string&lt;/td&gt;
 &lt;td&gt;Optional category label&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;tags&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;array&lt;string&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The link between a conversation and its owning user lives in the
&lt;code&gt;userConversations&lt;/code&gt; edge collection (&lt;code&gt;_from: users/&amp;lt;id&amp;gt;&lt;/code&gt;, &lt;code&gt;_to: conversations/&amp;lt;id&amp;gt;&lt;/code&gt;),
not as a &lt;code&gt;userId&lt;/code&gt; field on the conversation document.&lt;/p&gt;</description></item><item><title>Service registry enum</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/reference/service-registry/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/reference/service-registry/</guid><description>&lt;h2 id="purpose"&gt;Purpose&lt;/h2&gt;
&lt;p&gt;The canonical enum of service names used in OTel attributes, VictoriaLogs
filters, Kong routes, and Docker swarm service names. The Python enum lives
in &lt;code&gt;genie-ai-overlay/core/constants.py&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="service-registry"&gt;Service registry&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The &amp;ldquo;Enum value&amp;rdquo; column is a logical role used in code and
ops queries — there is no service-name enum in
&lt;code&gt;genie-ai-overlay/core/constants.py&lt;/code&gt; (only the OPEA service-&lt;code&gt;type&lt;/code&gt;
enum &lt;code&gt;ServiceType&lt;/code&gt; lives there). The OTel &lt;code&gt;service.name&lt;/code&gt; column shows
the value passed to &lt;code&gt;setup_tracing(...)&lt;/code&gt; for instrumented services, or
the env-var / container name for uninstrumented ones. &amp;ldquo;Docker service&amp;rdquo;
is the block name in &lt;code&gt;docker-compose.yaml&lt;/code&gt;; in Docker Swarm it is
prefixed by the stack name (e.g. &lt;code&gt;genieai_chatqna-xeon-backend-server&lt;/code&gt;).&lt;/p&gt;</description></item><item><title>Glossary</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/reference/glossary/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/reference/glossary/</guid><description>&lt;p&gt;GENIE.AI glossary — every acronym used across the docs.&lt;/p&gt;
&lt;h2 id="az"&gt;A–Z&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Term&lt;/th&gt;
 &lt;th&gt;Definition&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Ansible&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Agentless automation tool used for the production Swarm deploy (&lt;code&gt;deploy/ansible/&lt;/code&gt;).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;ArangoDB&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Multi-model database (document + graph + vector) that holds the knowledge base.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;BFF&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&amp;ldquo;Backend for frontend&amp;rdquo; — the &lt;code&gt;gov-chat-backend&lt;/code&gt; Node.js service that brokers HTTP for both web and mobile clients.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;BM25&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Classic lexical relevance score used alongside vector search in hybrid retrieval.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;ChatQnA&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;The OPEA mega-service that orchestrates the RAG pipeline.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;ClamAV&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Open-source antivirus used by the document repository to scan uploads.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Contextual Retrieval&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Anthropic-style technique: prepend an LLM-generated doc-context prefix to each chunk before embedding, improving retrieval precision. Enabled by &lt;code&gt;CONTEXTUAL_RETRIEVAL_ENABLED=true&lt;/code&gt;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Diataxis&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Documentation framework that splits docs into &lt;strong&gt;Tutorial&lt;/strong&gt;, &lt;strong&gt;How-to&lt;/strong&gt;, &lt;strong&gt;Reference&lt;/strong&gt;, &lt;strong&gt;Explanation&lt;/strong&gt;. Every doc on this site carries a &lt;code&gt;mode:&lt;/code&gt; field reflecting its quadrant.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;DPG&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Digital Public Goods — a UN-endorsed standard for open-source projects. GENIE.AI targets DPG compliance.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Docling&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;IBM document-parser used by &lt;code&gt;dataprep&lt;/code&gt; to turn PDFs / DOCX / HTML into chunks.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Docsy&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;The Hugo theme this site is built on.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Embedding&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;A vector representation of a text passage. The default model (&lt;code&gt;BAAI/bge-large-en-v1.5&lt;/code&gt;) produces 1024-D vectors. See &lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/rag-pipeline/choosing-models/"&gt;Choosing models&lt;/a&gt; for the supported-model matrix (dimension, recall, VRAM).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Fluentd&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Log forwarder used by every container (Docker &lt;code&gt;fluentd&lt;/code&gt; driver) to ship stdout/stderr to the OTel Collector.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Grafana&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;The dashboards + alerting UI for the observability stack. Reachable at &lt;code&gt;/grafana/&lt;/code&gt;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Hybrid retrieval&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Combines vector search (semantic) with BM25 (lexical) and fuses the scores. Enabled by &lt;code&gt;RETRIEVER_HYBRID_RETRIEVAL_ENABLED&lt;/code&gt; (default &lt;code&gt;true&lt;/code&gt;). &lt;code&gt;RETRIEVER_ARANGO_SEARCH_MODE&lt;/code&gt; (default &lt;code&gt;vector&lt;/code&gt;) is independent and selects the dense strategy — similarity vs Maximum Marginal Relevance (MMR).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;JWT&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;JSON Web Token — the format of Keycloak access tokens used to authorize API calls.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Keycloak&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;OIDC identity provider; default realm is &lt;code&gt;genie&lt;/code&gt;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Kong&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;API gateway that fronts every service; routes by path prefix.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;MELT seam&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;The backend abstraction that exposes &lt;strong&gt;M&lt;/strong&gt;etrics, &lt;strong&gt;E&lt;/strong&gt;vents, &lt;strong&gt;L&lt;/strong&gt;ogs, &lt;strong&gt;T&lt;/strong&gt;races to the admin UI.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;NGINX&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;TLS-terminating reverse proxy exposed on 80 / 443.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;OIDC&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;OpenID Connect — the protocol used for SSO via Keycloak.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;OPEA&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Open Platform for Enterprise AI — the framework GENIE.AI&amp;rsquo;s RAG pipeline is built on.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;OTel&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;OpenTelemetry — the standard for emitting traces, metrics, and logs.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;OTLP&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;OpenTelemetry Line Protocol — the wire format over which app services ship telemetry to the Collector.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;RAG&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Retrieval-Augmented Generation — answer questions by grounding an LLM in retrieved documents.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Reranker&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;A cross-encoder that re-scores the top-K retrieval candidates.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Retriever&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;The microservice that fetches candidate chunks from ArangoDB.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;RFP / ROPC&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Resource Owner Password Credentials — a Keycloak grant. &lt;strong&gt;Disabled by default&lt;/strong&gt; for security.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;SSE&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Server-Sent Events — the wire format ChatQnA streams the response over.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;TEI&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Text Embeddings Inference — HuggingFace&amp;rsquo;s serving runtime for embedding and reranking models.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;TEI Reranker&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;The reranker microservice; runs a cross-encoder model.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;TEI Embedding&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;The embedding microservice; runs an encoder model.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Translation&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Optional microservice that translates the LLM response to the user&amp;rsquo;s UI locale.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;vLLM&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;The high-throughput LLM serving runtime; runs the chat + labeling models.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;VictoriaLogs&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Single-node log store used by the observability stack.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;VictoriaMetrics&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Single-node metrics store.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;VictoriaTraces&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Single-node trace store; exposes a Jaeger-compatible API.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;W3C &lt;code&gt;traceparent&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;The standard HTTP header used to propagate trace context across service boundaries.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;WSS&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;WebSocket Secure. Used in dev by the Vue dev-server HMR (websocket transport on &lt;code&gt;vue.config.js&lt;/code&gt;); not used in production (admin logs tail via &lt;code&gt;/api/admin/logs/search&lt;/code&gt; HTTP polling).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="related"&gt;Related&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/get-started/concepts/"&gt;Get started → Concepts&lt;/a&gt; — five-minute tour of the GENIE.AI mental model.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/architecture/architecture/"&gt;Architecture → Overview&lt;/a&gt; — how every acronym above fits together.&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>