<?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: Ashwini Ravirala</title>
    <description>The latest articles on DEV Community by Ashwini Ravirala (@ashwini_ravirala_cffc5cce).</description>
    <link>https://dev.to/ashwini_ravirala_cffc5cce</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%2F4150598%2F23774887-247a-4465-a6ce-05802c4a7af8.png</url>
      <title>DEV Community: Ashwini Ravirala</title>
      <link>https://dev.to/ashwini_ravirala_cffc5cce</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ashwini_ravirala_cffc5cce"/>
    <language>en</language>
    <item>
      <title>What Changes When an AI Code Reviewer Remembers? Building ReviewMind with Hindsight</title>
      <dc:creator>Ashwini Ravirala</dc:creator>
      <pubDate>Tue, 29 Sep 2026 17:31:20 +0000</pubDate>
      <link>https://dev.to/ashwini_ravirala_cffc5cce/what-changes-when-an-ai-code-reviewer-remembers-building-reviewmind-with-hindsight-38dp</link>
      <guid>https://dev.to/ashwini_ravirala_cffc5cce/what-changes-when-an-ai-code-reviewer-remembers-building-reviewmind-with-hindsight-38dp</guid>
      <description>&lt;p&gt;What Changes When an AI Code Reviewer Remembers? Building ReviewMind with Hindsight&lt;/p&gt;

&lt;p&gt;Most AI code reviewers are good at understanding the code in front of them.&lt;/p&gt;

&lt;p&gt;The harder problem is remembering what a particular team has already learned.&lt;/p&gt;

&lt;p&gt;A team might decide to avoid print() in production code, prefer structured logging, use a particular error-handling pattern, or follow specific database-access rules. Those decisions often appear gradually through pull requests, review comments, and debugging sessions.&lt;/p&gt;

&lt;p&gt;I wanted to explore what would happen if an AI code reviewer could actually carry some of that context from one review into the next.&lt;/p&gt;

&lt;p&gt;That idea became ReviewMind, a memory-driven code review agent built around Hindsight.&lt;/p&gt;

&lt;p&gt;The core workflow is simple:&lt;/p&gt;

&lt;p&gt;Recall → Review → Feedback → Retain&lt;/p&gt;

&lt;p&gt;The interesting part is not simply generating another AI code review. It is making previously learned team context available at the moment a new review is being generated.&lt;/p&gt;

&lt;p&gt;The problem isn't only finding bugs&lt;/p&gt;

&lt;p&gt;Consider a small function:&lt;/p&gt;

&lt;p&gt;def archive_user(user):&lt;br&gt;
    print("Archiving user:", user)&lt;br&gt;
    return user&lt;/p&gt;

&lt;p&gt;A reviewer might reasonably flag the print() statement and recommend structured logging instead.&lt;/p&gt;

&lt;p&gt;That's useful.&lt;/p&gt;

&lt;p&gt;But imagine that the same convention appears again in another file a week later.&lt;/p&gt;

&lt;p&gt;If the reviewer has no access to the team's previous decision, the developer may receive essentially the same recommendation again without any continuity between the two reviews.&lt;/p&gt;

&lt;p&gt;There is an important difference between knowing a general programming practice and remembering a team's specific convention.&lt;/p&gt;

&lt;p&gt;Teams accumulate decisions over time.&lt;/p&gt;

&lt;p&gt;The problem is that those decisions can remain scattered across pull requests, conversations, documentation, and individual developer knowledge.&lt;/p&gt;

&lt;p&gt;I wanted ReviewMind to make that accumulated context part of the review process itself.&lt;/p&gt;

&lt;p&gt;The idea: put memory in the review loop&lt;/p&gt;

&lt;p&gt;ReviewMind uses a Next.js and TypeScript frontend, a Python FastAPI backend, Groq for LLM-based review, and Hindsight for memory.&lt;/p&gt;

&lt;p&gt;The backend coordinates the workflow.&lt;/p&gt;

&lt;p&gt;At a high level, every review follows four stages:&lt;/p&gt;

&lt;p&gt;Code&lt;br&gt;
  ↓&lt;br&gt;
RECALL&lt;br&gt;
  ↓&lt;br&gt;
AI Review&lt;br&gt;
  ↓&lt;br&gt;
Developer Feedback&lt;br&gt;
  ↓&lt;br&gt;
RETAIN&lt;br&gt;
  ↓&lt;br&gt;
Future Review&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Recall&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Before the LLM reviews the code, ReviewMind builds a query using information such as the programming language, framework, and coding-convention context.&lt;/p&gt;

&lt;p&gt;It then asks Hindsight for relevant memories from the team's memory bank.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Review&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The submitted code and recalled memories are passed to the LLM.&lt;/p&gt;

&lt;p&gt;The model can therefore consider both:&lt;/p&gt;

&lt;p&gt;the code being reviewed&lt;br&gt;
relevant knowledge from previous interactions&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Feedback&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The developer can respond to individual findings.&lt;/p&gt;

&lt;p&gt;The available decisions are:&lt;/p&gt;

&lt;p&gt;Accepted&lt;br&gt;
Rejected&lt;br&gt;
Not relevant&lt;/p&gt;

&lt;p&gt;This matters because an AI reviewer shouldn't assume that every suggestion is correct for every codebase.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Retain&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Meaningful feedback can be turned into a memory that may be useful during later reviews.&lt;/p&gt;

&lt;p&gt;That creates the learning loop:&lt;/p&gt;

&lt;p&gt;RECALL → REVIEW → FEEDBACK → RETAIN&lt;br&gt;
                    ↑             |&lt;br&gt;
                    └─────────────┘&lt;br&gt;
Why Hindsight is more than a storage layer&lt;/p&gt;

&lt;p&gt;One of the design questions I had was:&lt;/p&gt;

&lt;p&gt;Why not just store review feedback in a database?&lt;/p&gt;

&lt;p&gt;A database can certainly store comments.&lt;/p&gt;

&lt;p&gt;But storing feedback is only part of the problem.&lt;/p&gt;

&lt;p&gt;For a new review, I need to find the information that is actually relevant to the current code.&lt;/p&gt;

&lt;p&gt;That's where Hindsight's recall capability becomes important.&lt;/p&gt;

&lt;p&gt;ReviewMind uses a team identifier as the Hindsight bank_id, creating a boundary around the memories associated with that team.&lt;/p&gt;

&lt;p&gt;The memory integration is kept inside its own service rather than spreading Hindsight-specific logic throughout the API.&lt;/p&gt;

&lt;p&gt;The recall operation looks like this:&lt;/p&gt;

&lt;p&gt;results = await self.client.arecall(&lt;br&gt;
    bank_id=bank_id,&lt;br&gt;
    query=query,&lt;br&gt;
    budget="mid",&lt;br&gt;
    max_tokens=4096,&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;The service converts the returned results into a compact structure containing the memory text, type, and optional score.&lt;/p&gt;

&lt;p&gt;Those memories are then passed to the LLM service.&lt;/p&gt;

&lt;p&gt;This separation keeps the responsibilities fairly clear:&lt;/p&gt;

&lt;p&gt;FastAPI&lt;br&gt;
   │&lt;br&gt;
   ├── Hindsight Service&lt;br&gt;
   │       └── Recall / Retain&lt;br&gt;
   │&lt;br&gt;
   └── LLM Service&lt;br&gt;
           └── Generate Review&lt;/p&gt;

&lt;p&gt;For more information about the underlying memory approach, see the Hindsight documentation and Vectorize's explanation of agent memory.&lt;/p&gt;

&lt;p&gt;Giving the reviewer explicit team context&lt;/p&gt;

&lt;p&gt;I didn't want the model to blur together its general programming knowledge and the team's retrieved knowledge.&lt;/p&gt;

&lt;p&gt;So the LLM prompt explicitly separates the two.&lt;/p&gt;

&lt;p&gt;The memory section is constructed roughly like this:&lt;/p&gt;

&lt;p&gt;memory_text = ""&lt;/p&gt;

&lt;p&gt;if memory_context:&lt;br&gt;
    memory_text = "\nTEAM MEMORY:\n"&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;for i, memory in enumerate(memory_context, 1):
    memory_text += f"{i}. {memory.get('text', '')}\n"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;else:&lt;br&gt;
    memory_text = "\nTEAM MEMORY:\nNo team memories available for this review.\n"&lt;/p&gt;

&lt;p&gt;The reviewer receives the submitted code along with the retrieved team memory.&lt;/p&gt;

&lt;p&gt;The model is also instructed to refer to a memory only when that memory was actually supplied.&lt;/p&gt;

&lt;p&gt;ReviewMind then checks the memory_used values returned by the model against the memories that were actually provided.&lt;/p&gt;

&lt;p&gt;That distinction is important.&lt;/p&gt;

&lt;p&gt;A reviewer shouldn't claim that it remembered a team rule if that rule was never actually retrieved.&lt;/p&gt;

&lt;p&gt;Feedback is where the learning loop starts&lt;/p&gt;

&lt;p&gt;A review agent shouldn't blindly assume that its suggestions are correct.&lt;/p&gt;

&lt;p&gt;Developers need a way to disagree.&lt;/p&gt;

&lt;p&gt;That's why ReviewMind treats feedback as part of the memory workflow rather than just a UI state.&lt;/p&gt;

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

&lt;p&gt;Finding:&lt;br&gt;
Avoid print() in production code.&lt;/p&gt;

&lt;p&gt;Developer:&lt;br&gt;
Accepted&lt;/p&gt;

&lt;p&gt;The system can retain a convention such as:&lt;/p&gt;

&lt;p&gt;Team convention:&lt;br&gt;
Avoid print statements in production code.&lt;br&gt;
Use structured logging.&lt;/p&gt;

&lt;p&gt;The retention call is kept behind the Hindsight service:&lt;/p&gt;

&lt;p&gt;self.client.retain(&lt;br&gt;
    bank_id=bank_id,&lt;br&gt;
    content=content,&lt;br&gt;
    context=context,&lt;br&gt;
    metadata=metadata or {},&lt;br&gt;
    retain_async=False,&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;The retained item can also include metadata such as:&lt;/p&gt;

&lt;p&gt;review ID&lt;br&gt;
issue ID&lt;br&gt;
decision&lt;br&gt;
programming language&lt;br&gt;
framework&lt;br&gt;
team ID&lt;/p&gt;

&lt;p&gt;This gives the memory some context about where the learning came from.&lt;/p&gt;

&lt;p&gt;A concrete before-and-after example&lt;/p&gt;

&lt;p&gt;Let's say the team accepts a recommendation about structured logging.&lt;/p&gt;

&lt;p&gt;The first review contains:&lt;/p&gt;

&lt;p&gt;def archive_user(user):&lt;br&gt;
    print("Archiving user:", user)&lt;br&gt;
    return user&lt;/p&gt;

&lt;p&gt;The developer accepts the finding.&lt;/p&gt;

&lt;p&gt;ReviewMind retains the team convention.&lt;/p&gt;

&lt;p&gt;Later, another developer submits:&lt;/p&gt;

&lt;p&gt;def delete_user(user):&lt;br&gt;
    print("Deleting user:", user)&lt;br&gt;
    return user&lt;/p&gt;

&lt;p&gt;This is a different function.&lt;/p&gt;

&lt;p&gt;The important part is that Hindsight may now retrieve the earlier convention:&lt;/p&gt;

&lt;p&gt;Team convention:&lt;br&gt;
Avoid print statements in production code.&lt;br&gt;
Use structured logging.&lt;/p&gt;

&lt;p&gt;The LLM receives both the new function and that retrieved context.&lt;/p&gt;

&lt;p&gt;The resulting finding can therefore be connected to an explicit team decision rather than being presented only as generic programming advice.&lt;/p&gt;

&lt;p&gt;The exact memories returned depend on what has previously been retained and what Hindsight retrieves for the query.&lt;/p&gt;

&lt;p&gt;Memory doesn't guarantee that every relevant rule will be found, and it doesn't guarantee that every generated finding will be correct.&lt;/p&gt;

&lt;p&gt;It gives the reviewer additional context.&lt;/p&gt;

&lt;p&gt;That's the distinction I wanted to explore.&lt;/p&gt;

&lt;p&gt;What I learned while building it&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Retrieval needs to happen before the decision&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This sounds obvious after building it, but it changes the architecture.&lt;/p&gt;

&lt;p&gt;If memory is retrieved after the LLM has already generated its review, that memory cannot influence the decision.&lt;/p&gt;

&lt;p&gt;So the sequence needs to be:&lt;/p&gt;

&lt;p&gt;Code&lt;br&gt;
 ↓&lt;br&gt;
Recall relevant context&lt;br&gt;
 ↓&lt;br&gt;
Give context to LLM&lt;br&gt;
 ↓&lt;br&gt;
Generate review&lt;/p&gt;

&lt;p&gt;Memory has to be close to the decision point.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Feedback needs meaning&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A simple thumbs-up or thumbs-down doesn't tell the system very much.&lt;/p&gt;

&lt;p&gt;A decision connected to a specific issue and explanation is much more useful.&lt;/p&gt;

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

&lt;p&gt;Accepted:&lt;br&gt;
"Yes, our production services use structured logging."&lt;/p&gt;

&lt;p&gt;Rejected:&lt;br&gt;
"We intentionally allow print() in CLI scripts."&lt;/p&gt;

&lt;p&gt;The second piece of feedback can be just as useful as the first because it describes an exception to a general recommendation.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Memory claims should be traceable&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;An AI reviewer shouldn't casually say:&lt;/p&gt;

&lt;p&gt;"Your team previously decided..."&lt;/p&gt;

&lt;p&gt;unless the relevant team memory was actually supplied to it.&lt;/p&gt;

&lt;p&gt;That's why ReviewMind keeps the recalled memories in the review response and validates memory references.&lt;/p&gt;

&lt;p&gt;The goal is to make the boundary between model knowledge and retrieved team knowledge visible.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Graceful degradation matters&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Memory systems can fail.&lt;/p&gt;

&lt;p&gt;If Hindsight recall fails, ReviewMind can continue the review with an empty memory list.&lt;/p&gt;

&lt;p&gt;That means the core code review doesn't necessarily have to stop just because the memory layer isn't available.&lt;/p&gt;

&lt;p&gt;But this creates another requirement: the interface and logs need to make memory availability clear.&lt;/p&gt;

&lt;p&gt;Otherwise, a developer could mistake a normal review for a memory-informed review.&lt;/p&gt;

&lt;p&gt;Current limitations&lt;/p&gt;

&lt;p&gt;ReviewMind is still an MVP, and there are several limitations I wouldn't hide.&lt;/p&gt;

&lt;p&gt;The current review store is in memory.&lt;/p&gt;

&lt;p&gt;That means review records used for feedback are lost when the backend restarts.&lt;/p&gt;

&lt;p&gt;The project also doesn't automatically review GitHub pull requests yet.&lt;/p&gt;

&lt;p&gt;The recall query is primarily constructed from programming language, framework, and convention-related information rather than performing a sophisticated semantic analysis of the submitted code before constructing the query.&lt;/p&gt;

&lt;p&gt;These limitations matter because memory-based systems introduce their own problems.&lt;/p&gt;

&lt;p&gt;For a real codebase, I'd want to think carefully about:&lt;/p&gt;

&lt;p&gt;outdated memories&lt;br&gt;
incorrect memories&lt;br&gt;
conflicting team conventions&lt;br&gt;
repository-level versus team-level memory&lt;br&gt;
access control&lt;br&gt;
sensitive code&lt;br&gt;
secrets accidentally included in submissions&lt;br&gt;
memory correction and deletion&lt;/p&gt;

&lt;p&gt;A system that remembers the wrong thing can be just as problematic as one that forgets everything.&lt;/p&gt;

&lt;p&gt;What's next?&lt;/p&gt;

&lt;p&gt;There are several directions I'd explore next.&lt;/p&gt;

&lt;p&gt;Persistent review storage&lt;/p&gt;

&lt;p&gt;Reviews and feedback should survive backend restarts.&lt;/p&gt;

&lt;p&gt;GitHub pull-request integration&lt;/p&gt;

&lt;p&gt;Instead of manually submitting code, ReviewMind could work directly with pull requests and provide memory-aware review comments.&lt;/p&gt;

&lt;p&gt;Repository-level memory&lt;/p&gt;

&lt;p&gt;Different repositories can have different conventions.&lt;/p&gt;

&lt;p&gt;A future version could combine team-level knowledge with repository-specific context.&lt;/p&gt;

&lt;p&gt;Better memory controls&lt;/p&gt;

&lt;p&gt;Developers should be able to understand, correct, and manage important team conventions.&lt;/p&gt;

&lt;p&gt;Better observability&lt;/p&gt;

&lt;p&gt;When memory retrieval fails or produces no relevant results, the system should make that visible.&lt;/p&gt;

&lt;p&gt;These changes would move the project closer to being useful in a real development workflow.&lt;/p&gt;

&lt;p&gt;From isolated answers to accumulated context&lt;/p&gt;

&lt;p&gt;The central idea behind ReviewMind is fairly modest.&lt;/p&gt;

&lt;p&gt;I don't think memory replaces code review expertise, testing, or human judgment.&lt;/p&gt;

&lt;p&gt;Instead, it gives an AI reviewer another source of context: what the team has already learned.&lt;/p&gt;

&lt;p&gt;Hindsight provides the retain-and-recall layer.&lt;/p&gt;

&lt;p&gt;FastAPI coordinates the workflow.&lt;/p&gt;

&lt;p&gt;Groq generates the structured review.&lt;/p&gt;

&lt;p&gt;And the developer remains in the loop by deciding which suggestions are useful and which aren't.&lt;/p&gt;

&lt;p&gt;The interesting shift is from:&lt;/p&gt;

&lt;p&gt;Review → Forget → Review → Forget&lt;/p&gt;

&lt;p&gt;to:&lt;/p&gt;

&lt;p&gt;Review&lt;br&gt;
  ↓&lt;br&gt;
Feedback&lt;br&gt;
  ↓&lt;br&gt;
Remember&lt;br&gt;
  ↓&lt;br&gt;
Recall&lt;br&gt;
  ↓&lt;br&gt;
Review with context&lt;/p&gt;

&lt;p&gt;That's what I wanted to explore with ReviewMind.&lt;/p&gt;

&lt;p&gt;Not whether an AI can review code.&lt;/p&gt;

&lt;p&gt;But what changes when the reviewer can remember the people and decisions behind the code.&lt;/p&gt;

&lt;p&gt;Project&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%2F2543uzi6an42voidlcv7.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%2F2543uzi6an42voidlcv7.png" alt=" " width="800" height="385"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4hhpnykhsm1pcqe2t0j7.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%2F4hhpnykhsm1pcqe2t0j7.png" alt=" " width="799" height="382"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjybhjetg0106fomh59x5.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%2Fjybhjetg0106fomh59x5.png" alt=" " width="800" height="382"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8rb7epseytd96jnyhm26.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%2F8rb7epseytd96jnyhm26.png" alt=" " width="800" height="385"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffokiqo0wtlouzuoaktna.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%2Ffokiqo0wtlouzuoaktna.png" alt=" " width="800" height="387"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6030n7yubc0040bofg83.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%2F6030n7yubc0040bofg83.png" alt=" " width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

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