fix: avoid rejecting final scale adjust candidate

This commit is contained in:
134 2026-06-29 11:24:27 +08:00
parent be0b398e5c
commit 8ded477edd
2 changed files with 28 additions and 2 deletions

View File

@ -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,

View File

@ -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