Demo 1 of the AI Alo Portfolio · aialo.io
A RAG-powered restaurant chatbot built with FastAPI, ChromaDB, and sentence-transformers.
Supports Ollama (local, free) and Claude API (cloud, best quality) via a single .env flag.
The pain point it solves: Restaurant staff spend hours answering the same questions every day — menu questions, hours, allergens, reservations. Aria handles all of it 24/7.
flowchart TD
subgraph Browser["Browser (Client)"]
SITE["Restaurant Website\nindex.html + app.js\nAria chat widget"]
end
subgraph Server["FastAPI Server — port 8080"]
MAIN["main.py\nStatic file serving + CORS"]
ROUTER["router.py\nPOST /api/chat"]
end
subgraph RAG["RAG Pipeline"]
direction TB
EMBED["embedder.py\nsentence-transformers\nall-MiniLM-L6-v2 (local)"]
CHROMA[("ChromaDB\nchroma_store/\npersistent vector DB")]
PIPE["pipeline.py\nSystem prompt + context\n→ Aria personality"]
end
subgraph LLM["LLM Layer (dual)"]
CLAUDE["☁ Claude Haiku\n(Anthropic API)"]
OLLAMA["⬡ Ollama llama3.2\n(local fallback)"]
end
subgraph Data["Knowledge Base"]
FILES["data/\nmenu.json · faqs.json\nrestaurant_info.json"]
end
INGEST["scripts/ingest_data.py\n(run once)"]
SITE -->|"POST /api/chat"| ROUTER
MAIN --> ROUTER
ROUTER --> PIPE
PIPE --> EMBED
EMBED -->|"query embedding"| CHROMA
CHROMA -->|"top chunks"| PIPE
PIPE -->|"API key set?"| CLAUDE
PIPE -->|"no API key"| OLLAMA
CLAUDE -->|"response"| ROUTER
OLLAMA -->|"response"| ROUTER
FILES --> INGEST
INGEST --> EMBED
EMBED -->|"batch embeddings"| CHROMA
| Demo | Business | Key Feature |
|---|---|---|
| Demo 1 | Casa Alo's Bistro | Restaurant RAG chatbot |
| Demo 2 | Rappahannock Realty Group | Lead qualifier + CRM dashboard |
| Demo 3 | Luminara Med Spa | Treatment recommender + candidacy screening |
Built by Aloysious Kabonge — AI automation consulting for local businesses in Fredericksburg, VA.
| Layer | Tech |
|---|---|
| Backend | FastAPI + Uvicorn |
| Vector DB | ChromaDB (local, persistent) |
| Embeddings | sentence-transformers all-MiniLM-L6-v2 |
| LLM (cloud) | Anthropic Claude (haiku) |
| LLM (local) | Ollama (llama3.2) |
| Frontend | Vanilla HTML/CSS/JS (embeddable widget) |
cd casa_alos_bistro
pip install -r requirements.txtcp .env.example .env
# Edit .env — add ANTHROPIC_API_KEY if you have one, or leave blank to use Ollamapython scripts/ingest_data.pyThis runs once (or whenever you update the data files). Downloads the embedding model on first run (~90MB).
uvicorn app.main:app --reloadOpen http://localhost:8000 — you'll see the restaurant website with the chat widget.
| Method | Path | Description |
|---|---|---|
POST |
/api/chat |
Send a message, get a response |
GET |
/api/health |
Check status, provider, doc count |
DELETE |
/api/session/{id} |
Clear a conversation session |
POST /api/chat
{
"message": "What are your most popular dishes?",
"session_id": "user_abc"
}{
"response": "Our guests always rave about the Cacio e Pepe...",
"sources": ["menu/Paste (Pastas)", "faqs/Menu & Food"],
"session_id": "user_abc",
"provider": "claude"
}ANTHROPIC_API_KEY set?
✓ → Uses Claude (cloud, best quality)
✗ → Uses Ollama (local, free, requires Ollama running)
Embeddings always run locally via sentence-transformers — no API key needed regardless.
| File | Contents |
|---|---|
data/menu.json |
Full menu — 7 categories, 40+ items, prices, dietary info |
data/faqs.json |
30+ FAQ Q&A pairs across 6 categories |
data/restaurant_info.json |
Hours, address, contact, parking, policies |
To update content, edit the JSON files and re-run python scripts/ingest_data.py.
casa_alos_bistro/
├── app/
│ ├── main.py # FastAPI app + CORS + static file serving
│ ├── router.py # Chat, health, session endpoints
│ ├── config.py # Settings (pydantic-settings, .env)
│ ├── models.py # Request/response schemas
│ └── rag/
│ ├── embedder.py # ChromaDB collection setup
│ ├── retriever.py # Top-k semantic search
│ └── pipeline.py # RAG: retrieve → generate (Ollama or Claude)
├── data/
│ ├── menu.json
│ ├── faqs.json
│ └── restaurant_info.json
├── frontend/
│ └── index.html # Restaurant website + embedded chat widget
├── scripts/
│ └── ingest_data.py # One-time data indexing script
├── requirements.txt
├── .env.example
└── .gitignore