<?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: Harika Karankot</title>
    <description>The latest articles on DEV Community by Harika Karankot (@harika_karankot_3607998cb).</description>
    <link>https://dev.to/harika_karankot_3607998cb</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%2F4149498%2Fb7b582c6-3a45-443b-9a39-e5ae14f0f182.png</url>
      <title>DEV Community: Harika Karankot</title>
      <link>https://dev.to/harika_karankot_3607998cb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/harika_karankot_3607998cb"/>
    <language>en</language>
    <item>
      <title>I Built an AI Agent That Remembers Why Teams Decided</title>
      <dc:creator>Harika Karankot</dc:creator>
      <pubDate>Tue, 29 Sep 2026 12:00:20 +0000</pubDate>
      <link>https://dev.to/harika_karankot_3607998cb/i-built-an-ai-agent-that-remembers-why-teams-decided-3jke</link>
      <guid>https://dev.to/harika_karankot_3607998cb/i-built-an-ai-agent-that-remembers-why-teams-decided-3jke</guid>
      <description>&lt;p&gt;AI agents are good at answering questions, but one problem became obvious while building my project: answering a question today is not enough if the agent cannot remember why a decision was made yesterday.&lt;/p&gt;

&lt;p&gt;That led me to build DECISIA — an AI Decision Continuity Agent designed to preserve the reasoning behind meetings, decisions, preferences, responsibilities, deadlines, and commitments.&lt;/p&gt;

&lt;p&gt;The central idea is simple:&lt;/p&gt;

&lt;p&gt;A conversation should not disappear after the meeting ends.&lt;/p&gt;

&lt;p&gt;Instead, important information should become persistent memory that an AI agent can recall when the same topic comes up later.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem I Wanted to Solve
&lt;/h2&gt;

&lt;p&gt;In team projects, decisions are often distributed across meetings, chats, documents, and follow-up conversations.&lt;/p&gt;

&lt;p&gt;For example, imagine a team discussing a website interface.&lt;/p&gt;

&lt;p&gt;During one meeting, the client says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"We want a clean light-blue and white interface. Please don't use a dark theme."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A few days later, someone asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What interface did the client prefer?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A normal chatbot may only know what is present in its current conversation.&lt;/p&gt;

&lt;p&gt;That creates a continuity problem.&lt;/p&gt;

&lt;p&gt;The important information existed, but the agent could not necessarily retrieve it when needed.&lt;/p&gt;

&lt;p&gt;I wanted DECISIA to solve this by giving the agent persistent memory.&lt;/p&gt;

&lt;p&gt;The architecture became:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User → Conversation → DECISIA → Hindsight RETAIN → Persistent Memory → Hindsight RECALL → Relevant Memories → AI Answer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The memory layer became the most important part of the system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Hindsight Became Important
&lt;/h2&gt;

&lt;p&gt;For DECISIA, I used Hindsight as the persistent memory layer.&lt;/p&gt;

&lt;p&gt;Instead of treating every conversation as an isolated interaction, DECISIA stores information from conversations and later retrieves relevant memories when a user asks a question.&lt;/p&gt;

&lt;p&gt;The two operations that matter most are &lt;strong&gt;RETAIN&lt;/strong&gt; and &lt;strong&gt;RECALL&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;RETAIN stores information:&lt;/p&gt;

&lt;p&gt;def recall_memory(query: str):&lt;br&gt;
    url = f"{HINDSIGHT_URL}/v1/default/banks/{BANK_ID}/memories/recall"&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;payload = {
    "query": query
}

response = httpx.post(
    url,
    json=payload,
    timeout=120
)

response.raise_for_status()

return response.json()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This changed the behavior of the application.&lt;/p&gt;

&lt;p&gt;Instead of asking the LLM to remember everything itself, I created a separate memory layer that DECISIA could query when context was needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Building the Decision Intelligence Layer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Persistent memory alone was not enough.&lt;/p&gt;

&lt;p&gt;I also wanted DECISIA to understand what was important inside a conversation.&lt;/p&gt;

&lt;p&gt;So I added an extraction layer using an LLM.&lt;/p&gt;

&lt;p&gt;The system extracts five categories:&lt;/p&gt;

&lt;p&gt;Decisions&lt;br&gt;
Preferences&lt;br&gt;
Responsibilities&lt;br&gt;
Deadlines&lt;br&gt;
Commitments&lt;/p&gt;

&lt;p&gt;For example, from a conversation such as:&lt;br&gt;
"Sarah will prepare the UI prototype by October 2. The client wants a clean light interface and rejected the dark theme."&lt;/p&gt;

&lt;p&gt;DECISIA can extract information such as:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "decisions": [&lt;br&gt;
    "Use a clean light interface"&lt;br&gt;
  ],&lt;br&gt;
  "preferences": [&lt;br&gt;
    "Client prefers a light-blue and white interface",&lt;br&gt;
    "Client rejected the dark theme"&lt;br&gt;
  ],&lt;br&gt;
  "responsibilities": [&lt;br&gt;
    "Sarah will prepare the UI prototype"&lt;br&gt;
  ],&lt;br&gt;
  "deadlines": [&lt;br&gt;
    "October 2, 2026"&lt;br&gt;
  ],&lt;br&gt;
  "commitments": [&lt;br&gt;
    "Sarah will prepare the UI prototype"&lt;br&gt;
  ]&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;This structured information is stored separately so the application can maintain a decision-oriented history.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Connecting Memory With Reasoning&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The interesting part happens when the user asks a question later.&lt;/p&gt;

&lt;p&gt;DECISIA first sends the question to Hindsight.&lt;/p&gt;

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

&lt;p&gt;"What did the client prefer for the interface?"&lt;/p&gt;

&lt;p&gt;Hindsight retrieves relevant memories.&lt;/p&gt;

&lt;p&gt;The application then passes the strongest relevant memories to the language model:&lt;br&gt;
answer = generate_contextual_answer(&lt;br&gt;
    question=request.query,&lt;br&gt;
    memories=focused_memories&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;The model is instructed to answer using those retrieved memories rather than inventing information.&lt;/p&gt;

&lt;p&gt;This creates a simple but important pattern:&lt;br&gt;
&lt;strong&gt;Question → Recall → Evidence → Reasoning → Answer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The answer is therefore based on previous project context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before and After Persistent Memory&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;he difference becomes much clearer with a simple example.&lt;/p&gt;

&lt;p&gt;Without Persistent Memory&lt;/p&gt;

&lt;p&gt;User:&lt;/p&gt;

&lt;p&gt;"What interface did the client prefer?"&lt;/p&gt;

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

&lt;p&gt;"I don't have enough information to determine the client's interface preference."&lt;/p&gt;

&lt;p&gt;After Storing the Conversation&lt;/p&gt;

&lt;p&gt;User:&lt;/p&gt;

&lt;p&gt;"What interface did the client prefer?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DECISIA:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;"The client wants a clean, light interface—specifically a light-blue and white color scheme—and has rejected any dark theme."&lt;br&gt;
The important change is not simply that the second answer is longer.&lt;br&gt;
The important change is that the agent can use information from a previous interaction.&lt;br&gt;
That is what decision continuity means in DECISIA.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Handling Retrieved Memories&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One challenge I encountered was that semantic memory retrieval can return multiple memories describing the same underlying fact.&lt;/p&gt;

&lt;p&gt;For example, a single preference may appear in several retrieved memories with slightly different wording.&lt;/p&gt;

&lt;p&gt;Displaying all of them would make the interface noisy.&lt;/p&gt;

&lt;p&gt;I therefore added a filtering layer that removes exact duplicate memory text before selecting the strongest evidence.&lt;/p&gt;

&lt;p&gt;unique_memories = []&lt;br&gt;
seen_memory_text = set()&lt;/p&gt;

&lt;p&gt;for memory in memories:&lt;br&gt;
    memory_text = (&lt;br&gt;
        memory.get("text")&lt;br&gt;
        or memory.get("content")&lt;br&gt;
        or ""&lt;br&gt;
    ).strip()&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;normalized_text = " ".join(
    memory_text.lower().split()
)

if normalized_text in seen_memory_text:
    continue

seen_memory_text.add(normalized_text)
unique_memories.append(memory)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;DECISIA then uses a focused set of memories as evidence for the final answer.&lt;/p&gt;

&lt;p&gt;This also makes the user interface easier to understand because users can see that the answer came from retrieved project context without being overwhelmed by every stored memory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Technology Stack&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The project uses several components working together:&lt;/p&gt;

&lt;p&gt;React + Vite for the frontend&lt;br&gt;
FastAPI for the backend API&lt;br&gt;
Python for the backend logic&lt;br&gt;
Groq for language-model reasoning&lt;br&gt;
Hindsight for persistent memory&lt;br&gt;
Supabase for structured decision intelligence&lt;br&gt;
GitHub for source-code management&lt;/p&gt;

&lt;p&gt;The frontend communicates with the FastAPI backend, while the backend coordinates the LLM, Hindsight, and Supabase.&lt;/p&gt;

&lt;p&gt;The most important architectural decision was keeping persistent memory as a separate layer instead of treating the LLM's conversation context as the application's memory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I Learned&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. AI Memory Is Different From Conversation History&lt;/strong&gt;&lt;br&gt;
Saving a conversation is not the same as making an agent capable of using previous experience.&lt;br&gt;
The useful part is retrieving relevant information at the right time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Memory Needs Evidence&lt;/strong&gt;&lt;br&gt;
An AI answer becomes more useful when the system can connect it to previously stored context.&lt;br&gt;
DECISIA therefore retrieves memories before generating its contextual answer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. More Memories Are Not Always Better&lt;/strong&gt;&lt;br&gt;
Retrieval can produce several memories representing similar information.&lt;br&gt;
A useful memory system therefore also needs filtering and evidence selection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Structured Information and Semantic Memory Complement Each Other&lt;/strong&gt;&lt;br&gt;
Hindsight provides the persistent memory layer, while the decision extraction layer organizes important information into decisions, preferences, responsibilities, deadlines, and commitments.&lt;br&gt;
Using both gives DECISIA two different ways to understand project history.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. The Real Value Appears Across Interactions&lt;/strong&gt;&lt;br&gt;
The most interesting behavior did not happen when DECISIA answered the first question.&lt;br&gt;
It appeared when information from an earlier conversation became useful in a later interaction.&lt;br&gt;
That is where persistent memory changed the behavior of the agent.&lt;br&gt;
**&lt;br&gt;
What DECISIA Is Becoming**&lt;/p&gt;

&lt;p&gt;My goal with DECISIA is not to build another chatbot that simply answers questions.&lt;/p&gt;

&lt;p&gt;I want it to act as a continuity layer for teams.&lt;/p&gt;

&lt;p&gt;A team should be able to ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What did we decide?&lt;/li&gt;
&lt;li&gt;What did the client reject?&lt;/li&gt;
&lt;li&gt;Who was responsible for that task?&lt;/li&gt;
&lt;li&gt;When was it supposed to be completed?&lt;/li&gt;
&lt;li&gt;Did our latest decision conflict with something we decided earlier?
The agent should be able to retrieve the relevant history and help the team continue from where it left off.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the idea behind DECISIA:&lt;br&gt;
Never lose the reasoning behind a decision.&lt;/p&gt;

&lt;p&gt;Persistent memory turns past conversations into usable context, and that context gives an AI agent the ability to maintain continuity across interactions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Project&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;DECISIA — AI Decision Continuity Agent&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/Harika255/DECISIA" rel="noopener noreferrer"&gt;https://github.com/Harika255/DECISIA&lt;/a&gt;&lt;/p&gt;

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

</description>
      <category>ai</category>
      <category>agents</category>
      <category>python</category>
      <category>react</category>
    </item>
  </channel>
</rss>
