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

@@ -41,6 +41,7 @@ class ImageManager:
"""初始化图片管理器。"""
_ensure_image_dir_exists()
self._pending_description_tasks: Dict[str, asyncio.Task[None]] = {}
self.cleanup_legacy_image_registration_records()
logger.info("图片管理器初始化完成")
@@ -50,6 +51,17 @@ class ImageManager:
statement = select(Images).filter_by(image_hash=image_hash, image_type=ImageType.IMAGE).limit(1)
return session.exec(statement).first()
def _normalize_image_registration_fields(self, record: Images) -> bool:
"""Normalize accidental emoji registration fields on image records."""
if record.image_type != ImageType.IMAGE:
return False
if not record.is_registered and record.register_time is None:
return False
record.is_registered = False
record.register_time = None
return True
async def get_image_description(
self,
*,
@@ -182,8 +194,9 @@ class ImageManager:
try:
with get_db_session() as session:
record = image.to_db_instance()
record.is_registered = True
record.register_time = record.last_used_time = datetime.now()
record.is_registered = False
record.register_time = None
record.last_used_time = datetime.now()
session.add(record)
session.flush() # 确保记录被写入数据库以获取ID
record_id = record.id
@@ -209,6 +222,7 @@ class ImageManager:
if not record:
logger.error(f"未找到哈希值为 {image.file_hash} 的图片记录,无法更新描述")
return False
self._normalize_image_registration_fields(record)
record.description = image.description
record.last_used_time = datetime.now()
record.vlm_processed = image.vlm_processed
@@ -258,6 +272,7 @@ class ImageManager:
with get_db_session() as session:
statement = select(Images).filter_by(image_hash=hash_str, image_type=ImageType.IMAGE).limit(1)
if record := session.exec(statement).first():
self._normalize_image_registration_fields(record)
logger.info(f"图片已存在于数据库中,哈希值: {hash_str}")
record.last_used_time = datetime.now()
record.query_count += 1
@@ -335,6 +350,24 @@ class ImageManager:
logger.info(f"清理完成: {invalid_counter} 条无效描述记录,{null_path_counter} 条文件路径不存在记录")
def cleanup_legacy_image_registration_records(self) -> None:
"""Clean up legacy image records with mistaken registration fields."""
fixed_counter = 0
try:
with get_db_session() as session:
statement = select(Images).filter_by(image_type=ImageType.IMAGE)
for record in session.exec(statement).yield_per(100):
if not self._normalize_image_registration_fields(record):
continue
session.add(record)
fixed_counter += 1
except Exception as e:
logger.error(f"Failed to clean image registration state: {e}")
return
if fixed_counter:
logger.info(f"Cleaned mistaken registration state on {fixed_counter} image records")
async def _generate_image_description(self, image_bytes: bytes, image_format: str) -> str:
prompt = global_config.personality.visual_style
image_base64 = base64.b64encode(image_bytes).decode("utf-8")