From 58c283a1fc14fc9fc50b2b81436b3e6cbf6e2356 Mon Sep 17 00:00:00 2001 From: Accusys Date: Tue, 19 May 2026 21:07:39 +0800 Subject: [PATCH] fix: playground ASR field names (start_time/end_time) + add 3003 specific test script - playground.rs: seg.start/end -> seg.start_time/end_time - scripts/test_m5api_phase5_3003.sh: tests bind, unbind, match-from-trace on localhost:3003 - Note: bind fails on dev (real_name column missing), match-from-trace returns 404 for no embeddings --- scripts/test_m5api_phase5_3003.sh | 75 +++++++++++++++++++++++++++++++ src/playground.rs | 10 ++--- 2 files changed, 80 insertions(+), 5 deletions(-) create mode 100755 scripts/test_m5api_phase5_3003.sh diff --git a/scripts/test_m5api_phase5_3003.sh b/scripts/test_m5api_phase5_3003.sh new file mode 100755 index 0000000..d5cbaaf --- /dev/null +++ b/scripts/test_m5api_phase5_3003.sh @@ -0,0 +1,75 @@ +#!/usr/bin/env bash +# Phase 5: 3003 Playground Specific Test +# Tests the 3 problematic endpoints on the local dev environment. +# Base: http://localhost:3003 + +BASE="http://localhost:3003" +API_KEY="muser_demo_key_32chars_abcdef1234567890" +FILE_UUID="a6fb22eebefaef17e62af874997c5944" +IDENTITY_UUID="89cbaa58-a48b-4ee8-8171-df87c54da881" + +PASS=0 +FAIL=0 +TOTAL=0 + +echo "============================================" +echo " Phase 5: 3003 Playground Specific Test" +echo " Base: $BASE" +echo " File: $FILE_UUID" +echo " Identity: $IDENTITY_UUID" +echo "============================================" +echo "" + +test_api() { + local method="$1" path="$2" body="$3" desc="$4" + TOTAL=$((TOTAL+1)) + + local tmpfile="/tmp/m5api_3003_resp_${TOTAL}.json" + local curl_args=(-s -o "$tmpfile" -w "\nHTTP:%{http_code}") + curl_args+=(-X "$method") + curl_args+=(-H "Content-Type: application/json") + curl_args+=(-H "X-API-Key: $API_KEY") + + if [ -n "$body" ]; then + curl_args+=(-d "$body") + fi + + local result + result=$(curl "${curl_args[@]}" "${BASE}${path}" 2>/dev/null) + local code=$(echo "$result" | grep "HTTP:" | tr -d "HTTP:") + local resp_body=$(echo "$result" | sed '/^HTTP:/d') + local size=${#resp_body} + + if [ "$code" -ge 200 ] 2>/dev/null && [ "$code" -lt 400 ] 2>/dev/null; then + PASS=$((PASS+1)) + printf " ✅ %2d. %-5s %-55s → %s (%d B) — %s\n" "$TOTAL" "$method" "$path" "$code" "$size" "$desc" + else + FAIL=$((FAIL+1)) + printf " ❌ %2d. %-5s %-55s → %s (%d B) — %s\n" "$TOTAL" "$method" "$path" "$code" "$size" "$desc" + local preview + preview=$(echo "$resp_body" | head -c 150) + echo " $preview" + fi +} + +echo "── Identity Binding (non-destructive) ──" +test_api "POST" "/api/v1/identity/$IDENTITY_UUID/bind" "{\"file_uuid\":\"$FILE_UUID\",\"face_id\":\"face_1\"}" "Bind identity" +test_api "POST" "/api/v1/identity/$IDENTITY_UUID/unbind" "{\"file_uuid\":\"$FILE_UUID\",\"face_id\":\"face_1\"}" "Unbind identity" + +echo "" +echo "── Identity Agent ──" +test_api "POST" "/api/v1/agents/identity/match-from-trace" "{\"file_uuid\":\"$FILE_UUID\",\"trace_id\":1,\"identity_uuid\":\"$IDENTITY_UUID\"}" "Match from trace" + +echo "" +echo "============================================" +echo " Total: $TOTAL" +echo " Passed: $PASS ✅" +echo " Failed: $FAIL ❌" +echo "============================================" + +if [ $FAIL -gt 0 ]; then + echo "❌ Phase 5 (3003) FAILED" + exit 1 +else + echo "✅ Phase 5 (3003) PASSED" +fi diff --git a/src/playground.rs b/src/playground.rs index 31804de..4cf8057 100644 --- a/src/playground.rs +++ b/src/playground.rs @@ -1968,8 +1968,8 @@ async fn main() -> Result<()> { // Store ASR sentence pre_chunks let mut asr_pre_chunk_ids = Vec::new(); for (i, seg) in asr_result.segments.iter().enumerate() { - let start_frame = FrameTime::from_seconds(seg.start, fps).frames(); - let end_frame = FrameTime::from_seconds(seg.end, fps).frames(); + let start_frame = FrameTime::from_seconds(seg.start_time, fps).frames(); + let end_frame = FrameTime::from_seconds(seg.end_time, fps).frames(); let pre_chunk = momentry_core::core::db::postgres_db::PreChunk { id: 0, file_id, @@ -2136,7 +2136,7 @@ async fn main() -> Result<()> { let speaker_id = asrx_result .segments .iter() - .find(|ax| ax.start_time <= seg.end && ax.end_time >= seg.start) + .find(|ax| ax.start_time <= seg.end_time && ax.end_time >= seg.start_time) .and_then(|ax| ax.speaker_id.clone()); let content = if let Some(ref sid) = speaker_id { @@ -2156,8 +2156,8 @@ async fn main() -> Result<()> { format!("{}", i), ChunkType::Sentence, ChunkRule::Rule1, - seg.start, - seg.end, + seg.start_time, + seg.end_time, fps, content, )