I'm always excited to take on new projects and collaborate with innovative minds.
Most Indian shopkeepers track udhaar (credit given to customers) in a notebook, not an app, because typing after a 12-hour day isn't realistic — but talking is. This is the build story of Khata-Vaani, a voice agent for Murf AI's VoiceForBharat challenge, covering guardrails, memory, tools, outbound calls, and a specialist handoff.
Built for the 10 Days of Voice Agents — VoiceForBharat Edition, by Murf AI
Most small shopkeepers in India — the kirana store owner, the vendor at the corner — still track udhaar (credit given to regular customers) in a paper notebook, or worse, in their head. They don't sit down at the end of a 12-hour day and open an app to type in what they sold and who owes them money. Typing is friction they don't have time for. Talking is not.
That's the gap Khata-Vaani fills: a voice agent, built for the Financial Services track, that lets a shopkeeper log a sale or a credit entry just by speaking — in the middle of the mixed Hindi-English they already speak — and later ask "who owes me how much" and get a real answer.
Voice isn't a gimmick here. It's the only interface that fits how this user actually works.
At its core, Khata-Vaani:
Four pieces, wired together with LiveKit for real-time transport:
# Simplified shape of a tool the main agent can call
@function_tool
async def save_customer_entry(name: str, amount: float, entry_type: str):
"""Log a sale or udhaar (credit) entry for a customer.
Always confirm the details with the shopkeeper before calling this."""
# writes to SQLite, tied to the shopkeeper's profile
...
The first real STT config I shipped set Deepgram's language explicitly to hi-Latn, assuming that was the right way to handle Hindi-English code-mixing. It wasn't — Deepgram's actual supported path for code-switched speech under nova-3 is language="multi", combined with a multilingual turn-detection model. I didn't catch this until a later day's task documentation pointed directly at the correct config, and going back to compare, the hi-Latn setting was never going to reliably parse a sentence like "aaj maine Ramesh ko 300 rupaye ka udhaar diya."
The lesson: don't trust a plausible-looking config value just because it doesn't throw an error. Test the actual failure mode (a real code-mixed sentence) before assuming a language setting works, and re-verify against the current provider docs rather than what seems logically right.
If you want to build something similar:
.env.example to .env.local in both the backend and frontend, and never commit it. You'll need a Murf API key, LiveKit Cloud credentials, and whatever STT/LLM provider keys the starter requires.Repository: https://github.com/DheerGupta35959/khata-vaani
The memory layer is still SQLite and single-shopkeeper-per-session — a real deployment would need proper multi-tenant storage and probably a lighter-weight confirmation flow so confirming every single entry doesn't get tedious for a shopkeeper logging twenty sales a day. The scheme-eligibility dataset is also hand-built and needs a real refresh process rather than being static.
Built as part of 10 Days of Voice Agents — VoiceForBharat Edition by Murf AI, using Murf Falcon.
Your email address will not be published. Required fields are marked *