690519:1631 224 to 226 AI #01
CI / CD Pipeline / build (push) Failing after 3m57s
CI / CD Pipeline / deploy (push) Has been skipped

This commit is contained in:
2026-05-19 16:31:50 +07:00
parent 3e25097470
commit ea5499123e
127 changed files with 12387 additions and 42 deletions
@@ -0,0 +1,78 @@
// File: components/ai/intent-classification/analytics/method-breakdown-table.tsx
// Change Log
// - 2026-05-19: สร้าง Method Breakdown Table สำหรับ Analytics Dashboard (T036, US3).
'use client';
import {
Table,
TableBody,
TableCell,
TableHead,
TableHeader,
TableRow,
} from '@/components/ui/table';
import { Badge } from '@/components/ui/badge';
import type { MethodStats } from '@/lib/services/ai-intent.service';
interface MethodBreakdownTableProps {
data: MethodStats[];
}
/** แปลงชื่อ method เป็น label + สี */
function methodBadge(method: string) {
switch (method) {
case 'pattern':
return <Badge variant="default">Pattern Match</Badge>;
case 'llm_fallback':
return <Badge variant="secondary">LLM Fallback</Badge>;
case 'semaphore_overflow':
return <Badge variant="destructive">Semaphore Overflow</Badge>;
case 'llm_error':
return <Badge variant="destructive">LLM Error</Badge>;
default:
return <Badge variant="outline">{method}</Badge>;
}
}
/**
* ตารางแสดงสถิติแยกตาม method (pattern, llm_fallback, etc.)
*/
export function MethodBreakdownTable({ data }: MethodBreakdownTableProps) {
if (data.length === 0) {
return <p className="text-sm text-muted-foreground"></p>;
}
const total = data.reduce((sum, d) => sum + d.count, 0);
return (
<Table>
<TableHeader>
<TableRow>
<TableHead>Method</TableHead>
<TableHead className="text-right">Count</TableHead>
<TableHead className="text-right">%</TableHead>
<TableHead className="text-right">Avg Confidence</TableHead>
<TableHead className="text-right">Avg Latency</TableHead>
</TableRow>
</TableHeader>
<TableBody>
{data.map((row) => (
<TableRow key={row.method}>
<TableCell>{methodBadge(row.method)}</TableCell>
<TableCell className="text-right">{row.count}</TableCell>
<TableCell className="text-right">
{total > 0 ? ((row.count / total) * 100).toFixed(1) : 0}%
</TableCell>
<TableCell className="text-right">
{row.avgConfidence.toFixed(2)}
</TableCell>
<TableCell className="text-right">
{row.avgLatencyMs.toFixed(1)}ms
</TableCell>
</TableRow>
))}
</TableBody>
</Table>
);
}