ai-chatbot/lib/video-canvas/production-preflight.ts

35 lines
1.6 KiB
TypeScript

import type { CanvasTaskRequest } from "./task-contract";
export type CanvasProductionService = "render" | "upscale" | "asr" | "separation";
const serviceNames: Record<CanvasProductionService, string> = {
render: "视频成片合成", upscale: "视频高清", asr: "语音转写", separation: "人声分离",
};
export function requiredCanvasProductionServices(requests: CanvasTaskRequest[]) {
const services = new Set<CanvasProductionService>();
for (const request of requests) {
if (request.kind === "video-upscale") services.add("upscale");
if (request.kind !== "smart-edit") continue;
const params = request.params;
if (params.operation === "render" || params.autoRender === true) services.add("render");
if (params.operation === "transcribe" || params.transcribe === true) services.add("asr");
if (params.operation === "separate") services.add("separation");
}
return [...services];
}
export async function assertCanvasProductionServices(
requests: CanvasTaskRequest[], check: (service: CanvasProductionService) => Promise<boolean>,
) {
const services = requiredCanvasProductionServices(requests);
const results = await Promise.allSettled(services.map(check));
const unavailable = services.filter((_service, index) => {
const result = results[index];
return result.status === "rejected" || result.value !== true;
});
if (unavailable.length) throw Object.assign(
Error(`${unavailable.map(service => serviceNames[service]).join("、")}服务不可用;本次未启动生成任务,请稍后重试`),
{ status: 503, code: "CANVAS_SERVICE_UNAVAILABLE" },
);
}