From 6180c5fc49391a747e526890c7cc3bcaa06adb08 Mon Sep 17 00:00:00 2001 From: 134 Date: Thu, 20 Aug 2026 19:28:51 +0800 Subject: [PATCH] fix: restore production model availability helpers --- lib/ai/model-visibility.ts | 19 +++++++++++ lib/style-pro/model-availability.ts | 51 +++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 lib/ai/model-visibility.ts create mode 100644 lib/style-pro/model-availability.ts diff --git a/lib/ai/model-visibility.ts b/lib/ai/model-visibility.ts new file mode 100644 index 000000000..7eb4e15be --- /dev/null +++ b/lib/ai/model-visibility.ts @@ -0,0 +1,19 @@ +export type HiddenModelAccessInput = { + sessionUserType?: string | null; + databaseUserRole?: string | null; + isHighVip?: boolean | null; +}; + +const HIDDEN_MODEL_ADMIN_ROLES = new Set(["admin", "agent_admin"]); + +export function canAccessHiddenAiModels({ + sessionUserType, + databaseUserRole, + isHighVip, +}: HiddenModelAccessInput) { + return ( + isHighVip === true || + HIDDEN_MODEL_ADMIN_ROLES.has(String(databaseUserRole || "").trim()) || + HIDDEN_MODEL_ADMIN_ROLES.has(String(sessionUserType || "").trim()) + ); +} diff --git a/lib/style-pro/model-availability.ts b/lib/style-pro/model-availability.ts new file mode 100644 index 000000000..89822ebdb --- /dev/null +++ b/lib/style-pro/model-availability.ts @@ -0,0 +1,51 @@ +import type { AiModel, AiProvider } from "@/lib/db/schema"; +import { + getAiModelFrontendAvailability, + type ModelFrontendAvailability, +} from "@/lib/ai/model-frontend-availability"; +import { modelSupportsReferenceImageInput } from "@/lib/ai/reference-image-capability"; + +type StyleProAvailabilityEntry = { + model: Pick< + AiModel, + | "displayName" + | "modelId" + | "supportsVision" + | "capabilities" + | "defaultParams" + | "isEnabled" + | "healthStatus" + | "healthAutoDisabledAt" + | "healthObservationStartedAt" + >; + provider: Pick; +}; + +export function getStyleProModelAvailability( + entry: StyleProAvailabilityEntry +): ModelFrontendAvailability { + if (!modelSupportsReferenceImageInput(entry.model, entry.provider)) { + return { + availabilityStatus: "maintenance", + availabilityLabel: "仅文生图", + selectable: false, + disabledReason: "风格化需要参考图,该模型仅支持文生图", + }; + } + + const availability = getAiModelFrontendAvailability(entry.model); + if (availability.availabilityStatus === "testing") { + return { + availabilityStatus: "testing", + availabilityLabel: "暂不可用", + selectable: false, + disabledReason: "模型近期生成异常,恢复健康后会自动开放", + }; + } + + return availability; +} + +export function isStyleProModelRunnable(entry: StyleProAvailabilityEntry) { + return getStyleProModelAvailability(entry).selectable; +}