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

View File

@@ -1164,6 +1164,11 @@ export async function loadFileStats(fileUuid: string, force = false): Promise<Fi
}
}
// Try to load scene_vlm stats from fast endpoint if not in response
if (!data.scene_vlm || data.scene_vlm.total_scenes === 0) {
loadSceneVlmStats(fileUuid).catch(console.warn)
}
fileStatsCache.value = { ...fileStatsCache.value, [fileUuid]: fileStats }
if (data.status === 'completed') {
@@ -1217,6 +1222,36 @@ export async function loadFileStats(fileUuid: string, force = false): Promise<Fi
}
}
export async function loadSceneVlmStats(fileUuid: string, force = false): Promise<SceneVlmStats | null> {
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
}