= (state) => {
- const lastMessage = state.messages.at(-1);
- if (AIMessage.isInstance(lastMessage) && lastMessage.tool_calls.length) {
- return "retrieve";
- }
- return END;
-}
-
-// Define the graph
-const builder = new StateGraph(State)
- .addNode("generateQueryOrRespond", generateQueryOrRespond)
- .addNode("retrieve", toolNode)
- .addNode("gradeDocuments", gradeDocuments)
- .addNode("rewrite", rewrite)
- .addNode("generate", generate)
- // Add edges
- .addEdge(START, "generateQueryOrRespond")
- // Decide whether to retrieve
- .addConditionalEdges("generateQueryOrRespond", shouldRetrieve)
- .addEdge("retrieve", "gradeDocuments")
- // Edges taken after grading documents
- .addConditionalEdges(
- "gradeDocuments",
- // Route based on grading decision
- (state) => {
- // The gradeDocuments function returns either "generate" or "rewrite"
- const lastMessage = state.messages.at(-1);
- return lastMessage.content === "generate" ? "generate" : "rewrite";
- }
- )
- .addEdge("generate", END)
- .addEdge("rewrite", "generateQueryOrRespond");
-
-// Compile
-const graph = builder.compile();
-```
+updates, values, messages, custom, checkpoints, tasks, debugProcessing...
}
+
:::
:::js
-```typescript
-const question = "Which genre on average has the longest tracks?";
-
-const stream = await agent.stream(
- { messages: [{ role: "user", content: question }] },
- { streamMode: "values" }
-);
-
-for await (const step of stream) {
- if (step.messages && step.messages.length > 0) {
- const lastMessage = step.messages[step.messages.length - 1];
- console.log(lastMessage.toFormattedString());
- }
-}
-```
+
+