pfc_relationship 合并

pull/937/head
Bakadax 2025-05-07 15:20:02 +08:00
parent 7316b30aa0
commit 32ace682d3
3 changed files with 77 additions and 94 deletions

View File

@ -7,33 +7,18 @@ from .pfc_utils import get_items_from_json # 导入JSON解析工具
from typing import Dict, Any, Optional, Set, List from typing import Dict, Any, Optional, Set, List
from dateutil import tz from dateutil import tz
# 导入日志记录器
from src.common.logger_manager import get_logger from src.common.logger_manager import get_logger
# 导入聊天消息构建和获取工具
from src.plugins.utils.chat_message_builder import build_readable_messages, get_raw_msg_before_timestamp_with_chat from src.plugins.utils.chat_message_builder import build_readable_messages, get_raw_msg_before_timestamp_with_chat
# 导入消息相关的数据结构
from maim_message import UserInfo from maim_message import UserInfo
# 导入聊天流管理器和聊天流类
from src.plugins.chat.chat_stream import chat_manager, ChatStream from src.plugins.chat.chat_stream import chat_manager, ChatStream
# 导入聊天消息类
from ..chat.message import Message # 假设 Message 类在这里 from ..chat.message import Message # 假设 Message 类在这里
# 导入全局配置
from ...config.config import global_config from ...config.config import global_config
# 导入用户信息
from ..person_info.person_info import person_info_manager from ..person_info.person_info import person_info_manager
from ..person_info.relationship_manager import relationship_manager from ..person_info.relationship_manager import relationship_manager
# 导入关系
from .pfc_relationship_translator import translate_relationship_value_to_text
# 导入情绪 # 导入情绪
from ..moods.moods import MoodManager from ..moods.moods import MoodManager
from .pfc_relationship_updater import PfcRelationshipUpdater # 新增 from .pfc_relationship import PfcRelationshipUpdater, PfcRepationshipTranslator
from .pfc_emotion_updater import PfcEmotionUpdater # 新增 from .pfc_emotion_updater import PfcEmotionUpdater # 新增
# 导入 PFC 内部组件和类型 # 导入 PFC 内部组件和类型
@ -101,6 +86,7 @@ class Conversation:
# 初始化所有核心组件为 None将在 _initialize 中创建 # 初始化所有核心组件为 None将在 _initialize 中创建
self.relationship_updater: Optional[PfcRelationshipUpdater] = None # 新增 self.relationship_updater: Optional[PfcRelationshipUpdater] = None # 新增
self.relationshop_translator: Optional[PfcRepationshipTranslator] = None
self.emotion_updater: Optional[PfcEmotionUpdater] = None # 新增 self.emotion_updater: Optional[PfcEmotionUpdater] = None # 新增
self.action_planner: Optional[ActionPlanner] = None self.action_planner: Optional[ActionPlanner] = None
self.goal_analyzer: Optional[GoalAnalyzer] = None self.goal_analyzer: Optional[GoalAnalyzer] = None
@ -301,7 +287,7 @@ class Conversation:
numeric_relationship_value = 0.0 numeric_relationship_value = 0.0
# 2. 使用PFC内部翻译函数 # 2. 使用PFC内部翻译函数
self.conversation_info.relationship_text = translate_relationship_value_to_text(numeric_relationship_value) self.conversation_info.relationship_text = self.relationshop_translator.translate_relationship_value_to_text(numeric_relationship_value)
logger.info(f"[私聊][{self.private_name}] 初始化时加载关系文本: {self.conversation_info.relationship_text}") logger.info(f"[私聊][{self.private_name}] 初始化时加载关系文本: {self.conversation_info.relationship_text}")
except Exception as e_init_rel: except Exception as e_init_rel:
logger.error(f"[私聊][{self.private_name}] 初始化时加载关系文本出错: {e_init_rel}") logger.error(f"[私聊][{self.private_name}] 初始化时加载关系文本出错: {e_init_rel}")
@ -586,7 +572,7 @@ class Conversation:
logger.debug(f"[私聊][{self.private_name}] 获取到数值型关系值: {numeric_relationship_value}") logger.debug(f"[私聊][{self.private_name}] 获取到数值型关系值: {numeric_relationship_value}")
# 2. 使用PFC内部的翻译函数将其转换为文本描述 # 2. 使用PFC内部的翻译函数将其转换为文本描述
simplified_relationship_text = translate_relationship_value_to_text(numeric_relationship_value) simplified_relationship_text = self.relationshop_translator.translate_relationship_value_to_text(numeric_relationship_value)
self.conversation_info.relationship_text = simplified_relationship_text self.conversation_info.relationship_text = simplified_relationship_text
logger.debug(f"[私聊][{self.private_name}] 更新后关系文本 (PFC内部翻译): {self.conversation_info.relationship_text}") logger.debug(f"[私聊][{self.private_name}] 更新后关系文本 (PFC内部翻译): {self.conversation_info.relationship_text}")
@ -618,7 +604,7 @@ class Conversation:
numeric_relationship_value = float(numeric_relationship_value.to_decimal()) numeric_relationship_value = float(numeric_relationship_value.to_decimal())
else: else:
numeric_relationship_value = 0.0 numeric_relationship_value = 0.0
self.conversation_info.relationship_text = translate_relationship_value_to_text(numeric_relationship_value) self.conversation_info.relationship_text = self.relationshop_translator.translate_relationship_value_to_text(numeric_relationship_value)
logger.debug(f"[私聊][{self.private_name}] (备用逻辑)更新后关系文本: {self.conversation_info.relationship_text}") logger.debug(f"[私聊][{self.private_name}] (备用逻辑)更新后关系文本: {self.conversation_info.relationship_text}")
except ValueError: except ValueError:

View File

@ -4,22 +4,13 @@ from src.plugins.models.utils_model import LLMRequest
from src.plugins.person_info.person_info import person_info_manager from src.plugins.person_info.person_info import person_info_manager
from src.plugins.person_info.relationship_manager import relationship_manager # 主要用其 ensure_float 和 build_relationship_info from src.plugins.person_info.relationship_manager import relationship_manager # 主要用其 ensure_float 和 build_relationship_info
from src.plugins.utils.chat_message_builder import build_readable_messages from src.plugins.utils.chat_message_builder import build_readable_messages
from src.plugins.PFC.observation_info import ObservationInfo
# 从PFC内部导入必要的类 (根据你的项目结构调整当前假设与PFC核心文件同级或有正确路径) from src.plugins.PFC.conversation_info import ConversationInfo
try: from src.plugins.PFC.pfc_utils import get_items_from_json
from .observation_info import ObservationInfo from src.config.config import global_config # 导入全局配置 (向上两级到 src/, 再到 config)
from .conversation_info import ConversationInfo
from .pfc_utils import get_items_from_json
except ImportError: # 如果直接从 plugins/PFC 目录运行,上面的相对导入会失败,尝试绝对导入
from observation_info import ObservationInfo
from conversation_info import ConversationInfo
from pfc_utils import get_items_from_json
from ...config.config import global_config # 导入全局配置 (向上两级到 src/, 再到 config) logger = get_logger("pfc_relationship")
logger = get_logger("pfc_relationship_updater")
class PfcRelationshipUpdater: class PfcRelationshipUpdater:
def __init__(self, private_name: str, bot_name: str): def __init__(self, private_name: str, bot_name: str):
@ -216,4 +207,70 @@ class PfcRelationshipUpdater:
logger.info(f"[私聊][{self.private_name}] 最终关系值更新:与【{sender_name_for_prompt}】的关系值从 {current_relationship_value:.2f} 调整了 {adjustment_val:.2f},最终为 {new_relationship_value:.2f}") logger.info(f"[私聊][{self.private_name}] 最终关系值更新:与【{sender_name_for_prompt}】的关系值从 {current_relationship_value:.2f} 调整了 {adjustment_val:.2f},最终为 {new_relationship_value:.2f}")
if conversation_info.person_id: # 虽然通常结束了,但更新一下无妨 if conversation_info.person_id: # 虽然通常结束了,但更新一下无妨
conversation_info.relationship_text = await self.relationship_mng.build_relationship_info(conversation_info.person_id, is_id=True) conversation_info.relationship_text = await self.relationship_mng.build_relationship_info(conversation_info.person_id, is_id=True)
class PfcRepationshipTranslator:
"""直接完整导入群聊的relationship_manager.py可能不可取
因为对于PFC的planner来说
其暗示了选择回复
所以新建代码文件来适配PFC的决策层面"""
def __init__(self):
pass
@staticmethod
def translate_relationship_value_to_text(self, relationship_value: float) -> str:
"""
将数值型的关系值转换为PFC私聊场景下简洁的关系描述文本
"""
level_num = self._calculate_relationship_level_num(relationship_value)
relationship_descriptions = [
"厌恶", # level_num 0
"冷漠", # level_num 1
"初识", # level_num 2
"友好", # level_num 3
"喜欢", # level_num 4
"暧昧" # level_num 5
]
if 0 <= level_num < len(relationship_descriptions):
description = relationship_descriptions[level_num]
else:
description = "普通" # 默认或错误情况
logger.warning(f"计算出的 level_num ({level_num}) 无效,关系描述默认为 '普通'")
return f"你们的关系是:{description}"
@staticmethod
def _calculate_relationship_level_num(relationship_value: float) -> int:
"""
根据关系值计算关系等级编号 (0-5)
这里的阈值应与 relationship_manager.py 中的保持一致
"""
if not isinstance(relationship_value, (int, float)):
logger.warning(f"传入的 relationship_value '{relationship_value}' 不是有效的数值类型默认为0。")
relationship_value = 0.0
if -1000 <= relationship_value < -227:
level_num = 0 # 厌恶
elif -227 <= relationship_value < -73:
level_num = 1 # 冷漠
elif -73 <= relationship_value < 227:
level_num = 2 # 普通/认识
elif 227 <= relationship_value < 587:
level_num = 3 # 友好
elif 587 <= relationship_value < 900:
level_num = 4 # 喜欢
elif 900 <= relationship_value <= 1000:
level_num = 5 # 暧昧
else:
# 超出范围的值处理
if relationship_value > 1000:
level_num = 5
elif relationship_value < -1000:
level_num = 0
else: # 理论上不会到这里,除非前面的条件逻辑有误
logger.warning(f"关系值 {relationship_value} 未落入任何预设范围,默认为普通。")
level_num = 2
return level_num

View File

@ -1,60 +0,0 @@
# 直接完整导入群聊的relationship_manager.py可能不可取因为对于PFC的planner来说其暗示了选择回复所以新建代码文件来适配PFC的决策层面
from src.common.logger_manager import get_logger
logger = get_logger("pfc_relationship_translator")
# 这个函数复用 relationship_manager.py 中的 calculate_level_num 的逻辑
def _calculate_relationship_level_num(relationship_value: float) -> int:
"""
根据关系值计算关系等级编号 (0-5)
这里的阈值应与 relationship_manager.py 中的保持一致
"""
if not isinstance(relationship_value, (int, float)):
logger.warning(f"传入的 relationship_value '{relationship_value}' 不是有效的数值类型默认为0。")
relationship_value = 0.0
if -1000 <= relationship_value < -227:
level_num = 0 # 厌恶
elif -227 <= relationship_value < -73:
level_num = 1 # 冷漠
elif -73 <= relationship_value < 227:
level_num = 2 # 普通/认识
elif 227 <= relationship_value < 587:
level_num = 3 # 友好
elif 587 <= relationship_value < 900:
level_num = 4 # 喜欢
elif 900 <= relationship_value <= 1000:
level_num = 5 # 暧昧
else:
# 超出范围的值处理
if relationship_value > 1000:
level_num = 5
elif relationship_value < -1000:
level_num = 0
else: # 理论上不会到这里,除非前面的条件逻辑有误
logger.warning(f"关系值 {relationship_value} 未落入任何预设范围,默认为普通。")
level_num = 2
return level_num
def translate_relationship_value_to_text(relationship_value: float) -> str:
"""
将数值型的关系值转换为PFC私聊场景下简洁的关系描述文本
"""
level_num = _calculate_relationship_level_num(relationship_value)
relationship_descriptions = [
"厌恶", # level_num 0
"冷漠", # level_num 1
"初识", # level_num 2
"友好", # level_num 3
"喜欢", # level_num 4
"暧昧" # level_num 5
]
if 0 <= level_num < len(relationship_descriptions):
description = relationship_descriptions[level_num]
else:
description = "普通" # 默认或错误情况
logger.warning(f"计算出的 level_num ({level_num}) 无效,关系描述默认为 '普通'")
return f"你们的关系是:{description}"