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:
@@ -316,11 +316,13 @@ async function processBatch(job: {
|
||||
// The orchestrator handles text/media split + caching + parallel paths
|
||||
// internally, so a 20-message batch = 1 text LLM call (+1 media call
|
||||
// when media is present), not N per-message calls.
|
||||
const analysisStart = Date.now();
|
||||
const moderationResult = await runModerationAnalysis({
|
||||
targets: readyMessages,
|
||||
contextBlock,
|
||||
attachments,
|
||||
});
|
||||
const analysisDurationMs = Date.now() - analysisStart;
|
||||
|
||||
const results = moderationResult.results.map((r) =>
|
||||
normalizeResult(
|
||||
@@ -342,6 +344,7 @@ async function processBatch(job: {
|
||||
confidence: result.confidence,
|
||||
recommendedAction: result.recommendedAction,
|
||||
analyzedAt: Date.now(),
|
||||
analysisDurationMs,
|
||||
error: result.status === "error" ? result.analysis : null,
|
||||
},
|
||||
}));
|
||||
|
||||
Reference in New Issue
Block a user