fix:修复hfc根本不会被触发的bug
This commit is contained in:
@@ -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
|
||||
)
|
||||
# --- 结束新增 ---
|
||||
|
||||
Reference in New Issue
Block a user