agentscope-ai / agentscope-ai/agentscope-java

[Bug]:ReActAgent 在流式输出(stream)时存在严重的文本块内容累积重复问题

未关闭
#846 7 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
area/core/agent bug
主要语言
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)

Image

贡献指南

打开贡献指南

评估

这个 Issue 还没有评估数据。

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。