import { useMemo } from "react"; import { useAPI } from "../contexts/APIProvider"; const formatSpeed = (speed: number): string => { return speed < 0 ? "unknown" : speed.toFixed(2) + " t/s"; }; const formatDuration = (ms: number): string => { return (ms / 1000).toFixed(2) + "s"; }; const formatRelativeTime = (timestamp: string): string => { const now = new Date(); const date = new Date(timestamp); const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000); // Handle future dates by returning "just now" if (diffInSeconds < 5) { return "now"; } if (diffInSeconds < 60) { return `${diffInSeconds}s ago`; } const diffInMinutes = Math.floor(diffInSeconds / 60); if (diffInMinutes < 60) { return `${diffInMinutes}m ago`; } const diffInHours = Math.floor(diffInMinutes / 60); if (diffInHours < 24) { return `${diffInHours}h ago`; } return "a while ago"; }; const ActivityPage = () => { const { metrics } = useAPI(); const sortedMetrics = useMemo(() => { return [...metrics].sort((a, b) => b.id - a.id); }, [metrics]); return (

Activity

{metrics.length === 0 && (

No metrics data available

)} {metrics.length > 0 && (
{sortedMetrics.map((metric) => ( ))}
ID Time Model Cached Prompt Generated Prompt Processing Generation Speed Duration
{metric.id + 1 /* un-zero index */} {formatRelativeTime(metric.timestamp)} {metric.model} {metric.cache_tokens > 0 ? metric.cache_tokens.toLocaleString() : "-"} {metric.input_tokens.toLocaleString()} {metric.output_tokens.toLocaleString()} {formatSpeed(metric.prompt_per_second)} {formatSpeed(metric.tokens_per_second)} {formatDuration(metric.duration_ms)}
)}
); }; interface TooltipProps { content: string; } const Tooltip: React.FC = ({ content }) => { return (
{content}
); }; export default ActivityPage;