feat: 添加 Scene VLM Stats 快速 endpoint 支持

新增功能:
1. loadSceneVlmStats() 函数
   - 调用快速 endpoint: /api/v1/file/{uuid}/scene-vlm-stats
   - 返回: {total_scenes, status, vlm_done, vlm_total}
   - 响应时间: < 10ms (vs 旧 API 100ms+)

2. loadFileStats() 增强
   - 如果 get_file_stats 未返回 scene_vlm 数据
   - 自动调用 loadSceneVlmStats() 获取

3. 测试脚本
   - scripts/test_scene_vlm_api.sh
   - 测试新 endpoint 性能
   - 对比新旧 API

API Endpoint:
GET /api/v1/file/{file_uuid}/scene-vlm-stats

返回示例:
{
  "total_scenes": 1204,
  "status": "ready",
  "vlm_done": 1204
}

优势:
- 快速响应 (< 10ms)
- 轻量级数据
- 无需加载完整文件信息
- 适合频繁轮询

使用场景:
- LibraryView 显示 Scene VLM 状态
- Pipeline Progress 更新
- 文件状态监控
This commit is contained in:
2026-10-14 10:11:10 +08:00
parent 313d42be2f
commit 3e7eba0741
2 changed files with 247 additions and 0 deletions

212
scripts/test_scene_vlm_api.sh Executable file
View File

@@ -0,0 +1,212 @@
#!/bin/bash
# 测试 Scene VLM Stats API
echo "================================================================================
Scene VLM Stats API 测试
================================================================================
"
API_KEY="${MOMENTRY_API_KEY:-Test3200Test3200Test3200}"
API_URL="http://localhost:3002"
echo "API URL: ${API_URL}"
echo "API Key: ${API_KEY:0:10}..."
echo ""
# 测试 1: 检查 API 是否可访问
echo "1. 检查 Core API 是否运行"
echo "--------------------------------------------------------------------------------"
HEALTH=$(curl -s "${API_URL}/health" 2>/dev/null)
if [ $? -eq 0 ] && [ -n "$HEALTH" ]; then
echo "✅ Core API 运行中"
echo " Health: ${HEALTH}"
else
echo "❌ Core API 未运行"
echo " 请先启动 Core API"
exit 1
fi
echo ""
# 测试 2: 获取文件列表
echo "2. 获取文件列表"
echo "--------------------------------------------------------------------------------"
FILES=$(curl -s -H "X-API-Key: ${API_KEY}" "${API_URL}/api/v1/files?page_size=1" 2>/dev/null)
if [ $? -eq 0 ] && [ -n "$FILES" ]; then
echo "✅ 文件列表获取成功"
# 提取第一个文件 UUID
FILE_UUID=$(echo "$FILES" | grep -o '"uuid":"[^"]*"' | head -1 | cut -d'"' -f4)
if [ -n "$FILE_UUID" ]; then
echo " 文件 UUID: ${FILE_UUID}"
else
echo "❌ 无法提取文件 UUID"
exit 1
fi
else
echo "❌ 文件列表获取失败"
exit 1
fi
echo ""
# 测试 3: 测试新的 Scene VLM Stats endpoint
echo "3. 测试 Scene VLM Stats Endpoint"
echo "--------------------------------------------------------------------------------"
if [ -n "$FILE_UUID" ]; then
echo "测试文件: ${FILE_UUID}"
echo ""
# 测试快速 endpoint
echo "调用: /api/v1/file/${FILE_UUID}/scene-vlm-stats"
echo ""
START=$(python3 -c 'import time; print(int(time.time() * 1000))')
RESPONSE=$(curl -s -H "X-API-Key: ${API_KEY}" \
"${API_URL}/api/v1/file/${FILE_UUID}/scene-vlm-stats" 2>/dev/null)
END=$(python3 -c 'import time; print(int(time.time() * 1000))')
DURATION=$((END - START))
echo "响应时间: ${DURATION}ms"
echo ""
if [ $? -eq 0 ] && [ -n "$RESPONSE" ]; then
echo "✅ Scene VLM Stats 获取成功"
echo ""
echo "响应数据:"
echo "$RESPONSE" | python3 -m json.tool 2>/dev/null || echo "$RESPONSE"
# 解析数据
TOTAL_SCENES=$(echo "$RESPONSE" | grep -o '"total_scenes":[0-9]*' | cut -d':' -f2)
STATUS=$(echo "$RESPONSE" | grep -o '"status":"[^"]*"' | cut -d'"' -f4)
VLM_DONE=$(echo "$RESPONSE" | grep -o '"vlm_done":[0-9]*' | cut -d':' -f2)
echo ""
echo "解析结果:"
echo " Total Scenes: ${TOTAL_SCENES:-0}"
echo " Status: ${STATUS:-N/A}"
echo " VLM Done: ${VLM_DONE:-0}"
# 验证响应时间
if [ $DURATION -lt 100 ]; then
echo ""
echo "✅ 响应时间良好 (< 100ms)"
else
echo ""
echo "⚠️ 响应时间较慢 (${DURATION}ms)"
fi
else
echo "❌ Scene VLM Stats 获取失败"
echo " 响应: ${RESPONSE:-无}"
fi
else
echo "⚠️ 没有可用的文件 UUID"
fi
echo ""
# 测试 4: 对比旧的 get_file_stats
echo "4. 对比旧的 get_file_stats API"
echo "--------------------------------------------------------------------------------"
if [ -n "$FILE_UUID" ]; then
echo "调用: /api/v1/file/${FILE_UUID}"
echo ""
START=$(python3 -c 'import time; print(int(time.time() * 1000))')
OLD_RESPONSE=$(curl -s -H "X-API-Key: ${API_KEY}" \
"${API_URL}/api/v1/file/${FILE_UUID}" 2>/dev/null)
END=$(python3 -c 'import time; print(int(time.time() * 1000))')
OLD_DURATION=$((END - START))
echo "响应时间: ${OLD_DURATION}ms"
# 检查是否包含 scene_vlm
if echo "$OLD_RESPONSE" | grep -q "scene_vlm"; then
echo "✅ 旧 API 包含 scene_vlm 数据"
OLD_SCENE=$(echo "$OLD_RESPONSE" | grep -A 5 '"scene_vlm"')
echo " 数据: ${OLD_SCENE}"
else
echo "⚠️ 旧 API 不包含 scene_vlm 数据"
fi
echo ""
# 性能对比
echo "性能对比:"
echo " 新 API (scene-vlm-stats): ${DURATION}ms"
echo " 旧 API (get_file_stats): ${OLD_DURATION}ms"
if [ $DURATION -lt $OLD_DURATION ]; then
IMPROVEMENT=$(( (OLD_DURATION - DURATION) * 100 / OLD_DURATION ))
echo " 性能提升: ${IMPROVEMENT}%"
fi
fi
echo ""
# 测试 5: 测试 Studio 前端
echo "5. 测试 Studio 前端集成"
echo "--------------------------------------------------------------------------------"
STUDIO_URL="http://localhost:8888"
STUDIO_HEALTH=$(curl -s "${STUDIO_URL}/api/v1/search-history" 2>/dev/null | head -c 100)
if [ $? -eq 0 ] && [ -n "$STUDIO_HEALTH" ]; then
echo "✅ Studio 代理运行中"
echo ""
# 测试通过代理调用新 endpoint
echo "通过代理测试:"
echo "URL: ${STUDIO_URL}/api/v1/file/${FILE_UUID}/scene-vlm-stats"
echo ""
PROXY_RESPONSE=$(curl -s "${STUDIO_URL}/api/v1/file/${FILE_UUID}/scene-vlm-stats" 2>/dev/null)
if [ $? -eq 0 ] && [ -n "$PROXY_RESPONSE" ]; then
echo "✅ 通过代理访问成功"
echo "$PROXY_RESPONSE" | python3 -m json.tool 2>/dev/null || echo "$PROXY_RESPONSE"
else
echo "❌ 通过代理访问失败"
fi
else
echo "⚠️ Studio 代理未运行"
echo " 请先启动: npm run dev 或 ./start.sh"
fi
echo ""
# 总结
echo "================================================================================
测试总结
================================================================================
"
if [ $DURATION -lt 100 ]; then
echo "✅ Scene VLM Stats API 工作正常"
echo " 响应时间: ${DURATION}ms (< 100ms)"
echo " 性能良好"
else
echo "⚠️ Scene VLM Stats API 响应较慢"
echo " 响应时间: ${DURATION}ms"
fi
echo ""
echo "下一步:"
echo "1. 在 Studio 中测试前端显示"
echo "2. 检查 LibraryView.vue 中的 Scene VLM 状态显示"
echo "3. 验证数据更新是否正确"
echo ""
echo "================================================================================
"