This commit is contained in:
gr
2026-10-30 13:43:29 +08:00
144 changed files with 16467 additions and 2457 deletions
@@ -10,7 +10,7 @@ use think\facade\Log;
/** A request-local, patient-free timing record for the diagnosis assistant SSE path. */
final class AssistantSseTiming
{
private const PHASES = ['prepare', 'sse_start', 'attachment', 'first_delta', 'upstream_done', 'sse_done'];
private const PHASES = ['prepare', 'sse_start', 'attachment', 'first_delta', 'first_live_update', 'upstream_done', 'sse_done'];
private const NUMBER_FIELDS = [
'duration_ms', 'aggregate_ms', 'compaction_ms', 'retry_ms',
@@ -18,6 +18,7 @@ final class AssistantSseTiming
'delta_bytes', 'delta_count', 'first_delta_ms', 'inputs_bytes',
'source_ms', 'upload_ms', 'ocr_ms', 'reuse_wait_ms', 'upload_cache_hits', 'upload_cache_misses',
'clinical_issue_count', 'clinical_repair_count',
'first_valid_update_ms', 'live_update_count',
];
private const BOOLEAN_FIELDS = ['compaction_attempted', 'retry_attempted', 'first_delta_observed', 'compaction_cache_hit'];
@@ -31,6 +32,7 @@ final class AssistantSseTiming
'UPSTREAM_BUSY', 'INVALID_RESPONSE', 'AI_ASSISTANT_CANCELLED',
'TCM_FACT_STATE_CONFLICT', 'TCM_REPORT_INCOMPLETE', 'TASK_ANALYSIS_MISSING',
'STREAM_CONTENT_MISMATCH', 'UPSTREAM_CLEANUP_PENDING', 'PULSE_EXCLUDED_FROM_ASSESSMENT',
'LIVE_CONTEXT_UNAVAILABLE', 'LIVE_STREAM_REQUIRED', 'LIVE_RESULT_INVALID',
];
/** Exact issue enums emitted by the consultation stream's local guards. */
@@ -103,6 +105,12 @@ final class AssistantSseTiming
if (isset($metrics['error_code']) && in_array($metrics['error_code'], self::ERROR_CODES, true)) {
$event['error_code'] = $metrics['error_code'];
}
if (in_array($metrics['live_error_category'] ?? null,
['context', 'format', 'citation', 'safety', 'relevance', 'timeout', 'upstream', 'cancelled'], true))
$event['live_error_category'] = $metrics['live_error_category'];
if (in_array($metrics['live_validation_reason'] ?? null,
['LENGTH_LIMIT', 'JSON_INVALID', 'SCHEMA_INVALID', 'CITATION_INVALID', 'SAFETY_REJECTED'], true))
$event['live_validation_reason'] = $metrics['live_validation_reason'];
if ($event['phase'] === 'upstream_done' && is_array($metrics['clinical_issue_codes'] ?? null)) {
$codes = [];
foreach ($metrics['clinical_issue_codes'] as $code) {