import { useState } from "react"; import { useTranslation } from "react-i18next"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { useRequestLogs } from "@/lib/query/usage"; import { RequestDetailPanel } from "./RequestDetailPanel"; import type { LogFilters } from "@/types/usage"; export function RequestLogTable() { const { t } = useTranslation(); const [filters] = useState({}); const [page, setPage] = useState(0); const [selectedRequestId, setSelectedRequestId] = useState( null, ); const limit = 20; const { data: logs, isLoading } = useRequestLogs( filters, limit, page * limit, ); if (isLoading) { return
; } return (
{t("usage.time", "时间")} {t("usage.provider", "供应商")} {t("usage.billingModel", "计费模型")} {t("usage.inputTokens", "输入")} {t("usage.outputTokens", "输出")} {t("usage.cacheCreationTokens", "缓存写入")} {t("usage.cacheReadTokens", "缓存读取")} {t("usage.totalCost", "成本")} {t("usage.latency", "耗时")} {t("usage.status", "状态")} {logs?.length === 0 ? ( {t("usage.noData", "暂无数据")} ) : ( logs?.map((log) => ( setSelectedRequestId(log.requestId)} > {new Date(log.createdAt * 1000).toLocaleString("zh-CN")}
{log.providerName || t("usage.unknownProvider", "未知供应商")} {log.providerId}
{log.model} {log.inputTokens.toLocaleString()} {log.outputTokens.toLocaleString()} {log.cacheCreationTokens.toLocaleString()} {log.cacheReadTokens.toLocaleString()} ${parseFloat(log.totalCostUsd).toFixed(6)} {log.latencyMs}ms = 200 && log.statusCode < 300 ? "bg-green-100 text-green-800" : "bg-red-100 text-red-800" }`} > {log.statusCode}
)) )}
{logs && logs.length >= limit && (
{t("common.page", "第")} {page + 1} {t("common.pageUnit", "页")}
)} {selectedRequestId && ( setSelectedRequestId(null)} /> )}
); }