<?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: Bessie Gannon</title>
    <description>The latest articles on DEV Community by Bessie Gannon (@bessiegannon).</description>
    <link>https://dev.to/bessiegannon</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%2F3927938%2Ff93c1d28-531a-4045-a846-2f11d7d165cc.png</url>
      <title>DEV Community: Bessie Gannon</title>
      <link>https://dev.to/bessiegannon</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bessiegannon"/>
    <language>en</language>
    <item>
      <title>My LangGraph agent was hammering the same API endpoints 40 per run. Solved it with ToolOps</title>
      <dc:creator>Bessie Gannon</dc:creator>
      <pubDate>Tue, 12 May 2026 20:23:47 +0000</pubDate>
      <link>https://dev.to/bessiegannon/my-langgraph-agent-was-hammering-the-same-api-endpoints-40x-per-run-solved-it-with-toolops-1agp</link>
      <guid>https://dev.to/bessiegannon/my-langgraph-agent-was-hammering-the-same-api-endpoints-40x-per-run-solved-it-with-toolops-1agp</guid>
      <description>&lt;p&gt;I've been running a multi-agent LangGraph pipeline for a few weeks now and kept hitting the same two walls: redundant API calls inflating costs, and agent crashes the moment any upstream service became flaky. &lt;/p&gt;

&lt;p&gt;My setup had 4 agents calling overlapping tools. Under real load, I was making 40+ calls per run to endpoints that returned the same data within a 30-minute window. My circuit-breaker logic was copy-pasted and inconsistent across tools. Observability was basically nonexistent — when something broke, I had no structured signal to debug from. &lt;/p&gt;

&lt;p&gt;I found ToolOps and the core idea is sound: treat every tool call the way infrastructure engineers treat microservice communication. The @readonly / @sideeffect decorator split is opinionated in a good way — it forces you to be explicit about whether a tool call is idempotent or not, which turns out to matter a lot when you're deciding what's safe to cache and retry. &lt;/p&gt;

&lt;p&gt;What stuck with me practically: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Request coalescing: in a 50-concurrent-call benchmark from their docs, 50 calls collapsed to 1 upstream request. I tested something smaller but directionally got the same behavior — the thundering herd problem on cache miss is real and this handles it cleanly. &lt;/li&gt;
&lt;li&gt;Semantic caching: I was skeptical but the intent-matching approach is genuinely useful for NLP tool inputs. "Check status of invoice #442" and "Is invoice 442 paid?" hitting the same cache entry reduced LLM token usage noticeably. &lt;/li&gt;
&lt;li&gt;toolops doctor: a single CLI command that validates all your backends and reports circuit breaker state. Small thing, but it's exactly what you want to wire into a health check endpoint. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The integration is one decorator per function. Zero changes to business logic. Works across LangGraph, CrewAI, LlamaIndex, and MCP natively. &lt;/p&gt;

&lt;p&gt;It's early — the web dashboard and budget control features are still on the roadmap — but the core resilience layer is solid. Apache 2.0, built by Hedi Manai (&lt;a class="mentioned-user" href="https://dev.to/hedimanai"&gt;@hedimanai&lt;/a&gt; on LinkedIn). &lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/hedimanai-pro/toolops" rel="noopener noreferrer"&gt;https://github.com/hedimanai-pro/toolops&lt;/a&gt; &lt;br&gt;
Docs: &lt;a href="https://hedimanai.vercel.app/projects/toolops.html" rel="noopener noreferrer"&gt;https://hedimanai.vercel.app/projects/toolops.html&lt;/a&gt; &lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>api</category>
      <category>performance</category>
    </item>
  </channel>
</rss>
