agent - 同步与流式响应(call 与 stream)
2026年4月8日 上午11:14: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 ActionEndChunk) {
System.out.println("[动作]: 调用工具完成...");
} else if (chunk instanceof ReActChunk) {
System.out.println("[结果]: " + chunk.getContent());
}
})
.blockLast(); // 阻塞直至流结束
2、同步调用结果(AgentResponse)
| 响应类型 | 描述 |
|---|---|
| SimpleResponse | 简单智能体,同步调用结果 |
| ReActResponse | 反思型智能体,同步调用结果 |
| TeamResponse | 协作型智能体,同步调用结果 |
AgentResponse 主要属性(实现类,可能会有扩展属性):
| 方法 | 描述 |
|---|---|
getTrace | 获取跟踪 |
getSession | 获取当前会话 |
getContext | 获取计算图上下文(即任务状态快照) |
getMetrics | 获取执行指标(如 Token 消耗、耗时等) |
getMessage | 获取消息 |
getContent | 获取消息内容 |
toBean | 将消息内容转换为结构化对象(通常用于解析 JSON 格式的 Final Answer) |
3、流式响应内容块 (AgentChunk) 的层级与分类
在流式输出中,不同的智能体会根据其内部逻辑发送不同类型的 AgentChunk。通过识别这些类型,你可以精确控制 UI 界面上的展现形式。
| 归属智能体 | 输出块类型 | 描述 |
|---|---|---|
| Agent | AgentChunk | 智能体流块接口(定义公共的基础方法) |
| SimpleAgent | ChatChunk | 基础对话内容块 |
| SimpleChunk | 最终聚合的内容块(智能体生成的最终答案) | |
| ReActAgent | PlanChunk | 规划阶段的文本 |
| ReasonChunk | 推理/思考 “过程” 块 (Reason) | |
| ThoughtChunk | 想法聚合块 (Thought),相当于是 ReasonChunk 的聚合 | |
| ActionStartChunk | 工具调用开始 (Action),如果工具执行很久可先提示用户。v3.9.6 后支持 | |
| ActionEndChunk | 工具调用结束 (Action) | |
| ReActChunk | 推理循环的聚合块(智能体生成的最终答案) | |
| TeamAgent | NodeChunk | 子节点智能体的输出块 |
| SupervisorChunk | 指导者/调度者的输出块 | |
| TeamChunk | 团队协作的最终聚合块(整个团队生成的最终答案) |
在 TeamAgent 智能体里,可能会输出上面所有的块类型(未来的定制智能体,可能还会输出其它块)。
AgentChunk 主要属性(实现类,可能会有扩展属性):
| 方法 | 描述 |
|---|---|
getAgentName | 获取当前产生块的智能体名字 |
getSession | 获取所属会话 |
getMessage | 获取当前块的消息 |
getMeta | 获取当前块的元数据 |
hasMeta | 是否当前块有元数据 |
hasContent | 是否有当前块内容 |
getContent | 获取当前块的消息内容 |
开发建议
- 类型判断:
在流式处理中,建议使用 instanceof 来区分推理过程和最终答案。通常 UI 界面会将 ReasonChunk 渲染为“灰色思考文字”,而将最终答案渲染为正式气泡。
- 异常处理
call() 接口会直接抛出异常,而 stream() 接口的异常需要通过 Flux 的 onError 逻辑进行捕获。
- 性能调优
对于 ReActAgent,设置合适的 maxSteps 是防止推理死循环(Tool Loop)的关键保障。