Add deep training acceptance checks

This commit is contained in:
2026-06-30 13:42:30 +08:00
parent 7d6e1692b1
commit cf920e97c3
8 changed files with 179 additions and 11 deletions

View File

@@ -109,6 +109,14 @@ type AcceptancePayload = {
};
};
type DeepAcceptancePayload = {
available?: boolean;
passed?: boolean;
run_id?: string;
created_at?: string;
checks?: Array<{ name: string; passed: boolean }>;
};
type GpuPayload = {
available: boolean;
gpus: Array<{
@@ -191,11 +199,12 @@ function useData() {
const [datasets, setDatasets] = useState<UploadedDataset[]>([]);
const [coverage, setCoverage] = useState<CoveragePayload | null>(null);
const [acceptance, setAcceptance] = useState<AcceptancePayload | null>(null);
const [deepAcceptance, setDeepAcceptance] = useState<DeepAcceptancePayload | null>(null);
const [error, setError] = useState<string>("");
async function refresh() {
try {
const [catalogNext, gpusNext, jobsNext, resultsNext, curvesNext, datasetsNext, coverageNext, acceptanceNext] = await Promise.all([
const [catalogNext, gpusNext, jobsNext, resultsNext, curvesNext, datasetsNext, coverageNext, acceptanceNext, deepAcceptanceNext] = await Promise.all([
api<Catalog>("/api/catalog"),
api<GpuPayload>("/api/system/gpus"),
api<Job[]>("/api/jobs"),
@@ -203,7 +212,8 @@ function useData() {
api<TrainingCurve[]>("/api/results/curves"),
api<UploadedDataset[]>("/api/datasets"),
api<CoveragePayload>("/api/coverage"),
api<AcceptancePayload>("/api/acceptance/latest")
api<AcceptancePayload>("/api/acceptance/latest"),
api<DeepAcceptancePayload>("/api/acceptance/deep/latest")
]);
setCatalog(catalogNext);
setGpus(gpusNext);
@@ -213,6 +223,7 @@ function useData() {
setDatasets(datasetsNext);
setCoverage(coverageNext);
setAcceptance(acceptanceNext);
setDeepAcceptance(deepAcceptanceNext);
setError("");
} catch (err) {
setError(String(err));
@@ -225,7 +236,7 @@ function useData() {
return () => window.clearInterval(timer);
}, []);
return { catalog, gpus, jobs, results, curves, datasets, coverage, acceptance, error, refresh };
return { catalog, gpus, jobs, results, curves, datasets, coverage, acceptance, deepAcceptance, error, refresh };
}
function StatusPill({ status }: { status: string }) {
@@ -233,7 +244,7 @@ function StatusPill({ status }: { status: string }) {
}
function App() {
const { catalog, gpus, jobs, results, curves, datasets, coverage, acceptance, error, refresh } = useData();
const { catalog, gpus, jobs, results, curves, datasets, coverage, acceptance, deepAcceptance, error, refresh } = useData();
const [taskType, setTaskType] = useState("mock.echo");
const [params, setParams] = useState(JSON.stringify(defaultParams["mock.echo"], null, 2));
const [selectedJob, setSelectedJob] = useState<Job | null>(null);
@@ -333,6 +344,16 @@ function App() {
}
}
async function runDeepAcceptance() {
setBusy(true);
try {
await api("/api/acceptance/deep", { method: "POST" });
await refresh();
} finally {
setBusy(false);
}
}
async function createDataset() {
setBusy(true);
try {
@@ -591,9 +612,14 @@ function App() {
<p className="eyebrow">Coverage</p>
<h2>Seg </h2>
</div>
<button className="iconButton" disabled={busy} onClick={runAcceptanceSmoke} title="运行轻量验收">
<ClipboardCheck size={18} />
</button>
<div className="buttonRow compactButtons">
<button className="iconButton" disabled={busy} onClick={runAcceptanceSmoke} title="运行轻量验收">
<ClipboardCheck size={18} />
</button>
<button className="iconButton" disabled={busy} onClick={runDeepAcceptance} title="运行深度训练验收">
<Activity size={18} />
</button>
</div>
</div>
<div className="coverageGrid">
<div>
@@ -616,12 +642,17 @@ function App() {
<span></span>
<strong>{acceptance?.model_family_readiness?.passed ? "OK" : "Check"}</strong>
</div>
<div>
<span></span>
<strong>{deepAcceptance?.available === false ? "New" : deepAcceptance?.passed ? "OK" : "Check"}</strong>
</div>
</div>
<div className="coverageStatus">
{(coverage?.unmapped_user_scripts.length ?? 0) === 0 ? (
<>
<span></span>
<span>{acceptance?.created_at ?? "尚未运行"} {acceptance?.run_id ? `#${acceptance.run_id}` : ""}</span>
<span>{deepAcceptance?.created_at ?? "尚未运行"} {deepAcceptance?.run_id ? `#${deepAcceptance.run_id}` : ""} {deepAcceptance?.checks?.filter((item) => item.passed).length ?? 0}/{deepAcceptance?.checks?.length ?? 0}</span>
<span> readiness{acceptance?.model_family_readiness?.checks?.filter((item) => item.passed).length ?? 0}/{acceptance?.model_family_readiness?.checks?.length ?? 0}warnings {acceptance?.model_family_readiness?.warnings?.length ?? 0}</span>
</>
) : (