Solon v3.10.1

agent - 同步与流式响应(call 与 stream)

</> markdown
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 界面上的展现形式。

归属智能体输出块类型描述
AgentAgentChunk智能体流块接口(定义公共的基础方法)
SimpleAgentChatChunk基础对话内容块
SimpleChunk最终聚合的内容块(智能体生成的最终答案)
ReActAgentPlanChunk规划阶段的文本
ReasonChunk推理/思考 “过程” 块 (Reason)
ThoughtChunk想法聚合块 (Thought),相当于是 ReasonChunk 的聚合
ActionStartChunk工具调用开始 (Action),如果工具执行很久可先提示用户。v3.9.6 后支持
ActionEndChunk工具调用结束 (Action)
ReActChunk推理循环的聚合块(智能体生成的最终答案)
TeamAgentNodeChunk子节点智能体的输出块
SupervisorChunk指导者/调度者的输出块
TeamChunk团队协作的最终聚合块(整个团队生成的最终答案)

在 TeamAgent 智能体里,可能会输出上面所有的块类型(未来的定制智能体,可能还会输出其它块)。

AgentChunk 主要属性(实现类,可能会有扩展属性):

方法描述
getAgentName获取当前产生块的智能体名字
getSession获取所属会话
getMessage获取当前块的消息
getMeta获取当前块的元数据
hasMeta是否当前块有元数据
hasContent是否有当前块内容
getContent获取当前块的消息内容

开发建议

  • 类型判断:

在流式处理中,建议使用 instanceof 来区分推理过程和最终答案。通常 UI 界面会将 ReasonChunk 渲染为“灰色思考文字”,而将最终答案渲染为正式气泡。

  • 异常处理

call() 接口会直接抛出异常,而 stream() 接口的异常需要通过 Flux 的 onError 逻辑进行捕获。

  • 性能调优

对于 ReActAgent,设置合适的 maxSteps 是防止推理死循环(Tool Loop)的关键保障。