agentscope-ai / agentscope-ai/agentscope-java
[Bug]:ReActAgent 在流式输出(stream)时存在严重的文本块内容累积重复问题
- Langage dominant
- Java
- Étoiles
- 5.6k
- Forks
- 1.3k
- Merge moyen
- 4 j 12 h
- PR mergées (30 j)
- 77
Description
问题描述 (Description)
在使用 ReActAgent 配合 DashScopeChatModel (如 qwen3-max) 进行流式调用时,我发现 REASONING 事件返回的 Msg 对象在多轮迭代(Iteration)中会不断累加之前的 TextBlock。
在 ReAct 的“思考 -> 工具调用 -> 结果返回 -> 再次思考”循环中,每一轮产生的 REASONING 事件都包含了之前所有轮次的文本内容。这导致前端在实现“打字机”效果时,会反复接收并显示已经输出过的文字。
核心痛点 (Key Issues)
内容累加:event.getMessage().getContent() 返回的是全量 Block 列表,而不是当前迭代产生的增量 Block。
HINT 信息干扰:系统注入的上下文(如当前时间 timestamp)会被模型复读并包含在 TextBlock 中,且随迭代多次重复出现。
缺少增量标识:目前很难在不自行实现复杂 Hash 过滤的情况下,从 REASONING 事件中准确提取“仅限本次生成”的文字碎片。
我的实现环境 (Context)
框架版本: AgentScope Java SDK 1.0.9 相关版本
模型: qwen3-max (DashScopeChatModel)
模式: ReActAgent 开启 stream(true)
复现代码片段 (My Code)
// 当前后端处理逻辑
return agent.stream(Msg.builder().textContent(userQuery).build())
.filter(e -> e.getType() == EventType.REASONING)
.flatMapIterable(event -> {
// 这里 msg.getContent() 在第二轮迭代时会包含第一轮的所有 TextBlock
// 导致前端收到重复段落
return event.getMessage().getContent().stream()
.filter(block -> block instanceof TextBlock)
.map(block -> convertToResponse(block))
.toList();
});
期待的解决方案 (Suggestions)
框架层去重:ReActAgent 在流式模式下,是否可以只在 Event 中发送该阶段新增的 ContentBlock?
状态标识:在 ContentBlock 或 Event 中增加一个 isIncremental 或 iterationId 标识,方便开发者过滤。
最佳实践:如果这是设计使然,官方是否能提供一个标准的、优雅的流式增量提取示例?
证据截图 (Screenshots)
Guide de contribution
Ouvrir le guide de contribution
Évaluation
Cette issue n'a pas encore été évaluée.