数据仓库 (Repository)
字数
652 字
阅读时间
4 分钟
通过 repository 接口访问存储层,业务逻辑不直接读写 JSON。后续切换到 SQLite 只需更换 repository 实现。
概述
python
# 当前实现
ProfileRepository -> JsonStore
CharacterStateRepository -> JsonStore
RelationshipRepository -> JsonStore
# 未来可切换
ProfileRepository -> SQLiteStore
CharacterStateRepository -> SQLiteStore
RelationshipRepository -> SQLiteStoreProfileRepository - 角色卡仓库
python
class ProfileRepository:
def __init__(self, base_dir: str)
def get(self, character_id: str) -> Optional[CharacterProfile]
def save(self, profile: CharacterProfile) -> None
def delete(self, character_id: str) -> bool
def list_all(self) -> List[CharacterProfile]
def get_or_create_by_personality(self, personality_data: Dict) -> CharacterProfile使用示例
python
from nbot.character.repository import ProfileRepository
profile_repo = ProfileRepository(base_dir)
# 获取角色卡
profile = profile_repo.get("neko_girl")
# 保存角色卡
profile_repo.save(profile)
# 列出所有角色卡
profiles = profile_repo.list_all()
# 从旧 personality 数据获取或创建
profile = profile_repo.get_or_create_by_personality({
"name": "本子娘",
"personality": "温柔、黏人",
})CharacterStateRepository - 角色状态仓库
python
class CharacterStateRepository:
def __init__(self, base_dir: str)
def get(self, character_id: str, scope_id: str) -> Optional[CharacterState]
def get_or_create(
self,
character_id: str,
scope_id: str,
initial_state: Optional[Dict] = None,
) -> CharacterState
def save(self, state: CharacterState) -> None
def delete(self, character_id: str, scope_id: str) -> bool
def list_by_character(self, character_id: str) -> List[CharacterState]使用示例
python
from nbot.character.repository import CharacterStateRepository
state_repo = CharacterStateRepository(base_dir)
# 获取状态
state = state_repo.get("neko_girl", "web:session_123")
# 获取或创建状态
state = state_repo.get_or_create(
character_id="neko_girl",
scope_id="web:session_123",
initial_state={"mood": "开心", "energy": 80}
)
# 保存状态
state_repo.save(state)
# 列出角色的所有状态
states = state_repo.list_by_character("neko_girl")RelationshipRepository - 关系仓库
python
class RelationshipRepository:
def __init__(self, base_dir: str)
def get(self, character_id: str, target_id: str) -> Optional[RelationshipState]
def get_or_create(self, character_id: str, target_id: str) -> RelationshipState
def save(self, relationship: RelationshipState) -> None
def delete(self, character_id: str, target_id: str) -> bool
def list_by_character(self, character_id: str) -> List[RelationshipState]使用示例
python
from nbot.character.repository import RelationshipRepository
relationship_repo = RelationshipRepository(base_dir)
# 获取关系
relationship = relationship_repo.get("neko_girl", "user_123")
# 获取或创建关系
relationship = relationship_repo.get_or_create(
character_id="neko_girl",
target_id="user_123"
)
# 保存关系
relationship_repo.save(relationship)
# 列出角色的所有关系
relationships = relationship_repo.list_by_character("neko_girl")存储位置
数据存储在 data/character/ 目录:
data/character/
├── profiles.json # 角色卡(ProfileRepository)
├── states.json # 角色状态(CharacterStateRepository)
├── relationships.json # 关系状态(RelationshipRepository)
├── memories.json # 角色记忆
├── events.json # 事件记录
└── debug_snapshots.json # 调试快照JSON 存储格式
profiles.json
json
{
"neko_girl": {
"id": "neko_girl",
"name": "本子娘",
"basic_info": "...",
"personality": "...",
"initial_state": {"mood": "开心"}
}
}states.json
json
{
"neko_girl::web:session_123": {
"character_id": "neko_girl",
"scope_id": "web:session_123",
"mood": "开心",
"mood_intensity": 0.8,
"energy": 75
}
}relationships.json
json
{
"neko_girl::user_123": {
"character_id": "neko_girl",
"target_id": "user_123",
"affection": 60,
"trust": 55,
"familiarity": 40,
"dependency": 35,
"security": 50,
"jealousy": 0
}
}线程安全
JsonStore 内部使用线程锁保证线程安全:
python
class JsonStore:
def __init__(self, file_path: str):
self._lock = threading.Lock()
def get(self, key: str):
with self._lock:
data = self._load()
return data.get(key)缓存机制
JsonStore 内部有缓存机制,避免频繁文件 IO:
python
def _load(self) -> Dict[str, Any]:
if self._cache is not None:
return self._cache
# 从文件加载
...
self._cache = data
return self._cache后续规划
- [ ] SQLiteRepository 实现
- [ ] RedisRepository 实现
- [ ] 缓存策略优化
- [ ] 数据迁移工具
