From f93fa88c278ec863693ae3fd1635fc4dadf42198 Mon Sep 17 00:00:00 2001 From: UnCLAS-Prommer Date: Sun, 13 Jul 2025 10:24:23 +0800 Subject: [PATCH] refactor of heart_flow --- src/chat/heart_flow/sub_heartflow.py | 150 +++++++++++++-------------- 1 file changed, 72 insertions(+), 78 deletions(-) diff --git a/src/chat/heart_flow/sub_heartflow.py b/src/chat/heart_flow/sub_heartflow.py index 383fbb74e..dbc417aad 100644 --- a/src/chat/heart_flow/sub_heartflow.py +++ b/src/chat/heart_flow/sub_heartflow.py @@ -1,13 +1,6 @@ -import asyncio -import time -import traceback - -from typing import Optional, List, Dict, Tuple from rich.traceback import install from src.common.logger import get_logger -from src.config.config import global_config -from src.chat.message_receive.message import MessageRecv from src.chat.message_receive.chat_stream import get_chat_manager from src.chat.focus_chat.heartFC_chat import HeartFChatting from src.chat.utils.utils import get_chat_type_and_target_info @@ -39,7 +32,7 @@ class SubHeartflow: # 随便水群 normal_chat 和 认真水群 focus_chat 实例 # CHAT模式激活 随便水群 FOCUS模式激活 认真水群 - self.heart_fc_instance: Optional[HeartFChatting] = HeartFChatting( + self.heart_fc_instance: HeartFChatting = HeartFChatting( chat_id=self.subheartflow_id, ) # 该sub_heartflow的HeartFChatting实例 @@ -47,88 +40,89 @@ class SubHeartflow: """异步初始化方法,创建兴趣流并确定聊天类型""" await self.heart_fc_instance.start() - async def _stop_heart_fc_chat(self): - """停止并清理 HeartFChatting 实例""" - if self.heart_fc_instance.running: - logger.info(f"{self.log_prefix} 结束专注聊天...") - try: - await self.heart_fc_instance.shutdown() - except Exception as e: - logger.error(f"{self.log_prefix} 关闭 HeartFChatting 实例时出错: {e}") - logger.error(traceback.format_exc()) - else: - logger.info(f"{self.log_prefix} 没有专注聊天实例,无需停止专注聊天") + # async def _stop_heart_fc_chat(self): + # """停止并清理 HeartFChatting 实例""" + # if self.heart_fc_instance.running: + # logger.info(f"{self.log_prefix} 结束专注聊天...") + # try: + # await self.heart_fc_instance.shutdown() + # except Exception as e: + # logger.error(f"{self.log_prefix} 关闭 HeartFChatting 实例时出错: {e}") + # logger.error(traceback.format_exc()) + # else: + # logger.info(f"{self.log_prefix} 没有专注聊天实例,无需停止专注聊天") - async def _start_heart_fc_chat(self) -> bool: - """启动 HeartFChatting 实例,确保 NormalChat 已停止""" - try: - # 如果任务已完成或不存在,则尝试重新启动 - if self.heart_fc_instance._loop_task is None or self.heart_fc_instance._loop_task.done(): - logger.info(f"{self.log_prefix} HeartFChatting 实例存在但循环未运行,尝试启动...") - try: - # 添加超时保护 - await asyncio.wait_for(self.heart_fc_instance.start(), timeout=15.0) - logger.info(f"{self.log_prefix} HeartFChatting 循环已启动。") - return True - except Exception as e: - logger.error(f"{self.log_prefix} 尝试启动现有 HeartFChatting 循环时出错: {e}") - logger.error(traceback.format_exc()) - # 出错时清理实例,准备重新创建 - self.heart_fc_instance = None - else: - # 任务正在运行 - logger.debug(f"{self.log_prefix} HeartFChatting 已在运行中。") - return True # 已经在运行 + # async def _start_heart_fc_chat(self) -> bool: + # """启动 HeartFChatting 实例,确保 NormalChat 已停止""" + # try: + # # 如果任务已完成或不存在,则尝试重新启动 + # if self.heart_fc_instance._loop_task is None or self.heart_fc_instance._loop_task.done(): + # logger.info(f"{self.log_prefix} HeartFChatting 实例存在但循环未运行,尝试启动...") + # try: + # # 添加超时保护 + # await asyncio.wait_for(self.heart_fc_instance.start(), timeout=15.0) + # logger.info(f"{self.log_prefix} HeartFChatting 循环已启动。") + # return True + # except Exception as e: + # logger.error(f"{self.log_prefix} 尝试启动现有 HeartFChatting 循环时出错: {e}") + # logger.error(traceback.format_exc()) + # # 出错时清理实例,准备重新创建 + # self.heart_fc_instance = None # type: ignore + # return False + # else: + # # 任务正在运行 + # logger.debug(f"{self.log_prefix} HeartFChatting 已在运行中。") + # return True # 已经在运行 - except Exception as e: - logger.error(f"{self.log_prefix} _start_heart_fc_chat 执行时出错: {e}") - logger.error(traceback.format_exc()) - return False + # except Exception as e: + # logger.error(f"{self.log_prefix} _start_heart_fc_chat 执行时出错: {e}") + # logger.error(traceback.format_exc()) + # return False - def is_in_focus_cooldown(self) -> bool: - """检查是否在focus模式的冷却期内 + # def is_in_focus_cooldown(self) -> bool: + # """检查是否在focus模式的冷却期内 - Returns: - bool: 如果在冷却期内返回True,否则返回False - """ - if self.last_focus_exit_time == 0: - return False + # Returns: + # bool: 如果在冷却期内返回True,否则返回False + # """ + # if self.last_focus_exit_time == 0: + # return False - # 基础冷却时间10分钟,受auto_focus_threshold调控 - base_cooldown = 10 * 60 # 10分钟转换为秒 - cooldown_duration = base_cooldown / global_config.chat.auto_focus_threshold + # # 基础冷却时间10分钟,受auto_focus_threshold调控 + # base_cooldown = 10 * 60 # 10分钟转换为秒 + # cooldown_duration = base_cooldown / global_config.chat.auto_focus_threshold - current_time = time.time() - elapsed_since_exit = current_time - self.last_focus_exit_time + # current_time = time.time() + # elapsed_since_exit = current_time - self.last_focus_exit_time - is_cooling = elapsed_since_exit < cooldown_duration + # is_cooling = elapsed_since_exit < cooldown_duration - if is_cooling: - remaining_time = cooldown_duration - elapsed_since_exit - remaining_minutes = remaining_time / 60 - logger.debug( - f"[{self.log_prefix}] focus冷却中,剩余时间: {remaining_minutes:.1f}分钟 (阈值: {global_config.chat.auto_focus_threshold})" - ) + # if is_cooling: + # remaining_time = cooldown_duration - elapsed_since_exit + # remaining_minutes = remaining_time / 60 + # logger.debug( + # f"[{self.log_prefix}] focus冷却中,剩余时间: {remaining_minutes:.1f}分钟 (阈值: {global_config.chat.auto_focus_threshold})" + # ) - return is_cooling + # return is_cooling - def get_cooldown_progress(self) -> float: - """获取冷却进度,返回0-1之间的值 + # def get_cooldown_progress(self) -> float: + # """获取冷却进度,返回0-1之间的值 - Returns: - float: 0表示刚开始冷却,1表示冷却完成 - """ - if self.last_focus_exit_time == 0: - return 1.0 # 没有冷却,返回1表示完全恢复 + # Returns: + # float: 0表示刚开始冷却,1表示冷却完成 + # """ + # if self.last_focus_exit_time == 0: + # return 1.0 # 没有冷却,返回1表示完全恢复 - # 基础冷却时间10分钟,受auto_focus_threshold调控 - base_cooldown = 10 * 60 # 10分钟转换为秒 - cooldown_duration = base_cooldown / global_config.chat.auto_focus_threshold + # # 基础冷却时间10分钟,受auto_focus_threshold调控 + # base_cooldown = 10 * 60 # 10分钟转换为秒 + # cooldown_duration = base_cooldown / global_config.chat.auto_focus_threshold - current_time = time.time() - elapsed_since_exit = current_time - self.last_focus_exit_time + # current_time = time.time() + # elapsed_since_exit = current_time - self.last_focus_exit_time - if elapsed_since_exit >= cooldown_duration: - return 1.0 # 冷却完成 + # if elapsed_since_exit >= cooldown_duration: + # return 1.0 # 冷却完成 - return elapsed_since_exit / cooldown_duration + # return elapsed_since_exit / cooldown_duration