Inspiration
Every AI assistant today has the same problem — it forgets you. You share your goals, your struggles, your progress... and next session, blank slate. This makes AI useless as a real coach.
I wanted to build something different: an AI that remembers you, follows up on your goals, and holds you accountable — like a real life coach.
The name comes from Al-Jazari, the 12th-century engineer from Diyarbakir who built the world's first programmable automata. Like his mechanical marvels, Jazari is systematic, precise, and ingenious.
What it does
Jazari is a voice-first AI life coach that:
- Remembers you across sessions using semantic multimodal memory
- Runs structured coaching sessions based on the ICF framework and GROW model
- Follows up on forgotten goals using the Ebbinghaus forgetting curve
- Speaks naturally via Gemini Live API with real-time bidirectional audio
- Delegates to specialists — 5 expert sub-agents for career, health, finance, discipline, and memory
How I built it
- Google ADK for multi-agent orchestration
- Gemini 2.5 Flash Native Audio for real-time voice conversation
- Gemini 2.5 Flash for text mode with sub-agent routing
- Gemini Embedding 2 for multimodal memory vectors (768-dim)
- LanceDB for vector similarity search
- Cloud Run for hosting with session affinity for WebSockets
- Firestore for persistent memory backup across container restarts
- Cloud Storage for media (photos, voice notes)
- React + Vite frontend with real-time transcript display
Architecture
The frontend connects via WebSocket to a FastAPI server on Cloud Run. The ADK Runner orchestrates 5 specialist agents under one root agent (Jazari). Memory is stored in LanceDB with Gemini embeddings, backed up to Firestore so nothing is lost when containers restart.
Every memory has an importance score. Identity facts (name, job) persist for months. Casual observations fade in days. The formula: retention = e^(-t/S) where S =
importance × 30.
Challenges
- google_search conflict: Gemini's built-in google_search tool cannot be combined with function calling in the same request. Solved by isolating search into a dedicated agent.
- LanceDB on Cloud Run: Containers are ephemeral, so LanceDB data disappears on restart. Solved with Firestore backup/restore on startup.
- Voice mode limitations: Gemini Live API's run_live() does not support tool calling. Solved with auto-save on disconnect — voice transcripts are stored to memory when the session ends.
- Embedding model changes: The embedding model API changed during development. Migrated to gemini-embedding-2-preview.
What I learned
- The Ebbinghaus forgetting curve from 1885 applies surprisingly well to AI memory systems
- Proactive agent behavior (bringing up forgotten goals) creates a dramatically more engaging experience
- Professional coaching methodology (GROW model, Wheel of Life) gives AI conversations real structure
- Building multi-agent systems requires careful tool isolation — not all tools can coexist
Built With
- fastapi
- gemini-2.5-flash
- gemini-embedding-2
- gemini-live-api
- google-adk
- google-cloud
- google-cloud-run
- google-firestore
- lancedb
- python
- react
- typescript
- vite
Log in or sign up for Devpost to join the conversation.