To help you ship LangGraph apps to production faster, check out LangSmith. LangSmith is a unified developer platform for building, testing, and monitoring LLM applications.
uv add langgraph
This library defines high-level APIs for creating and executing LangGraph agents and tools. It includes prebuilt components such as create_react_agent, ToolNode, validation helpers, and Agent Inbox schemas.
For full documentation, see the API reference. For conceptual guides and tutorials, see the LangGraph Docs.
[!IMPORTANT] This library is bundled with
langgraph; most users should installlanggraphinstead of installinglanggraph-prebuiltdirectly.
langgraph-prebuilt provides an implementation of a tool-calling ReAct-style agent - create_react_agent:
uv add langchain-anthropic
from langchain_anthropic import ChatAnthropic
from langgraph.prebuilt import create_react_agent
# Define the tools for the agent to use
def search(query: str):
"""Call to surf the web."""
# This is a placeholder, but don't tell the LLM that...
if "sf" in query.lower() or "san francisco" in query.lower():
return "It's 60 degrees and foggy."
return "It's 90 degrees and sunny."
tools = [search]
model = ChatAnthropic(model="claude-3-7-sonnet-latest")
app = create_react_agent(model, tools)
# run the agent
app.invoke(
{"messages": [{"role": "user", "content": "what is the weather in sf"}]},
)
langgraph-prebuilt provides an implementation of a node that executes tool calls - ToolNode:
from langgraph.prebuilt import ToolNode
from langchain_core.messages import AIMessage
def search(query: str):
"""Call to surf the web."""
# This is a placeholder, but don't tell the LLM that...
if "sf" in query.lower() or "san francisco" in query.lower():
return "It's 60 degrees and foggy."
return "It's 90 degrees and sunny."
tool_node = ToolNode([search])
tool_calls = [
{"name": "search", "args": {"query": "what is the weather in sf"}, "id": "1"}
]
ai_message = AIMessage(content="", tool_calls=tool_calls)
# execute tool call
tool_node.invoke({"messages": [ai_message]})
langgraph-prebuilt provides an implementation of a node that validates tool calls against a pydantic schema - ValidationNode:
from pydantic import BaseModel, field_validator
from langgraph.prebuilt import ValidationNode
from langchain_core.messages import AIMessage
class SelectNumber(BaseModel):
a: int
@field_validator("a")
def a_must_be_meaningful(cls, v):
if v != 37:
raise ValueError("Only 37 is allowed")
return v
validation_node = ValidationNode([SelectNumber])
validation_node.invoke(
{
"messages": [
AIMessage(
"", tool_calls=[{"name": "SelectNumber", "args": {"a": 42}, "id": "1"}]
)
]
}
)
The library contains schemas for using the Agent Inbox with LangGraph agents. Learn more about how to use Agent Inbox here.
from langgraph.types import interrupt
from langgraph.prebuilt.interrupt import HumanInterrupt, HumanResponse
def my_graph_function():
# Extract the last tool call from the `messages` field in the state
tool_call = state["messages"][-1].tool_calls[0]
# Create an interrupt
request: HumanInterrupt = {
"action_request": {
"action": tool_call['name'],
"args": tool_call['args']
},
"config": {
"allow_ignore": True,
"allow_respond": True,
"allow_edit": False,
"allow_accept": False
},
"description": _generate_email_markdown(state) # Generate a detailed markdown description.
}
# Send the interrupt request inside a list, and extract the first response
response = interrupt([request])[0]
if response['type'] == "response":
# Do something with the response
...
See our Releases and Versioning policies.
As an open-source project in a rapidly developing field, we are extremely open to contributions, whether it be in the form of a new feature, improved infrastructure, or better documentation.
For detailed information on how to contribute, see the Contributing Guide.
Project tools channel events into ToolCallStream handles.
Each tool-started event spawns a ToolCallStream, pushed onto
run.tool_calls. Subsequent tool-output-delta events append to
that s
Tool execution request passed to tool call interceptors.
ToolCall with additional context for graph state.
This is an internal data structure meant to help the ToolNode accept
tool calls with additional context (e.g. state) when dispatched using the
Send
An error occurred while invoking a tool due to invalid arguments.
This exception is only raised when invoking a tool using the ToolNode!
A node for executing tools in LangGraph workflows.
Handles tool execution patterns including function calls, state injection, persistent storage, and control flow. Manages parallel execution, error h
Runtime context automatically injected into tools.
This is distinct from Runtime (from langgraph.runtime), which is injected
into graph nodes and middleware. ToolRuntime inclu
Annotation for injecting graph state into tool arguments.
This annotation enables tools to access graph state without exposing state management details to the language model. Tools annotated with `In
Annotation for injecting persistent store into tool arguments.
This annotation enables tools to access LangGraph's persistent storage system without exposing storage details to the language model. To
Scoped view of a single tool call's lifecycle.
Yielded on run.tool_calls once per tool-started event. Fields
are populated as events arrive:
tool_call_id, tool_name, input: stable from tThe response provided by a human to an interrupt, which is returned when graph execution resumes.
The state of the agent.
The state of the agent.
The state of the agent with a structured response.
The state of the agent with a structured response.
A node that validates all tools requests from the last AIMessage.
It can be used either in StateGraph with a 'messages' key.
This node does not actually run the tools, it onl
Configuration that defines what actions are allowed for a human interrupt.
This controls the available interaction options when the graph is paused for human input.
Represents a request for human action within the graph execution.
Contains the action type and any associated arguments needed for the action.
Represents an interrupt triggered by the graph that requires human intervention.
This is passed to the interrupt function when execution is paused for human input.
Convert tool output to ToolMessage content format.
Handles str, list[dict] (content blocks), and arbitrary objects by attempting
JSON serialization with fallback to str().
Conditional routing function for tool-calling workflows.
This utility function implements the standard conditional logic for ReAct-style
agents: if the last AIMessage contains tool calls, route to
Creates an agent graph that calls tools in a loop until a stopping condition is met.
This function is deprecated in favor of
create_agent from