fix(canvas): 生成结果命名 - 保留复制与参数变体标识避免下载重名

This commit is contained in:
ddCat
2026-08-29 10:28:23 +08:00
parent 86019cccea
commit 6d77c250c1
4 changed files with 63 additions and 2 deletions

View File

@@ -0,0 +1,23 @@
import type { CanvasNodeData } from "@/types/canvas";
const COPY_SUFFIX = /(_copy\d+|\s+Copy)$/i;
const VERSION_SUFFIX = /\s*·\s*([A-Z])\s*$/;
export function buildImageGenerationNodeTitle(prompt: string, sourceNode?: CanvasNodeData, outputIndex?: number, outputCount = 1) {
let title = prompt.trim().slice(0, 32) || "Generated Image";
if (sourceNode) {
const sourceTitleWithoutVersion = sourceNode.title.replace(VERSION_SUFFIX, "");
const copySuffix = sourceTitleWithoutVersion.match(COPY_SUFFIX)?.[1] || "";
const versionLabel = validVersionLabel(sourceNode.metadata?.versionLabel) || sourceNode.title.match(VERSION_SUFFIX)?.[1] || "";
const titleWithoutVersion = title.replace(VERSION_SUFFIX, "");
if (copySuffix && !titleWithoutVersion.toLowerCase().endsWith(copySuffix.toLowerCase())) title += copySuffix;
if (versionLabel && !title.endsWith(` · ${versionLabel}`)) title += ` · ${versionLabel}`;
}
if (outputCount > 1 && outputIndex !== undefined) title += ` · ${outputIndex + 1}`;
return title;
}
function validVersionLabel(value?: string) {
const normalized = value?.trim().toUpperCase() || "";
return /^[A-Z]$/.test(normalized) ? normalized : "";
}

View File

@@ -2,6 +2,7 @@ import { nanoid } from "nanoid";
import { NODE_DEFAULT_SIZE } from "@/constant/canvas";
import { canGenerateImageInPlace, findAvailableGenerationGroupPosition, imageGenerationChildPosition, imageGenerationGroupSize } from "@/lib/canvas/canvas-generation-layout";
import { buildImageGenerationNodeTitle } from "@/lib/canvas/canvas-generation-title";
import { nodeSizeFromRatio } from "@/lib/canvas/canvas-node-size";
import { canvasImageReferenceLimitError, buildImageGenerationMetadata, getGenerationCount, isGenerationCanceled, runCanvasGenerationTaskToConsumer } from "@/lib/canvas/canvas-project-generation";
import { CONTENT_MODERATION_ERROR_CODE, generationFailureMetadata, type GenerationFailureMetadata } from "@/lib/generation-error";
@@ -80,7 +81,7 @@ export async function executeImageGeneration({
const rootNode: CanvasNodeData = {
id: rootId,
type: CanvasNodeType.Image,
title: effectivePrompt.slice(0, 32) || "Generated Image",
title: buildImageGenerationNodeTitle(effectivePrompt, sourceNode),
position: rootPosition,
width: rootWidth,
height: rootHeight,
@@ -104,7 +105,7 @@ export async function executeImageGeneration({
const childNodes: CanvasNodeData[] = childIds.map((id, index) => ({
id,
type: CanvasNodeType.Image,
title: effectivePrompt.slice(0, 32) || "Generated Image",
title: buildImageGenerationNodeTitle(effectivePrompt, sourceNode, index, count),
position: imageGenerationChildPosition(rootNode.position, rootNode.width, outputNodeSize, index),
width: outputNodeSize.width,
height: outputNodeSize.height,