<?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: Nicola Richli</title>
    <description>The latest articles on DEV Community by Nicola Richli (@nicolaric).</description>
    <link>https://dev.to/nicolaric</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%2F4046040%2F28804c6d-7f71-4d16-8b46-513acc1ba337.png</url>
      <title>DEV Community: Nicola Richli</title>
      <link>https://dev.to/nicolaric</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nicolaric"/>
    <language>en</language>
    <item>
      <title>Why We Removed LangGraph From Our AI Platform</title>
      <dc:creator>Nicola Richli</dc:creator>
      <pubDate>Mon, 27 Jul 2026 12:58:56 +0000</pubDate>
      <link>https://dev.to/nicolaric/why-we-removed-langgraph-from-our-ai-platform-i9o</link>
      <guid>https://dev.to/nicolaric/why-we-removed-langgraph-from-our-ai-platform-i9o</guid>
      <description>&lt;p&gt;When we started building &lt;a href="https://yeos.ai" rel="noopener noreferrer"&gt;&lt;strong&gt;yeos.ai&lt;/strong&gt;,&lt;/a&gt; LangGraph looked like the obvious choice.&lt;/p&gt;

&lt;p&gt;It promised everything you want from an AI agent framework:&lt;/p&gt;

&lt;p&gt;Stateful workflows&lt;br&gt;
Conditional execution&lt;br&gt;
Tool orchestration&lt;br&gt;
Memory&lt;br&gt;
Human-in-the-loop support&lt;br&gt;
Graph-based execution&lt;/p&gt;

&lt;p&gt;If you're building production AI agents, it's an attractive starting point.&lt;/p&gt;

&lt;p&gt;We used it for months.&lt;/p&gt;

&lt;p&gt;Eventually, we removed it completely.&lt;/p&gt;

&lt;p&gt;This isn't a criticism of LangGraph—it solves real problems, and many teams are successful with it. But after building an enterprise AI platform, we realized we no longer needed a graph framework at all.&lt;/p&gt;

&lt;p&gt;Here's why.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why We Chose LangGraph
&lt;/h2&gt;

&lt;p&gt;Our original architecture looked similar to many modern AI applications.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User
   ↓
Planner
   ↓
Retrieve Documents
   ↓
Execute Tools
   ↓
Generate Response
   ↓
Persist Conversation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;LangGraph made this easy.&lt;/p&gt;

&lt;p&gt;Each step became a node.&lt;/p&gt;

&lt;p&gt;The graph handled transitions.&lt;/p&gt;

&lt;p&gt;State was passed automatically.&lt;/p&gt;

&lt;p&gt;Everything looked elegant.&lt;/p&gt;

&lt;p&gt;Until the system became larger.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problems We Ran Into
&lt;/h2&gt;

&lt;p&gt;None of these issues appeared during prototyping.&lt;/p&gt;

&lt;p&gt;They appeared once the product became an actual platform used by multiple customers.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Debugging Became Surprisingly Difficult
&lt;/h3&gt;

&lt;p&gt;With a graph, execution isn't always linear.&lt;/p&gt;

&lt;p&gt;One node can trigger another.&lt;/p&gt;

&lt;p&gt;Conditional edges decide the next path.&lt;/p&gt;

&lt;p&gt;Retries can jump backwards.&lt;/p&gt;

&lt;p&gt;Tool execution modifies shared state.&lt;/p&gt;

&lt;p&gt;Eventually debugging starts looking like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Planner
   ↓
Retriever
   ↓
Tool A
   ↓
Planner
   ↓
Tool B
   ↓
Generator
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When something goes wrong, you aren't debugging a function anymore.&lt;/p&gt;

&lt;p&gt;You're debugging an execution graph.&lt;/p&gt;

&lt;p&gt;Simple bugs suddenly require tracing several state transitions.&lt;/p&gt;

&lt;p&gt;We wanted to answer questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why did the model call this tool?&lt;/li&gt;
&lt;li&gt;Which document caused this answer?&lt;/li&gt;
&lt;li&gt;Why was another tool skipped?&lt;/li&gt;
&lt;li&gt;Which state changed here?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The graph made those questions harder instead of easier.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Hidden Complexity
&lt;/h3&gt;

&lt;p&gt;Frameworks remove boilerplate.&lt;/p&gt;

&lt;p&gt;But they also introduce abstractions.&lt;/p&gt;

&lt;p&gt;Over time we found ourselves thinking more about LangGraph than about our own business logic.&lt;/p&gt;

&lt;p&gt;Instead of writing code like this:&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;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;retrieve&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;we were thinking about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;graph state&lt;/li&gt;
&lt;li&gt;edges&lt;/li&gt;
&lt;li&gt;node serialization&lt;/li&gt;
&lt;li&gt;execution checkpoints&lt;/li&gt;
&lt;li&gt;reducers&lt;/li&gt;
&lt;li&gt;graph configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The framework became part of the problem we had to understand.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Latency Adds Up
&lt;/h3&gt;

&lt;p&gt;Enterprise AI systems rarely perform a single LLM call.&lt;/p&gt;

&lt;p&gt;A typical request may involve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;authentication&lt;/li&gt;
&lt;li&gt;permission checks&lt;/li&gt;
&lt;li&gt;document retrieval&lt;/li&gt;
&lt;li&gt;reranking&lt;/li&gt;
&lt;li&gt;multiple tool calls&lt;/li&gt;
&lt;li&gt;citations&lt;/li&gt;
&lt;li&gt;persistence&lt;/li&gt;
&lt;li&gt;logging&lt;/li&gt;
&lt;li&gt;telemetry&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every layer matters.&lt;/p&gt;

&lt;p&gt;Although LangGraph itself wasn't "slow," the orchestration overhead became noticeable as workflows grew.&lt;/p&gt;

&lt;p&gt;We realized most of our requests were fundamentally sequential.&lt;/p&gt;

&lt;p&gt;We didn't need a graph engine to execute them.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Most Flows Aren't Actually Graphs
&lt;/h3&gt;

&lt;p&gt;This was probably our biggest realization.&lt;/p&gt;

&lt;p&gt;We assumed AI agents required graph execution.&lt;/p&gt;

&lt;p&gt;In practice, most enterprise workflows look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Receive request

↓

Understand intent

↓

Retrieve information

↓

Execute tools

↓

Generate answer

↓

Store results
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's just ordinary software.&lt;/p&gt;

&lt;p&gt;Very few requests actually branch into complex execution graphs.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Replaced It With
&lt;/h2&gt;

&lt;p&gt;Instead of building graphs, we started building small composable components.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request

↓

Planner

↓

Context Builder

↓

Tool Runner

↓

LLM

↓

Response Validator

↓

Persistence
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each component has one responsibility.&lt;/p&gt;

&lt;p&gt;Each component is independently testable.&lt;/p&gt;

&lt;p&gt;Each component can be benchmarked.&lt;/p&gt;

&lt;p&gt;Each component can be replaced.&lt;/p&gt;

&lt;p&gt;Most importantly:&lt;/p&gt;

&lt;p&gt;They're just Python classes.&lt;/p&gt;

&lt;p&gt;No graph engine.&lt;/p&gt;

&lt;p&gt;No special execution model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Everything Becomes Easier
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Easier Testing
&lt;/h3&gt;

&lt;p&gt;Each component can be unit tested.&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;planner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;tool_runner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;validator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No graph runtime required.&lt;/p&gt;

&lt;h3&gt;
  
  
  Easier Debugging
&lt;/h3&gt;

&lt;p&gt;Every request becomes a timeline.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;09:41:11 Planner

09:41:11 Retrieval

09:41:12 Tool

09:41:13 LLM

09:41:14 Validation

09:41:14 Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We immediately know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what happened&lt;/li&gt;
&lt;li&gt;how long it took&lt;/li&gt;
&lt;li&gt;which tool executed&lt;/li&gt;
&lt;li&gt;which documents were used&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Easier Observability
&lt;/h3&gt;

&lt;p&gt;Instead of visualizing graphs, we visualize requests.&lt;/p&gt;

&lt;p&gt;Each stage emits structured telemetry.&lt;/p&gt;

&lt;p&gt;Every LLM call.&lt;/p&gt;

&lt;p&gt;Every tool.&lt;/p&gt;

&lt;p&gt;Every database query.&lt;/p&gt;

&lt;p&gt;Every permission check.&lt;/p&gt;

&lt;p&gt;Everything is measurable.&lt;/p&gt;

&lt;p&gt;This has been far more valuable in production than visualizing node graphs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Easier to Scale
&lt;/h3&gt;

&lt;p&gt;Need another retrieval strategy?&lt;/p&gt;

&lt;p&gt;Replace one component.&lt;/p&gt;

&lt;p&gt;Need a different LLM?&lt;/p&gt;

&lt;p&gt;Swap the adapter.&lt;/p&gt;

&lt;p&gt;Need another vector database?&lt;/p&gt;

&lt;p&gt;Replace the retrieval implementation.&lt;/p&gt;

&lt;p&gt;Nothing else changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Are Graph Frameworks Bad?
&lt;/h2&gt;

&lt;p&gt;No.&lt;/p&gt;

&lt;p&gt;They're excellent for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;research&lt;/li&gt;
&lt;li&gt;experimentation&lt;/li&gt;
&lt;li&gt;complex planning&lt;/li&gt;
&lt;li&gt;autonomous multi-step reasoning&lt;/li&gt;
&lt;li&gt;recursive workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're exploring agent architectures, LangGraph is a great tool.&lt;/p&gt;

&lt;p&gt;But many enterprise AI applications don't actually need those capabilities.&lt;/p&gt;

&lt;p&gt;They need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;predictable execution&lt;/li&gt;
&lt;li&gt;observability&lt;/li&gt;
&lt;li&gt;security&lt;/li&gt;
&lt;li&gt;permissions&lt;/li&gt;
&lt;li&gt;auditing&lt;/li&gt;
&lt;li&gt;reliability&lt;/li&gt;
&lt;li&gt;maintainability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are traditional software engineering problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Powers yeos.ai Today
&lt;/h2&gt;

&lt;p&gt;Today, &lt;a href="https://yeos.ai" rel="noopener noreferrer"&gt;yeos.ai&lt;/a&gt; no longer uses LangGraph.&lt;/p&gt;

&lt;p&gt;Instead, we built a lightweight orchestration layer tailored to enterprise AI.&lt;/p&gt;

&lt;p&gt;Our architecture focuses on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;modular components instead of graph nodes&lt;/li&gt;
&lt;li&gt;explicit execution pipelines&lt;/li&gt;
&lt;li&gt;structured telemetry&lt;/li&gt;
&lt;li&gt;permission-aware retrieval&lt;/li&gt;
&lt;li&gt;deterministic tool execution&lt;/li&gt;
&lt;li&gt;auditability by design&lt;/li&gt;
&lt;li&gt;interchangeable LLM providers&lt;/li&gt;
&lt;li&gt;cloud and on-prem deployments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result is simpler to understand, easier to debug, and significantly easier to evolve.&lt;/p&gt;

&lt;p&gt;Ironically, removing a sophisticated framework made the overall system more powerful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Frameworks are fantastic for getting started.&lt;/p&gt;

&lt;p&gt;But every abstraction comes with a cost.&lt;/p&gt;

&lt;p&gt;As your platform grows, ask yourself an uncomfortable question:&lt;/p&gt;

&lt;p&gt;Are you solving your users' problems—or your framework's?&lt;/p&gt;

&lt;p&gt;For us, removing LangGraph reduced complexity, improved observability, and gave us full control over how AI requests move through our system.&lt;/p&gt;

&lt;p&gt;Sometimes the best architecture isn't the one with the most features.&lt;/p&gt;

&lt;p&gt;It's the one that's easiest for your team to understand six months later.&lt;/p&gt;

&lt;p&gt;Have you moved away from an AI framework—or doubled down on one? I'd love to hear what worked (or didn't) in your production systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;About yeos.ai&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://yeos.ai" rel="noopener noreferrer"&gt;yeos.ai&lt;/a&gt; is an enterprise AI platform that helps organizations search internal knowledge and automate business processes with AI agents. It supports secure cloud deployments in Switzerland as well as fully on-premise installations, giving organizations complete control over their data while providing production-grade observability and auditability.&lt;/p&gt;

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