From f25cfd3fabd1f381bb1ae048434a39d8293d213e Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 25 Feb 2026 15:58:20 +0800 Subject: [PATCH] fix(realtime-canvas): enforce sketch-preserving i2i defaults --- app/api/realtime/config/route.ts | 23 ++++++++++------------ app/api/realtime/generate/route.ts | 9 +++++---- components/canvas/RealtimeCanvasDialog.tsx | 9 +++++---- 3 files changed, 20 insertions(+), 21 deletions(-) diff --git a/app/api/realtime/config/route.ts b/app/api/realtime/config/route.ts index 3ead00588..148ffa6f6 100644 --- a/app/api/realtime/config/route.ts +++ b/app/api/realtime/config/route.ts @@ -36,9 +36,9 @@ const defaultConfig = { model: { id: "runware:101@1", defaults: { - steps: 4, - cfgScale: 3.5, - strength: 0.85, + steps: 8, + cfgScale: 6, + strength: 0.4, imageSize: "square" as const, }, limits: { @@ -117,21 +117,18 @@ export async function GET() { defaultConfig.model.limits.steps.min, defaultConfig.model.limits.steps.max ); + const legacyScheduleMu = Number(config.defaults?.scheduleMu); + const cfgScaleBase = Number( + config.defaults?.cfgScale ?? + (Number.isFinite(legacyScheduleMu) ? legacyScheduleMu * 2.5 : defaultConfig.model.defaults.cfgScale) + ); const cfgScale = clamp( - Number( - config.defaults?.cfgScale ?? - config.defaults?.scheduleMu ?? - defaultConfig.model.defaults.cfgScale - ), + cfgScaleBase, defaultConfig.model.limits.cfgScale.min, defaultConfig.model.limits.cfgScale.max ); const strength = clamp( - Number( - config.defaults?.strength ?? - config.defaults?.feedback ?? - defaultConfig.model.defaults.strength - ), + Number(config.defaults?.strength ?? defaultConfig.model.defaults.strength), defaultConfig.model.limits.strength.min, defaultConfig.model.limits.strength.max ); diff --git a/app/api/realtime/generate/route.ts b/app/api/realtime/generate/route.ts index 09cfbc5ca..1bbe087a4 100644 --- a/app/api/realtime/generate/route.ts +++ b/app/api/realtime/generate/route.ts @@ -115,23 +115,24 @@ export async function POST(request: Request) { const maxInputResolution = clamp(Number(config.maxInputResolution || 1024), 512, 1536); const size = resolveSquareSize(body.imageSize, maxInputResolution); const steps = clamp( - Number(body.steps || config.defaults?.steps || 4), + Number(body.steps || config.defaults?.steps || 8), 1, 8 ); const cfgScale = clamp( - Number(body.cfgScale || config.defaults?.cfgScale || 3.5), + Number(body.cfgScale || config.defaults?.cfgScale || 6), 1, 12 ); const strength = clamp( - Number(body.strength || config.defaults?.strength || 0.85), + Number(body.strength || config.defaults?.strength || 0.4), 0.05, 1 ); const positivePrompt = - String(body.prompt || "").trim() || "将草图渲染为高质感产品设计图,保持结构和主轮廓一致。"; + String(body.prompt || "").trim() || + "严格按照输入草图生成:保持主体轮廓、位置、比例和数量一致,只做材质与光影细化;禁止改变构图,禁止新增无关背景纹理。"; const requestInference = async (modelId: string) => { const taskUUID = crypto.randomUUID(); diff --git a/components/canvas/RealtimeCanvasDialog.tsx b/components/canvas/RealtimeCanvasDialog.tsx index 300d32af9..3a064a408 100644 --- a/components/canvas/RealtimeCanvasDialog.tsx +++ b/components/canvas/RealtimeCanvasDialog.tsx @@ -67,7 +67,8 @@ type RealtimeCanvasDialogProps = { onApplyResult: (payload: { imageUrl: string; prompt: string }) => void; }; -const FALLBACK_PROMPT = "将草图渲染为高质感产品设计图,保持结构和主轮廓一致。"; +const FALLBACK_PROMPT = + "严格按照输入草图生成:保持主体轮廓、位置、比例和数量一致,只做材质与光影细化;禁止改变构图,禁止新增无关背景纹理。"; const CANVAS_BACKGROUND = "#ffffff"; const BRUSH_COLOR_PRESETS = [ "#18181b", @@ -91,9 +92,9 @@ const defaultRealtimeConfig: RealtimeConfig = { model: { id: "runware:101@1", defaults: { - steps: 4, - cfgScale: 3.5, - strength: 0.85, + steps: 8, + cfgScale: 6, + strength: 0.4, imageSize: "square", }, },