From 6ccf04a786a33ef4b2bb5e80b2a4263997679664 Mon Sep 17 00:00:00 2001 From: 134 Date: Wed, 22 Jul 2026 10:53:19 +0800 Subject: [PATCH] fix: preserve AtlasCloud model aliases --- app/api/admin/atlascloud-models/route.ts | 11 +++++++++-- lib/ai/atlascloud-models.ts | 11 +++++++++++ scripts/sync-atlascloud-models.ts | 11 +++++++++-- tests/routes/model-classification.test.ts | 18 ++++++++++++++++++ 4 files changed, 47 insertions(+), 4 deletions(-) diff --git a/app/api/admin/atlascloud-models/route.ts b/app/api/admin/atlascloud-models/route.ts index 74636b29d..44ae614a1 100644 --- a/app/api/admin/atlascloud-models/route.ts +++ b/app/api/admin/atlascloud-models/route.ts @@ -1,6 +1,9 @@ import { and, eq } from "drizzle-orm"; import { NextResponse } from "next/server"; -import { fetchAtlasCloudImagePresets } from "@/lib/ai/atlascloud-models"; +import { + fetchAtlasCloudImagePresets, + resolveAtlasCloudDisplayName, +} from "@/lib/ai/atlascloud-models"; import { db } from "@/lib/db"; import { getAiProviderById } from "@/lib/db/queries"; import { type AiModel, aiModel } from "@/lib/db/schema"; @@ -75,7 +78,11 @@ export async function POST(request: Request) { ), }); const values = { - displayName: preset.displayName, + displayName: resolveAtlasCloudDisplayName( + existing?.displayName, + preset.displayName, + preset.modelId + ), avatarUrl: preset.avatarUrl || null, description: preset.description, supportsVision: preset.supportsVision, diff --git a/lib/ai/atlascloud-models.ts b/lib/ai/atlascloud-models.ts index 91998fb70..342865628 100644 --- a/lib/ai/atlascloud-models.ts +++ b/lib/ai/atlascloud-models.ts @@ -95,6 +95,17 @@ type JsonRecord = Record; export type AtlasCloudMediaKind = "image" | "video" | "3d"; +export function resolveAtlasCloudDisplayName( + existingDisplayName: unknown, + catalogDisplayName: unknown, + modelId: string +) { + const existing = String(existingDisplayName || "").trim(); + if (existing) return existing; + + return String(catalogDisplayName || "").trim() || modelId; +} + function asRecord(value: unknown): JsonRecord { return value && typeof value === "object" && !Array.isArray(value) ? (value as JsonRecord) diff --git a/scripts/sync-atlascloud-models.ts b/scripts/sync-atlascloud-models.ts index 1de03d9ac..dabcf5309 100644 --- a/scripts/sync-atlascloud-models.ts +++ b/scripts/sync-atlascloud-models.ts @@ -1,5 +1,8 @@ import { and, eq, inArray } from "drizzle-orm"; -import { fetchAtlasCloudImagePresets } from "../lib/ai/atlascloud-models"; +import { + fetchAtlasCloudImagePresets, + resolveAtlasCloudDisplayName, +} from "../lib/ai/atlascloud-models"; import { db } from "../lib/db"; import { aiModel, aiProvider } from "../lib/db/schema"; @@ -36,7 +39,11 @@ async function main() { ), }); const values = { - displayName: preset.displayName, + displayName: resolveAtlasCloudDisplayName( + existing?.displayName, + preset.displayName, + preset.modelId + ), avatarUrl: preset.avatarUrl || null, description: preset.description, supportsVision: preset.supportsVision, diff --git a/tests/routes/model-classification.test.ts b/tests/routes/model-classification.test.ts index 9bbf17e91..f8b8a697a 100644 --- a/tests/routes/model-classification.test.ts +++ b/tests/routes/model-classification.test.ts @@ -2,6 +2,7 @@ import { expect, test } from "@playwright/test"; import { createAtlasCloudImagePreset, inferAtlasCloudMediaKind, + resolveAtlasCloudDisplayName, } from "@/lib/ai/atlascloud-models"; import { createAtlasCloudRequestBody } from "@/lib/ai/atlascloud-request"; import { @@ -19,6 +20,23 @@ const atlasHunyuan3D = { }; test.describe("AI model media classification", () => { + test("preserves administrator-defined AtlasCloud display names", () => { + expect( + resolveAtlasCloudDisplayName( + "视觉 Flux Kontext Pro", + "Flux Kontext Pro", + "black-forest-labs/flux-kontext-pro" + ) + ).toBe("视觉 Flux Kontext Pro"); + expect( + resolveAtlasCloudDisplayName( + "", + "Flux Kontext Pro", + "black-forest-labs/flux-kontext-pro" + ) + ).toBe("Flux Kontext Pro"); + }); + test("keeps multi-reference BananaImage models classified as image models", () => { const descriptor = { providerType: "bananaimage",