From 37e2b667258ab3458c2b64874e8ff14a741df591 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 4 Jun 2026 11:29:00 +0800 Subject: [PATCH] fix: force scene prompt rebuild for detail references --- .../api/chat/_lib/detail-replacement.ts | 106 ++++++++++++------ 1 file changed, 69 insertions(+), 37 deletions(-) diff --git a/app/(chat)/api/chat/_lib/detail-replacement.ts b/app/(chat)/api/chat/_lib/detail-replacement.ts index b8939af5b..25ebed7c7 100644 --- a/app/(chat)/api/chat/_lib/detail-replacement.ts +++ b/app/(chat)/api/chat/_lib/detail-replacement.ts @@ -419,6 +419,8 @@ const DETAIL_STRONG_COPY_HINT_PATTERN = /白底|浅色底|产品说明|参数|规格|尺寸|卖点|标签|说明图|信息图|海报|版式|排版|文字|标题|编号|标注|材质标注|工艺标注|代名词|典雅|高贵/i; const DETAIL_REFERENCE_POSTER_ACTION_HINT_PATTERN = /动作海报|测试海报|测试图|来张自拍|自拍|合照|多人围坐|围坐|聚餐|多人聚餐|横向受力|受力测试|单侧承重|承重测试|重心|依旧平稳|依然稳固|试坐|坐在桌|坐桌|坐上桌/i; +const DETAIL_REFERENCE_STABILITY_TEST_ACTION_HINT_PATTERN = + /横向受力|受力测试|单侧承重|承重测试|重心|依旧平稳|依然稳固|试坐|坐在桌|坐桌|坐上桌/i; const DETAIL_PEOPLE_ACTION_HINT_PATTERN = /自拍|合照|拍照|拿手机|手机自拍|聚会|聚餐|围坐|好友|朋友|闺蜜|夫妻|情侣|家庭|亲子|陪伴|举杯|互动|模特|人物|人像|多人|人群|男士|女士|男人|女人|男生|女生|小孩|儿童|宝宝|顾客|吃饭的人|用餐的人|正在吃饭|坐在|坐着|站在|走动|行走|手持|试坐|倚靠|承重|受力|受力测试|重心|测试|稳定|稳固|使用产品|产品使用|体验/i; @@ -1064,21 +1066,21 @@ function applyDetailReplacementScenePlanGuards( "参考图是带明确人物动作的详情海报,必须按参考图人数、动作、姿态和版式生成类似图。", routeReason: appendUniqueInstruction( next.routeReason, - "命中多人围坐/承重测试等参考动作海报,参考动作和版式优先,但前置场景词包必须软生效以避免原图复刻。", + "命中参考动作海报,参考图中的具体动作和版式优先,但前置场景词包必须完整重建原照片内容区以避免原图复刻。", 240, ), sceneSummary: appendUniqueInstruction( next.sceneSummary, - "按参考图做同版式类似图:保留人物数量、围坐/试坐/承重动作、产品形状、机位和图文关系,同时按前置词包重建图片框内背景、空间、软装和灯光。", + "按参考图做同版式类似图:保留参考图原有的人物数量、具体动作、产品形状、机位和图文关系,同时按前置词包重建原照片内容区里的背景、空间、软装和灯光;不要画新增边框。", 320, ), generationPrompt: appendUniqueInstruction( next.generationPrompt, - "本屏是参考动作海报,前置场景词包必须软生效:标题/标签中的“多人围坐、聚餐、横向受力测试、单侧承重、重心平稳”等语义是硬约束。必须根据参考图做一张同版式、同动作、同人物关系的类似详情图:多人就保持多人围坐,承重就保持人物坐在产品上的受力姿态;产品主体的形状、外轮廓、长宽比例、桌面圆角、腿部结构和透视角度必须跟参考图一致;同时要按前置词包明显重建图片框内旧背景、空间、软装、灯光和产品场景,不能只复刻原图。禁止生成走动路人、无人空场景或改成另一种产品形状。", + "本屏是参考动作海报,前置场景词包必须完整重建原照片内容区:参考图标题/标签/画面里的具体动作语义是硬约束。必须根据参考图做一张同版式、同动作、同人物关系的类似详情图:参考图是多人互动就保持多人互动,参考图是测试展示就保持对应测试姿态;产品主体的形状、外轮廓、长宽比例、桌面圆角、腿部结构和透视角度必须跟参考图一致;同时要按前置词包明显重建原照片内容区里的旧背景、空间、软装、灯光和产品场景,不能只复刻原图;不要绘制新增白色边框、线框或卡片描边。禁止生成走动路人、无人空场景或改成另一种产品形状。", ), avoidSummary: appendUniqueInstruction( next.avoidSummary, - "不要让前置词包覆盖参考动作,不要把多人改成单人或无人,不要把坐姿/承重动作改成走动人物,不要改变产品形状;也不要只原图复刻或轻微修饰。", + "不要让前置词包覆盖参考动作,不要改变参考图原有人数、动作和产品形状;也不要只原图复刻、轻微修饰或画出新增边框。", 340, ), whiteBackgroundLikely: next.whiteBackgroundLikely || visualProfileSuggestsLightBase, @@ -1613,7 +1615,7 @@ export function buildHeuristicReplacementScenePlan(params: { ? shouldProtectFallbackWhiteLayout ? "兜底命中产品尺寸说明页,按白底抠图和尺寸标注执行,不使用词包。" : shouldProtectFallbackReferencePosterAction - ? "兜底命中参考动作海报,保留人物动作和产品形状,同时软吃词包重建背景和产品场景。" + ? "兜底命中参考动作海报,保留人物动作和产品形状,同时使用词包完整重建背景和产品场景。" : fallbackHasPeopleAction ? "兜底命中人物/动作/使用场景,按人物关系锁定并允许词包重建背景和产品场景。" : shouldProtectFallbackLayout @@ -1662,7 +1664,7 @@ export function buildHeuristicReplacementScenePlan(params: { : shouldProtectFallbackWhiteLayout ? "白底产品尺寸说明图,只允许产品抠图和尺寸标注,不引入室内场景。" : shouldProtectFallbackReferencePosterAction - ? "参考图动作海报语义优先,做同动作同版式类似图,前置词包只用于改造图片框内背景、空间、软装和灯光。" + ? "参考图动作海报语义优先,做同动作同版式类似图,前置词包必须完整重建原照片内容区里的背景、空间、软装和灯光。" : fallbackHasPeopleAction ? "人物动作和关系保真,背景、产品场景、软装和灯光按前置词包明显重建。" : shouldProtectFallbackLayout @@ -1675,7 +1677,7 @@ export function buildHeuristicReplacementScenePlan(params: { : shouldProtectFallbackWhiteLayout ? "不要生成厨房、餐椅、柜体、灯具、花瓶、人物或软装背景,不要改变产品形状,不要丢尺寸线和单位。" : shouldProtectFallbackReferencePosterAction - ? "不要把多人改成单人或无人,不要把坐姿/承重动作改成走动人物,不要套用厨房/餐厨词包,不要改产品形状。" + ? "不要把多人改成单人或无人,不要把坐姿/承重动作改成走动人物,不要改产品形状,不要原样保留参考图旧场景。" : fallbackHasPeopleAction ? "不要生成白底单品图,不要删掉人物,不要把多人压成单人,不要只小幅复刻原图,也不要破坏文字版式。" : shouldProtectFallbackLayout @@ -1689,7 +1691,7 @@ export function buildHeuristicReplacementScenePlan(params: { : isDetailReplacement && shouldProtectFallbackWhiteLayout ? `当前参考图按产品尺寸说明页处理:不使用前置词包;必须把产品主体抠出放在白底/米白底上,保留标题“产品尺寸”、单位 cm、尺寸箭头/尺寸线/数字标注和原版式位置;禁止生成室内场景、人物、椅子、柜体、灯具、花瓶或软装背景;产品形状、桌面比例、腿部结构、圆角和透视必须跟参考图一致。${params.reason}` : isDetailReplacement && shouldProtectFallbackReferencePosterAction - ? `当前参考图按动作海报处理:必须软吃前置词包;根据参考图做同版式类似图,保留标题标签、人物数量、多人围坐/试坐/单侧承重/受力测试等动作、产品外轮廓、长宽比例、桌面圆角、腿部结构、透视角度和机位;同时按前置词包明显重建图片框内旧背景、空间、软装、灯光和产品场景,禁止走动人物、无人空场景、原图复刻或另一种产品形状。${params.reason}` + ? `当前参考图按动作海报处理:必须使用前置词包完整重建原照片内容区;根据参考图做同版式类似图,保留标题标签、人物数量、多人围坐/试坐/单侧承重/受力测试等动作、产品外轮廓、长宽比例、桌面圆角、腿部结构、透视角度和机位;同时按前置词包明显重建旧背景、空间、软装、灯光和产品场景,禁止走动人物、无人空场景、原图复刻或另一种产品形状。${params.reason}` : isDetailReplacement && fallbackHasPeopleAction ? `当前参考图按人物/动作详情页处理:必须保留参考图中的人物数量、动作、朝向、互动关系和出镜比例,同时使用前置工作流词包明显重建图片框内旧背景、产品、空间、软装和灯光;禁止生成白底单品图或无人物空场景,保留文字区、版式骨架、机位和信息层级。${params.reason}` : isDetailReplacement && shouldProtectFallbackLayout @@ -2190,7 +2192,7 @@ export async function analyzeReplacementExecutionPlan(params: { ? `像素初筛:nearWhite=${referenceVisualProfile.nearWhitePixelRatio.toFixed(2)}, lightLowSaturation=${referenceVisualProfile.lightLowSaturationPixelRatio.toFixed(2)}, topLight=${referenceVisualProfile.topLightLowSaturationPixelRatio.toFixed(2)}, borderLight=${referenceVisualProfile.borderLightLowSaturationPixelRatio.toFixed(2)}, dark=${referenceVisualProfile.darkPixelRatio.toFixed(2)}, likelyWhiteLayout=${referenceVisualProfile.likelyWhiteLayout ? "true" : "false"}, likelyWhiteScene=${referenceVisualProfile.likelyWhiteScene ? "true" : "false"}。${referenceVisualProfile.reason}` : "", referenceVisualProfile?.likelyWhiteLayout - ? "像素初筛已经命中白底/浅色说明页候选:请继续读取画面文字和图像语义。若存在标题、标签、参数、尺寸、卖点、图标、白底图片区、圆角图片区或明显留白排版,generationRoute 必须是 layout_preserve_replace 或 copy_locked_regenerate,promptPackPolicy 必须 forbid;但如果这是多人围坐、聚餐、试坐、承重、受力测试等人物动作海报,generationRoute 必须是 people_relation_locked,promptPackPolicy 必须 soft:参考图锁动作和版式,前置词包软改造图片框内背景、空间、软装和灯光。" + ? "像素初筛已经命中白底/浅色说明页候选:请继续读取画面文字和图像语义。若存在标题、标签、参数、尺寸、卖点、图标、白底图片区、圆角图片区或明显留白排版,generationRoute 必须是 layout_preserve_replace 或 copy_locked_regenerate,promptPackPolicy 必须 forbid;但如果这是多人围坐、聚餐、试坐、承重、受力测试等人物动作海报,generationRoute 必须是 people_relation_locked,promptPackPolicy 必须 soft:这里 soft 表示参考图锁动作和版式,但前置词包仍必须完整重建原照片内容区里的背景、空间、软装和灯光。" : "", !referenceVisualProfile?.likelyWhiteLayout && referenceVisualProfile?.likelyWhiteScene ? "像素初筛已经命中白/浅色低饱和真实场景:这不是白底说明页。若画面存在真实空间、人物或产品照片,promptPackPolicy 应为 soft 或 allow,必须使用前置工作流词包重建图片框内产品、空间、软装和灯光,使差异清晰可见;但最终仍保持白/浅色低饱和基调,不要改造成深色厨房、黑墙、复杂吊灯或强软装。" @@ -2215,7 +2217,7 @@ export async function analyzeReplacementExecutionPlan(params: { ? "这张参考图可能是场景图、白底说明图、强文案图、人物关系图或纯版式图。你必须先判断它适合哪一种执行路由,再决定是否允许前置工作流词包参与。文字、标题、卖点标签、UI图标、按钮、分割线、品牌标识、留白和排版必须保留。" : "这张参考图不是要求原样保留的场景照片。原图里的沙发、床、柜体、墙面、地面、窗帘、灯具、摆件、桌面道具、背景家具和环境光氛围,都可以在后续生图阶段按前置工作流风格重建。", isDetailReplacement - ? "重要分流例子:如果标题/标签或画面写着“多人围坐、聚餐、横向受力测试、单侧承重、重心依旧平稳、桌体依然稳固”等动作海报语义,这不是纯锁版式页;必须 people_relation_locked + promptPackPolicy=soft。参考图决定人物数量、围坐/试坐/承重动作、产品受力关系和版式,前置词包必须参与重建图片框内背景、空间、软装、灯光和产品场景,避免原图复刻。" + ? "重要分流例子:如果标题/标签或画面写着“多人围坐、聚餐、横向受力测试、单侧承重、重心依旧平稳、桌体依然稳固”等动作海报语义,这不是纯锁版式页;必须 people_relation_locked + promptPackPolicy=soft。参考图决定人物数量、围坐/试坐/承重动作、产品受力关系和版式,前置词包必须完整重建原照片内容区里的背景、空间、软装、灯光和产品场景,避免原图复刻。" : "", isDetailReplacement ? "重要分流例子:如果标题或标注写着“产品尺寸、尺寸、单位 cm、160/180/210、90、75、尺寸线、尺寸箭头”等产品尺寸说明语义,必须 layout_preserve_replace + promptPackPolicy=forbid;后续应生成白底/米白底产品抠图和尺寸标注,不允许生成室内场景、椅子、人物、柜体、灯具或软装背景。" @@ -2228,16 +2230,16 @@ export async function analyzeReplacementExecutionPlan(params: { : "1. 判断 shouldReplace:当前参考图里是否存在清晰、主要、适合被替换的家具商品主体。", "2. 判断 useModelImage,并说明原因。", isDetailReplacement - ? "2a. 先输出 pageKind,这是后续策略的核心分类:prompt_pack_scene=普通可吃词包空间/场景页;white_scene=白/浅色真实场景且可软吃词包;white_layout=白底说明/纯排版/卖点参数页;copy_locked=文案和图强绑定页;people_scene=普通人物/模特真实场景,可保留人物并软吃词包;action_poster=文字或画面明确要求多人围坐、自拍、聚餐、试坐、承重、受力测试等动作的海报页,参考图动作优先;dimension_spec=产品尺寸/单位/尺寸线/标注页;material_detail=材质/板材/原材料说明页。" + ? "2a. 先输出 pageKind,这是后续策略的核心分类:prompt_pack_scene=普通可吃词包空间/场景页;white_scene=白/浅色真实场景且可吃词包;white_layout=白底说明/纯排版/卖点参数页;copy_locked=文案和图强绑定页;people_scene=普通人物/模特真实场景,可保留人物并吃词包;action_poster=文字或画面明确要求多人围坐、自拍、聚餐、试坐、承重、受力测试等动作的海报页,参考图动作优先但场景图仍要按词包重建;dimension_spec=产品尺寸/单位/尺寸线/标注页;material_detail=材质/板材/原材料说明页。" : "", isDetailReplacement ? "3. 判断 generationRoute:prompt_pack_scene=通用场景图且可吃词包;layout_preserve_replace=锁定版式/白底/产品说明/材质说明,只做有限替换;copy_locked_regenerate=文案与画面强绑定,必须锁文案;people_relation_locked=多人/模特/互动关系图,必须锁人物关系。详情替换不允许 direct_passthrough。" : "3. 提炼 sceneSummary、cameraSummary、placementSummary、preserveSummary、styleSummary、avoidSummary。", isDetailReplacement - ? "4. 判断 promptPackPolicy:纯白底参数/说明/卖点页、产品尺寸页、强图文绑定页必须 forbid;标题/标签已经明确多人围坐、聚餐、试坐、单侧承重、横向受力测试等动作的详情海报页必须 soft,参考图锁动作和版式,前置词包改造背景/产品场景;通用空间场景必须 allow;普通真实人物生活场景可以 people_relation_locked + allow/soft。" + ? "4. 判断 promptPackPolicy:纯白底参数/说明/卖点页、产品尺寸页、强图文绑定页必须 forbid;标题/标签已经明确多人围坐、聚餐、试坐、单侧承重、横向受力测试等动作的详情海报页必须 soft,soft 表示参考图锁动作和版式但前置词包仍完整重建背景/产品场景;通用空间场景必须 allow;普通真实人物生活场景可以 people_relation_locked + allow/soft。" : "", isDetailReplacement - ? "4a. 白底/白场景分流规则:白底参数、规格、卖点、产品尺寸、强文案、图标说明、纯版式页必须 forbid;动作测试/多人围坐/聚餐/承重海报必须 soft;白/浅色真实场景页在没有强版式绑定时使用 soft/allow 词包重造图片框内产品、空间、软装和灯光。" + ? "4a. 白底/白场景分流规则:白底参数、规格、卖点、产品尺寸、强文案、图标说明、纯版式页必须 forbid;动作测试/多人围坐/聚餐/承重海报必须 soft 且场景图必须按词包完整重建;白/浅色真实场景页在没有强版式绑定时使用 soft/allow 词包重造图片框内产品、空间、软装和灯光。" : "", isDetailReplacement ? "5. 判断 textPolicy:画面中存在营销标题、卖点、编号、参数、标签且与图匹配时必须 lock 或 preserve,避免后续生图改字、混色或重排。" @@ -2251,7 +2253,7 @@ export async function analyzeReplacementExecutionPlan(params: { isProductOnlyDetailReplacement ? "4. 输出 generationPrompt:这是一段给后续生图模型的本屏生成指令,要求只替换产品主体,保留其余背景、文案、排版、装饰和光影完全不变。" : isDetailReplacement - ? "8. 输出 generationPrompt:这是一段给后续生图模型的本屏生成指令。若 promptPackPolicy=forbid,必须明确“不使用前置词包,参考图语义优先”;若是动作海报,必须写清人物数量、围坐/试坐/承重等动作、产品形状和版式必须照参考图,同时写清“前置词包软生效,必须重建图片框内背景/空间/软装/灯光/产品场景,不能原图复刻”;若是产品尺寸页,必须写清白底抠图、尺寸线、单位和数字标注,不允许室内场景;若 promptPackPolicy=allow/soft 且 peoplePolicy=preserve_relation,明确“保留人物数量/动作/关系与文字层级,同时使用前置词包重建背景/产品场景”。" + ? "8. 输出 generationPrompt:这是一段给后续生图模型的本屏生成指令。若 promptPackPolicy=forbid,必须明确“不使用前置词包,参考图语义优先”;若是动作海报,必须写清人物数量、围坐/试坐/承重等动作、产品形状和版式必须照参考图,同时写清“前置词包必须完整重建原照片内容区里的背景/空间/软装/灯光/产品场景,不能原图复刻”;若是产品尺寸页,必须写清白底抠图、尺寸线、单位和数字标注,不允许室内场景;若 promptPackPolicy=allow/soft 且 peoplePolicy=preserve_relation,明确“保留人物数量/动作/关系与文字层级,同时使用前置词包重建背景/产品场景”。" : "4. 输出 generationPrompt:这是一段给后续生图模型的本屏生成指令,描述这一屏需要的场景、机位、主体位置、周边环境重建方向以及必须保留的内容。", isProductOnlyDetailReplacement ? "5. sceneSummary、styleSummary 和 generationPrompt 必须强调‘只替换产品,不动其他内容’,不要引导重建场景。" @@ -2443,6 +2445,9 @@ export function buildAgentReplacementPrompt(params: { params.modeType === "detail_replacement" && (params.scenePlan?.pageKind === "action_poster" || DETAIL_REFERENCE_POSTER_ACTION_HINT_PATTERN.test(detailScenePlanText)); + const isReferenceStabilityTestActionPlan = + isReferencePosterActionPlan && + DETAIL_REFERENCE_STABILITY_TEST_ACTION_HINT_PATTERN.test(detailScenePlanText); if (params.productImageCount > 0) { const productRangeLabel = @@ -2492,10 +2497,15 @@ export function buildAgentReplacementPrompt(params: { ? [ "【必须生效的前置场景词包】", normalizedBasePrompt, - isReferencePosterActionPlan - ? "执行优先级:前置场景词包必须改造图片框内旧背景、空间、软装、灯光、墙面、地面、摆件和产品场景;参考图只锁人物数量、围坐/试坐/承重动作、产品受力关系、版式、机位、文案层和图片框边界,不锁旧背景物件。" - : "执行优先级:前置场景词包必须改造图片框内旧背景、空间、软装、灯光、墙面、地面、摆件和产品场景;参考图只锁版式、机位、文字层、主体位置和图片框边界,不锁旧背景物件。", - "如果最终图仍大量保留参考图原背景物件、原空间陈设或只做轻微修饰,判定为失败;必须能明显看出已按前置场景词包重建。", + isReferenceStabilityTestActionPlan + ? "执行优先级:本屏是受力/承重测试海报,参考图锁人物排列、试坐/承重动作、产品受力关系、产品外形、版式、机位和文案层;只要原图包含照片/场景区域,前置场景词包就必须完整重建该区域里的旧背景、空间、软装、灯光、墙面、地面、摆件和产品场景,不能只轻微改色或复刻原图。" + : isReferencePosterActionPlan + ? "执行优先级:前置场景词包必须改造原照片内容区里的旧背景、空间、软装、灯光、墙面、地面、摆件和产品场景;参考图只锁人物数量、围坐/聚餐/互动动作、产品使用关系、版式、机位、文案层和原照片区域,不锁旧背景物件。" + : "执行优先级:前置场景词包必须改造原照片内容区里的旧背景、空间、软装、灯光、墙面、地面、摆件和产品场景;参考图只锁版式、机位、文字层、主体位置和原照片区域,不锁旧背景物件。", + "不要把“原照片区域/圆角区域/裁切边界”画成可见白色矩形、线框、描边或新的卡片边框;这些只是版式范围,不是要生成的视觉元素。", + isReferenceStabilityTestActionPlan + ? "如果最终图仍大量保留参考图原背景物件、原空间陈设或只做轻微修饰,判定为失败;如果人物测试动作、产品受力关系或产品形状被破坏,也判定为失败。" + : "如果最终图仍大量保留参考图原背景物件、原空间陈设或只做轻微修饰,判定为失败;必须能明显看出已按前置场景词包重建。", ] : []; @@ -2512,7 +2522,7 @@ export function buildAgentReplacementPrompt(params: { : "", params.scenePlan.whiteBackgroundLikely ? shouldApplyPromptPack - ? "白底/白场景判断:是,本屏按白/浅色真实场景处理;允许词包重造图片框内背景、产品、空间、软装和灯光,但必须保留白/浅色低饱和基调、原版式层和文字层级。" + ? "白底/白场景判断:是,本屏按白/浅色真实场景处理;允许词包重造原照片内容区的背景、产品、空间、软装和灯光,但必须保留白/浅色低饱和基调、原版式层和文字层级;不要画新增边框。" : "白底/白场景判断:是,禁止强行场景化;最终结果必须保持白底、浅色底或干净低饱和场景基调。" : "", params.scenePlan.copyImageCoupled @@ -2558,7 +2568,9 @@ export function buildAgentReplacementPrompt(params: { ? "人物动作硬约束:如果当前参考图文字或画面包含自拍、合照、聚会、用餐、拿手机、使用产品、人与人互动等语义,生成结果必须出现对应人物数量、动作、朝向和互动关系;不允许生成无人空场景。" : "", shouldApplyPromptPack - ? "词包生效硬约束:本屏不能只做轻微改色、轻微换物或原图复刻;图片框内旧背景、产品主体、软装、灯光和空间氛围必须有清晰可见的重建痕迹。" + ? isReferenceStabilityTestActionPlan + ? "词包生效硬约束:本屏是受力/承重测试页,但只要参考图存在场景/照片内容区,就必须使用前置词包完整重建该区域里的旧背景、产品主体、软装、灯光、墙地面和空间氛围;不得只轻微改色、局部换物或原图复刻,也不得新增可见边框、白色线框或卡片描边。" + : "词包生效硬约束:本屏不能只做轻微改色、轻微换物或原图复刻;原照片内容区里的旧背景、产品主体、软装、灯光和空间氛围必须有清晰可见的重建痕迹,但不得新增可见边框、白色线框或卡片描边。" : "", params.scenePlan.generationPrompt ? `本屏生成方向:${params.scenePlan.generationPrompt}` @@ -2605,30 +2617,40 @@ export function buildAgentReplacementPrompt(params: { ...scenePlanLines, ...marketplaceBrandRemovalLines, "你现在做的是“详情参考图背景/场景图替换”,不是重新设计整张详情图。", - "【版式锁层规则】把最后一张参考图当成 PSD 模板:文字、标题、编号、卖点标签、按钮、图标、白底/浅色底、留白、分割线、圆角图片框、图片框裁切边界都属于锁定版式层,不允许移动、缩放、重排或重新设计。", + "【版式锁层规则】把最后一张参考图当成 PSD 模板:文字、标题、编号、卖点标签、按钮、图标、白底/浅色底、留白、分割线、原有圆角照片区域和原有裁切范围都属于锁定版式层,不允许移动、缩放、重排或重新设计;不要把这些版式边界画成新的白色线框、描边或卡片。", isReferencePosterActionPlan - ? "【参考动作海报硬约束】本屏必须软吃前置词包,但参考图动作和版式优先。若标题/标签写多人围坐、聚餐、横向受力测试、单侧承重、重心平稳等,人物数量、相对位置、围坐/试坐/承重动作、产品受力关系、产品外轮廓、桌面长宽比例、圆角、腿部结构和透视角度都必须跟参考图一致;同时必须按前置词包明显重建图片框内旧背景、空间、软装、灯光和产品场景,不能只原图复刻。" + ? isReferenceStabilityTestActionPlan + ? "【参考受力测试硬约束】本屏必须吃前置词包完整重建场景图,但参考动作和产品结构优先:人物数量、相对位置、试坐/承重动作、产品受力关系、产品外轮廓、桌面长宽比例、圆角、腿部结构和透视角度必须跟参考图一致;新场景只能在原照片内容区内生成,不能新增白色线框或卡片描边。" + : "【参考动作海报硬约束】本屏必须吃前置词包完整重建场景图,但参考图动作和版式优先。若标题/标签写多人围坐、聚餐等,人物数量、相对位置、围坐/用餐/互动动作、产品使用关系、产品外轮廓、桌面长宽比例、圆角、腿部结构和透视角度都必须跟参考图一致;同时必须按前置词包明显重建原照片内容区里的旧背景、空间、软装、灯光和产品场景,不能只原图复刻。" : "", isDimensionDetailPlan ? "【产品尺寸图硬约束】本屏不使用前置词包;必须是白底/米白底产品抠图尺寸说明页。保留标题“产品尺寸”、单位 cm、尺寸线/箭头/数字标注和原版式位置;产品主体外轮廓、长宽比例、圆角、腿部结构和透视必须跟参考图一致;禁止生成室内场景、椅子、柜体、灯具、花瓶、人物或软装背景。" : "", - "如果参考图是“上方文字/标签白底区 + 下方图片/场景圆角框”的结构,必须原样保留标题区高度、文字换行、文字字号、文字左上角位置、标签位置、图片框起始高度、圆角、左右边距和上下留白;禁止把新场景铺到标题白底区背后。", - "如果参考图里存在嵌入式图片框、产品照片框、人物展示框或圆角大图区域,只能在该原始框内重建背景/产品/人物画面;新画面必须被裁切在原图片框边界内,不能扩大图片框,不能覆盖文字区、标签区或外层白底。", - "版式层优先级高于词包:前置词包只负责图片框内部的空间风格、灯光、软装、背景和产品场景,不授权修改页面排版、文字位置、标签样式、留白比例或视觉层级。", + "如果参考图是“上方文字/标签白底区 + 下方照片/场景圆角区域”的结构,必须原样保留标题区高度、文字换行、文字字号、文字左上角位置、标签位置、原照片区域起始高度、圆角、左右边距和上下留白;禁止把新场景铺到标题白底区背后,也禁止画出额外白框。", + "如果参考图里存在嵌入式照片区域、产品照片区、人物展示区或圆角大图区域,只能在原有照片内容区内重建背景/产品/人物画面;新画面必须遵守原有裁切范围,不能扩大照片区域,不能覆盖文字区、标签区或外层白底,也不能新增可见边框。", + "版式层优先级高于词包:前置词包只负责原照片内容区内部的空间风格、灯光、软装、背景和产品场景,不授权修改页面排版、文字位置、标签样式、留白比例或视觉层级。", shouldApplyPromptPack ? "要把最后一张参考图理解为“页面版式底板 + 背景图/场景图区参考”,不是“旧场景照片必须原样保留”。" : "本屏已自动判定为“参考图语义优先”,不要把最后一张参考图当成可随意重写的场景模板。", shouldApplyPromptPack - ? "前面“工作流设定”里的场景组合、空间风格、硬装方案、软装方案、灯光氛围、人群设定,必须作为当前这一屏的强制场景改造要求生效。" + ? isReferenceStabilityTestActionPlan + ? "前面“工作流设定”里的场景组合、空间风格、硬装方案、软装方案、灯光氛围和材质设定,必须用于完整重建当前受力测试页的照片/场景内容区;但不得覆盖参考图的受力测试语义、人物动作、产品结构和版式层。" + : "前面“工作流设定”里的场景组合、空间风格、硬装方案、软装方案、灯光氛围、人群设定,必须作为当前这一屏的强制场景改造要求生效。" : "本屏不使用前置工作流词包;如果词包里的空间、人群、灯光、风格与参考图冲突,必须忽略词包,以参考图当前图文语义为准。", shouldApplyPromptPack - ? "场景风格必须优先执行前面用户提示词与工作流设定中给出的空间风格、材质、灯光和氛围描述,不要被参考图原有旧场景绑死。" + ? isReferenceStabilityTestActionPlan + ? "受力测试页的场景风格也必须优先执行前面用户提示词与工作流设定,不要被参考图原有旧场景绑死;参考图只锁测试动作、产品形状、版式骨架和机位。" + : "场景风格必须优先执行前面用户提示词与工作流设定中给出的空间风格、材质、灯光和氛围描述,不要被参考图原有旧场景绑死。" : "不要把厨房、灯光、人群、主题风格等前置选择强行套入本屏;本屏只做必要的产品/视觉区替换和自然融合。", shouldApplyPromptPack - ? "执行时要基于这些场景组合要求,重建参考图中的背景图/产品场景图区域,使当前这一屏呈现出与第一步已选风格一致的新背景画面。" + ? isReferenceStabilityTestActionPlan + ? "执行时要基于这些场景组合要求,在原照片内容区内完整重建旧背景、空间、软装、灯光和产品场景,让当前这一屏呈现出与第一步已选风格一致的新场景画面;同时保持人物测试动作、产品受力关系、产品形状和白/浅色版式。" + : "执行时要基于这些场景组合要求,重建参考图中的背景图/产品场景图区域,使当前这一屏呈现出与第一步已选风格一致的新背景画面。" : "执行时必须保持参考图原有画面主题、文案语义、人物关系、构图和版式,只在可替换视觉区做有限替换。", shouldApplyPromptPack - ? "失败判定:如果最终图变成白底单品图、产品参数卡、单独商品抠图、或只是把原参考图小幅修饰,均视为失败;除非本屏已明确判定为白底参数/规格说明页。" + ? isReferenceStabilityTestActionPlan + ? "失败判定:如果最终图仍像参考图原场景、只轻微改色、只换产品、没有按前置词包重建背景/空间/软装/灯光,均视为失败;如果人物试坐/产品承重关系或产品形状被破坏,也视为失败。" + : "失败判定:如果最终图变成白底单品图、产品参数卡、单独商品抠图、或只是把原参考图小幅修饰,均视为失败;除非本屏已明确判定为白底参数/规格说明页。" : "", "允许替换/重建的范围是参考图里的背景图、产品场景图、商品主体图、材质/板材/原材料视觉区和必要的人物展示图区;不允许改动版式层。", "如果前面商品图、模特图与最后一张参考图底板存在冲突,始终以最后一张参考图底板的版式、机位、构图和信息层级为最高优先级。", @@ -2643,7 +2665,9 @@ export function buildAgentReplacementPrompt(params: { ? "本屏包含人物关系:必须保留人物数量、相对位置、互动关系、动作方向和出镜比例;如果参考图文字写了自拍/合照/多人围坐/聚餐/用餐/单侧承重/横向受力测试/拿手机等动作,必须让人物执行该动作,不要把多人图改成单人图、无人图或无关模特图。" : "如果参考图没有明确人物展示需求,不要凭空新增人物主体。", params.scenePlan?.whiteBackgroundLikely && shouldApplyPromptPack - ? "本屏是白/浅色真实场景且词包已启用:必须让图片框内旧背景、产品、软装、灯光和空间发生清晰可见的重建;不能只微调原图或原样复刻,但也不能破坏外层白底/浅色版式和文字区。" + ? isReferenceStabilityTestActionPlan + ? "本屏是白/浅色受力测试页且词包已启用:必须重建原照片内容区里的旧背景、产品、软装、灯光和空间,同时保持外层白/浅色版式、文字区、人物测试动作、产品受力关系和产品形状;不要新增线框或卡片边框。" + : "本屏是白/浅色真实场景且词包已启用:必须让原照片内容区里的旧背景、产品、软装、灯光和空间发生清晰可见的重建;不能只微调原图或原样复刻,但也不能破坏外层白底/浅色版式和文字区;不要新增线框或卡片边框。" : "", params.scenePlan?.whiteBackgroundLikely && !shouldApplyPromptPack ? "本屏疑似白底/白场景/浅色说明图:禁止场景化、生活化或套空间词包,只允许保留白底、浅色底、干净留白、原图片框和原说明图语义并做必要的局部替换;最终不能变成厨房、客厅、黑墙、吊灯或复杂软装场景。" @@ -2653,15 +2677,17 @@ export function buildAgentReplacementPrompt(params: { : "输出必须保持当前参考图页面画布比例。替换背景/商品时只能等比缩放后裁切或延展背景,绝对禁止把商品、人物、文字、图标横向或纵向拉伸变形。", "文字安全区硬约束:所有标题、正文、编号、标签、按钮、品牌字样和图标必须完整落在画布内,左右至少保留 6% 内边距,上下至少保留 4% 内边距;不得贴边、出血、半截显示、跑出画面或被裁切。若参考图原文字靠边,也要在保持层级和相对位置的前提下向内收。", "文字排版硬约束:标题和标签必须保持参考图原来的相对坐标、行数、行距、字号比例和对齐方式;不要把标题从白底区移动到照片区,不要把横排标签移动到角落,不要把两行标题改成三行或压成一行。", - "白底/白场景硬约束:如果最后一张参考图的背景是白底、米白、浅灰、浅木色或大面积干净留白,最终结果也必须是同类白/浅色场景;只能在原照片框或主体区域内替换产品/材质/人物动作,不允许生成深色厨房、客厅、吊灯、黑墙、复杂柜体或强软装背景。", + "白底/白场景硬约束:如果最后一张参考图的背景是白底、米白、浅灰、浅木色或大面积干净留白,最终结果也必须是同类白/浅色场景;只能在原照片内容区或主体区域内替换产品/材质/人物动作,不允许生成深色厨房、客厅、吊灯、黑墙、复杂柜体或强软装背景。", "单页画布硬约束:只生成当前这一张详情页,不允许把两个页面、两个方案或两张场景图上下拼接,不允许出现明显横向分割线、重复画面、瀑布流长图或截图拼接感。", - "图片框硬约束:如果参考图下半部分是人物/产品照片框,人物、产品和新场景只能出现在这个照片框里;照片框之外的标题白底、标签、页边距和装饰必须保持干净,不要被场景纹理、墙面、灯具或人物侵入。", + "照片区域硬约束:如果参考图下半部分是人物/产品照片区域,人物、产品和新场景只能出现在原照片内容区里;照片区域之外的标题白底、标签、页边距和装饰必须保持干净,不要被场景纹理、墙面、灯具或人物侵入,也不要绘制新增边框。", "镜头角度、透视关系、视平线、主体朝向和主体占比必须尽量跟随最后一张参考图,方便无缝替换当前版式,不要擅自改成完全不同的视角。", shouldApplyPromptPack ? "前面的上传图和模特图用于生成新的背景图/产品场景图/材质视觉内容,并按工作流设定替换参考图中的旧背景画面,但不能改变参考图的版式设计。" : "前面的上传图用于必要的产品、材质、板材、原材料或视觉区替换;模特图只在本屏明确需要人物且策略允许时使用,不得覆盖参考图原有语义、版式和图文关系。", shouldApplyPromptPack - ? "可被替换重建的内容包括但不限于:背景照片、产品展示照片、板材、材质、原材料、墙面、地面材质、沙发、床、背景柜、窗帘、灯具、地毯、挂画、摆件、桌面道具、空间色调、环境光氛围。" + ? isReferenceStabilityTestActionPlan + ? "可被替换重建的内容包括:原照片内容区里的背景照片、产品展示照片、板材、材质、原材料、墙面、地面材质、背景柜、层板、灯具、挂画、摆件、桌面道具、空间色调和环境光氛围;但这些新内容不能改变人物受力测试动作、产品外形、产品受力关系和版式层。" + : "可被替换重建的内容包括但不限于:背景照片、产品展示照片、板材、材质、原材料、墙面、地面材质、沙发、床、背景柜、窗帘、灯具、地毯、挂画、摆件、桌面道具、空间色调、环境光氛围。" : "可被替换的内容仅限参考图里明确的产品/材质/板材/原材料/视觉图片区;不要新增不属于参考图语义的空间、人物、道具、主题和文案。", params.productImageCount > 1 ? `前面的 ${params.productImageCount} 张上传参考图可能是产品、多角度细节、材质、板材或原材料参考,请综合理解结构、材质、颜色、比例、纹理、边角、开孔、五金与细节,不可只参考第一张。` @@ -2669,19 +2695,25 @@ export function buildAgentReplacementPrompt(params: { ? "前面的上传参考图可能是产品图、材质图、板材图、原材料图或细节图,请准确理解它的结构、材质、颜色、比例、纹理和细节。" : "本轮没有专门产品/材质输入图,请依据模特图、模板补充图以及最后一张参考图里的材质描述/视觉区做最小必要处理,不允许整屏直出。", shouldApplyPromptPack - ? "请先识别最后一张参考图中需要被替换的背景图/场景图区域,尤其是原始照片框的边界和裁切范围;只在同一版式骨架、同一图片框内生成新的背景画面,不要只做局部抠图式换产品,也不要把场景扩展到整张页面。" + ? "请先识别最后一张参考图中需要被替换的背景图/场景图区域,尤其是原始照片内容区的裁切范围;只在同一版式骨架、同一原照片区域内生成新的背景画面,不要只做局部抠图式换产品,也不要把场景扩展到整张页面或画出新边框。" : "请先识别最后一张参考图中真正允许替换的视觉区;如果只是白底说明、强文案页、多人关系图或图文匹配强的内容,不要强行重建整张场景。", shouldApplyPromptPack - ? "请严格保留最后一张参考图的版式结构、镜头关系、构图、文字排版、UI图标、标签、按钮、留白位置和信息层级;但旧背景图里的家具、背景物件、材质、灯光氛围、软装小物、空间质感需要按第一步工作流设定进行明显重建。" + ? isReferenceStabilityTestActionPlan + ? "请严格保留最后一张参考图的版式结构、镜头关系、构图、文字排版、UI图标、标签、按钮、留白位置、人物测试动作、产品受力关系、产品形状和信息层级;但旧背景图里的家具、背景物件、材质、灯光氛围、软装小物、空间质感必须按第一步工作流设定进行明显重建。" + : "请严格保留最后一张参考图的版式结构、镜头关系、构图、文字排版、UI图标、标签、按钮、留白位置和信息层级;但旧背景图里的家具、背景物件、材质、灯光氛围、软装小物、空间质感需要按第一步工作流设定进行明显重建。" : "请严格保留最后一张参考图的版式结构、镜头关系、构图、文字排版、UI图标、标签、按钮、留白位置、人物关系和信息层级;不要因为前置词包改变这些内容。", shouldApplyPromptPack - ? "如果第一步工作流风格与参考图原场景冲突,必须保留版式骨架和UI层,但放弃原背景图物件本身,以第一步工作流风格为准。" + ? isReferenceStabilityTestActionPlan + ? "如果第一步工作流风格与受力测试参考图原场景冲突,必须保留版式骨架、测试语义、人物动作和产品结构,但放弃原背景图物件本身,以第一步工作流风格重建场景。" + : "如果第一步工作流风格与参考图原场景冲突,必须保留版式骨架和UI层,但放弃原背景图物件本身,以第一步工作流风格为准。" : "如果第一步工作流风格与参考图原场景冲突,必须保留参考图语义与版式,不要放弃原有图文关系。", "前面的上传图用于提供商品主体、材质、板材、原材料、颜色、纹理和细节特征;如有模特图,请只在参考图本身包含人物展示时再参考模特图。", "如果提供了模特图且这一屏确实有人物展示需求,必须尽量复用同一人物身份与体态关系,不要明显换脸、换发型、换体型,服装风格也尽量保持一致;如果参考图是多人但只提供 1 张模特图,保留参考图人数、关系、动作和站位,额外人物按参考图生成相近人群。", "绝对不要忽略最后一张参考图去生成一张无关的新场景图。", shouldApplyPromptPack - ? "如果生成结果仍然保留了参考图原有的大部分背景图物件,只是把产品换掉,则视为执行失败;你必须让背景图/场景图发生清晰可见的变化。" + ? isReferenceStabilityTestActionPlan + ? "如果生成结果仍然保留了参考图原有的大部分背景图物件,只是轻微调色或换产品,则视为执行失败;你必须让场景图按前置词包发生清晰可见的完整重建,同时保持承重动作和产品形状。" + : "如果生成结果仍然保留了参考图原有的大部分背景图物件,只是把产品换掉,则视为执行失败;你必须让背景图/场景图发生清晰可见的变化。" : "如果本屏已禁用词包,生成结果不应追求明显改造背景,而应追求图文匹配、文案稳定、人物关系稳定和局部替换自然。", !shouldApplyPromptPack ? "版式说明页额外约束:不得新增参考图没有的标签、角标、贴纸、说明卡或营销文案;尺寸线、单位、参数和产品图片区要按原图关系保留。"