From 375f28242a4450cc325cd1fb690a3ffd61d0b21d Mon Sep 17 00:00:00 2001 From: SengokuCola <1026294844@qq.com> Date: Fri, 11 Jul 2025 11:44:13 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9A=E4=BC=98=E5=8C=96no=E2=80=94?= =?UTF-8?q?=E2=80=94reply=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../heart_flow/heartflow_message_processor.py | 11 ++-- src/chat/message_receive/message.py | 3 ++ src/chat/message_receive/storage.py | 7 ++- src/common/database/database_model.py | 2 + src/plugins/built_in/core_actions/no_reply.py | 52 +++---------------- 5 files changed, 21 insertions(+), 54 deletions(-) diff --git a/src/chat/heart_flow/heartflow_message_processor.py b/src/chat/heart_flow/heartflow_message_processor.py index 005b94bff..ba75bc350 100644 --- a/src/chat/heart_flow/heartflow_message_processor.py +++ b/src/chat/heart_flow/heartflow_message_processor.py @@ -54,7 +54,7 @@ async def _calculate_interest(message: MessageRecv) -> Tuple[float, bool]: with Timer("记忆激活"): interested_rate = await hippocampus_manager.get_activate_from_text( message.processed_plain_text, - fast_retrieval=True, + fast_retrieval=False, ) logger.debug(f"记忆激活率: {interested_rate:.2f}") @@ -106,20 +106,19 @@ class HeartFCMessageReceiver: group_info=groupinfo, ) + interested_rate, is_mentioned = await _calculate_interest(message) + message.interest_value = interested_rate + await self.storage.store_message(message, chat) subheartflow = await heartflow.get_or_create_subheartflow(chat.stream_id) message.update_chat_stream(chat) - - # 6. 兴趣度计算与更新 - interested_rate, is_mentioned = await _calculate_interest(message) + subheartflow.add_message_to_normal_chat_cache(message, interested_rate, is_mentioned) chat_mood = mood_manager.get_mood_by_chat_id(subheartflow.chat_id) asyncio.create_task(chat_mood.update_mood_by_message(message, interested_rate)) - with open("interested_rates.txt", "a", encoding="utf-8") as f: - f.write(f"{interested_rate}\n") # 7. 日志记录 mes_name = chat.group_info.group_name if chat.group_info else "私聊" diff --git a/src/chat/message_receive/message.py b/src/chat/message_receive/message.py index 7575e0e53..710d2525a 100644 --- a/src/chat/message_receive/message.py +++ b/src/chat/message_receive/message.py @@ -113,6 +113,7 @@ class MessageRecv(Message): self.is_mentioned = None self.priority_mode = "interest" self.priority_info = None + self.interest_value = None def update_chat_stream(self, chat_stream: "ChatStream"): self.chat_stream = chat_stream @@ -337,6 +338,8 @@ class MessageSending(MessageProcessBase): # 用于显示发送内容与显示不一致的情况 self.display_message = display_message + self.interest_value = 0.0 + def build_reply(self): """设置回复消息""" if self.reply: diff --git a/src/chat/message_receive/storage.py b/src/chat/message_receive/storage.py index c40c4eb75..998e06f21 100644 --- a/src/chat/message_receive/storage.py +++ b/src/chat/message_receive/storage.py @@ -1,4 +1,5 @@ import re +import traceback from typing import Union # from ...common.database.database import db # db is now Peewee's SqliteDatabase instance @@ -36,11 +37,11 @@ class MessageStorage: filtered_display_message = re.sub(pattern, "", display_message, flags=re.DOTALL) else: filtered_display_message = "" - + interest_value = 0 reply_to = message.reply_to else: filtered_display_message = "" - + interest_value = message.interest_value reply_to = "" chat_info_dict = chat_stream.to_dict() @@ -80,9 +81,11 @@ class MessageStorage: processed_plain_text=filtered_processed_plain_text, display_message=filtered_display_message, memorized_times=message.memorized_times, + interest_value=interest_value, ) except Exception: logger.exception("存储消息失败") + traceback.print_exc() @staticmethod async def store_recalled_message(message_id: str, time: str, chat_stream: ChatStream) -> None: diff --git a/src/common/database/database_model.py b/src/common/database/database_model.py index 8c2bf423b..3485fedeb 100644 --- a/src/common/database/database_model.py +++ b/src/common/database/database_model.py @@ -129,6 +129,8 @@ class Messages(BaseModel): reply_to = TextField(null=True) + interest_value = DoubleField(null=True) + # 从 chat_info 扁平化而来的字段 chat_info_stream_id = TextField() chat_info_platform = TextField() diff --git a/src/plugins/built_in/core_actions/no_reply.py b/src/plugins/built_in/core_actions/no_reply.py index b47edfb27..fa5a2fafe 100644 --- a/src/plugins/built_in/core_actions/no_reply.py +++ b/src/plugins/built_in/core_actions/no_reply.py @@ -100,7 +100,12 @@ class NoReplyAction(BaseAction): # 3. 检查累计兴趣值 if new_message_count > 0: - accumulated_interest = await self._calculate_accumulated_interest(recent_messages_dict) + accumulated_interest = 0.0 + for msg_dict in recent_messages_dict: + text = msg_dict.get("processed_plain_text", "") + interest_value = msg_dict.get("interest_value", 0.0) + if text: + accumulated_interest += interest_value logger.info(f"{self.log_prefix} 当前累计兴趣值: {accumulated_interest:.2f}") if accumulated_interest >= self._interest_exit_threshold: logger.info( @@ -139,51 +144,6 @@ class NoReplyAction(BaseAction): ) return False, f"不回复动作执行失败: {e}" - async def _calculate_accumulated_interest(self, messages_dicts: list[dict]) -> float: - """将所有新消息文本合并,然后一次性计算兴趣值""" - if not messages_dicts: - return 0.0 - - combined_text_parts = [] - is_any_mentioned = False - - for msg_dict in messages_dicts: - try: - text = msg_dict.get("processed_plain_text", "") - if text: - combined_text_parts.append(text) - except Exception as e: - logger.error(f"{self.log_prefix} 处理单条消息以计算兴趣值时出错: {e}") - - full_text = " ".join(combined_text_parts).strip() - if not full_text: - return 0.0 - - # --- 使用合并后的文本计算兴趣值 --- - - if global_config.bot.nickname in full_text: - is_any_mentioned = True - - interested_rate = 0.0 - if global_config.memory.enable_memory: - try: - interested_rate = await hippocampus_manager.get_activate_from_text( - full_text, - fast_retrieval=False, - ) - except Exception as e: - logger.error(f"{self.log_prefix} 记忆激活计算失败: {e}") - - text_len = len(full_text) - # 根据文本长度调整兴趣度 - base_interest = 0.01 + (0.05 - 0.01) * (math.log10(text_len + 1) / math.log10(1000 + 1)) - base_interest = min(max(base_interest, 0.01), 0.05) - interested_rate += base_interest - - if is_any_mentioned: - interested_rate += 1 - - return interested_rate @classmethod def reset_consecutive_count(cls):