mirror of https://github.com/Mai-with-u/MaiBot.git
pfc_relationship 合并
parent
7316b30aa0
commit
32ace682d3
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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}。"
|
|
||||||
Loading…
Reference in New Issue