fix(ai): 平台套图改走商品主图参考 image_edit · 模特上身图锁商品+模特双图

- 平台套图(cover)以前纯文生图,不参考真实商品主图 → 出图与商品对不上;
  现以商品主图为参考图1走 image_edit,锁包装一致性,有模特则参考图2=模特
- 新增 build_platform_cover_prompt_refs;model_url 解析对 cover 模式同样生效
- 补回归测试:cover 传商品主图、model 传商品主图+模特图、无主图回落文生图

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
zyc
2026-06-17 21:58:39 +08:00
co-authored by Claude Opus 4.8
parent 7c6d4477da
commit 0695c36f4c
12 changed files with 455 additions and 126 deletions
+3 -37
View File
@@ -1330,42 +1330,8 @@ nav button svg { width: 14px; height: 14px; color: var(--ink-3); }
.modal-x { margin-left: auto; width: 28px; height: 28px; display: grid; place-items: center; border-radius: 7px; }
.modal-x:hover { background: var(--bg-soft); }
.msg-workbench { display: grid; grid-template-columns: 380px minmax(0, 1fr); gap: 18px; min-height: 640px; }
.msg-panel { background: var(--card); border: 1px solid var(--border); min-width: 0; }
.msg-panel-h { display: flex; justify-content: space-between; align-items: center; padding: 14px 16px; border-bottom: 1px solid var(--border); }
.msg-panel-h .ti { font-weight: 600; }
.msg-filters { display: flex; gap: 6px; padding: 12px; flex-wrap: wrap; }
.msg-filter { border: 1px solid var(--border); background: var(--card); padding: 5px 9px; font-size: 12px; color: var(--ink-2); }
.msg-filter.active { background: var(--orange-tint); border-color: var(--orange-soft); color: var(--orange); font-weight: 600; }
.msg-filter .ct { margin-left: 6px; color: var(--ink-3); font-family: 'JetBrains Mono', monospace; }
.msg-search { display: flex; align-items: center; gap: 8px; margin: 0 12px 12px; border: 1px solid var(--border); background: var(--bg-soft); padding: 8px 10px; color: var(--ink-3); }
.msg-search input { border: 0; background: transparent; flex: 1; }
.msg-list { border-top: 1px solid var(--border); }
.msg-item { width: 100%; display: grid; grid-template-columns: 28px 1fr; gap: 10px; padding: 12px; border-bottom: 1px solid var(--border); text-align: left; background: var(--card); }
.msg-item:hover, .msg-item.active { background: var(--orange-tint); }
.msg-type-ic { width: 28px; height: 28px; border: 1px solid var(--border); background: var(--bg-soft); display: grid; place-items: center; color: var(--orange); }
.msg-item-row, .msg-item-foot { display: flex; align-items: center; gap: 8px; }
.msg-dot { width: 6px; height: 6px; border-radius: 999px; background: var(--orange); }
.msg-item-title { font-weight: 600; flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.msg-time, .msg-priority { color: var(--ink-3); font-family: 'JetBrains Mono', monospace; font-size: 12px; }
.msg-brief { display: block; color: var(--ink-2); font-size: 12px; line-height: 1.5; margin: 4px 0 7px; }
.msg-detail { display: flex; flex-direction: column; }
.msg-detail-body { padding: 20px; flex: 1; }
.msg-detail-top { display: flex; align-items: flex-start; gap: 12px; margin-bottom: 16px; }
.msg-detail-title h2 { font-size: 18px; line-height: 1.35; }
.msg-detail-title .meta { color: var(--ink-3); font-family: 'JetBrains Mono', monospace; font-size: 12px; margin-top: 4px; display: flex; gap: 8px; flex-wrap: wrap; }
.msg-body-text { color: var(--ink-2); line-height: 1.7; margin-bottom: 16px; }
.msg-props { display: grid; grid-template-columns: 90px 1fr; gap: 0; border: 1px solid var(--border); margin-bottom: 16px; }
.msg-props .k, .msg-props .v { padding: 9px 12px; border-bottom: 1px solid var(--border); font-size: 12px; }
.msg-props .k { background: var(--bg-soft); color: var(--ink-3); font-family: 'JetBrains Mono', monospace; }
.msg-timeline { border: 1px solid var(--border); }
.msg-timeline-h { padding: 10px 12px; border-bottom: 1px solid var(--border); font-weight: 600; }
.msg-step { display: grid; grid-template-columns: 70px 1fr; gap: 10px; padding: 8px 12px; border-bottom: 1px solid var(--border); }
.msg-step:last-child { border-bottom: 0; }
.msg-step .t { color: var(--orange); font-family: 'JetBrains Mono', monospace; font-size: 12px; }
.msg-detail-f { display: flex; gap: 8px; align-items: center; padding: 14px 16px; border-top: 1px solid var(--border); background: var(--bg-soft); }
.msg-foot-note { display: flex; justify-content: space-between; margin-top: 12px; color: var(--ink-3); font-family: 'JetBrains Mono', monospace; font-size: 12px; }
.msg-foot-note button { color: var(--orange); }
/* 消息中心样式统一由 messages-page.css(对齐 design 稿)提供;此处旧版 V1 .msg-* 规则
用的是 --ink/--orange/--bg-soft 旧 token,会漏样式(灰底标签、搜索框描边、记录分隔线),已移除。 */
.factory-hero { display: grid; gap: 18px; margin-bottom: 26px; }
.factory-card { background: var(--card); border: 1px solid var(--border); position: relative; padding: 24px; }
@@ -1429,7 +1395,7 @@ nav button svg { width: 14px; height: 14px; color: var(--ink-3); }
.switch input:checked + .slider::before { transform: translateX(18px); }
@media (max-width: 1180px) {
.wizard, .create-product-layout, .product-detail-layout, .top-grid, .team-top, .msg-workbench, .factory-body, .tool-layout, .demo-layout, .settings-layout, .overview-grid {
.wizard, .create-product-layout, .product-detail-layout, .top-grid, .team-top, .factory-body, .tool-layout, .demo-layout, .settings-layout, .overview-grid {
grid-template-columns: 1fr;
}
.wiz-preview, .steps, .create-upload-zone, .settings-side { position: static; }