Skip to content

LangGraph Swarm

Classes:

  • SwarmState

    State schema for the multi-agent swarm.

Functions:

SwarmState

Bases: MessagesState

State schema for the multi-agent swarm.

create_swarm

create_swarm(
    agents: list[Pregel],
    *,
    default_active_agent: str,
    state_schema: StateSchemaType = SwarmState,
    config_schema: Type[Any] | None = None
) -> StateGraph

Create a multi-agent swarm.

Parameters:

  • agents (list[Pregel]) –

    List of agents to add to the swarm An agent can be a LangGraph CompiledStateGraph, a functional API workflow, or any other Pregel object.

  • default_active_agent (str) –

    Name of the agent to route to by default (if no agents are currently active).

  • state_schema (StateSchemaType, default: SwarmState ) –

    State schema to use for the multi-agent graph.

  • config_schema (Type[Any] | None, default: None ) –

    An optional schema for configuration. Use this to expose configurable parameters via swarm.config_specs.

Returns:

Example
from langgraph.checkpoint.memory import InMemorySaver
from langgraph.prebuilt import create_react_agent
from langgraph_swarm import create_handoff_tool, create_swarm

def add(a: int, b: int) -> int:
    '''Add two numbers'''
    return a + b

alice = create_react_agent(
    "openai:gpt-4o",
    [add, create_handoff_tool(agent_name="Bob")],
    prompt="You are Alice, an addition expert.",
    name="Alice",
)

bob = create_react_agent(
    "openai:gpt-4o",
    [create_handoff_tool(agent_name="Alice", description="Transfer to Alice, she can help with math")],
    prompt="You are Bob, you speak like a pirate.",
    name="Bob",
)

checkpointer = InMemorySaver()
workflow = create_swarm(
    [alice, bob],
    default_active_agent="Alice"
)
app = workflow.compile(checkpointer=checkpointer)

config = {"configurable": {"thread_id": "1"}}
turn_1 = app.invoke(
    {"messages": [{"role": "user", "content": "i'd like to speak to Bob"}]},
    config,
)
turn_2 = app.invoke(
    {"messages": [{"role": "user", "content": "what's 5 + 7?"}]},
    config,
)

add_active_agent_router

add_active_agent_router(
    builder: StateGraph,
    *,
    route_to: list[str],
    default_active_agent: str
) -> StateGraph

Add a router to the currently active agent to the StateGraph.

Parameters:

  • builder (StateGraph) –

    The graph builder (StateGraph) to add the router to.

  • route_to (list[str]) –

    A list of agent (node) names to route to.

  • default_active_agent (str) –

    Name of the agent to route to by default (if no agents are currently active).

Returns:

  • StateGraph

    StateGraph with the router added.

Example
from langgraph.checkpoint.memory import InMemorySaver
from langgraph.prebuilt import create_react_agent
from langgraph.graph import StateGraph
from langgraph_swarm import SwarmState, create_handoff_tool, add_active_agent_router

def add(a: int, b: int) -> int:
    '''Add two numbers'''
    return a + b

alice = create_react_agent(
    "openai:gpt-4o",
    [add, create_handoff_tool(agent_name="Bob")],
    prompt="You are Alice, an addition expert.",
    name="Alice",
)

bob = create_react_agent(
    "openai:gpt-4o",
    [create_handoff_tool(agent_name="Alice", description="Transfer to Alice, she can help with math")],
    prompt="You are Bob, you speak like a pirate.",
    name="Bob",
)

checkpointer = InMemorySaver()
workflow = (
    StateGraph(SwarmState)
    .add_node(alice, destinations=("Bob",))
    .add_node(bob, destinations=("Alice",))
)
# this is the router that enables us to keep track of the last active agent
workflow = add_active_agent_router(
    builder=workflow,
    route_to=["Alice", "Bob"],
    default_active_agent="Alice",
)

# compile the workflow
app = workflow.compile(checkpointer=checkpointer)

config = {"configurable": {"thread_id": "1"}}
turn_1 = app.invoke(
    {"messages": [{"role": "user", "content": "i'd like to speak to Bob"}]},
    config,
)
turn_2 = app.invoke(
    {"messages": [{"role": "user", "content": "what's 5 + 7?"}]},
    config,
)

Functions:

create_handoff_tool

create_handoff_tool(
    *,
    agent_name: str,
    name: str | None = None,
    description: str | None = None
) -> BaseTool

Create a tool that can handoff control to the requested agent.

Parameters:

  • agent_name (str) –

    The name of the agent to handoff control to, i.e. the name of the agent node in the multi-agent graph. Agent names should be simple, clear and unique, preferably in snake_case, although you are only limited to the names accepted by LangGraph nodes as well as the tool names accepted by LLM providers (the tool name will look like this: transfer_to_<agent_name>).

  • name (str | None, default: None ) –

    Optional name of the tool to use for the handoff. If not provided, the tool name will be transfer_to_<agent_name>.

  • description (str | None, default: None ) –

    Optional description for the handoff tool. If not provided, the tool description will be Ask agent <agent_name> for help.

Comments