142 lines
5.1 KiB
Plaintext
142 lines
5.1 KiB
Plaintext
Metadata-Version: 2.4
|
|
Name: langgraph-prebuilt
|
|
Version: 1.0.5
|
|
Summary: Library with high-level APIs for creating and executing LangGraph agents and tools.
|
|
Project-URL: Source, https://github.com/langchain-ai/langgraph/tree/main/libs/prebuilt
|
|
Project-URL: Twitter, https://x.com/LangChainAI
|
|
Project-URL: Slack, https://www.langchain.com/join-community
|
|
Project-URL: Reddit, https://www.reddit.com/r/LangChain/
|
|
License-Expression: MIT
|
|
License-File: LICENSE
|
|
Classifier: Development Status :: 5 - Production/Stable
|
|
Classifier: Programming Language :: Python
|
|
Classifier: Programming Language :: Python :: 3
|
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
Classifier: Programming Language :: Python :: 3.10
|
|
Classifier: Programming Language :: Python :: 3.11
|
|
Classifier: Programming Language :: Python :: 3.12
|
|
Classifier: Programming Language :: Python :: 3.13
|
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
Requires-Python: >=3.10
|
|
Requires-Dist: langchain-core>=1.0.0
|
|
Requires-Dist: langgraph-checkpoint<4.0.0,>=2.1.0
|
|
Description-Content-Type: text/markdown
|
|
|
|
# LangGraph Prebuilt
|
|
|
|
This library defines high-level APIs for creating and executing LangGraph agents and tools.
|
|
|
|
> [!IMPORTANT]
|
|
> This library is meant to be bundled with `langgraph`, don't install it directly
|
|
|
|
## Agents
|
|
|
|
`langgraph-prebuilt` provides an [implementation](https://langchain-ai.github.io/langgraph/reference/prebuilt/#langgraph.prebuilt.chat_agent_executor.create_react_agent) of a tool-calling [ReAct-style](https://langchain-ai.github.io/langgraph/concepts/agentic_concepts/#react-implementation) agent - `create_react_agent`:
|
|
|
|
```bash
|
|
pip install langchain-anthropic
|
|
```
|
|
|
|
```python
|
|
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"}]},
|
|
)
|
|
```
|
|
|
|
## Tools
|
|
|
|
### ToolNode
|
|
|
|
`langgraph-prebuilt` provides an [implementation](https://langchain-ai.github.io/langgraph/reference/prebuilt/#langgraph.prebuilt.tool_node.ToolNode) of a node that executes tool calls - `ToolNode`:
|
|
|
|
```python
|
|
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]})
|
|
```
|
|
|
|
### ValidationNode
|
|
|
|
`langgraph-prebuilt` provides an [implementation](https://langchain-ai.github.io/langgraph/reference/prebuilt/#langgraph.prebuilt.tool_validator.ValidationNode) of a node that validates tool calls against a pydantic schema - `ValidationNode`:
|
|
|
|
```python
|
|
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"}])]
|
|
})
|
|
```
|
|
|
|
## Agent Inbox
|
|
|
|
The library contains schemas for using the [Agent Inbox](https://github.com/langchain-ai/agent-inbox) with LangGraph agents. Learn more about how to use Agent Inbox [here](https://github.com/langchain-ai/agent-inbox#interrupts).
|
|
|
|
```python
|
|
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
|
|
...
|
|
``` |