管理 (下))
3.5. 预定义状态3.5.1. MessagesStateLangGraph构建的计算图通常会和LLM结合使用而LLM在运行过程中通常需要维护一组消息列表。为了提升开发效率LangGraph官方提供了一个预定义状态类型langgraph.graph.message.MessagesState。开发者可以直接继承该状态类型并在其基础上扩展自定义状态字段。源码如下class MessagesState(TypedDict): messages: Annotated[list[AnyMessage], add_messages]由此可知MessagesState只有一个字段messages。该字段的类型是列表元素类型为AnyMessage同时它通过Annotated绑定了内置Reducer函数add_messages。add_messages的完全限定名英文全称fully qualified name是langgraph.graph.message.add_messages正是上文 3.2.2.3.2 节介绍的内置Reducer函数。示例如下from typing import NotRequired from langgraph.graph import StateGraph, START, END from langgraph.graph.message import MessagesState from langchain_core.messages import HumanMessage from langchain_deepseek import ChatDeepSeek from dotenv import load_dotenv load_dotenv(verboseTrue) model ChatDeepSeek( modeldeepseek-v4-flash, extra_body{thinking: {type: enabled}}, ) class OverAllState(MessagesState): username: str output: NotRequired[str] # 关键改为可选 # 不返回 output让它保持未设置状态或者返回空字符串 def node_a(state: OverAllState) - OverAllState: return { messages: [HumanMessage(content你好我是 state[username])], username: state[username], } def llm_node(state: OverAllState) - OverAllState: res model.invoke(state[messages]) return { messages: [res], username: state[username], output: res.content, } builder StateGraph(state_schemaOverAllState) builder.add_node(llm_node, llm_node) builder.add_node(node_a, node_a) builder.add_edge(START, node_a) builder.add_edge(node_a, llm_node) builder.add_edge(llm_node, END) graph builder.compile() result graph.invoke({username: 小黄}) print(result)输出如下{ messages: [ HumanMessage( content你好我是 小黄, additional_kwargs{}, response_metadata{}, id155e1ef4-5bbc-4250-b978-62a7a5918cef, ), AIMessage( content你好呀小黄 我是DeepSeek很高兴认识你有什么我可以帮你的吗无论是聊天、解答问题、帮你写作、编程还是其他任何需要尽管告诉我吧你名字里的“黄”是哪个黄呀, additional_kwargs{ refusal: None, }, response_metadata{ token_usage: { completion_tokens: 57, prompt_tokens: 10, total_tokens: 67, completion_tokens_details: None, prompt_tokens_details: { audio_tokens: None, cached_tokens: 0, }, prompt_cache_hit_tokens: 0, prompt_cache_miss_tokens: 10, }, model_provider: deepseek, model_name: deepseek-v4-flash, system_fingerprint: fp_8b330d02d0_prod0820_fp8_kvcache_20260402, id: 17d57633-2ffb-4af3-be87-b3d58f9acd2b, finish_reason: stop, logprobs: None, }, idlc_run--019e6890-4544-7212-b4f2-aa20fc079911-0, tool_calls[], invalid_tool_calls[], usage_metadata{ input_tokens: 10, output_tokens: 57, total_tokens: 67, input_token_details: { cache_read: 0, }, output_token_details: {}, }, ), ], username: 小黄, output: 你好呀小黄 我是DeepSeek很高兴认识你有什么我可以帮你的吗无论是聊天、解答问题、帮你写作、编程还是其他任何需要尽管告诉我吧你名字里的“黄”是哪个黄呀, }上述案例中OverAllState继承了MessagesState因此可用的状态字段为messages username output只关注messages状态执行流程如下node_a返回一条HumanMessageLangGraph使用add_messages将该消息合并到messages状态字段中llm_node从state[messages]中读取完整消息列表并调用模型llm_node将模型生成的AIMessage作为状态更新返回LangGraph再次通过add_messages将AIMessage合并到messages中最终状态中包含完整消息列表。MessagesState帮开发者预先定义好了messages字段及其合并规则。在构建聊天机器人、Agent、工具调用流程、多轮对话流程时它可以提升开发效率。3.5.2. AgentStateAgentState是LangChain Agent内部使用的状态类型。由于LangChain Agent底层也是基于LangGraph运行图构建的所以从技术上讲开发者也可以将AgentState或其子类作为自定义LangGraph的状态类型。AgentState的全类名也可以称为类的完全限定名英文全称fully qualified class name是langchain.agents.middleware.types.AgentState源码如下class AgentState(TypedDict, Generic[ResponseT]): State schema for the agent. messages: Required[Annotated[list[AnyMessage], add_messages]] jump_to: NotRequired[Annotated[JumpTo | None, EphemeralValue, PrivateStateAttr]] structured_response: NotRequired[Annotated[ResponseT, OmitFromInput]]该状态中主要包含三个字段。messagesmessages: Required[Annotated[list[AnyMessage], add_messages]]messages用于存储 Agent 运行过程中的消息列表。该字段和MessagesState中的messages字段类似也使用add_messages作为Reducer。jump_tojump_to: NotRequired[Annotated[JumpTo | None, EphemeralValue, PrivateStateAttr]]jump_to是LangChain Agent内部使用的控制字段主要服务于 Agent 中间件体系。它通常用于表示运行流程的跳转意图例如某些中间件希望影响 Agent 后续应该进入哪个节点。需要注意的是jump_to并不是普通 LangGraph 状态图中的通用跳转机制。在自定义StateGraph中即使状态中定义了jump_to字段LangGraph也不会因为该字段的值自动跳转到某个节点。普通LangGraph运行图如果需要控制后续流向通常应使用Command(gotonode_name)见下文。structured_responsestructured_response: NotRequired[Annotated[ResponseT, OmitFromInput]]structured_response用于存储 Agent 最终生成的结构化输出。当使用LangChain Agent的结构化输出能力时例如指定response_formatAgent 最终生成的结构化结果通常会被写入该字段。其中OmitFromInput表示该字段不应作为外部输入字段暴露给调用方而是由 Agent 运行过程中内部生成。总体来看AgentState是专门为 LangChain Agent 运行时设计的状态类型。因此在普通自定义LangGraph项目中一般不建议直接基于AgentState扩展图状态。