<?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: Mehmooda Mohiuddin</title>
    <description>The latest articles on DEV Community by Mehmooda Mohiuddin (@mehmooda_mohiuddin_3).</description>
    <link>https://dev.to/mehmooda_mohiuddin_3</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%2F4147318%2Fc2183e13-23c4-4d25-ae26-f7af5bb236be.jpg</url>
      <title>DEV Community: Mehmooda Mohiuddin</title>
      <link>https://dev.to/mehmooda_mohiuddin_3</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mehmooda_mohiuddin_3"/>
    <language>en</language>
    <item>
      <title>How I built a Customer Care AI Agent that actually remembers your problem</title>
      <dc:creator>Mehmooda Mohiuddin</dc:creator>
      <pubDate>Tue, 29 Sep 2026 02:41:31 +0000</pubDate>
      <link>https://dev.to/mehmooda_mohiuddin_3/how-i-built-a-customer-care-ai-agent-that-actually-remembers-your-problem-4ljg</link>
      <guid>https://dev.to/mehmooda_mohiuddin_3/how-i-built-a-customer-care-ai-agent-that-actually-remembers-your-problem-4ljg</guid>
      <description>&lt;p&gt;Most customer-support systems remember the conversation.&lt;/p&gt;

&lt;p&gt;That isn't necessarily enough.&lt;/p&gt;

&lt;p&gt;If a customer comes back with the same problem a week later, the useful question isn't just “What did we talk about last time?” It is “What did we actually try, and what happened when we tried it?”&lt;/p&gt;

&lt;p&gt;That distinction became the foundation for Relay, a memory-powered customer-support agent that remembers previous troubleshooting attempts and their outcomes.&lt;/p&gt;

&lt;p&gt;Instead of treating every conversation as a fresh start, Relay builds a history of the case and uses that history when deciding what to do next.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The problem with starting from zero&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Imagine a customer contacting support because their Wi-Fi keeps disconnecting.&lt;/p&gt;

&lt;p&gt;The support agent suggests restarting the router.&lt;/p&gt;

&lt;p&gt;It works.&lt;/p&gt;

&lt;p&gt;For about twenty minutes.&lt;/p&gt;

&lt;p&gt;The customer contacts support again.&lt;/p&gt;

&lt;p&gt;A normal conversational agent might see the previous messages and still suggest restarting the router because it is a common troubleshooting step.&lt;/p&gt;

&lt;p&gt;But from the customer's perspective, that is frustrating.&lt;/p&gt;

&lt;p&gt;They already tried it.&lt;/p&gt;

&lt;p&gt;What matters is not simply that “restart the router” appeared in the conversation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What matters is that:&lt;/strong&gt;&lt;br&gt;
Restarting the router was already tried, and the result was temporary.&lt;/p&gt;

&lt;p&gt;Later, perhaps a driver update fixes the problem completely.&lt;/p&gt;

&lt;p&gt;Now Relay has something much more useful than a transcript.&lt;/p&gt;

&lt;p&gt;It has a case history:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Problem:
Wi-Fi disconnecting

Attempt 1:
Restart router
→ Temporary improvement

Attempt 2:
Update network driver
→ Problem resolved
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The next time a similar problem appears, Relay can use that history.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Relay remembers the case, not just the conversation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That became the core idea behind Relay.&lt;/p&gt;

&lt;p&gt;Instead of thinking about memory as simply storing previous messages, we wanted memory to influence what the agent does next.&lt;/p&gt;

&lt;p&gt;The basic workflow looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Customer
   ↓
Relay
   ↓
Recall relevant case history
   ↓
Reason about previous outcomes
   ↓
Choose next troubleshooting step
   ↓
Customer responds
   ↓
Store the new outcome
   ↓
Relay learns from the interaction
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important part is the loop.&lt;/p&gt;

&lt;p&gt;A conversation doesn't simply end after the response.&lt;/p&gt;

&lt;p&gt;Its outcome becomes useful information for future interactions.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;&lt;em&gt;Why Hindsight?&lt;/em&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;We used Hindsight as Relay's memory layer.&lt;/p&gt;

&lt;p&gt;Hindsight provides the mechanisms we need to retain information, recall relevant memories, and reason over those memories.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/vectorize-io/hindsight" rel="noopener noreferrer"&gt;Hindsight GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hindsight.vectorize.io/" rel="noopener noreferrer"&gt;Hindsight Documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For Relay, this means we can separate the support agent's conversational logic from its long-term memory.&lt;/p&gt;

&lt;p&gt;When something important happens during a support interaction, Relay can retain it.&lt;/p&gt;

&lt;p&gt;When another relevant problem appears later, Relay can recall information from previous interactions.&lt;/p&gt;

&lt;p&gt;The important thing is that the retrieved information isn't just displayed to the user.&lt;/p&gt;

&lt;p&gt;It influences the next decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;&lt;em&gt;Retaining outcomes is more useful than retaining transcripts&lt;/em&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;One design decision we kept coming back to was what Relay should actually remember.&lt;/p&gt;

&lt;p&gt;A transcript contains everything:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;Customer:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;My&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Wi-Fi&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;keeps&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;disconnecting.&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;Agent:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;restarting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;your&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;router.&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;Customer:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Okay,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;it&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;works&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;now.&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;Agent:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Great!&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But a future support interaction doesn't necessarily need the entire conversation.&lt;/p&gt;

&lt;p&gt;It needs the useful facts extracted from it.&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;Issue: Wi-Fi disconnecting

Attempt:
Router restart

Outcome:
Temporary improvement
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That distinction is important because troubleshooting is fundamentally about experiments.&lt;/p&gt;

&lt;p&gt;You try something.&lt;/p&gt;

&lt;p&gt;You observe the result.&lt;/p&gt;

&lt;p&gt;Then you decide what to try next.&lt;/p&gt;

&lt;p&gt;Relay's memory therefore needs to preserve those outcomes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The second interaction is where memory matters&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The first interaction demonstrates that Relay can create memory.&lt;/p&gt;

&lt;p&gt;The second interaction demonstrates why that memory exists.&lt;/p&gt;

&lt;p&gt;Suppose the same customer returns later.&lt;/p&gt;

&lt;p&gt;Instead of treating the problem as completely new, Relay can retrieve the previous case.&lt;/p&gt;

&lt;p&gt;It can see that restarting the router had already been attempted and only helped temporarily.&lt;/p&gt;

&lt;p&gt;It can also see that another solution previously resolved the issue.&lt;br&gt;
That changes the response.&lt;/p&gt;

&lt;p&gt;The agent doesn't have to blindly start from the beginning.&lt;/p&gt;

&lt;p&gt;It can build on what happened before.&lt;/p&gt;

&lt;p&gt;This is the behavior we wanted to demonstrate with Hindsight: memory changing the agent's behavior over time.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;&lt;em&gt;The troubleshooting loop&lt;/em&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Relay's reasoning can be thought of as a continuous loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;New problem
     ↓
Recall relevant history
     ↓
Understand previous attempts
     ↓
Choose next action
     ↓
Observe outcome
     ↓
Retain outcome
     ↓
Problem solved?
   ↙       ↘
 Yes        No
 ↓           ↓
Remember    Continue
success     reasoning
             ↓
       Useful options left?
          ↙       ↘
        Yes        No
        ↓           ↓
      Retry      Escalate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is particularly useful for support because failure itself is information.&lt;/p&gt;

&lt;p&gt;A failed troubleshooting step shouldn't disappear.&lt;/p&gt;

&lt;p&gt;It should help constrain what the agent tries next.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;&lt;em&gt;When AI should stop troubleshooting&lt;/em&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Another part of Relay is knowing when continued automated troubleshooting may no longer be useful.&lt;/p&gt;

&lt;p&gt;If relevant troubleshooting attempts have already been exhausted, Relay can recommend escalating the issue to a technician rather than continuing to repeat generic suggestions.&lt;/p&gt;

&lt;p&gt;The important part is that escalation is based on the history of the case.&lt;/p&gt;

&lt;p&gt;It isn't simply:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“The first solution didn't work, so contact a technician.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead, the agent considers what has already been attempted and whether useful options remain.&lt;/p&gt;

&lt;p&gt;That makes escalation part of the memory loop as well.&lt;/p&gt;

&lt;p&gt;The outcome can itself become part of the case history.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What changed after adding memory?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Without persistent case memory, an agent tends to behave like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Problem
↓
Suggest solution
↓
Conversation ends
↓
New conversation
↓
Problem looks new
↓
Suggest common solution again
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With memory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Problem
↓
Suggest solution
↓
Observe outcome
↓
Remember outcome
↓
New conversation
↓
Recall previous case
↓
Avoid previous unsuccessful/temporary step
↓
Choose a more informed next action
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That difference is the actual reason Relay needs memory.&lt;/p&gt;

&lt;p&gt;The goal isn't to make the chatbot remember more messages.&lt;/p&gt;

&lt;p&gt;The goal is to make the agent make better-informed decisions because it remembers what happened before.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;&lt;em&gt;What I learned building Relay&lt;/em&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Memory needs a purpose&lt;/strong&gt;&lt;br&gt;
Adding a memory system simply because an application is an AI agent isn't enough.&lt;/p&gt;

&lt;p&gt;We needed to answer:&lt;br&gt;
What changes because the agent remembers?&lt;br&gt;
For Relay, the answer is troubleshooting decisions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Failed attempts are valuable data&lt;/strong&gt;&lt;br&gt;
In a support workflow, failure isn't useless information.&lt;/p&gt;

&lt;p&gt;If a solution has already been tried and didn't solve the problem, that should affect the next action.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The second interaction is more important than the first&lt;/strong&gt;&lt;br&gt;
The first interaction proves that information can be stored.&lt;/p&gt;

&lt;p&gt;The later interaction proves that the stored information actually matters.&lt;/p&gt;

&lt;p&gt;That's where the value of agent memory becomes visible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Memory should connect to outcomes&lt;/strong&gt;&lt;br&gt;
Remembering that a customer said something is less useful than remembering what happened after an action.&lt;/p&gt;

&lt;p&gt;For troubleshooting, the outcome is often the most important part.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;&lt;em&gt;What Relay is really trying to solve&lt;/em&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Customer support shouldn't have to rediscover the same problem every time a customer returns.&lt;/p&gt;

&lt;p&gt;A support agent should be able to build on previous attempts instead of repeatedly starting from zero.&lt;/p&gt;

&lt;p&gt;That's the idea behind Relay.&lt;/p&gt;

&lt;p&gt;Relay remembers the case, not just the conversation.&lt;/p&gt;

&lt;p&gt;And with Hindsight providing persistent agent memory, the support agent can use previous experiences to inform what it does next.&lt;/p&gt;

&lt;p&gt;Learn more about agent memory from Vectorize&lt;br&gt;
&lt;a href="https://vectorize.io/what-is-agent-memory" rel="noopener noreferrer"&gt;https://vectorize.io/what-is-agent-memory&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff1mwa7u646nh4s815rtp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff1mwa7u646nh4s815rtp.png" alt="Relay" width="799" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmoe5fr8xwdrqmude2d6r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmoe5fr8xwdrqmude2d6r.png" alt="Relay" width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F95d46cy4tmuaqmw2740j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F95d46cy4tmuaqmw2740j.png" alt="Relay" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3ocknzbtalk5medcylet.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3ocknzbtalk5medcylet.png" alt="Relay" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1ot0z2tufscrf2v7feie.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1ot0z2tufscrf2v7feie.png" alt="Relay" width="800" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpyc8h3h2zyn4el36eq4b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpyc8h3h2zyn4el36eq4b.png" alt="Relay" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
