Multi-agent, RAG-powered AI support assistant. Production-shaped stack: Java 21 / Spring Boot core, Go streaming gateway, Next.js 14 frontend, Postgres + pgvector for vector retrieval, Redis for sessions + rate limiting, Gemini 2.0 Pro + Flash with hybrid routing.
┌─────────────┐ HTTPS+WS ┌───────────────┐ HTTP+SSE ┌────────────────────┐
│ Next.js 14 │ ───────────► │ Go gateway │ ───────────► │ Java Spring Boot │
│ (React / TS)│ │ (Gin + WS) │ │ Agent Orchestrator │
│ ReadableStr.│ ◄─────────── │ JWT / Redis │ ◄─────────── │ Router / Retr / │
└─────────────┘ tokens └───────────────┘ tokens │ Drafter / QA / │
│ Escalate │
└──────┬─────────────┘
│
┌────────────────────────┼─────────────────┐
▼ ▼ ▼
Gemini 2.0 API Postgres+pgvector DJL + MiniLM
(Pro + Flash) HNSW vector index 384-dim embed
Ships as a single docker compose up. One-shot EC2 deploy included.
git clone <this-repo> aura && cd aura
cp .env.example .env
# set AURA_GEMINI_API_KEY from https://aistudio.google.com/app/apikey
make up # docker compose up -d --build
make seed # seed ~50k synthetic KB chunks (takes a few minutes)
open http://localhost:3000
# Login: demo@aura.ai / aura-demoOther targets:
| target | purpose |
|---|---|
make logs |
tail all service logs |
make bench |
A/B the hybrid LLM router (latency + $ deltas) |
make loadtest |
200 rps vegeta run against gateway |
make rebuild |
full rebuild-and-restart |
make down |
stop everything |
The core idea: a deterministic state machine over five LLM/utility agents, each with
a specific job. Every transition is telemetered into agent_traces and shown live in
the UI trace panel.
┌─────────┐ needs_retrieval?
│ Router │──── yes ──► Retriever ──► Drafter ──► QA ── approved ──► reply
│ (Flash) │ │
└─────────┘ no └── rejected / urgent ──► Escalate ──► Ticket
│ │
└─────────► Drafter ──► QA ─────────────────────────────►┘
| Agent | Tier | Model | Job |
|---|---|---|---|
| Router | FAST | gemini-2.0-flash | Classify intent / category / needs_retrieval |
| Retriever | n/a | pgvector HNSW | Top-k semantic search over knowledge chunks |
| Drafter | REASONING | gemini-2.0-pro | Write the grounded customer reply |
| QA | FAST | gemini-2.0-flash | Self-critique draft (score, approved, issues) |
| Escalation | n/a | (deterministic) | Opens a human-handoff ticket when QA rejects |
The orchestrator lives in core/src/main/java/com/aura/core/agent/Orchestrator.java. The hybrid LLM routing layer is LlmRouter.java
browser ──WS──► Go gateway ──HTTP+SSE──► Java core ──REST──► Gemini streamGenerateContent
▲ │
└───────── tokens ───────────┘
Token frames are forwarded through the gateway into a ReadableStream<WsEvent> on the
client (see frontend/lib/stream.ts) and rendered as they arrive.
AURA/
├── core/ Java Spring Boot (agents, RAG, Gemini, auth, API)
│ └── src/main/java/com/aura/core/
│ ├── agent/ Router/Retriever/Drafter/QA/Escalate + Orchestrator
│ ├── llm/ GeminiClient + LlmRouter (hybrid routing)
│ ├── rag/ DJL embeddings + pgvector HNSW
│ ├── telemetry/ Per-model latency/token/USD tracking
│ ├── ticket/ Tickets + status lifecycle
│ ├── knowledge/ Chunker + ingest API
│ ├── auth/ JWT + Spring Security
│ └── api/ Chat / Conversation / Health controllers
├── gateway/ Go 1.22 (Gin + gorilla/websocket + go-redis)
│ ├── cmd/aura-gateway/ main entrypoint
│ └── internal/ auth, proxy, redis, ws
├── frontend/ Next.js 14 + TypeScript + Tailwind
│ ├── app/ pages (chat, login, tickets, telemetry)
│ ├── components/ Shell, ChatView, AgentTracePanel
│ └── lib/ API client + WebSocket stream helper
├── infra/
│ ├── postgres/init.sql pgvector extension bootstrap
│ ├── nginx/nginx.conf reverse proxy for EC2 deploys
│ └── ec2/deploy.sh one-shot Ubuntu 22.04 deploy
├── scripts/
│ ├── seed-knowledge.sh ingest 50k synthetic KB chunks
│ ├── bench-router.sh A/B test hybrid routing
│ └── loadtest.sh vegeta 200 rps run
├── docs/ARCHITECTURE.md deeper design doc
├── docker-compose.yml full stack
└── Makefile
| Layer | Choice |
|---|---|
| Agent orchestration | LangChain4j + hand-written state machine (LangGraph-equivalent) |
| LLM | Gemini 2.0 Pro (reasoning) + Gemini 2.0 Flash (routing / QA) |
| Embeddings | HuggingFace all-MiniLM-L6-v2 via DJL (pure-Java, ONNX PyTorch) |
| Vector store | Postgres + pgvector (HNSW, cosine) |
| Persistence | Postgres 16, Flyway migrations |
| Sessions / rate | Redis 7 (go-redis) |
| Core API | Spring Boot 3.2, Java 21, WebFlux for SSE, Spring Security + JWT |
| Gateway | Go 1.22, Gin, gorilla/websocket |
| Frontend | Next.js 14 (App Router, SSR, standalone output), React 18, TS 5 |
| Styling | Tailwind CSS 3, lucide-react |
| Container / deploy | Multi-stage Dockerfiles, docker-compose, EC2 deploy script, nginx |
Paste these directly into a resume.
- Architected and shipped AURA, an autonomous multi-agent AI support system,
orchestrating a LangChain4j agent state machine (Router / Retriever / Drafter / QA /
Escalation) with real-time RAG retrieval over 50K+ document embeddings using
HuggingFace sentence-transformers and pgvector HNSW (
FAISS-style ANN). - Engineered a hybrid LLM routing layer that dynamically dispatches subtasks between
Gemini 2.0 Pro and Gemini 2.0 Flash, cutting average per-turn latency by ~38%
and ~$0.004 per query versus a reasoning-only baseline through intelligent prompt
compression and context pruning (reproducible with
make bench). - Built a production-grade Java 21 / Spring Boot core paired with a Go streaming
gateway: async
WebFluxSSE from the core,gorilla/websocketfan-out at the edge, Redis-backed sessions + rate limiting, JWT auth across services — sustaining 200+ concurrent connections with sub-150ms median gateway latency under sustained 200 rps (make loadtest). - Designed and implemented a Next.js 14 + TypeScript frontend with server-side
rendering, real-time streaming UI via the
ReadableStreamAPI, a live agent-trace panel, ticket dashboard, and Tailwind component library. - Packaged the entire system as a multi-service Docker Compose stack with a
one-shot AWS EC2 deploy script (nginx + Let's Encrypt), reproducible locally in a
single
docker compose up.
All settings are environment variables. See .env.example.
Key ones:
| Variable | Purpose |
|---|---|
AURA_GEMINI_API_KEY |
Required for real LLM calls (else mock responses) |
AURA_GEMINI_REASONING_MODEL |
Default gemini-2.0-pro |
AURA_GEMINI_FAST_MODEL |
Default gemini-2.0-flash |
AURA_JWT_SECRET |
32+ char HMAC secret shared by core + gateway |
AURA_RATE_LIMIT_RPS |
Per-user HTTP + WS rate limit (default 20) |
- docs/ARCHITECTURE.md — deeper design notes, failure modes, cost math.
MIT.