Files
ttstd-infinite-canvas/web/src/lib/generation-task-display.ts
2026-09-14 01:11:56 +08:00

69 lines
2.9 KiB
TypeScript

import type { GenerationTask, TaskStatus } from "@/services/api/task-center";
export const statusLabel: Record<TaskStatus, string> = {
queued: "排队中",
running: "生成中",
succeeded: "已完成",
failed: "失败",
cancelled: "已取消",
};
type GenerationTaskDisplayTarget = Pick<GenerationTask, "status" | "stage">;
export function isGenerationTaskSubmissionUncertain(task: GenerationTaskDisplayTarget) {
return task.stage === "submission_unknown";
}
export function generationTaskStatusLabel(task: GenerationTaskDisplayTarget) {
if (isGenerationTaskSubmissionUncertain(task)) return "提交结果待确认";
return statusLabel[task.status];
}
export function generationTaskStageLabel(task: GenerationTaskDisplayTarget) {
if (isGenerationTaskSubmissionUncertain(task)) return "为避免重复扣费,未自动重试";
if (task.stage === "generating") return "生成中";
if (task.stage === "queued") return "排队中";
return task.stage || generationTaskStatusLabel(task);
}
export function generationTaskShowsProgress(task: GenerationTaskDisplayTarget) {
if (isGenerationTaskSubmissionUncertain(task)) return false;
// 排队、后端接管和连接供应商都没有真实百分比。只有上游状态响应
// 已经写回任务后才显示进度,避免所有图片/视频长期停在同一个假数值。
if (["等待队列调度", "后端接管任务", "正在连接上游", "调用生成模型"].includes(task.stage || "")) return false;
return true;
}
export const operationOptions = [
{ label: "文生视频", value: "text_to_video" },
{ label: "图生视频", value: "image_to_video" },
{ label: "全模态参考", value: "reference_to_video" },
{ label: "视频续写", value: "extend" },
{ label: "视频局部修改", value: "inpaint" },
{ label: "元素替换", value: "replace_element" },
{ label: "镜头/运镜调整", value: "camera_motion" },
{ label: "风格迁移", value: "style_transfer" },
{ label: "参考音频生成视频", value: "audio_to_video" },
{ label: "结果版本对比", value: "compare_versions" },
];
export const operationLabelByValue = new Map(operationOptions.map((item) => [item.value, item.label]));
export const taskTypeLabel: Record<string, string> = {
canvas_image: "画布生图",
canvas_video: "画布视频",
canvas_audio: "画布音频",
canvas_text: "画布文本",
};
export function formatTaskKind(task: GenerationTask) {
const typeLabel = taskTypeLabel[task.type];
const operationLabel = task.operation ? operationLabelByValue.get(task.operation) : "";
if (task.type === "canvas_video" && operationLabel) return `${typeLabel || "画布视频"} · ${operationLabel}`;
if (typeLabel) return typeLabel;
if (operationLabel) return operationLabel;
if (task.type.startsWith("video_")) return "视频任务";
return "生成任务";
}