agentscope-ai / agentscope-ai/QwenPaw

[Feature Request][Telegram] 最终回复发出后,自动清理/隐藏流式中间消息(思考、工具调用)

Abierto
#7,586 2 comentarios 0 reacciones 0 asignados Ver en GitHub
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

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.