<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>GENIE.AI</title><link>https://genie-ai-7e342b.opensource.unicc.org/</link><description>Recent content on GENIE.AI</description><generator>Hugo</generator><language>en</language><atom:link href="https://genie-ai-7e342b.opensource.unicc.org/index.xml" rel="self" type="application/rss+xml"/><item><title>Api Contracts Backend</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/backend/api-contracts-backend/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/backend/api-contracts-backend/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;For integrators.&lt;/strong&gt; The backend (BFF) HTTP API contracts — request/response shapes for auth, chat, files, analytics, and admin endpoints.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Component&lt;/strong&gt;: &lt;code&gt;components/gov-chat-backend/&lt;/code&gt; (Node.js/Express)
&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;Documentation&lt;/strong&gt;: Swagger/OpenAPI available at &lt;code&gt;/api-docs&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="authentication"&gt;Authentication&lt;/h2&gt;
&lt;p&gt;All endpoints (except where noted) require Keycloak JWT authentication via &lt;code&gt;Authorization: Bearer &amp;lt;token&amp;gt;&lt;/code&gt; header.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Auth middleware&lt;/strong&gt;: &lt;code&gt;keycloakAuthMiddleware.authenticate&lt;/code&gt; (Keycloak OIDC)
&lt;strong&gt;Admin endpoints&lt;/strong&gt;: Additional &lt;code&gt;keycloakAuthMiddleware.requireAdmin&lt;/code&gt; middleware&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="route-domains"&gt;Route Domains&lt;/h2&gt;
&lt;h3 id="1-authentication-routes-apiauth"&gt;1. Authentication Routes (&lt;code&gt;/api/auth&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Route File&lt;/strong&gt;: &lt;code&gt;routes/auth-routes.js&lt;/code&gt;
&lt;strong&gt;Auth Required&lt;/strong&gt;: None (login/logout endpoints)
&lt;strong&gt;Base Paths&lt;/strong&gt;: &lt;code&gt;/api/auth&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Architecture</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/architecture/architecture/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/architecture/architecture/</guid><description>&lt;h1 id="architecture-overview"&gt;Architecture Overview&lt;/h1&gt;
&lt;p&gt;High-level architecture of the GENIE.AI platform with Keycloak OIDC integration.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-system-context"&gt;1. System Context&lt;/h2&gt;
&lt;pre class="mermaid"&gt;graph TB
 subgraph External Actors
 EU[End User]
 SA[IT Admin]
 FA[Functional Admin]
 end

 subgraph External IdPs
 Google[Google Workspace]
 MSFT[Microsoft Entra ID]
 SAML[SAML IdP]
 end

 subgraph GENIE.AI Platform
 GENIE[GENIE.AI&amp;lt;br/&amp;gt;RAG Platform]
 end

 EU --&amp;gt;|Web Browser| GENIE
 SA --&amp;gt;|Admin Console| GENIE
 FA --&amp;gt;|Admin Console| GENIE

 Google -.-&amp;gt;|OIDC / OAuth2| GENIE
 MSFT -.-&amp;gt;|OIDC / OAuth2| GENIE
 SAML -.-&amp;gt;|SAML 2.0| GENIE&lt;/pre&gt;
&lt;p&gt;GENIE.AI is a sovereign RAG platform for the public sector. It authenticates users via Keycloak, which can broker to external identity providers (Google, Microsoft, SAML). Three actor personas interact with the system:&lt;/p&gt;</description></item><item><title>Backup &amp; Restore</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/operations/backup-restore/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/operations/backup-restore/</guid><description>&lt;p&gt;The two things you must be able to restore after a failure are &lt;strong&gt;the knowledge
base&lt;/strong&gt; (ArangoDB — chunks, embeddings, graph, labels) and &lt;strong&gt;the gateway
configuration&lt;/strong&gt; (Kong routes and plugins). GENIE.AI ships scripts for both.&lt;/p&gt;
&lt;h2 id="arangodb-backup"&gt;ArangoDB backup&lt;/h2&gt;
&lt;p&gt;The backup script (&lt;code&gt;components/arangodb/dump.sh&lt;/code&gt;) dumps every database using
&lt;code&gt;arangodump&lt;/code&gt; inside the &lt;code&gt;arangodb/arangodb:3.12&lt;/code&gt; container, into a timestamped
directory:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;/root/arango_backups/&amp;lt;YYYYMMDDHHMMSS&amp;gt;/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It requires the &lt;code&gt;arango-vector-db&lt;/code&gt; container running on the &lt;code&gt;chatqna_default&lt;/code&gt;
network. Run it from a Swarm node that can reach the database container.&lt;/p&gt;</description></item><item><title>Ingestion</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/knowledge-base/ingestion/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/knowledge-base/ingestion/</guid><description>&lt;p&gt;Ingestion turns a raw uploaded file into searchable, labelled, embedded chunks in
ArangoDB. It runs automatically once a file is uploaded; no manual trigger is
needed. The pipeline is designed so that &lt;strong&gt;a failure at any stage never loses the
file&lt;/strong&gt; — the upload is stored first, then processed.&lt;/p&gt;
&lt;h2 id="the-pipeline"&gt;The pipeline&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;1. Upload — file received by the document-repository service
2. Antivirus scan — ClamAV scans the file; infected files are rejected
3. Store — file saved to disk; a file_id is assigned
4. Parse — docling extracts text + structure (headings, tables)
5. Chunk — text split into retrieval-sized chunks
6. Label — each chunk labelled against the service taxonomy
7. Context prefix — (if enabled) an LLM doc-context prefix is prepended
8. Embed — each chunk vectorised with the embedding model
9. Store — chunks, embeddings, labels, and graph nodes written to ArangoDB
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Steps 4–9 are owned by the &lt;strong&gt;dataprep&lt;/strong&gt; service
(&lt;code&gt;genie-ai-overlay/dataprep/&lt;/code&gt;). The whole sequence is observable end-to-end — see
&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/observability/"&gt;Observability&lt;/a&gt; for how to watch a specific
file&amp;rsquo;s ingestion in the traces and the ingestion log.&lt;/p&gt;</description></item><item><title>Installation &amp; Configuration Guide</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/deployment/install-guide/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/deployment/install-guide/</guid><description>&lt;h1 id="introduction"&gt;Introduction&lt;/h1&gt;
&lt;p&gt;Welcome to the GENIE.AI framework. This guide will walk you through the necessary steps to set up, configure, and deploy your own Retrieval-Augmented Generation (RAG) solution. The success of any AI-driven knowledge system lies in the quality and structure of its data. Therefore, the first and most critical phase is to define, curate, and structure the data that will form the backbone of your system&amp;rsquo;s knowledge. This cannot be over-emphasized. It is the most critical aspect. Our suggestion is that you establish an initial MVP with the framework by simply curating the data, defining the knowledge hierarchy, configuring your quickhelp buttons with prompts and then labeling and ingesting your curated data prior to modifying any code. This way, you will get used to how the framework operates, before you delve into deeper issues and extensions. This approach can also be used to deliver a rapid solution to a RAG problem, without any coding at all (just implementing a knowledge base design and the associated configuration). The application title and theme can also be modified by configuration in JSON without changing code. The suggested approach for this is to utilize something like ChatGPT, Gemini Pro or Grok etc. to build a new configuration for color theme and title etc. This can be done in minutes.&lt;/p&gt;</description></item><item><title>Keycloak Admin Guide</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/configuration/keycloak-admin-guide/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/configuration/keycloak-admin-guide/</guid><description>&lt;p&gt;This guide explains how to manage users, roles, and groups for GENIE.AI entirely through the Keycloak admin console. No GENIE.AI-specific interface is needed for user management.&lt;/p&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;GENIE.AI delegates all identity management to Keycloak. When an administrator creates, modifies, disables, or deletes a user in Keycloak, the changes take effect in GENIE.AI on the user&amp;rsquo;s next authentication. Roles assigned in Keycloak are reflected in the JWT claims and propagated to all GENIE.AI services.&lt;/p&gt;</description></item><item><title>Pipeline Architecture</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/rag/pipeline/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/rag/pipeline/</guid><description>&lt;p&gt;The RAG pipeline is orchestrated by the &lt;strong&gt;ChatQnA&lt;/strong&gt; mega-service
(&lt;code&gt;genie-ai-overlay/chatqna/&lt;/code&gt;), a Python/FastAPI service built on the OPEA
mega-service framework. It wires together five specialist microservices into a
directed acyclic graph (DAG) and streams the final answer back to the client.&lt;/p&gt;
&lt;h2 id="service-roles"&gt;Service roles&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Stage&lt;/th&gt;
 &lt;th&gt;Service&lt;/th&gt;
 &lt;th&gt;Stack&lt;/th&gt;
 &lt;th&gt;Role&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Orchestration&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;ChatQnA&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Python / FastAPI&lt;/td&gt;
 &lt;td&gt;Owns the DAG; calls each stage; enforces abstention and confidence.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Embedding&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;TEI Embedding&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Hugging Face TEI&lt;/td&gt;
 &lt;td&gt;Vectorises the query (and chunks at ingest time).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Retrieval&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;Retriever&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Python / ArangoDB&lt;/td&gt;
 &lt;td&gt;Hybrid vector + graph search over indexed chunks.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Reranking&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;TEI Reranker&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Hugging Face TEI&lt;/td&gt;
 &lt;td&gt;Re-scores retrieved chunks by query relevance.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Generation&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;vLLM&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;vLLM (OpenAI-compatible)&lt;/td&gt;
 &lt;td&gt;Produces the grounded answer.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Translation&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;Translation&lt;/strong&gt; (optional)&lt;/td&gt;
 &lt;td&gt;TranslaTron or vLLM&lt;/td&gt;
 &lt;td&gt;Translates the stream into the user&amp;rsquo;s UI language.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;All services are containerised and communicate over the internal Docker network.
Only the backend (BFF) and the public Nginx gateway are reachable from outside
the cluster.&lt;/p&gt;</description></item><item><title>Project Overview</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/core/project-overview/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/core/project-overview/</guid><description>&lt;p&gt;GENIE.AI is an open-source generative-AI framework for the public sector: a
sovereign, Digital Public Good (DPG)-compliant Retrieval-Augmented Generation
(RAG) platform with multilingual support. It answers questions strictly from an
indexed knowledge base you control, running every model on infrastructure you
own. It integrates with &lt;a href="https://opea.dev"&gt;OPEA&lt;/a&gt; (Open Platform for Enterprise
AI) for AI/ML services.&lt;/p&gt;
&lt;p&gt;This page is the &lt;strong&gt;orientation layer&lt;/strong&gt; — what GENIE.AI is, how it is built, and
where to read deeper. Each area below has a dedicated page; this overview
intentionally stays high-level.&lt;/p&gt;</description></item><item><title>Stack Overview</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/observability/overview/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/observability/overview/</guid><description>&lt;p&gt;The observability stack has four layers: &lt;strong&gt;instrumentation&lt;/strong&gt; (in the apps),
&lt;strong&gt;collection&lt;/strong&gt; (the OpenTelemetry Collector), &lt;strong&gt;storage&lt;/strong&gt; (the Victoria trio),
and &lt;strong&gt;presentation&lt;/strong&gt; (Grafana).&lt;/p&gt;
&lt;h2 id="layer-1--instrumentation"&gt;Layer 1 — Instrumentation&lt;/h2&gt;
&lt;p&gt;Each application service initialises the OpenTelemetry SDK and emits telemetry
through the standard OTLP protocol.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Service&lt;/th&gt;
 &lt;th&gt;Language&lt;/th&gt;
 &lt;th&gt;What it emits&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Backend (BFF)&lt;/td&gt;
 &lt;td&gt;Node.js&lt;/td&gt;
 &lt;td&gt;Express request spans, ArangoDB query spans, custom business spans, Prometheus metrics.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;OPEA services&lt;/td&gt;
 &lt;td&gt;Python&lt;/td&gt;
 &lt;td&gt;FastAPI spans, per-RAG-stage spans (retrieval, reranking, labelling…), service logs.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Kong gateway&lt;/td&gt;
 &lt;td&gt;Lua&lt;/td&gt;
 &lt;td&gt;OTel plugin forwards request traces.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Instrumentation helpers enforce a single way to create spans (so attributes and
PII filtering stay consistent):&lt;/p&gt;</description></item><item><title>Ui Component Inventory Frontend</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/frontend/ui-component-inventory-frontend/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/frontend/ui-component-inventory-frontend/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;For frontend developers.&lt;/strong&gt; A reference catalogue of the web UI components and their props.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="summary"&gt;Summary&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Total Vue Components&lt;/strong&gt;: 55&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Design System Components&lt;/strong&gt;: 12&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Application Components&lt;/strong&gt;: 43&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="design-system-primitives-srccomponentsds"&gt;Design System Primitives (&lt;code&gt;src/components/ds/&lt;/code&gt;)&lt;/h2&gt;
&lt;h3 id="core-primitives"&gt;Core Primitives&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Component&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Button.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Button primitive with variants (primary, secondary, ghost, danger)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Card.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Container card with shadow and border radius&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Input.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Text input field with label, validation states, and error messaging&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Modal.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Modal dialog overlay with header, body, footer slots&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Select.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Dropdown select component with options&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Combobox.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Auto-complete text input with dropdown suggestions&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Tabs.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Tab navigation component with panels&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Pill.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Small badge/tag component for status or category display&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Spinner.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Loading spinner animation&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;StatusTag.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Status indicator with color coding (success, warning, error, info)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;StateDisplay.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Empty state / error state / loading state display component&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;FormGroup.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Form field wrapper with label and error messaging&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="layout-components"&gt;Layout Components&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Component&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;App.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Root application component with router-view and global providers&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;NavBarComponent.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Top navigation bar with user menu, language selector, logout&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;SideBarComponent.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Left sidebar with conversation history and navigation&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;SplashScreen.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Initial loading screen with logo and progress indicator&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="chat-components"&gt;Chat Components&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Component&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ChatBotComponent.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Main chat interface with message list and input area&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ChatFolders.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Conversation folder management (create, rename, delete)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ChatHistoryComponent.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Conversation history list with search and filtering&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ChatResponseFeedbackDialog.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Feedback dialog for rating chat responses (thumbs up/down)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;RightSideBarComponent.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Right sidebar displaying context, documents, or service info&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;WeatherPanel.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Weather information display panel (contextual data)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="admin--analytics-components"&gt;Admin &amp;amp; Analytics Components&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Component&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;AdminDashboard.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Admin dashboard with system metrics and user management&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;AnalyticsDashboard.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Analytics dashboard with charts and usage statistics&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;AnalyticsComponent.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Analytics data display with filtering and date ranges&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;UnifiedAnalytics.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Unified analytics view combining multiple metrics&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="chart-components-srccomponentscharts"&gt;Chart Components (&lt;code&gt;src/components/charts/&lt;/code&gt;)&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Component&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;UsageTrendChart.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Line chart showing query usage over time&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;CategoryDistributionChart.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Pie/donut chart for service category distribution&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;SatisfactionGauge.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Gauge chart for user satisfaction scores&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;SatisfactionHeatmap.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Heatmap chart for satisfaction by time/category&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;TopQueriesChart.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Bar chart showing most frequent queries&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="authentication--user-profile"&gt;Authentication &amp;amp; User Profile&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Component&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;CallbackView.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;OIDC authentication callback handler (view-level component)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;UserProfileComponent.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;User profile display and edit form&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="settings-components"&gt;Settings Components&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Component&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;SettingsComponent.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Application settings panel (theme, language, preferences)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;LanguageSelector.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Language selection dropdown for i18n&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="file-management-components"&gt;File Management Components&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Component&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;FileUploadComponent.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;File upload widget with drag-and-drop support&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;UploadFilesDialog.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Dialog for uploading multiple files to the knowledge base&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;AddFromLinkDialog.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Dialog for adding documents via URL/link&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;FileDetailsDialog.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;File metadata display (name, size, upload date, status)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="service--context-components"&gt;Service &amp;amp; Context Components&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Component&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ServiceTreePanelComponent.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Hierarchical tree view of service categories&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ServiceCategoryPanelComponent.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Service category list/details panel&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="shared-ui-components"&gt;Shared UI Components&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Component&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ConfirmDialog.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Generic confirmation dialog (confirm/cancel actions)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ModalDialog.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Generic modal dialog wrapper component&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ContextMenu.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Right-click context menu with custom actions&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;NotificationSystem.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Toast notification system (success, error, warning messages)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;OperationResultsModal.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Modal displaying results of batch operations&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;LogSearchDialog.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Dialog for searching through system logs&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;SearchableCountryDropdown.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Country selector with search functionality&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="views-srcviews"&gt;Views (&lt;code&gt;src/views/&lt;/code&gt;)&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Component&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;DashboardView.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Main dashboard view (router target)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;CallbackView.vue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Authentication callback view (OIDC redirect handler)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="component-organization"&gt;Component Organization&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;src/
├── App.vue # Root component
├── views/ # Router-level views
│ ├── DashboardView.vue
│ └── CallbackView.vue
├── components/
│ ├── ds/ # Design system primitives (12)
│ ├── charts/ # Analytics chart components (5)
│ ├── [Layout] # Navigation and layout (4)
│ ├── [Chat] # Chat interface (6)
│ ├── [Admin] # Admin/analytics (4)
│ ├── [Auth] # Authentication (2)
│ ├── [Settings] # Settings (2)
│ ├── [Files] # File management (4)
│ ├── [Services] # Service navigation (2)
│ └── [Shared] # Shared UI components (6)
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="notes"&gt;Notes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;All components use Vue 3 &lt;strong&gt;Options API&lt;/strong&gt; (not Composition API)&lt;/li&gt;
&lt;li&gt;Design system components in &lt;code&gt;src/components/ds/&lt;/code&gt; are reusable primitives&lt;/li&gt;
&lt;li&gt;Chart components use &lt;strong&gt;ApexCharts&lt;/strong&gt; library (via vue3-apexcharts)&lt;/li&gt;
&lt;li&gt;Routing via Vue Router with views in &lt;code&gt;src/views/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;i18n via vue-i18n with translations in &lt;code&gt;/src/i18n/locales/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ui Component Inventory Mobile</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/mobile/ui-component-inventory-mobile/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/mobile/ui-component-inventory-mobile/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;For mobile developers.&lt;/strong&gt; A reference catalogue of the Flutter app widgets.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="summary"&gt;Summary&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Total Dart Files&lt;/strong&gt;: 76&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UI Components&lt;/strong&gt;: 14&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Design System Components&lt;/strong&gt;: 6&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Design System Tokens&lt;/strong&gt;: 5&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Services&lt;/strong&gt;: 12&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Config&lt;/strong&gt;: 5&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;i18n Locales&lt;/strong&gt;: 13&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="design-system-libdesign_system"&gt;Design System (&lt;code&gt;lib/design_system/&lt;/code&gt;)&lt;/h2&gt;
&lt;h3 id="ds-components-libdesign_systemcomponents"&gt;DS Components (&lt;code&gt;lib/design_system/components/&lt;/code&gt;)&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Component&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ds_button.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Button primitive with variants (primary, secondary, ghost, danger)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ds_card.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Container card with elevation and border radius&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ds_input.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Text input field with label, validation states, and error messaging&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ds_modal.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Modal dialog overlay with content slot&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ds_spinner.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Loading spinner animation (circular progress indicator)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ds_state_display.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Empty/error/loading state display component&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="ds-tokens-libdesign_systemtokens"&gt;DS Tokens (&lt;code&gt;lib/design_system/tokens/&lt;/code&gt;)&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Token File&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;app_tokens.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Global design tokens (typography, colors, spacing scale)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;color_utils.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Color utilities (lighten, darken, opacity, theme mapping)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;spacing.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Spacing scale constants (xs, sm, md, lg, xl)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;radii.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Border radius tokens (sm, md, lg, xl, full)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="ds-theme-libdesign_systemtheme"&gt;DS Theme (&lt;code&gt;lib/design_system/theme/&lt;/code&gt;)&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;File&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;app_theme.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Material theme configuration (light/dark, color schemes)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="chat-components-libcomponentschat"&gt;Chat Components (&lt;code&gt;lib/components/chat/&lt;/code&gt;)&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Component&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;chatbot_component.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Main chat interface with message list and input area&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;right_sidebar_component.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Right sidebar displaying context, documents, or service info&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;chat_response_feedback_dialog.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Feedback dialog for rating chat responses (thumbs up/down)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;web_file_utils.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;File utility functions for web platform&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;stub_file_utils.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;File utility stubs for non-web platforms&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;right_sidebar_stub.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Stub implementation for right sidebar (conditional compilation)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="sidebar-components-libcomponentssidebar"&gt;Sidebar Components (&lt;code&gt;lib/components/sidebar/&lt;/code&gt;)&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Component&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;sidebar_component.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Left sidebar with conversation history and navigation&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;chat_folders_panel.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Conversation folder management (create, rename, delete)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;service_tree_panel.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Hierarchical tree view of service categories&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="authentication-components-libcomponentsauth"&gt;Authentication Components (&lt;code&gt;lib/components/auth/&lt;/code&gt;)&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Component&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;oidc_login_screen.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;OIDC login screen with Keycloak authentication flow&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="user-components-libcomponentsuser"&gt;User Components (&lt;code&gt;lib/components/user/&lt;/code&gt;)&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Component&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;user_profile_component.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;User profile display and edit form&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="settings-components-libcomponentssettings"&gt;Settings Components (&lt;code&gt;lib/components/settings/&lt;/code&gt;)&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Component&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;settings_component.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Application settings panel (theme, language, preferences)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;about_screen.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;About screen with app version, license, and links&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="shared-components-libcomponentsshared"&gt;Shared Components (&lt;code&gt;lib/components/shared/&lt;/code&gt;)&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Component&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;nav_bar_component.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Bottom navigation bar (mobile app navigation)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;confirm_dialog.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Generic confirmation dialog (confirm/cancel actions)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;language_selector.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Language selection dropdown for i18n&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="application-structure-libsrc"&gt;Application Structure (&lt;code&gt;lib/src/&lt;/code&gt;)&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;File&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;app.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Root app widget with router and global providers&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;sample_feature/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Sample feature code (Flutter template, may be unused)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;settings/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Settings controller and service (legacy, may be unused)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;localization/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;App localization delegates&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="services-libservices"&gt;Services (&lt;code&gt;lib/services/&lt;/code&gt;)&lt;/h2&gt;
&lt;h3 id="authentication-services-libservicesauth"&gt;Authentication Services (&lt;code&gt;lib/services/auth/&lt;/code&gt;)&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Service&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;app_auth.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Authentication state management and token handling&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;auth_interceptor.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;HTTP request interceptor for auth token injection&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;auth_logger.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Authentication event logging&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;auth_notifier.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Authentication state change notifications&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;auth_state.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Authentication state enum and data classes&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;auth_providers.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Riverpod providers for auth services&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;token_storage.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Secure token storage (Keychain/Keystore)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;connectivity_checker.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Network connectivity status checker&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;network_error_classifier.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Network error classification and retry logic&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;insecure_http_client.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;HTTP client for dev environments (bypasses SSL)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="other-services-libservices"&gt;Other Services (&lt;code&gt;lib/services/&lt;/code&gt;)&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Service&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;keycloak/keycloak_service.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Keycloak OIDC service wrapper&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;connectivity_service.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Network connectivity monitoring&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;notification_service.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Push notification handling&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;user_service.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;User profile and preferences service&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;i18n_service.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Internationalization service&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;genie_ai_config.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;GENIE.AI configuration loader&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;fallback_localizations.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Fallback localization delegates&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;sse_parser.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Server-Sent Events (SSE) stream parser&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="configuration-libconfig"&gt;Configuration (&lt;code&gt;lib/config/&lt;/code&gt;)&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;File&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;keycloak_config.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Keycloak OIDC client configuration&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;dev_config.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Development environment configuration&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;staging_config.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Staging environment configuration&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;e2e_config.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;E2E testing configuration&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;flavors/itu.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;ITU flavor-specific configuration&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;flavors/template.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Flavor configuration template&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="providers-libproviders"&gt;Providers (&lt;code&gt;lib/providers/&lt;/code&gt;)&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;File&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;api_providers.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Riverpod providers for API clients&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="utilities-libutils"&gt;Utilities (&lt;code&gt;lib/utils/&lt;/code&gt;)&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;File&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;theme_manager.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Theme switching and persistence&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;chart_theme_utils.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Chart theme utilities (for analytics charts)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;dialog_theme_utils.dart&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Dialog theme utilities&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="internationalization-libi18nlocales"&gt;Internationalization (&lt;code&gt;lib/i18n/locales/&lt;/code&gt;)&lt;/h2&gt;
&lt;p&gt;Supported languages (14 locales):&lt;/p&gt;</description></item><item><title>Docker Compose Setup</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/deployment/docker-compose-setup/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/deployment/docker-compose-setup/</guid><description>&lt;p&gt;This guide covers local single-node deployment using &lt;code&gt;docker compose up&lt;/code&gt;. For multi-node production deployments with Docker Swarm, see &lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/deployment/docker-swarm-setup/"&gt;Docker Swarm Deployment Guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;GENIE.AI uses a single dual-mode &lt;code&gt;docker-compose.yaml&lt;/code&gt; at the project root that works with both &lt;code&gt;docker compose up&lt;/code&gt; and &lt;code&gt;docker stack deploy&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Docker Engine 23+&lt;/strong&gt; with Compose v2 (&lt;code&gt;docker compose&lt;/code&gt; subcommand)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NVIDIA Container Toolkit&lt;/strong&gt; (only if using OPEA/GPU services)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hugging Face API token&lt;/strong&gt; (only if using OPEA/GPU services)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="architecture-overview"&gt;Architecture Overview&lt;/h2&gt;
&lt;p&gt;For the full system architecture with diagrams (C4 context/container, authentication flows, service auth matrix, token lifecycle, RAG pipeline), see &lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/architecture/architecture/"&gt;Architecture Overview&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Document Lifecycle</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/knowledge-base/document-lifecycle/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/knowledge-base/document-lifecycle/</guid><description>&lt;p&gt;Every document in the knowledge base has a lifecycle: it is uploaded, processed,
made retrievable, and eventually updated or removed. Each document is tracked by
a stable &lt;code&gt;file_id&lt;/code&gt;, so its status, chunks, and graph footprint are all addressable.&lt;/p&gt;
&lt;h2 id="states"&gt;States&lt;/h2&gt;
&lt;p&gt;A document moves through these states (recorded as &lt;code&gt;dataprep.status&lt;/code&gt;):&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;State&lt;/th&gt;
 &lt;th&gt;Meaning&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;em&gt;uploaded&lt;/em&gt;&lt;/td&gt;
 &lt;td&gt;File received and virus-scanned; stored on disk. Not yet searchable.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;em&gt;processing&lt;/em&gt;&lt;/td&gt;
 &lt;td&gt;Dataprep is parsing, chunking, labelling, and embedding.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;em&gt;completed&lt;/em&gt;&lt;/td&gt;
 &lt;td&gt;All chunks indexed; the document is retrievable.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;em&gt;failed&lt;/em&gt;&lt;/td&gt;
 &lt;td&gt;Processing failed; the document is &lt;strong&gt;not&lt;/strong&gt; searchable. Check the ingestion log for the reason.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Only documents in the &lt;strong&gt;completed&lt;/strong&gt; state contribute to answers. A document
stuck in &lt;em&gt;processing&lt;/em&gt; or in &lt;em&gt;failed&lt;/em&gt; is invisible to retrieval.&lt;/p&gt;</description></item><item><title>External Idp Integration Guide</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/configuration/external-idp-integration-guide/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/configuration/external-idp-integration-guide/</guid><description>&lt;p&gt;This guide explains how to connect an external identity provider (IdP) to GENIE.AI through Keycloak. Once configured, users can authenticate via the external IdP without any GENIE.AI code or configuration changes.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How It Works&lt;/h2&gt;
&lt;p&gt;GENIE.AI uses Keycloak as its sole identity boundary. When an external IdP is configured in Keycloak, the authentication flow is:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Browser -&amp;gt; GENIE.AI Frontend -&amp;gt; Keycloak Login Page
 |
 +-- [Local Credentials] -&amp;gt; Keycloak Token -&amp;gt; GENIE.AI
 |
 +-- [External IdP Button] -&amp;gt; External IdP Login
 |
 Keycloak Broker
 (issues own token)
 |
 Keycloak Token -&amp;gt; GENIE.AI
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;GENIE.AI always receives a standard Keycloak-issued OIDC token, regardless of which external IdP was used. The backend middleware, JIT provisioning, and frontend auth flow are completely unaware of the external IdP.&lt;/p&gt;</description></item><item><title>Mobile Architecture</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/mobile/mobile-architecture/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/mobile/mobile-architecture/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;For mobile developers and integrators.&lt;/strong&gt; The Flutter app&amp;rsquo;s architecture — layers, state, and platform integration.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;The Flutter mobile app (&lt;code&gt;genie_ai_mobile&lt;/code&gt;) is a sophisticated AI chat application with OIDC authentication, multi-language support, and responsive design patterns.&lt;/p&gt;
&lt;h2 id="1-api-layer"&gt;1. API Layer&lt;/h2&gt;
&lt;h3 id="service--provider-layer"&gt;Service &amp;amp; Provider Layer&lt;/h3&gt;
&lt;p&gt;The app does &lt;strong&gt;not&lt;/strong&gt; use a proxy pattern. API access is structured around
Riverpod providers and a thin set of domain services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Riverpod providers&lt;/strong&gt; (&lt;code&gt;lib/providers/api_providers.dart&lt;/code&gt;) — define the API
calls (chat/query, feedback, user profile, analytics, admin) as providers
consumed by the UI.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Domain services&lt;/strong&gt; (&lt;code&gt;lib/services/&lt;/code&gt;):
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;user_service.dart&lt;/code&gt; — user profile operations.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;connectivity_service.dart&lt;/code&gt; — network connectivity state.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;i18n_service.dart&lt;/code&gt; — locale and translation orchestration.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;notification_service.dart&lt;/code&gt;, &lt;code&gt;sse_parser.dart&lt;/code&gt;, &lt;code&gt;genie_ai_config.dart&lt;/code&gt;,
&lt;code&gt;fallback_localizations.dart&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;auth/&lt;/code&gt; and &lt;code&gt;keycloak/&lt;/code&gt; subdirectories — OIDC auth state, token storage,
and Keycloak integration.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The flavor-specific base URL comes from the flavor config (see §2).&lt;/p&gt;</description></item><item><title>Mobile Deployment Guide</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/mobile/mobile-deployment-guide/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/mobile/mobile-deployment-guide/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;This guide walks deployment technicians through creating a new institutional deployment of the GENIE.AI mobile app. Each deployment produces a dedicated build with its own app ID, Keycloak client, backend URL, and deep link scheme — all compiled at build-time via Flutter flavors.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Target audience:&lt;/strong&gt; Deployment technicians familiar with Flutter, Gradle, Xcode, and Docker.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Estimated time:&lt;/strong&gt; Under a day for a single deployment.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Requirement&lt;/th&gt;
 &lt;th&gt;Purpose&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Flutter SDK 3.10+&lt;/td&gt;
 &lt;td&gt;Build the mobile app&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Android Studio (with SDK)&lt;/td&gt;
 &lt;td&gt;Android builds, Gradle, emulator&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Xcode 14+ (macOS only)&lt;/td&gt;
 &lt;td&gt;iOS builds, signing, IPA creation&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Docker + Docker Compose&lt;/td&gt;
 &lt;td&gt;Run Keycloak locally for testing&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Device or emulator&lt;/td&gt;
 &lt;td&gt;End-to-end validation&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Access to deployment &lt;code&gt;.env&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Configure Keycloak client and redirect scheme&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Keystore for Android signing&lt;/td&gt;
 &lt;td&gt;Release builds (see &lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/mobile/mobile-deployment-guide/#step-5-android-signing"&gt;Step 5: Android Signing&lt;/a&gt;)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="step-1-environment-variables"&gt;Step 1: Environment Variables&lt;/h2&gt;
&lt;p&gt;Add two required variables to the deployment &lt;code&gt;.env&lt;/code&gt; file:&lt;/p&gt;</description></item><item><title>Retrieval</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/rag/retrieval/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/rag/retrieval/</guid><description>&lt;p&gt;Retrieval is the stage that decides &lt;em&gt;which&lt;/em&gt; chunks of the knowledge base the LLM
is allowed to see. GENIE.AI does not rely on a single signal: it fuses
&lt;strong&gt;dense-vector&lt;/strong&gt; search with &lt;strong&gt;lexical (BM25)&lt;/strong&gt; search, and can additionally walk
the &lt;strong&gt;knowledge graph&lt;/strong&gt; to surface related chunks. The result is high recall
(semantic matches the exact-keyword search would miss) without losing precision
on proper nouns, codes, and rare terms that dense models handle poorly.&lt;/p&gt;</description></item><item><title>Source Tree Analysis</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/core/source-tree-analysis/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/core/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/core/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/core/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/core/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/core/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/core/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/core/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/core/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/core/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/core/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/core/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/core/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>State Management Frontend</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/frontend/state-management-frontend/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/frontend/state-management-frontend/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;For frontend developers.&lt;/strong&gt; How the Vue 3 web app manages state — Vuex store, modules, and data flow.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;The frontend application uses &lt;strong&gt;Vuex 4.x&lt;/strong&gt; for centralized state management, with a modular architecture that separates concerns between authentication, chat history, and application state. The implementation follows modern Vue.js 3 patterns with namespaced modules.&lt;/p&gt;
&lt;h2 id="store-architecture"&gt;Store Architecture&lt;/h2&gt;
&lt;h3 id="main-store-srcstoreindexjs"&gt;Main Store (&lt;code&gt;/src/store/index.js&lt;/code&gt;)&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;createStore&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="nx"&gt;modules&lt;/span&gt;&lt;span class="o"&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="nx"&gt;chatHistory&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;chatHistoryStore&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="nx"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;auth&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;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;plugins&lt;/span&gt;&lt;span class="o"&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="c1"&gt;// localStorage persistence plugin for chatHistory
&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;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;&lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Tracing</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/observability/tracing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/observability/tracing/</guid><description>&lt;p&gt;Tracing is what makes a GENIE.AI user query legible. Because every service
propagates a single W3C &lt;code&gt;traceparent&lt;/code&gt; header and every RAG stage emits a span,
one user question produces one contiguous trace that can be read end-to-end in
Grafana — revealing exactly where time went and which chunks were retrieved.&lt;/p&gt;
&lt;h2 id="trace-propagation"&gt;Trace propagation&lt;/h2&gt;
&lt;p&gt;The trace starts at the edge. Kong creates the root span and injects a
&lt;code&gt;traceparent&lt;/code&gt; header into the request. Each downstream hop reads that header,
joins the trace as a child span, and re-injects the header for the next hop:&lt;/p&gt;</description></item><item><title>Updates</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/operations/updates/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/operations/updates/</guid><description>&lt;p&gt;GENIE.AI has three kinds of update, with different blast radii. The critical
thing to know is &lt;strong&gt;which updates force a knowledge-base re-ingestion&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="the-re-ingestion-rule"&gt;The re-ingestion rule&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Change&lt;/th&gt;
 &lt;th&gt;Re-ingest required?&lt;/th&gt;
 &lt;th&gt;Why&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;LLM&lt;/strong&gt; (&lt;code&gt;VLLM_LLM_MODEL_ID&lt;/code&gt;)&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;The LLM reads chunks at query time; it does not change stored data. Restart vLLM.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Reranker&lt;/strong&gt; (&lt;code&gt;RERANKER_MODEL_ID&lt;/code&gt;)&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Reranking is a query-time re-score. Restart the reranker / TEI.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Translation&lt;/strong&gt; (&lt;code&gt;VLLM_TRANSLATION_MODEL_ID&lt;/code&gt;)&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Translation is query-time. Restart the translation service.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Embedding model&lt;/strong&gt; (&lt;code&gt;EMBEDDING_MODEL_ID&lt;/code&gt;)&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Existing chunk vectors are in the old model&amp;rsquo;s space. Re-ingest everything.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Labelling taxonomy&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;Recommended&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Labels are stored on chunks at ingest time; a changed taxonomy needs re-labelling.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Chunking / dataprep logic&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Chunk boundaries and content change.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Changing the embedding model is the expensive update.&lt;/strong&gt; Plan a full re-ingest
(see &lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/knowledge-base/"&gt;Knowledge base&lt;/a&gt;) when you change
&lt;code&gt;EMBEDDING_MODEL_ID&lt;/code&gt;. Everything else is a service restart.&lt;/p&gt;</description></item><item><title>Dashboards</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/observability/dashboards/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/observability/dashboards/</guid><description>&lt;p&gt;Grafana dashboards are &lt;strong&gt;auto-provisioned&lt;/strong&gt; from &lt;code&gt;configs/grafana/provisioning/&lt;/code&gt;,
so a deployment gets a working set of dashboards the moment the stack starts — no
manual import. They are grouped into two folders.&lt;/p&gt;
&lt;h2 id="application-folder"&gt;Application folder&lt;/h2&gt;
&lt;p&gt;Operational views of the GENIE.AI services themselves.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Dashboard&lt;/th&gt;
 &lt;th&gt;What it shows&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Service health&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Per-service up/down, replica count, error rate, request rate. The landing view for &amp;ldquo;is anything broken?&amp;rdquo;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Application metrics&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Business and HTTP metrics: request rates, latency distributions, error rates, custom counters.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Service logs&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Centralised log search across all services (VictoriaLogs). Pivot from a metric spike to the matching logs.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Trace explorer&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Distributed-trace search (VictoriaTraces via the Jaeger datasource): filter by service, operation, duration, attribute.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;RAG pipeline trace waterfall&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;A waterfall charting per-service latency across the RAG pipeline (backend, chatqna, retriever, reranker, dataprep), so the slow stage is immediately visible.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="observability-folder"&gt;Observability folder&lt;/h2&gt;
&lt;p&gt;Health of the observability stack itself — so the monitoring does not fail
silently.&lt;/p&gt;</description></item><item><title>Docker Swarm Setup</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/deployment/docker-swarm-setup/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/deployment/docker-swarm-setup/</guid><description>&lt;p&gt;This guide covers Docker Swarm deployments (single-node and multi-node). For local single-node development with &lt;code&gt;docker compose up&lt;/code&gt;, see &lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/deployment/docker-compose-setup/"&gt;Docker Compose Setup Guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;GENIE.AI uses a single Swarm-compatible &lt;code&gt;docker-compose.yaml&lt;/code&gt; at the project root. All services are deployed via &lt;code&gt;docker stack deploy&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Docker Engine 23+&lt;/strong&gt; on all nodes (Compose v2 support required)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NVIDIA Container Toolkit&lt;/strong&gt; on GPU nodes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Same Docker version&lt;/strong&gt; on all nodes (recommended)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SSH access&lt;/strong&gt; to all nodes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network connectivity&lt;/strong&gt; between all nodes (ports 2377/tcp, 7946/tcp+udp, 4789/udp)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="architecture-overview"&gt;Architecture Overview&lt;/h2&gt;
&lt;p&gt;For the full system architecture with diagrams (C4 context/container, authentication flows, service auth matrix, token lifecycle, RAG pipeline), see &lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/architecture/architecture/"&gt;Architecture Overview&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Integration Architecture</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/core/integration-architecture/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/core/integration-architecture/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;For integrators and developers.&lt;/strong&gt; How the components fit together: service boundaries, dependencies, and the inter-service contract surface.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This document describes the integration points, communication patterns, and data flows between all components of the GENIE.AI platform.&lt;/p&gt;
&lt;h2 id="table-of-contents"&gt;Table of Contents&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/core/integration-architecture/#system-overview"&gt;System Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/core/integration-architecture/#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/core/integration-architecture/#communication-protocols"&gt;Communication Protocols&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/core/integration-architecture/#data-flow-diagrams"&gt;Data Flow Diagrams&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/core/integration-architecture/#authentication--authorization"&gt;Authentication &amp;amp; Authorization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/core/integration-architecture/#service-discovery--routing"&gt;Service Discovery &amp;amp; Routing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/core/integration-architecture/#error-handling--resilience"&gt;Error Handling &amp;amp; Resilience&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/core/integration-architecture/#security-considerations"&gt;Security Considerations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="system-overview"&gt;System Overview&lt;/h2&gt;
&lt;p&gt;GENIE.AI is a monorepo consisting of 6 main parts that communicate through REST APIs, SSE (Server-Sent Events), and direct database connections:&lt;/p&gt;</description></item><item><title>Labelling &amp; Taxonomy</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/knowledge-base/labelling-taxonomy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/knowledge-base/labelling-taxonomy/</guid><description>&lt;p&gt;Labelling is what keeps a multi-domain knowledge base from bleeding across
topics. Every chunk is assigned one or more &lt;strong&gt;labels&lt;/strong&gt; drawn from the
&lt;strong&gt;service-category taxonomy&lt;/strong&gt;, and at query time the retriever uses those labels
to return only on-topic chunks. Without labels, a question about one service
could pull in unrelated chunks from another.&lt;/p&gt;
&lt;h2 id="the-taxonomy"&gt;The taxonomy&lt;/h2&gt;
&lt;p&gt;The taxonomy is the &lt;strong&gt;service-category hierarchy&lt;/strong&gt; — the set of categories and
services the deployment answers about. It is managed in the backend
(&lt;code&gt;serviceCategories&lt;/code&gt;, &lt;code&gt;services&lt;/code&gt;) and is the same structure the application uses
to organise its service catalogue.&lt;/p&gt;</description></item><item><title>Reranking</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/rag/reranking/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/rag/reranking/</guid><description>&lt;p&gt;Retrieval hands the reranker a candidate set of chunks; the reranker&amp;rsquo;s job is to
re-order them by true relevance to the query and decide &lt;strong&gt;how many&lt;/strong&gt; (if any) are
good enough to send to the LLM. A cross-encoder reranker is more accurate than
the bi-encoder used for retrieval because it reads the query and each chunk
together, but it is also slower — which is why it runs only on the small
candidate set, not the whole corpus.&lt;/p&gt;</description></item><item><title>Scaling</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/operations/scaling/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/operations/scaling/</guid><description>&lt;p&gt;GENIE.AI runs on Docker Swarm, so horizontal scaling is a &lt;code&gt;docker service scale&lt;/code&gt;
command. Vertical scaling — especially GPU memory — is a configuration change per
service. The two are independent and solve different problems.&lt;/p&gt;
&lt;h2 id="horizontal-scaling-replicas"&gt;Horizontal scaling (replicas)&lt;/h2&gt;
&lt;p&gt;Scale a stateless service to more replicas:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker service scale genieai_&amp;lt;service&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;replicas&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Services that scale well (stateless, query-time):&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Service&lt;/th&gt;
 &lt;th&gt;Scales?&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;Backend (BFF)&lt;/td&gt;
 &lt;td&gt;Yes&lt;/td&gt;
 &lt;td&gt;Stateless behind Kong.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ChatQnA&lt;/td&gt;
 &lt;td&gt;Yes&lt;/td&gt;
 &lt;td&gt;Stateless orchestrator.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Retriever&lt;/td&gt;
 &lt;td&gt;Yes&lt;/td&gt;
 &lt;td&gt;Stateless; shares the same ArangoDB.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Reranker / TEI&lt;/td&gt;
 &lt;td&gt;Yes&lt;/td&gt;
 &lt;td&gt;Stateless.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;vLLM&lt;/td&gt;
 &lt;td&gt;With care&lt;/td&gt;
 &lt;td&gt;Each replica needs its own GPU memory budget; see below.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Dataprep&lt;/td&gt;
 &lt;td&gt;Yes (ingest)&lt;/td&gt;
 &lt;td&gt;More replicas = more parallel ingestion throughput.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ArangoDB&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;No (single-node)&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;The bundled ArangoDB is single-node; do not scale it. Add resources, not replicas.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ArangoDB is the bottleneck you cannot replica your way out of.&lt;/strong&gt; The
single-node database handles the whole retrieval load. If retrieval latency
climbs under load, first check the database&amp;rsquo;s resources and query performance
(see the &lt;em&gt;VictoriaMetrics&lt;/em&gt; dashboard), not the retriever count.&lt;/p&gt;</description></item><item><title>Theme System</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/frontend/theme-system/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/frontend/theme-system/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;For frontend developers.&lt;/strong&gt; The web app&amp;rsquo;s theme system — design tokens, SCSS variables, and customisation points.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="theme-system"&gt;Theme System&lt;/h1&gt;
&lt;p&gt;GENIE.AI uses a CSS-native theming architecture. A single &lt;strong&gt;brand color&lt;/strong&gt; drives the entire accent palette, including dark mode — no JavaScript color manipulation.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How It Works&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;JSON config (genie-ai-config.json)
 │
 ▼
main.js — injects base CSS variables via inline style
 │
 ▼
theme-variables.css — derives full palette using OKLch relative syntax
 │
 ▼
Components consume tokens via var(--token)
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="1-json-config"&gt;1. JSON Config&lt;/h3&gt;
&lt;p&gt;The config file (&lt;code&gt;public/config/genie-ai-config.json&lt;/code&gt;) defines the base theme:&lt;/p&gt;</description></item><item><title>Alerting</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/observability/alerting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/observability/alerting/</guid><description>&lt;p&gt;Alerting is auto-provisioned alongside the dashboards, so a fresh deployment
already watches the failures that matter most: &lt;strong&gt;the stack going silent, storage
filling up, the log pipeline breaking, and trace export failing&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Three files under &lt;code&gt;configs/grafana/provisioning/alerting/&lt;/code&gt; define the setup:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;File&lt;/th&gt;
 &lt;th&gt;Purpose&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;alert-rules.yml&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;The alert definitions (condition + for-duration).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;notification-policies.yml&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Which alerts route to which contact points, and grouping/escalation.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;contact-points.yml&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Where notifications are sent. The shipped default is a single webhook contact point; Slack/SMTP/PagerDuty are added per environment.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="built-in-alert-rules"&gt;Built-in alert rules&lt;/h2&gt;
&lt;p&gt;The rules target the failure modes that would otherwise make the observability
stack &lt;em&gt;itself&lt;/em&gt; lie to you.&lt;/p&gt;</description></item><item><title>Content Guidance</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/knowledge-base/content-guidance/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/knowledge-base/content-guidance/</guid><description>&lt;p&gt;The single biggest factor in GENIE.AI answer quality is the &lt;strong&gt;quality of the
documents in the knowledge base&lt;/strong&gt;. No amount of retrieval tuning fixes documents
that are poorly structured, ambiguous, or full of content the parser cannot read.
This page is practical guidance for the people choosing and preparing source
documents.&lt;/p&gt;
&lt;h2 id="what-retrieves-well"&gt;What retrieves well&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Clean, text-based documents&lt;/strong&gt; — real text the parser can extract, not scanned
images.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clear structure&lt;/strong&gt; — headings, sections, lists. Structure helps both chunking
(cleaner chunk boundaries) and the knowledge graph.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Self-contained sections&lt;/strong&gt; — a chunk that makes sense on its own retrieves far
better than one full of &amp;ldquo;see above&amp;rdquo; or dangling pronouns.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;One topic per section&lt;/strong&gt; — focused sections produce precise labels.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Explicit language&lt;/strong&gt; — the words a user would actually type. A document that
calls it &amp;ldquo;the Programme&amp;rdquo; everywhere will not retrieve for &amp;ldquo;permit renewal&amp;rdquo;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="what-retrieves-poorly"&gt;What retrieves poorly&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Scanned / image-only PDFs&lt;/strong&gt; — there is little or no extractable text; the
chunk is near-empty. OCR these into real text first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Table-heavy documents&lt;/strong&gt; — most chunks become padded table rows with low
information density and poor labels. This is a known, expected pattern, not a
labelling bug.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Documents that are all boilerplate&lt;/strong&gt; — headers/footers repeated on every page
pollute chunks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enormous, undifferentiated documents&lt;/strong&gt; — without structure, chunks are
arbitrary windows of text.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="chunking"&gt;Chunking&lt;/h2&gt;
&lt;p&gt;The dataprep splits parsed text into retrieval-sized chunks. You do not control
chunk boundaries directly, but you influence their quality through document
structure: well-headed documents chunk cleanly; wall-of-text documents chunk
arbitrarily. If a specific document retrieves badly, the first fix is almost
always the document&amp;rsquo;s structure, not a pipeline knob.&lt;/p&gt;</description></item><item><title>Development Guide</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/core/development-guide/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/core/development-guide/</guid><description>&lt;h1 id="genieai-development-guide"&gt;GENIE.AI Development Guide&lt;/h1&gt;
&lt;p&gt;This guide covers all aspects of developing GENIE.AI, a sovereign RAG system for public sector services.&lt;/p&gt;
&lt;h2 id="table-of-contents"&gt;Table of Contents&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/core/development-guide/#prerequisites"&gt;Prerequisites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/core/development-guide/#quick-start"&gt;Quick Start&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/core/development-guide/#project-structure"&gt;Project Structure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/core/development-guide/#environment-configuration"&gt;Environment Configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/core/development-guide/#component-development"&gt;Component Development&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/core/development-guide/#frontend-vue-3"&gt;Frontend (Vue 3)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/core/development-guide/#backend-nodejs"&gt;Backend (Node.js)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/core/development-guide/#document-repository-nodejs"&gt;Document Repository (Node.js)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/core/development-guide/#mobile-flutter"&gt;Mobile (Flutter)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/core/development-guide/#aiml-services-python"&gt;AI/ML Services (Python)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/core/development-guide/#api-gateway-kongnginx"&gt;API Gateway (Kong/NGINX)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/core/development-guide/#docker-development"&gt;Docker Development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/core/development-guide/#database-setup"&gt;Database Setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/core/development-guide/#testing"&gt;Testing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/core/development-guide/#linting-and-formatting"&gt;Linting and Formatting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/core/development-guide/#api-client-generation"&gt;API Client Generation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/core/development-guide/#git-workflow"&gt;Git Workflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/core/development-guide/#deployment"&gt;Deployment&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;h3 id="global-requirements"&gt;Global Requirements&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Node.js&lt;/strong&gt;: 22.x LTS (for all JS components)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;npm&lt;/strong&gt;: 9.x or later&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Python&lt;/strong&gt;: 3.10 or later (for AI/ML services)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docker&lt;/strong&gt;: 24.x or later&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docker Compose&lt;/strong&gt;: v2.x&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git&lt;/strong&gt;: 2.x or later&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="component-specific-requirements"&gt;Component-Specific Requirements&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Component&lt;/th&gt;
 &lt;th&gt;Requirements&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Frontend&lt;/td&gt;
 &lt;td&gt;Node.js 22+, npm 9+&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Backend&lt;/td&gt;
 &lt;td&gt;Node.js 22+, npm 9+&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Document Repository&lt;/td&gt;
 &lt;td&gt;Node.js 22+, npm 9+&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Mobile&lt;/td&gt;
 &lt;td&gt;Flutter 3.10+, Dart 3.10.8+, Android Studio / Xcode&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;AI/ML Services&lt;/td&gt;
 &lt;td&gt;Python 3.10+, pip, GPU (NVIDIA) for OPEA services&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;API Gateway&lt;/td&gt;
 &lt;td&gt;Docker, OpenSSL (for certificates)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="quick-start"&gt;Quick Start&lt;/h2&gt;
&lt;h3 id="1-clone-and-install-dependencies"&gt;1. Clone and Install Dependencies&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Clone the repository&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone &amp;lt;repository-url&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; genie-ai
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Install root dependencies&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Install component dependencies&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install --prefix components/gov-chat-frontend
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install --prefix components/gov-chat-backend
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install --prefix components/document-repository
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install --prefix components/shared/lib
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-configure-environment"&gt;2. Configure Environment&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Copy environment template&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp env .env
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Edit .env with your local values&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Required: ARANGO_PASSWORD, POSTGRES_PASSWORD, KONG_DB_PASSWORD,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# KEYCLOAK_ADMIN_PASSWORD, KEYCLOAK_CLIENT_SECRET,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# KEYCLOAK_PROXY_CLIENT_SECRET, KC_DATAPREP_CLIENT_SECRET,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# EMAIL_* (SMTP configuration)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-start-services"&gt;3. Start Services&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Option 1: Core services only (no AI/ML)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Option 2: Full stack with AI/ML services&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose --profile opea up -d
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Option 3: With GPU-specific configuration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose --env-file .env --env-file env.t4 --profile opea up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="4-access-services"&gt;4. Access Services&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Frontend&lt;/strong&gt;: http://localhost:8090 (or https://localhost via nginx)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Backend API&lt;/strong&gt;: http://localhost:3000/api&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Document Repository&lt;/strong&gt;: http://localhost:3001/api&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keycloak Admin&lt;/strong&gt;: https://localhost/auth/admin&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API Documentation&lt;/strong&gt;: http://localhost:3000/api-docs&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="project-structure"&gt;Project Structure&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;genie-ai/
├── components/
│ ├── gov-chat-frontend/ # Vue 3 web application
│ ├── gov-chat-backend/ # Node.js/Express API
│ ├── document-repository/ # File upload/processing service
│ └── shared/lib/ # Shared utilities (logger, ArangoDB)
├── mobile/
│ └── genie_ai_mobile/ # Flutter mobile application
├── genie-ai-overlay/ # OPEA AI/ML microservices
│ ├── chatqna/ # Main chat service
│ ├── retriever/ # Hybrid vector-graph retrieval
│ ├── reranker/ # Result reranking
│ ├── dataprep/ # Document ingestion pipeline
│ └── core/ # Shared types and utilities
├── api-gateway-solution/ # Kong/NGINX configuration
├── deploy/ansible/ # Ansible deployment playbooks
├── configs/ # Configuration files (Keycloak, prompts)
├── scripts/ # Utility scripts
└── docs/ # Documentation
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="environment-configuration"&gt;Environment Configuration&lt;/h2&gt;
&lt;h3 id="environment-files"&gt;Environment Files&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;env&lt;/code&gt;&lt;/strong&gt; (no extension): Template file, committed to git&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.env&lt;/code&gt;&lt;/strong&gt; (with dot): Local overrides, &lt;strong&gt;NEVER committed&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="required-secrets"&gt;Required Secrets&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Database passwords&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ARANGO_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;strong-password&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;strong-password&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;KONG_DB_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;different-strong-password&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;KEYCLOAK_DB_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;different-strong-password&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;TRANSLATION_CACHE_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;strong-password&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Keycloak secrets&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;KEYCLOAK_ADMIN_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;strong-admin-password&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;KEYCLOAK_CLIENT_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;generate-with-openssl-rand-base64-32&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;KEYCLOAK_PROXY_CLIENT_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;generate-with-openssl-rand-base64-32&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;GENIE_ADMIN_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;strong-password&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;KC_DATAPREP_CLIENT_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;generate-with-openssl-rand-base64-32&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Email configuration (required for user verification)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;EMAIL_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;smtp.example.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;EMAIL_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;587&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;EMAIL_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-email@example.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;EMAIL_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-email-password
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;EMAIL_FROM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;noreply@example.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Optional: AI model access&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;HUGGING_FACE_HUB_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;your-huggingface-token&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="generating-secure-passwords"&gt;Generating Secure Passwords&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Using OpenSSL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl rand -base64 &lt;span class="m"&gt;32&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Using Python&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python3 -c &lt;span class="s2"&gt;&amp;#34;import secrets; print(secrets.token_urlsafe(32))&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="component-development"&gt;Component Development&lt;/h2&gt;
&lt;h3 id="frontend-vue-3"&gt;Frontend (Vue 3)&lt;/h3&gt;
&lt;h4 id="prerequisites-1"&gt;Prerequisites&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Node.js 22.x LTS&lt;/li&gt;
&lt;li&gt;npm 9.x or later&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="installation"&gt;Installation&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; components/gov-chat-frontend
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="development-commands"&gt;Development Commands&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Run development server&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run serve
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Build for production&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run build
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Run tests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Lint code&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run lint
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Auto-fix lint issues&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run lint:fix
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Format code&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run format
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Check formatting without modifying&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run format:check
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="common-development-tasks"&gt;Common Development Tasks&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Adding a New Component&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Generation</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/rag/generation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/rag/generation/</guid><description>&lt;p&gt;Generation is the final RAG stage: the kept chunks are assembled into a prompt
and sent to the LLM, which produces a grounded answer streamed back to the user.
The default LLM is &lt;code&gt;meta-llama/Meta-Llama-3.1-8B-Instruct&lt;/code&gt; (the docker-compose
default). &lt;code&gt;ibm-granite/granite-4.1-8b&lt;/code&gt; is the recommended and validated model;
&lt;code&gt;ibm-granite/granite-3.3-2b-instruct&lt;/code&gt; is the in-code fallback. All are served by
vLLM (OpenAI-compatible API).&lt;/p&gt;
&lt;p&gt;The generation behaviour is shaped by three things: the &lt;strong&gt;system prompt&lt;/strong&gt;, the
&lt;strong&gt;abstention&lt;/strong&gt; rule, and an optional &lt;strong&gt;self-confidence&lt;/strong&gt; token. Each is an
environment variable with a built-in default.&lt;/p&gt;</description></item><item><title>GPU Deployment</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/deployment/gpu/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/deployment/gpu/</guid><description>&lt;p&gt;This guide explains how to deploy GENIE.AI on different NVIDIA GPUs.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;NVIDIA Driver installed&lt;/li&gt;
&lt;li&gt;NVIDIA Container Toolkit installed&lt;/li&gt;
&lt;li&gt;Docker with NVIDIA support&lt;/li&gt;
&lt;li&gt;Docker Swarm initialized: &lt;code&gt;docker swarm init&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;GPU node labeled: &lt;code&gt;docker node update --label-add gpu=true $(hostname)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Created &lt;code&gt;.env&lt;/code&gt; file from &lt;code&gt;env&lt;/code&gt; template with your secrets&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="environment-file-loading"&gt;Environment File Loading&lt;/h2&gt;
&lt;p&gt;Docker Swarm (&lt;code&gt;docker stack deploy&lt;/code&gt;) does NOT support &lt;code&gt;--env-file&lt;/code&gt;. Instead, source the files before deploying:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# CORRECT - loads both .env and GPU overrides&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -a &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt; .env &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt; env.t4 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; +a &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; docker stack deploy -c docker-compose.yaml genieai
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# WRONG - docker stack deploy ignores --env-file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker stack deploy --env-file .env -c docker-compose.yaml genieai
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="available-gpu-deployments"&gt;Available GPU Deployments&lt;/h2&gt;
&lt;h3 id="1-gpu-t4-16gb-vram---conservative-configuration"&gt;1. GPU T4 (16GB VRAM) - Conservative Configuration&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Profile:&lt;/strong&gt; Development and testing
&lt;strong&gt;GPU:&lt;/strong&gt; NVIDIA T4 (16GB VRAM)&lt;/p&gt;</description></item><item><title>Troubleshooting</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/operations/troubleshooting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/operations/troubleshooting/</guid><description>&lt;p&gt;This page lists the problems operators hit most often, the first place to look,
and where the deeper notes live. For install-time problems, see the
troubleshooting sections of the &lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/deployment/"&gt;deployment guides&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="general-principle-trace-then-logs-then-code"&gt;General principle: trace, then logs, then code&lt;/h2&gt;
&lt;p&gt;For any &amp;ldquo;why did this answer come out wrong / slow / empty&amp;rdquo; question, the fastest
path is the &lt;strong&gt;trace&lt;/strong&gt;, not the logs:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Find the query&amp;rsquo;s trace in the &lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/observability/dashboards/"&gt;Trace explorer&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Walk the RAG stage spans to see which stage is slow or returns nothing.&lt;/li&gt;
&lt;li&gt;Pivot to the &lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/observability/dashboards/"&gt;service logs&lt;/a&gt;
for that stage&amp;rsquo;s error detail.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;See &lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/observability/"&gt;Observability&lt;/a&gt; for how.&lt;/p&gt;</description></item><item><title>Configuration</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/observability/configuration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/observability/configuration/</guid><description>&lt;p&gt;The observability stack is &lt;strong&gt;disabled by default&lt;/strong&gt;. Enabling it is a single
environment variable, but a handful of related variables control access,
retention, and sampling.&lt;/p&gt;
&lt;h2 id="enabling"&gt;Enabling&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;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;&lt;strong&gt;Must be &lt;code&gt;0&lt;/code&gt; or &lt;code&gt;1&lt;/code&gt;&lt;/strong&gt; (not &lt;code&gt;true&lt;/code&gt;/&lt;code&gt;false&lt;/code&gt;). Swarm mode reads this to place the stack.&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;OTLP base URL all instrumented services export to. Override only for an external collector.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;How it is enabled per deployment mode:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Docker Compose&lt;/strong&gt; — &lt;code&gt;docker compose --profile observability up -d&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docker Swarm&lt;/strong&gt; — &lt;code&gt;ENABLE_OBSERVABILITY=1&lt;/code&gt; in &lt;code&gt;.env&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ansible&lt;/strong&gt; — &lt;code&gt;enable_observability: &amp;quot;1&amp;quot;&lt;/code&gt; in &lt;code&gt;group_vars/all.yml&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sampling"&gt;Sampling&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;Notes&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;OTEL_TRACES_SAMPLER_RATE&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;100.0&lt;/td&gt;
 &lt;td&gt;Trace sampling percentage. Lower for high-volume prod; raise when diagnosing. Metrics and logs are not sampled.&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;1.0&lt;/td&gt;
 &lt;td&gt;Kong trace sampling rate (0–1), aligned with &lt;code&gt;OTEL_TRACES_SAMPLER_RATE&lt;/code&gt;.&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 tracing instrumentations. Negligible overhead when the OTel plugin is disabled.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="retention"&gt;Retention&lt;/h2&gt;
&lt;p&gt;Each Victoria store keeps data for a configurable window; lower it to save disk,
raise it for longer historical analysis.&lt;/p&gt;</description></item><item><title>Data Labelling Strategy</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/rag/data-labeling/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/rag/data-labeling/</guid><description>&lt;p&gt;This repository implements a &lt;strong&gt;data labeling and enrichment pipeline&lt;/strong&gt; designed to maximize the accuracy and explainability of Retrieval-Augmented Generation (RAG) systems.&lt;br&gt;
Unlike conventional data labeling systems that prepare training sets for supervised learning, this process focuses on &lt;strong&gt;labelling document chunks for ingestion into a RAG pipeline&lt;/strong&gt;, creating both semantic and structural signals that boost retrieval performance.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="why-this-approach"&gt;Why This Approach?&lt;/h2&gt;
&lt;p&gt;Most RAG pipelines rely solely on &lt;strong&gt;vector embeddings&lt;/strong&gt; for semantic similarity. While powerful, vector-only retrieval often suffers from:&lt;/p&gt;</description></item><item><title>NVIDIA A40 Install Guide</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/deployment/a40-install/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/deployment/a40-install/</guid><description>&lt;h1 id="guide-nvidia-driver-installation-on-ubuntu-2204"&gt;&lt;strong&gt;Guide: NVIDIA Driver Installation on Ubuntu 22.04&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;This guide covers the process of installing the server-grade NVIDIA drivers on E2E and resolving DKMS build failures caused by manually installed kernel headers. It outlines the specific steps needed to install NVIDIA drivers for an &lt;strong&gt;NVIDIA A40 GPU&lt;/strong&gt; on &lt;strong&gt;Ubuntu 22.04&lt;/strong&gt;, including how to bypass the common &amp;ldquo;Exit Status 10&amp;rdquo; error caused by rogue kernel headers. This is provided to help challenge participants install and configure on the specific images provided for the challenge on E2E Neetworks with A40 GPU&lt;/p&gt;</description></item><item><title>Contextual Retrieval</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/rag/contextual-retrieval/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/rag/contextual-retrieval/</guid><description>&lt;p&gt;Standard retrieval embeds each chunk in isolation. A chunk removed from its
section can be hard to match: a paragraph about &amp;ldquo;renewing it&amp;rdquo; will not retrieve
well for a query about &amp;ldquo;permit renewal&amp;rdquo; because the chunk alone does not say what
&amp;ldquo;it&amp;rdquo; is. &lt;strong&gt;Contextual Retrieval&lt;/strong&gt; (an Anthropic-style technique) fixes this by
prepending a short, LLM-generated &lt;strong&gt;doc-context prefix&lt;/strong&gt; to each chunk &lt;em&gt;before&lt;/em&gt;
it is embedded and labelled, so the chunk&amp;rsquo;s vector carries its surrounding
meaning.&lt;/p&gt;</description></item><item><title>Choosing and Configuring Models</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/rag/choosing-models/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/rag/choosing-models/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;GENIE.AI uses a &lt;strong&gt;multi-model architecture&lt;/strong&gt; where different AI models serve distinct purposes across the entire framework — from document ingestion and knowledge graph construction through to retrieval, reranking, and response generation. Not every model is suitable for every role. Choosing the wrong model for a given purpose will cause silent failures — ingestion batches being skipped, labels returning garbage, or graph data not being created.&lt;/p&gt;
&lt;p&gt;This guide explains what each model does, what capabilities it &lt;strong&gt;must&lt;/strong&gt; have, what license it is released under, and provides specific recommendations for both open-source and commercial models across different hardware tiers.&lt;/p&gt;</description></item><item><title>About GENIE.AI</title><link>https://genie-ai-7e342b.opensource.unicc.org/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/about/</guid><description>&lt;h1 id="about-genieai"&gt;About GENIE.AI&lt;/h1&gt;
&lt;p&gt;GENIE.AI is an open-source generative-AI framework for the public sector: a
sovereign, Digital Public Good (DPG)-compliant &lt;strong&gt;Retrieval-Augmented Generation
(RAG)&lt;/strong&gt; platform with multilingual support. It answers questions strictly from a
knowledge base you control, running every model on infrastructure you own. It
integrates with &lt;a href="https://opea.dev"&gt;OPEA (Open Platform for Enterprise AI)&lt;/a&gt; for
AI/ML services.&lt;/p&gt;
&lt;h2 id="why-it-matters"&gt;Why it matters&lt;/h2&gt;
&lt;p&gt;Public-sector institutions have constraints that generic AI services cannot meet.
GENIE.AI is built around them:&lt;/p&gt;</description></item></channel></rss>