<?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: Agrima Gupta</title>
    <description>The latest articles on DEV Community by Agrima Gupta (@agrima-06).</description>
    <link>https://dev.to/agrima-06</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%2F4125872%2Fe7a3bcb7-fe2b-4e47-94f4-65badc467977.png</url>
      <title>DEV Community: Agrima Gupta</title>
      <link>https://dev.to/agrima-06</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/agrima-06"/>
    <language>en</language>
    <item>
      <title>I Built an AI Voice Sales Agent — Here’s the Architecture Behind It</title>
      <dc:creator>Agrima Gupta</dc:creator>
      <pubDate>Tue, 15 Sep 2026 08:55:51 +0000</pubDate>
      <link>https://dev.to/agrima-06/i-built-an-ai-voice-sales-agent-heres-the-architecture-behind-it-g4g</link>
      <guid>https://dev.to/agrima-06/i-built-an-ai-voice-sales-agent-heres-the-architecture-behind-it-g4g</guid>
      <description>&lt;p&gt;I Built an AI Voice Sales Agent — Here’s the Architecture Behind It&lt;/p&gt;

&lt;p&gt;What if a dealer could simply call a number, tell an AI what they need, and place an order through a normal conversation?&lt;/p&gt;

&lt;p&gt;No app.&lt;br&gt;
No searching through products.&lt;br&gt;
No filling out forms.&lt;/p&gt;

&lt;p&gt;Just talk.&lt;/p&gt;

&lt;p&gt;That was the idea behind a project I've been working on: an AI Voice Sales Agent for dealers.&lt;/p&gt;

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

&lt;p&gt;"I need 50 boxes of Product X and 20 of Product Y."&lt;/p&gt;

&lt;p&gt;The AI should understand the request, check whether the products are available, figure out the dealer's pricing, apply any applicable schemes, confirm the order, and eventually push it into the company's ERP.&lt;/p&gt;

&lt;p&gt;This isn't a finished enterprise product yet. I'm still building and figuring things out, but I wanted to document how I'm approaching the architecture and some of the decisions I've made along the way.&lt;/p&gt;




&lt;p&gt;The Architecture&lt;/p&gt;

&lt;p&gt;The basic flow looks something like this:&lt;/p&gt;

&lt;p&gt;Dealer&lt;br&gt;
   ↓&lt;br&gt;
Phone Call&lt;br&gt;
   ↓&lt;br&gt;
Twilio&lt;br&gt;
   ↓&lt;br&gt;
OpenAI Realtime API&lt;br&gt;
   ↓&lt;br&gt;
LangGraph&lt;br&gt;
   ↓&lt;br&gt;
Business Tools&lt;br&gt;
   ↓&lt;br&gt;
FastAPI Backend&lt;br&gt;
   ↓&lt;br&gt;
PostgreSQL / Redis&lt;br&gt;
   ↓&lt;br&gt;
ERP&lt;/p&gt;

&lt;p&gt;The interesting part isn't just getting an LLM to talk.&lt;/p&gt;

&lt;p&gt;The AI actually needs to do things.&lt;/p&gt;

&lt;p&gt;It should be able to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understand what the dealer wants&lt;/li&gt;
&lt;li&gt;Search for products&lt;/li&gt;
&lt;li&gt;Check inventory&lt;/li&gt;
&lt;li&gt;Get dealer-specific pricing&lt;/li&gt;
&lt;li&gt;Check applicable schemes&lt;/li&gt;
&lt;li&gt;Remember useful customer context&lt;/li&gt;
&lt;li&gt;Create draft orders&lt;/li&gt;
&lt;li&gt;Eventually sync with an ERP&lt;/li&gt;
&lt;li&gt;Handle failures without making things up&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's break down how I'm thinking about each part.&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;The Voice Layer&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The first challenge is simple:&lt;/p&gt;

&lt;p&gt;How does the dealer actually talk to the system?&lt;/p&gt;

&lt;p&gt;I'm using Twilio as the telephony layer.&lt;/p&gt;

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

&lt;p&gt;Dealer calls&lt;br&gt;
    ↓&lt;br&gt;
Twilio receives the call&lt;br&gt;
    ↓&lt;br&gt;
Audio goes to the AI system&lt;br&gt;
    ↓&lt;br&gt;
AI processes the conversation&lt;br&gt;
    ↓&lt;br&gt;
Response is generated&lt;br&gt;
    ↓&lt;br&gt;
Dealer hears the response&lt;/p&gt;

&lt;p&gt;Initially, I thought of voice as simply:&lt;/p&gt;

&lt;p&gt;Speech → Text → LLM → Text → Speech&lt;/p&gt;

&lt;p&gt;But once you start thinking about an actual conversation, latency becomes a huge deal.&lt;/p&gt;

&lt;p&gt;Imagine saying something to an AI and waiting 4–5 seconds for every response.&lt;/p&gt;

&lt;p&gt;Technically, it works.&lt;/p&gt;

&lt;p&gt;As a conversation?&lt;/p&gt;

&lt;p&gt;Not great.&lt;/p&gt;

&lt;p&gt;That's why I'm looking at real-time voice capabilities rather than treating the system like a normal chatbot with a microphone attached to it.&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;The AI Layer&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For the conversational intelligence, I'm using the OpenAI Realtime API.&lt;/p&gt;

&lt;p&gt;But here's something I realized pretty quickly:&lt;/p&gt;

&lt;p&gt;The LLM shouldn't be responsible for everything.&lt;/p&gt;

&lt;p&gt;For example, if a dealer says:&lt;/p&gt;

&lt;p&gt;"Give me 50 of the blue ones."&lt;/p&gt;

&lt;p&gt;The AI needs to understand what "blue ones" refers to.&lt;/p&gt;

&lt;p&gt;That requires conversation context.&lt;/p&gt;

&lt;p&gt;The system might have something like:&lt;/p&gt;

&lt;p&gt;Dealer:&lt;br&gt;
ABC Distributors&lt;/p&gt;

&lt;p&gt;Current conversation:&lt;br&gt;
Product: Product X&lt;br&gt;
Variant: Blue&lt;br&gt;
Requested quantity: 50&lt;/p&gt;

&lt;p&gt;Dealer preferences:&lt;br&gt;
Preferred warehouse: Pune&lt;br&gt;
Preferred language: English&lt;/p&gt;

&lt;p&gt;So the AI understands the conversation instead of treating every sentence as an isolated question.&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;LangGraph — Making the AI Actually Do Things&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is probably one of the parts I'm most interested in.&lt;/p&gt;

&lt;p&gt;I don't want the LLM to directly interact with my database and randomly decide what to do.&lt;/p&gt;

&lt;p&gt;Instead, I'm giving the agent specific tools.&lt;/p&gt;

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

&lt;p&gt;search_product()&lt;br&gt;
check_inventory()&lt;br&gt;
get_dealer_price()&lt;br&gt;
get_scheme()&lt;br&gt;
get_customer_history()&lt;br&gt;
create_draft_order()&lt;/p&gt;

&lt;p&gt;So a conversation could look something like:&lt;/p&gt;

&lt;p&gt;Dealer:&lt;br&gt;
"I need 50 units of Product X."&lt;/p&gt;

&lt;p&gt;AI:&lt;br&gt;
"Let me check the availability."&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;check_inventory("Product X")&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;Inventory:&lt;br&gt;
72 units available&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;AI:&lt;br&gt;
"We have 72 units available. Would you like me to create the order for 50?"&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;Dealer:&lt;br&gt;
"Yes."&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;create_draft_order(...)&lt;/p&gt;

&lt;p&gt;This is where LangGraph becomes useful.&lt;/p&gt;

&lt;p&gt;Instead of having one massive prompt trying to handle the entire business workflow, the agent can move through different states and use specific tools.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;/p&gt;

&lt;p&gt;START&lt;br&gt;
  ↓&lt;br&gt;
Understand Request&lt;br&gt;
  ↓&lt;br&gt;
Identify Product&lt;br&gt;
  ↓&lt;br&gt;
Check Inventory&lt;br&gt;
  ↓&lt;br&gt;
Check Dealer Pricing&lt;br&gt;
  ↓&lt;br&gt;
Apply Scheme&lt;br&gt;
  ↓&lt;br&gt;
Confirm Order&lt;br&gt;
  ↓&lt;br&gt;
Create Draft Order&lt;br&gt;
  ↓&lt;br&gt;
END&lt;/p&gt;

&lt;p&gt;This also makes debugging much easier.&lt;/p&gt;

&lt;p&gt;If something goes wrong, I can ask:&lt;/p&gt;

&lt;p&gt;Which step failed?&lt;/p&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;p&gt;Why did the AI randomly do that?&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;PostgreSQL — Where the Real Data Lives&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One thing I definitely don't want is for the AI to become the source of truth.&lt;/p&gt;

&lt;p&gt;The LLM can understand things.&lt;/p&gt;

&lt;p&gt;It can reason.&lt;/p&gt;

&lt;p&gt;It can communicate.&lt;/p&gt;

&lt;p&gt;But it shouldn't be the database.&lt;/p&gt;

&lt;p&gt;The system needs structured data for things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dealers&lt;/li&gt;
&lt;li&gt;Dealer contacts&lt;/li&gt;
&lt;li&gt;Dealer addresses&lt;/li&gt;
&lt;li&gt;Products&lt;/li&gt;
&lt;li&gt;Product variants&lt;/li&gt;
&lt;li&gt;SKUs&lt;/li&gt;
&lt;li&gt;Inventory&lt;/li&gt;
&lt;li&gt;Orders&lt;/li&gt;
&lt;li&gt;Pricing&lt;/li&gt;
&lt;li&gt;Schemes&lt;/li&gt;
&lt;li&gt;Customer preferences&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Dealer&lt;br&gt;
 ├── Contacts&lt;br&gt;
 ├── Addresses&lt;br&gt;
 ├── Credit Limit&lt;br&gt;
 ├── Language Preference&lt;br&gt;
 └── Preferred Warehouse&lt;/p&gt;

&lt;p&gt;Product&lt;br&gt;
 ├── Product Variant&lt;br&gt;
 ├── SKU&lt;br&gt;
 ├── Pricing&lt;br&gt;
 └── Inventory&lt;/p&gt;

&lt;p&gt;I'm using PostgreSQL for this persistent data.&lt;/p&gt;

&lt;p&gt;I'm also using UUIDs for primary keys and keeping things like timestamps, foreign keys, indexes, and soft-delete support in the domain design.&lt;/p&gt;

&lt;p&gt;I'm still refining the schema, but getting this foundation right is important because adding AI on top of a messy data model isn't going to magically fix it.&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;Redis — The Fast Stuff&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Not everything needs to be stored permanently in PostgreSQL.&lt;/p&gt;

&lt;p&gt;A voice conversation can have a lot of temporary state.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Current session&lt;/li&gt;
&lt;li&gt;Conversation state&lt;/li&gt;
&lt;li&gt;Temporary context&lt;/li&gt;
&lt;li&gt;Caching&lt;/li&gt;
&lt;li&gt;Rate limits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's where Redis comes in.&lt;/p&gt;

&lt;p&gt;The mental model I'm using is basically:&lt;/p&gt;

&lt;p&gt;PostgreSQL&lt;br&gt;
= Persistent business data&lt;/p&gt;

&lt;p&gt;Redis&lt;br&gt;
= Fast temporary state + caching&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;Inventory Is Where Things Get Real&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's say a dealer says:&lt;/p&gt;

&lt;p&gt;"I need 100 units."&lt;/p&gt;

&lt;p&gt;The AI can't just say:&lt;/p&gt;

&lt;p&gt;"Sure, I've placed the order."&lt;/p&gt;

&lt;p&gt;It needs to check what's actually available.&lt;/p&gt;

&lt;p&gt;Something like:&lt;/p&gt;

&lt;p&gt;Dealer Request&lt;br&gt;
      ↓&lt;br&gt;
Identify SKU&lt;br&gt;
      ↓&lt;br&gt;
Inventory Service&lt;br&gt;
      ↓&lt;br&gt;
Available Quantity&lt;br&gt;
      ↓&lt;br&gt;
AI Response&lt;/p&gt;

&lt;p&gt;If the system only has 60 units, the AI should say:&lt;/p&gt;

&lt;p&gt;"We currently have 60 units available. Would you like me to create the order for 60?"&lt;/p&gt;

&lt;p&gt;This is a principle I'm trying to stick to throughout the project:&lt;/p&gt;

&lt;p&gt;The AI should reason about business data, not invent business data.&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;Dealer-Specific Pricing&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is another place where a normal chatbot approach isn't enough.&lt;/p&gt;

&lt;p&gt;In B2B, everyone doesn't necessarily get the same price.&lt;/p&gt;

&lt;p&gt;Different dealers might have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Different price lists&lt;/li&gt;
&lt;li&gt;Different discounts&lt;/li&gt;
&lt;li&gt;Different schemes&lt;/li&gt;
&lt;li&gt;Different credit limits&lt;/li&gt;
&lt;li&gt;Different warehouses&lt;/li&gt;
&lt;li&gt;Different purchasing histories&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the flow could look like:&lt;/p&gt;

&lt;p&gt;Base Product Price&lt;br&gt;
        ↓&lt;br&gt;
Dealer-specific Price&lt;br&gt;
        ↓&lt;br&gt;
Applicable Scheme&lt;br&gt;
        ↓&lt;br&gt;
Discount&lt;br&gt;
        ↓&lt;br&gt;
Final Price&lt;/p&gt;

&lt;p&gt;But here's an important architectural decision:&lt;/p&gt;

&lt;p&gt;The LLM shouldn't calculate the final business-critical price itself.&lt;/p&gt;

&lt;p&gt;The backend should do that.&lt;/p&gt;

&lt;p&gt;The AI can explain the result to the dealer.&lt;/p&gt;

&lt;p&gt;The actual calculation should come from deterministic business logic.&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;Customer Memory&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is probably one of the coolest parts of the idea.&lt;/p&gt;

&lt;p&gt;A useful sales agent shouldn't feel like it has amnesia after every phone call.&lt;/p&gt;

&lt;p&gt;Suppose a dealer usually orders a particular product or prefers a particular warehouse.&lt;/p&gt;

&lt;p&gt;The system could remember useful information such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Preferred warehouse&lt;/li&gt;
&lt;li&gt;Preferred products&lt;/li&gt;
&lt;li&gt;Typical order quantity&lt;/li&gt;
&lt;li&gt;Preferred language&lt;/li&gt;
&lt;li&gt;Previous orders&lt;/li&gt;
&lt;li&gt;Communication preferences&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then a future conversation could be much smoother.&lt;/p&gt;

&lt;p&gt;Instead of asking:&lt;/p&gt;

&lt;p&gt;"Which warehouse do you want?"&lt;/p&gt;

&lt;p&gt;every single time, the system could already know the dealer's preferred warehouse and simply confirm it when needed.&lt;/p&gt;

&lt;p&gt;But there's an important distinction here.&lt;/p&gt;

&lt;p&gt;Not everything the dealer says should automatically become permanent memory.&lt;/p&gt;

&lt;p&gt;Memory needs rules.&lt;/p&gt;

&lt;p&gt;Some information is temporary conversation context.&lt;/p&gt;

&lt;p&gt;Some information is actual customer data.&lt;/p&gt;

&lt;p&gt;And some information probably shouldn't be stored at all.&lt;/p&gt;

&lt;p&gt;That's something I want to handle carefully as the project develops.&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;ERP Integration&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Eventually, the AI needs to connect with the systems that the business already uses.&lt;/p&gt;

&lt;p&gt;That's where ERP integration comes in.&lt;/p&gt;

&lt;p&gt;The architecture I'm aiming for is:&lt;/p&gt;

&lt;p&gt;AI Agent&lt;br&gt;
    ↓&lt;br&gt;
Backend&lt;br&gt;
    ↓&lt;br&gt;
Business Logic&lt;br&gt;
    ↓&lt;br&gt;
ERP APIs&lt;br&gt;
    ↓&lt;br&gt;
Orders / Inventory / Customers&lt;/p&gt;

&lt;p&gt;I don't want the AI agent directly modifying ERP data.&lt;/p&gt;

&lt;p&gt;Instead:&lt;/p&gt;

&lt;p&gt;AI&lt;br&gt;
 ↓&lt;br&gt;
Tool&lt;br&gt;
 ↓&lt;br&gt;
Backend Validation&lt;br&gt;
 ↓&lt;br&gt;
ERP&lt;/p&gt;

&lt;p&gt;That gives us a much safer boundary between the unpredictable nature of AI and the deterministic nature of enterprise systems.&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;Why I'm NOT Giving the LLM Direct Database Access&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is probably one of the biggest things I've learned while designing this.&lt;/p&gt;

&lt;p&gt;It can be tempting to just give an LLM database access and say:&lt;/p&gt;

&lt;p&gt;"Do whatever you need."&lt;/p&gt;

&lt;p&gt;But for a system dealing with real orders, pricing and customer information, that's a very bad idea.&lt;/p&gt;

&lt;p&gt;I'd rather have:&lt;/p&gt;

&lt;p&gt;❌ LLM → Database&lt;/p&gt;

&lt;p&gt;✅ LLM → Tool → Backend → Database&lt;/p&gt;

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

&lt;p&gt;LLM&lt;br&gt;
 ↓&lt;br&gt;
get_inventory("SKU123")&lt;br&gt;
 ↓&lt;br&gt;
Backend validates request&lt;br&gt;
 ↓&lt;br&gt;
Database query&lt;br&gt;
 ↓&lt;br&gt;
Structured result&lt;br&gt;
 ↓&lt;br&gt;
LLM&lt;/p&gt;

&lt;p&gt;Now I have a proper place for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication&lt;/li&gt;
&lt;li&gt;Authorization&lt;/li&gt;
&lt;li&gt;Validation&lt;/li&gt;
&lt;li&gt;Logging&lt;/li&gt;
&lt;li&gt;Security&lt;/li&gt;
&lt;li&gt;Error handling&lt;/li&gt;
&lt;li&gt;Auditing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And most importantly, I know exactly what the AI is allowed to do.&lt;/p&gt;




&lt;p&gt;The Tech Stack&lt;/p&gt;

&lt;p&gt;Frontend: Next.js&lt;/p&gt;

&lt;p&gt;Styling: Tailwind CSS + shadcn/ui&lt;/p&gt;

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

&lt;p&gt;Database: PostgreSQL&lt;/p&gt;

&lt;p&gt;Cache / State: Redis&lt;/p&gt;

&lt;p&gt;ORM: SQLAlchemy&lt;/p&gt;

&lt;p&gt;Migrations: Alembic&lt;/p&gt;

&lt;p&gt;Voice: Twilio&lt;/p&gt;

&lt;p&gt;Real-time AI: OpenAI Realtime API&lt;/p&gt;

&lt;p&gt;Agent Orchestration: LangGraph&lt;/p&gt;

&lt;p&gt;Vector Search: pgvector&lt;/p&gt;

&lt;p&gt;Version Control: Git + GitHub&lt;/p&gt;

&lt;p&gt;Monitoring: Sentry + OpenTelemetry&lt;/p&gt;

&lt;p&gt;I'm trying to avoid choosing technologies just because they're popular.&lt;/p&gt;

&lt;p&gt;I want every piece of the stack to have a reason for being there.&lt;/p&gt;




&lt;p&gt;What I'm Still Figuring Out&lt;/p&gt;

&lt;p&gt;The project is still a work in progress, so there are a lot of things I'm actively figuring out.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Voice latency&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A voice agent has to feel like a conversation.&lt;/p&gt;

&lt;p&gt;Even a technically correct answer feels bad if it takes too long.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Hallucinations&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The agent absolutely cannot randomly invent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Product availability&lt;/li&gt;
&lt;li&gt;Prices&lt;/li&gt;
&lt;li&gt;Discounts&lt;/li&gt;
&lt;li&gt;Order status&lt;/li&gt;
&lt;li&gt;Credit information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those things need to come from actual systems.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Conversation recovery&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What happens when the dealer says:&lt;/p&gt;

&lt;p&gt;"No, not that one. The other blue one."&lt;/p&gt;

&lt;p&gt;The agent needs enough context to understand what they're referring to.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tool failures&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What if the inventory service is down?&lt;/p&gt;

&lt;p&gt;The AI shouldn't pretend that everything worked.&lt;/p&gt;

&lt;p&gt;It needs to understand that the tool failed and communicate that properly.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Security&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once you're dealing with actual business transactions, security becomes a major part of the architecture.&lt;/p&gt;

&lt;p&gt;Things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication&lt;/li&gt;
&lt;li&gt;Authorization&lt;/li&gt;
&lt;li&gt;PII protection&lt;/li&gt;
&lt;li&gt;Call verification&lt;/li&gt;
&lt;li&gt;Audit logs&lt;/li&gt;
&lt;li&gt;Tool permissions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;can't just be an afterthought.&lt;/p&gt;




&lt;p&gt;The Biggest Thing I've Learned&lt;/p&gt;

&lt;p&gt;The biggest lesson from this project so far is:&lt;/p&gt;

&lt;p&gt;Building an AI application isn't the same as putting an LLM inside an application.&lt;/p&gt;

&lt;p&gt;The LLM is only one part of the system.&lt;/p&gt;

&lt;p&gt;A useful AI product needs:&lt;/p&gt;

&lt;p&gt;AI&lt;br&gt;
+&lt;br&gt;
Business Logic&lt;br&gt;
+&lt;br&gt;
Data&lt;br&gt;
+&lt;br&gt;
Tools&lt;br&gt;
+&lt;br&gt;
State&lt;br&gt;
+&lt;br&gt;
Security&lt;br&gt;
+&lt;br&gt;
Observability&lt;br&gt;
+&lt;br&gt;
Reliable Infrastructure&lt;/p&gt;

&lt;p&gt;The model provides the intelligence.&lt;/p&gt;

&lt;p&gt;But the architecture around it provides the reliability.&lt;/p&gt;

&lt;p&gt;And I think that's an important distinction, especially when moving from AI demos to actual products.&lt;/p&gt;




&lt;p&gt;What's Next?&lt;/p&gt;

&lt;p&gt;Right now, I'm focusing on building the foundation properly before trying to make everything "smart."&lt;/p&gt;

&lt;p&gt;The next things on my list are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building the core backend APIs&lt;/li&gt;
&lt;li&gt;Implementing the voice pipeline&lt;/li&gt;
&lt;li&gt;Connecting the agent to business tools&lt;/li&gt;
&lt;li&gt;Building the order workflow&lt;/li&gt;
&lt;li&gt;Adding customer memory&lt;/li&gt;
&lt;li&gt;Connecting inventory&lt;/li&gt;
&lt;li&gt;Designing ERP synchronization&lt;/li&gt;
&lt;li&gt;Adding observability&lt;/li&gt;
&lt;li&gt;Testing real-world conversations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The end goal is pretty simple:&lt;/p&gt;

&lt;p&gt;A dealer should be able to pick up a phone and complete a business transaction through a natural conversation.&lt;/p&gt;

&lt;p&gt;Something like:&lt;/p&gt;

&lt;p&gt;Call&lt;br&gt;
 ↓&lt;br&gt;
Talk&lt;br&gt;
 ↓&lt;br&gt;
Confirm&lt;br&gt;
 ↓&lt;br&gt;
Order&lt;/p&gt;

&lt;p&gt;That's the experience I'm trying to build.&lt;/p&gt;




&lt;p&gt;Final Thoughts&lt;/p&gt;

&lt;p&gt;This project has also changed the way I think about software engineering.&lt;/p&gt;

&lt;p&gt;Earlier, I mostly thought about applications as:&lt;/p&gt;

&lt;p&gt;Frontend&lt;br&gt;
+&lt;br&gt;
Backend&lt;br&gt;
+&lt;br&gt;
Database&lt;/p&gt;

&lt;p&gt;Now I'm asking a lot more questions:&lt;/p&gt;

&lt;p&gt;What should the AI be allowed to decide?&lt;/p&gt;

&lt;p&gt;What should the backend decide?&lt;/p&gt;

&lt;p&gt;Where does the actual source of truth live?&lt;/p&gt;

&lt;p&gt;What happens when the AI is wrong?&lt;/p&gt;

&lt;p&gt;What happens when a tool fails?&lt;/p&gt;

&lt;p&gt;How do we recover from a misunderstood request?&lt;/p&gt;

&lt;p&gt;How do we make the whole thing observable?&lt;/p&gt;

&lt;p&gt;And honestly, I'm still figuring out many of these answers.&lt;/p&gt;

&lt;p&gt;That's probably my favorite part of building this.&lt;/p&gt;

&lt;p&gt;I'm not trying to pretend I have the perfect architecture figured out.&lt;/p&gt;

&lt;p&gt;I'm building it, breaking things, learning, and improving it as I go.&lt;/p&gt;

&lt;p&gt;Build → Break → Learn → Improve.&lt;/p&gt;

&lt;p&gt;If you're also building AI agents, voice applications, or AI-powered SaaS products, I'd love to hear what you're working on and what problems you've run into.&lt;/p&gt;

&lt;p&gt;Let's learn from each other. 🚀&lt;/p&gt;

</description>
      <category>ai</category>
      <category>voiceai</category>
      <category>systemdesign</category>
      <category>softwaredevelopment</category>
    </item>
  </channel>
</rss>
