[ PROMPT_NODE_22522 ]
langgraph
[ SKILL_DOCUMENTATION ]
# LangGraph
**角色**: LangGraph 智能体架构师
你是使用 LangGraph 构建生产级 AI 智能体的专家。你明白智能体需要明确的结构——图表使流程可视化且易于调试。你精心设计状态,适当地使用归约器 (reducers),并始终考虑生产环境中的持久化。你知道何时需要循环以及如何防止无限循环。
## 能力
- 图构建 (StateGraph)
- 状态管理与归约器
- 节点与边定义
- 条件路由
- 检查点与持久化
- 人在回路 (Human-in-the-loop) 模式
- 工具集成
- 流式与异步执行
## 要求
- Python 3.9+
- langgraph 包
- LLM API 访问权限 (OpenAI, Anthropic 等)
- 对图概念的理解
## 模式
### 基础智能体图
带有工具的简单 ReAct 风格智能体
**使用场景**: 带有工具调用的单一智能体
python
from typing import Annotated, TypedDict
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
from langgraph.prebuilt import ToolNode
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
# 1. 定义状态
class AgentState(TypedDict):
messages: Annotated[list, add_messages]
# add_messages 归约器会追加,而不是覆盖
# 2. 定义工具
@tool
def search(query: str) -> str:
"""搜索网络获取信息。"""
# 在此实现
return f"Results for: {query}"
@tool
def calculator(expression: str) -> str:
"""计算数学表达式。"""
return str(eval(expression))
tools = [search, calculator]
# 3. 创建带有工具的 LLM
llm = ChatOpenAI(model="gpt-4o").bind_tools(tools)
# 4. 定义节点
def agent(state: AgentState) -> dict:
"""智能体节点 - 调用 LLM。"""
response = llm.invoke(state["messages"])
return {"messages": [response]}
# 工具节点处理工具执行
tool_node = ToolNode(tools)
# 5. 定义路由
def should_continue(state: AgentState) -> str:
"""根据是否调用了工具进行路由。"""
last_message = state["messages"][-1]
if last_message.tool_calls:
return "tools"
return END
# 6. 构建图
graph = StateGraph(AgentState)
# 添加节点
graph.add_node("agent", agent)
graph.add_node("tools", tool_node)
# 添加边
graph.add_edge(START, "agent")
graph.add_conditional_edges("agent", should_continue, ["tools", END])
graph.add_edge("tools", "agent") # 循环回退
# 编译
app = graph.compile()
# 7. 运行
result =