This commit is contained in:
2026-02-17 12:29:20 +08:00
parent f6c361dd13
commit 0ab6f52525
4 changed files with 132 additions and 29 deletions

View File

@@ -80,6 +80,33 @@ CLEANUP_CONFIG = {
"interval": int(os.getenv("CLEANUP_INTERVAL_SECONDS", "600"))
}
# 提示词配置 (Prompt Config)
PROMPTS = {
"translate": "请将以下描述翻译成简洁、精准的英文,用于图像分割模型(SAM)的提示词。直接返回英文,不要包含任何解释或其他文字。\n\n输入: {text}",
"tarot_card_dual": """这是一张塔罗牌的两个方向:
图1原始方向
图2旋转180度后的方向
请仔细对比两张图片的牌面内容(文字方向、人物站立方向、图案逻辑):
1. 识别这张牌的名字(中文)。
2. 判断哪一张图片展示了正确的“正位”Upright状态。
- 如果图1是正位说明原图就是正位。
- 如果图2是正位说明原图是逆位。
请以JSON格式返回包含 'name''position' 两个字段。
例如:{'name': '愚者', 'position': '正位'} 或 {'name': '倒吊人', 'position': '逆位'}。
不要包含Markdown代码块标记。""",
"tarot_card_single": "这是一张塔罗牌。请识别它的名字中文并判断它是正位还是逆位。请以JSON格式返回包含 'name''position' 两个字段。例如:{'name': '愚者', 'position': '正位'}。不要包含Markdown代码块标记。",
"tarot_spread": "这是一张包含多张塔罗牌的图片。请根据牌的排列方式识别这是什么牌阵例如圣三角、凯尔特十字、三张牌等。如果看不出明显的正规牌阵请返回“不是正规牌阵”。请以JSON格式返回包含 'spread_name''description' 两个字段。例如:{'spread_name': '圣三角', 'description': '常见的时间流占卜法'}。不要包含Markdown代码块标记。",
"face_analysis": """请仔细观察这张图片中的人物头部/面部特写:
1. 识别性别 (Gender):男性/女性
2. 预估年龄 (Age):请给出一个合理的年龄范围,例如 "25-30岁"
3. 简要描述:发型、发色、是否有眼镜等显著特征。
请以 JSON 格式返回,包含 'gender', 'age', 'description' 字段。
不要包含 Markdown 标记。"""
}
# API Tags (用于文档分类)
TAG_GENERAL = "General Segmentation (通用分割)"
TAG_TAROT = "Tarot Analysis (塔罗牌分析)"
@@ -265,11 +292,12 @@ def translate_to_sam3_prompt(text: str) -> str:
"""
print(f"正在翻译提示词: {text}")
try:
prompt_template = PROMPTS["translate"]
messages = [
{
"role": "user",
"content": [
{"text": f"请将以下描述翻译成简洁、精准的英文,用于图像分割模型(SAM)的提示词。直接返回英文,不要包含任何解释或其他文字。\n\n输入: {text}"}
{"text": prompt_template.format(text=text)}
]
}
]
@@ -503,19 +531,7 @@ def recognize_card_with_qwen(image_path: str) -> dict:
"content": [
{"image": file_url}, # 图1 (原图)
{"image": rotated_file_url}, # 图2 (旋转180度)
{"text": """这是一张塔罗牌的两个方向:
图1原始方向
图2旋转180度后的方向
请仔细对比两张图片的牌面内容(文字方向、人物站立方向、图案逻辑):
1. 识别这张牌的名字(中文)。
2. 判断哪一张图片展示了正确的“正位”Upright状态。
- 如果图1是正位说明原图就是正位。
- 如果图2是正位说明原图是逆位。
请以JSON格式返回包含 'name''position' 两个字段。
例如:{'name': '愚者', 'position': '正位'} 或 {'name': '倒吊人', 'position': '逆位'}。
不要包含Markdown代码块标记。"""}
{"text": PROMPTS["tarot_card_dual"]}
]
}
]
@@ -527,7 +543,7 @@ def recognize_card_with_qwen(image_path: str) -> dict:
"role": "user",
"content": [
{"image": file_url},
{"text": "这是一张塔罗牌。请识别它的名字中文并判断它是正位还是逆位。请以JSON格式返回包含 'name''position' 两个字段。例如:{'name': '愚者', 'position': '正位'}。不要包含Markdown代码块标记。"}
{"text": PROMPTS["tarot_card_single"]}
]
}
]
@@ -562,7 +578,7 @@ def recognize_spread_with_qwen(image_path: str) -> dict:
"role": "user",
"content": [
{"image": file_url},
{"text": "这是一张包含多张塔罗牌的图片。请根据牌的排列方式识别这是什么牌阵例如圣三角、凯尔特十字、三张牌等。如果看不出明显的正规牌阵请返回“不是正规牌阵”。请以JSON格式返回包含 'spread_name''description' 两个字段。例如:{'spread_name': '圣三角', 'description': '常见的时间流占卜法'}。不要包含Markdown代码块标记。"}
{"text": PROMPTS["tarot_spread"]}
]
}
]
@@ -1034,7 +1050,8 @@ async def segment_face(
image=image,
prompt=final_prompt,
output_base_dir=RESULT_IMAGE_DIR,
qwen_model=QWEN_MODEL
qwen_model=QWEN_MODEL,
analysis_prompt=PROMPTS["face_analysis"]
)
except Exception as e:
import traceback
@@ -1268,6 +1285,27 @@ async def set_model(model: str = Form(...)):
QWEN_MODEL = model
return {"status": "success", "message": f"Model switched to {model}", "current_model": QWEN_MODEL}
@app.get("/admin/api/prompts", dependencies=[Depends(verify_admin)])
async def get_prompts():
"""
Get all prompts
"""
return PROMPTS
@app.post("/admin/api/prompts", dependencies=[Depends(verify_admin)])
async def update_prompts(
key: str = Form(...),
content: str = Form(...)
):
"""
Update a specific prompt
"""
if key not in PROMPTS:
raise HTTPException(status_code=400, detail="Invalid prompt key")
PROMPTS[key] = content
return {"status": "success", "message": f"Prompt '{key}' updated"}
# ==========================================
# 10. Main Entry Point (启动入口)
# ==========================================