import { useTranslation } from 'react-i18next'; import { Dialog, DialogContent, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { useRequestDetail } from '@/lib/query/usage'; interface RequestDetailPanelProps { requestId: string; onClose: () => void; } export function RequestDetailPanel({ requestId, onClose }: RequestDetailPanelProps) { const { t } = useTranslation(); const { data: request, isLoading } = useRequestDetail(requestId); if (isLoading) { return (
); } if (!request) { return ( {t('usage.requestDetail', '请求详情')}
{t('usage.requestNotFound', '请求未找到')}
); } return ( {t('usage.requestDetail', '请求详情')}
{/* 基本信息 */}

{t('usage.basicInfo', '基本信息')}

{t('usage.requestId', '请求ID')}
{request.requestId}
{t('usage.time', '时间')}
{new Date(request.createdAt * 1000).toLocaleString('zh-CN')}
{t('usage.provider', '供应商')}
{request.providerName || t('usage.unknownProvider', '未知')} {request.providerId}
{t('usage.appType', '应用类型')}
{request.appType}
{t('usage.model', '模型')}
{request.model}
{t('usage.status', '状态')}
= 200 && request.statusCode < 300 ? 'bg-green-100 text-green-800' : 'bg-red-100 text-red-800' }`} > {request.statusCode}
{/* Token 使用量 */}

{t('usage.tokenUsage', 'Token 使用量')}

{t('usage.inputTokens', '输入 Tokens')}
{request.inputTokens.toLocaleString()}
{t('usage.outputTokens', '输出 Tokens')}
{request.outputTokens.toLocaleString()}
{t('usage.cacheReadTokens', '缓存读取')}
{request.cacheReadTokens.toLocaleString()}
{t('usage.cacheCreationTokens', '缓存写入')}
{request.cacheCreationTokens.toLocaleString()}
{t('usage.totalTokens', '总计')}
{(request.inputTokens + request.outputTokens).toLocaleString()}
{/* 成本明细 */}

{t('usage.costBreakdown', '成本明细')}

{t('usage.inputCost', '输入成本')}
${parseFloat(request.inputCostUsd).toFixed(6)}
{t('usage.outputCost', '输出成本')}
${parseFloat(request.outputCostUsd).toFixed(6)}
{t('usage.cacheReadCost', '缓存读取成本')}
${parseFloat(request.cacheReadCostUsd).toFixed(6)}
{t('usage.cacheCreationCost', '缓存写入成本')}
${parseFloat(request.cacheCreationCostUsd).toFixed(6)}
{t('usage.totalCost', '总成本')}
${parseFloat(request.totalCostUsd).toFixed(6)}
{/* 性能信息 */}

{t('usage.performance', '性能信息')}

{t('usage.latency', '延迟')}
{request.latencyMs}ms
{/* 错误信息 */} {request.errorMessage && (

{t('usage.errorMessage', '错误信息')}

{request.errorMessage}

)}
); }