АРЧ ЮИ - остановка прогона через гуй
This commit is contained in:
+65
-12
@@ -355,7 +355,7 @@ function readReportedCaseIds(job) {
|
||||
return output;
|
||||
}
|
||||
function isTerminalCaseStatus(status) {
|
||||
return status === "completed" || status === "failed";
|
||||
return status === "completed" || status === "failed" || status === "canceled";
|
||||
}
|
||||
function syncJobWithSessions(job) {
|
||||
if (!job.run_id || !job.eval_target.startsWith("assistant_")) {
|
||||
@@ -473,6 +473,7 @@ function buildEvalRouter(services) {
|
||||
throw new http_1.ApiError("ASYNC_CASESET_EMPTY", "No runnable cases found in selected case-set.", 400);
|
||||
}
|
||||
const nowIso = new Date().toISOString();
|
||||
const abortController = new AbortController();
|
||||
const job = {
|
||||
job_id: jobId,
|
||||
status: "queued",
|
||||
@@ -491,7 +492,8 @@ function buildEvalRouter(services) {
|
||||
messages: []
|
||||
})),
|
||||
error: null,
|
||||
report: null
|
||||
report: null,
|
||||
abort_controller: abortController
|
||||
};
|
||||
ASYNC_JOBS.set(job.job_id, job);
|
||||
trimAsyncJobsStore();
|
||||
@@ -500,25 +502,48 @@ function buildEvalRouter(services) {
|
||||
const target = ASYNC_JOBS.get(job.job_id);
|
||||
if (!target)
|
||||
return;
|
||||
if (target.status === "canceled") {
|
||||
return;
|
||||
}
|
||||
target.status = "running";
|
||||
target.updated_at = new Date().toISOString();
|
||||
try {
|
||||
const report = await services.evalService.run({
|
||||
...payload,
|
||||
caseSetFile: runtimeCaseSetFile,
|
||||
runId
|
||||
runId,
|
||||
abortSignal: abortController.signal
|
||||
});
|
||||
target.report = report;
|
||||
syncJobWithSessions(target);
|
||||
target.completed_cases = target.total_cases;
|
||||
target.status = "completed";
|
||||
target.updated_at = new Date().toISOString();
|
||||
const latestAfterRun = ASYNC_JOBS.get(job.job_id);
|
||||
if (!latestAfterRun) {
|
||||
return;
|
||||
}
|
||||
if (latestAfterRun.status === "canceled") {
|
||||
latestAfterRun.updated_at = new Date().toISOString();
|
||||
return;
|
||||
}
|
||||
latestAfterRun.report = report;
|
||||
syncJobWithSessions(latestAfterRun);
|
||||
latestAfterRun.completed_cases = latestAfterRun.total_cases;
|
||||
latestAfterRun.status = "completed";
|
||||
latestAfterRun.updated_at = new Date().toISOString();
|
||||
latestAfterRun.abort_controller = null;
|
||||
}
|
||||
catch (error) {
|
||||
syncJobWithSessions(target);
|
||||
target.status = "failed";
|
||||
target.error = error instanceof Error ? error.message : String(error);
|
||||
target.updated_at = new Date().toISOString();
|
||||
const latestAfterError = ASYNC_JOBS.get(job.job_id);
|
||||
if (!latestAfterError) {
|
||||
return;
|
||||
}
|
||||
if (latestAfterError.status === "canceled") {
|
||||
latestAfterError.updated_at = new Date().toISOString();
|
||||
latestAfterError.abort_controller = null;
|
||||
return;
|
||||
}
|
||||
syncJobWithSessions(latestAfterError);
|
||||
latestAfterError.status = "failed";
|
||||
latestAfterError.error = error instanceof Error ? error.message : String(error);
|
||||
latestAfterError.updated_at = new Date().toISOString();
|
||||
latestAfterError.abort_controller = null;
|
||||
}
|
||||
})();
|
||||
});
|
||||
@@ -552,5 +577,33 @@ function buildEvalRouter(services) {
|
||||
next(error);
|
||||
}
|
||||
});
|
||||
router.post("/api/eval/run-async/:job_id/cancel", (req, res, next) => {
|
||||
try {
|
||||
const jobId = String(req.params.job_id ?? "").trim();
|
||||
if (!jobId) {
|
||||
throw new http_1.ApiError("INVALID_ASYNC_JOB_ID", "job_id is required.", 400);
|
||||
}
|
||||
const job = ASYNC_JOBS.get(jobId);
|
||||
if (!job) {
|
||||
throw new http_1.ApiError("ASYNC_JOB_NOT_FOUND", `Async eval job not found: ${jobId}`, 404);
|
||||
}
|
||||
if (!isTerminalCaseStatus(job.status)) {
|
||||
job.status = "canceled";
|
||||
job.error = "Остановлено оператором.";
|
||||
job.updated_at = new Date().toISOString();
|
||||
job.abort_controller?.abort();
|
||||
job.abort_controller = null;
|
||||
job.cases = job.cases.map((item) => item.status === "completed" ? item : { ...item, status: "canceled" });
|
||||
syncJobWithSessions(job);
|
||||
}
|
||||
(0, http_1.ok)(res, {
|
||||
ok: true,
|
||||
job: snapshotJob(job)
|
||||
});
|
||||
}
|
||||
catch (error) {
|
||||
next(error);
|
||||
}
|
||||
});
|
||||
return router;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user