AI Innovation Hub · Cyberjaya, Malaysia
Building AI at the
Edge and Beyond
The Dell AI Innovation Hub in Cyberjaya builds real AI applications — not demos. From a walking-route optimiser deployed for a Penang heritage city, to a fully sovereign chat platform running on Grace Blackwell with no cloud dependency, to a voice assistant that speaks fluent Bahasa Malaysia. Every project is in production or active development.
Coolest Path
DeployedWalking route optimiser for George Town, Penang that ranks paths by thermal comfort — not just distance. Built for Think City to make heritage-city walking bearable in the midday heat.
Network EMU
ActiveTurns raw network alerts into plain-English incident summaries with remediation steps and customer communication drafts — automatically, using a local LLM. No cloud, no manual triage.
IntelliSalesWidget
Edge / NPUSales assistant that knows your product catalogue and CRM data, answers in seconds, and runs entirely on a Snapdragon X Elite laptop — no cloud, no network, no data leaving the device.
Sovereign AI Stack
LiveA fully sovereign AI chat platform — answers questions about the lab, searches the web live, renders diagrams and dashboards, and speaks Bahasa Malaysia. Gemma 4 26B runs on-premises, zero cloud dependency.
Nova Voice Avatar
LiveWalk up and speak — Nova answers in ~2 seconds, in English or Bahasa Malaysia, with no cloud. Built for kiosk and demo deployments; wake-word mode means she only responds when called.
| Project | Live URL | Git Repo | Stack | Status |
|---|---|---|---|---|
| Coolest Path | coolpath.lab.local | coolest-path-api | FastAPI · XGBoost · K3s | Deployed |
| Network EMU | — | network-emu | FastAPI · Qwen · Docker | Active |
| IntelliSalesWidget | — | IntelliSalesWidget | Qwen3-4B · QNN · ChromaDB | Edge / NPU |
| Sovereign AI Stack | chat.lab.local | — | LibreChat · LiteLLM · vLLM · Gemma 4 · RAG | Live |
| Nova Voice Avatar | avatar.lab.local | — | Whisper · Piper TTS · Mesolitica VITS · Gemma 4 | Live |
| Searxng | searxng.lab.local | — | Anonymous metasearch (web augmentation for chat) | Live |
| LLM API | llm.lab.local | — | LiteLLM proxy · strip-shim · OpenAI-compatible | Live |
Coolest Path
AI-powered walking route optimizer for George Town, Penang. Returns Fastest, Coolest, and Balanced routes ranked by thermal comfort score.
George Town, Penang is a UNESCO World Heritage city — popular with tourists and residents on foot. But walking its streets in the midday heat is genuinely uncomfortable, sometimes dangerous. The obvious "shortest path" from A to B ignores shade, heat-trapped alleyways, and real-time temperature. No existing navigation app accounts for thermal comfort.
The client, Think City — a George Town urban regeneration organisation — wanted a routing tool that would encourage walking by making it cooler, not just faster.
An AI-powered walking route optimiser that returns three options for any A→B journey: Fastest, Coolest, and Balanced. The coolness score is computed per road segment using satellite-derived Land Surface Temperature (LST), real-time weather, shade analysis from Landsat imagery, and an XGBoost model trained on 22 geospatial features. Results are displayed on an interactive Leaflet map with segment-level heat overlays.
| Metric | Result |
|---|---|
| ML model accuracy (RMSE) | 3.88 °C on LST prediction (XGBoost GPU v3) |
| Model improvement over baseline | v3 GPU XGBoost outperformed v1 LightGBM and v2 CPU XGBoost in production quality |
| Inference speed | GPU-accelerated on GB10 Grace Blackwell — sub-second per route batch |
| Deployment | Live at coolpath.lab.local on K3s; signed Docker Compose deployment guide delivered to Think City |
| Client | Think City, George Town, Penang — signed deployment guide, approved Jan 2026 |
Vanilla HTML/JS + Leaflet map. Click origin and destination on the George Town street map to get three ranked routes — Fastest, Coolest, and Balanced — with per-segment coolness overlays and a summary card showing estimated shade, temperature delta, and walk time.
Coordinates all route calculation steps: calls Google Routes API for pedestrian alternatives, sends each to Valhalla for OSM map-matching, queries PostGIS for shade/LST features per segment, fetches live weather from WeatherLink, runs XGBoost inference on the Intelligence API, and returns a ranked JSON payload. Also exposes route search logging and analytics endpoints.
Predicts Land Surface Temperature per road segment using a 22-feature XGBoost v3 model. GPU-accelerated on GB10 aarch64 (CUDA 13.0). Loads model from the MLflow registry (coolest-path-lst, alias production) on startup — no model file bundled in the image.
Pedestrian routing engine loaded with a Penang OSM tile extract. Map-matches Google route alternatives to actual street-level segments so shade, shade NDVI, and ML features can be joined per segment geometry.
Stores the full Penang road network with pre-computed shade percentages (from Landsat imagery), coolness ML features, and route search logs. Database mail01db, schema cooler_path. Key tables: edges_with_shade, edges_coolness_for_ml, cp_shade_info, route_search_log.
| Version | Framework | Device | RMSE (°C) | Status |
|---|---|---|---|---|
| v1 | LightGBM | CPU | 3.80 | Archived |
| v2 | XGBoost | CPU | 3.71 | Archived |
| v3 | XGBoost GPU | GB10 Grace Blackwell (aarch64) | 3.88 | Production |
22 features per road segment: OSM attributes, time of day, segment geometry, NDVI, shade coverage percentage, live weather (temperature, humidity, UV), neighbour segment averages, and lag features. Tracked in MLflow experiment coolest-path-lst.
| Pod / Service | Node | Image |
|---|---|---|
| Web UI + Orchestrator | mailt03u (.7) — arch: amd64 | nginx + FastAPI (amd64) |
| Valhalla | mailt03u (.7) — arch: amd64 | valhalla OSM (amd64) |
| PostGIS | mailt03u (.7) — arch: amd64 | postgis (amd64) |
| Intelligence API | mailgb01 (.8) — GB10 GPU worker | cp-intel-api (aarch64+CUDA) |
Ingress: /coolpath/ → Traefik → UI nginx. GPU pod uses nodeSelector: kubernetes.io/arch: arm64 + NVIDIA_VISIBLE_DEVICES=all (no device plugin — GB10 unified memory workaround).
/route-osm-intelFull coolest route pipeline — Google Routes + Valhalla + PostGIS + Weather + XGBoost/route-osm-weatherRoutes + weather only, no ML inference (debug / fallback)/log-route-selectionLog which route the user selected (analytics)/route-search-logRetrieve route selection history/healthHealth check — returns service + model status| Service | Purpose | Notes |
|---|---|---|
| Google Maps Routes v2 | Pedestrian route alternatives | Requires API key with Routes API enabled |
| WeatherLink v2 | Real-time weather — MBPP station S31 | Station ID 174967; temp, humidity, UV index |
| NASA Earthdata | ECOSTRESS + Landsat imagery | Used for LST and NDVI pre-computation (offline batch, not live) |
The public release (for Think City, George Town) uses Docker Compose on Ubuntu 22.04. Minimum spec: 16 CPU cores, 64 GB RAM, 1 TB storage.
git clone https://github.com/innovationhubmy-svg/coolest-path.git
cd coolest-path
cp .env.template .env # fill in Google Maps, WeatherLink, NASA Earthdata keys
docker-compose -f docker-compose.production.yml up -d
./scripts/health-check.sh
:8000, Intelligence API :5000. The K3s manifests use :8080/:8000 — do not change the K3s manifests to match the client guide.Network EMU
End-to-end network failure simulation pipeline. From Zabbix alert to LLM-generated incident summary in a live NOC dashboard.
Network Operations Centres (NOCs) deal with a flood of alerts from monitoring systems like Zabbix. Most of these alerts are raw — they say a switch went down, but not which customer is affected, what the likely cause is, or what the operator should do first. Tier-1 engineers spend significant time correlating device → customer → location → history before they can act.
This project simulates that workflow end-to-end and demonstrates how an LLM can compress the triage time by generating a ready-to-use incident summary with remediation steps and a customer communication draft — automatically.
A four-container Docker Compose pipeline that takes a Zabbix-style alert webhook, enriches it against a CMDB, calls a local LLM (Qwen 2.5 7B) to generate a natural-language incident summary and recommended actions, and displays everything in a live NOC dashboard. The LLM also generates a communication action — a drafted message to both the device owner and the affected customer. All running on-premises, no cloud dependency.
Central data store for incidents, enriched transactions, and the CMDB. Pre-seeded with 5 switches (SW001–SW005), 5 customers (Petronas, Tenaga, CIMB, TNB, Maxis) across locations KUL, PNG, JHR, and a realistic device→customer ownership map. Pipeline record statuses: received → enriched → summarized.
Receives raw Zabbix-style alert webhooks, performs a CMDB lookup to find the affected device, customer, and location, then writes an enriched incident record to PostgreSQL. Designed as a drop-in Zabbix webhook target.
Polls PostgreSQL for enriched transactions, sends each to the LLM with full incident context (device, customer, CMDB history), and writes back a natural-language summary plus recommended remediation actions and a communication action (notifies device owner and customer). History-aware: previous summaries for the same device are included as context.
Live NOC dashboard. Shows incident list with status badges, AI-generated summaries, open/close controls, communication action log, and operational_status field per incident. Also exposes a REST API for the dashboard data.
| Table | Purpose | Key Fields |
|---|---|---|
| cmdb_devices | Network device inventory | device_id, hostname, customer, location, device_type |
| incidents | Alert records from Zabbix | incident_id, device_id, severity, status, operational_status |
| transactions | Pipeline processing records | incident_id, status (received/enriched/summarized), ai_summary, recommendation, communication_action |
Pluggable via .env — no rebuild needed to switch provider.
| Backend | LLM_BASE_URL | LLM_MODEL | Notes | |
|---|---|---|---|---|
| llm-small (recommended) | http://192.168.1.6:11434/v1 | qwen2.5:7b | Qwen 2.5 7B via Ollama on mailt02u | |
| Lab vLLM | #unavailable"td-muted">NIM on GB10 | http://192.168.1.8:8000/v1 | meta/llama-3.1-8b-instruct | Direct NVIDIA NIM endpoint |
192.168.1.6), not localhost — the summary container and llm-small run in separate Docker Compose networks.git clone http://git.lab.local/AI_Innovation_Hub/network-emu.git
cd network-emu
cp .env.example .env # set LLM_BASE_URL and LLM_MODEL
docker compose up -d
# Dashboard: http://<host>:8080
# Simulate an alert:
curl -X POST http://localhost:8001/alert \
-H "Content-Type: application/json" \
-d '{"device_id":"SW001","problem":"Interface GigE0/1 down","severity":"high"}'
IntelliSalesWidget
On-device sales chat assistant powered by Qualcomm NPU. Qwen3-4B runs entirely offline on Snapdragon X Elite — no cloud, no latency.
Sales teams often need quick answers during client meetings — product specs, pricing, deal history, competitive comparisons. Reaching for a laptop and waiting on a cloud AI tool breaks the flow of conversation. And for organisations with sensitive client data, sending that data to a cloud LLM raises privacy concerns.
The ask: a sales assistant that knows your product catalogue and CRM data, runs entirely on the sales rep's laptop, answers in seconds, and never sends data outside the device.
A chat assistant that runs Qwen3-4B fully on the Qualcomm NPU (Snapdragon X Elite) — no GPU, no cloud, no internet required during chat. Product docs and client data are auto-indexed into a local ChromaDB on startup. CRM connectors (HubSpot, Salesforce) pull live deal context at query time. The whole thing ships as a signed one-click Windows installer for instant deployment on any Snapdragon X Elite device.
| Metric | Result |
|---|---|
| LLM startup time on NPU | ~11 s (model loaded into Hexagon NPU once, cached for session) |
| Inference | Fully on-device — Snapdragon X Elite Hexagon NPU, no GPU required |
| Data sovereignty | Zero data leaves the device during chat — no cloud API calls for inference |
| Distribution | Signed Windows installer with bundled runtime — works on any Snapdragon X Elite laptop |
Qwen3-4B compiled to a 4-part QNN DLC bundle via Qualcomm AI Hub. The model is split across 4 DLC files (prefill context 4096, auto-regressive 128) and loaded into the Snapdragon X Elite NPU at startup (~11 s warm-up). All inference runs locally — no network required during chat sessions.
On startup, the app watches two directories: product/services docs and client data docs. Any new .docx, .pdf, or .xlsx file is automatically chunked, embedded, and indexed into ChromaDB. Retrieved chunks are injected into the LLM context at query time — no redeployment needed when docs change.
Pluggable data connectors for HubSpot, Salesforce, and a generic REST endpoint. CRM data (contacts, deal history, product catalog) is fetched at query time and merged into the RAG context, giving the assistant live sales data without a cloud LLM call.
Ships as a signed Windows installer built with Inno Setup. The installer bundles the Python runtime, all dependencies, the QNN DLC model weights, and a code-signed certificate. One-click deploy on any Snapdragon X Elite device — no developer setup required.
Once installed, zero network dependency for chat. Internet is only needed for CRM sync (optional) and initial model download. Ideal for sales calls in low-connectivity environments.
| Setting | Value |
|---|---|
| Base model | Qwen3-4B Instruct |
| Quantization | W4A16 — weights 4-bit, activations 16-bit |
| Runtime | QNN DLC → Qualcomm Genie |
| Target SoC | Snapdragon X Elite CRD (Oryon CPU + Hexagon NPU) |
| Split | 4 DLC parts — context prefill (4096 tokens) + auto-regressive (128 tokens) |
| Warm-up time | ~11 s on first load; subsequent runs from cache |
| Compiled via | Qualcomm AI Hub (cloud compile jobs — see qwen3-4b-genie memory) |
IntelliSalesWidget/
├── source_code/
│ ├── run.py # entrypoint (~15 KB)
│ ├── app/ # FastAPI routes, LLM, RAG pipeline
│ ├── config/ # model paths, CRM config
│ ├── data/ # product docs, client docs (watched dirs)
│ ├── qnn_backup/ # QNN DLC weight files
│ ├── ui/ # chat UI (served statically)
│ └── tests/
├── installer/
│ ├── installer.iss # Inno Setup script
│ ├── build_installer.py
│ └── sign_installer.ps1 # code-signing
└── pyproject.toml
Sovereign AI Stack
Fully self-hosted chat platform with RAG over the lab KB, live web search via Searxng, and artifact rendering. No cloud APIs — Gemma 4 26B-A4B runs entirely on the GB10 Grace Blackwell.
Most AI chat tools are cloud-dependent — your conversations, your lab data, and your queries go to OpenAI, Anthropic, or Google. For a government-adjacent AI lab in Malaysia, that's a sovereignty concern. The team also needed the chat tool to know the lab — to answer questions about hardware specs, project details, and internal services without having to train a custom model.
And practically: the team wanted to be able to ask "what's the weather in KL today?" and "how does Coolest Path's ML model work?" from the same interface, with accurate answers to both.
A fully self-hosted AI chat platform — LibreChat as the UI, Gemma 4 26B as the LLM (running on the GB10 Grace Blackwell in-lab), with a custom strip-shim proxy that automatically routes each query to the right augmentation: RAG over the lab knowledge base (via pgvector), live web search (via Searxng), or straight to the model. No cloud APIs. The same LLM powers a voice avatar (Nova) at avatar.lab.local.
| Metric | Result |
|---|---|
| LLM inference speed | ~32 tokens/sec (Gemma 4 26B-A4B FP8, single stream on GB10) |
| RAG corpus | 44 sources, ~352 chunks — lab KB, project READMEs, memory files |
| Chat end-to-end latency | First token in ~1 s; full reply in 2–4 s for typical queries |
| Voice avatar latency | ~2 s total round-trip (STT + LLM + TTS) — measured on warm path |
| Sovereignty | 100% on-premises — no external API calls for inference, RAG, or search |
| Languages | English, Bahasa Malaysia, Indonesian, Chinese (chat + voice) |
| Surface | URL | Purpose |
|---|---|---|
| Chat UI | chat.lab.local | LibreChat — daily chat, RAG, artifacts (HTML/SVG/Mermaid/React) |
| Voice Avatar | avatar.lab.local | Nova — speech-in / speech-out, hands-free VAD, adaptive language |
| LLM API | llm.lab.local/v1 | OpenAI-compatible endpoint (strip-shim + LiteLLM), key sk-lab-master |
| Searxng | searxng.lab.local | Anonymous metasearch UI & JSON API (also queried by strip-shim) |
| Pod | Model | GPU util | Role |
|---|---|---|---|
| vllm-gemma4-26b | Gemma 4 26B-A4B FP8 (MoE, 4B active) | 0.35 | Default chat — ~32 t/s |
| vllm-qwen3vl-32b | Qwen3-VL-32B FP8 | 0.40 | Vision demos (scale-to-zero by default) |
| vllm-bge-m3 | BGE-M3 (1024-dim) | 0.05 | RAG embeddings |
| vllm-whisper | Whisper Large v3 | 0.08 | STT — ~0.5s for 10s audio |
The strip-shim at litellm.vllm.svc:4000 is the most critical custom piece. It sits between LibreChat/avatar-backend and the real LiteLLM proxy, augmenting every request transparently. Processing pipeline per request:
tools: [] (empty array causes vLLM 400) and web_search_options (LibreChat sends these, vLLM rejects them)max_tokens ≤ 20 requests bypass augmentation entirely[VOICE MODE prefix in user text → use compact voice-prompt templates (1–3 sentences, no markdown):::artifact{...}::: directive so LibreChat renders the side-panel[system_with_results, latest_user_msg] so stale "I can't access the internet" replies don't anchor the model| Intent | Action | Sample triggers (English + Bahasa Malaysia) |
|---|---|---|
| lab | pgvector cosine search, top-8 chunks (BGE-M3 embed) | gb10, grace blackwell, coolest path, network emu, k3s, harbor, vllm, litellm, keycloak, cl01, cl02… |
| web | Searxng top-5 results injected as bullets | today, latest, news, weather, near me, hari ini, terkini, berita, cuaca, dekat sini… |
| artifact | Inject LibreChat artifact directive (HTML/SVG/Mermaid/React side-panel) | diagram, chart, mermaid, svg, plot, dashboard, "build a html page", "generate svg"… |
| general | Pass through unchanged — no augmentation | (everything else) |
| Source | Type | Notes |
|---|---|---|
| innovation.lab.local (5 pages) | Static HTML | index.html split into 13 sub-sections by <div id="..."> for precise citation |
| ai-wiki.lab.local | Static HTML | AI API & serving fundamentals knowledge base |
| coolpath.lab.local | Static HTML | Coolest Path project landing page |
| 7× Forgejo READMEs | Markdown | coolest-path-api, network-emu, reasoning-api, LLM-Small, gns3, ai-fundamentals-wiki, IntelliSalesWidget |
| 18× lab memory files | Markdown | Curated from Claude memory dir — hardware, architecture, project notes, gotchas |
Embedding model: BGE-M3 (1024-dim) via vLLM. Chunk size ~800 chars, 120 char overlap, sentence-boundary aware. Re-ingest after content changes: rebuild rag-memory-files ConfigMap on .7, then delete and re-apply the rag-ingest Job in ns vllm.
LibreChat agents use vLLM's /v1/responses endpoint which does not apply tool-call parsers. Even with --tool-call-parser gemma4 configured, agent tool calls leaked as raw text and LibreChat saw no structured tool_calls — returning empty chat bubbles. The shim bypasses this entirely by working on the regular /v1/chat/completions path where the tool-call parser works, and triggers transparently regardless of which model is active.
use_responses_api: false set to force the completions path, and the LibreChat pod needs /app/api/data/auth.json to exist (containing {}) — its absence causes per-chunk errors that abort the agent stream.Nova — Voice Avatar
Hands-free voice assistant running entirely on the lab GB10. Push-to-talk or VAD-triggered. Supports English, Bahasa Malaysia, Indonesian, and Chinese. End-to-end latency ~2 seconds.
| Stage | Time |
|---|---|
| ffmpeg webm→wav transcode | ~0.05 s |
| Whisper Large v3 STT (10 s audio) | ~0.5 s |
| Strip-shim classify + RAG embed + pgvector | 0.1–0.15 s |
| Gemma 4 26B-A4B reply | 0.8–1.5 s |
| Piper / VITS TTS (3 sentences) | ~0.3 s |
| Network + browser playback | ~0.2 s |
| Total round trip | ~2 s |
| Language | Engine | Model |
|---|---|---|
| 🇬🇧 English | Piper (speaches) | piper-en_US-ryan-medium |
| 🇲🇾 Bahasa Malaysia | Mesolitica VITS (sovereign, on GB10) | VITS-osman (22 kHz, Malaysian-trained) |
| 🇮🇩 Indonesian | Piper (speaches) | piper-id_ID-news_tts-medium |
| 🇨🇳 Chinese | Piper (speaches) | piper-zh_CN-huayan-medium |
Chat interfaces are great at a desk. But for kiosk demos, factory floors, or accessibility scenarios, a keyboard is a barrier. The team wanted a voice-first interface to the lab's AI stack — something a visitor could walk up to, speak to naturally in English or Bahasa Malaysia, and get a spoken answer within two seconds, without touching anything.
Nova — a hands-free voice assistant running entirely on the lab's GB10. Speech is transcribed by Whisper Large v3 (on-device, ~0.5 s), routed through the same Sovereign AI Stack strip-shim (RAG + web search), answered by Gemma 4 26B, and spoken back using Piper TTS for English or Mesolitica's VITS-osman for authentic Bahasa Malaysia. Total round trip: approximately 2 seconds. No cloud, no external APIs, supports four languages.
Nova also has a wake-word mode — when enabled, she only responds if her name is spoken first, making her suitable for ambient/kiosk deployments where background noise would otherwise trigger false activations.
| Metric | Result |
|---|---|
| End-to-end latency (warm) | ~2 s total — STT 0.5 s, LLM 1.0–1.5 s, TTS 0.3 s |
| STT accuracy | Whisper Large v3 — ~20× realtime on GB10 GPU |
| Languages supported | English, Bahasa Malaysia (sovereign VITS model), Indonesian, Chinese |
| Malay TTS quality | Mesolitica VITS-osman — 22 kHz, Malaysian-trained, genuinely sounds like BM |
| Sovereignty | 100% on-premises — Whisper, Gemma 4, Piper, and VITS all run locally |
Serves Whisper Large v3 (HF format, OpenAI-compatible /v1/audio/transcriptions). ~0.5 s for 10 s of audio (~20× realtime). First request after cold start is ~22 s (CUDA graph compile). Uses gpu-memory-utilization: 0.08.
Runs Piper TTS for English, Indonesian, and Chinese voices. Also has faster-whisper but it falls back to CPU on aarch64 (no CUDA in that image), so STT is handled by vllm-whisper instead.
Malaysian-trained VITS model (mesolitica/VITS-osman) — 22 kHz, genuinely sounds like Bahasa Malaysia. Replaces the earlier MMS (robotic 16 kHz) and Indonesian Piper (wrong accent). ~0.31× realtime once warm (~2 s/reply). Uses a stub TF shim to load malaya_speech on aarch64.
Orchestrates STT → shim+LLM → TTS pipeline. Serves the browser UI from a ConfigMap-mounted index.html. Sends [VOICE MODE: ...] prefix on user messages so the strip-shim switches to compact, no-markdown response templates.
/api/converse?lang=en|ms|id|zh|autoRaw audio → JSON {transcript, reply, audio_base64, timings}/api/stt?lang=Raw audio → {text, language, detected, elapsed_s}/api/chat{text, language?} → {reply, language, length_hint, elapsed_s}/api/tts{text, language?} → audio/mpeg MP3 stream/healthzHealth checkavatar-backend estimates a length hint from the user's text and passes it in the [VOICE MODE] prefix so Gemma 4 calibrates reply length for speech:
| Condition | Length hint |
|---|---|
| ≤ 4 words | "1 very short sentence (greeting/yes-no)" |
| what/where/when/who/how much + ≤ 12 words | "1-2 short sentences" |
| tell me about / explain / describe / why / compare… | "3-5 sentences" |
| everything else | "2-3 sentences" |
Signal must exceed this level sustained for 150 ms to start recording. Two-stage: mic is always open but MediaRecorder only starts when voice is confirmed.
Anything quieter than this for 1.2 s triggers end-of-utterance and send. The "dead zone" between VOICE_DBFS and SILENCE_DBFS (room tone) is treated as silence to prevent stuck-recording.
Minimum accumulated voice content required before sending. Clips with less than 800 ms of real voice are discarded — prevents Whisper hallucinations ("Thank you", "Terima kasih") on near-silent inputs.
Toggle in the header. When ON + hands-free ON, Nova only replies if "Nova" is detected in the Whisper transcript. Regex tolerates known Whisper mis-transcriptions: Nova, Novah, Noah, Knower, Nowa. Unrecognised clips show a 🔇 debug bubble with what was heard. Implemented client-side — STT runs regardless, the chat+TTS calls are conditional.
ms for clear English). The UI defaults to pinned en — override via the 🇬🇧/🇲🇾/🇮🇩/🇨🇳/🌐 dropdown. Pinned language is forwarded to the Whisper endpoint as language=en, skipping detection entirely.Architecture Overview
AI Innovation Hub platform on Grace Blackwell + K3s infrastructure · Cyberjaya, Malaysia
Network Topology
Tower 2 — mailt03u
192.168.1.7 · K3s server, Traefik, all platform services
GB10 — mailgb01
192.168.1.8 · K3s agent, GPU inference workloads
GB10 — mailgb02
192.168.1.9 · K3s agent, GPU inference workloads
Tower 1 — mailt02u
192.168.1.6 · Development workstation, workbench projects
mailt01
192.168.1.5 · dnsmasq, PostgreSQL, Claude Code host
Hardware Inventory
AI Innovation Hub hardware specifications — Cyberjaya lab
| Node | Hostname | IP | Hardware | GPU | RAM | Role |
|---|---|---|---|---|---|---|
| Tower 1 | mailt02u | 192.168.1.6 | Dell Precision 5860 | RTX 4000 Ada | 128 GB | Dev |
| Tower 2 | mailt03u | 192.168.1.7 | Dell Precision 5860 | RTX 4000 Ada | 128 GB | K3s Control Plane |
| CL01-1 | mailgb01 | 192.168.1.8 | NVIDIA GB10 Grace Blackwell | Blackwell (unified) | 128 GB unified | K3s GPU Worker |
| CL01-2 | mailgb02 | 192.168.1.9 | NVIDIA GB10 Grace Blackwell | Blackwell (unified) | 128 GB unified | K3s GPU Worker |
| CL02-1 | mailgb03 | 192.168.1.10 | NVIDIA GB10 Grace Blackwell | Blackwell (unified) | 128 GB unified | Edge/Demo |
| CL02-2 | mailgb04 | 192.168.1.11 | NVIDIA GB10 Grace Blackwell | Blackwell (unified) | 128 GB unified | Edge/Demo |
GB10 Grace Blackwell Specifications
aarch64 (ARM)
Grace CPU + Blackwell GPU on a single chip. CPU and GPU share the same 128 GB LPDDR5x memory pool at 273 GB/s — no PCIe penalty.
DGX OS 7.4.0
NVIDIA driver 580.126.09, CUDA 13.0. Docker + NVIDIA container runtime pre-installed. SM 12.1 — requires NGC vLLM image.
Native FP8 Tensor Cores
Blackwell FP8 tensor cores execute matrix ops without dequantisation overhead. ~half the memory of BF16 with <1% quality loss.
Services & URLs
All services accessible via Traefik ingress with wildcard TLS (*.lab.local)
| Service | URL | Namespace | Purpose | ||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Innovation Hub | https://innovation.lab.local | ai-innovation-hub | This portal — projects + infrastructure docs | ||||||||||||||||||||||||||
| Coolest Path | /coolpath/ | coolest-path | Route intelligence web app | ||||||||||||||||||||||||||
| Chat (LibreChat) | /chat/ | librechat | Sovereign AI chat — RAG, web search, artifacts (Gemma 4 26B) | ||||||||||||||||||||||||||
| Nova Voice Avatar | /avatar/ | avatar | Hands-free voice assistant — Whisper STT + Piper/VITS TTS + Gemma 4 | ||||||||||||||||||||||||||
| LLM API | #unavailable"table-wrap">
|