agentscope-ai / agentscope-ai/agentscope-java
[Bug]:ReActAgent 在流式输出(stream)时存在严重的文本块内容累积重复问题
- 主要語言
- Java
- 星號
- 5.6k
- 分支
- 1.3k
- 平均合併
- 4 天 12 小時
- 30 天內合併 PR
- 77
描述
问题描述 (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)
貢獻指南
評估
這個 Issue 還沒有評估資料。