LangGraph 中如何实现状态注入:InjectedState

📅 2026/7/6 2:58:40
LangGraph 中如何实现状态注入:InjectedState
注入状态指的是让工具函数能够直接访问 LangGraph 图的当前状态如定义的AgentState同时这个状态参数对 LLM 是不可见的。也就是说LLM 在决定调用工具时不会、也不需要去生成这个参数它由 LangGraph 框架自动填充。这样做的好处是安全且解耦工具内部可以按需读取或更新上下文如何实现实现状态注入的核心是使用langgraph.prebuilt.InjectedState这个特殊的类型注解并结合ToolNode来执行工具1. 定义带注入状态参数的工具在工具函数中为需要接收状态的那个参数添加Annotated[状态类型, InjectedState]注解from typing import Annotated from langgraph.prebuilt import InjectedState from langchain_core.tools import tool # 假设状态定义如下 class AgentState(TypedDict): messages: Annotated[Sequence[BaseMessage], add_messages] document: str # 新增的文档字段 tool def update_document(content: str, state: Annotated[AgentState, InjectedState]) - str: 使用新内容更新当前文档。 # 直接读取和修改状态 old_content state.get(document, ) state[document] content return f文档已更新。\n旧内容: {old_content}\n新内容: {content}在这个例子里content: str是正常的工具参数由 LLM 根据提示词和工具描述来生成state: Annotated[AgentState, InjectedState]则是一个注入参数。InjectedState注解告诉ToolNode在执行时自动将当前的AgentState对象传递给这个参数关键点LLM 对此参数无感知LLM 在生成工具调用时只会生成content字段不会生成state字段state由系统在后台注入支持注入子字段也可以只注入状态中的某个特定字段如Annotated[str, InjectedState(document)]这样工具的这个参数就会直接接收到state[document]的值2. 使用ToolNode执行工具用ToolNode包装工具列表并将其作为图中的一个节点。ToolNode会自动处理InjectedState注解的参数注入from langgraph.prebuilt import ToolNode tools [update_document, save_document] tool_node ToolNode(tools) # ... 在图构建中 ... graph.add_node(tools, tool_node)3. 在Agent节点中绑定工具并调用在主Agent节点函数中将工具列表绑定到模型并处理模型的响应from langchain_openai import ChatOpenAI model ChatOpenAI(modelmimo-v2.5-pro).bind_tools(tools) def our_agent(state: AgentState) - AgentState: # 构造消息并调用模型 response model.invoke([system_prompt] state[messages]) return {messages: [response]} # 响应可能包含 tool_calls注意事项ToolNode是必须的InjectedState注解的自动处理依赖于ToolNode的执行上下文。如果通过其他方式直接调用工具函数注入可能不会生效检查点与状态更新直接在工具中修改的state对象它的变更会在图执行过程中被checkpointer如果配置了自动记录下来从而实现对话记忆或状态回滚功能因此可以放心地修改它