Prerequisites — requires HPE Private Cloud AI.
An operations centre watches more video than anyone can actually watch. Defence-Ops is a demo of what changes when a vision-language model watches it with you: four live feeds in a grid, a telemetry ticker alongside them, and an assistant that answers questions about what is on screen right now — "how many vehicles are in this convoy?", "give me the SITREP across all feeds" — instead of about a document someone wrote earlier. Every part of it runs on infrastructure you control: the model endpoint is one you configure, the video never leaves your cluster, and there is no external AI service in the path. It is built as a reference for anyone evaluating private, on-premises AI for work where the footage cannot go to a public API — and as a concrete example of wiring a multimodal model to real-time streams rather than to a chat box.
![]() |
![]() |
| The model's assessment cites what it can see in the frames it was given. | "Smart Context" sends frames from every playing feed plus recent telemetry in one question. |
Four services, each doing one job. The UI holds the configuration; the others ask it for what they need.
flowchart TB
browser["Browser<br/><i>tactical dashboard</i>"]
gw["Ingress gateway"]
subgraph ns ["Kubernetes namespace"]
ui["<b>app-ui</b><br/>Next.js dashboard<br/><i>+ config store (PVC)</i>"]
vid["<b>video-service</b><br/>FastAPI<br/><i>MJPEG streams · frame extraction</i>"]
llm["<b>llm-service</b><br/>FastAPI<br/><i>VLM orchestration · model discovery</i>"]
kaf["<b>kafka-service</b><br/>FastAPI<br/><i>SSE telemetry · alert generation</i>"]
end
model["Vision-language model<br/><i>any OpenAI-compatible endpoint</i>"]
broker[("Kafka broker<br/><i>mission telemetry</i>")]
browser --> gw --> ui
gw --> vid
gw --> llm
gw --> kaf
ui -->|"frames for the active feeds"| vid
ui -->|"prompt + frames + recent alerts"| llm
ui -->|"live alert stream (SSE)"| kaf
llm -->|"inference"| model
kaf <-->|"SASL"| broker
classDef svc fill:#eef2ff,stroke:#4f46e5,stroke-width:2px,color:#1e1b4b;
classDef ext fill:#f1f5f9,stroke:#475569,stroke-width:2px,color:#0f172a;
class ui,vid,llm,kaf svc;
class browser,gw,model,broker ext;
style ns fill:#ffffff,stroke:#c7d2fe,stroke-width:1px,color:#3730a3;
A question travels: the UI pulls recent frames for whichever feeds are playing, adds
the latest telemetry, and posts the lot to llm-service, which forwards it to the
model endpoint you configured. DIAGRAM.md has the detailed version.
| Service | Stack | Responsibility |
|---|---|---|
app-ui |
Next.js 15, React 19 | Dashboard, admin, and the shared configuration store |
video-service |
FastAPI | MJPEG streaming, uploads, frame extraction for inference |
llm-service |
FastAPI | Model discovery and vision-language inference |
kafka-service |
FastAPI | Telemetry over Server-Sent Events, alert generation |
- HPE Private Cloud AI,
which supplies the cluster, the model-serving endpoints and the ingress, with
kubectlandhelmconfigured against it. - A vision-language model on any OpenAI-compatible endpoint — the model must
accept images, not just text.
nemotron-nano-12b-v2-vlandqwen3-vl:8bboth work well. A text-only model will deploy and then fail to describe anything. - Optional: a Kafka broker for live telemetry. Without one the dashboard runs on generated alerts, which is enough to demo it.
Private Cloud AI is what this demo is built and verified against. Nothing in the chart is hard-wired to it, so it will also install on a plain Kubernetes cluster with your own ingress and an OpenAI-compatible vision endpoint — that path just is not the supported one.
kubectl create namespace defence-ops
helm install defence-ops ./helm \
--namespace defence-ops \
--set ezua.virtualService.endpoint=defence-ops.<YOUR_DOMAIN> \
--set global.env=production
kubectl get pods -n defence-ops -wezua.virtualService.endpoint is the hostname the ingress will answer on; the chart
uses it for both the route and the auth policy. The app is then at
https://defence-ops.<YOUR_DOMAIN>.
On HPE Private Cloud AI you can instead use its Import Framework wizard, which
takes a packaged chart and a logo: give it defence-ops-<version>.tgz and
defence-ops.png, and a namespace.
Open System Config in the navigation bar and set:
| Setting | Value |
|---|---|
| API format | OpenAI compatible |
| Endpoint URL | Your model endpoint |
| Model | A vision model, e.g. nemotron-nano-12b-v2-vl |
| API token | The endpoint's key |
| Kafka (optional) | Broker URI, username, password |
Then pick a feed in any grid cell and press play. First load of each video is slow while it is fetched and cached; after that it is instant.
- The eye icon asks what objects are in the scene; the shield icon scans for threats. Both are one-click prompts.
- The chat box takes anything else. Choose Smart Context to ask across every playing feed plus recent telemetry, or scope it to one feed. Thinking mode shows the model's reasoning before its answer.
USAGE.md is the full walkthrough; EXAMPLES.md has questions that demo well.
cp .env_example .env # set DOMAIN and KUBE_CONTEXT
tilt up # live-reload against your clusterTo publish your own images and point the chart at them:
docker login
./scripts/publish_images.sh 1.0.0Then set the new tags in helm/values.yaml.
This demo was developed as part of my work at HPE, and the sample footage in
assets/videos/ is included here under HPE's rights to redistribute it.
That permission does not extend to you. The clips remain third-party copyrighted
material: you may run them as part of this demo, but not reuse them in your
own products or redistribute them separately — see
assets/videos/README.md. For your own deployment,
substitute your own material; video-service picks up any .mp4 or .mov
dropped in that directory, no configuration needed.
The code, configuration and documentation here are MIT — see LICENSE.
The sample footage in assets/videos/ and demo.mp4 is excluded from that
grant and stays under the terms above.
Demonstration software. Not a targeting system, not an operational tool, and not built or validated for real-world military use.
© 2026 HPE. For demonstration purposes only.


