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:
@@ -248,6 +248,7 @@ class ChatterActionManager:
|
||||
else:
|
||||
# 生成回复
|
||||
try:
|
||||
chat_stream.context_manager.context.is_replying = True
|
||||
success, response_set, _ = await generator_api.generate_reply(
|
||||
chat_stream=chat_stream,
|
||||
reply_message=target_message,
|
||||
@@ -265,6 +266,8 @@ class ChatterActionManager:
|
||||
except asyncio.CancelledError:
|
||||
logger.debug(f"{log_prefix} 并行执行:回复生成任务已被取消")
|
||||
return {"action_type": "reply", "success": False, "reply_text": "", "loop_info": None}
|
||||
finally:
|
||||
chat_stream.context_manager.context.is_replying = False
|
||||
|
||||
# 发送并存储回复
|
||||
loop_info, reply_text, cycle_timers_reply = await self._send_and_store_reply(
|
||||
|
||||
Reference in New Issue
Block a user