You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

LangGraph Agent自主更新内部状态报错,求正确实现方式

LangGraph Agent自主更新内部状态报错,求正确实现方式

看起来你踩了LangGraph工具更新状态的两个核心坑:一是ToolMessage必须和对应的工具调用绑定(携带tool_call_id),二是你误解了Command.update的能力——它完全支持更新自定义的状态字段,只是之前的写法没满足消息追溯的要求。

错误原因拆解

你收到的ValueError本质是LangGraph的消息历史一致性校验:每一条LLM发起的工具调用请求(ToolCall消息),必须有一条对应的ToolMessage,而且这个ToolMessage必须通过tool_call_id和原请求绑定。你之前返回的ToolMessage没有带这个ID,导致LangGraph无法匹配到对应的工具调用,所以报错。

另外,错误提示里举ToolMessage的例子,不是说只能更新messages字段,而是提醒你必须先满足消息追溯的要求,之后完全可以同时更新自定义的state字段。

正确实现方式

核心是给工具函数加上tool_call_id参数(LangGraph会自动注入这个值,对应LLM生成的工具调用ID),然后构造带ID的ToolMessage,同时在Command里正常更新自定义字段。

修正后的完整代码片段如下:

from langchain.agents import create_agent
from langchain.messages import ToolMessage
from langgraph.types import Command
from langgraph.graph import MessagesState
from langchain.tools import tool

CONFIG = ...

class MyState(MessagesState):
    user_name: str

class MyAgent:
    def __init__(self):
        @tool
        def update_name(new_name: str, tool_call_id: str) -> Command:
            """Call this function when you need to update the internal state with a new user name"""
            # 1. 构造带tool_call_id的ToolMessage,关联对应的工具调用
            success_msg = ToolMessage(
                content="Successfully set new name",
                tool_call_id=tool_call_id  # 关键:必须绑定工具调用ID
            )
            return Command(
                update={
                    # 2. 正常更新自定义的state字段
                    "user_name": new_name,
                    # 3. 把绑定后的ToolMessage加入消息列表
                    "messages": [success_msg]
                }
            )

        self.agent = create_agent(
            model=..., 
            system_prompt=..., 
            state_schema=MyState, 
            tools=[update_name, ...],
            checkpointer=...
        )

    def run(self, messages: dict) -> list:
        return self.agent.invoke(messages, CONFIG)

关键细节说明

  1. tool_call_id的作用:当LLM决定调用工具时,会生成一条带tool_call_id的ToolCall消息。LangGraph会自动把这个ID传给工具函数,你必须把它附在返回的ToolMessage上,这样LangGraph才能确认这条响应对应哪一个工具调用,保证消息历史的完整性。
  2. Command.update的能力:它可以同时更新state_schema(也就是你的MyState)里定义的所有字段,包括你自定义的user_name,完全不限于messages数组。你之前的误解是因为错误提示重点在修复ToolMessage的问题,但自定义字段的更新是完全支持的。
  3. 系统提示补充:建议在你的system_prompt里明确告诉LLM,调用update_name工具后会自动更新内部的user_name状态,比如加上:"当你需要更新用户的内部名称时,调用update_name工具,调用成功后系统会自动更新user_name字段",这样LLM会更清晰何时触发这个工具。

这样修改后,工具调用既能正确通过LangGraph的消息校验,也能成功更新自定义的user_name状态,完美解决你的问题。

火山引擎 最新活动