Add real workspace acceptance

This commit is contained in:
2026-06-30 17:33:15 +08:00
parent 4eb9452760
commit 53b81dd04d
11 changed files with 418 additions and 18 deletions

View File

@@ -373,6 +373,7 @@ function useData() {
const [datasetValidations, setDatasetValidations] = useState<Record<string, DatasetValidation>>({});
const [coverage, setCoverage] = useState<CoveragePayload | null>(null);
const [acceptance, setAcceptance] = useState<AcceptancePayload | null>(null);
const [realAcceptance, setRealAcceptance] = useState<AcceptancePayload | null>(null);
const [deepAcceptance, setDeepAcceptance] = useState<DeepAcceptancePayload | null>(null);
const [runtimeReadiness, setRuntimeReadiness] = useState<RuntimeReadinessPayload | null>(null);
const [capabilities, setCapabilities] = useState<CapabilityPayload | null>(null);
@@ -381,7 +382,7 @@ function useData() {
async function refresh() {
try {
const [catalogNext, gpusNext, envsNext, readinessNext, capabilitiesNext, jobsNext, resultsNext, curvesNext, weightsNext, datasetsNext, coverageNext, acceptanceNext, deepAcceptanceNext, agentEvaluationNext] = await Promise.all([
const [catalogNext, gpusNext, envsNext, readinessNext, capabilitiesNext, jobsNext, resultsNext, curvesNext, weightsNext, datasetsNext, coverageNext, acceptanceNext, realAcceptanceNext, deepAcceptanceNext, agentEvaluationNext] = await Promise.all([
api<Catalog>("/api/catalog"),
api<GpuPayload>("/api/system/gpus"),
api<CondaEnvPayload>("/api/system/envs"),
@@ -394,6 +395,7 @@ function useData() {
api<UploadedDataset[]>("/api/datasets"),
api<CoveragePayload>("/api/coverage"),
api<AcceptancePayload>("/api/acceptance/latest"),
api<AcceptancePayload>("/api/acceptance/real/latest"),
api<DeepAcceptancePayload>("/api/acceptance/deep/latest"),
api<EvaluationAgentPayload>("/api/agents/evaluate")
]);
@@ -421,6 +423,7 @@ function useData() {
setDatasetValidations(Object.fromEntries(validationEntries));
setCoverage(coverageNext);
setAcceptance(acceptanceNext);
setRealAcceptance(realAcceptanceNext);
setDeepAcceptance(deepAcceptanceNext);
setAgentEvaluation(agentEvaluationNext);
setError("");
@@ -435,7 +438,7 @@ function useData() {
return () => window.clearInterval(timer);
}, []);
return { catalog, gpus, condaEnvs, runtimeReadiness, capabilities, agentEvaluation, jobs, results, curves, weightManifest, datasets, datasetValidations, coverage, acceptance, deepAcceptance, error, refresh };
return { catalog, gpus, condaEnvs, runtimeReadiness, capabilities, agentEvaluation, jobs, results, curves, weightManifest, datasets, datasetValidations, coverage, acceptance, realAcceptance, deepAcceptance, error, refresh };
}
function StatusPill({ status }: { status: string }) {
@@ -458,7 +461,7 @@ function JobProgressBar({ progress }: { progress?: JobProgress }) {
}
function App() {
const { catalog, gpus, condaEnvs, runtimeReadiness, capabilities, agentEvaluation, jobs, results, curves, weightManifest, datasets, datasetValidations, coverage, acceptance, deepAcceptance, error, refresh } = useData();
const { catalog, gpus, condaEnvs, runtimeReadiness, capabilities, agentEvaluation, jobs, results, curves, weightManifest, datasets, datasetValidations, coverage, acceptance, realAcceptance, 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);
@@ -652,6 +655,16 @@ function App() {
}
}
async function runRealAcceptance() {
setBusy(true);
try {
await api("/api/acceptance/real", { method: "POST" });
await refresh();
} finally {
setBusy(false);
}
}
async function runAgentValidation() {
setAgentBusy(true);
try {
@@ -1111,6 +1124,9 @@ function App() {
<button className="iconButton" disabled={busy} onClick={runAcceptanceSmoke} title="运行轻量验收">
<ClipboardCheck size={18} />
</button>
<button className="iconButton" disabled={busy} onClick={runRealAcceptance} title="运行真实数据验收">
<FileSearch size={18} />
</button>
<button className="iconButton" disabled={busy} onClick={runDeepAcceptance} title="运行深度训练验收">
<Activity size={18} />
</button>
@@ -1137,6 +1153,10 @@ function App() {
<span></span>
<strong>{acceptance?.model_family_readiness?.passed ? "OK" : "Check"}</strong>
</div>
<div>
<span></span>
<strong>{realAcceptance?.available === false ? "New" : realAcceptance?.passed ? "OK" : "Check"}</strong>
</div>
<div>
<span></span>
<strong>{deepAcceptance?.available === false ? "New" : deepAcceptance?.passed ? "OK" : "Check"}</strong>
@@ -1147,6 +1167,7 @@ function App() {
<>
<span></span>
<span>{acceptance?.created_at ?? "尚未运行"} {acceptance?.run_id ? `#${acceptance.run_id}` : ""}</span>
<span>{realAcceptance?.created_at ?? "尚未运行"} {realAcceptance?.run_id ? `#${realAcceptance.run_id}` : ""} {realAcceptance?.checks?.filter((item) => item.passed).length ?? 0}/{realAcceptance?.checks?.length ?? 0}</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>
</>