106 lines
3.4 KiB
Python
106 lines
3.4 KiB
Python
from typing import Optional
|
|
from .personality import Personality
|
|
from .identity import Identity
|
|
|
|
class Individuality:
|
|
"""个体特征管理类"""
|
|
_instance = None
|
|
|
|
def __new__(cls, *args, **kwargs):
|
|
if cls._instance is None:
|
|
cls._instance = super().__new__(cls)
|
|
return cls._instance
|
|
|
|
def __init__(self):
|
|
self.personality: Optional[Personality] = None
|
|
self.identity: Optional[Identity] = None
|
|
|
|
@classmethod
|
|
def get_instance(cls) -> 'Individuality':
|
|
"""获取Individuality单例实例
|
|
|
|
Returns:
|
|
Individuality: 单例实例
|
|
"""
|
|
if cls._instance is None:
|
|
cls._instance = cls()
|
|
return cls._instance
|
|
|
|
def initialize(self, bot_nickname: str, personality_core: str, personality_sides: list,
|
|
identity_detail: list, height: int, weight: int, age: int,
|
|
gender: str, appearance: str) -> None:
|
|
"""初始化个体特征
|
|
|
|
Args:
|
|
bot_nickname: 机器人昵称
|
|
personality_core: 人格核心特点
|
|
personality_sides: 人格侧面描述
|
|
identity_detail: 身份细节描述
|
|
height: 身高(厘米)
|
|
weight: 体重(千克)
|
|
age: 年龄
|
|
gender: 性别
|
|
appearance: 外貌特征
|
|
"""
|
|
# 初始化人格
|
|
self.personality = Personality.initialize(
|
|
bot_nickname=bot_nickname,
|
|
personality_core=personality_core,
|
|
personality_sides=personality_sides
|
|
)
|
|
|
|
# 初始化身份
|
|
self.identity = Identity.initialize(
|
|
identity_detail=identity_detail,
|
|
height=height,
|
|
weight=weight,
|
|
age=age,
|
|
gender=gender,
|
|
appearance=appearance
|
|
)
|
|
|
|
def to_dict(self) -> dict:
|
|
"""将个体特征转换为字典格式"""
|
|
return {
|
|
"personality": self.personality.to_dict() if self.personality else None,
|
|
"identity": self.identity.to_dict() if self.identity else None
|
|
}
|
|
|
|
@classmethod
|
|
def from_dict(cls, data: dict) -> 'Individuality':
|
|
"""从字典创建个体特征实例"""
|
|
instance = cls.get_instance()
|
|
if data.get("personality"):
|
|
instance.personality = Personality.from_dict(data["personality"])
|
|
if data.get("identity"):
|
|
instance.identity = Identity.from_dict(data["identity"])
|
|
return instance
|
|
|
|
def get_prompt(self,type,x_person,level):
|
|
"""
|
|
获取个体特征的prompt
|
|
"""
|
|
if type == "personality":
|
|
return self.personality.get_prompt(x_person,level)
|
|
elif type == "identity":
|
|
return self.identity.get_prompt(x_person,level)
|
|
else:
|
|
return ""
|
|
|
|
def get_traits(self,factor):
|
|
"""
|
|
获取个体特征的特质
|
|
"""
|
|
if factor == "openness":
|
|
return self.personality.openness
|
|
elif factor == "conscientiousness":
|
|
return self.personality.conscientiousness
|
|
elif factor == "extraversion":
|
|
return self.personality.extraversion
|
|
elif factor == "agreeableness":
|
|
return self.personality.agreeableness
|
|
elif factor == "neuroticism":
|
|
return self.personality.neuroticism
|
|
|
|
|