From 8fd93bfd2923a35f25ae35f9cade3a3449737765 Mon Sep 17 00:00:00 2001 From: 134 Date: Thu, 2 Jul 2026 00:15:45 +0800 Subject: [PATCH] fix: keep fal as scale adjust fallback --- app/api/canvas/local-edit/route.ts | 19 +++++++++++++++-- lib/canvas/generate-image.ts | 33 +++++++++++++++++++++++------- 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/app/api/canvas/local-edit/route.ts b/app/api/canvas/local-edit/route.ts index ca9935cec..9db793cde 100644 --- a/app/api/canvas/local-edit/route.ts +++ b/app/api/canvas/local-edit/route.ts @@ -307,6 +307,21 @@ function getScaleAdjustProviderPriority(providerType: string) { } } +function getScaleAdjustModelHealthPenalty( + healthStatus: string | null | undefined +) { + if (healthStatus === "degraded") return 25; + if (healthStatus === "auto_disabled") return 200; + return 0; +} + +function getScaleAdjustCandidatePriority(entry: AiModelWithProviderForSelection) { + return ( + getScaleAdjustProviderPriority(entry.provider.type) + + getScaleAdjustModelHealthPenalty(entry.model.healthStatus) + ); +} + function isScaleAdjustUsableImageEditModel( entry: AiModelWithProviderForSelection | null | undefined ) { @@ -321,8 +336,8 @@ function compareScaleAdjustProviderCandidates( right: AiModelWithProviderForSelection, preferredModelRef: string ) { - const leftPriority = getScaleAdjustProviderPriority(left.provider.type); - const rightPriority = getScaleAdjustProviderPriority(right.provider.type); + const leftPriority = getScaleAdjustCandidatePriority(left); + const rightPriority = getScaleAdjustCandidatePriority(right); if (leftPriority !== rightPriority) return leftPriority - rightPriority; const leftDedicated = isScaleAdjustDedicatedDetailModel(left); diff --git a/lib/canvas/generate-image.ts b/lib/canvas/generate-image.ts index 9d284e099..7dfbe27f7 100644 --- a/lib/canvas/generate-image.ts +++ b/lib/canvas/generate-image.ts @@ -1613,6 +1613,21 @@ function getCanvasScaleAdjustProviderFailoverPriority(providerType: string) { } } +function getCanvasScaleAdjustHealthPenalty( + healthStatus: string | null | undefined +) { + if (healthStatus === "degraded") return 25; + if (healthStatus === "auto_disabled") return 200; + return 0; +} + +function getCanvasScaleAdjustFailoverPriority(item: CanvasModelWithProvider) { + return ( + getCanvasScaleAdjustProviderFailoverPriority(item.provider.type) + + getCanvasScaleAdjustHealthPenalty(item.model.healthStatus) + ); +} + interface CanvasImageGenConfig { maxImages?: number; supports1K?: boolean; @@ -1788,7 +1803,15 @@ function findCanvasFailoverModel(params: { .filter(Boolean); const isUsableFallback = (item: CanvasModelWithProvider) => { - if (!item.model.isEnabled || item.model.isSubModel || item.model.excludeFromFailover) { + const isSameNameScaleAdjustFallback = + params.preferLowCostSameNameProviders && + scoreModelNameSimilarity(params.selectedModel, item) >= + CANVAS_FAILOVER_SAME_NAME_THRESHOLD; + if ( + !item.model.isEnabled || + item.model.isSubModel || + (item.model.excludeFromFailover && !isSameNameScaleAdjustFallback) + ) { return false; } if (!item.model.supportsImageGen) return false; @@ -1832,12 +1855,8 @@ function findCanvasFailoverModel(params: { leftSameName && rightSameName ) { - const leftPriority = getCanvasScaleAdjustProviderFailoverPriority( - left.item.provider.type - ); - const rightPriority = getCanvasScaleAdjustProviderFailoverPriority( - right.item.provider.type - ); + const leftPriority = getCanvasScaleAdjustFailoverPriority(left.item); + const rightPriority = getCanvasScaleAdjustFailoverPriority(right.item); if (leftPriority !== rightPriority) return leftPriority - rightPriority; if (right.nameSimilarity !== left.nameSimilarity) { return right.nameSimilarity - left.nameSimilarity;