<?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: Sinchana Nagaraj</title>
    <description>The latest articles on DEV Community by Sinchana Nagaraj (@sinchana_nagaraj).</description>
    <link>https://dev.to/sinchana_nagaraj</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3838307%2F58f2c3ce-e671-4f97-8fcc-4786bb7a0d87.png</url>
      <title>DEV Community: Sinchana Nagaraj</title>
      <link>https://dev.to/sinchana_nagaraj</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sinchana_nagaraj"/>
    <language>en</language>
    <item>
      <title>Our AI PM Remembered Task Owners Without Being Told Twice</title>
      <dc:creator>Sinchana Nagaraj</dc:creator>
      <pubDate>Sun, 22 Mar 2026 12:01:20 +0000</pubDate>
      <link>https://dev.to/sinchana_nagaraj/our-ai-pm-remembered-task-owners-without-being-told-twice-1dcn</link>
      <guid>https://dev.to/sinchana_nagaraj/our-ai-pm-remembered-task-owners-without-being-told-twice-1dcn</guid>
      <description>&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.amazonaws.com%2Fuploads%2Farticles%2Fjoog8iuim2jw6lx1m6dy.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.amazonaws.com%2Fuploads%2Farticles%2Fjoog8iuim2jw6lx1m6dy.png" alt=" " width="800" height="376"&gt;&lt;/a&gt;&lt;br&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.amazonaws.com%2Fuploads%2Farticles%2Ftm5ke35roii47lz4z1ux.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.amazonaws.com%2Fuploads%2Farticles%2Ftm5ke35roii47lz4z1ux.png" alt=" " width="800" height="376"&gt;&lt;/a&gt;&lt;br&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.amazonaws.com%2Fuploads%2Farticles%2F35019hclle2dp6kvymbd.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.amazonaws.com%2Fuploads%2Farticles%2F35019hclle2dp6kvymbd.png" alt=" " width="800" height="376"&gt;&lt;/a&gt;"Wait — it actually remembered that?" Keerthana stared at the screen as our agent recalled a task assignment from a session we'd closed an hour ago, without us mentioning it once.&lt;/p&gt;

&lt;p&gt;That moment was the whole point of what we built. And honestly, we didn't fully expect it to work that cleanly.&lt;/p&gt;
&lt;h2&gt;
  
  
  What We Built
&lt;/h2&gt;

&lt;p&gt;Over 8 hours, our three-person team — Sinchana Nagaraj, Keerthana N, and P Sahana — built an AI Group Project Manager powered by &lt;a href="https://vectorize.io/features/agent-memory" rel="noopener noreferrer"&gt;Hindsight agent memory&lt;/a&gt; and Groq's LLM. The idea was simple: most AI agents are amnesiac. Every new session, they start from zero. For a group project tool, that's a dealbreaker. You don't want to re-explain who owns what every time you open a chat.&lt;/p&gt;

&lt;p&gt;So we built something that remembers.&lt;/p&gt;

&lt;p&gt;The stack is straightforward: a FastAPI backend, a browser-based chat UI, Groq's &lt;code&gt;llama-3.3-70b-versatile&lt;/code&gt; for the LLM, and &lt;a href="https://github.com/vectorize-io/hindsight" rel="noopener noreferrer"&gt;Hindsight&lt;/a&gt; as the memory layer. The agent can assign tasks, log team decisions, summarise workloads, and answer questions about project status — all grounded in memory it has accumulated across previous sessions.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Core Loop
&lt;/h2&gt;

&lt;p&gt;The architecture has two moving parts: &lt;code&gt;agent.py&lt;/code&gt; handles all Hindsight and LLM logic, and &lt;code&gt;main.py&lt;/code&gt; exposes FastAPI routes that the chat UI calls.&lt;/p&gt;

&lt;p&gt;Every meaningful interaction goes through the same loop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Recall&lt;/strong&gt; relevant memories from Hindsight before calling the LLM&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inject&lt;/strong&gt; those memories as context into the system prompt&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Call&lt;/strong&gt; the LLM with that context&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retain&lt;/strong&gt; the interaction back into Hindsight for future recall&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here's what that looks like for a chat message:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Step 1: recall relevant memories
&lt;/span&gt;    &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_recall_context&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Step 2: inject into system prompt
&lt;/span&gt;    &lt;span class="n"&gt;system&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;You are an AI Group Project Manager.
Team members: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TEAM_MEMBERS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.

Project memory recalled from Hindsight:
&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;

Use this memory to give accurate, personalised answers.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="c1"&gt;# Step 3: call LLM
&lt;/span&gt;    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_llm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; asks: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Step 4: retain this interaction
&lt;/span&gt;    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_retain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Chat from &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; — Agent replied: &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;chat&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;_recall_context&lt;/code&gt; method calls Hindsight's &lt;code&gt;arecall()&lt;/code&gt; with the user's message as the query. Hindsight runs four search strategies in parallel — semantic, keyword, graph, and temporal — and returns the most relevant memories. Those memories become the LLM's context window for that turn.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Actually Store
&lt;/h2&gt;

&lt;p&gt;We retain three categories of memory, each with a descriptive &lt;code&gt;context&lt;/code&gt; label:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Task assignments:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_retain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Task assigned to &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;assigned_to&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;. &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Deadline: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;deadline&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;. Status: PENDING. &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Assigned on: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;utcnow&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;%Y-%m-%d&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;task assignment&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Team decisions:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_retain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Team decision by &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;made_by&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; on &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;decision&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;team decision&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Chat history:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_retain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Chat from &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; — Agent replied: &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;chat&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;context&lt;/code&gt; label matters more than we initially thought. Hindsight uses it during fact extraction to shape how memories are interpreted. A decision logged as &lt;code&gt;"team decision"&lt;/code&gt; is retrieved differently from a task logged as &lt;code&gt;"task assignment"&lt;/code&gt; — even if the raw text is similar. This was one of those things that wasn't obvious until we tested it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Memory Bank
&lt;/h2&gt;

&lt;p&gt;Hindsight organises memories into &lt;strong&gt;banks&lt;/strong&gt;, identified by a &lt;code&gt;bank_id&lt;/code&gt; string you choose. There's no setup required — just pick a name and start calling &lt;code&gt;retain()&lt;/code&gt; and &lt;code&gt;recall()&lt;/code&gt; against it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Hindsight&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;HINDSIGHT_BASE_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;HINDSIGHT_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Anywhere in the agent:
&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;aretain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bank_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;group-project-manager&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;arecall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bank_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;group-project-manager&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The bank persists on Hindsight's side. Which means when you restart your server — or open a new session the next day — the memories are still there. That's the key property that made Keerthana's "wait, it actually remembered" moment possible.&lt;/p&gt;

&lt;p&gt;We used &lt;a href="https://hindsight.vectorize.io/" rel="noopener noreferrer"&gt;Hindsight Cloud&lt;/a&gt; to get a hosted instance quickly, which meant zero infrastructure setup. The API key goes in &lt;code&gt;.env&lt;/code&gt; and the bank just works.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Surprised Us
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The context label is doing real work.&lt;/strong&gt; We initially stored everything with a generic context and noticed the recall quality was flatter. Once we split task assignments, decisions, and chat into separate context labels, the agent started pulling the right memories for the right queries much more reliably.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recall quality scales with what you retain.&lt;/strong&gt; The first session feels underwhelming — the agent has almost nothing to work with. By the third session, after you've assigned several tasks and logged a few decisions, the project status summary becomes genuinely useful. It references specific people, specific deadlines, and flags things that are still pending. The agent gets smarter as the bank grows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The async SDK methods matter.&lt;/strong&gt; We're running inside FastAPI's async event loop, so we used &lt;code&gt;aretain()&lt;/code&gt; and &lt;code&gt;arecall()&lt;/code&gt; throughout. If you mix sync calls into an async context carelessly, you'll get subtle blocking issues that are annoying to debug. Use the async methods from the start.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The LLM still needs guardrails.&lt;/strong&gt; Hindsight gives the agent memory, but it doesn't make the LLM more disciplined. We found early on that without explicit instructions to reference memory in the system prompt, the model would sometimes ignore the recalled context entirely and just make things up. The system prompt needs to actively tell the model to use what it's been given.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Demo Moment
&lt;/h2&gt;

&lt;p&gt;The most satisfying test was this sequence:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start the server fresh&lt;/li&gt;
&lt;li&gt;Assign "Build the frontend UI" to Sinchana, due the next day&lt;/li&gt;
&lt;li&gt;Assign "Set up API routes" to Keerthana, due the next day&lt;/li&gt;
&lt;li&gt;Log a decision: "We will use React for the frontend" — by Sahana&lt;/li&gt;
&lt;li&gt;Stop the server completely&lt;/li&gt;
&lt;li&gt;Restart the server&lt;/li&gt;
&lt;li&gt;Type: &lt;em&gt;"What tasks are pending?"&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The agent replied with both tasks, the correct owners, and the correct deadlines. It also mentioned the React decision in the context of Sinchana's frontend work — a connection we hadn't explicitly asked it to make.&lt;/p&gt;

&lt;p&gt;That's &lt;a href="https://hindsight.vectorize.io/" rel="noopener noreferrer"&gt;Hindsight's observation consolidation&lt;/a&gt; doing its job: it doesn't just store raw facts, it synthesises relationships between them. The agent knew that a React decision was relevant to a frontend task because Hindsight had connected those pieces.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons for Your Next Agent
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Retain early, retain often.&lt;/strong&gt; Every meaningful interaction should go into memory. Storage is cheap; missing context is expensive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use descriptive context labels.&lt;/strong&gt; The &lt;code&gt;context&lt;/code&gt; parameter shapes how Hindsight extracts facts. Be specific: &lt;code&gt;"task assignment"&lt;/code&gt; beats &lt;code&gt;"data"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recall before every LLM call.&lt;/strong&gt; Query Hindsight with the user's actual message as the query string — it's usually a better search query than anything you'd construct manually.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bank IDs are just strings.&lt;/strong&gt; No setup, no migrations. Pick a meaningful name and go.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test across restarts early.&lt;/strong&gt; The cross-session behaviour is the whole point. If you only test within a single session, you'll miss whether the memory is actually persisting.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;Right now the agent tracks tasks and decisions but has no concept of task completion — you can log a task as done via chat, but there's no structured state transition. That's the obvious next step.&lt;/p&gt;

&lt;p&gt;We'd also like to add per-member memory banks so the agent can maintain a richer model of each person's workload history over time, rather than one shared bank for the whole team.&lt;/p&gt;

&lt;p&gt;The code is on GitHub: &lt;a href="https://github.com/SinchanaNagaraj/ai-group-project-manager" rel="noopener noreferrer"&gt;github.com/SinchanaNagaraj/ai-group-project-manager&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're building an agent that needs to remember things across sessions, &lt;a href="https://github.com/vectorize-io/hindsight" rel="noopener noreferrer"&gt;Hindsight&lt;/a&gt; is worth a serious look. The &lt;code&gt;retain&lt;/code&gt; / &lt;code&gt;recall&lt;/code&gt; pattern is simple enough to wire in quickly, and the memory quality is meaningfully better than stuffing everything into a system prompt and hoping for the best.&lt;/p&gt;

</description>
      <category>python</category>
      <category>webdev</category>
      <category>programming</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
