Cloud restaurant voice ordering with Pipecat, LiveKit, Deepgram, Fireworks AI (gpt-oss-120b), and FastMCP.
ALMA.TAIBLE.1.mp4
Guest Browser (PWA)
│ WebRTC (LiveKit)
▼
voice-orchestration/ (Pipecat CPU pipeline)
├── Deepgram STT (nova-2) ──────────────────┐
├── Fireworks AI LLM (gpt-oss-120b) ─────────┤ managed cloud APIs
└── Deepgram TTS (Aura) ─────────────────────┘
│
│ MCP tool calls (streamable HTTP)
▼
mcp-server/ (FastMCP — Python, Cloud Run)
│ Supabase service-role key
▼
Supabase (PostgreSQL + Realtime)
│ Realtime channel
▼
taible/ (Next.js Staff Dashboard)
Note on the GPU stack: Taible was originally designed to run STT/LLM/TTS on a self-hosted AMD ROCm GPU (Whisper + vLLM/Qwen + Kokoro). That path is now legacy — the running system uses managed cloud APIs (Deepgram + Fireworks). The old GPU code still lives in
gpu-rocm/but is not used by the agent.
| Folder | Purpose |
|---|---|
taible/ |
Guest PWA + Staff Dashboard (Next.js 15) |
voice-orchestration/ |
Pipecat CPU pipeline — WebRTC ↔ cloud STT/LLM/TTS glue |
mcp-server/ |
FastMCP tool server (get_menu, create_order, …) over Supabase |
gpu-rocm/ |
Legacy AMD ROCm Docker stack (vLLM, Whisper, Kokoro) — not used by the current pipeline |
architecture/ |
C4 D2-as-code diagrams |
- Create a project at supabase.com (free tier works)
- In the SQL Editor, run in order:
mcp-server/db/schema.sqlmcp-server/db/seed.sql
- Copy your Project URL and service_role secret key from Settings → API
cd mcp-server
cp .env.example .env
# Edit .env: fill SUPABASE_URL and SUPABASE_SECRET_KEY
pip install -r requirements.txt
python server.py
# → FastMCP (streamable HTTP) listening on http://localhost:8080/mcpThe server speaks the MCP protocol (streamable HTTP / JSON-RPC) at /mcp — it does
not expose per-tool REST routes. Inspect its tools with any MCP client, e.g.:
npx @modelcontextprotocol/inspector # then point it at http://localhost:8080/mcpYou need a LiveKit server. Use LiveKit Cloud (free tier) or self-host. You also need Deepgram and Fireworks AI API keys.
cd voice-orchestration
cp .env.example .env
# Edit .env: fill LIVEKIT_*, DEEPGRAM_API_KEY, FIREWORKS_API_KEY, MCP_SERVER_URL
pip install -r requirements.txt
python main.py
# → Pipecat agent connected to LiveKit room "taible-demo"The LLM adopts its tools directly from the MCP server: a single Pipecat MCPClient
connects to MCP_SERVER_URL, discovers the tools via tools/list, and registers them
on the Fireworks LLM.
cd taible
cp .env.local.example .env.local
# Edit .env.local: fill NEXT_PUBLIC_PIPECAT_URL, NEXT_PUBLIC_SUPABASE_URL,
# NEXT_PUBLIC_SUPABASE_ANON_KEY
npm install
npm run dev
# → http://localhost:3000- Open
http://localhost:3000on your phone (or scan the QR code) - Tap "Start talking" — the orb connects to Pipecat via LiveKit
- Say: "Hi, what's on the menu?"
- The AI reads the menu from Supabase via MCP and speaks back
- Order something: "I'd like a flat white with oat milk"
- Confirm: "Yes, that's everything"
- Switch to Staff View → to see the order appear in real-time
| Variable | Description |
|---|---|
SUPABASE_URL |
https://your-ref.supabase.co |
SUPABASE_SECRET_KEY |
Service-role key (never expose to browser) |
PORT |
HTTP port (default 8080) |
| Variable | Description |
|---|---|
LIVEKIT_URL |
wss://your.livekit.cloud |
LIVEKIT_API_KEY |
LiveKit API key |
LIVEKIT_API_SECRET |
LiveKit API secret |
DEEPGRAM_API_KEY |
Deepgram key (STT + TTS) |
FIREWORKS_API_KEY |
Fireworks AI key (LLM) |
FIREWORKS_BASE_URL |
default https://api.fireworks.ai/inference/v1 |
FIREWORKS_MODEL |
default accounts/fireworks/models/gpt-oss-120b |
MCP_SERVER_URL |
MCP streamable-HTTP endpoint (…/mcp) |
RESTAURANT_SLUG |
taible-bistro |
LIVEKIT_ROOM |
taible-demo |
| Variable | Description |
|---|---|
NEXT_PUBLIC_PIPECAT_URL |
LiveKit server URL |
NEXT_PUBLIC_SUPABASE_URL |
Supabase project URL |
NEXT_PUBLIC_SUPABASE_ANON_KEY |
Supabase anon/publishable key (safe for browser) |