fix:修复hfc根本不会被触发的bug

This commit is contained in:
SengokuCola
2025-04-23 23:08:19 +08:00
parent 5782d4425b
commit 7733782929
13 changed files with 621 additions and 472 deletions

View File

@@ -6,11 +6,14 @@ from src.common.logger import get_module_logger
# Need manager types for dependency injection
from src.heart_flow.mai_state_manager import MaiStateManager, MaiStateInfo
from src.heart_flow.subheartflow_manager import SubHeartflowManager
from src.heart_flow.subheartflow_manager import SubHeartflowManager, ChatState
from src.heart_flow.interest_logger import InterestLogger
logger = get_module_logger("background_tasks")
# 新增兴趣评估间隔
INTEREST_EVAL_INTERVAL_SECONDS = 5
class BackgroundTaskManager:
"""管理 Heartflow 的后台周期性任务。"""
@@ -25,6 +28,8 @@ class BackgroundTaskManager:
cleanup_interval: int,
log_interval: int,
inactive_threshold: int,
# 新增兴趣评估间隔参数
interest_eval_interval: int = INTEREST_EVAL_INTERVAL_SECONDS,
):
self.mai_state_info = mai_state_info
self.mai_state_manager = mai_state_manager
@@ -36,46 +41,70 @@ class BackgroundTaskManager:
self.cleanup_interval = cleanup_interval
self.log_interval = log_interval
self.inactive_threshold = inactive_threshold # For cleanup task
self.interest_eval_interval = interest_eval_interval # 存储兴趣评估间隔
# Task references
self._state_update_task: Optional[asyncio.Task] = None
self._cleanup_task: Optional[asyncio.Task] = None
self._logging_task: Optional[asyncio.Task] = None
self._interest_eval_task: Optional[asyncio.Task] = None # 新增兴趣评估任务引用
self._tasks: List[Optional[asyncio.Task]] = [] # Keep track of all tasks
async def start_tasks(self):
"""启动所有后台任务"""
# 状态更新任务
if self._state_update_task is None or self._state_update_task.done():
self._state_update_task = asyncio.create_task(
self._run_state_update_cycle(self.update_interval), name="hf_state_update"
)
self._tasks.append(self._state_update_task)
logger.debug(f"聊天状态更新任务已启动 间隔:{self.update_interval}s")
else:
logger.warning("状态更新任务已在运行")
"""启动所有后台任务
功能说明:
- 启动核心后台任务: 状态更新、清理、日志记录和兴趣评估
- 每个任务启动前检查是否已在运行
- 将任务引用保存到任务列表
"""
# 任务配置列表: (任务变量名, 任务函数, 任务名称, 日志级别, 额外日志信息, 任务对象引用属性名)
task_configs = [
(self._state_update_task,
lambda: self._run_state_update_cycle(self.update_interval),
"hf_state_update",
"debug",
f"聊天状态更新任务已启动 间隔:{self.update_interval}s",
"_state_update_task"),
(self._cleanup_task,
self._run_cleanup_cycle,
"hf_cleanup",
"info",
f"清理任务已启动 间隔:{self.cleanup_interval}s 阈值:{self.inactive_threshold}s",
"_cleanup_task"),
(self._logging_task,
self._run_logging_cycle,
"hf_logging",
"info",
f"日志任务已启动 间隔:{self.log_interval}s",
"_logging_task"),
# 清理任务
if self._cleanup_task is None or self._cleanup_task.done():
self._cleanup_task = asyncio.create_task(self._run_cleanup_cycle(), name="hf_cleanup")
self._tasks.append(self._cleanup_task)
logger.info(f"清理任务已启动 间隔:{self.cleanup_interval}s 阈值:{self.inactive_threshold}s")
else:
logger.warning("清理任务已在运行")
# 新增兴趣评估任务配置
(self._interest_eval_task,
self._run_interest_eval_cycle,
"hf_interest_eval",
"debug", # 设为debug避免过多日志
f"兴趣评估任务已启动 间隔:{self.interest_eval_interval}s",
"_interest_eval_task"),
]
# 日志任务
if self._logging_task is None or self._logging_task.done():
self._logging_task = asyncio.create_task(self._run_logging_cycle(), name="hf_logging")
self._tasks.append(self._logging_task)
logger.info(f"日志任务已启动 间隔:{self.log_interval}s")
else:
logger.warning("日志任务已在运行")
# # 初始状态检查
# initial_state = self.mai_state_info.get_current_state()
# if initial_state != self.mai_state_info.mai_status.OFFLINE:
# logger.info(f"初始状态:{initial_state.value} 触发初始激活检查")
# asyncio.create_task(self.subheartflow_manager.activate_random_subflows_to_chat(initial_state))
# 统一启动所有任务
for task_var, task_func, task_name, log_level, log_msg, task_attr_name in task_configs:
# 检查任务变量是否存在且未完成
current_task_var = getattr(self, task_attr_name)
if current_task_var is None or current_task_var.done():
new_task = asyncio.create_task(task_func(), name=task_name)
setattr(self, task_attr_name, new_task) # 更新任务变量
if new_task not in self._tasks: # 避免重复添加
self._tasks.append(new_task)
# 根据配置记录不同级别的日志
getattr(logger, log_level)(log_msg)
else:
logger.warning(f"{task_name}任务已在运行")
async def stop_tasks(self):
"""停止所有后台任务。
@@ -126,15 +155,11 @@ class BackgroundTaskManager:
# 计算并执行间隔等待
elapsed = asyncio.get_event_loop().time() - start_time
sleep_time = max(0, interval - elapsed)
if sleep_time < 0.1: # 任务超时处理
logger.warning(f"任务 {task_name} 超时执行 ({elapsed:.2f}s > {interval}s)")
# if sleep_time < 0.1: # 任务超时处理, DEBUG 时可能干扰断点
# logger.warning(f"任务 {task_name} 超时执行 ({elapsed:.2f}s > {interval}s)")
await asyncio.sleep(sleep_time)
# 非离线状态时评估兴趣
if self.mai_state_info.get_current_state() != self.mai_state_info.mai_status.OFFLINE:
await self.subheartflow_manager.evaluate_interest_and_promote()
logger.debug(f"任务循环结束, 当前状态: {self.mai_state_info.get_current_state().value}")
logger.debug(f"任务循环结束: {task_name}") # 调整日志信息
async def _perform_state_update_work(self):
"""执行状态更新工作"""
@@ -184,8 +209,15 @@ class BackgroundTaskManager:
logger.debug("[Background Task Cleanup] Cleanup cycle finished. No inactive flows found.")
async def _perform_logging_work(self):
"""执行一轮兴趣日志记录。"""
await self.interest_logger.log_interest_states()
"""执行一轮状态日志记录。"""
await self.interest_logger.log_all_states()
# --- 新增兴趣评估工作函数 ---
async def _perform_interest_eval_work(self):
"""执行一轮子心流兴趣评估与提升检查。"""
# 直接调用 subheartflow_manager 的方法,并传递当前状态信息
await self.subheartflow_manager.evaluate_interest_and_promote(self.mai_state_info)
# --- 结束新增 ---
# --- Specific Task Runners --- #
async def _run_state_update_cycle(self, interval: int):
@@ -200,5 +232,14 @@ class BackgroundTaskManager:
async def _run_logging_cycle(self):
await self._run_periodic_loop(
task_name="Interest Logging", interval=self.log_interval, task_func=self._perform_logging_work
task_name="State Logging",
interval=self.log_interval,
task_func=self._perform_logging_work
)
# --- 新增兴趣评估任务运行器 ---
async def _run_interest_eval_cycle(self):
await self._run_periodic_loop(
task_name="Interest Evaluation", interval=self.interest_eval_interval, task_func=self._perform_interest_eval_work
)
# --- 结束新增 ---