feat: surface AI analysis duration across gateway, backend, and FE
Adds per-message AI moderation analysis time (ai_analysis_duration_ms) so operators can see how long the LLM took to moderate each message. Gateway: - messagesTable: new ai_analysis_duration_ms (bigint) column. - AIAnalysisUpdate + buildAIAnalysisSet: carry analysisDurationMs through both single and bulk update paths. - ai-analysis-worker: measure wall-clock time around runModerationAnalysis and attach it to every result in the batch. Backend: - Mirror schema column; messageMapper maps ai_analysis_duration_ms; moderation-types + MappedMessage expose it. Frontend: - message.ts type gains ai_analysis_duration_ms. - AiBadge (messages view) shows 'status · 1.2s' when duration is present; analysis view badge mirrors the same formatting. DB: - scripts/add-ai-analysis-duration.sql (idempotent ADD COLUMN IF NOT EXISTS). No behavior change for moderation logic; null until new gateway build records values.
This commit is contained in:
@@ -24,6 +24,7 @@ export interface MappedMessage {
|
||||
ai_confidence: number | null;
|
||||
ai_recommended_action: string | null;
|
||||
ai_analyzed_at: number | null;
|
||||
ai_analysis_duration_ms: number | null;
|
||||
ai_error: string | null;
|
||||
is_reply: boolean | null;
|
||||
is_forward: boolean | null;
|
||||
@@ -58,6 +59,8 @@ export function mapMessageRow(row: Record<string, unknown>): MappedMessage {
|
||||
ai_confidence: (row.ai_confidence as number | null) ?? null,
|
||||
ai_recommended_action: (row.ai_recommended_action as string | null) ?? null,
|
||||
ai_analyzed_at: (row.ai_analyzed_at as number | null) ?? null,
|
||||
ai_analysis_duration_ms:
|
||||
(row.ai_analysis_duration_ms as number | null) ?? null,
|
||||
ai_error: (row.ai_error as string | null) ?? null,
|
||||
is_reply: row.is_reply === null ? null : Boolean(row.is_reply),
|
||||
is_forward: row.is_forward === null ? null : Boolean(row.is_forward),
|
||||
|
||||
Reference in New Issue
Block a user