{"slug": "saathi-building-a-kirana-store-voice-agent-in-10-days-with-murf-falcon-published", "title": "Saathi: building a Kirana store voice agent in 10 days with Murf Falcon published: true tags: voiceai, python, webdev, beginners", "summary": "A developer built Saathi, a Hinglish-speaking voice agent for Indian Kirana stores, in ten days using Murf Falcon, Deepgram, Gemini, and LiveKit. The agent handles orders, checks stock, and escalates to human staff, with memory of returning customers. The project demonstrates the feasibility of voice AI for local commerce in India.", "body_md": "How I built a Hinglish-speaking voice assistant for local grocery stores — and what ten days of #VoiceForBharat taught me about voice AI.\n\n**The problem and the users**\n\nMost local Kirana (neighbourhood grocery) stores in India still run on phone calls and memory. The shopkeeper remembers what Ramesh usually orders, but there's no system behind that memory — no record of preferences, no way to check stock before promising something, and no help when the owner is busy serving someone else in the shop.\n\nI built Saathi, a voice agent for the Local Commerce track, to be that missing layer. It's designed for customers who are more comfortable talking than typing — especially in Hindi, Hinglish, or a code-mixed version of both — and for a store owner who needs a system that can take routine calls off their hands without ever pretending to be a human or making promises it can't keep.\n\nVoice is the right interface here because it removes the biggest barrier to digital tools in local commerce: literacy and app-navigation friction. If you can make a phone call, you can use Saathi.\n\n**What the voice agent does**\n\nSaathi can:\n\nHold a natural, code-mixed conversation in English, Hindi, or Hinglish\n\nGreet returning customers by name and recall their last order, quantity, and delivery slot\n\nLook up products and check live stock before promising anything\n\nPlace an order and confirm it back to the customer\n\nEscalate to the store owner — with consent — when something is outside its scope\n\nCall customers proactively to confirm orders\n\nHand off payment disputes and refund requests to a dedicated support specialist agent\n\nLog every call's outcome to a small analytics dashboard\n\nNone of this shipped on day one. Each piece was added deliberately across the ten days, and the sections below walk through how.\n\n**How the system works**\n\nAt its core, Saathi is a real-time loop: the caller's speech is transcribed, reasoned over, and turned back into speech, all streamed live over LiveKit.\n\nThe core voice loop: STT → LLM → TTS\n\n┌──────────────┐ ┌───────────────┐ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐\n\n│ Caller │────▶│ Deepgram │────▶│ Gemini LLM │────▶│ Murf Falcon │────▶│ Audio reply │\n\n│ Browser/Phone│ │ Speech to text│ │ Persona + tools │ │ Text to speech │ │ Streamed via │\n\n│ │ │ │ │ + guardrails │ │ (Anisha voice) │ │ LiveKit │\n\n└──────────────┘ └───────────────┘ └──────────────────┘ └──────────────────┘ └──────────────────┘\n\n**STT * — Deepgram nova-3, set to multi language mode so it transcribes code-mixed Hindi/English accurately\n**LLM *— Google Gemini 2.5-flash-lite, which carries the persona, the guardrails, and the tool-calling logic\n*TTS *— Murf Falcon, the fastest TTS API I tested, speaking in the Indian English voice Anisha (and Samar for the specialist agent, so the handoff is audibly obvious)\n**Transport** — LiveKit handles the real-time audio both from the browser and from phone calls bridged in over SIP\n\n(outbound calls) (analytics)\n\n┌──────────────────┐ ┌──────────────────────┐\n\n│ Order confirm │ │ Call outcomes dash │\n\n│ proactive dial │ │ success / failure │\n\n└──────────────────┘ └──────────────────────┘\n\nA caller reaches the agent either through the browser frontend or by phone via a SIP trunk. Both paths land in the same LiveKit room, so the agent logic doesn't need to know or care which channel it's on. From there, the main Assistant agent uses its tools against a small SQLite data layer, and can transfer the conversation to a specialist agent when needed.\n\n**The most important features**\n\n**An Indian voice, built for code-mixed conversations**\n\nThe agent speaks in Murf Falcon's Anisha voice with the Conversation style, and the Deepgram STT model runs in multi mode instead of a fixed language — that one setting change is what lets a customer switch from English to Hindi mid-sentence without breaking transcription.\n\n**Memory that survives across calls**\n\nSaathi remembers returning customers using a small SQLite-backed profile store, and — critically — only saves anything after the customer has explicitly agreed to it.\n\n**Tools that check real data before promising anything**\n\nBefore the agent confirms an order, it calls a catalogue lookup and a stock check against a local product database. If a customer asks in Hindi, a small translation layer converts common grocery terms (Devanagari script) into the English terms the database understands before it ever runs a query.\n\n**Escalation with consent, not silence**\n\nWhen a request falls outside what the agent can safely resolve — a payment dispute, a delivery complaint — it doesn't guess or stall. It explains the limitation, asks permission to pass details to the store owner, and only then creates an escalation ticket with a reference ID the caller can quote later. Anything that looks like a password, OTP, or card number is stripped out before the ticket is ever saved.\n\n**Handing off to a specialist**\n\nRather than trying to make one agent good at everything, Saathi hands payment and refund conversations to a Customer Support Specialist agent with its own voice (Samar) and its own narrower toolset.\n\nThe specialist receives the full chat history — the customer never has to repeat themselves — and the voice change makes the handoff audibly clear rather than a silent, confusing swap.\n\n**Outbound calls and a call analytics dashboard**\n\nSaathi can also dial out — for example to confirm a pending order — and every call, inbound or outbound, browser or phone, is logged when it ends. A call counts as a success only if an order was actually placed; everything else is logged as a non-conversion. That distinction feeds a small dashboard showing total, successful, and failed calls, without exposing any caller's personal details.\n\n**The difficult parts**\n\nCode-mixed language was harder than expected. Getting Hinglish to transcribe well took two changes, not one: setting Deepgram's language to multi so STT didn't force everything into a single language, and adding a translation step so Devanagari product names (say, आटा) resolved correctly against an English-only product database. Neither change alone was enough — it took both.\n\nGetting the LLM to actually ask permission, every time. Early on, the agent would sometimes save customer data or escalate an issue without clearly asking first. The fix wasn't more code — it was making the system prompt explicit and mechanical about consent (\"ONLY call this tool AFTER the customer has clearly said yes\"), and putting that same instruction directly inside the tool's docstring, since the LLM reads both.\n\nPreserving context across a handoff. The first version of the specialist handoff lost conversation history, so customers had to repeat their whole problem to the new agent. Passing a copy of the chat context into the specialist agent's constructor fixed this — the specialist inherits everything the customer already said, minus the main agent's system instructions.\n\nMerge conflicts from diverged Git histories. When pushing my local changes to GitHub, the remote and local histories had diverged so badly that dozens of files across multiple days showed conflicts. After trying --rebase and --allow-unrelated-histories without success, git push origin main --force was the right call — it's not always the answer, but when you own the repo and your local state is correct, it works.\n\n**Build your own voice agent**\n\nIf you want to build something similar, here's what you need, and the shape it takes in this codebase.\n\n**The four core components:**\n\n**Speech-to-text (STT)** — converts the caller's audio into text. This project uses Deepgram.\n\n**An LLM** — reasons over the transcript, holds the persona and guardrails, and decides when to call a tool. This project uses Google Gemini.\n\n**Text-to-speech (TTS)** — turns the LLM's reply back into audio. This project uses Murf Falcon, chosen specifically for its speed and its Indian-language voice options.\n\n**Real-time transport** — moves audio both directions with low latency. This project uses LiveKit, which also handles browser and SIP (phone) participants through the same interface.\n\n**Setting up and running the project:**\n\nbash\n\n**# Clone the repo**\n\ngit clone [https://github.com/greevajagani43-alt/murf-livekit-starter.git](https://github.com/greevajagani43-alt/murf-livekit-starter.git)\n\ncd murf-livekit-starter/day\\ 9\n\n**# Backend**\n\ncd backend\n\nuv sync\n\ncp .env.example .env.local # fill in your API keys here — never commit this file\n\nuv run python src/agent.py download-files\n\nuv run python src/agent.py console # test in your terminal, no frontend needed\n\nuv run python src/agent.py dev # or run in dev mode with the frontend\n\n**# Frontend**\n\ncd frontend\n\npnpm install\n\npnpm dev\n\n**Where API keys go**: all secrets live in backend/.env.local, which is git-ignored and created from backend/.env.example. You'll need keys for LiveKit, Murf, Deepgram, and Google — none of them are ever hard-coded or committed.\n\nConnecting and testing a conversation: the fastest way to sanity-check your agent is uv run python src/agent.py console, which gives you a conversation in your terminal with no frontend required. Once that works, run the frontend and the agent in dev mode together, open the local URL, and start talking.\n\nWhat I'd improve next\n\nMove from SQLite to a hosted database so state survives redeploys and scales past a single store\n\nAdd streaming partial-result display on the frontend so users can see the transcript as they speak, not just after\n\nExpand the specialist roster — a delivery-tracking specialist would be a natural next addition alongside the support one\n\nAdd WhatsApp as a channel, since many Indian users prefer it over a browser interface\n\nCode and demos\n\n**The full project **— every day's changes, from the first working conversation to the multi-agent handoff — is public here:\n\n**Repository: https://github.com/greevajagani43-alt/murf-livekit-starter**\n\nThis post covers 10 Days of Voice Agents — VoiceForBharat Edition. Built with Murf Falcon, the fastest TTS API, on top of the Murf LiveKit starter.", "url": "https://wpnews.pro/news/saathi-building-a-kirana-store-voice-agent-in-10-days-with-murf-falcon-published", "canonical_source": "https://dev.to/greeva_jagani_c97a0f70e05/saathi-building-a-kirana-store-voice-agent-in-10-days-with-murf-falcon-published-true-tags-22bm", "published_at": "2026-08-15 16:27:32+00:00", "updated_at": "2026-08-15 16:42:26.995262+00:00", "lang": "en", "topics": ["artificial-intelligence", "natural-language-processing", "ai-products", "developer-tools"], "entities": ["Saathi", "Murf Falcon", "Deepgram", "Gemini", "LiveKit", "Anisha", "Samar"], "alternates": {"html": "https://wpnews.pro/news/saathi-building-a-kirana-store-voice-agent-in-10-days-with-murf-falcon-published", "markdown": "https://wpnews.pro/news/saathi-building-a-kirana-store-voice-agent-in-10-days-with-murf-falcon-published.md", "text": "https://wpnews.pro/news/saathi-building-a-kirana-store-voice-agent-in-10-days-with-murf-falcon-published.txt", "jsonld": "https://wpnews.pro/news/saathi-building-a-kirana-store-voice-agent-in-10-days-with-murf-falcon-published.jsonld"}}