refactor(context): 将能量值和睡眠压力状态持久化到数据库
将HFC上下文中的能量值(energy_value)和睡眠压力(sleep_pressure)的状态管理从本地文件存储(local_storage)迁移到主数据库。 这一重构的主要改动包括: - 在`ChatStreams`数据库模型中添加`energy_value`和`sleep_pressure`字段。 - 更新`ChatStream`类,使其能够加载和保存这两个新字段。 - 移除`HfcContext`中原有的基于`local_storage`的加载和保存逻辑,改为直接通过`ChatStream`实例进行状态读写。 - 在`EnergyManager`中,每当能量或睡眠压力发生变化时,调用`save_context_state()`方法,确保状态能够实时持久化。 此举统一了应用的状态管理方式,提高了数据的可靠性和一致性,并为后续在多实例或分布式环境下部署应用奠定了基础。
This commit is contained in:
@@ -102,6 +102,7 @@ class EnergyManager:
|
|||||||
self.context.sleep_pressure -= decay_per_10s
|
self.context.sleep_pressure -= decay_per_10s
|
||||||
self.context.sleep_pressure = max(self.context.sleep_pressure, 0)
|
self.context.sleep_pressure = max(self.context.sleep_pressure, 0)
|
||||||
self._log_sleep_pressure_change("睡眠压力释放")
|
self._log_sleep_pressure_change("睡眠压力释放")
|
||||||
|
self.context.save_context_state()
|
||||||
else:
|
else:
|
||||||
# 清醒时:处理能量衰减
|
# 清醒时:处理能量衰减
|
||||||
is_group_chat = self.context.chat_stream.group_info is not None
|
is_group_chat = self.context.chat_stream.group_info is not None
|
||||||
@@ -122,6 +123,7 @@ class EnergyManager:
|
|||||||
self.context.energy_value = max(self.context.energy_value, 0.3)
|
self.context.energy_value = max(self.context.energy_value, 0.3)
|
||||||
|
|
||||||
self._log_energy_change("能量值衰减")
|
self._log_energy_change("能量值衰减")
|
||||||
|
self.context.save_context_state()
|
||||||
|
|
||||||
def _should_log_energy(self) -> bool:
|
def _should_log_energy(self) -> bool:
|
||||||
"""
|
"""
|
||||||
@@ -149,6 +151,7 @@ class EnergyManager:
|
|||||||
self.context.sleep_pressure += increment
|
self.context.sleep_pressure += increment
|
||||||
self.context.sleep_pressure = min(self.context.sleep_pressure, 100.0) # 设置一个100的上限
|
self.context.sleep_pressure = min(self.context.sleep_pressure, 100.0) # 设置一个100的上限
|
||||||
self._log_sleep_pressure_change("执行动作,睡眠压力累积")
|
self._log_sleep_pressure_change("执行动作,睡眠压力累积")
|
||||||
|
self.context.save_context_state()
|
||||||
|
|
||||||
def _log_energy_change(self, action: str, reason: str = ""):
|
def _log_energy_change(self, action: str, reason: str = ""):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ from typing import List, Optional, TYPE_CHECKING
|
|||||||
import time
|
import time
|
||||||
from src.chat.message_receive.chat_stream import ChatStream, get_chat_manager
|
from src.chat.message_receive.chat_stream import ChatStream, get_chat_manager
|
||||||
from src.common.logger import get_logger
|
from src.common.logger import get_logger
|
||||||
from src.manager.local_store_manager import local_storage
|
|
||||||
from src.person_info.relationship_builder_manager import RelationshipBuilder
|
from src.person_info.relationship_builder_manager import RelationshipBuilder
|
||||||
from src.chat.express.expression_learner import ExpressionLearner
|
from src.chat.express.expression_learner import ExpressionLearner
|
||||||
from src.plugin_system.base.component_types import ChatMode
|
from src.plugin_system.base.component_types import ChatMode
|
||||||
@@ -42,8 +41,8 @@ class HfcContext:
|
|||||||
self.expression_learner: Optional[ExpressionLearner] = None
|
self.expression_learner: Optional[ExpressionLearner] = None
|
||||||
|
|
||||||
self.loop_mode = ChatMode.NORMAL
|
self.loop_mode = ChatMode.NORMAL
|
||||||
self.energy_value = 5.0
|
self.energy_value = self.chat_stream.energy_value
|
||||||
self.sleep_pressure = 0.0
|
self.sleep_pressure = self.chat_stream.sleep_pressure
|
||||||
self.was_sleeping = False # 用于检测睡眠状态的切换
|
self.was_sleeping = False # 用于检测睡眠状态的切换
|
||||||
|
|
||||||
self.last_message_time = time.time()
|
self.last_message_time = time.time()
|
||||||
@@ -61,30 +60,8 @@ class HfcContext:
|
|||||||
self.wakeup_manager: Optional['WakeUpManager'] = None
|
self.wakeup_manager: Optional['WakeUpManager'] = None
|
||||||
self.energy_manager: Optional['EnergyManager'] = None
|
self.energy_manager: Optional['EnergyManager'] = None
|
||||||
|
|
||||||
self._load_context_state()
|
|
||||||
|
|
||||||
def _get_storage_key(self) -> str:
|
|
||||||
"""获取当前聊天流的本地存储键"""
|
|
||||||
return f"hfc_context_state_{self.stream_id}"
|
|
||||||
|
|
||||||
def _load_context_state(self):
|
|
||||||
"""从本地存储加载状态"""
|
|
||||||
state = local_storage[self._get_storage_key()]
|
|
||||||
if state and isinstance(state, dict):
|
|
||||||
self.energy_value = state.get("energy_value", 5.0)
|
|
||||||
self.sleep_pressure = state.get("sleep_pressure", 0.0)
|
|
||||||
logger = get_logger("hfc_context")
|
|
||||||
logger.info(f"{self.log_prefix} 成功从本地存储加载HFC上下文状态: {state}")
|
|
||||||
else:
|
|
||||||
logger = get_logger("hfc_context")
|
|
||||||
logger.info(f"{self.log_prefix} 未找到本地HFC上下文状态,将使用默认值初始化。")
|
|
||||||
|
|
||||||
def save_context_state(self):
|
def save_context_state(self):
|
||||||
"""将当前状态保存到本地存储"""
|
"""将当前状态保存到聊天流"""
|
||||||
state = {
|
if self.chat_stream:
|
||||||
"energy_value": self.energy_value,
|
self.chat_stream.energy_value = self.energy_value
|
||||||
"sleep_pressure": self.sleep_pressure,
|
self.chat_stream.sleep_pressure = self.sleep_pressure
|
||||||
}
|
|
||||||
local_storage[self._get_storage_key()] = state
|
|
||||||
logger = get_logger("hfc_context")
|
|
||||||
logger.debug(f"{self.log_prefix} 已将HFC上下文状态保存到本地存储: {state}")
|
|
||||||
@@ -77,6 +77,8 @@ class ChatStream:
|
|||||||
self.group_info = group_info
|
self.group_info = group_info
|
||||||
self.create_time = data.get("create_time", time.time()) if data else time.time()
|
self.create_time = data.get("create_time", time.time()) if data else time.time()
|
||||||
self.last_active_time = data.get("last_active_time", self.create_time) if data else self.create_time
|
self.last_active_time = data.get("last_active_time", self.create_time) if data else self.create_time
|
||||||
|
self.energy_value = data.get("energy_value", 5.0) if data else 5.0
|
||||||
|
self.sleep_pressure = data.get("sleep_pressure", 0.0) if data else 0.0
|
||||||
self.saved = False
|
self.saved = False
|
||||||
self.context: ChatMessageContext = None # type: ignore # 用于存储该聊天的上下文信息
|
self.context: ChatMessageContext = None # type: ignore # 用于存储该聊天的上下文信息
|
||||||
|
|
||||||
@@ -89,6 +91,8 @@ class ChatStream:
|
|||||||
"group_info": self.group_info.to_dict() if self.group_info else None,
|
"group_info": self.group_info.to_dict() if self.group_info else None,
|
||||||
"create_time": self.create_time,
|
"create_time": self.create_time,
|
||||||
"last_active_time": self.last_active_time,
|
"last_active_time": self.last_active_time,
|
||||||
|
"energy_value": self.energy_value,
|
||||||
|
"sleep_pressure": self.sleep_pressure,
|
||||||
}
|
}
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@@ -249,7 +253,7 @@ class ChatManager:
|
|||||||
"user_cardname": model_instance.user_cardname or "",
|
"user_cardname": model_instance.user_cardname or "",
|
||||||
}
|
}
|
||||||
group_info_data = None
|
group_info_data = None
|
||||||
if model_instance.group_id: # 假设 group_id 为空字符串表示没有群组信息
|
if model_instance.group_id:
|
||||||
group_info_data = {
|
group_info_data = {
|
||||||
"platform": model_instance.group_platform,
|
"platform": model_instance.group_platform,
|
||||||
"group_id": model_instance.group_id,
|
"group_id": model_instance.group_id,
|
||||||
@@ -263,6 +267,8 @@ class ChatManager:
|
|||||||
"group_info": group_info_data,
|
"group_info": group_info_data,
|
||||||
"create_time": model_instance.create_time,
|
"create_time": model_instance.create_time,
|
||||||
"last_active_time": model_instance.last_active_time,
|
"last_active_time": model_instance.last_active_time,
|
||||||
|
"energy_value": model_instance.energy_value,
|
||||||
|
"sleep_pressure": model_instance.sleep_pressure,
|
||||||
}
|
}
|
||||||
stream = ChatStream.from_dict(data_for_from_dict)
|
stream = ChatStream.from_dict(data_for_from_dict)
|
||||||
# 更新用户信息和群组信息
|
# 更新用户信息和群组信息
|
||||||
@@ -346,6 +352,8 @@ class ChatManager:
|
|||||||
"group_platform": group_info_d["platform"] if group_info_d else "",
|
"group_platform": group_info_d["platform"] if group_info_d else "",
|
||||||
"group_id": group_info_d["group_id"] if group_info_d else "",
|
"group_id": group_info_d["group_id"] if group_info_d else "",
|
||||||
"group_name": group_info_d["group_name"] if group_info_d else "",
|
"group_name": group_info_d["group_name"] if group_info_d else "",
|
||||||
|
"energy_value": s_data_dict.get("energy_value", 5.0),
|
||||||
|
"sleep_pressure": s_data_dict.get("sleep_pressure", 0.0),
|
||||||
}
|
}
|
||||||
|
|
||||||
# 根据数据库类型选择插入语句
|
# 根据数据库类型选择插入语句
|
||||||
@@ -411,6 +419,8 @@ class ChatManager:
|
|||||||
"group_info": group_info_data,
|
"group_info": group_info_data,
|
||||||
"create_time": model_instance.create_time,
|
"create_time": model_instance.create_time,
|
||||||
"last_active_time": model_instance.last_active_time,
|
"last_active_time": model_instance.last_active_time,
|
||||||
|
"energy_value": model_instance.energy_value,
|
||||||
|
"sleep_pressure": model_instance.sleep_pressure,
|
||||||
}
|
}
|
||||||
loaded_streams_data.append(data_for_from_dict)
|
loaded_streams_data.append(data_for_from_dict)
|
||||||
session.commit()
|
session.commit()
|
||||||
|
|||||||
@@ -48,6 +48,8 @@ class ChatStreams(Base):
|
|||||||
user_id = Column(get_string_field(100), nullable=False, index=True)
|
user_id = Column(get_string_field(100), nullable=False, index=True)
|
||||||
user_nickname = Column(Text, nullable=False)
|
user_nickname = Column(Text, nullable=False)
|
||||||
user_cardname = Column(Text, nullable=True)
|
user_cardname = Column(Text, nullable=True)
|
||||||
|
energy_value = Column(Float, nullable=True, default=5.0)
|
||||||
|
sleep_pressure = Column(Float, nullable=True, default=0.0)
|
||||||
|
|
||||||
__table_args__ = (
|
__table_args__ = (
|
||||||
Index('idx_chatstreams_stream_id', 'stream_id'),
|
Index('idx_chatstreams_stream_id', 'stream_id'),
|
||||||
|
|||||||
Reference in New Issue
Block a user