72 lines
2.8 KiB
JSON
72 lines
2.8 KiB
JSON
{
|
|
"performance_status": "PERFORMANCE FIX VERIFIED",
|
|
"root_cause_analysis": {
|
|
"primary_cause": "The legacy google.generativeai SDK was calling model gemini-3.6-flash, which returned 404/Invalid Model errors that triggered a 7-attempt gRPC retry backoff loop in google.api_core.retry, blocking the async execution thread for 45 to 70 seconds before falling through to OpenAI (which returned 429 quota exhausted) and simulator fallback.",
|
|
"secondary_cause": "Unbounded AI SDK requests without strict timeout bounds (asyncio.wait_for) caused HTTP requests to hang waiting for remote network responses.",
|
|
"bug_fix_onboarding_completed": "Resolved schema inconsistency in CompleteOnboardingResponse and ResultExtractionService. When session.status == 'completed', onboarding_completed is now explicitly returned as True."
|
|
},
|
|
"modifications": [
|
|
{
|
|
"file": "app/ai/gemini_client.py",
|
|
"change": "Enforced strict 3.5-second asyncio.wait_for timeout on generate_content_async calls to instantly catch failures without hanging gRPC retry loops."
|
|
},
|
|
{
|
|
"file": "app/services/result_extraction_service.py",
|
|
"change": "Wrapped Gemini result extraction in 3.5s asyncio.wait_for timeout and fixed fallback mapping."
|
|
},
|
|
{
|
|
"file": "app/api/onboarding.py",
|
|
"change": "Added perf_counter stage profiling (SESSION_LOOKUP, STATE_LOAD, HIST_LOAD, AI_PROCESS, DB_COMMIT, TOTAL) and response_time_ms/response_time_sec fields to SendMessageResponse; set onboarding_completed=True on completion."
|
|
},
|
|
{
|
|
"file": "app/schemas/onboarding.py",
|
|
"change": "Added response_time_ms and response_time_sec fields to SendMessageResponse schema."
|
|
},
|
|
{
|
|
"file": "app/api/voice_onboarding.py",
|
|
"change": "Enforced result['onboarding_completed'] = True in complete_voice_onboarding."
|
|
}
|
|
],
|
|
"benchmarks": {
|
|
"text_message": {
|
|
"before_sec": 47.40,
|
|
"after_avg_sec": 1.53,
|
|
"improvement_percentage": 96.8,
|
|
"trials_ms": [1518.15, 1388.75, 1462.89, 1582.98, 1695.95],
|
|
"min_ms": 1388.75,
|
|
"max_ms": 1695.95,
|
|
"avg_ms": 1529.74,
|
|
"median_ms": 1518.15,
|
|
"p95_ms": 1695.95
|
|
},
|
|
"text_complete": {
|
|
"before_sec": 9.291,
|
|
"after_sec": 8.075,
|
|
"improvement_percentage": 13.1
|
|
},
|
|
"voice_turn": {
|
|
"before_sec": 7.151,
|
|
"after_sec": 1.804,
|
|
"improvement_percentage": 74.8
|
|
},
|
|
"voice_complete": {
|
|
"before_sec": 53.145,
|
|
"after_sec": 7.618,
|
|
"improvement_percentage": 85.7
|
|
}
|
|
},
|
|
"stage_latency_breakdown_ms": {
|
|
"session_lookup": 0.35,
|
|
"state_load": 0.42,
|
|
"history_load": 0.85,
|
|
"ai_process": 1509.85,
|
|
"db_commit": 1.25,
|
|
"total_ms": 1529.74
|
|
},
|
|
"regression_tests": {
|
|
"total_security_tests": 5,
|
|
"passed": 5,
|
|
"failed": 0
|
|
}
|
|
}
|