+ Refresh
+
+ }
+ />
+
+ {error && {error}
}
+ {loading && Loading AI quality metrics...
}
+
+ {!loading && !hasEvents ? (
+ }
+ title="No AI audit events yet"
+ description="Metrics will appear after ai-service starts ingesting audit events into backend-service."
+ />
+ ) : summary ? (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Endpoint breakdown
+ {!summary.endpoint_breakdown.length ? (
+
+ ) : (
+
+ rows={summary.endpoint_breakdown}
+ columns={[
+ {
+ header: "Endpoint",
+ render: (row) => {row.endpoint},
+ },
+ {
+ header: "Events",
+ render: (row) => {row.total},
+ align: "center",
+ },
+ {
+ header: "Failures",
+ render: (row) => (
+
+ ),
+ align: "center",
+ },
+ {
+ header: "Avg latency",
+ render: (row) => {Math.round(row.average_latency_ms)} ms,
+ align: "right",
+ },
+ ]}
+ />
+ )}
+
+
+
+
Latest failures
+ {!summary.latest_failures.length ? (
+
+ ) : (
+
+ rows={summary.latest_failures}
+ columns={[
+ {
+ header: "Request",
+ render: (row) => (
+
+
{row.request_id || "unknown"}
+
{row.user_id || "unknown user"}
+
+ ),
+ },
+ {
+ header: "Endpoint",
+ render: (row) => {row.endpoint || "unknown"},
+ },
+ {
+ header: "Status",
+ render: (row) => ,
+ align: "center",
+ },
+ {
+ header: "Latency",
+ render: (row) => {row.latency_ms ? `${Math.round(row.latency_ms)} ms` : "--"},
+ align: "right",
+ },
+ {
+ header: "Error",
+ render: (row) => {row.error || "No message"},
+ },
+ ]}
+ />
+ )}
+
+
+
+
+
+ {summary.failure_count} failed of {summary.total_events} audited events.
+
+
+ >
+ ) : null}
+