Files
aionboarding/ai-patient-onboarding/performance_optimization_report.json
T

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
}
}