diff --git a/app/(chat)/api/chat/_lib/detail-replacement.ts b/app/(chat)/api/chat/_lib/detail-replacement.ts index 958e9f5ae..660407778 100644 --- a/app/(chat)/api/chat/_lib/detail-replacement.ts +++ b/app/(chat)/api/chat/_lib/detail-replacement.ts @@ -305,6 +305,10 @@ export type NormalizedAgentModeSourceImage = { assetId: string | null; }; +export function isMarketplaceProductDetailReferenceId(value: unknown) { + return /^product-id-(taobao|1688|douyin|jd)-/i.test(String(value || "").trim()); +} + export type ReplacementReferenceDecision = { shouldReplace: boolean; containsFurnitureProduct: boolean; @@ -1771,6 +1775,7 @@ export function buildAgentReplacementPrompt(params: { basePrompt: string; modeType: "detail_replacement" | "sku_replacement"; replacementStrategy?: AgentDetailReplacementStrategy; + marketplaceProductDetailReference?: boolean; referenceLabel: string; referenceIndex: number; totalReferences: number; @@ -1823,6 +1828,14 @@ export function buildAgentReplacementPrompt(params: { imageOrderLines.push( `图片${nextImageIndex}:当前参考图底板(唯一版式基准图),必须保留它的文字排版、信息区、分割线、留白、机位和整体结构。` ); + const marketplaceBrandRemovalLines = + params.modeType === "detail_replacement" && params.marketplaceProductDetailReference + ? [ + "【市场ID参考图去品牌规则】当前参考图来自外部市场商品详情,原图里可能包含第三方品牌名、Logo、店铺名、商标、水印、角标、平台标识或商家专属视觉符号;这些都属于污染层,最终结果必须去掉。", + "去品牌时只清理品牌/Logo/水印本身:保留原来的版式位置、留白、文字层级和信息结构,可把对应区域处理成干净留白、中性图形、无品牌装饰或与当前页面风格一致的空白占位;不要照抄或变体复刻原商标。", + "如果参考图标题、标签或画面中出现可识别的外部品牌字样,不要保留该品牌名,不要换成相似字,不要生成伪 Logo;需要文字时只保留非品牌卖点语义或改成无品牌通用描述。", + ] + : []; const scenePlanLines = params.scenePlan ? [ @@ -1895,6 +1908,7 @@ export function buildAgentReplacementPrompt(params: { "【图片顺序规则】", ...imageOrderLines, ...scenePlanLines, + ...marketplaceBrandRemovalLines, "你现在做的是‘仅替换产品’,不是重建场景,也不是重新设计整张详情图。", "忽略用户补充提示词里的场景风格、氛围、空间改造要求;这一次只服务于产品主体替换。", "最后一张参考图是唯一底板,除产品主体/产品展示区外,其余所有内容都必须保持不变。", @@ -1921,6 +1935,7 @@ export function buildAgentReplacementPrompt(params: { "【图片顺序规则】", ...imageOrderLines, ...scenePlanLines, + ...marketplaceBrandRemovalLines, "你现在做的是“详情参考图背景/场景图替换”,不是重新设计整张详情图。", "【版式锁层规则】把最后一张参考图当成 PSD 模板:文字、标题、编号、卖点标签、按钮、图标、白底/浅色底、留白、分割线、圆角图片框、图片框裁切边界都属于锁定版式层,不允许移动、缩放、重排或重新设计。", "如果参考图是“上方文字/标签白底区 + 下方图片/场景圆角框”的结构,必须原样保留标题区高度、文字换行、文字字号、文字左上角位置、标签位置、图片框起始高度、圆角、左右边距和上下留白;禁止把新场景铺到标题白底区背后。", diff --git a/app/(chat)/api/chat/route.ts b/app/(chat)/api/chat/route.ts index 68e97de60..278a9eab4 100644 --- a/app/(chat)/api/chat/route.ts +++ b/app/(chat)/api/chat/route.ts @@ -279,6 +279,7 @@ import { import { analyzeReplacementExecutionPlan, buildAgentReplacementPrompt, + isMarketplaceProductDetailReferenceId, normalizeAgentModeDetailReplacementStrategy, normalizeAgentModeReferences, normalizeAgentModeSourceImages, @@ -3465,6 +3466,9 @@ export async function POST(request: Request) { basePrompt: baseReplacementPrompt, modeType: "detail_replacement", replacementStrategy: detailReplacementStrategy, + marketplaceProductDetailReference: + isMarketplaceProductDetailReferenceId(reference.id) || + isMarketplaceProductDetailReferenceId(reference.candidateId), referenceLabel: reference.label, referenceIndex, totalReferences: replacementReferences.length, @@ -4247,6 +4251,10 @@ export async function POST(request: Request) { : "sku_replacement", replacementStrategy: isDetailReplacementPreset ? detailReplacementStrategy : undefined, + marketplaceProductDetailReference: + isDetailReplacementPreset && + (isMarketplaceProductDetailReferenceId(reference.id) || + isMarketplaceProductDetailReferenceId(reference.candidateId)), referenceLabel: reference.label, referenceIndex, totalReferences: replacementReferences.length,