跳到内容

运行代理

代理支持使用 .invoke() 获取完整响应,或使用 .stream() 增量 流式传输 输出。本节解释如何提供输入、解释输出、启用流式传输和控制执行限制。

基本用法

代理可以使用 .invoke() 执行

import { createReactAgent } from "@langchain/langgraph/prebuilt";

const agent = createReactAgent(...);

const response = await agent.invoke(
  { messages: [ { role: "user", content: "what is the weather in sf" } ] }
);

输入和输出

代理使用一种语言模型,它期望将消息列表作为输入。因此,代理的输入和输出以消息列表的形式存储在代理状态messages 键下。

输入格式

代理输入必须是一个带有 messages 键的对象。支持的格式有

格式 示例
字符串 { messages: "Hello" } — 被解释为 HumanMessage
消息对象 { messages: { "role": "user", "content": "Hello" } }
消息列表 { messages: [ {"role": "user", "content": "Hello" } ] }
带自定义状态 { messages: [ {"role": "user", "content": "Hello"} ], "user_name": "Alice" } — 如果使用自定义 stateSchema

消息会自动转换为 LangChain 的内部消息格式。您可以在 LangChain 文档中阅读有关 LangChain 消息的更多信息。

使用自定义代理状态

您可以在输入字典中直接提供代理状态模式中定义的额外字段。这允许根据运行时数据或之前的工具输出实现动态行为。
有关详细信息,请参阅上下文指南

注意

messages 的字符串输入被转换为 HumanMessage。此行为与 createReactAgent 中的 prompt 参数不同,后者在作为字符串传递时被解释为 SystemMessage

输出格式

代理输出是一个包含以下内容的字典

  • messages: 执行期间交换的所有消息列表(用户输入、助手回复、工具调用)。
  • 可选地,如果配置了结构化输出,则为 structuredResponse
  • 如果使用自定义 stateSchema,输出中可能还会包含与您定义字段对应的额外键。这些键可以保存工具执行或提示逻辑更新的状态值。

有关使用自定义状态模式和访问上下文的更多详细信息,请参阅上下文指南

流式输出

代理支持流式响应,以实现更具响应性的应用程序。这包括

  • 每一步后的进度更新
  • 生成时LLM 令牌
  • 执行期间的自定义工具消息

流式传输在同步和异步模式下都可用

for await (
  const chunk of await agent.stream(
    { messages: [ { role: "user", content: "what is the weather in sf" } ] },
    { streamMode: "updates" },
  )
) {
  console.log(chunk);
}

提示

有关完整详细信息,请参阅流式传输指南

最大迭代次数

要控制代理执行并避免无限循环,请设置递归限制。这定义了代理在引发 GraphRecursionError 之前可以执行的最大步数。您可以在运行时或通过 .withConfig() 定义代理时配置 recursionLimit

import { GraphRecursionError } from "@langchain/langgraph";
import { createReactAgent } from "@langchain/langgraph/prebuilt";
import { initChatModel } from "langchain/chat_models/universal";

const maxIterations = 3;
const recursionLimit = 2 * maxIterations + 1;
const llm = await initChatModel("anthropic:claude-3-5-haiku-latest");
const agent = createReactAgent({
  llm,
  tools: [getWeather]
});

try {
  const response = await agent.invoke(
    { messages: [ { role: "user", content: "what's the weather in sf" } ] },
    { recursionLimit }
  );
} catch (error) {
  if (error instanceof GraphRecursionError) {
    console.log("Agent stopped due to max iterations.");
  } else {
    throw error;
  }
}
import { GraphRecursionError } from "@langchain/langgraph";
import { createReactAgent } from "@langchain/langgraph/prebuilt";
import { initChatModel } from "langchain/chat_models/universal";

const maxIterations = 3;
const recursionLimit = 2 * maxIterations + 1;
const llm = await initChatModel("anthropic:claude-3-5-haiku-latest");
const agent = createReactAgent({
  llm,
  tools: [getWeather]
});
const agentWithRecursionLimit = agent.withConfig({ recursionLimit });

try {
  const response = await agentWithRecursionLimit.invoke(
    { messages: [ { role: "user", content: "what's the weather in sf" } ] }
  );
} catch (error) {
  if (error instanceof GraphRecursionError) {
    console.log("Agent stopped due to max iterations.");
  } else {
    throw error;
  }
}