From 8ded477edd11dc3d7eda3b906dc2ca9caa64a5f8 Mon Sep 17 00:00:00 2001 From: 134 Date: Mon, 29 Jun 2026 11:24:27 +0800 Subject: [PATCH] fix: avoid rejecting final scale adjust candidate --- app/api/canvas/local-edit/route.ts | 9 ++++++++- lib/canvas/generate-image.ts | 21 ++++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/app/api/canvas/local-edit/route.ts b/app/api/canvas/local-edit/route.ts index 8d223cfe5..94ffb1bd0 100644 --- a/app/api/canvas/local-edit/route.ts +++ b/app/api/canvas/local-edit/route.ts @@ -1476,6 +1476,13 @@ export async function POST(request: NextRequest) { : {}), } : undefined; + const scaleAdjustFinalRetryVerificationConfig = + scaleAdjustVerificationConfig && useFalScaleAdjustMockup + ? { + ...scaleAdjustVerificationConfig, + allowOutsideChangedWhenChangedInside: true, + } + : scaleAdjustVerificationConfig; const imageRequest: CanvasGenerateImageRequest = { aspectRatio: resolvedAspectRatio, @@ -1576,7 +1583,7 @@ export async function POST(request: NextRequest) { prompt: falScaleAdjustGuideOnlyPrompt, promptExtend: false, referenceImages: [annotatedUpload.url], - scaleAdjustVerification: scaleAdjustVerificationConfig, + scaleAdjustVerification: scaleAdjustFinalRetryVerificationConfig, }, ] : undefined, diff --git a/lib/canvas/generate-image.ts b/lib/canvas/generate-image.ts index 35280cb27..0cdb58fbf 100644 --- a/lib/canvas/generate-image.ts +++ b/lib/canvas/generate-image.ts @@ -52,6 +52,7 @@ export interface CanvasLocalEditCompositeConfig { } export interface CanvasScaleAdjustVerificationConfig { + allowOutsideChangedWhenChangedInside?: boolean; protectedRegions?: CanvasLocalEditCompositeRegion[]; rejectFailedCandidates?: boolean; sourceImageUrl: string; @@ -388,6 +389,8 @@ function normalizeScaleAdjustVerificationConfig( ? { sourceImageUrl, regions, + allowOutsideChangedWhenChangedInside: + value.allowOutsideChangedWhenChangedInside === true, rejectFailedCandidates: value.rejectFailedCandidates === true, ...(targetRegions.length > 0 ? { targetRegions } : {}), ...(typeof scalePercent === "number" ? { scalePercent } : {}), @@ -1161,9 +1164,25 @@ async function applyScaleAdjustVerificationToImages(params: { score: Number(scoreEvaluation(selected).toFixed(2)), }); + const outsideChangeAccepted = + verification.allowOutsideChangedWhenChangedInside && + selected.changedInside && + selected.outsideChanged; + if (outsideChangeAccepted) { + console.warn("[Canvas Generate Image] Scale adjust accepting best AI candidate despite outside-frame diff:", { + debugLabel, + imageIndex: selected.index, + outsidePixelStats: { + changedRatio: Number(selected.outsidePixelStats.changedRatio.toFixed(4)), + meanDiff: Number(selected.outsidePixelStats.meanDiff.toFixed(2)), + }, + regionDiffScores: selected.diffScores.map((score) => Number(score.toFixed(2))), + }); + } + if ( verification.rejectFailedCandidates && - (!selected.changedInside || selected.outsideChanged) + (!selected.changedInside || (selected.outsideChanged && !outsideChangeAccepted)) ) { throw new ScaleAdjustOutputRejectedError({ reason: selected.outsideChanged