<?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: Likhith.R</title>
    <description>The latest articles on DEV Community by Likhith.R (@likhithr_b539f1289712a5e).</description>
    <link>https://dev.to/likhithr_b539f1289712a5e</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%2F4205876%2F7cde26f8-b12d-4efa-8d2e-778172deed57.png</url>
      <title>DEV Community: Likhith.R</title>
      <link>https://dev.to/likhithr_b539f1289712a5e</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/likhithr_b539f1289712a5e"/>
    <language>en</language>
    <item>
      <title>My Incident Agent Forgot Every Outage Until I Gave It Hindsight</title>
      <dc:creator>Likhith.R</dc:creator>
      <pubDate>Sun, 08 Nov 2026 18:25:25 +0000</pubDate>
      <link>https://dev.to/likhithr_b539f1289712a5e/my-incident-agent-forgot-every-outage-until-i-gave-it-hindsight-4f5i</link>
      <guid>https://dev.to/likhithr_b539f1289712a5e/my-incident-agent-forgot-every-outage-until-i-gave-it-hindsight-4f5i</guid>
      <description>&lt;p&gt;Every time I restarted my incident agent, it forgot everything it had learned. I'd teach it about an outage, close the notebook, and come back to a blank slate with four sample incidents. This article covers how I fixed that with &lt;a href="https://github.com/vectorize-io/hindsight" rel="noopener noreferrer"&gt;Hindsight&lt;/a&gt;, and what still doesn't work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The agent and its memory problem
&lt;/h2&gt;

&lt;p&gt;The agent takes a live incident (a title, a service, the symptoms, and a severity), recalls similar past incidents, and returns a five-part response plan: likely cause, immediate steps, the memories it relied on, how to verify the fix, and when to escalate. I call it INFERON AI. The model is &lt;code&gt;openai/gpt-oss-120b&lt;/code&gt; on Groq, and a Gradio form makes it usable from a browser.&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%2F0a69nkigw3b38f9p7cht.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%2F0a69nkigw3b38f9p7cht.png" alt="INFERON AI web form with a checkout incident filled in" width="800" height="258"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The INFERON AI web form with a checkout incident entered as SEV1. Clicking "Get response plan" returns a five-section plan, which appears under the form.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;My first version stored incidents in SQLite and matched them with TF-IDF. It worked within one session. Adding a postmortem or a resolved incident made the plans better, and I could see the effect right away.&lt;/p&gt;

&lt;p&gt;Then the session ended. Colab deletes its files when a session closes, so the database went with it. The next session started with only the sample incidents I had hard-coded. Every outage I had taught the agent was gone, and so was every postmortem lesson. The agent was only as good as the code I'd typed, not what it had learned.&lt;/p&gt;

&lt;p&gt;That's the real failure. Keyword matching was a weaker problem, and I'll come back to it. What hurt was that the agent couldn't keep anything.&lt;/p&gt;
&lt;h2&gt;
  
  
  Moving the memory to Hindsight
&lt;/h2&gt;

&lt;p&gt;I moved storage and recall to Hindsight, a memory service with a cloud API. Each incident becomes one plain-text record in a memory bank called &lt;code&gt;incident-memory&lt;/code&gt;. Hindsight extracts the facts from that text on its own, so I don't split the fields myself:&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;def&lt;/span&gt; &lt;span class="nf"&gt;incident_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inc&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;return &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;Incident: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;inc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;title&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;. Service: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;inc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;service&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;. Severity: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;inc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;severity&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Symptoms: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;inc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;symptoms&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;. Root cause: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;inc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;root_cause&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Resolution steps: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;inc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;resolution_steps&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;. Runbook: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;inc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;runbook&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Recall asks the bank for the facts closest to the live incident:&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;def&lt;/span&gt; &lt;span class="nf"&gt;recall_similar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;symptoms&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&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="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;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;. Service: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;. Symptoms: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;symptoms&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;in_thread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recall&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;incident-memory&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;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I first set &lt;code&gt;top_k&lt;/code&gt; to 3, but one query returned 57 facts, since Hindsight breaks each incident into several statements. Three results could all come from one incident, so I raised the limit to 8.&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%2F5ao9me1qgxra1mqafeod.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%2F5ao9me1qgxra1mqafeod.png" alt="Recall output showing several stored checkout incident records" width="800" height="105"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;A real recall from the incident-memory bank. Hindsight returns several facts for each stored incident, so the results include near-duplicates.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The difference shows up across sessions. After I restarted the notebook, I didn't reload the seed data, and the agent still recalled the stored incidents. I also recorded a resolved payments incident and a postmortem, and those stayed in memory too. For the first time, the agent kept what I taught it.&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%2Fmvx9ycg35mbmp50xzckr.jpeg" 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%2Fmvx9ycg35mbmp50xzckr.jpeg" alt="INFERON AI architecture diagram showing the browser, Hindsight, and Groq." width="800" height="447"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;INFERON AI sends the incident to Hindsight for recall, then sends the incident and memories to the Groq model. Postmortems and resolved incidents go back to memory with &lt;code&gt;retain&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What I had to fix along the way
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The event loop broke the web form.&lt;/strong&gt; The Hindsight client conflicted with Colab's event loop. The common fix, &lt;code&gt;nest_asyncio&lt;/code&gt;, made the client work but broke Gradio's server, which then failed to start. Restoring the original function didn't help, because the server had already captured the patched version. The fix that worked was to stop patching the event loop and run every Hindsight call in a single worker thread, which has no running loop:&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;_pool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;concurrent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;futures&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ThreadPoolExecutor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_workers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;in_thread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&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;_pool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;submit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;result&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;The account needed credit.&lt;/strong&gt; Before any of this worked, the connection returned &lt;code&gt;402 Payment Required&lt;/code&gt;. The API was reachable, but the account had no balance. Check that before you build anything on a paid memory service.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Hindsight doesn't do yet
&lt;/h2&gt;

&lt;p&gt;Persistence solved the problem I came in with, but it didn't solve everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Duplicates crowd the results.&lt;/strong&gt; I seeded the same incidents more than once while testing, and the recall output shows the result. Several records for the same checkout incident appear in a single query, with slightly different wording. When the top results are copies, fewer distinct incidents fit in the model's context. If you load your seed data more than once, check the bank for duplicates before you trust a plan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The model chose among near-duplicates.&lt;/strong&gt; On the SEV1 run, the plan quoted a stored record word for word. On the SEV3 run, it quoted a different record for the same incident, which included the phrase "due to lack of entry eviction." That phrase was in memory, not invented by the model. The model picked one of several versions, and nothing in the output showed that a choice had been made.&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%2F4lgv0iq046vgejlwz8xd.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%2F4lgv0iq046vgejlwz8xd.png" alt="INFERON AI generated plan showing a quoted memory in section 3" width="800" height="404"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The SEV1 plan. Section 3 quotes a stored memory word for word, but the memory bank holds several near-identical versions of the same incident.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Outcomes don't reorder results.&lt;/strong&gt; My SQLite version multiplied each match's similarity by how often its fix had worked. A fix that held could outrank a closer match that failed. In the Hindsight version I stored outcomes as text, and they don't change the ranking. When I recorded a payments rollback that had worked, a checkout query still returned checkout memories first. Raising the limit let the payments outcome into the top eight, but it never ranked first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The model adds details that aren't in memory.&lt;/strong&gt; The SEV1 plan suggested a &lt;code&gt;POST /admin/clear-retry-cache&lt;/code&gt; endpoint and a &lt;code&gt;payment_retry_cache_entries&lt;/code&gt; metric. Neither appears in any stored record. Some of that is reasonable general advice, and some is plausible-sounding invention, so every step needs checking against your real systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The model mixed up versions.&lt;/strong&gt; The stored fix was a rollback to v2.3. The plan recommended v2.6, which was the version in the live incident. Nothing in the output flagged the difference.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Severity changes wording more than actions.&lt;/strong&gt; SEV1, SEV2, and SEV3 plans had nearly the same steps, with different escalation text.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd do next
&lt;/h2&gt;

&lt;p&gt;The memory now survives between sessions, which was the reason I started. The next problems are ranking outcomes, removing duplicates, and checking the model's output.&lt;/p&gt;

&lt;p&gt;I'd store success rates outside the memory system and combine them with recall results, the way the SQLite version did. I'd deduplicate records when they're stored, so the top results cover different incidents. I'd also run a check after the model responds that compares each quoted line with the retrieved memories, and rejects any quote that doesn't match. And I'd make SEV1 change the actions, not just the wording, so it pages the on-call lead before any other step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Test persistence before you test intelligence.&lt;/strong&gt; My agent looked smart inside one session, and it was useless across sessions. I only caught that by restarting the notebook.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory that lives in a notebook's files is not memory.&lt;/strong&gt; Anything stored in a session's local disk disappears when the session ends.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;More results is not the same as better ranking.&lt;/strong&gt; Raising the limit brought the right memory into the context, but didn't move it to the top.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duplicates change what the model sees.&lt;/strong&gt; Repeated records push out other incidents, and the model may quote whichever copy it reads first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep blocking calls out of your web server's event loop.&lt;/strong&gt; Put them in a worker thread instead.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Hindsight gave the agent a memory that outlasts the session. Deciding which memories should win, removing duplicates, and checking what the model says about them is still my job. You can read more in the &lt;a href="https://hindsight.vectorize.io/" rel="noopener noreferrer"&gt;Hindsight documentation&lt;/a&gt; and in &lt;a href="https://vectorize.io/what-is-agent-memory" rel="noopener noreferrer"&gt;Vectorize's guide to agent memory&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>machinelearning</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
