<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ashutosh Nayak</title>
    <description>The latest articles on DEV Community by Ashutosh Nayak (@ashutoshnayak).</description>
    <link>https://dev.to/ashutoshnayak</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4079078%2Feac389d6-1f4b-4747-9775-c5e4dfc05f63.png</url>
      <title>DEV Community: Ashutosh Nayak</title>
      <link>https://dev.to/ashutoshnayak</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ashutoshnayak"/>
    <language>en</language>
    <item>
      <title>Building KrishiMitra: My 10-Day Journey Building a Voice AI Assistant for Indian Farmers</title>
      <dc:creator>Ashutosh Nayak</dc:creator>
      <pubDate>Sat, 15 Aug 2026 14:10:40 +0000</pubDate>
      <link>https://dev.to/ashutoshnayak/building-krishimitra-my-10-day-journey-building-a-voice-ai-assistant-for-indian-farmers-inc</link>
      <guid>https://dev.to/ashutoshnayak/building-krishimitra-my-10-day-journey-building-a-voice-ai-assistant-for-indian-farmers-inc</guid>
      <description>&lt;p&gt;Over the last 10 days, I built &lt;strong&gt;KrishiMitra&lt;/strong&gt;, a multilingual voice AI assistant designed for Indian farmers as part of &lt;strong&gt;10 Days of Voice Agents — VoiceForBharat Edition&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The project started as a basic real-time voice agent. By the end of the challenge, it had grown into a system that can remember users with consent, fetch live weather information, make outbound calls, escalate difficult problems to humans, measure call outcomes, and hand conversations to a specialist agent.&lt;/p&gt;

&lt;p&gt;This post explains what I built, the architecture behind it, the problems I faced, and how someone else can start building a similar voice agent.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Problem
&lt;/h2&gt;

&lt;p&gt;Farmers often need quick answers about everyday agricultural decisions: irrigation, weather, crop care, pests, and other farming practices.&lt;/p&gt;

&lt;p&gt;I chose the &lt;strong&gt;Farm &amp;amp; Field&lt;/strong&gt; track because I wanted to explore how a voice-first interface could make this kind of assistance more natural.&lt;/p&gt;

&lt;p&gt;Instead of requiring a farmer to type a detailed question into an application, KrishiMitra is designed for a conversational interaction:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Farmer speaks → KrishiMitra understands → KrishiMitra checks the appropriate information → KrishiMitra responds naturally.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Voice is particularly useful here because the interaction can happen conversationally, in English, Hindi, or a Hindi-English mixed style.&lt;/p&gt;




&lt;h1&gt;
  
  
  2. What Is KrishiMitra?
&lt;/h1&gt;

&lt;p&gt;KrishiMitra is a voice-first agricultural assistant with several layers of capability.&lt;/p&gt;

&lt;p&gt;It can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Have multilingual voice conversations&lt;/li&gt;
&lt;li&gt;Provide general agricultural guidance&lt;/li&gt;
&lt;li&gt;Remember useful farmer information after explicit consent&lt;/li&gt;
&lt;li&gt;Fetch live weather information&lt;/li&gt;
&lt;li&gt;Make outbound calls using LiveKit SIP and Linphone&lt;/li&gt;
&lt;li&gt;Create human-help requests when AI assistance is not enough&lt;/li&gt;
&lt;li&gt;Track real call outcomes&lt;/li&gt;
&lt;li&gt;Hand serious crop-health questions to a dedicated Crop Specialist&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project uses &lt;strong&gt;Murf Falcon&lt;/strong&gt; for text-to-speech, with LiveKit providing the real-time voice transport.&lt;/p&gt;




&lt;h1&gt;
  
  
  3. How the System Works
&lt;/h1&gt;

&lt;p&gt;At the core, the system follows the standard real-time voice-agent pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Farmer speaks
      ↓
LiveKit real-time transport
      ↓
Deepgram Speech-to-Text
      ↓
Gemini LLM
      ↓
Tools / Memory / Specialist Handoff
      ↓
Murf Falcon Text-to-Speech
      ↓
Farmer hears the response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The main components are:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Real-time transport&lt;/td&gt;
&lt;td&gt;LiveKit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Speech-to-text&lt;/td&gt;
&lt;td&gt;Deepgram&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Language model&lt;/td&gt;
&lt;td&gt;Gemini&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Text-to-speech&lt;/td&gt;
&lt;td&gt;Murf Falcon&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend&lt;/td&gt;
&lt;td&gt;Python + LiveKit Agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frontend&lt;/td&gt;
&lt;td&gt;Next.js&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Persistent storage&lt;/td&gt;
&lt;td&gt;SQLite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Outbound telephony&lt;/td&gt;
&lt;td&gt;LiveKit SIP + Linphone&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The complete project is available on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/Ashu-svg10/murf-livekit-starter" rel="noopener noreferrer"&gt;https://github.com/Ashu-svg10/murf-livekit-starter&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  4. Building the Agent Step by Step
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Step 1 — Give the agent a clear role
&lt;/h2&gt;

&lt;p&gt;The first important lesson was that a voice agent needs more than a model and a voice.&lt;/p&gt;

&lt;p&gt;KrishiMitra has a clear identity, objectives, conversational style, and safety boundaries.&lt;/p&gt;

&lt;p&gt;For example, it is instructed to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep responses short and conversational&lt;/li&gt;
&lt;li&gt;Ask one question at a time&lt;/li&gt;
&lt;li&gt;Mirror the user's language&lt;/li&gt;
&lt;li&gt;Use Devanagari for Hindi responses&lt;/li&gt;
&lt;li&gt;Avoid pretending to know information it does not have&lt;/li&gt;
&lt;li&gt;Escalate when the problem is outside its capabilities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Clear instructions made the behavior much more predictable.&lt;/p&gt;




&lt;h1&gt;
  
  
  5. Multilingual Voice Interaction
&lt;/h1&gt;

&lt;p&gt;KrishiMitra supports English, Hindi, and code-mixed conversations.&lt;/p&gt;

&lt;p&gt;For Hindi, the agent is instructed to respond using Devanagari script rather than Romanized Hindi.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;नमस्ते, आपकी फसल कैसी है?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;rather than:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Namaste, aapki fasal kaisi hai?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal was not simply to translate every sentence. The agent should naturally follow the language and style used by the farmer.&lt;/p&gt;




&lt;h1&gt;
  
  
  6. Consent-Based Memory
&lt;/h1&gt;

&lt;p&gt;One of the most useful features I added was persistent memory.&lt;/p&gt;

&lt;p&gt;KrishiMitra can remember information such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name&lt;/li&gt;
&lt;li&gt;Language preference&lt;/li&gt;
&lt;li&gt;Crop&lt;/li&gt;
&lt;li&gt;District&lt;/li&gt;
&lt;li&gt;Irrigation type&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But there is an important rule:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The agent must ask for permission before saving the information.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The flow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Learn information
      ↓
Ask for consent
      ↓
YES → Save memory
NO  → Do not save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This was an important design decision because memory should not silently become a way of collecting personal information.&lt;/p&gt;

&lt;p&gt;Sensitive information such as Aadhaar numbers, PAN numbers, bank details, passwords, OTPs, and PINs is not intended to be stored.&lt;/p&gt;




&lt;h1&gt;
  
  
  7. Giving the Agent a Real Tool
&lt;/h1&gt;

&lt;p&gt;A voice agent becomes much more useful when it can access information that the language model does not know reliably.&lt;/p&gt;

&lt;p&gt;For KrishiMitra, I added a &lt;strong&gt;live weather lookup tool&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For example, a farmer can ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Aaj Khordha mein baarish hone ki kitni possibility hai?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead of generating a weather answer from the model's memory, the agent calls the weather service and speaks the returned information.&lt;/p&gt;

&lt;p&gt;The agent also has a failure path. If the weather service is unavailable, it should tell the farmer that live weather information is temporarily unavailable rather than inventing an answer.&lt;/p&gt;

&lt;p&gt;This was one of the biggest lessons from the tools day:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The tool description matters.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The model needs a clear description of when a tool should be called and what information it provides.&lt;/p&gt;




&lt;h1&gt;
  
  
  8. Outbound Calling
&lt;/h1&gt;

&lt;p&gt;After the browser-based voice experience was working, I extended KrishiMitra to outbound calls using &lt;strong&gt;LiveKit SIP and Linphone&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The flow became:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;KrishiMitra
     ↓
LiveKit SIP
     ↓
Linphone
     ↓
Farmer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This introduced a completely different set of debugging problems compared with browser voice.&lt;/p&gt;

&lt;p&gt;One issue I encountered was an invalid SIP destination format. The first attempt used a complete SIP URI where the LiveKit request expected a SIP user/number in the appropriate field.&lt;/p&gt;

&lt;p&gt;After correcting the configuration, the SIP call was successfully created and the Linphone client received the call.&lt;/p&gt;

&lt;p&gt;This was a good reminder that voice agents are not only about AI. Telephony configuration, transport, authentication, and addressing can be just as important.&lt;/p&gt;




&lt;h1&gt;
  
  
  9. Knowing When to Ask a Human
&lt;/h1&gt;

&lt;p&gt;I did not want KrishiMitra to pretend it could solve every agricultural problem.&lt;/p&gt;

&lt;p&gt;For serious crop-health problems, the agent can create a human-help request.&lt;/p&gt;

&lt;p&gt;The flow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Farmer reports serious problem
          ↓
KrishiMitra explains the limitation
          ↓
Asks for permission to share a summary
          ↓
Creates human-help request
          ↓
Returns a reference ID
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The request is intentionally summarized rather than sending the entire conversation.&lt;/p&gt;

&lt;p&gt;The human receives useful information such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who needs help&lt;/li&gt;
&lt;li&gt;What happened&lt;/li&gt;
&lt;li&gt;What the agent already checked&lt;/li&gt;
&lt;li&gt;Urgency&lt;/li&gt;
&lt;li&gt;Language and preferred follow-up method&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This made the system more realistic because a good assistant should know when to stop pretending to be the expert.&lt;/p&gt;




&lt;h1&gt;
  
  
  10. Measuring Calls
&lt;/h1&gt;

&lt;p&gt;Once the agent had multiple capabilities, I wanted to know whether calls were actually achieving their intended outcomes.&lt;/p&gt;

&lt;p&gt;I added a SQLite-based call analytics system.&lt;/p&gt;

&lt;p&gt;The dashboard tracks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Total Calls
Successful Calls
Failed Calls
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For KrishiMitra, I defined a successful call as one where the farmer receives verified weather information or successfully creates a human-help request.&lt;/p&gt;

&lt;p&gt;The important part is that the dashboard uses &lt;strong&gt;real call records&lt;/strong&gt;, not hardcoded numbers.&lt;/p&gt;

&lt;p&gt;The flow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Voice session ends
       ↓
Session outcome is determined
       ↓
SQLite record is created
       ↓
Dashboard reads the records
       ↓
Metrics update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gave the project a basic observability layer instead of treating the voice experience as a black box.&lt;/p&gt;




&lt;h1&gt;
  
  
  11. Handing Off to a Specialist Agent
&lt;/h1&gt;

&lt;p&gt;The final major feature was specialist-agent handoff.&lt;/p&gt;

&lt;p&gt;The main KrishiMitra agent has a broad agricultural role, but a single agent should not try to be an expert at everything.&lt;/p&gt;

&lt;p&gt;So I created a dedicated:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Crop Specialist&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The flow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Farmer
  ↓
KrishiMitra
  ↓
Serious crop-health problem detected
  ↓
Main agent announces handoff
  ↓
Crop Specialist
  ↓
Continues the same conversation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The specialist has its own instructions and a narrower responsibility.&lt;/p&gt;

&lt;p&gt;The existing conversation context is passed to the specialist, so the farmer does not have to repeat the complete problem.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Meri tamatar ki fasal ke patton par bahut saare daag aa rahe hain aur paudhe tezi se kharab ho rahe hain."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;KrishiMitra can recognize that this needs focused crop-health guidance and hand the conversation to the Crop Specialist.&lt;/p&gt;

&lt;p&gt;This separation of responsibilities makes the overall system easier to reason about.&lt;/p&gt;




&lt;h1&gt;
  
  
  12. The Hard Parts
&lt;/h1&gt;

&lt;p&gt;The project definitely did not work perfectly on the first attempt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memory persistence
&lt;/h2&gt;

&lt;p&gt;The first challenge was making sure that information was not merely remembered inside one conversation but persisted for a future conversation.&lt;/p&gt;

&lt;p&gt;The important fix was to separate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Looking up existing memory&lt;/li&gt;
&lt;li&gt;Asking for consent&lt;/li&gt;
&lt;li&gt;Saving memory&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent must not assume that learning information means it has permission to store it.&lt;/p&gt;

&lt;h2&gt;
  
  
  SIP outbound calling
&lt;/h2&gt;

&lt;p&gt;Outbound calling was another major debugging step.&lt;/p&gt;

&lt;p&gt;The SIP configuration initially produced errors around the destination and &lt;code&gt;From&lt;/code&gt; header. Understanding the distinction between a SIP user, a phone number, and a complete SIP URI was necessary before the call could be created successfully.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real analytics
&lt;/h2&gt;

&lt;p&gt;It was tempting to simply display numbers on a dashboard, but that would not prove anything.&lt;/p&gt;

&lt;p&gt;The dashboard needed to be connected to actual session completion data and a database so that a real call changed the numbers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Specialist handoff
&lt;/h2&gt;

&lt;p&gt;The handoff also needed more than creating another class.&lt;/p&gt;

&lt;p&gt;The main agent needed to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Know when the specialist was appropriate.&lt;/li&gt;
&lt;li&gt;Tell the user that a handoff was happening.&lt;/li&gt;
&lt;li&gt;Transfer the conversation.&lt;/li&gt;
&lt;li&gt;Preserve the existing context.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That last part is especially important for a natural voice experience.&lt;/p&gt;




&lt;h1&gt;
  
  
  13. How to Run the Project
&lt;/h1&gt;

&lt;p&gt;The repository is available here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/Ashu-svg10/murf-livekit-starter" rel="noopener noreferrer"&gt;https://github.com/Ashu-svg10/murf-livekit-starter&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;You need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.10+&lt;/li&gt;
&lt;li&gt;Node.js 18+&lt;/li&gt;
&lt;li&gt;uv&lt;/li&gt;
&lt;li&gt;pnpm&lt;/li&gt;
&lt;li&gt;A LiveKit Cloud project&lt;/li&gt;
&lt;li&gt;Murf API key&lt;/li&gt;
&lt;li&gt;Deepgram API key&lt;/li&gt;
&lt;li&gt;Gemini API key&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Clone
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/Ashu-svg10/murf-livekit-starter.git
&lt;span class="nb"&gt;cd &lt;/span&gt;murf-livekit-starter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Install backend dependencies
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;backend
uv &lt;span class="nb"&gt;sync&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Install frontend dependencies
&lt;/h2&gt;

&lt;p&gt;In another terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;frontend
pnpm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Configure environment variables
&lt;/h2&gt;

&lt;p&gt;Create local &lt;code&gt;.env.local&lt;/code&gt; files.&lt;/p&gt;

&lt;p&gt;Backend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;backend/.env.local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Frontend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;frontend/.env.local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Store API credentials there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Never commit API keys or secrets to GitHub.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Start the backend
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;backend&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;uv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;python&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;src/agent.py&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;dev&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Start the frontend
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;frontend&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;pnpm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;dev&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Click &lt;strong&gt;Start Call&lt;/strong&gt;, allow microphone access, and begin speaking with KrishiMitra.&lt;/p&gt;

&lt;p&gt;The repository README contains the project structure, environment-variable setup, memory behavior, weather tool, escalation, analytics, specialist handoff, and outbound-call information.&lt;/p&gt;




&lt;h1&gt;
  
  
  14. What I Would Improve Next
&lt;/h1&gt;

&lt;p&gt;There is still a lot I would like to build.&lt;/p&gt;

&lt;p&gt;The next improvements would include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More Indian regional languages&lt;/li&gt;
&lt;li&gt;Agricultural RAG using trusted agricultural documents&lt;/li&gt;
&lt;li&gt;Dedicated specialists for irrigation, soil, pests, and government schemes&lt;/li&gt;
&lt;li&gt;More real-time agricultural data sources&lt;/li&gt;
&lt;li&gt;Better call-quality and latency analytics&lt;/li&gt;
&lt;li&gt;A production-ready human support dashboard&lt;/li&gt;
&lt;li&gt;Better support for low-connectivity environments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I would also like to evaluate the agent systematically with a larger set of real-world farmer questions instead of relying mainly on manual testing.&lt;/p&gt;




&lt;h1&gt;
  
  
  15. What I Learned
&lt;/h1&gt;

&lt;p&gt;The biggest lesson from these 10 days is that a voice agent is much more than:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;STT + LLM + TTS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A useful voice agent also needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Good prompts&lt;/li&gt;
&lt;li&gt;Clear tool descriptions&lt;/li&gt;
&lt;li&gt;Real data&lt;/li&gt;
&lt;li&gt;Failure handling&lt;/li&gt;
&lt;li&gt;Consent&lt;/li&gt;
&lt;li&gt;Memory&lt;/li&gt;
&lt;li&gt;Safety guardrails&lt;/li&gt;
&lt;li&gt;Human escalation&lt;/li&gt;
&lt;li&gt;Specialist routing&lt;/li&gt;
&lt;li&gt;Observability&lt;/li&gt;
&lt;li&gt;Privacy protection&lt;/li&gt;
&lt;li&gt;A good real-time user experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most interesting part was watching the project evolve from a basic voice conversation into a system that can make decisions about when to use tools, when to ask for permission, when to involve a human, and when to transfer the conversation to another agent.&lt;/p&gt;




&lt;h1&gt;
  
  
  16. Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Building KrishiMitra over 10 days taught me how quickly a voice-agent prototype can grow when each capability is built on top of the previous one.&lt;/p&gt;

&lt;p&gt;I started with a voice interface.&lt;/p&gt;

&lt;p&gt;I ended with an agricultural voice assistant that can:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;talk → remember → use real data → call → escalate → measure → hand off&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The project is still a prototype, but it gave me a much deeper understanding of what is required to build reliable voice AI for real-world users.&lt;/p&gt;

&lt;p&gt;A huge part of the experience was learning by debugging the failures rather than only following the happy path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Repository
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;KrishiMitra:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/Ashu-svg10/murf-livekit-starter" rel="noopener noreferrer"&gt;https://github.com/Ashu-svg10/murf-livekit-starter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built as part of:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;10 Days of Voice Agents — VoiceForBharat Edition&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Powered by &lt;strong&gt;Murf Falcon&lt;/strong&gt; for text-to-speech.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>devchallenge</category>
    </item>
  </channel>
</rss>
