mirror of https://github.com/Mai-with-u/MaiBot.git
修复表情注册占位描述的兜底逻辑
parent
4d5456ed4b
commit
56f12e0a94
|
|
@ -34,6 +34,36 @@ MAX_EMOJI_FOR_PROMPT = 20 # 最大允许的表情包描述数量于图片替换
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
PLACEHOLDER_KEYWORDS = (
|
||||||
|
"请描述这个表情包",
|
||||||
|
"请描述这张表情包",
|
||||||
|
"请描述这张图片",
|
||||||
|
"抱歉,我无法查看图片",
|
||||||
|
"抱歉,我無法查看圖片",
|
||||||
|
"please describe this sticker",
|
||||||
|
"please describe the sticker",
|
||||||
|
"please describe this image",
|
||||||
|
"please describe the image",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def _normalize_description_for_placeholder_check(description: str) -> str:
|
||||||
|
text = description.strip()
|
||||||
|
if text.startswith("[") and text.endswith("]"):
|
||||||
|
text = text[1:-1].strip()
|
||||||
|
lowered = text.lower()
|
||||||
|
for prefix in ("表情包:", "表情包:", "emoji:", "emoji:", "图片:", "图片:", "image:", "image:"):
|
||||||
|
if lowered.startswith(prefix):
|
||||||
|
text = text[len(prefix) :].strip()
|
||||||
|
break
|
||||||
|
return text
|
||||||
|
|
||||||
|
|
||||||
|
def looks_like_placeholder_description(description: str) -> bool:
|
||||||
|
normalized = _normalize_description_for_placeholder_check(description)
|
||||||
|
lowered = normalized.lower()
|
||||||
|
return any(keyword in lowered for keyword in PLACEHOLDER_KEYWORDS)
|
||||||
|
|
||||||
|
|
||||||
class MaiEmoji:
|
class MaiEmoji:
|
||||||
"""定义一个表情包"""
|
"""定义一个表情包"""
|
||||||
|
|
@ -920,13 +950,26 @@ class EmojiManager:
|
||||||
|
|
||||||
# 尝试从Images表获取已有的详细描述(可能在收到表情包时已生成)
|
# 尝试从Images表获取已有的详细描述(可能在收到表情包时已生成)
|
||||||
existing_description = None
|
existing_description = None
|
||||||
|
existing_image = None
|
||||||
try:
|
try:
|
||||||
from src.common.database.database_model import Images
|
from src.common.database.database_model import Images
|
||||||
|
|
||||||
existing_image = Images.get_or_none((Images.emoji_hash == image_hash) & (Images.type == "emoji"))
|
existing_image = Images.get_or_none((Images.emoji_hash == image_hash) & (Images.type == "emoji"))
|
||||||
if existing_image and existing_image.description:
|
if existing_image and existing_image.description:
|
||||||
existing_description = existing_image.description
|
if looks_like_placeholder_description(existing_image.description):
|
||||||
logger.info(f"[复用描述] 找到已有详细描述: {existing_description[:50]}...")
|
logger.warning(
|
||||||
|
"[VLM兜底] 检测到占位描述,忽略缓存并重新生成: %s",
|
||||||
|
existing_image.description[:100],
|
||||||
|
)
|
||||||
|
try:
|
||||||
|
existing_image.description = None
|
||||||
|
existing_image.vlm_processed = False
|
||||||
|
existing_image.save()
|
||||||
|
except Exception as save_error:
|
||||||
|
logger.error(f"[VLM兜底] 清理占位描述失败: {save_error}")
|
||||||
|
else:
|
||||||
|
existing_description = existing_image.description
|
||||||
|
logger.info(f"[复用描述] 找到已有详细描述: {existing_description[:50]}...")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.debug(f"查询已有描述时出错: {e}")
|
logger.debug(f"查询已有描述时出错: {e}")
|
||||||
|
|
||||||
|
|
@ -952,6 +995,21 @@ class EmojiManager:
|
||||||
prompt, image_base64, image_format, temperature=0.3, max_tokens=1000
|
prompt, image_base64, image_format, temperature=0.3, max_tokens=1000
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if looks_like_placeholder_description(description):
|
||||||
|
logger.error(
|
||||||
|
"[VLM兜底] VLM返回占位描述,终止注册: %s",
|
||||||
|
description[:100],
|
||||||
|
)
|
||||||
|
raise RuntimeError("VLM返回占位描述")
|
||||||
|
|
||||||
|
if existing_image:
|
||||||
|
try:
|
||||||
|
existing_image.description = description
|
||||||
|
existing_image.vlm_processed = True
|
||||||
|
existing_image.save()
|
||||||
|
except Exception as save_error:
|
||||||
|
logger.error(f"[VLM兜底] 更新描述缓存失败: {save_error}")
|
||||||
|
|
||||||
# 审核表情包
|
# 审核表情包
|
||||||
if global_config.emoji.content_filtration:
|
if global_config.emoji.content_filtration:
|
||||||
prompt = f'''
|
prompt = f'''
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue