fix(chat): 修复消息打断会取消正在进行的回复任务的问题

之前的消息打断逻辑会无差别地取消处理流中的所有任务。这会导致一个问题:当用户在机器人生成回复期间快速发送新消息时,回复任务会被意外中断,导致机器人无法正常完成回复。

本次修改通过引入 `is_replying` 状态来解决此问题:
1.  在 `StreamContext` 中新增 `is_replying` 状态标志,用于追踪回复生成过程。
2.  当开始生成回复时,设置该标志为 `True`,并在回复完成或取消后通过 `finally` 块确保其恢复为 `False`。
3.  `MessageManager` 的打断检查逻辑现在会首先检查此标志,如果为 `True` 则跳过打断,从而保护正在进行的回复。
4.  `cancel_all_stream_tasks` 也增加了 `exclude_reply` 选项,确保即使触发打断,也不会取消回复任务。
This commit is contained in:
tt-P607
2025-10-11 02:11:32 +08:00
parent a3d62a265d
commit 94e34c9370
4 changed files with 31 additions and 23 deletions

View File

@@ -207,11 +207,12 @@ class ChatterManager:
return active_tasks
def cancel_all_stream_tasks(self, stream_id: str) -> int:
def cancel_all_stream_tasks(self, stream_id: str, exclude_reply: bool = False) -> int:
"""取消指定流的所有处理任务(包括多重回复)
Args:
stream_id: 流ID
exclude_reply: 是否排除回复任务
Returns:
int: 成功取消的任务数量
@@ -221,10 +222,15 @@ class ChatterManager:
tasks = self._processing_tasks[stream_id]
cancelled_count = 0
remaining_tasks = []
logger.info(f"开始取消流 {stream_id}所有处理任务,共 {len(tasks)}")
logger.info(f"开始取消流 {stream_id} 的处理任务,共 {len(tasks)}")
for task in tasks:
if exclude_reply and "reply" in task.get_name().lower():
remaining_tasks.append(task)
continue
try:
if not task.done():
task.cancel()
@@ -233,8 +239,12 @@ class ChatterManager:
except Exception as e:
logger.warning(f"取消任务时出错: {e}")
# 清理任务记录
del self._processing_tasks[stream_id]
if remaining_tasks:
self._processing_tasks[stream_id] = remaining_tasks
else:
if stream_id in self._processing_tasks:
del self._processing_tasks[stream_id]
logger.info(f"{stream_id} 的任务取消完成,成功取消 {cancelled_count} 个任务")
return cancelled_count