diff --git a/scripts/test_scene_vlm_api.sh b/scripts/test_scene_vlm_api.sh new file mode 100755 index 0000000..a5cdb6f --- /dev/null +++ b/scripts/test_scene_vlm_api.sh @@ -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 "================================================================================ +" \ No newline at end of file diff --git a/src/store.ts b/src/store.ts index a106acf..ec85fb5 100644 --- a/src/store.ts +++ b/src/store.ts @@ -1164,6 +1164,11 @@ export async function loadFileStats(fileUuid: string, force = false): Promise { + if (!fileUuid) return null + + try { + const resp = await fetch(`/api/v1/file/${fileUuid}/scene-vlm-stats`) + if (!resp.ok) { + console.warn(`Scene VLM stats API failed: ${resp.status}`) + return null + } + + const data = await resp.json() + + const stats: SceneVlmStats = { + total_scenes: data.total_scenes || 0, + status: data.status || '', + vlm_done: data.vlm_done || 0, + vlm_total: data.vlm_total || data.total_scenes || 0 + } + + if (fileStatsCache.value[fileUuid]) { + fileStatsCache.value[fileUuid].scene_vlm = stats + } + + return stats + } catch (e) { + console.warn('loadSceneVlmStats failed:', e) + return null + } +} + export function getPipelineStats(fileUuid: string): PipelineStats | null { return pipelineStatsCache.value[fileUuid] || null }