agentscope-ai / agentscope-ai/QwenPaw
[Feature Request][Telegram] 最终回复发出后,自动清理/隐藏流式中间消息(思考、工具调用)
- Lenguaje dominante
- Python
- Estrellas
- 34.9k
- Forks
- 3.1k
- Merge medio
- 1 d 15 h
- PR fusionados (30 d)
- 225
Descripción
# [Feature Request][Telegram] 最终回复发出后,自动清理/隐藏流式中间消息(思考、工具调用)
## Describe the problem
Telegram 频道使用"占位消息 + editMessageText"实现流式输出:
1. 思考过程(`reasoning`,💭 占位消息)
2. 工具调用信息 / 工具结果(`send()` 发出的普通消息)
3. 最终答案(`message` 流,占位消息编辑而成)
**问题**:最终答案发出后,前面所有中间过程消息(💭 思考、每次工具调用、工具结果)**一直留在聊天里**,刷屏严重。用户希望:最终结果出来后,之前的后台过程消息**自动消失或隐藏**,聊天里只留最终答案。
## To Reproduce
1. 配置 Telegram channel(`streaming_enabled` 默认开启)
2. 让 Agent 执行任意带思考 + 工具调用的任务(如"查一下今天的天气")
3. 观察 Telegram:💭 思考、🔧 工具调用、工具结果、最终答案全部留下,中间消息不会消失
## Expected behavior
提供可选配置(如 `cleanup_intermediate: true` / `keep_only_final: true`):
- **最终答案发出后**,自动删除该轮请求产生的所有中间消息(思考、工具调用、工具结果),只保留最终答案
- 出错/取消时不清理(保留现场便于排查)
- 可扩展:暴露"请求完成"的钩子/事件,允许插件做自定义清理(删除 or 折叠成摘要)
## Actual behavior
中间消息永不清理。`_on_process_completed`(`channel.py:1174`)只停止"正在输入"状态,没有任何消息清理逻辑。
## Root cause
流式链路为占位消息 + 就地编辑:
- `on_streaming_start`(`channel.py:1023`)→ `_send_placeholder`(`channel.py:922`)发占位消息,message_id 存 `send_meta["_tg_stream"]["message_ids"]`
- `on_streaming_delta` → `_edit_stream_message`(`channel.py:951`)就地编辑
- `on_streaming_end`(`channel.py:1079`)只把占位消息**编辑**成最终文本,**从不删除**;编辑完就把 message_id 从 state 中 `pop` 掉,之后无法再找到这些消息
- 工具调用文本走 `send()`(`channel.py:732`)发普通消息,同样不追踪
`base.py` 中 `_STREAMABLE_TYPES = {"reasoning", "message"}`,所有流式占位消息在结束后都不清理。
现有 `show_thinking` / `show_tool_calls` / `show_tool_results` 配置(`renderer.py` ChannelDisplayConfig)只能"一开始就不发",不能满足"发了之后自动清理"的需求。
## Environment
- QwenPaw version: 2.2.0
- Channel: Telegram(python-telegram-bot)
- OS: Linux (container)
## Suggested fix
1. **channel 层清理**:请求期间把所有消息 id(占位 + `send()` 普通消息)记录进 `send_meta`;`_on_process_completed` 时删除除"最终答案"外的所有消息(保留最后完成的消息单元)。`_delete_message`(`channel.py:1007`)已存在,可直接复用
2. **插件钩子**:在 `_on_process_completed` 前后暴露可注册的钩子/事件,让第三方插件接管清理策略(删除 / 折叠成一条摘要)
3. 建议把清理行为做成配置项(默认关闭,避免行为突变)
## Workaround(临时)
- 自制插件 `tg-intermediate-cleanup`:启动时 monkey-patch `TelegramChannel`(`on_streaming_start` / `on_streaming_end` / `send` / `_on_process_completed` / `Bot.send_message`),用 contextvar 追踪每轮请求发出的所有消息 id,`_on_process_completed` 后删除除最终答案外的中间消息。验证有效,但属于运行时补丁,期望官方原生支持
---
*中文说明:Telegram 流式输出采用"占位消息 + 就地编辑",结束后中间消息(思考/工具调用)不会删除。建议在 `_on_process_completed` 增加清理钩子或配置项,让最终答案发出后自动删除中间过程消息。*
Guía de contribución
Evaluación
Este issue todavía no se ha evaluado.