<?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>Forem: Sohail Akbar</title>
    <description>The latest articles on Forem by Sohail Akbar (@sohail-akbar).</description>
    <link>https://forem.com/sohail-akbar</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%2F3122127%2Ff09d7c1f-20ba-429f-a1f1-63aeac2948b5.jpeg</url>
      <title>Forem: Sohail Akbar</title>
      <link>https://forem.com/sohail-akbar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/sohail-akbar"/>
    <language>en</language>
    <item>
      <title>The ultimate guide to AI agent architectures in 2025</title>
      <dc:creator>Sohail Akbar</dc:creator>
      <pubDate>Mon, 05 May 2025 14:22:14 +0000</pubDate>
      <link>https://forem.com/sohail-akbar/the-ultimate-guide-to-ai-agent-architectures-in-2025-2j1c</link>
      <guid>https://forem.com/sohail-akbar/the-ultimate-guide-to-ai-agent-architectures-in-2025-2j1c</guid>
      <description>&lt;p&gt;AI agent architectures have evolved dramatically over the past few years, creating new patterns for building intelligent systems that can reason, take actions, and achieve complex goals. This comprehensive guide examines the eight major architecture patterns that have emerged as standards in the field, providing detailed technical explanations, implementation examples, and practical guidance for selecting the right approach for your specific use case.&lt;/p&gt;

&lt;h2&gt;
  
  
  The evolution of AI agent design
&lt;/h2&gt;

&lt;p&gt;Traditional AI systems operate as isolated black boxes, responding to inputs without the ability to execute actions in the world or maintain ongoing context. Modern AI agents overcome these limitations by combining powerful language models with tools, memory systems, and sophisticated orchestration patterns.&lt;/p&gt;

&lt;p&gt;Each architecture pattern represents a different approach to solving key challenges in agent design: coordination, specialization, scalability, control flow, and human collaboration. Choosing the right architecture depends on your specific requirements, computational resources, and the complexity of the tasks your system needs to perform.&lt;/p&gt;

&lt;h2&gt;
  
  
  Single Agent + Tools
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Technical explanation
&lt;/h3&gt;

&lt;p&gt;The Single Agent + Tools architecture consists of one autonomous AI agent leveraging multiple external tools to accomplish tasks. This architecture follows a core design principle where a language model functions as the "brain" or reasoning engine that determines which actions to take and when to use tools.&lt;/p&gt;

&lt;p&gt;Key components include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Language Model&lt;/strong&gt;: Processes input, generates reasoning, and decides on actions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool Definitions&lt;/strong&gt;: Collection of tools with descriptions and function signatures&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory System&lt;/strong&gt;: Storage for conversation history and intermediate results&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Control Flow Logic&lt;/strong&gt;: Decision-making loop for tool selection&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execution Environment&lt;/strong&gt;: System that calls selected tools with appropriate parameters&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The control flow follows the ReAct (Reasoning + Acting) pattern:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Agent receives a query or task&lt;/li&gt;
&lt;li&gt;Agent generates reasoning about how to approach the task&lt;/li&gt;
&lt;li&gt;Agent selects an appropriate tool and determines input parameters&lt;/li&gt;
&lt;li&gt;Tool is executed and returns a result&lt;/li&gt;
&lt;li&gt;Agent observes the tool output and decides on next actions&lt;/li&gt;
&lt;li&gt;Loop continues until task completion&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Implementation example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain.agents&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AgentExecutor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;create_react_agent&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain_openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ChatOpenAI&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain_community.tools.tavily_search&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TavilySearchResults&lt;/span&gt;

&lt;span class="c1"&gt;# Define the tools
&lt;/span&gt;&lt;span class="n"&gt;search_tool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;TavilySearchResults&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_results&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;search_tool&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Initialize the LLM
&lt;/span&gt;&lt;span class="n"&gt;llm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ChatOpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Create the ReAct agent
&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create_react_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;agent_executor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AgentExecutor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Run the agent
&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;agent_executor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input&lt;/span&gt;&lt;span class="sh"&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;What is the current weather in San Francisco?&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;h3&gt;
  
  
  Use cases and performance
&lt;/h3&gt;

&lt;p&gt;This architecture excels in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Focused problem-solving&lt;/strong&gt;: Tasks requiring specific tools but manageable by a single decision-maker&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Information retrieval and synthesis&lt;/strong&gt;: Gathering data from different sources&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Personal assistants&lt;/strong&gt;: Systems handling diverse but independent user tasks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Performance metrics reveal that simple Single Agent + Tools architectures (like ReAct) can achieve similar accuracy to more complex architectures at &lt;strong&gt;significantly lower costs&lt;/strong&gt; - often 50% less expensive than complex architectures like Reflexion or LDB.&lt;/p&gt;

&lt;p&gt;On benchmarks like HumanEval, simple agent designs with strategic retries can match or exceed the performance of more complex architectures. However, consistency remains a challenge, with pass^8 scores (success rate across 8 attempts) typically falling below 50% on the τ-bench benchmark.&lt;/p&gt;

&lt;h3&gt;
  
  
  Technical limitations
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Context window constraints&lt;/strong&gt;: Single agents must manage all reasoning, tool usage, and memory within one context window&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool overload&lt;/strong&gt;: Performance decreases as the number of available tools increases (diminishing returns beyond 8-10 tools)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error propagation&lt;/strong&gt;: Mistakes in early reasoning cascade through the solution process&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Planning complexity&lt;/strong&gt;: Reduced performance on tasks requiring complex multi-step planning&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Mermaid.js flow chart diagram
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graph TD
    User[User Input] --&amp;gt; Agent[LLM Agent]
    Agent --&amp;gt; Decision{Need Tools?}
    Decision --&amp;gt;|Yes| ToolSelection[Tool Selection]
    Decision --&amp;gt;|No| DirectResponse[Generate Direct Response]
    ToolSelection --&amp;gt; ToolExecution[Tool Execution]
    ToolExecution --&amp;gt; ToolResult[Tool Result]
    ToolResult --&amp;gt; Agent
    DirectResponse --&amp;gt; Response[Final Response]
    Agent --&amp;gt; Memory[Memory System]
    Memory --&amp;gt; Agent

    subgraph "Single Agent + Tools Architecture"
        Agent
        Decision
        ToolSelection
        ToolExecution
        ToolResult
        DirectResponse
        Memory
    end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Sequential Agents
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Technical explanation
&lt;/h3&gt;

&lt;p&gt;The Sequential Agents architecture distributes work across multiple specialized agents that operate in a predetermined sequence. Each agent has a specific role and expertise, processing the output from previous agents and passing its results to subsequent agents in the chain.&lt;/p&gt;

&lt;p&gt;Key components include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multiple Specialized Agents&lt;/strong&gt;: Each with its own LLM, prompt, tools, and role&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflow Management&lt;/strong&gt;: System orchestrating information flow between agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State Management&lt;/strong&gt;: Mechanisms for sharing/preserving context between agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Communication Protocol&lt;/strong&gt;: Standardized formats for information exchange&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coordination Logic&lt;/strong&gt;: Rules determining transitions between agents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The control flow follows this pattern:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Initial agent receives the user query or task&lt;/li&gt;
&lt;li&gt;Agent processes input based on its specialized role and passes output to next agent&lt;/li&gt;
&lt;li&gt;Each subsequent agent refines or adds to the previous agent's work&lt;/li&gt;
&lt;li&gt;Final agent in the sequence produces the response to the user&lt;/li&gt;
&lt;li&gt;Optional feedback loops allow returning to previous stages when necessary&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Implementation example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Literal&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain_openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ChatOpenAI&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langgraph.graph&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;StateGraph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MessagesState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;START&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;END&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langgraph.types&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Command&lt;/span&gt;

&lt;span class="c1"&gt;# Initialize the models for each agent
&lt;/span&gt;&lt;span class="n"&gt;researcher_model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ChatOpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;analyst_model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ChatOpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;writer_model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ChatOpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-3.5-turbo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Define the agent nodes
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;researcher_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MessagesState&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Literal&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;analyst&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;END&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt;
    &lt;span class="c1"&gt;# Research information
&lt;/span&gt;    &lt;span class="n"&gt;research_results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;researcher_model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="c1"&gt;# Pass results to the analyst
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;update&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;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;HumanMessage&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;research_results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;researcher&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)]},&lt;/span&gt;
        &lt;span class="n"&gt;goto&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;analyst&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;# Send to the analyst agent next
&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;analyst_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MessagesState&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Literal&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;writer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;END&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt;
    &lt;span class="c1"&gt;# Analyze the research
&lt;/span&gt;    &lt;span class="n"&gt;analysis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;analyst_model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="c1"&gt;# Pass analysis to the writer
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;update&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;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;HumanMessage&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;analysis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;analyst&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)]},&lt;/span&gt;
        &lt;span class="n"&gt;goto&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;writer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;# Send to the writer agent next
&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;writer_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MessagesState&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Literal&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;END&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt;
    &lt;span class="c1"&gt;# Create the final response
&lt;/span&gt;    &lt;span class="n"&gt;final_response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;writer_model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="c1"&gt;# Return the final output
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;update&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;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;final_response&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
        &lt;span class="n"&gt;goto&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;END&lt;/span&gt;  &lt;span class="c1"&gt;# End the sequence
&lt;/span&gt;    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Create the graph
&lt;/span&gt;&lt;span class="n"&gt;workflow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;StateGraph&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MessagesState&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;researcher&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;researcher_node&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;analyst&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;analyst_node&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;writer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;writer_node&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Define the workflow sequence
&lt;/span&gt;&lt;span class="n"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_edge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;START&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;researcher&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Other edges are defined by the Command returns
&lt;/span&gt;
&lt;span class="c1"&gt;# Compile the graph
&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Use cases and performance
&lt;/h3&gt;

&lt;p&gt;Sequential Agents architecture excels in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Complex multi-stage workflows&lt;/strong&gt;: Tasks naturally breaking down into distinct phases&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Specialized expertise requirements&lt;/strong&gt;: When different parts require deep domain knowledge&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content creation pipelines&lt;/strong&gt;: Systems that research, analyze, and produce content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise workflows&lt;/strong&gt;: Business processes mirroring departmental handoffs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Performance metrics show:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Task completion rate&lt;/strong&gt;: 15-25% higher completion rates on complex tasks compared to single agent systems&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Specialization benefits&lt;/strong&gt;: 30-40% higher accuracy on domain-specific subtasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Robustness&lt;/strong&gt;: Greater resilience to individual agent failures&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource utilization&lt;/strong&gt;: More cost-effective by allocating expensive models only to steps that require them&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Technical limitations
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Communication overhead&lt;/strong&gt;: Information can be lost in transitions between agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error propagation&lt;/strong&gt;: Mistakes by early agents flow downstream and can be amplified&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orchestration complexity&lt;/strong&gt;: Managing information flow adds technical complexity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Latency concerns&lt;/strong&gt;: Sequential processing increases total processing time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limited adaptability&lt;/strong&gt;: Predetermined sequences struggle with unexpected paths&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Mermaid.js flow chart diagram
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graph TD
    User[User Input] --&amp;gt; Agent1[Agent 1: Research]
    Agent1 --&amp;gt; State1[Shared State]
    State1 --&amp;gt; Agent2[Agent 2: Analysis]
    Agent2 --&amp;gt; State2[Updated State]
    State2 --&amp;gt; Agent3[Agent 3: Response]
    Agent3 --&amp;gt; Response[Final Response]

    Agent1 --&amp;gt; Tool1A[Research Tool A]
    Agent1 --&amp;gt; Tool1B[Research Tool B]
    Tool1A --&amp;gt; Agent1
    Tool1B --&amp;gt; Agent1

    Agent2 --&amp;gt; Tool2A[Analysis Tool]
    Tool2A --&amp;gt; Agent2

    Agent3 --&amp;gt; Tool3A[Formatting Tool]
    Tool3A --&amp;gt; Agent3

    subgraph "Sequential Agents Architecture"
        Agent1
        State1
        Agent2
        State2
        Agent3
        Tool1A
        Tool1B
        Tool2A
        Tool3A
    end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Single Agent + MCP Servers + Tools
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Technical explanation
&lt;/h3&gt;

&lt;p&gt;The Single Agent + Model Context Protocol (MCP) Servers + Tools architecture is built on a client-server model that standardizes how AI models interact with external data sources and tools. This solves the "N×M problem" by transforming it into an "N+M problem" where standardization allows any client to work with any server.&lt;/p&gt;

&lt;p&gt;Key components include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Host Application&lt;/strong&gt;: User-facing AI application (Claude Desktop, VS Code, custom app)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP Client&lt;/strong&gt;: Lives within the host application, creates 1:1 connections with MCP servers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP Servers&lt;/strong&gt;: Expose external data and functionality through standardized API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tools, Resources, and Prompts&lt;/strong&gt;: Primary capabilities exposed by MCP servers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The control flow follows this pattern:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Initialization: Host application creates MCP clients that connect to servers&lt;/li&gt;
&lt;li&gt;Discovery: Clients request capability information from servers&lt;/li&gt;
&lt;li&gt;Context Provision: Host makes these capabilities available to the AI model&lt;/li&gt;
&lt;li&gt;Invocation: Model requests execution via the client when needed&lt;/li&gt;
&lt;li&gt;Execution: Server processes the request and returns results&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Implementation example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastmcp&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastMCP&lt;/span&gt;

&lt;span class="c1"&gt;# Create an MCP server
&lt;/span&gt;&lt;span class="n"&gt;mcp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastMCP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Calculator&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Define a tool
&lt;/span&gt;&lt;span class="nd"&gt;@mcp.tool&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;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&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;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Add two numbers&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;

&lt;span class="c1"&gt;# Define a resource
&lt;/span&gt;&lt;span class="nd"&gt;@mcp.resource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;greeting://{name}&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;get_greeting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&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;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Get a personalized greeting&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&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;Hello, &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&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="c1"&gt;# Start the server
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Use cases and performance
&lt;/h3&gt;

&lt;p&gt;This architecture excels in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;API Integrations&lt;/strong&gt;: Connecting AI models to services like GitHub, Slack, Google Drive&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Access&lt;/strong&gt;: Providing secure, controlled access to databases and file systems&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Development Workflows&lt;/strong&gt;: Enhancing code editors with AI capabilities&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-platform Interoperability&lt;/strong&gt;: Standardizing tool interfaces across platforms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Performance metrics show:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Efficiency&lt;/strong&gt;: MCP-enabled agents completed tasks &lt;strong&gt;37% faster&lt;/strong&gt; on average&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Success Rate&lt;/strong&gt;: Tasks had a higher completion rate (93% vs 78%) with MCP servers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Token Usage&lt;/strong&gt;: MCP implementations used 42% more tokens due to context caching&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Latency&lt;/strong&gt;: Tasks with MCP had a median latency of 1.2 seconds vs. 1.8 seconds without&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Technical limitations
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Context Management&lt;/strong&gt;: Tool descriptions consume significant context window space&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication&lt;/strong&gt;: Lacks standardized authentication mechanism&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt;: Current implementations focus on local use cases&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment Complexity&lt;/strong&gt;: Managing multiple MCP servers requires additional infrastructure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt;: Tools with execution capabilities need careful sandboxing&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Mermaid.js flow chart diagram
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart TB
    User[User] --&amp;gt;|Interacts with| Host[Host Application]
    Host --&amp;gt;|Creates| Client[MCP Client]
    Client --&amp;gt;|Connects to 1:1| Server[MCP Server]
    Server --&amp;gt;|Accesses| DataSource[Data Sources/APIs]

    subgraph "Host Application"
        Model[LLM Model]
        Client
        Host --&amp;gt;|Sends prompt| Model
        Model --&amp;gt;|Requests tool| Client
        Client --&amp;gt;|Returns result| Model
    end

    subgraph "MCP Server"
        Tools[Tools]
        Resources[Resources]
        Prompts[Prompts]
        Server --&amp;gt;|Registers| Tools
        Server --&amp;gt;|Registers| Resources
        Server --&amp;gt;|Registers| Prompts
    end

    Client --&amp;gt;|Discovers capabilities| Server
    Client --&amp;gt;|Calls tool| Server
    Server --&amp;gt;|Executes| Tools
    Server --&amp;gt;|Provides| Resources
    Server --&amp;gt;|Templates| Prompts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Agents Hierarchy + Parallel Agents + Shared Tools
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Technical explanation
&lt;/h3&gt;

&lt;p&gt;The Agents Hierarchy + Parallel Agents + Shared Tools architecture creates a system of multiple specialized agents organized in a hierarchical structure, with parallel execution capability and access to shared tools.&lt;/p&gt;

&lt;p&gt;Key components include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Supervisor Agents&lt;/strong&gt;: Higher-level agents managing workflow, delegating tasks, synthesizing results&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Worker Agents&lt;/strong&gt;: Specialized agents with expertise in specific domains&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared Tools&lt;/strong&gt;: External capabilities accessible to multiple agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State Management&lt;/strong&gt;: Mechanism for maintaining/sharing context between agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Control Flow&lt;/strong&gt;: Logic determining agent interactions and control transfer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The control flow follows this pattern:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User input received by top-level supervisor agent&lt;/li&gt;
&lt;li&gt;Supervisor analyzes task and delegates subtasks to appropriate workers&lt;/li&gt;
&lt;li&gt;Worker agents execute tasks in parallel using shared tools&lt;/li&gt;
&lt;li&gt;Results flow back to supervisor for integration and synthesis&lt;/li&gt;
&lt;li&gt;Complex tasks may involve multiple hierarchical levels with mid-level supervisors&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Implementation example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;google.adk.agents&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;LlmAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SequentialAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ParallelAgent&lt;/span&gt;

&lt;span class="c1"&gt;# Create specialized worker agents
&lt;/span&gt;&lt;span class="n"&gt;research_agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LlmAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Researcher&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;instruction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Research the provided topic and gather key information.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;search_tool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;browser_tool&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;analysis_agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LlmAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Analyst&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;instruction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Analyze the research findings and identify key insights.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;stats_tool&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;writing_agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LlmAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Writer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;instruction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Write a comprehensive report based on the analysis.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;document_tool&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Create a parallel research stage
&lt;/span&gt;&lt;span class="n"&gt;research_stage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ParallelAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ResearchStage&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;sub_agents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="nc"&gt;LlmAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MarketResearcher&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instruction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Research market trends.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nc"&gt;LlmAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CompetitorResearcher&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instruction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Research competitors.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Create the full workflow
&lt;/span&gt;&lt;span class="n"&gt;workflow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SequentialAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ReportGenerator&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;sub_agents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="n"&gt;research_stage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;analysis_agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;writing_agent&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Use cases and performance
&lt;/h3&gt;

&lt;p&gt;This architecture excels in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Complex Research Tasks&lt;/strong&gt;: Breaking down research into specialized subtasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content Creation&lt;/strong&gt;: Coordinating research, analysis, writing across multiple agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-domain Problem Solving&lt;/strong&gt;: Tasks requiring expertise across different domains&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Processing Pipelines&lt;/strong&gt;: Processing large datasets with different agents handling stages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Performance metrics show:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Task Completion Rate&lt;/strong&gt;: 25-40% higher completion rate on complex tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solution Quality&lt;/strong&gt;: 18% higher quality scores on knowledge-intensive tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execution Time&lt;/strong&gt;: 30-60% reduction in total task time through parallel execution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adaptability&lt;/strong&gt;: 45% better performance when adapting to new or modified tasks&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Technical limitations
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Coordination Overhead&lt;/strong&gt;: Managing communication introduces complexity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error Propagation&lt;/strong&gt;: Errors in one agent can cascade through the system&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State Management&lt;/strong&gt;: Maintaining consistent state across agents requires careful design&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Development Complexity&lt;/strong&gt;: More complex code and architecture compared to single-agent systems&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistency&lt;/strong&gt;: Ensuring consistent responses across different agents is challenging&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Mermaid.js flow chart diagram
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart TB
    User[User] --&amp;gt;|Input| TopSupervisor[Top-Level Supervisor]

    subgraph "Management Layer"
        TopSupervisor --&amp;gt;|Delegates| MidSupervisor1[Mid-Level Supervisor 1]
        TopSupervisor --&amp;gt;|Delegates| MidSupervisor2[Mid-Level Supervisor 2]
        MidSupervisor1 --&amp;gt;|Reports| TopSupervisor
        MidSupervisor2 --&amp;gt;|Reports| TopSupervisor
    end

    subgraph "Worker Layer 1"
        MidSupervisor1 --&amp;gt;|Assigns| Worker1[Worker Agent 1]
        MidSupervisor1 --&amp;gt;|Assigns| Worker2[Worker Agent 2]
        Worker1 --&amp;gt;|Reports| MidSupervisor1
        Worker2 --&amp;gt;|Reports| MidSupervisor1
    end

    subgraph "Worker Layer 2"
        MidSupervisor2 --&amp;gt;|Assigns| Worker3[Worker Agent 3]
        MidSupervisor2 --&amp;gt;|Assigns| Worker4[Worker Agent 4]
        Worker3 --&amp;gt;|Reports| MidSupervisor2
        Worker4 --&amp;gt;|Reports| MidSupervisor2
    end

    subgraph "Shared Tools"
        Tools1[Search Tool]
        Tools2[Database Tool]
        Tools3[API Tool]
        Tools4[Compute Tool]
    end

    Worker1 --&amp;gt;|Uses| Tools1
    Worker2 --&amp;gt;|Uses| Tools2
    Worker3 --&amp;gt;|Uses| Tools1
    Worker3 --&amp;gt;|Uses| Tools3
    Worker4 --&amp;gt;|Uses| Tools4

    TopSupervisor --&amp;gt;|Result| User
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Single Agent + Tools + Router
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Technical explanation
&lt;/h3&gt;

&lt;p&gt;The Single Agent + Tools + Router architecture represents a modular approach where an LLM acts as the central decision-making entity that selects from a predefined set of paths or actions. This architecture enables structured decision-making with limited but focused control.&lt;/p&gt;

&lt;p&gt;Key components include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Single Agent&lt;/strong&gt;: LLM serving as the core reasoning engine&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tools&lt;/strong&gt;: External functions, APIs, or capabilities the agent can invoke&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Router&lt;/strong&gt;: Mechanism allowing the LLM to select a single step from specified options&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The control flow follows this pattern:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User provides input query or command&lt;/li&gt;
&lt;li&gt;Router analyzes input and decides which tool or path to invoke&lt;/li&gt;
&lt;li&gt;Selected tool is executed with appropriate parameters&lt;/li&gt;
&lt;li&gt;Result is returned to the user&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This architecture exhibits a limited level of control because the LLM typically makes a single decision per interaction, producing a specific output from predefined options.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementation example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langgraph.graph&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;StateGraph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;START&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;END&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langgraph_core.messages&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AIMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HumanMessage&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langgraph.checkpoint.memory&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;MemorySaver&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Literal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TypedDict&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain_openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ChatOpenAI&lt;/span&gt;

&lt;span class="c1"&gt;# Define the state schema
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;State&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TypedDict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;
    &lt;span class="n"&gt;next_step&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;

&lt;span class="c1"&gt;# Initialize LLM
&lt;/span&gt;&lt;span class="n"&gt;llm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ChatOpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4-turbo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Define tools
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;search_tool&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="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Performs a web search with the given query.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="c1"&gt;# Simplified implementation
&lt;/span&gt;    &lt;span class="k"&gt;return&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;Search results for: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;database_tool&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="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Queries a database with the given query.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="c1"&gt;# Simplified implementation
&lt;/span&gt;    &lt;span class="k"&gt;return&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;Database results for: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calculator_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expression&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="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Evaluates a mathematical expression.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="c1"&gt;# Simplified implementation
&lt;/span&gt;    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&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;Result: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expression&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Invalid expression&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# Define router function
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;router_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Routes to the appropriate tool based on input.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="c1"&gt;# Get the last message
&lt;/span&gt;    &lt;span class="n"&gt;last_message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&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="c1"&gt;# LLM reasoning to determine which tool to use
&lt;/span&gt;    &lt;span class="n"&gt;prompt&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="s"&gt;
    Based on the following user query, determine which tool to use:
    Query: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;last_message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;

    Available tools:
    1. search_tool - For general information queries
    2. database_tool - For specific data retrieval
    3. calculator_tool - For mathematical calculations

    Respond with only one of: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;search&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;database&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;calculator&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;, or &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;none&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&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;# Return the chosen route
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;next_step&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Build the graph
&lt;/span&gt;&lt;span class="n"&gt;workflow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;StateGraph&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Add nodes
&lt;/span&gt;&lt;span class="n"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;router&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;router_node&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;search&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;execute_search&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;database&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;execute_database&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;calculator&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;execute_calculator&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;direct&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;direct_response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Add edges
&lt;/span&gt;&lt;span class="n"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_edge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;START&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;router&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_edge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;router&lt;/span&gt;&lt;span class="sh"&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;search&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;next_step&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;search&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_edge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;router&lt;/span&gt;&lt;span class="sh"&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;database&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;next_step&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;database&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_edge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;router&lt;/span&gt;&lt;span class="sh"&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;calculator&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;next_step&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;calculator&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_edge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;router&lt;/span&gt;&lt;span class="sh"&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;direct&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;next_step&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;none&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;h3&gt;
  
  
  Use cases and performance
&lt;/h3&gt;

&lt;p&gt;This architecture excels in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Customer Service Chatbots&lt;/strong&gt;: Routing queries to appropriate departments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Information Retrieval Systems&lt;/strong&gt;: Determining whether to use search, document retrieval, or database queries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-domain Assistants&lt;/strong&gt;: Handling diverse requests by redirecting to specialized subsystems&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service Orchestration&lt;/strong&gt;: Directing requests to various microservices based on intent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Performance metrics show:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Routing Accuracy&lt;/strong&gt;: Sophisticated routing systems can achieve 85-95% accuracy on well-defined domains&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Task Success Rate&lt;/strong&gt;: High-performing routed systems achieve 80-90% task completion rates compared to 65-75% with single general-purpose agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Latency&lt;/strong&gt;: Router architectures can reduce overall latency by 30-40%&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool Selection Quality&lt;/strong&gt;: Top models like Claude 3.5 achieve scores of 0.91, GPT-4o around 0.90&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Technical limitations
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Scope Boundary Issues&lt;/strong&gt;: Struggles with ambiguous queries that don't fit predefined categories&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lack of Flexibility&lt;/strong&gt;: Limited to predefined paths, difficult to handle novel requests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context Preservation&lt;/strong&gt;: Maintaining context between tools can be challenging&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scaling Complexity&lt;/strong&gt;: Decision-making becomes more error-prone as tool numbers increase&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limited Multi-Step Reasoning&lt;/strong&gt;: Less suitable for complex tasks requiring multiple interrelated steps&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Mermaid.js flow chart diagram
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart TD
    User[User] --&amp;gt;|Query| Router[Router LLM]

    subgraph "Single Agent + Tools + Router"
        Router --&amp;gt;|Web Query| Search[Search Tool]
        Router --&amp;gt;|Data Query| Database[Database Tool]
        Router --&amp;gt;|Math Expression| Calculator[Calculator Tool]
        Router --&amp;gt;|General Query| DirectResponse[Direct LLM Response]

        Search --&amp;gt; Results[Process Results]
        Database --&amp;gt; Results
        Calculator --&amp;gt; Results
        DirectResponse --&amp;gt; Results
    end

    Results --&amp;gt; Response[Response to User]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Single Agent + Human in the Loop + Tools
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Technical explanation
&lt;/h3&gt;

&lt;p&gt;The Single Agent + Human in the Loop + Tools architecture integrates human oversight and intervention into an AI agent's workflow. This creates a collaborative process where the AI handles routine operations but defers to human judgment for critical decisions or uncertain scenarios.&lt;/p&gt;

&lt;p&gt;Key components include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Single Agent&lt;/strong&gt;: LLM serving as the core reasoning and action component&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tools&lt;/strong&gt;: External functions, APIs, or capabilities the agent can leverage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human in the Loop&lt;/strong&gt;: Mechanism for human intervention, approval, editing, or guidance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The control flow typically works as follows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User provides initial query or command&lt;/li&gt;
&lt;li&gt;Agent processes input and develops a plan&lt;/li&gt;
&lt;li&gt;At predetermined checkpoints, agent pauses and awaits human input&lt;/li&gt;
&lt;li&gt;Human provides feedback, approvals, or corrections&lt;/li&gt;
&lt;li&gt;Agent incorporates human input and continues execution&lt;/li&gt;
&lt;li&gt;Cycle repeats until task completion&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Implementation example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TypedDict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Literal&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langgraph.graph&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;StateGraph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;START&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;END&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langgraph.types&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;interrupt&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langgraph.checkpoint.memory&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;MemorySaver&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain_core.messages&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;HumanMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AIMessage&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain_anthropic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ChatAnthropic&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain_core.tools&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;tool&lt;/span&gt;

&lt;span class="c1"&gt;# Define the state schema
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AgentState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TypedDict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;
    &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;

&lt;span class="c1"&gt;# Set up the LLM
&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ChatAnthropic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-3-sonnet-20240229&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Define tools
&lt;/span&gt;&lt;span class="nd"&gt;@tool&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;search&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="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Call to search the web.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="c1"&gt;# Simplified implementation
&lt;/span&gt;    &lt;span class="k"&gt;return&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;Search results for: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="nd"&gt;@tool&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;email_send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;to&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;subject&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;body&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="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Send an email. Requires human approval.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="c1"&gt;# This is a sensitive operation that requires human approval
&lt;/span&gt;    &lt;span class="k"&gt;return&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;Email to &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; with subject &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; would be sent.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# Define human approval node
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;human_approval_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;AgentState&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Request human approval for sensitive operations.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="c1"&gt;# Get the last message from the agent
&lt;/span&gt;    &lt;span class="n"&gt;last_message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&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="n"&gt;content&lt;/span&gt;

    &lt;span class="c1"&gt;# Pause execution and wait for human input
&lt;/span&gt;    &lt;span class="n"&gt;approval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;interrupt&lt;/span&gt;&lt;span class="p"&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;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;last_message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;approval_request&lt;/span&gt;&lt;span class="sh"&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;The agent wants to send an email. Do you approve this action? (yes/no)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;approval&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="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;&lt;span class="sh"&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;y&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="c1"&gt;# Human approved, continue with the operation
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&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;approved&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Human rejected, cancel the operation
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&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;rejected&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;h3&gt;
  
  
  Use cases and performance
&lt;/h3&gt;

&lt;p&gt;This architecture excels in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;High-Stakes Domains&lt;/strong&gt;: Healthcare, legal, and financial applications&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content Creation and Moderation&lt;/strong&gt;: Systems with human quality control&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customer Support Escalation&lt;/strong&gt;: Systems that escalate complex issues to humans&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Semi-Autonomous Systems&lt;/strong&gt;: Robots or autonomous systems requiring human approval&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Performance metrics show:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Intervention Rate&lt;/strong&gt;: Well-designed systems reduce human intervention by 60-70%&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decision Quality&lt;/strong&gt;: 15-25% improvement in outcome quality with human oversight&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time Efficiency&lt;/strong&gt;: 40-60% reduction in task completion time compared to fully manual processes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error Rate Reduction&lt;/strong&gt;: 50-80% reduction in critical errors compared to fully automated systems&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Technical limitations
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Latency and Throughput&lt;/strong&gt;: Human intervention creates bottlenecks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Staffing Requirements&lt;/strong&gt;: Requires available human operators&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interface Design Challenges&lt;/strong&gt;: Creating effective interfaces for quick decision-making&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context Preservation&lt;/strong&gt;: Maintaining context across interruptions is challenging&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scaling Limitations&lt;/strong&gt;: Human component makes scaling difficult for large request volumes&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Mermaid.js flow chart diagram
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart TD
    User[User] --&amp;gt;|Query| Agent[LLM Agent]

    subgraph "Single Agent + Human in the Loop + Tools"
        Agent --&amp;gt;|Non-sensitive task| Tools[Tools Execution]
        Agent --&amp;gt;|Sensitive task| HumanApproval[Human Approval]

        HumanApproval --&amp;gt;|Approved| Tools
        HumanApproval --&amp;gt;|Rejected| Rejection[Task Rejection]

        Tools --&amp;gt; Agent
        Rejection --&amp;gt; Agent

        Agent --&amp;gt;|Uncertain response| HumanEdit[Human Edit]
        HumanEdit --&amp;gt; Agent
    end

    Agent --&amp;gt;|Final response| User
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Single Agent + Dynamically Call Other Agents
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Technical explanation
&lt;/h3&gt;

&lt;p&gt;The Single Agent + Dynamically Call Other Agents architecture follows a hub-and-spoke model where a primary agent serves as the central orchestrator with the ability to dynamically invoke specialized secondary agents as needed.&lt;/p&gt;

&lt;p&gt;Key components include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Primary Agent&lt;/strong&gt;: Central orchestrator that processes requests, determines which specialized agent to call&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Specialized Agents&lt;/strong&gt;: Task-specific agents performing particular functions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orchestration Layer&lt;/strong&gt;: Manages communication between primary and specialized agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic Routing Mechanism&lt;/strong&gt;: Logic for determining which specialized agent to invoke&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The control flow follows this pattern:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Primary agent receives user input and processes it&lt;/li&gt;
&lt;li&gt;Primary agent determines whether to handle the task or delegate&lt;/li&gt;
&lt;li&gt;If delegation is needed, primary agent selects appropriate specialized agent&lt;/li&gt;
&lt;li&gt;Specialized agent executes its task using specific capabilities/tools&lt;/li&gt;
&lt;li&gt;Results returned to primary agent for integration&lt;/li&gt;
&lt;li&gt;Primary agent maintains control and can call additional agents as needed&lt;/li&gt;
&lt;li&gt;Once all required tasks are completed, primary agent synthesizes final output&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Implementation example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Literal&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain_openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ChatOpenAI&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langgraph.types&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Command&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langgraph.graph&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;StateGraph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MessagesState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;START&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;END&lt;/span&gt;

&lt;span class="c1"&gt;# Define the primary model
&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ChatOpenAI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Primary agent function that decides which specialized agent to call
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;primary_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MessagesState&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Literal&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;specialized_agent_1&lt;/span&gt;&lt;span class="sh"&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;specialized_agent_2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;END&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt;
    &lt;span class="c1"&gt;# Process the state and determine the next step
&lt;/span&gt;    &lt;span class="c1"&gt;# This could include analyzing user input to decide which specialized agent to call
&lt;/span&gt;    &lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Logic to determine which specialized agent to call
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;financial&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;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&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="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;goto&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;specialized_agent_1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;technical&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;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&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="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;goto&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;specialized_agent_2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Handle the task directly and finish
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;goto&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;END&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Define specialized agent functions
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;specialized_agent_1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MessagesState&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Financial specialist agent logic
&lt;/span&gt;    &lt;span class="c1"&gt;# This agent has access to financial tools and data
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&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;role&lt;/span&gt;&lt;span class="sh"&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;assistant&lt;/span&gt;&lt;span class="sh"&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;content&lt;/span&gt;&lt;span class="sh"&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;Financial analysis completed.&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;specialized_agent_2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MessagesState&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Technical specialist agent logic
&lt;/span&gt;    &lt;span class="c1"&gt;# This agent has access to technical tools and documentation
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&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;role&lt;/span&gt;&lt;span class="sh"&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;assistant&lt;/span&gt;&lt;span class="sh"&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;content&lt;/span&gt;&lt;span class="sh"&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;Technical analysis completed.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}]}&lt;/span&gt;

&lt;span class="c1"&gt;# Create the workflow graph
&lt;/span&gt;&lt;span class="n"&gt;workflow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;StateGraph&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MessagesState&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;primary_agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;primary_agent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;specialized_agent_1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;specialized_agent_1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;specialized_agent_2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;specialized_agent_2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Define the flow connections
&lt;/span&gt;&lt;span class="n"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_edge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;START&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;primary_agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_edge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;primary_agent&lt;/span&gt;&lt;span class="sh"&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;specialized_agent_1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_edge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;primary_agent&lt;/span&gt;&lt;span class="sh"&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;specialized_agent_2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_edge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;primary_agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;END&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_edge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;specialized_agent_1&lt;/span&gt;&lt;span class="sh"&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;primary_agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_edge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;specialized_agent_2&lt;/span&gt;&lt;span class="sh"&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;primary_agent&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;h3&gt;
  
  
  Use cases and performance
&lt;/h3&gt;

&lt;p&gt;This architecture excels in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Complex Multi-Domain Tasks&lt;/strong&gt;: When requests span multiple expertise domains&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflow Orchestration&lt;/strong&gt;: Managing complex workflows with specialized handling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Efficiency Optimization&lt;/strong&gt;: When specialized agents are expensive and should only be invoked when necessary&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customer Support Systems&lt;/strong&gt;: Where a general agent handles basic inquiries but routes complex topics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Performance metrics show:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Decision Accuracy&lt;/strong&gt;: Properly designed routing improves overall accuracy by 15-25%&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Latency&lt;/strong&gt;: Adds 100-300ms in routing decision time but often saves time through immediate specialized engagement&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource Efficiency&lt;/strong&gt;: Reduces token usage by 30-40% compared to single large agent approach&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Task Completion Rate&lt;/strong&gt;: Improves complex task completion rates by up to 20%&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Technical limitations
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Routing Complexity&lt;/strong&gt;: Primary agent must make accurate decisions about when to delegate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context Management&lt;/strong&gt;: Transferring necessary context between primary and specialized agents is challenging&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coordination Overhead&lt;/strong&gt;: Additional complexity in managing state and communication&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inconsistent Response Styles&lt;/strong&gt;: Different agents may have distinct response styles&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cold Start Problems&lt;/strong&gt;: Primary agent may make suboptimal routing decisions initially&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Mermaid.js flow chart diagram
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart TD
    User((User)) --&amp;gt; PrimaryAgent

    subgraph PrimaryAgentSystem
        PrimaryAgent[Primary Agent] --&amp;gt; RouterMechanism[Router Mechanism]
        RouterMechanism --&amp;gt; Decision{Needs Specialized\nAgent?}
        Decision --&amp;gt;|No| DirectProcessing[Process Directly]
        Decision --&amp;gt;|Yes| AgentSelection[Select Specialized Agent]

        AgentSelection --&amp;gt; Agent1Call[Call Agent 1]
        AgentSelection --&amp;gt; Agent2Call[Call Agent 2]
        AgentSelection --&amp;gt; AgentNCall[Call Agent N]

        Agent1Call --&amp;gt; ResultIntegration
        Agent2Call --&amp;gt; ResultIntegration
        AgentNCall --&amp;gt; ResultIntegration

        DirectProcessing --&amp;gt; ResultIntegration[Integrate Results]
        ResultIntegration --&amp;gt; FinalResponse[Generate Final Response]
    end

    subgraph SpecializedAgents
        Agent1[Financial Agent]
        Agent2[Technical Agent]
        AgentN[Domain N Agent]
    end

    Agent1Call --&amp;gt; Agent1
    Agent2Call --&amp;gt; Agent2
    AgentNCall --&amp;gt; AgentN

    Agent1 --&amp;gt; Agent1Result[Agent 1 Result]
    Agent2 --&amp;gt; Agent2Result[Agent 2 Result]
    AgentN --&amp;gt; AgentNResult[Agent N Result]

    Agent1Result --&amp;gt; ResultIntegration
    Agent2Result --&amp;gt; ResultIntegration
    AgentNResult --&amp;gt; ResultIntegration

    FinalResponse --&amp;gt; User
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Agents Hierarchy + Loop + Parallel Agents + Shared RAG
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Technical explanation
&lt;/h3&gt;

&lt;p&gt;The "Agents Hierarchy + Loop + Parallel Agents + Shared RAG" architecture combines multiple advanced patterns to create a sophisticated multi-agent system. This architecture integrates hierarchical control structures, feedback loops, parallel execution, and shared knowledge through Retrieval Augmented Generation.&lt;/p&gt;

&lt;p&gt;Key components include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agent Hierarchy&lt;/strong&gt;: 

&lt;ul&gt;
&lt;li&gt;Supervisor Agent(s): Top-level agents coordinating workflow and delegation&lt;/li&gt;
&lt;li&gt;Middle-Tier Agents: Domain-specific agents that can further delegate&lt;/li&gt;
&lt;li&gt;Specialist Agents: Focused agents with specific tools or capabilities&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Loop Mechanism&lt;/strong&gt;: Enables iterative refinement through feedback cycles&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Parallel Execution Framework&lt;/strong&gt;: Allows multiple agents to work simultaneously&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Shared RAG System&lt;/strong&gt;: Central knowledge store accessible to all agents&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Inter-Agent Communication Protocol&lt;/strong&gt;: Standardized messaging system&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;The control flow follows this pattern:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Supervisor agent receives input and decomposes it into subtasks&lt;/li&gt;
&lt;li&gt;Subtasks assigned to appropriate middle-tier or specialist agents&lt;/li&gt;
&lt;li&gt;Multiple agents work in parallel on different subtasks&lt;/li&gt;
&lt;li&gt;Agents access/update shared RAG knowledge store as needed&lt;/li&gt;
&lt;li&gt;Feedback loops allow iterative refinement of partial results&lt;/li&gt;
&lt;li&gt;Results from parallel processes are aggregated and synthesized&lt;/li&gt;
&lt;li&gt;Final results are composed through hierarchy and presented to user&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Implementation example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TypedDict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Annotated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Literal&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain_openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ChatOpenAI&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langgraph.graph&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;StateGraph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MessagesState&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langgraph.types&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Command&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain.tools&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseTool&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain_core.messages&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AIMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HumanMessage&lt;/span&gt;

&lt;span class="c1"&gt;# Define the state schema
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AgentState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TypedDict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;shared_knowledge&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# Shared RAG store
&lt;/span&gt;    &lt;span class="n"&gt;current_agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;iteration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;

&lt;span class="c1"&gt;# Initialize models for different agents
&lt;/span&gt;&lt;span class="n"&gt;supervisor_model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ChatOpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;research_model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ChatOpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;analysis_model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ChatOpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;writing_model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ChatOpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Define RAG tools for knowledge retrieval and updating
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RagRetrieveTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseTool&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rag_retrieve&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Retrieves information from the shared knowledge base&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&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="n"&gt;knowledge_base&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;dict&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;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Implement vector search or other retrieval mechanism
&lt;/span&gt;        &lt;span class="n"&gt;relevant_knowledge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;knowledge_base&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;query&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="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&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="k"&gt;return&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;relevant_knowledge&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Define agent functions
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;supervisor_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;AgentState&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Literal&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;research_agent&lt;/span&gt;&lt;span class="sh"&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;analysis_agent&lt;/span&gt;&lt;span class="sh"&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;writing_agent&lt;/span&gt;&lt;span class="sh"&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;complete&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt;
    &lt;span class="c1"&gt;# Supervisor logic to delegate tasks
&lt;/span&gt;    &lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;iteration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;iteration&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="c1"&gt;# Analyze the current state and decide which agent to call next
&lt;/span&gt;    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;supervisor_model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&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;role&lt;/span&gt;&lt;span class="sh"&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;system&lt;/span&gt;&lt;span class="sh"&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;content&lt;/span&gt;&lt;span class="sh"&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;You are a supervisor agent coordinating a team of specialized agents.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;
    &lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="c1"&gt;# Logic to determine next agent based on response content
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;research&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;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&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="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;goto&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;research_agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;analysis&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;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&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="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;goto&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;analysis_agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;writing&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;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&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="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;goto&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;writing_agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;goto&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;complete&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;h3&gt;
  
  
  Use cases and performance
&lt;/h3&gt;

&lt;p&gt;This architecture excels in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Complex Research Tasks&lt;/strong&gt;: Research broken down into specialized subtasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content Creation&lt;/strong&gt;: Coordinating research, analysis, writing, and editing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-domain Problem Solving&lt;/strong&gt;: Tasks requiring diverse expertise&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Processing Pipelines&lt;/strong&gt;: Processing large datasets across different stages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Performance metrics show:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Task Completion Speed&lt;/strong&gt;: 40-60% reduction in completion time for complex tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quality of Output&lt;/strong&gt;: 25-35% improvement in output quality for tasks requiring diverse expertise&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Knowledge Utilization&lt;/strong&gt;: 50-70% better knowledge utilization across agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adaptability&lt;/strong&gt;: 30-45% better adaptation to changing requirements during execution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error Reduction&lt;/strong&gt;: Hierarchical review processes reduce error rates by 20-30%&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Technical limitations
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Complexity Management&lt;/strong&gt;: Intricate architecture creates significant complexity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coordination Overhead&lt;/strong&gt;: Communication management reduces efficiency gains for simpler tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Concurrency Challenges&lt;/strong&gt;: Parallel agents accessing shared resources require concurrency control&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource Consumption&lt;/strong&gt;: Running multiple agents in parallel increases computational cost&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debugging Difficulty&lt;/strong&gt;: Tracing issues through complex system with loops is significantly harder&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Mermaid.js flow chart diagram
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart TD
    User((User)) --&amp;gt; Supervisor

    subgraph AgentHierarchy
        Supervisor[Supervisor Agent] --&amp;gt; ResearchTeam
        Supervisor --&amp;gt; AnalysisTeam
        Supervisor --&amp;gt; WritingTeam

        subgraph ResearchTeam
            ResearchLead[Research Lead] --&amp;gt; Researcher1
            ResearchLead --&amp;gt; Researcher2
            ResearchLead --&amp;gt; Researcher3
        end

        subgraph AnalysisTeam
            AnalysisLead[Analysis Lead] --&amp;gt; Analyst1
            AnalysisLead --&amp;gt; Analyst2
        end

        subgraph WritingTeam
            WritingLead[Writing Lead] --&amp;gt; Writer1
            WritingLead --&amp;gt; Editor1
        end
    end

    subgraph SharedKnowledge
        RAGSystem[(Shared RAG System)]
    end

    %% Parallel Execution Connections
    Researcher1 &amp;amp; Researcher2 &amp;amp; Researcher3 -.-&amp;gt;|Parallel Execution| ResearchResults
    Analyst1 &amp;amp; Analyst2 -.-&amp;gt;|Parallel Execution| AnalysisResults

    %% Knowledge Access
    Researcher1 &amp;amp; Researcher2 &amp;amp; Researcher3 &amp;lt;--&amp;gt;|Query/Update| RAGSystem
    Analyst1 &amp;amp; Analyst2 &amp;lt;--&amp;gt;|Query/Update| RAGSystem
    Writer1 &amp;amp; Editor1 &amp;lt;--&amp;gt;|Query/Update| RAGSystem

    %% Results Flow
    ResearchResults --&amp;gt; AnalysisTeam
    AnalysisResults --&amp;gt; WritingTeam
    WritingTeam --&amp;gt; DraftReport

    %% Feedback Loops
    DraftReport --&amp;gt;|Feedback Loop| ReviewProcess
    ReviewProcess --&amp;gt;|Needs Revision| WritingTeam
    ReviewProcess --&amp;gt;|Needs More Analysis| AnalysisTeam
    ReviewProcess --&amp;gt;|Needs More Research| ResearchTeam
    ReviewProcess --&amp;gt;|Approved| FinalReport

    %% Output
    FinalReport --&amp;gt; Supervisor
    Supervisor --&amp;gt; User
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Implementation Frameworks
&lt;/h2&gt;

&lt;h3&gt;
  
  
  LangChain
&lt;/h3&gt;

&lt;p&gt;LangChain is a foundational framework for creating applications powered by language models. It provides components for building chains of language model calls, integrating with external data sources, and creating agents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core Components&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chains&lt;/strong&gt;: Sequences of calls to LLMs and other utilities&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompts&lt;/strong&gt;: Templates and systems for managing input to LLMs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory&lt;/strong&gt;: Systems for managing conversational state&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tools&lt;/strong&gt;: Integrations with external systems (APIs, databases, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agents&lt;/strong&gt;: Components that use LLMs to determine which actions to take&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Architecture Support&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Single Agent + Tools&lt;/strong&gt;: Excellent support with extensive tool integration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sequential Agents&lt;/strong&gt;: Supported through chains with sequential calls&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hierarchical Agents&lt;/strong&gt;: Basic support, requires more configuration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parallel Agents&lt;/strong&gt;: Limited native support for true parallelism&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Unique Features&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Extensive Integrations&lt;/strong&gt;: Vast ecosystem of tools and models&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexibility&lt;/strong&gt;: Adaptable to many use cases and architectures&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Abstraction&lt;/strong&gt;: Consistent interface across LLM providers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Limitations&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Complexity&lt;/strong&gt;: Overwhelming for beginners due to many components&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Standardization Issues&lt;/strong&gt;: Multiple approaches to accomplish the same task&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rapidly Evolving API&lt;/strong&gt;: Breaking changes are frequent&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  LangGraph
&lt;/h3&gt;

&lt;p&gt;LangGraph extends LangChain by providing stateful graph-based workflows for agent orchestration. This allows for complex workflows with multiple agents, cycles, and conditional branching.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core Components&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Graph Structure&lt;/strong&gt;: Nodes representing agents or functions, connected by edges&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State Management&lt;/strong&gt;: Tools for tracking and updating state across workflow steps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Checkpointers&lt;/strong&gt;: Mechanisms to persist state across interactions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory Management&lt;/strong&gt;: Control over memory architecture and persistence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Architecture Support&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sequential Agents&lt;/strong&gt;: Excellent support through explicit graph definition&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hierarchical Agents&lt;/strong&gt;: Strong support using subgraphs and supervisor patterns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parallel Agents&lt;/strong&gt;: Good support through map-reduce patterns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Looping &amp;amp; Feedback&lt;/strong&gt;: Native support for iterative processes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Unique Features&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Graph-Based Architecture&lt;/strong&gt;: Explicitly model agent workflows as graphs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stateful Execution&lt;/strong&gt;: Built-in memory and state management&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human-in-the-Loop&lt;/strong&gt;: Support for human intervention in workflows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time-Travel Debugging&lt;/strong&gt;: Ability to rewind and explore alternative paths&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Limitations&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Learning Curve&lt;/strong&gt;: Graph-based approach requires new mental model&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complexity in Setup&lt;/strong&gt;: More verbose for simple agent tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LangChain Dependency&lt;/strong&gt;: Tightly coupled with LangChain ecosystem&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  AutoGen
&lt;/h3&gt;

&lt;p&gt;AutoGen is a Microsoft-developed framework focused on building conversational agents. It treats workflows as conversations between agents, emphasizing simplicity and human-like interactions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core Components&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Conversable Agents&lt;/strong&gt;: Base agents capable of receiving/sending messages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assistant Agent&lt;/strong&gt;: AI-driven agent using LLMs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User Proxy Agent&lt;/strong&gt;: Represents human or automated system&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Group Chat Manager&lt;/strong&gt;: Coordinates multi-agent conversations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event-Driven Architecture&lt;/strong&gt;: Asynchronous messaging for agent interactions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Architecture Support&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Single Agent + Tools&lt;/strong&gt;: Supported through agent-specific tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sequential Agents&lt;/strong&gt;: Implemented as conversational turns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hierarchical Agents&lt;/strong&gt;: Supported through nested conversations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parallel Agents&lt;/strong&gt;: Good support for concurrent execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Unique Features&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Conversational Paradigm&lt;/strong&gt;: Natural agent-to-agent interaction&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code Execution&lt;/strong&gt;: Strong support for code generation and execution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No-code GUI&lt;/strong&gt;: AutoGen Studio for visual agent development&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise Features&lt;/strong&gt;: Advanced error handling and reliability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Limitations&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Conversation Management&lt;/strong&gt;: Complexity increases with many agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Less Structured Control Flow&lt;/strong&gt;: Compared to graph-based approaches&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visual Debugging&lt;/strong&gt;: Limited visualization of agent interactions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  CrewAI
&lt;/h3&gt;

&lt;p&gt;CrewAI is a lightweight framework built from scratch, designed for creating role-playing autonomous AI agents with emphasis on simplicity and team collaboration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core Components&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agent&lt;/strong&gt;: Autonomous units with roles, goals, and backstories&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Task&lt;/strong&gt;: Work to be performed with expected outputs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crew&lt;/strong&gt;: Collection of agents assembled for tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Process&lt;/strong&gt;: Orchestration pattern (sequential, hierarchical)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tools&lt;/strong&gt;: Capabilities for external system interaction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Architecture Support&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sequential Agents&lt;/strong&gt;: Excellent support through sequential process&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hierarchical Agents&lt;/strong&gt;: Strong support through hierarchical process&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parallel Agents&lt;/strong&gt;: Supported through asynchronous execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Unique Features&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Role-Based Design&lt;/strong&gt;: Intuitive agent role definition with goals and backstories&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Standalone Framework&lt;/strong&gt;: Built without dependencies on other frameworks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developer Experience&lt;/strong&gt;: Clean API and intuitive structure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Process Patterns&lt;/strong&gt;: Clear execution patterns for different needs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Limitations&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Newer Framework&lt;/strong&gt;: Less mature ecosystem compared to alternatives&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limited Advanced Features&lt;/strong&gt;: Fewer built-in capabilities for complex behaviors&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation Depth&lt;/strong&gt;: Good basics but fewer complex examples&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tools and Integrations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  OpenAI APIs
&lt;/h3&gt;

&lt;p&gt;OpenAI offers several API endpoints that serve as the foundation for many agent implementations:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Chat Completions API&lt;/strong&gt;: Core API for interacting with models like GPT-4&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assistants API&lt;/strong&gt;: Simplified way to build agent-like applications with built-in memory and tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Function Calling&lt;/strong&gt;: Structured way for models to invoke external functions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tools Integration&lt;/strong&gt;: Support for function calling, file handling, and code interpretation&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Memory Systems
&lt;/h3&gt;

&lt;p&gt;Memory systems enable agents to recall previous interactions and maintain context:&lt;/p&gt;

&lt;h4&gt;
  
  
  Simple Memory
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ConversationBufferMemory&lt;/strong&gt;: Stores the verbatim history of all messages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ConversationSummaryMemory&lt;/strong&gt;: Maintains a summary of conversation history&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VectorStoreMemory&lt;/strong&gt;: Uses embeddings to store and retrieve relevant memories&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  MemGPT (Advanced Memory)
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Two-Tier Memory&lt;/strong&gt;: Core context memory (in LLM context) and archival memory (external)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-Editing Memory&lt;/strong&gt;: LLM can update its own memory to learn and adapt&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Virtual Context Management&lt;/strong&gt;: Similar to OS virtual memory with paging&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interrupt System&lt;/strong&gt;: For managing control flow between agent and user&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Integration Tools
&lt;/h3&gt;

&lt;p&gt;Modern agent architectures leverage various integrations to extend their capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google Calendar/Gmail&lt;/strong&gt;: Schedule meetings, send emails, manage events&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notion&lt;/strong&gt;: Document and knowledge base integration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Atlassian Tools&lt;/strong&gt;: Jira and Confluence integration for project management&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitLab/GitHub&lt;/strong&gt;: Version control and code repository integration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HubSpot&lt;/strong&gt;: CRM integration for customer data management&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microsoft SQL&lt;/strong&gt;: Database integration for structured data access&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Product Compass Newsletter
&lt;/h2&gt;

&lt;p&gt;The Product Compass Newsletter, run by Paweł Huryn, has become a significant voice in the AI agent architecture space. With over 100,000 subscribers, it focuses on providing actionable insights for product managers, particularly regarding AI product management, discovery, and strategy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key insights on AI agent architectures
&lt;/h3&gt;

&lt;p&gt;The newsletter offers several frameworks regarding AI agent architectures:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Agents vs. LLMs distinction&lt;/strong&gt;: While LLMs respond to individual prompts without considering long-term objectives, AI agents address limitations including lack of tool interaction, memory, and collaboration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Agentic Workflows Framework&lt;/strong&gt;: The newsletter describes how AI agent frameworks follow either linear or hierarchical workflows, where agents collaborate in a structured way. This works particularly well for process-driven tasks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;"Agents 1.0 vs. Agents 2.0"&lt;/strong&gt;: Current agent capabilities ("Agents 1.0") follow structured workflows, while future agents ("Agents 2.0") will support true agent collaboration and adaptive, emergent behaviors.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Multi-Agent Benefits&lt;/strong&gt;: The newsletter outlines benefits of multiple specialized agents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Improved reasoning when different AI models collaborate&lt;/li&gt;
&lt;li&gt;Collective intelligence through the Mixture of Agents approach&lt;/li&gt;
&lt;li&gt;More flexibility for complex workflows&lt;/li&gt;
&lt;li&gt;Cost efficiency using smaller, specialized models&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deep Market Researcher Architecture&lt;/strong&gt;: The newsletter details this agent's workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First browses the web to gather context&lt;/li&gt;
&lt;li&gt;Uses context to plan work for specialized "researchers"&lt;/li&gt;
&lt;li&gt;Each researcher focuses on a specific area with key questions&lt;/li&gt;
&lt;li&gt;All researchers work in parallel&lt;/li&gt;
&lt;li&gt;Finally, an LLM combines all findings into a comprehensive report&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  AI agent implementations
&lt;/h3&gt;

&lt;p&gt;The newsletter has developed several practical AI agent implementations through its aigents.pm platform:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Deep Market Researcher&lt;/strong&gt;: Fully autonomous AI agent for comprehensive research&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PRD Generator&lt;/strong&gt;: For creating Product Requirement Documents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PM Resume Reviewer&lt;/strong&gt;: For optimizing product management resumes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Product Strategist&lt;/strong&gt;: For strategic product planning&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Product Trio&lt;/strong&gt;: For exploring diverse ideas and perspectives&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Selecting the right architecture
&lt;/h2&gt;

&lt;p&gt;When selecting an architecture pattern for your AI agent system, consider these key factors:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Task complexity&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simple, focused tasks → Single Agent + Tools&lt;/li&gt;
&lt;li&gt;Multi-domain tasks → Single Agent + Dynamic Call Other Agents&lt;/li&gt;
&lt;li&gt;Complex, multi-stage tasks → Sequential Agents&lt;/li&gt;
&lt;li&gt;Complex research or content creation → Agents Hierarchy + Parallel Agents&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Specialization needs&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;General-purpose capabilities → Single Agent architectures&lt;/li&gt;
&lt;li&gt;Deep domain expertise → Multi-agent architectures&lt;/li&gt;
&lt;li&gt;Standardized tool access → MCP Servers approach&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Control and oversight&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;High-stakes domains → Human in the Loop&lt;/li&gt;
&lt;li&gt;Predefined workflows → Sequential Agents&lt;/li&gt;
&lt;li&gt;Adaptive workflows → Hierarchical architectures&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Resource constraints&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Limited compute → Simpler architectures with fewer agents&lt;/li&gt;
&lt;li&gt;Performance priority → Specialized multi-agent systems&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Framework selection&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rapid prototyping → CrewAI or LangChain&lt;/li&gt;
&lt;li&gt;Complex workflows → LangGraph&lt;/li&gt;
&lt;li&gt;Conversational systems → AutoGen&lt;/li&gt;
&lt;li&gt;Enterprise requirements → Consider AutoGen or LangGraph&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The AI agent ecosystem continues to evolve rapidly, with each architecture pattern offering distinct advantages for specific use cases. By understanding the strengths, limitations, and technical implementation details of each pattern, you can build more effective, scalable, and maintainable AI agent systems.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>machinelearning</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
