An implementation of a supervisor multi-agent architecture using LangGraph
Project description
🤖 LangGraph Multi-Agent Supervisor
A Python library for creating hierarchical multi-agent systems using LangGraph. Hierarchical systems are a type of multi-agent architecture where specialized agents are coordinated by a central supervisor agent. The supervisor controls all communication flow and task delegation, making decisions about which agent to invoke based on the current context and task requirements.
Features
- 🤖 Create a supervisor agent to orchestrate multiple specialized agents
- 🛠️ Tool-based agent handoff mechanism for communication between agents
- 📝 Flexible message history management for conversation control
This library is built on top of LangGraph, a powerful framework for building agent applications, and comes with out-of-box support for streaming, short-term and long-term memory and human-in-the-loop
Installation
pip install langgraph-supervisor
Quickstart
Here's a simple example of a supervisor managing two specialized agents:
pip install langgraph-supervisor langchain-openai
export OPENAI_API_KEY=<your_api_key>
from langchain_openai import ChatOpenAI
from langgraph_supervisor import create_supervisor
from langgraph.prebuilt import create_react_agent
model = ChatOpenAI(model="gpt-4o")
# Create specialized agents
def add(a: float, b: float) -> float:
"""Add two numbers."""
return a + b
def multiply(a: float, b: float) -> float:
"""Multiply two numbers."""
return a * b
def web_search(query: str) -> str:
"""Search the web for information."""
return (
"Here are the headcounts for each of the FAANG companies in 2024:\n"
"1. **Facebook (Meta)**: 67,317 employees.\n"
"2. **Apple**: 164,000 employees.\n"
"3. **Amazon**: 1,551,000 employees.\n"
"4. **Netflix**: 14,000 employees.\n"
"5. **Google (Alphabet)**: 181,269 employees."
)
math_agent = create_react_agent(
model=model,
tools=[add, multiply],
name="math_expert",
prompt="You are a math expert. Always use one tool at a time."
)
research_agent = create_react_agent(
model=model,
tools=[web_search],
name="research_expert",
prompt="You are a world class researcher with access to web search. Do not do any math."
)
# Create supervisor workflow
workflow = create_supervisor(
[research_agent, math_agent],
model=model,
prompt=(
"You are a team supervisor managing a research expert and a math expert. "
"For current events, use research_agent. "
"For math problems, use math_agent."
)
)
# Compile and run
app = workflow.compile()
result = app.invoke({
"messages": [
{
"role": "user",
"content": "what's the combined headcount of the FAANG companies in 2024?"
}
]
})
Message History Management
You can control how agent messages are added to the overall conversation history of the multi-agent system:
Include full message history from an agent:
workflow = create_supervisor(
agents=[agent1, agent2],
output_mode="full_history"
)
Include only the final agent response:
workflow = create_supervisor(
agents=[agent1, agent2],
output_mode="last_message"
)
Multi-level Hierarchies
You can create multi-level hierarchical systems by creating a supervisor that manages multiple supervisors.
research_team = create_supervisor(
[research_agent, math_agent],
model=model,
supervisor_name="research_supervisor"
).compile(name="research_team")
writing_team = create_supervisor(
[writing_agent, publishing_agent],
model=model,
supervisor_name="writing_supervisor"
).compile(name="writing_team")
top_level_supervisor = create_supervisor(
[research_team, writing_team],
model=model,
supervisor_name="top_level_supervisor"
).compile(name="top_level_supervisor")
Adding Memory
You can add short-term and long-term memory to your supervisor multi-agent system. Since create_supervisor()
returns an instance of StateGraph
that needs to be compiled before use, you can directly pass a checkpointer or a store instance to the .compile()
method:
from langgraph.checkpoint.memory import InMemorySaver
from langgraph.store.memory import InMemoryStore
checkpointer = InMemorySaver()
store = InMemoryStore()
model = ...
research_agent = ...
math_agent = ...
workflow = create_supervisor(
[research_agent, math_agent],
model=model,
prompt="You are a team supervisor managing a research expert and a math expert.",
)
# Compile with checkpointer/store
app = workflow.compile(
checkpointer=checkpointer,
store=store
)
Using Functional API
Here's a simple example of a supervisor managing two specialized agentic workflows created using Functional API:
pip install langgraph-supervisor langchain-openai
export OPENAI_API_KEY=<your_api_key>
from langgraph.prebuilt import create_react_agent
from langgraph_supervisor import create_supervisor
from langchain_openai import ChatOpenAI
from langgraph.func import entrypoint, task
from langgraph.graph import add_messages
model = ChatOpenAI(model="gpt-4o")
# Create specialized agents
# Functional API - Agent 1 (Joke Generator)
@task
def generate_joke(messages):
"""First LLM call to generate initial joke"""
system_message = {
"role": "system",
"content": "Write a short joke"
}
msg = model.invoke(
[system_message] + messages
)
return msg
@entrypoint()
def joke_agent(state):
joke = generate_joke(state['messages']).result()
messages = add_messages(state["messages"], [joke])
return {"messages": messages}
joke_agent.name = "joke_agent"
# Graph API - Agent 2 (Research Expert)
def web_search(query: str) -> str:
"""Search the web for information."""
return (
"Here are the headcounts for each of the FAANG companies in 2024:\n"
"1. **Facebook (Meta)**: 67,317 employees.\n"
"2. **Apple**: 164,000 employees.\n"
"3. **Amazon**: 1,551,000 employees.\n"
"4. **Netflix**: 14,000 employees.\n"
"5. **Google (Alphabet)**: 181,269 employees."
)
research_agent = create_react_agent(
model=model,
tools=[web_search],
name="research_expert",
prompt="You are a world class researcher with access to web search. Do not do any math."
)
# Create supervisor workflow
workflow = create_supervisor(
[research_agent, joke_agent],
model=model,
prompt=(
"You are a team supervisor managing a research expert and a joke expert. "
"For current events, use research_agent. "
"For any jokes, use joke_agent."
)
)
# Compile and run
app = workflow.compile()
result = app.invoke({
"messages": [
{
"role": "user",
"content": "Share a joke to relax and start vibe coding for my next project idea."
}
]
})
for m in result["messages"]:
m.pretty_print()
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file langgraph_supervisor-0.0.10.tar.gz
.
File metadata
- Download URL: langgraph_supervisor-0.0.10.tar.gz
- Upload date:
- Size: 12.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 55f65e824a132f2e3e7819772e525b1055a4070a9e62e6012391c1f27af3024c |
|
MD5 | afa1462f04533bd2f1e6025de088a582 |
|
BLAKE2b-256 | 8d7d10aa925ffa86448a148f501120f0b3d71fe32e7679a364329d6513ca32cd |
File details
Details for the file langgraph_supervisor-0.0.10-py3-none-any.whl
.
File metadata
- Download URL: langgraph_supervisor-0.0.10-py3-none-any.whl
- Upload date:
- Size: 10.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 69cb375c128741eb1e6150b72172b03be9e525c63ca402d7be9c0fdf7ebaf482 |
|
MD5 | 307245093a5d0a003a9dab9f4f646bdb |
|
BLAKE2b-256 | b8e2513601bb3f7ad7f6134b5effd5ce5f1db29c0169880bbb8aa1a406b34d35 |