import React from 'react';
import { Box, Card, CardContent, Grid, Typography, Stack, useTheme, alpha } from '@mui/material';
import {
Storage as StorageIcon,
Balance as BalanceIcon,
Bolt as BoltIcon,
AccessTime as AccessTimeIcon
} from '@mui/icons-material';
import { useTranslation } from 'react-i18next';
function StatCard({ title, value, subValue, icon: Icon, color }) {
const theme = useTheme();
return (
{title}
{value}
{subValue && (
{subValue}
)}
);
}
export default function StatsCards({ data }) {
const theme = useTheme();
const { t } = useTranslation();
// 格式化数字
const formatNumber = num => {
if (num >= 1000000) return `${(num / 1000000).toFixed(1)}M`;
if (num >= 1000) return `${(num / 1000).toFixed(1)}K`;
return num;
};
return (
{/* 总 Token 消耗 */}
{/* 平均 Token 消耗/次 */}
{/* 总调用次数 */}
{t('monitoring.stats.successCalls', { count: formatNumber(data.successCalls) })}
·
{t('monitoring.stats.failedCalls', { count: formatNumber(data.failedCalls) })}
{data.totalCalls > 0 && (
({t('monitoring.stats.failureRate', { rate: ((data.failureRate || 0) * 100).toFixed(1) })})
)}
}
icon={BoltIcon}
color={theme.palette.success.main}
/>
{/* 平均响应耗时 */}
0
? t('monitoring.stats.basedOnSuccessCalls', { count: formatNumber(data.successCalls) })
: t('monitoring.stats.noSuccessCalls')
}
icon={AccessTimeIcon}
color={theme.palette.warning.main}
/>
);
}