feat(assets): 文件夹主题 - 新增多主题皮肤并同步主线
This commit is contained in:
23
web/src/lib/canvas/canvas-folder-theme.ts
Normal file
23
web/src/lib/canvas/canvas-folder-theme.ts
Normal file
@@ -0,0 +1,23 @@
|
||||
import type { CanvasFolderTheme } from "@/types/canvas";
|
||||
|
||||
export const CANVAS_FOLDER_THEME_OPTIONS: ReadonlyArray<{
|
||||
key: CanvasFolderTheme;
|
||||
label: string;
|
||||
cover: string;
|
||||
}> = [
|
||||
{ key: "aurora", label: "赤蓝流光", cover: "/images/canvas/folder-default-cover.png" },
|
||||
{ key: "obsidian", label: "曜石银蓝", cover: "/images/canvas/folder-theme-obsidian.png" },
|
||||
{ key: "ember", label: "熔金赤焰", cover: "/images/canvas/folder-theme-ember.png" },
|
||||
{ key: "pearl", label: "珍珠薄雾", cover: "/images/canvas/folder-theme-pearl.png" },
|
||||
];
|
||||
|
||||
export function resolveCanvasFolderTheme(value?: string): CanvasFolderTheme {
|
||||
return CANVAS_FOLDER_THEME_OPTIONS.some((theme) => theme.key === value) ? value as CanvasFolderTheme : "aurora";
|
||||
}
|
||||
|
||||
export function resolveCanvasFolderThemeCover(theme?: string, customCover?: string) {
|
||||
const custom = customCover?.trim();
|
||||
if (custom) return custom;
|
||||
const resolved = resolveCanvasFolderTheme(theme);
|
||||
return CANVAS_FOLDER_THEME_OPTIONS.find((item) => item.key === resolved)!.cover;
|
||||
}
|
||||
@@ -52,14 +52,14 @@ export async function runBackendCanvasGenerationTask(
|
||||
},
|
||||
dependencies?: GenerationTaskDependencies,
|
||||
) {
|
||||
const normalizedReferenceImages = mode === "image" ? limitCanvasImageReferences(config, referenceImages) : referenceImages;
|
||||
if (mode === "image") assertCanvasImageReferenceLimit(config, referenceImages);
|
||||
return runBackendGenerationTask(
|
||||
{
|
||||
projectId,
|
||||
mode,
|
||||
prompt,
|
||||
config,
|
||||
referenceImages: normalizedReferenceImages,
|
||||
referenceImages,
|
||||
referenceVideos,
|
||||
referenceAudios,
|
||||
mask,
|
||||
@@ -74,12 +74,15 @@ export async function runBackendCanvasGenerationTask(
|
||||
);
|
||||
}
|
||||
|
||||
// Canvas references can include a scene frame plus multiple character turnarounds. Keep
|
||||
// the earliest connected scene image when a provider accepts fewer images than the graph.
|
||||
export function limitCanvasImageReferences(config: AiConfig, referenceImages: ReferenceImage[]) {
|
||||
export function canvasImageReferenceLimitError(config: AiConfig, referenceImages: ReferenceImage[]) {
|
||||
const maxImages = modelCapabilityConfigFor(config, config.model).image?.references.maxImages;
|
||||
if (maxImages === undefined || maxImages < 1 || referenceImages.length <= maxImages) return referenceImages;
|
||||
return referenceImages.slice(0, maxImages);
|
||||
if (maxImages === undefined || referenceImages.length <= maxImages) return "";
|
||||
return `当前图片模型最多支持 ${maxImages} 张参考图,当前已连接 ${referenceImages.length} 张。请移除多余连线后重试`;
|
||||
}
|
||||
|
||||
export function assertCanvasImageReferenceLimit(config: AiConfig, referenceImages: ReferenceImage[]) {
|
||||
const error = canvasImageReferenceLimitError(config, referenceImages);
|
||||
if (error) throw new Error(error);
|
||||
}
|
||||
|
||||
export { backendProviderConfig };
|
||||
|
||||
Reference in New Issue
Block a user