2 Commits

Author SHA1 Message Date
5b13a5cdfc docs: record collapsed agent confirmation deployment 2026-05-20 19:36:21 +08:00
e33463e99f fix: collapse subject agent confirmations 2026-05-20 19:33:51 +08:00
3 changed files with 46 additions and 16 deletions

View File

@@ -11,11 +11,12 @@
- 详见 `CLAUDE.md` 立项决策段 + `.memory/plan.md` 七步管线拆解
- 风格:`04-Dark-Gallery-Ambient`(路径:`~/Projects/research/20260305-网页风格库/04-Dark-Gallery-Ambient.md`
- 第一冲刺:步骤 1-4下载 / 拆轨 / 关键帧 / ASR+翻译)
- 当前产品方向2026-05-20 再确认):信息流广告快速复刻默认进入“三字段候选生成”工作流。主界面为“左侧素材输入列 + 右侧信息流复刻工作表”;工作台以 1800x1000 为基准操作画布,不同显示器或浏览器宽度下保持同一框架,并按可见宽度在 0.72-1.6 倍范围内等比放大/缩小,宽度优先铺满,必要时允许纵向滚动,不通过 `xl/2xl` 断点重排核心操作区。用户粘贴 TK 链接或上传视频后点击“开始分析”,系统自动下载源视频;下载完成后并行启动两条路:音频文案路提取原音频文案/字幕,并分析讲话人、语速节奏、背景音乐/环境声/音效;视频视觉路自动抽取参考帧。源视频工作区右侧主体链路是“参考帧池 → 转换层 → 主体元素”:参考帧池竖向排列;转换层是轻量对话式生图确认区,参考图可通过左侧缩略图 `+`、参考帧拖拽、胶片拖拽或本地图片拖入进入转换层,用户选择 GPT/Gemini 套件后先分析参考图;识别结果里的特征 chip 只作为“保留元素”本地选择,点亮=保留、再点取消,点击不立即请求模型,随下一条发送消息提交;用户再在下方消息输入区发送复刻/创新/卡通和画面要求,生成数量通过发送区旁边的张数控件控制;后端返回英文出图 prompt 后必须弹窗确认,用户点确认才生成对应数量的统一多角度套图。右侧主体元素区的套图输出、文件夹分组、单张重生、删除和 hover 预览逻辑保持不变。旧下方“相似主体 / 主体模板库”不再作为主路径。波形下方的画面胶片只是临时预览,点击只跳转原视频时间点,双击或拖进参考帧池才正式加入关键帧,已加入的胶片直接显示“已添加”。产品图上传后独立形成产品资产包,自动识别视角/结构/比例并补缺角度。分镜工作台按逐句时间轴默认只露“文案 / 场景一句话 / 人物+产品+动作”,产品素材池、批量控制、三字段、视频候选和高级区都必须可折叠;视频候选无内容时默认不占大面积,有候选时默认只显示迷你缩略条,展开后才显示 4-grid。单条默认生成 4 个视频候选,顶部支持整片批量生成候选;首尾帧、视觉规划、产品出现方式和旧 6 字段保留在“高级”抽屉与后端 quick-plan 自动展开中,不能再作为客户默认闸门。
- 当前产品方向2026-05-20 再确认):信息流广告快速复刻默认进入“三字段候选生成”工作流。主界面为“左侧素材输入列 + 右侧信息流复刻工作表”;工作台以 1800x1000 为基准操作画布,不同显示器或浏览器宽度下保持同一框架,并按可见宽度在 0.72-1.6 倍范围内等比放大/缩小,宽度优先铺满,必要时允许纵向滚动,不通过 `xl/2xl` 断点重排核心操作区。用户粘贴 TK 链接或上传视频后点击“开始分析”,系统自动下载源视频;下载完成后并行启动两条路:音频文案路提取原音频文案/字幕,并分析讲话人、语速节奏、背景音乐/环境声/音效;视频视觉路自动抽取参考帧。源视频工作区右侧主体链路是“参考帧池 → 转换层 → 主体元素”:参考帧池竖向排列;转换层是轻量对话式生图确认区,参考图可通过左侧缩略图 `+`、参考帧拖拽、胶片拖拽或本地图片拖入进入转换层,用户选择 GPT/Gemini 套件后先分析参考图;识别结果里的特征 chip 只作为“保留元素”本地选择,点亮=保留、再点取消,点击不立即请求模型,随下一条发送消息提交;用户再在下方发送区发送复刻/创新/卡通和画面要求,界面只显示当前生成要求摘要、保留元素和收起记录计数,不展示重复模型确认话术,生成数量通过发送区旁边的张数控件控制;后端返回英文出图 prompt 后必须弹窗确认,用户点确认才生成对应数量的统一多角度套图。右侧主体元素区的套图输出、文件夹分组、单张重生、删除和 hover 预览逻辑保持不变。旧下方“相似主体 / 主体模板库”不再作为主路径。波形下方的画面胶片只是临时预览,点击只跳转原视频时间点,双击或拖进参考帧池才正式加入关键帧,已加入的胶片直接显示“已添加”。产品图上传后独立形成产品资产包,自动识别视角/结构/比例并补缺角度。分镜工作台按逐句时间轴默认只露“文案 / 场景一句话 / 人物+产品+动作”,产品素材池、批量控制、三字段、视频候选和高级区都必须可折叠;视频候选无内容时默认不占大面积,有候选时默认只显示迷你缩略条,展开后才显示 4-grid。单条默认生成 4 个视频候选,顶部支持整片批量生成候选;首尾帧、视觉规划、产品出现方式和旧 6 字段保留在“高级”抽屉与后端 quick-plan 自动展开中,不能再作为客户默认闸门。
## 部署事实
- 平台VPS `76.13.31.179`Ubuntu 24.04 / Docker Compose / Coolify Traefik
- 发布状态已部署并验证2026-05-20主体元素按套图文件夹分组展示主体生成接口提交后立即返回 queued 占位并后台逐视角生成、逐张回填;右侧三栏主体管线为竖向参考帧池 + 对话式转换层 + 主体元素;转换层通过参考帧 `+` 加入、参考图分析、生图对话、英文 prompt 弹窗确认后才触发主体套图生成;右侧主体元素区的套图输出、轮询、文件夹分组、单张重生、删除和 hover 预览逻辑保持不变;胶片双击/拖拽加入参考帧池 + 胶片缓存复用 + 音频解析失败可重试,参考帧缩略图保持小尺寸 9:16 比例 + hover 左侧紧凑预览,旧主体模板区移出主路径 + 逐句时间轴移到原版视频下方并支持双行文案 + 波形同框时间对齐画面胶片 + 胶片密度按钮上移波形顶部 + 去分隔线 + 胶片上下错落 + body 顶层原位大放大 + 隐藏源视频工作区音频解析摘要卡 + 隐藏工作区顶部状态提示条 + 三字段候选生成工作流 + 折叠紧凑候选区);`https://marketing.skg.com` 已启用应用内登录页,未登录 API 返回 401认证后首页 200容器内 `/health` 返回 `ok:true`
- 最近部署验证2026-05-20`e33463e` 已通过 `./scripts/deploy-prod-safe.sh` 部署到 `/opt/skg-marketing-studio`;部署前备份为 `/opt/skg-marketing-studio-backups/skg-marketing-preserve-20260520113414.tgz`,生产 Docker 重建后脚本内 `./scripts/verify-prod-docker.sh` 通过。线上登录后 Playwright 复测转换层:页面显示“生成要求”和“对话记录已收起”,不再显示旧标题“生图对话”,也不再渲染“我们将不再强制...”这类模型确认消息;最终英文 prompt 仍保留在“待确认提示词”区域,浏览器 `pageerror` 为空。
- 最近部署验证2026-05-20`f35bfe0` 已通过 `./scripts/deploy-prod-safe.sh` 部署到 `/opt/skg-marketing-studio`;部署前备份为 `/opt/skg-marketing-studio-backups/skg-marketing-preserve-20260520111824.tgz`,生产 Docker 重建后脚本内 `./scripts/verify-prod-docker.sh` 通过。线上登录后 Playwright 复测 1440x900、2048x1060、2200x1400 三种窗口,工作台仍按可见宽度优先铺满且外层 wrapper 左右间隙均为 0内层画布已改用 CSS `zoom` 渲染,三个窗口分别为 `zoom=0.8/1.138/1.222``transform` 均为 `none`,避免整屏 transform 小数缩放造成文字发虚,浏览器 `pageerror` 为空。
- 最近部署验证2026-05-20`1d0a77b` 已通过 `./scripts/deploy-prod-safe.sh` 部署到 `/opt/skg-marketing-studio`;部署前备份为 `/opt/skg-marketing-studio-backups/skg-marketing-preserve-20260520105846.tgz`,生产 Docker 重建后脚本内 `./scripts/verify-prod-docker.sh` 通过。线上登录后 Playwright 复测 1440x900、2048x1060、2200x1400 三种窗口,工作台按可见宽度优先缩放,外层 wrapper 左右间隙均为 0三个窗口分别缩放到 0.8、1.138、1.2222048x1060 这类高度不足场景通过纵向滚动承接,不再为了完整高度留下左右空白,浏览器 `pageerror` 为空。
- 最近部署验证2026-05-20`54eaac0` 已通过 `./scripts/deploy-prod-safe.sh` 部署到 `/opt/skg-marketing-studio`;部署前备份为 `/opt/skg-marketing-studio-backups/skg-marketing-preserve-20260520104155.tgz`,生产 Docker 重建后脚本内 `./scripts/verify-prod-docker.sh` 通过。线上登录后 Playwright 复测 1440x900、2048x1060、2200x1400 三种窗口,工作台以 1800x1000 为基准分别缩放到 0.8、1.06、1.222,主网格列宽、源视频区列宽和三栏主体管线列宽保持一致,浏览器 `pageerror` 为空。

File diff suppressed because one or more lines are too long

View File

@@ -3905,6 +3905,9 @@ function SourceSubjectPipeline({
const effectiveAgentViews = subjectViewsForQuantity(effectiveAgentQuantity)
const effectivePrompt = (agentPrompt || subjectAgent?.generation_prompt_en || "").trim()
const effectiveRequirement = (subjectAgent?.requirements_zh || agentRequirement).trim()
const agentUserMessageCount = agentMessages.filter((message) => message.role === "user").length
const agentHiddenAssistantCount = agentMessages.length - agentUserMessageCount
const agentSummaryVisible = Boolean(effectiveRequirement || selectedAgentTraits.length || agentMessages.length)
const canGenerateAgentPack = effectiveAgentMode === "custom"
? Boolean(effectiveRequirement || agentReferenceFrames.length)
: agentReferenceFrames.length > 0
@@ -4166,25 +4169,50 @@ function SourceSubjectPipeline({
<div className="mb-1.5 flex items-center justify-between gap-2">
<span className="inline-flex items-center gap-1 text-[10px] font-semibold text-white/72">
<MessageSquare className="h-3.5 w-3.5 text-cyan-100/55" />
</span>
<span className="text-[9px] text-white/34">
{reconstructionModeConfig(effectiveAgentMode).label} · {effectiveAgentQuantity}
</span>
</div>
<div className="min-h-[86px] flex-1 space-y-1.5 overflow-auto rounded border border-white/8 bg-black/20 p-1.5">
{agentMessages.length ? agentMessages.slice(-5).map((message, index) => (
<div
key={`${message.created_at}-${index}`}
className={`rounded-md px-2 py-1 text-[9.5px] leading-snug ${
message.role === "user"
? "ml-5 bg-cyan-300/12 text-cyan-50/74"
: "mr-5 bg-white/[0.055] text-white/58"
}`}
>
{message.content}
<div className="min-h-[86px] flex-1 overflow-auto rounded border border-white/8 bg-black/20 p-1.5">
{agentSummaryVisible ? (
<div className="space-y-1.5">
<div className="rounded-md border border-cyan-200/12 bg-cyan-300/[0.06] px-2 py-1.5">
<div className="text-[9px] font-semibold text-cyan-50/62"></div>
<p className="mt-0.5 line-clamp-3 text-[10px] leading-snug text-white/64">
{effectiveRequirement || "按当前参考图和保留元素生成。"}
</p>
</div>
{selectedAgentTraits.length ? (
<div className="rounded-md border border-white/8 bg-black/18 px-2 py-1.5">
<div className="mb-1 flex items-center justify-between gap-2 text-[9px]">
<span className={agentSelectedTraitsDirty ? "font-semibold text-cyan-100/58" : "font-semibold text-white/44"}>
{agentSelectedTraitsDirty ? "待发送保留元素" : "保留元素"}
</span>
<span className="text-white/28">{selectedAgentTraits.length}</span>
</div>
<div className="flex max-h-[44px] flex-wrap gap-1 overflow-hidden">
{selectedAgentTraits.slice(0, 8).map((trait) => (
<span key={trait} className="rounded-full border border-emerald-100/28 bg-emerald-300/10 px-1.5 py-0.5 text-[8.5px] leading-none text-emerald-50/72">
{trait}
</span>
))}
{selectedAgentTraits.length > 8 ? (
<span className="rounded-full border border-white/10 bg-black/24 px-1.5 py-0.5 text-[8.5px] leading-none text-white/34">
+{selectedAgentTraits.length - 8}
</span>
) : null}
</div>
</div>
) : null}
{agentMessages.length ? (
<div className="rounded-md border border-white/8 bg-black/16 px-2 py-1 text-[9px] leading-snug text-white/32">
· {agentUserMessageCount} {agentHiddenAssistantCount ? `,隐藏 ${agentHiddenAssistantCount} 条模型确认` : ""}
</div>
) : null}
</div>
)) : (
) : (
<div className="flex h-full min-h-[74px] items-center justify-center px-2 text-center text-[10px] leading-snug text-white/30">
</div>