Add voice analytics filters and metrics

This commit is contained in:
2026-04-26 22:00:34 +08:00
parent 3805c18622
commit 55ca0985eb
25 changed files with 710 additions and 39 deletions

View File

@@ -342,6 +342,7 @@ async def test_voice_session_low_confidence_turn_requests_confirmation(
files={
"audio_file": ("turn.webm", b"fake-webm-audio", "audio/webm"),
},
data={"duration_ms": "1200"},
)
assert response.status_code == 202
turn_id = response.json()["turn_id"]
@@ -431,6 +432,7 @@ async def test_voice_session_confirmation_accept_continues_original_turn(
files={
"audio_file": ("turn.webm", b"fake-webm-audio", "audio/webm"),
},
data={"duration_ms": "1200"},
)
turn_id = response.json()["turn_id"]
@@ -503,6 +505,7 @@ async def test_voice_session_confirmation_switch_to_text_allows_follow_up_turn(
files={
"audio_file": ("turn.webm", b"fake-webm-audio", "audio/webm"),
},
data={"duration_ms": "1200"},
)
turn_id = response.json()["turn_id"]
@@ -647,6 +650,7 @@ async def test_voice_session_analytics_summarize_failures_and_confirmations(
files={
"audio_file": ("turn.webm", b"fake-webm-audio", "audio/webm"),
},
data={"duration_ms": "1200"},
)
turn_id = response.json()["turn_id"]
await client.post(
@@ -677,6 +681,46 @@ async def test_voice_session_analytics_summarize_failures_and_confirmations(
assert analytics["asr_failures"] >= 1
assert analytics["finalized_sessions"] >= 1
assert analytics["finalize_conversion_rate"] > 0
assert analytics["text_fallback_turns"] >= 1
assert analytics["uploaded_audio_turns"] >= 1
assert analytics["user_audio_turn_rate"] > 0
assert analytics["assistant_audio_ready_turns"] >= 1
assert analytics["assistant_audio_ready_rate"] > 0
assert analytics["asr_success_rate"] > 0
assert analytics["tts_success_rate"] > 0
assert analytics["avg_transcript_confidence"] > 0
assert analytics["avg_intent_confidence"] > 0
assert analytics["failure_event_counts"]["turn_transcription_failed"] >= 1
assert analytics["failure_event_counts"]["assistant_audio_failed"] >= 1
assert analytics["total_user_audio_duration_ms"] >= 1200
assert analytics["avg_user_audio_duration_ms"] >= 1200
assert analytics["transcription_provider_counts"]["openai"] >= 1
assert analytics["transcription_provider_counts"]["fallback"] >= 1
assert analytics["confirmation_request_rate"] > 0
response = await client.get(
"/api/voice-sessions/analytics?days=30&provider=openai"
)
assert response.status_code == 200
provider_analytics = response.json()
assert provider_analytics["provider"] == "openai"
assert provider_analytics["uploaded_audio_turns"] >= 1
assert provider_analytics["text_fallback_turns"] == 0
assert set(provider_analytics["transcription_provider_counts"]) == {"openai"}
response = await client.get(
"/api/voice-sessions/analytics?days=30&session_status=completed"
)
assert response.status_code == 200
status_analytics = response.json()
assert status_analytics["session_status"] == "completed"
assert status_analytics["total_sessions"] >= 1
assert status_analytics["finalized_sessions"] >= 1
response = await client.get(
"/api/voice-sessions/analytics?days=30&session_status=unknown"
)
assert response.status_code == 422
finally:
app.dependency_overrides.clear()