diff --git a/src/api/modelCapabilitiesClient.ts b/src/api/modelCapabilitiesClient.ts index 7d284d0..22614bf 100644 --- a/src/api/modelCapabilitiesClient.ts +++ b/src/api/modelCapabilitiesClient.ts @@ -38,9 +38,14 @@ function normalizeModelOption(raw: unknown): ModelCapabilityOption | null { const enabled = raw.enabled === undefined ? status !== "maintenance" && status !== "disabled" : Boolean(raw.enabled); if (!enabled) return null; + const label = toStringValue(raw.label ?? raw.displayName ?? raw.display_name ?? raw.name, value); + return { value, - label: toStringValue(raw.label ?? raw.displayName ?? raw.display_name ?? raw.name, value), + label: + value === "wan2.7-image-pro" + ? label.replace(/\s*4k\b/i, "").trim() || "wan 2.7 Pro" + : label, description: toStringValue(raw.description) || undefined, badge: toStringValue(raw.badge) || undefined, enabled, diff --git a/src/features/workbench/WorkbenchPage.tsx b/src/features/workbench/WorkbenchPage.tsx index bb60edb..47b0e1c 100644 --- a/src/features/workbench/WorkbenchPage.tsx +++ b/src/features/workbench/WorkbenchPage.tsx @@ -81,7 +81,9 @@ import { resolveVideoRequestModel } from "../../utils/resolveVideoModel"; import { calculateEnterpriseVideoCredits, ENTERPRISE_DEFAULT_VIDEO_MODEL } from "../../utils/enterpriseVideoPolicy"; import { getImageQualityOptions, + getImageQualityOptionsForContext, getDefaultImageQuality, + getDefaultImageQualityForContext, getVideoQualityOptions, getDefaultVideoQuality, getVideoQualityLabel, @@ -469,7 +471,26 @@ function WorkbenchPage({ setSidebarCollapsed(!hasSidebarRecords); }, [hasSidebarRecords]); - const imageQualityOptions = useMemo(() => getImageQualityOptions(imageModel), [imageModel]); + const hasImageReferences = activeMode === "image" && referenceItems.some((item) => item.kind === "image"); + const isImageGridMode = activeMode === "image" && imageGridMode !== "single"; + const imageQualityContext = useMemo( + () => ({ + hasReferenceImages: hasImageReferences, + isGridMode: isImageGridMode, + }), + [hasImageReferences, isImageGridMode], + ); + const imageQualityOptions = useMemo( + () => getImageQualityOptionsForContext(imageModel, imageQualityContext), + [imageModel, imageQualityContext], + ); + const imageGridModeOptions = useMemo( + () => + String(imageModel || "").toLowerCase().startsWith("wan2.7-") + ? GRID_MODE_OPTIONS.filter((option) => option.value !== "grid-25") + : GRID_MODE_OPTIONS, + [imageModel], + ); const videoQualityOptions = getVideoQualityOptions(videoModel); const videoQualityLabel = getVideoQualityLabel(videoModel, videoQuality); @@ -1205,9 +1226,15 @@ function WorkbenchPage({ useEffect(() => { if (!imageQualityOptions.some((option) => option.value === imageQuality)) { - setImageQuality(getDefaultImageQuality(imageModel)); + setImageQuality(getDefaultImageQualityForContext(imageModel, imageQualityContext)); } - }, [imageModel, imageQuality, imageQualityOptions]); + }, [imageModel, imageQuality, imageQualityContext, imageQualityOptions]); + + useEffect(() => { + if (!imageGridModeOptions.some((option) => option.value === imageGridMode)) { + setImageGridMode("single"); + } + }, [imageGridMode, imageGridModeOptions]); useEffect(() => { if (activeMode !== "video" || videoFrameMode !== "start-end" || referenceItems.length <= 2) return; @@ -2905,7 +2932,7 @@ function WorkbenchPage({ toggleToolbarMenu("image-grid-mode")} diff --git a/src/features/workbench/workbenchConstants.ts b/src/features/workbench/workbenchConstants.ts index 3741f3b..b8a5b2b 100644 --- a/src/features/workbench/workbenchConstants.ts +++ b/src/features/workbench/workbenchConstants.ts @@ -231,7 +231,7 @@ export const MODE_OPTIONS: WorkbenchOption[] = (Object.keys(MODE_META) as Workbe })); export const IMAGE_MODEL_OPTIONS: WorkbenchOption[] = [ - { value: "wan2.7-image-pro", label: "wan 2.7 Pro 4K" }, + { value: "wan2.7-image-pro", label: "wan 2.7 Pro" }, { value: "wan2.7-image", label: "wan 2.7" }, { value: "gpt-image-2", label: "omni-GPT" }, { value: "gpt-image-2-vip", label: "omni-GPT VIP" }, diff --git a/src/utils/modelOptions.ts b/src/utils/modelOptions.ts index 9b452d9..63d6371 100644 --- a/src/utils/modelOptions.ts +++ b/src/utils/modelOptions.ts @@ -25,11 +25,30 @@ export function getImageQualityOptions(model: string): CanvasOption[] { : imageQualityOptions.filter((option) => option.value !== "4K"); } +export function getImageQualityOptionsForContext( + model: string, + context?: { hasReferenceImages?: boolean; isGridMode?: boolean }, +): CanvasOption[] { + const options = getImageQualityOptions(model); + const shouldLimitTo2K = + String(model || "").toLowerCase() === "wan2.7-image-pro" && + (context?.hasReferenceImages || context?.isGridMode); + return shouldLimitTo2K ? options.filter((option) => option.value !== "4K") : options; +} + export function getDefaultImageQuality(model: string): string { const options = getImageQualityOptions(model); return options.some((option) => option.value === "2K") ? "2K" : options[0]?.value || "1K"; } +export function getDefaultImageQualityForContext( + model: string, + context?: { hasReferenceImages?: boolean; isGridMode?: boolean }, +): string { + const options = getImageQualityOptionsForContext(model, context); + return options.some((option) => option.value === "2K") ? "2K" : options[0]?.value || "1K"; +} + // ─── Video quality ──────────────────────────────────────────────────────────── function normalizeVideoModel(model: string): string {