运行代理¶
代理支持使用 .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
键下。
输入格式¶
代理输入必须是一个带有 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 消息的信息。
使用自定义代理状态
您可以在输入字典中直接提供在代理状态 schema 中定义的附加字段。这允许根据运行时数据或先前的工具输出实现动态行为。
有关完整详情,请参阅上下文指南。
注意
messages
的字符串输入会转换为 HumanMessage。此行为与 createReactAgent
中的 prompt
参数不同,后者在作为字符串传递时被解释为 SystemMessage。
输出格式¶
代理输出是一个字典,包含
messages
: 执行期间交换的所有消息列表(用户输入、助手回复、工具调用)。- 可选地,如果配置了结构化输出,则包含
structuredResponse
。 - 如果使用自定义
stateSchema
,输出中也可能包含与您定义的字段对应的附加键。这些可以保存工具执行或提示逻辑更新的状态值。
有关使用自定义状态 schema 和访问上下文的更多详细信息,请参阅上下文指南。
流式输出¶
代理支持流式响应,以实现更具响应性的应用程序。这包括
- 每一步之后的进度更新
- 生成时的 LLM token
- 执行期间的自定义工具消息
流式处理在同步和异步模式下都可用
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;
}
}