<?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: Dasari Abhiram</title>
    <description>The latest articles on DEV Community by Dasari Abhiram (@dasari_abhiram_0411).</description>
    <link>https://dev.to/dasari_abhiram_0411</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%2F4148979%2F42fa73b7-7c0a-4af7-a1e4-f42a08e84ee3.jpg</url>
      <title>DEV Community: Dasari Abhiram</title>
      <link>https://dev.to/dasari_abhiram_0411</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dasari_abhiram_0411"/>
    <language>en</language>
    <item>
      <title>My Code Review Agent Stopped Repeating Itself With Hindsight</title>
      <dc:creator>Dasari Abhiram</dc:creator>
      <pubDate>Tue, 29 Sep 2026 08:30:28 +0000</pubDate>
      <link>https://dev.to/dasari_abhiram_0411/my-code-review-agent-stopped-repeating-itself-with-hindsight-3pjn</link>
      <guid>https://dev.to/dasari_abhiram_0411/my-code-review-agent-stopped-repeating-itself-with-hindsight-3pjn</guid>
      <description>&lt;p&gt;I replayed 21 real Flask pull requests through my review agent twice. With no memory it wrote 96 comments, and 62 of them were kinds of feedback my simulated team had already rejected. With &lt;a href="https://github.com/vectorize-io/hindsight" rel="noopener noreferrer"&gt;Hindsight&lt;/a&gt; memory on, it wrote 47 comments and repeated none of those rejected kinds.&lt;/p&gt;

&lt;p&gt;This post covers how I built that, the one bug that taught me the most, and what the numbers do and do not show.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem I wanted to fix
&lt;/h2&gt;

&lt;p&gt;Anyone who has done code review on a small team knows the loop. A tool or a new reviewer suggests adding a docstring, someone says "we don't do that here", and three weeks later the same suggestion shows up again. The conventions live in people's heads, and most AI review tools start from zero on every pull request.&lt;/p&gt;

&lt;p&gt;I wanted an agent that gets told "no" once and remembers it. I called it the Review Desk.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Review Desk does
&lt;/h2&gt;

&lt;p&gt;It reads a pull request diff and posts comments inline, under the lines they refer to. A person clicks Accept or Reject on each comment, with an optional reason. Every decision is stored in Hindsight. On the next review, the agent recalls those decisions before it writes anything, so it stops repeating rejected kinds of feedback and keeps raising what the team values.&lt;/p&gt;

&lt;p&gt;The stack is small: Python, FastAPI, Groq running &lt;code&gt;openai/gpt-oss-120b&lt;/code&gt;, the GitHub API, and a single-file React frontend loaded from a CDN. I only use two Hindsight operations, retain and recall.&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%2Fwq8q12py7z9ii59f5jku.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%2Fwq8q12py7z9ii59f5jku.png" alt="The Review page with inline comments and Accept / Reject buttons" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Hindsight sits
&lt;/h2&gt;

&lt;p&gt;The whole memory layer is two functions. This is the real code from &lt;code&gt;replay_real.py&lt;/code&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;def&lt;/span&gt; &lt;span class="nf"&gt;retain_memory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bank_id&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;text&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="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;_mem&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;bank_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;bank_id&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;text&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;code-review-feedback&lt;/span&gt;&lt;span class="sh"&gt;"&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;recall_memory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bank_id&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;query&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;list&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_mem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&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="n"&gt;bank_id&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="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="p"&gt;[])]&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="c1"&gt;# Bank/tables not created yet, or transient server error: wait and retry.
&lt;/span&gt;            &lt;span class="n"&gt;transient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;not found&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;404&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;does not exist&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;
                         &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;undefinedtable&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;500&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;503&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;transient&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;raise&lt;/span&gt;
            &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;    (recall unavailable after retries; continuing with no memory for this PR)&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="p"&gt;[]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every Accept or Reject becomes a short piece of text, and &lt;code&gt;retain_memory&lt;/code&gt; writes it to a bank. Before each review, &lt;code&gt;recall_memory&lt;/code&gt; pulls the relevant notes back, and they go into the prompt. The retry loop exists because a fresh bank is not always ready on the first call, so the code waits eight seconds and tries again, up to six times. If recall still fails, the review continues without memory instead of crashing. The &lt;a href="https://hindsight.vectorize.io/" rel="noopener noreferrer"&gt;Hindsight docs&lt;/a&gt; cover the retain and recall calls in more detail.&lt;/p&gt;

&lt;p&gt;One thing I learned the practical way: Hindsight needs about ten seconds to process a retain. In the UI I show a "Memory settling" bar after a rejection so nobody reviews again too early and thinks memory failed.&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%2Fn2ykvjh6vheqgtek9ei6.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%2Fn2ykvjh6vheqgtek9ei6.png" alt="A rejected comment marked as remembered, with the ten-second settling notice" width="800" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I measured it
&lt;/h2&gt;

&lt;p&gt;I fetched merged pull requests from &lt;code&gt;pallets/flask&lt;/code&gt;, kept the ones with 4 to 200 changed diff lines, and skipped release, version bump and typo-style titles. I replayed them in merge order, once with memory off and once with memory on, with a fresh memory bank for each run.&lt;/p&gt;

&lt;p&gt;The team is simulated. A script plays the reviewer: it accepts comments about security, validation, error handling and bugs, and rejects everything else. That gives me a fixed ground truth, so I can count how often the agent repeats something the script already rejected.&lt;/p&gt;

&lt;p&gt;The headline run used 21 pull requests. I removed four that only touched CI or the logo.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Memory off&lt;/th&gt;
&lt;th&gt;Memory on&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Comments generated&lt;/td&gt;
&lt;td&gt;96&lt;/td&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Repeat-rejected&lt;/td&gt;
&lt;td&gt;62&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Accepted&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;39&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Acceptance rate&lt;/td&gt;
&lt;td&gt;30%&lt;/td&gt;
&lt;td&gt;83%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The running totals of repeat rejections show the shape of it: after 5 pull requests it was 9 against 0, after 10 it was 24 against 0, and after 20 it was 59 against 0. Without memory the agent kept making the same mistakes. With memory, it made none of the rejected ones after being told.&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%2Fqa9ndwl8iw95yfpzr5m8.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%2Fqa9ndwl8iw95yfpzr5m8.png" alt="The Replay page: memory off on top, memory on below, with a scripted reviewer" width="800" height="671"&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%2Feixk7r6n8kr59plrwx2t.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%2Feixk7r6n8kr59plrwx2t.png" alt="Running total of repeated rejections: 62 without memory, 0 with memory" width="800" height="653"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The bug that taught me the most
&lt;/h2&gt;

&lt;p&gt;Hindsight stores what it is given as facts. When I rejected a comment, the stored fact was narrow, something like "rejected a docstring on the load function". The agent read that back correctly, but it did not generalize it. A docstring comment on a different function slipped through, and so did other documentation comments.&lt;/p&gt;

&lt;p&gt;The fix in the live app is a decision log. Each decision carries a category, and the app builds category rules from the log (for example, "the team rejects docs comments") and puts them first in the prompt, ahead of the recalled Hindsight notes. The notes add detail, and the rules cover the broad cases.&lt;/p&gt;

&lt;p&gt;I want to be plain about one thing: the 62 to 0 result came from &lt;code&gt;replay_real.py&lt;/code&gt;, which uses Hindsight recall only. The decision-log rules were added to the live app afterward, so they were not part of the measured replay. I have not measured the combined version.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the numbers do not show
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One run per arm.&lt;/strong&gt; Model output varies, and with a single run I cannot give a range.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Restarts.&lt;/strong&gt; Comment ids live in server memory, so a restart invalidates old ids. Saved decisions survive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The team was a script.&lt;/strong&gt; Real reviewers are inconsistent, and I have not tested that.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accepted counts are not a clean signal.&lt;/strong&gt; In my earlier 10-pull-request run, accepted comments went from 18 to 14 with memory on. In the 21-pull-request run they went from 29 to 39. They moved in opposite directions, so I do not claim memory raises or lowers accepted comments. The acceptance rate is high partly because memory cut total comments roughly in half.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comment quality is unverified.&lt;/strong&gt; The comments are model output. Inline placement is approximate, and at least one security comment about the Host header is a stretch. None of them are confirmed Flask bugs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Category labels drift.&lt;/strong&gt; The same kind of feedback can get a slightly different label between runs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy.&lt;/strong&gt; Decisions are stored in a plain text file, &lt;code&gt;data/decisions.json&lt;/code&gt;, with no encryption at rest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not built yet.&lt;/strong&gt; Comments show up in the UI. They are not posted back to the pull request on GitHub. A GitHub App that posts comments and treats resolved or dismissed threads as accept and reject signals is the obvious next step, and I have not built it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I would take from this
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Store decisions as rules, not only as events.&lt;/strong&gt; A raw rejection is a narrow fact. If you want broad behavior, keep a category and state the rule explicitly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Put the strongest instructions first in the prompt.&lt;/strong&gt; Recalled notes are useful context, but they should not be the only thing standing between the model and a repeated mistake.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measure repeats, not only acceptance.&lt;/strong&gt; Counting repeat-rejected comments gave me a number I could trust more than an acceptance rate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plan for the delay.&lt;/strong&gt; If your memory layer takes seconds to process a write, tell the user, or they will read a normal delay as a failure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Say what you did not measure.&lt;/strong&gt; It made the results easier to defend.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;The code is at &lt;a href="https://github.com/abhiram0411/review-desk" rel="noopener noreferrer"&gt;github.com/abhiram0411/review-desk&lt;/a&gt;. A read-only copy with the measured results is at &lt;a href="https://review-desk-z659.onrender.com" rel="noopener noreferrer"&gt;review-desk-z659.onrender.com&lt;/a&gt;. It is on a free host, so the first load can take up to a minute or two. Live reviews and the paste-a-PR-link box run locally.&lt;/p&gt;

&lt;p&gt;If you are new to the idea behind all this, the &lt;a href="https://vectorize.io/what-is-agent-memory" rel="noopener noreferrer"&gt;agent memory page on Vectorize&lt;/a&gt; is a good place to start, and the Hindsight repository has what you need to run it yourself.&lt;/p&gt;

&lt;p&gt;Thanks to Code.in for the coding help.&lt;br&gt;
Tagging &lt;a href="https://code.in/" rel="noopener noreferrer"&gt;Code.in&lt;/a&gt;.&lt;/p&gt;

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