AI 对话节点(AIChatNode)
本例演示如何将上游节点结果作为 AIChatNode
的输入,并以流式方式输出模型内容。
关键点:仅调用一次
setStartNode
;AIChatNode.build(rootNode.getId())
通过结果池获取上游聚合结果;使用doOnNext
观测流。
java
import com.ai.agents.orchestrator.workflow.WorkFlowManager;
import com.ai.agents.orchestrator.util.EasyTree;
import com.ai.agents.orchestrator.node.CodeNode;
import com.ai.agents.orchestrator.node.AIChatNode;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.ChatClient.ChatClientRequestSpec;
import org.springframework.ai.chat.messages.UserMessage;
import reactor.core.publisher.Flux;
import java.util.List;
public class ChatDemo {
private ChatClient chatClient; // 假设已通过 Spring 注入
public void run() {
WorkFlowManager<String> manager = WorkFlowManager.<String>builder().build();
// 1) 上游 CodeNode 生成用户输入
CodeNode<String> start = CodeNode.<String>builder()
.outType(String.class)
.code(in -> "用户问: " + in)
.build("我最近不开心");
// 仅设置一次起始节点
EasyTree.TreeNode rootNode = manager.setStartNode(start);
// 2) AIChatNode 使用上游结果作为提示词
ChatClientRequestSpec req = chatClient.prompt().system("你是一个乐于助人的小助手");
AIChatNode<String> ai = AIChatNode.<String>builder()
.chatClientRequestSpec(req)
.prompt(input -> List.of(new UserMessage(input)))
.outType(String.class)
.build(rootNode.getId()); // 通过结果池获取上游聚合结果
// 正确接线
rootNode.addChild(ai);
// 3) 流式执行并观测
Flux<Object> flux = manager.startStreaming()
.doOnNext(o -> System.out.println("[NEXT] " + o))
.doOnError(e -> System.out.println("[ERR] " + e))
.doOnComplete(() -> System.out.println("[DONE]"));
flux.blockLast();
System.out.println("pool = " + manager.getResultPool());
}
}
常见问题
- NPE:如果多次调用
setStartNode
,根节点 UUID 会变化,子节点引用旧 UUID 将在结果池中找不到条目,导致空指针。务必只调用一次并用同一个rootNode
接线。 - AI 输出不稳定:测试时可只断言
verifyComplete()
,避免对onNext
的具体内容做严格判断。