agent - 同步与流式响应(call 与 stream)
2026年2月2日 下午7:42:20
在 Solon AI 中,智能体(Agent)提供了两种主要的交互模式:同步等待的 call() 和异步流式的 stream()。这两种接口分别对应了不同的业务场景。
1、交互模式对比与应用示例
A. 同步调用 (Call)
适用于后台任务处理、数据抓取或不需要实时展示推理过程的场景。
ReActAgent agent = ReActAgent.of(chatModel)
.defaultToolAdd(new WeatherTools())
.build();
// 同步获取最终结果
AgentResponse resp = agent.prompt("北京天气怎么样?")
.call();
System.out.println(resp.getContent());
B. 流式输出 (Stream)
适用于 Web 交互界面、实时对话机器人。它能即时反馈智能体的“思考”过程(Thought/Reasoning),显著提升用户体验。
// 获取流式输出块(基于 Project Reactor 的 Flux)
Flux<AgentChunk> chunks = agent.prompt("北京天气怎么样?")
.stream();
chunks.doOnNext(chunk -> {
if (chunk instanceof ReasonChunk) {
System.out.println("[思考]: " + chunk.getContent());
} else if (chunk instanceof ActionChunk) {
actionFound.set(true);
System.out.println("[动作]: 正在调用工具...");
} else if (chunk instanceof ReActChunk) {
System.out.println("[结果]: " + chunk.getContent());
}
})
.blockLast(); // 阻塞直至流结束
2、响应内容块 (AgentChunk) 的层级与分类
在流式输出中,不同的智能体会根据其内部逻辑发送不同类型的 AgentChunk。通过识别这些类型,你可以精确控制 UI 界面上的展现形式。
| 归属智能体 | 输出块类型 | 描述 |
|---|---|---|
| SimpleAgent | ChatChunk | 基础对话内容块 |
| SimpleChunk | 最终聚合的内容块(智能体生成的最终答案) | |
| ReActAgent | PlanChunk | 规划阶段的文本 |
| ReasonChunk | 推理/思考过程 (Thought) | |
| ActionChunk | 工具调用动作信息 (Action) | |
| ReActChunk | 推理循环的聚合块(智能体生成的最终答案) | |
| TeamAgent | NodeChunk | 子节点智能体的输出块 |
| SupervisorChunk | 指导者/调度者的输出块 | |
| TeamChunk | 团队协作的最终聚合块(整个团队生成的最终答案) |
在 TeamAgent 智能体里,可能会输出上面所有的块类型(未来的定制智能体,可能还会输出其它块)。
3、开发建议
- 类型判断:
在流式处理中,建议使用 instanceof 来区分推理过程和最终答案。通常 UI 界面会将 ReasonChunk 渲染为“灰色思考文字”,而将最终答案渲染为正式气泡。
- 异常处理
call() 接口会直接抛出异常,而 stream() 接口的异常需要通过 Flux 的 onError 逻辑进行捕获。
- 性能调优
对于 ReActAgent,设置合适的 maxSteps 是防止推理死循环(Tool Loop)的关键保障。