feat:优化表情包注册,迁移数据库v3

This commit is contained in:
SengokuCola
2026-04-05 20:12:21 +08:00
parent 80be746be0
commit 526fc9b763
16 changed files with 926 additions and 534 deletions

View File

@@ -1,14 +1,20 @@
from datetime import datetime
from typing import Optional, Dict
from typing import Dict, Optional
import json
from src.common.database.database_model import ActionRecord
from src.common.database.database_model import ToolRecord
from . import BaseDatabaseDataModel
class MaiActionRecord(BaseDatabaseDataModel[ActionRecord]):
class MaiActionRecord(BaseDatabaseDataModel[ToolRecord]):
"""``action_records`` 的兼容数据模型。
历史动作记录已统一并入 ``tool_records``,该类仅保留旧命名接口,
底层读写对象统一映射为 ``ToolRecord``。
"""
def __init__(
self,
action_id: str,
@@ -21,45 +27,39 @@ class MaiActionRecord(BaseDatabaseDataModel[ActionRecord]):
action_display_prompt: Optional[str] = None,
):
self.action_id = action_id
"""动作ID"""
self.timestamp = timestamp
"""时间戳"""
self.session_id = session_id
"""会话ID"""
self.action_name = action_name
"""动作名称"""
self.action_reasoning = action_reasoning
"""动作推理过程"""
self.action_data = action_data or {}
"""动作数据"""
self.action_builtin_prompt = action_builtin_prompt
"""内置动作提示"""
self.action_display_prompt = action_display_prompt
"""最终输入到 Prompt 的内容"""
@classmethod
def from_db_instance(cls, db_record: ActionRecord):
"""Create a data model object from a database record."""
def from_db_instance(cls, db_record: ToolRecord):
"""从数据库实例创建兼容数据模型对象。"""
return cls(
action_id=db_record.action_id,
action_id=db_record.tool_id,
timestamp=db_record.timestamp,
session_id=db_record.session_id,
action_name=db_record.action_name,
action_reasoning=db_record.action_reasoning,
action_data=json.loads(db_record.action_data) if db_record.action_data else None,
action_builtin_prompt=db_record.action_builtin_prompt,
action_display_prompt=db_record.action_display_prompt,
action_name=db_record.tool_name,
action_reasoning=db_record.tool_reasoning,
action_data=json.loads(db_record.tool_data) if db_record.tool_data else None,
action_builtin_prompt=db_record.tool_builtin_prompt,
action_display_prompt=db_record.tool_display_prompt,
)
def to_db_instance(self):
"""Convert the data model object back to a database instance."""
return ActionRecord(
action_id=self.action_id,
"""将兼容数据模型对象转换为 ``ToolRecord``。"""
return ToolRecord(
tool_id=self.action_id,
timestamp=self.timestamp,
session_id=self.session_id,
action_name=self.action_name,
action_reasoning=self.action_reasoning,
action_data=json.dumps(self.action_data) if self.action_data else None,
action_builtin_prompt=self.action_builtin_prompt,
action_display_prompt=self.action_display_prompt,
tool_name=self.action_name,
tool_reasoning=self.action_reasoning,
tool_data=json.dumps(self.action_data) if self.action_data else None,
tool_builtin_prompt=self.action_builtin_prompt,
tool_display_prompt=self.action_display_prompt,
)

View File

@@ -1,16 +1,17 @@
from datetime import datetime
from pathlib import Path
from PIL import Image as PILImage
from rich.traceback import install
from typing import Optional, List
import asyncio
import hashlib
import io
import traceback
from datetime import datetime
from pathlib import Path
from typing import List, Optional
from PIL import Image as PILImage
from rich.traceback import install
from src.common.database.database_model import Images, ImageType
from src.common.logger import get_logger
from . import BaseDatabaseDataModel
@@ -152,7 +153,7 @@ class MaiEmoji(BaseImageDataModel):
raise ValueError(f"数据库记录 {db_record.image_hash} 标记为文件不存在,无法创建 MaiEmoji 对象")
obj = cls(db_record.full_path)
obj.file_hash = db_record.image_hash
description = db_record.description or db_record.emotion or ""
description = db_record.description or ""
obj.description = description
normalized_tags = [
str(item).strip()
@@ -175,7 +176,6 @@ class MaiEmoji(BaseImageDataModel):
description=self.description,
full_path=str(self.full_path),
image_type=ImageType.EMOJI,
emotion=None,
query_count=self.query_count,
last_used_time=self.last_used_time,
register_time=self.register_time,