Skip to content

AI 对话节点(AIChatNode)

本例演示如何将上游节点结果作为 AIChatNode 的输入,并以流式方式输出模型内容。

关键点:仅调用一次 setStartNodeAIChatNode.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 的具体内容做严格判断。

Released under the MIT License.