Add voice analytics filters and metrics
This commit is contained in:
@@ -283,3 +283,6 @@ async def test_admin_provider_analytics_support_days_and_capability_filters(
|
||||
assert data["job_count"] == 1
|
||||
assert data["story_count"] == 1
|
||||
assert data["failure_reasons"] == [{"reason": "timeout", "count": 1}]
|
||||
|
||||
response = await client.get("/admin/providers/analytics?capability=unknown")
|
||||
assert response.status_code == 422
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user