"use client"; import { useState } from "react"; import useSWR from "swr"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { adminFetcher } from "./media-records-panel"; import { formatRecordTime } from "@/lib/admin/record-time"; type Event = { id: string; modelDisplayName: string; modelRuntimeId: string; providerName: string; eventType: string; createdAt: string; errorMessage: string; elapsedMs: number | null; consecutiveFailures: number; autoDisabled: boolean; }; export function ModelHealthPanel({ providers, models, initialModelId = "", }: { initialModelId?: string; providers: Array<{ id: string; name: string }>; models: Array<{ id: string; displayName: string; providerId: string }>; }) { const [filters, setFilters] = useState({ providerId: "", modelId: initialModelId, eventType: "", startDate: "", endDate: "", }); const [page, setPage] = useState(1); const query = new URLSearchParams({ ...filters, page: String(page), limit: "20" }); const { data, error, isLoading, isValidating, mutate } = useSWR<{ events: Event[]; hasMore: boolean; }>(`/api/admin/ai-model-health?${query}`, adminFetcher, { keepPreviousData: true, revalidateOnFocus: false, }); const update = (change: Partial) => { setFilters((f) => ({ ...f, ...change })); setPage(1); }; return (

运行健康

按上游和模型追踪故障,查看完整原因与发生时间。

{[ ["providerId", "全部上游", providers.map((p) => [p.id, p.name])], [ "modelId", "全部模型", models .filter((m) => !filters.providerId || m.providerId === filters.providerId) .map((m) => [m.id, m.displayName]), ], [ "eventType", "全部错误", [ ["quota", "额度 / 余额"], ["timeout", "超时"], ["unavailable", "不可用"], ["invalid_model", "模型不可用"], ["download_error", "结果下载失败"], ["error", "其他错误"], ["success", "成功"], ], ], ].map(([key, label, options]) => ( ))} update({ startDate: e.target.value })} /> update({ endDate: e.target.value })} />
{error ? (

日志加载失败,请点击刷新重试。

) : isLoading ? (

正在加载故障日志…

) : (
{data?.events.map((event) => (
{event.modelDisplayName || event.modelRuntimeId || "已删除模型"} {event.providerName || "未知上游"} {{ quota: "额度 / 余额", timeout: "超时", unavailable: "不可用", error: "服务错误", invalid_model: "模型不可用", download_error: "结果下载失败", success: "成功", }[event.eventType] || event.eventType}

{event.errorMessage || "未记录详细原因"}

连续失败 {event.consecutiveFailures} 次 {event.elapsedMs !== null && ( 耗时 {Math.round(event.elapsedMs / 1000)} 秒 )} {event.autoDisabled && 已自动停用}
))} {!data?.events.length && (

该范围内没有故障记录。

)}
)}
第 {page} 页{isValidating && " · 正在更新…"}
); }