发送到图中特定节点的消息或数据包。
`Send` 类在 `StateGraph` 的条件边中使用,以便在下一步动态调用具有自定义状态的节点。
重要的是,发送的状态可以与核心图的状态不同,从而实现灵活和动态的工作流程管理。
一个这样的例子是“map-reduce”工作流程,其中您的图多次并行调用同一节点,使用不同的状态,然后在将结果聚合回主图的状态中。
import { Annotation, Send, StateGraph } from "@langchain/langgraph";const ChainState = Annotation.Root({ subjects: Annotation<string[]>, jokes: Annotation<string[]>({ reducer: (a, b) => a.concat(b), }),});const continueToJokes = async (state: typeof ChainState.State) => { return state.subjects.map((subject) => { return new Send("generate_joke", { subjects: [subject] }); });};const graph = new StateGraph(ChainState) .addNode("generate_joke", (state) => ({ jokes: [`Joke about ${state.subjects}`], })) .addConditionalEdges("__start__", continueToJokes) .addEdge("generate_joke", "__end__") .compile();const res = await graph.invoke({ subjects: ["cats", "dogs"] });console.log(res);// Invoking with two subjects results in a generated joke for each// { subjects: ["cats", "dogs"], jokes: [`Joke about cats`, `Joke about dogs`] } Copy
import { Annotation, Send, StateGraph } from "@langchain/langgraph";const ChainState = Annotation.Root({ subjects: Annotation<string[]>, jokes: Annotation<string[]>({ reducer: (a, b) => a.concat(b), }),});const continueToJokes = async (state: typeof ChainState.State) => { return state.subjects.map((subject) => { return new Send("generate_joke", { subjects: [subject] }); });};const graph = new StateGraph(ChainState) .addNode("generate_joke", (state) => ({ jokes: [`Joke about ${state.subjects}`], })) .addConditionalEdges("__start__", continueToJokes) .addEdge("generate_joke", "__end__") .compile();const res = await graph.invoke({ subjects: ["cats", "dogs"] });console.log(res);// Invoking with two subjects results in a generated joke for each// { subjects: ["cats", "dogs"], jokes: [`Joke about cats`, `Joke about dogs`] }
发送到图中特定节点的消息或数据包。
`Send` 类在 `StateGraph` 的条件边中使用,以便在下一步动态调用具有自定义状态的节点。
重要的是,发送的状态可以与核心图的状态不同,从而实现灵活和动态的工作流程管理。
一个这样的例子是“map-reduce”工作流程,其中您的图多次并行调用同一节点,使用不同的状态,然后在将结果聚合回主图的状态中。
示例