2026-05-15 · 登录页角色眼神幅度增强
UI改动:放大登录页动画角色的鼠标跟随瞳孔位移,并加大显示密码时眼睛整体看向目标的偏移;同时略微放大白眼球,避免瞳孔大幅移动时显得被裁切。
影响:web/app/login/page.tsx、web/app/globals.css、docs/source-analysis.html。
它把“你看到的界面、你想改的功能、实际要动的源码、可能影响的数据和接口”放在同一个地方。 后续描述需求时,可以直接说“改源码地图里的某个区域 / 某个节点职责 / 某个接口行为”,这样改动范围会更准,也更容易追踪每次变更带来的影响。
例如“镜头拆解 / 元素提取面板”、“元素改造 Storyboard 节点”、“分镜头编排下拉区 4 图槽”。不要只说“这里乱”,要指向页面里的功能区。
例如“Vision 只给候选元素,用户必须能编辑、删除、重新提取”,这会直接落到 FrameLightbox 和元素接口。
例如“点击元素不要跳页面”、“不要直接进入编排打断思路”、“不要把参考视频复刻成一样的东西”。这能约束交互和文案。
建议表达格式:我要改「功能区」;当前问题是「行为」;正确职责是「业务目的」;不要影响「已有流程」。
| 项目 | 命令 / 入口 | 说明 |
|---|---|---|
| 本地后台启动 | ./scripts/start-dev-background.sh |
不弹出 macOS Terminal 窗口;自动检查 4290 / 4291,缺哪个启动哪个,日志写入 .logs/,PID 写入 .pids/。 |
| 本地后台停止 | ./scripts/stop-dev-background.sh |
按 .pids/ 里的 PID 停止后台前端 / 后端进程。 |
| 生产站点 | https://marketing.skg.com |
公司域名已解析到 VPS 76.13.31.179。线上由既有 Coolify / Traefik 负责 HTTPS 入口,项目 web 容器用 Nginx 承载静态前端;未登录访问工作台跳转 /login/,/api/ 通过 auth_request 校验 FastAPI 会话 Cookie 后再反代。 |
| 生产部署 | docker compose -f docker-compose.prod.yml --env-file deploy/.env.production up -d --build |
服务器目录为 /opt/skg-marketing-studio;后端任务文件挂载到 ./data/jobs,真实 Key 只放服务器 deploy/.env.production。 |
| 前端开发服务 | cd web && pnpm dev |
Next.js App Router,主页面是 web/app/page.tsx,默认端口 4290。 |
| 后端开发服务 | cd api && source .venv/bin/activate && uvicorn main:app --host 127.0.0.1 --port 4291 |
FastAPI,所有任务状态、视频、关键帧、清洗、元素、分镜保存都在 api/main.py。长下载 / 抽帧 / 音频处理期间不要带 --reload,否则 reload 会等待后台任务结束并让新请求卡住。 |
| 测试页面 | http://localhost:4290/?job=c6767f3a166b |
URL 里可放多个 job id:?job=id1,id2,id3,前端会恢复多个任务并激活最后一个。 |
| 源码解析页 | open docs/source-analysis.html |
独立静态 HTML,不被 Next 构建、不影响产品工作台。 |
当前产品不是“复制别人的视频”,而是拆解参考视频,提取可借鉴的镜头元素,再改造成 SKG 产品语境的视频素材。
TK 链接或本地上传,后端下载/保存源视频。
拆轨、抽关键帧、手动加帧,形成参考分镜池。当前主题默认直接抽 12 帧,并使用“透明骨架人”抽帧目标:抽帧阶段只走本机算力扫描、评分、去重和时间覆盖;透明骨架人的语义判断放到后续审核/识别,不在抽帧阶段逐帧调用 Vision。
对关键帧做全图或区域清洗,清洗版先进入待审核状态;确认后可单张替换,也可一键替换全部待应用清洗版。
识别场景和主体候选,只是候选,不应锁死。
清洗关键帧,把多张关键帧作为同一主体的参考,先重绘六张标准站立主体资产图,再按关键帧生成多个去主体、相似或换风格场景图。
把内置透明骨架人角色、场景/镜头描述和固定 SKG 产品放入分镜结构;产品融合使用纵向 6 行镜头工作表,只选角色、微调描述词和秒数。
普通分镜可调用 Seedance / Kling / Veo 3;产品融合自动传入所选角色 7 张参考图和固定 4 张 SKG 产品图,用 Seedance 按秒数生成视频,结果回写到对应行。
音频轨独立处理:提取原音频并按实际秒数生成 SKG 英文产品介绍 voice-over,ASR/翻译只作为改前对照和节奏参考;配置 MiniMax 后从男声、女声、成熟声池随机生成自然英文配音 mp3。底部音频条播放原音频时,指针会按时间走过字幕节点。
片段、字幕、配音、转场合成最终 mp4。当前未实现。
web/app/page.tsx | 产品工作台主状态:jobs、activeJobId、按 job 隔离的 selectedFrames/详情面板状态、clipboard、ReactFlow 节点和边;负责打开/找回画布工作面板。 |
web/app/login/page.tsx | 生产登录页:账号密码表单、保持登录、错误/成功状态,以及参考风格库 14 的四个动画角色互动。 |
web/components/nodes/index.tsx | DAG 节点定义:Input、VisualLab、Audio、Compose,以及画布工作面板 KeyframePanel / VideoFramePanel;旧 Keyframe/Storyboard/VideoGen 组件保留但不再挂主画布。 |
web/components/audio-strip.tsx | 底部吸附音频条:可拖拽调整高度;播放原音频时移动指针,逐个高亮英文/中文字幕节点和对应波形,并在右侧固定显示按原音频时长生成的 SKG 英文产品口播和 MiniMax 随机英文配音。 |
web/components/lightbox.tsx | 关键帧素材准备面板:清洗、统一主体候选、参考帧网格、六张主体重绘图、每帧去主体场景图、纵向 6 行产品融合镜头工作表和审核。 |
web/components/product-library-picker.tsx | SKG 内置白底产品图库选择器:搜索、品类筛选、预览尺寸,并把库内图片复制为当前 job 的 asset。 |
web/components/storyboard-bar.tsx | 顶部分镜编排条:展示选入编排的关键帧,并作为唯一分镜导航。 |
web/components/storyboard-workbench.tsx | 顶部分镜编排条下方的明细区:4 图槽、改造目标、时长、自动保存。 |
web/lib/api.ts | 前端类型和 API client,是前后端数据契约镜像。 |
api/main.py | FastAPI 单文件后端:登录会话、状态模型、任务恢复、下载、抽帧、Vision、清洗、元素、分镜、音频文案改写、MiniMax 英文配音、文件返回。 |
api/product_library/skg-products | 内置 SKG 白底产品图库:manifest.json 记录从桌面产品图筛出的 gallery 白底图和桌面 4 张产品角度图,images/ 存 45 张参考图。 |
jobs/<jobId>/state.json | 运行时状态文件,不在源码列表里,但刷新恢复依赖它。 |
jobs/<jobId>/audio.wav | 拆轨得到的原始音频,底部 Audio Strip 会通过只读接口拉取并在浏览器里解码成波形峰值。 |
jobs/<jobId>/frames | 关键帧 jpg。注意 frame.index 是稳定 ID,不等于数组下标。 |
jobs/<jobId>/cleaned | 清洗后待应用图片。 |
jobs/<jobId>/elements | 元素提取图,多版本命名:idx_elementId_cutoutId.jpg。 |
jobs/<jobId>/gen | 关键帧生图结果。 |
前端主链路: web/app/page.tsx -> ReactFlow 节点:web/components/nodes/index.tsx -> 主画布:Input → VisualLab / Audio → Compose -> 底部音频条:web/components/audio-strip.tsx(原音频播放 / 指针 / 英文 / 中文 / 波形 / 英文改写稿) -> 画布内视频抽帧面板:InputNode 单击视频缩略图打开 videoFramePanel -> 画布内镜头拆解面板:VisualLabNode 打开 keyframePanel,内嵌 web/components/lightbox.tsx -> 分镜工作台:web/components/storyboard-workbench.tsx(底层保留) -> API 契约:web/lib/api.ts 后端主链路: api/main.py -> Job / KeyFrame / KeyElement / StoryboardScene / AudioScript -> 下载 / 上传 / 抽帧 / Vision / 清洗 / 元素提取 / 分镜保存 / 音频文案改写 / MiniMax 英文配音 -> jobs/<jobId>/state.json + 图片文件落盘
InputNode in web/components/nodes/index.tsx;状态处理在 page.tsx。VisualLabNode in web/components/nodes/index.tsx;它现在是素材准备看板,汇总关键帧、主体资产包、场景图和视频任务。FrameLightbox;按“原图/清洗、主体资产、首尾帧、产品融合、审核”五个页签组织;左侧只放主图/框选画布,但主体资产页左侧改为全部已清洗/已选参考帧网格,首尾帧页左侧显示全部关键帧并可勾选人物/机位参考。主体识别页会显示透明骨架人目标和 Vision 验收分数。清洗页右侧支持一键清洗未处理帧、单张替换清洗版和一键替换全部待应用清洗版;批量替换顺序调用 applyCleanedFrame,不新增后端接口。产品融合页左侧是纵向 6 行镜头工作表:顶部选择 5 个内置透明骨架人角色之一,并常驻显示桌面四张真实 SKG 产品角度图;每行只显示已预填场景/产品使用/享受描述、秒数、生成按钮和可横向追加的视频历史结果,产品图和结果视频都支持鼠标停留放大预览。描述词内置 36 条镜头语言模板,按“建立出场、产品入画、佩戴贴合、使用感受、生活延展、收尾记忆”排列,并且会按角色自动改写场景气质、使用动作和享受状态。每行还内置角色参考图调度:例如正面/半身用于出场,侧面/背部特写用于佩戴贴合,半身/背部特写用于收尾产品记忆点。点击“换一组”只刷新 6 行描述词。四张桌面 SKG 产品图是真实产品真源,所选角色 7 张参考图是人物身份参考,生成时分别通过 copyProductLibraryAsset 与 copyCharacterLibraryAssets 自动写入当前 job;视频 prompt 要求产品作为外置刚性实物合成到后颈外侧,禁止穿模、融进透明身体或重绘产品。不再暴露产品角度槽、产品融合辅助栏、产品图库选择器或首尾帧槽。主体资产页只确认一个统一主体,后端按参考重绘六张纯背景、占满画面的标准站立透明骨架人资产图;首尾帧页保留给旧流程/单独生图,不再是产品融合必填步骤。相关接口包括 cleanupFrame、applyCleanedFrame、addElement、generateSubjectAssets、generateSceneAsset、copyProductLibraryAsset 和 copyCharacterLibraryAssets。StoryboardWorkbench;保存到 frame.storyboard;接口 PUT /storyboard。SKG 产品参考区同时支持上传、剪贴板和内置白底产品库。一个视频任务。前端维护多个 jobs[],当前激活的是 activeJobId。URL 查询参数会持久化多个 job。
Job {
id, url, status, progress, message,
video_url, source_audio_url, duration, width, height,
frames: KeyFrame[],
transcript: TranscriptSegment[],
audio_script: AudioScript,
storyboard_images?: StoryboardImage[]
}
关键帧是整个产品的核心单位。index 是稳定 ID,手动加帧后不连续,不能用数组下标代替。
KeyFrame {
index, timestamp, url,
description,
transparent_human_score,
cleaned_url, cleaned_applied,
quality_report,
scene_assets: SceneAsset[],
elements: KeyElement[],
storyboard: StoryboardScene,
generated_images: GeneratedImage[]
}
透明骨架人主题的抽帧验收结果。只有 target=transparent_human 时会在抽帧阶段写入;普通抽帧目标不要求该字段。
TransparentHumanFrameScore {
transparent_body_score: 0-25,
skeleton_visible_score: 0-25,
human_prominence_score: 0-15,
clarity_score: 0-15,
commercial_style_score: 0-10,
product_usefulness_score: 0-10,
total_score,
qualified,
reject_reason
}
从关键帧识别结果里确认出来的主体候选。当前素材准备流程只保留一个统一主体;多张关键帧通过 source_frame_indices 作为该主体的参考帧。
KeyElement {
id,
name_zh, name_en, position,
source: auto | manual | region,
region,
cutouts: string[],
cutout_id,
subject_kind: object | living,
subject_assets: SubjectAsset[]
}
音频文案轨的结构化产物。pipeline_transcribe 提取 audio.wav 后按原音频秒数写入 SKG 英文产品介绍 voice-over,再用 MiniMax T2A 从英文音色池随机生成配音文件。
AudioScript {
status: idle | rewriting | completed | failed,
source_text,
source_zh,
rewritten_text,
product_brief,
rewrite_model,
voice_provider: minimax,
voice_model,
voice_id,
voice_url,
error
}
画面工作台素材准备阶段生成的组图资产。实际图片保存在 jobs/<jobId>/assets,可作为 asset 类型复制到分镜槽位。
SceneAsset {
id, label, url,
width, height, quality, size,
scene_mode: remove_subject | similar | style,
scene_style,
quality_report
}
SubjectAsset {
id, view, label, url,
background: white | black,
width, height, size,
source_frame_indices[]
}
内置 SKG 白底图库条目。实际图片保存在 api/product_library/skg-products/images,被选中时会复制到 jobs/<jobId>/assets,再以普通 ImageRef(kind="asset") 进入产品参考组。
ProductLibraryItem {
id, handle, title, product_type,
image_index, filename, url,
width, height,
white_score,
source_path,
tags[]
}
产品融合镜头组的单行数据。每个关键帧最多 6 行,用户选择一个内置角色后只微调场景/产品使用/享受描述和秒数;四张桌面 SKG 产品角度图会在顶部显式展示为真实产品真源,所选角色 7 张参考图作为人物身份参考,生成时作为 Seedance 参考图提交。
ProductFusionShot {
id,
first_image,
last_image,
product_images[4],
action_text,
duration,
image_model: gpt-image-2,
video_model: seedance,
// legacy: product_image, person_image, product_region, scene_image, guide_image
}
分镜编排结果,不是复刻说明。它把参考图和 SKG 改造方向绑定到一个分镜上。
StoryboardScene {
duration,
subject_image,
scene_image,
product_image,
action_image,
subject,
product,
scene,
action
}
| 功能 | 接口 | 前端调用 | 说明 |
|---|---|---|---|
| 网页登录 | POST /auth/login、GET /auth/check、POST /auth/logout | web/app/login/page.tsx、Nginx auth_request | 登录页提交账号密码到 /api/auth/login,后端设置 HttpOnly 会话 Cookie;生产 Nginx 对工作台和 /api/ 调 /auth/check 做统一校验,未登录页面跳 /login/,API 返回 JSON 401。 |
| 历史列表 | GET /jobs | listJobs | 所有 job 精简列表(id/url/status/thumbnail/mtime…),按 state.json mtime 倒序。前端 URL 无 ?job= 时拉它回填全部历史;带 limit 可截断。 |
| 创建任务 | POST /jobs | createJob | 提交 TK 链接,后台开始下载,停在 downloaded 等用户点解析。 |
| 上传视频 | POST /jobs/upload | uploadJob | 保存 source.mp4,然后同样进入下载完成状态。 |
| 删除输入视频 | DELETE /jobs/{id} | deleteJob | 从任务队列、URL 和磁盘 jobs/<id> 目录移除整个 job,包括源视频、关键帧、元素提取图和生成视频。 |
| 解析视频 | POST /jobs/{id}/analyze?frames=&target=&mode=&quality= | analyzeJob | 拆轨 + 目标化抽关键帧。默认 frames=12;target 支持透明骨架人、综合、清晰主体、转场变化、表情瞬间、动作峰值;当前 UI 默认 transparent_human。透明骨架人目标现在只走本地清晰度、中心主体、对比度、画面变化和 pHash 去重,不在抽帧阶段逐帧调用 Vision;mode=append 追加新关键帧;quality=auto 为展示友好档,最高只自动选择精细,不会自动上极准;极准保留为手动选择。抽帧开始时同步拆出 audio.wav 并启动音频处理线程。多个抽帧请求进入后端队列顺序处理。 |
| 音频文案轨 | POST /jobs/{id}/transcribe | triggerTranscribe | 若尚未拆轨,先从 source.mp4 提取 audio.wav 并回填 source_audio_url;随后用原音频实际秒数估算英文词数,按 AUDIO_PRODUCT_BRIEF 生成有趣、自然的 SKG 英文产品介绍 audio_script.rewritten_text。ASR/翻译结果保留为改前对照和节奏参考;如果 ASR 不可用,也会用原音频时长继续生成产品口播。配置 MINIMAX_API_KEY 后调用 MiniMax T2A,并从 MINIMAX_TTS_VOICE_POOL 随机选择男声、女声或成熟声生成 audio_script.voice_url。 |
| 原始音频文件 | GET /jobs/{id}/audio.wav | sourceAudioUrl | 返回拆轨得到的 wav;底部 AudioStrip 拉取该文件,用 Web Audio API 解码并计算波形峰值。原音频播放器驱动时间轴,播放时全局指针和当前字幕节点内指针同步移动。 |
| 改写配音文件 | GET /jobs/{id}/audio-script.mp3 | apiAssetUrl(job.audio_script.voice_url) | 返回 MiniMax T2A 生成的英文 mp3。没有配置 MiniMax 或生成失败时该文件不存在,但英文改写文案仍会保存在 audio_script.rewritten_text。 |
| 手动加帧 | POST /jobs/{id}/frames?t= | addManualFrame | 按视频时间戳抽一帧,index 递增但 frames 按 timestamp 排序。 |
| Vision 识别 | POST /frames/{idx}/describe | describeFrame | 写入 frame.description,后续可从 objects 加候选元素。 |
| 清洗水印 | POST /frames/{idx}/cleanup | cleanupFrame | 支持全图和区域清洗,生成 cleaned 待应用版本;前端批量清洗会顺序调用该接口,不自动覆盖原图。单帧清洗状态按 frame.index 隔离,清洗某一张不会禁用其他关键帧的清洗按钮。 |
| 应用清洗版 | POST /frames/{idx}/cleanup/apply | applyCleanedFrame | 把 cleaned 待应用版本覆盖到原关键帧,并保留首次原图备份;前端“一键替换待应用”会顺序调用该接口应用所有已有清洗版。 |
| 应用清洗 | POST /cleanup/apply | applyCleanedFrame | 物理覆盖 frames/{idx}.jpg,并备份原图。 |
| 元素增改删 | POST/PATCH/DELETE /elements | addElement/updateElement/deleteElement | 让用户修正 Vision 错误,避免候选结果锁死。 |
| 元素提取 | POST /elements/{element_id}/cutout | cutoutElement | 调用图像模型生成独立白底素材图,每次累积一张 cutout。 |
| 主体资产包 | POST /elements/{element_id}/subject-assets | generateSubjectAssets | 根据参考帧重新绘制一个统一主体资产包;前端默认把全部关键帧作为 source_frame_indices,如果用户手动选择了关键帧则只传已选帧,后端拼参考板。人物默认输出六张身份标准图,另有表情补充和动作补充分组可选;纯白/黑背景,不含其他元素,并裁去空白让主体占满画面。 |
| 首尾帧资产 | POST /frames/{idx}/scene-asset | generateSceneAsset | 同一接口兼容旧场景图和新首尾帧;新流程传 asset_role=first_frame/last_frame,后端走文字生图,参考帧只用于理解透明骨架人形象、比例、机位和光线,生成结果仍保存在 scene_assets 并自动填入产品融合镜头。 |
| 产品图库 | GET /product-library/skg | listProductLibrary | 读取内置 SKG 白底图库 manifest,返回产品标题、品类、尺寸、白底评分和预览图 URL。 |
| 产品图入库到 job | POST /jobs/{id}/assets/product-library | copyProductLibraryAsset | 把一个内置产品图库条目复制为当前 job 的普通 asset,返回 ImageRef(kind="asset"),用于画面工作台产品融合和分镜产品参考组。 |
| 角色库 | GET /character-library/skg | listCharacterLibrary | 读取内置 5 个透明骨架人角色 manifest,每个角色含正面、左右 45 度、侧面、背面、半身近景和背部特写 7 张参考图。 |
| 角色图入库到 job | POST /jobs/{id}/assets/character-library | copyCharacterLibraryAssets | 把所选角色的 7 张参考图复制为当前 job asset,返回 subject_images,产品融合生成视频时作为人物身份参考图提交。 |
| 产品融合引导图 | POST /jobs/{id}/product-fusion/guide | createProductFusionGuide | 旧流程兼容接口:读取产品图和白底人物图,按 product_region 合成位置引导图。当前内置角色 + 产品 + 描述流程不再主动调用它。 |
| 产品融合描述词 | POST /jobs/{id}/product-fusion/descriptions | generateProductFusionDescriptions | 兼容接口:可生成产品融合动作描述库。当前前端默认直接用本地 36 条镜头语言模板预填 6 行镜头,并通过“换一组”按钮按 6 条一组轮换。 |
| 分镜保存 | PUT /frames/{idx}/storyboard | updateStoryboard | 保存 4 图槽、时长和改造说明。 |
| 生图 | POST /frames/{idx}/generate | generateImage | 基于关键帧或已选生成图做 image-to-image,目前可用。 |
| 节点 | 当前职责 | 不该承担 | 改动主要文件 |
|---|---|---|---|
| 输入 Input | 创建/上传任务,显示视频就绪;每个视频缩略图上方都有绑定自己的自动抽帧快捷工具条,默认只露出目标和抽帧按钮,张数/自动精度收进设置;也可在视频抽帧侧边面板内自动抽帧。多个视频抽帧可先后入队,切换 active 视频不会清空其他视频已选帧或关闭它们的异步生成回写。 | 不要自动一路跑到 ASR 或生图;用户需要控制解析节奏。 | page.tsx、InputNode、VideoFramePanelNode、api/main.py |
| 画面工作台 Visual Lab | 作为素材准备看板:显示准备进度、质量风险、关键帧 / 统一主体包 / 场景图 / 分镜视频四个入口;上方缩略图按关键帧、主体包、场景图、视频任务分组。点击关键帧进入素材审核面板,点击资产图复制到分镜编排。 | 不要在主卡片里堆复杂表单;主卡片只做状态总览和入口。 | VisualLabNode、FrameLightbox、generateSceneAsset、generateSubjectAssets、视频任务接口 |
| 分镜工作台 | 每个分镜填 4 图槽和改造 brief,为后续生成首帧/视频片段做准备。 | 当前不负责真实调用视频模型。 | StoryboardWorkbench、updateStoryboard |
| Audio / ASR / Rewrite | 独立声音文案轨:从 source.mp4 直接提取 audio.wav,按原音频时长生成 SKG 产品语境英文 voice-over;ASR/翻译保留为改前对照和节奏参考。MiniMax T2A 配置后从男声、女声、成熟声池随机生成自然英文配音 mp3。不再等待抽帧完成,用户在主画布 AudioNode 点击卡片或“提取音频 / 重新提取音频”即可打开底部音频条并启动;即使视觉抽帧正在进行,也通过 audio_script.status 并行管理音频忙碌态。AudioNode 用“改前 · 原音频 / 改后 · SKG Product VO”摘要展示;底部 AudioStrip 吸附屏幕底端,可拖拽调整高度,按时间段展示英文、中文翻译和波形;原音频播放时指针同步穿过字幕节点,右侧显示英文产品口播和 MiniMax 英文配音。 |
不要阻断视觉素材管线。 | AudioNode、AudioStrip、ASRNode、TranslateNode、RewriteNode、pipeline_transcribe、AudioScript |
| Video / Compose | 视频任务状态展示在 Visual Lab;Compose 承载最终合成。 | 不要把 Compose 提前变成视频生成控制台。 | VisualLabNode、/storyboard/video、generated_videos、ComposeNode |
/audio/transcriptions,自动 fallback 到 ASR_FALLBACK_MODEL(默认 gemini-2.5-flash)的多模态音频识别。English_magnetic_voiced_man、English_Upbeat_Woman、English_MaturePartner。API Key 只能放本地环境变量,不能写入仓库。VIDEO_API_BASE_URL=https://ai.skg.com/doubao 走 content JSON 异步任务,提交后写入 Video Gen 节点并轮询到完成。最重要的产品判断:当前视觉素材管线已经能继续推进,文案/音频/视频生成不要再反过来卡住镜头拆解和元素改造。
“我在关键帧素材准备面板里,主体候选应该怎么编辑/删除;主体资产包怎么生成;场景图怎么基于主体去除、换风格、审核、复制到分镜。”
“我在 DAG 的元素改造节点,它上方缩略图展示什么、hover 预览什么、点击后是否进入工作台、是否自动选中对应分镜。”
“我在顶部分镜头编排下拉面板,每个分镜需要哪些槽位、字段如何命名、保存后如何传给后续生成视频。”
“这个动作需要持久化到 state.json,字段加在 Job/KeyFrame/KeyElement/StoryboardScene 哪一层,刷新后要恢复。”
“这个节点的业务职责要改,不只是 UI 文案;请同步更新节点标题、subtitle、说明、可点击行为、状态推导和本源码解析页。”
这个记录不是 git log 的替代品。它记录“产品理解发生了什么变化、影响了哪些源码、你以后描述需求时该怎么说”。后续每次改功能都要补一条。
改动:放大登录页动画角色的鼠标跟随瞳孔位移,并加大显示密码时眼睛整体看向目标的偏移;同时略微放大白眼球,避免瞳孔大幅移动时显得被裁切。
影响:web/app/login/page.tsx、web/app/globals.css、docs/source-analysis.html。
问题:首版登录页把风格库的动画角色理解成圆润小球,视觉上偏幼稚,和 14 动画角色登录 的原始气质不一致。
改动:对照风格库 AnimatedCharacters.vue 和 demo,把角色重写为紫色高矩形、黑色矩形、橙色半圆、黄色圆角柱的贴底几何组合;保留鼠标视线跟随,并让输入、显示密码、错误、成功状态驱动 skew、眼睛和嘴型变化。
影响:web/app/login/page.tsx、web/app/globals.css、docs/source-analysis.html。
问题:公司域名部署后任何人知道地址都能打开工作台并调用生成能力。
改动:把浏览器 Basic Auth 改为应用内登录页:前端新增 web/app/login/page.tsx,参考风格库 14 动画角色登录 做四个几何角色、鼠标视线跟随、输入 / 显示密码 / 错误 / 成功状态反馈;后端新增 /auth/login、/auth/check、/auth/logout,使用 HttpOnly Cookie + HMAC 会话签名;生产 Nginx 通过 auth_request 保护工作台和 /api/。
影响:api/main.py、web/app/login/page.tsx、web/app/globals.css、web/lib/api.ts、docker-compose.prod.yml、deploy/nginx.conf、deploy/.env.production.example、api/.env.example、.project.json、RULES.md、docs/deploy-vps.md、docs/source-analysis.html。
改动:把生产入口确定为 https://marketing.skg.com,DNS 已解析到 VPS 76.13.31.179。新增 Docker Compose 生产配置:前端用 Next 静态导出 + Nginx,/api/ 反代到唯一容器名 skg-marketing-api:4291,避免与 Coolify 网络里其他项目的泛名 api 冲突;后端任务目录持久化到服务器 ./data/jobs;Traefik 通过既有 coolify 外部网络接管 80/443。已完成上线验证:HTTPS 首页 200,/api/health 返回 ok:true。
影响:Dockerfile.web、Dockerfile.api、docker-compose.prod.yml、deploy/nginx.conf、deploy/.env.production.example、docs/deploy-vps.md、.project.json、RULES.md、docs/source-analysis.html。
问题:通过 macOS Terminal 启动后端会每次弹出一个终端窗口,打开页面时干扰使用。
改动:新增 scripts/start-dev-background.sh 和 scripts/stop-dev-background.sh。启动脚本自动检查前端 4290 和后端 4291,缺哪个后台启动哪个,日志写入 .logs/,PID 写入 .pids/,以后无需通过 osascript 打开 Terminal。
影响:scripts/start-dev-background.sh、scripts/stop-dev-background.sh、.gitignore、RULES.md、docs/source-analysis.html。
问题:Seedance 生成时可能把颈部按摩仪当成可变形装饰物,导致产品样式变化、穿进透明身体或与骨架融合。
改动:产品融合 prompt 改为英文硬约束:四张 SKG 产品图是真实产品照片和唯一实物真源,生成时按外置刚性设备做 product placement / visual compositing;产品必须停留在透明皮肤外侧,后颈外侧承托、两端沿左右颈侧向前,保留遮挡、接触阴影、透视和真实比例,禁止 x-ray blending、穿模、融进骨架或重绘成其他颈带。
界面:产品融合顶部常驻显示桌面四张真实产品角度图,并支持鼠标停留放大查看。每行视频结果不再只显示最新一个,而是按历史持续追加横向结果条,鼠标停留任一结果会放大预览。
后端:生视频参考图顺序调整为主参考图之后优先传四张产品图,再传其余人物角色图,提高真实产品外观权重。
影响:web/app/page.tsx、web/components/lightbox.tsx、api/main.py、docs/source-analysis.html。
问题:产品融合视频能进入队列,但后台任务 5% 后失败,错误为 /contents/generations/tasks 返回 404。
根因:https://ai.skg.com/doubao 这个 SKG 豆包网关的真实视频入口是 /api/v3/contents/generations/tasks,不是火山方舟直连 base 下使用的 /contents/generations/tasks。
改动:后端默认路径识别 ai.skg.com/doubao 并自动使用 /api/v3/contents/generations/tasks、/api/v3/contents/generations/tasks/{id}、/api/v3/contents/generations/tasks/{id}/content;本机 api/.env 和 api/.env.example 同步更新。
影响:api/main.py、api/.env、api/.env.example、docs/source-analysis.html。
问题:当前产品融合不再需要手动首帧/尾帧,用户要的是从内置透明骨架人角色、场景描述、产品使用方式和享受状态直接生成视频。
改动:桌面 skg_anatomy_characters_20260514_120852 的 5 个角色、35 张图内置为 api/character_library/skg-characters。产品融合页新增角色下拉和角色预览,每行只保留场景/产品使用/享受描述、秒数、生成按钮和结果视频;选择不同角色时,6 行描述会自动改成对应角色的场景气质、产品使用动作和享受状态,并自主写入“本镜头主要参考哪几张角色图、生成什么场景”。生成前自动复制所选角色 7 张参考图和固定 4 张 SKG 产品图到当前 job。
后端:新增 GET /character-library/skg、GET /character-library/skg/images/{filename}、POST /jobs/{job_id}/assets/character-library。视频提交新增 subject_images,无首帧时主人物图以 reference_image role 传入 Ark/Seedance,而不是强制作为 first_frame。
影响:api/main.py、api/character_library/skg-characters、web/lib/api.ts、web/app/page.tsx、web/components/lightbox.tsx、docs/source-analysis.html。
问题:产品融合不能只写“人物使用产品”,还要稳定控制出场方式、景别、运镜、产品入画、佩戴贴合、使用感受和收尾;同时 SKG 产品是颈部/肩颈按摩仪,比例和佩戴位置不能跑偏。
改动:前端内置 36 条产品融合镜头语言模板,6 条为一组,对应建立出场、产品入画、佩戴贴合、使用感受、生活延展和收尾记忆;产品融合页新增“换一组”按钮,只刷新 6 行描述词,不改变已选角色和视频结果。视频 prompt 额外写入颈部/后颈/颈肩使用部位和真实尺寸比例约束。
影响:web/components/lightbox.tsx、web/app/page.tsx、docs/source-analysis.html。
问题:“提取音频”不能只做原音频转文字再改写,用户需要点击后直接得到介绍 SKG 产品的英文文案和配音,长度尽量贴近原音频,并且声音不能生硬。
改动:pipeline_transcribe 提取 audio.wav 后读取原音频时长,用该时长估算英文口播词数;_rewrite_audio_script_sync 改为生成自然、有趣、可直接 TTS 的 SKG 英文产品介绍。ASR/翻译保留为对照和节奏参考,ASR 不可用时仍继续生成产品口播。MiniMax voice_id 改为从 MINIMAX_TTS_VOICE_POOL 随机选择男声、女声或成熟声。
影响:api/main.py、api/.env.example、api/README.md、RULES.md、web/components/nodes/index.tsx、web/components/audio-strip.tsx、web/components/dashboard.tsx、docs/source-analysis.html。
问题:产品融合视频的动作描述不能泛泛写“人物使用产品”,需要稳定表达透明骨架人在具体场景中佩戴 SKG 产品,并呈现舒适享受状态。
改动:前端内置 20 条产品使用描述模板,覆盖卧室、客厅、办公、浴室、阳台、影棚、阅读角等场景;当前产品融合页默认把前 6 条预填到 6 行镜头,用户只在需要时直接改每行描述。
后端:generateProductFusionDescriptions 的兜底模板同步扩为 20 条,LLM 提示也改为生成 20 条 35-70 字描述,要求包含场景、佩戴/展示动作和舒适表情,同时排除医疗治疗承诺。
影响:api/main.py、web/components/lightbox.tsx、docs/source-analysis.html。
问题:原产品融合依赖白底人物、手动画区域、场景图和融合引导图,但当前透明骨架人二创流程更需要文字生成首尾帧,再把产品真源作为垫图传给视频模型。
改动:“场景图”页签改名为“首尾帧”,右侧用地点、风格、参考要素和 prompt 生成首帧/尾帧,生成后自动填入当前产品融合镜头。产品融合 6 行工作表改为首帧、尾帧、四张同一产品不同角度图、描述词、秒数和生成按钮,并提供桌面四角度填当前镜头/填满 6 镜头。
后端:generateSceneAsset 新增 asset_role,first_frame/last_frame 走文字生图并标记资产角色;ProductFusionShot 新增 first_image、last_image、product_images,视频提交直接把首尾帧和四张产品图交给 Seedance;产品库新增桌面 skg产品1-4.jpg 四角度条目。
影响:api/main.py、web/lib/api.ts、web/app/page.tsx、web/components/lightbox.tsx、docs/source-analysis.html。
问题:透明骨架人目标逐帧调用 Vision 验收会拖慢抽帧;切回本机算力后,如果自动档直接跑最高极准,也可能在展示时占满机器资源。
改动:transparent_human 目标保留,但抽帧阶段只走本地扫描、评分、去重和时间覆盖,不再逐帧调用 Vision。quality=auto 最高只自动选择精细;极准仍保留为手动选项。抽帧开始拆出 audio.wav 后会启动独立音频线程,视觉抽帧和音频处理并行,互不标失败。
影响:api/main.py、web/components/nodes/index.tsx、docs/source-analysis.html。
问题:刷新页面时 Next 报 Hydration mismatch,ReactFlow 节点服务端默认宽度和客户端 localStorage 里的用户调整宽度不一致;同时提交抖音链接时若后端正在 --reload 等后台任务结束,会出现 4291 端口占用但请求卡住。
改动:web/app/page.tsx 增加 clientReady,ReactFlow 和底部音频条只在浏览器挂载后渲染,避免服务端 HTML 和客户端本地布局缓存不一致。后端启动说明改为不带 --reload 的稳定命令,并更新 RULES.md、api/README.md 和本页运行入口。
影响:web/app/page.tsx、RULES.md、api/README.md、docs/source-analysis.html。本地 4291 后端已按无 reload 模式重启。
问题:等待抽帧完成后自动启动音频,不符合“先把声音文案拿出来审核”的工作流;用户需要在音频卡片上直接触发。
改动:移除前端抽帧完成后的自动转写逻辑;AudioNode 保留并固定显示“提取音频 / 重新提取音频”按钮,点击音频卡片也会立即打开底部音频条。后端 /transcribe 不再要求 frames_extracted,视频就绪后可直接从 source.mp4 拆出 audio.wav,并按原音频时长生成 SKG 英文产品介绍和 MiniMax 随机英文配音;抽帧中触发时不抢主状态,而是用 audio_script.status 表示音频处理中。当当前网关的 whisper-1 audio endpoint 返回 404 时,会 fallback 到 Gemini 多模态音频识别;ASR 不可用时也会继续按原音频时长生成产品口播,不把可用文案标成前端错误。
影响:web/app/page.tsx、web/components/nodes/index.tsx、api/main.py、docs/source-analysis.html。
问题:音频和文案只在节点或侧栏里展示,审核时缺少“文字和声音时间轴对应”的空间;英文口播和中文翻译也没有上下对齐。
改动:新增 web/components/audio-strip.tsx,在主工作台底部吸附显示,可拖拽调整高度、可收起。每个音频段按时间横向排列,上方显示英文,中间显示中文翻译,下方显示对应波形条;底部原音频播放器驱动时间轴,播放时绿色指针会沿全局波形移动,并在当前字幕节点内同步走过该段。右侧显示按原音频时长生成的 SKG 英文产品口播、MiniMax 随机英文配音和产品依据。后端新增 source_audio_url 和 GET /jobs/{id}/audio.wav 只读接口,前端用 Web Audio API 解码生成波形峰值。
影响:web/app/page.tsx、web/components/audio-strip.tsx、web/lib/api.ts、api/main.py、docs/source-analysis.html。
问题:音频识别成功后只显示改写文案,用户看不到它和原音频之间的变化关系,难以判断“是不是把参考视频转成我们自己的话”。
改动:AudioNode 增加轻量对照摘要:改前显示原音频识别/翻译预览,改后显示 SKG 英文产品口播;侧栏 Rewrite 面板改为完整审核视图,先列原音频逐段 ASR/翻译,再列英文产品介绍稿、产品卖点依据和 MiniMax 英文配音播放器。
影响:web/components/nodes/index.tsx、web/components/dashboard.tsx、docs/source-analysis.html。
问题:同时上传多个视频后,前端把已选关键帧和关键帧详情面板作为全局状态保存;切换 active 视频会清空选中帧,或者让详情面板指向另一个视频的同序号帧,容易误以为生图/自动化被终止或串任务。
改动:web/app/page.tsx 将 selectedFrames 和 expandedFrame 改为按 jobId 存储。切换视频只改变当前视图,不清空其他视频的选择;重新抽帧、删帧、手动加帧只清理或更新对应 job。异步生图、生视频、产品融合返回后按返回的 job.id 写回 jobs[],不会落到切换后的 active job。轮询条件也把 audio_script.status=rewriting 纳入运行态,保证音频改写/配音阶段切换视频后仍继续刷新。
影响:web/app/page.tsx、docs/source-analysis.html。后端轮询本来已经覆盖所有运行中的 job,这轮主要修正前端 UI 工作上下文。
问题:点击视频抽帧时,后端 4291 端口能连接但 /health 和后续请求长时间不返回,前端看起来像按钮没有反应。
原因:pipeline_download 和 pipeline_analyze 声明为 async background task,但内部实际是同步 yt-dlp、ffmpeg 和 Vision 验收;Starlette 会在事件循环里执行 async background task,导致长抽帧把 API 主循环堵住。
改动:下载和抽帧 pipeline 改为普通同步函数,让 FastAPI/Starlette 按线程池后台任务执行;analyze_queue_worker 也改为同步 worker。服务启动恢复时,如果磁盘里有重启前遗留的 downloading、splitting 或 transcribing 运行态,会恢复成可重试状态,避免按钮一直 disabled。开发运行时改用不带 --reload 的后端命令,避免重载等待后台任务。
影响:api/main.py、docs/source-analysis.html。已重启本地 4291 后端并验证 /health 立即返回;遗留的 8b37e65521a6 job 已恢复为 downloaded,可重新点击抽帧。
问题:用户提供 https://ai.skg.com/doubao 作为视频模型网关;该网关应按 Seedance / 方舟内容生成任务格式提交,而不能误走普通 multipart 上传。
改动:video_uses_ark() 现在同时识别火山方舟域名和 ai.skg.com/doubao,统一使用 content JSON:文本 prompt、首帧、尾帧和产品参考图作为不同 role 传入。火山方舟直连按 /contents/generations/tasks/{id} 轮询;SKG 豆包网关按 /api/v3/contents/generations/tasks/{id} 轮询。api/.env.example 增加 SKG 豆包视频网关配置示例;生视频轮询上限改为 VIDEO_POLL_TIMEOUT_SECONDS,默认 900 秒,避免慢任务过早失败。
影响:api/main.py、api/.env.example、docs/source-analysis.html。本机 api/.env 已配置 VIDEO_API_BASE_URL=https://ai.skg.com/doubao 和视频专用 key。
问题:音频处理节点之前只说明“音轨 → ASR → 翻译 → 改写”,没有按原音频时长生成的产品介绍产物,也没有配音输出;用户无法直接拿到符合 SKG 产品语境的英文口播。
改动:Job 新增 audio_script,pipeline_transcribe 提取 audio.wav 后按原音频秒数生成 SKG 英文产品介绍文案,并在配置 MINIMAX_API_KEY 时调用 MiniMax T2A 输出 /jobs/{id}/audio-script.mp3。MiniMax voice_id 从英文男声、女声、成熟声池随机选择;前端 AudioNode 和侧栏 Rewrite 区显示模型链路、英文产品文案和配音播放器。
边界:MiniMax 官方 Speech API 当前接入的是 TTS 配音,不替代 ASR;原始音频文案提取仍走现有 OpenAI-compatible audio transcription 入口。
影响:api/main.py、api/.env.example、api/README.md、web/lib/api.ts、web/components/nodes/index.tsx、web/components/dashboard.tsx、web/app/page.tsx、docs/source-analysis.html。
问题:透明骨架人主题需要更稳定的素材覆盖,默认 5 帧太少,容易缺少可用于主体、场景和产品融合的角度。
改动:后端 KEYFRAME_COUNT 默认值、前端抽帧 fallback、API client 默认参数都改为 12;抽帧设置里的张数选项把 12 放到第一位。透明骨架人目标仍会对每个候选做 Vision 验收,不合格候选自动换下一帧。
影响:api/main.py、api/.env.example、web/lib/api.ts、web/app/page.tsx、web/components/nodes/index.tsx、docs/source-analysis.html。
问题:透明人二创不能只靠清晰度抽帧,也不能只要出现“骨头”就算合格;需要确认同一人形角色同时具备透明/半透明外壳、干净白色骨架、足够大且清晰、非恐怖广告感。
改动:FrameExtractTarget 新增 transparent_human 并设为当前 UI 默认目标。后端抽帧先按本地清晰度、中心主体、对比度和去重扩大候选池,再逐张从原视频抽高清帧交给 Vision 评分;评分维度包括透明身体、可见骨架、人物占比、清晰度、商业风格和产品可用性。不合格帧会被删除并自动换下一候选,直到凑够目标张数或候选耗尽。
影响:api/main.py、web/lib/api.ts、web/app/page.tsx、web/components/nodes/index.tsx、web/components/lightbox.tsx、web/lib/workflow-target.ts、docs/source-analysis.html。
问题:一键清洗后会生成多张待应用清洗版,但用户仍需要逐张点“替换原图”,素材准备阶段操作成本偏高。
改动:“原图/清洗”页新增“待替换清洗版”状态和“一键替换待应用 N 张”按钮,并显示批量替换进度和失败数。该按钮只应用已经存在的清洗结果,不重新清洗;不满意的帧仍可先单张重洗或丢弃。
影响:web/components/lightbox.tsx、docs/source-analysis.html。
问题:产品融合页继续显示产品角度槽、辅助栏和产品图库会把操作变复杂;当前工作流只需要用户手动补人物首尾帧,产品图固定来自桌面 4 张 SKG 图。
改动:“产品融合”页每行只保留首帧、尾帧、已预填描述词、秒数、生成按钮和行末视频结果。生成单条或批量视频前,前端自动把内置的 4 张桌面 SKG 产品图复制为当前 job asset 并写入 product_images[4];视频 prompt 增加 产品融合镜头ID 标记,用来把生成结果显示回对应行。
影响:web/components/lightbox.tsx、web/app/page.tsx、web/components/nodes/index.tsx、web/components/dashboard.tsx、docs/source-analysis.html。
问题:产品融合要生成 6 条视频,但旧排版只在列表里显示摘要,真正编辑区只展开当前镜头,用户无法从上到下同时检查 6 条镜头的产品、人物、场景和描述是否一一对应。
改动:“产品融合”页左侧改为纵向 6 行镜头工作表。每行包含产品图槽、白底人物图槽、人物图内产品区域画框、场景图槽、动作描述、秒数选择和单条生成按钮;右侧只保留模型状态、当前镜头状态、AI 草拟 6 条、批量排队和当前镜头产品图库。
影响:web/components/lightbox.tsx、docs/source-analysis.html。
问题:只把产品图作为参考图无法解决尺寸和位置融合,模型不知道产品应该放在人物或场景里的哪个区域。
改动:FrameLightbox 的“产品融合”页改为 6 行镜头组。每行绑定产品图、白底人物图、手动画出的产品区域、场景图、描述词和视频秒数;图片槽支持上传和粘贴,产品图也可从内置 SKG 白底图库选用。右侧固定显示图片模型 GPT Image 2 和视频模型 Seedance,支持 AI 草拟 6 条动作描述和批量排队;单条生成入口放在每一行镜头内。
后端:新增 POST /jobs/{job_id}/product-fusion/guide 和 POST /jobs/{job_id}/product-fusion/descriptions。前者把产品图按 product_region 合成到白底人物图上,生成普通 asset 引导图;后者用 LLM 或本地模板生成 6 条动作描述草稿。前端再把引导图作为 Seedance 首帧,并把产品图、人物图、场景图作为参考图提交。
影响:api/main.py、web/lib/api.ts、web/app/page.tsx、web/components/lightbox.tsx、web/components/nodes/index.tsx、web/components/dashboard.tsx、docs/source-analysis.html。
问题:卡片上的“复制”写入的是应用内 ImageRef 剪贴板,而产品融合槽位只监听系统剪贴板文件,导致复制后的素材无法在产品融合里粘贴。
改动:NodeData 和 FrameLightbox 新增 clipboard 传递链路;产品融合三类槽位的“粘贴”按钮优先使用应用内剪贴板,应用剪贴板为空时再提示可选中槽位后 Cmd+V 粘贴系统图片。
影响:web/app/page.tsx、web/components/nodes/index.tsx、web/components/dashboard.tsx、web/components/lightbox.tsx、docs/source-analysis.html。
问题:生成视频需要稳定的 SKG 产品真源,不能每次都依赖临时上传或从参考视频里找产品图;桌面已有整理过的 SKG 产品图,应作为内置数据库使用。
改动:从桌面 skg_product_downloads/all_products 的 gallery 中筛出 41 张白底产品图,生成 api/product_library/skg-products/manifest.json 和压缩预览图。FrameLightbox 新增“产品融合”页签,StoryboardWorkbench 的 SKG 产品参考区也接入同一个 ProductLibraryPicker,支持搜索、品类筛选、尺寸预览和一键加入。
后端:新增 GET /product-library/skg、GET /product-library/skg/images/{filename} 和 POST /jobs/{job_id}/assets/product-library。选中库内产品图时,后端会复制成当前 job 的 asset,后续仍通过既有 product_images 进入生视频接口。
影响:api/main.py、api/product_library/skg-products、web/lib/api.ts、web/components/product-library-picker.tsx、web/components/lightbox.tsx、web/components/storyboard-workbench.tsx、docs/source-analysis.html。
问题:场景图页不能只围绕当前单张图;它需要看到全部关键帧,并通过地点、风格、参考要素等关键词组合出可控 prompt,再生成场景。
改动:FrameLightbox 的“场景图”页左侧改为全部关键帧网格:点击图片设为生成目标,点击“选”加入场景参考。右侧新增地点、生成方式、风格、额外关键词和参考要素 chips,并自动拼出可编辑场景 prompt。
后端:generateSceneAsset 请求新增 prompt 和 source_frame_indices;多张参考帧会拼成 contact sheet 给图像模型,同时把用户 prompt 注入场景生成提示词。
影响:web/components/lightbox.tsx、web/lib/api.ts、api/main.py、docs/source-analysis.html。
问题:主体资产不是抠图,也不是只看当前单帧生成多角度;主体页需要看到全部参考帧,并用这些参考重新绘制一个完整主体。
改动:FrameLightbox 在“主体资产”页左侧显示参考帧网格,优先纳入所有已清洗帧,额外已选帧也会并入;小图排列,可点击切换当前帧。右侧仍负责统一主体确认和生成。人物/生物默认视图改为六张身份标准图:正面、背面、左侧、右侧、左前 45°、右前 45°;并把表情补充和动作补充折成独立分组,需要时再勾选。
后端:generateSubjectAssets prompt 改为“参考重绘”,明确禁止裁剪/抠图/粘贴源像素,要求主体完整居中、纯白/黑背景、无其他元素,并占画面约 85-95% 高度;落盘时会裁掉纯背景空白并放大主体。
影响:web/components/lightbox.tsx、web/components/nodes/index.tsx、api/main.py、docs/source-analysis.html。
问题:当前流程里抽多张关键帧的目的不是让每张图各自生成一个主体,也不是从单张图硬造多角度,而是用多张关键帧共同还原同一个主体的多角度、动作和表情。
改动:FrameLightbox 的主体页改成“统一主体”逻辑:全局只保留一个主体候选;生成主体资产包时默认传全部关键帧作为 source_frame_indices,用户手动选择关键帧时只传已选帧。场景图仍然按当前关键帧逐张生成,因此是一个主体包 + 多个场景图。
后端:generateSceneAsset 查找主体名称时改为从整个 job 的已生成主体资产中读取,而不是只看当前帧,确保任意关键帧生成场景图时都能移除统一主体。
影响:web/components/lightbox.tsx、web/components/nodes/index.tsx、api/main.py、docs/source-analysis.html。
问题:场景图如果先于主体资产生成,只能做普通背景清理,无法准确知道要移除哪个主体,也不利于后续生成相似但不同或同构换风格的场景。
改动:FrameLightbox 页签顺序改为“原图/清洗 → 主体资产 → 场景图 → 审核”;画面工作台缩略图和进度文案也同步为主体资产先于场景图。场景图页新增“去主体原场景 / 相似新场景 / 同构换风格”和风格选择,且在没有主体资产时提示先生成主体资产。
后端:generateSceneAsset 请求新增 scene_mode 和 scene_style;后端提示词会优先读取已生成主体资产对应的主体名称,生成去主体并补背景的场景图,再按模式决定是否做相似变化或风格变化。
影响:web/components/lightbox.tsx、web/components/nodes/index.tsx、web/lib/api.ts、api/main.py、docs/source-analysis.html。
问题:“原图/清洗、主体资产、场景图、审核”都应遵循同一结构:左侧负责看图和框选,右侧负责操作、状态和结果;旧布局把部分操作塞在左侧下方,导致左侧满、右侧空。
改动:FrameLightbox 统一为左侧主图、右侧操作栏。清洗按钮、批量清洗、清洗结果预览、场景图生成/复制、主体识别/主体资产包和审核状态都在右侧;切换到非清洗页时会退出框选模式,避免画框状态残留。
影响:web/components/lightbox.tsx、docs/source-analysis.html。
问题:单独清洗某一张关键帧时,前端使用全局 cleaning 布尔状态,导致切到其他关键帧后清洗按钮仍被禁用。
改动:FrameLightbox 改用 cleaningFrameIds 按 frame.index 记录正在清洗的帧,只禁用当前正在清洗的那一张;其他帧可以继续单独清洗。区域清洗完成时也只在用户仍停留于同一帧时清空当前框选,避免异步完成误清别的帧操作状态。
影响:web/components/lightbox.tsx、docs/source-analysis.html。
问题:画面工作台里的关键帧已经在抽帧阶段筛过,逐张点“清洗水印”会拖慢素材准备;但自动清洗又不能直接覆盖原图,否则模型误改时不好回退。
改动:FrameLightbox 的“原图/清洗”页新增“批量清洗”卡片,一键顺序清洗所有未处理素材帧,并显示进度和失败数。批量清洗只生成 cleaned 待审核版本,不自动应用;没清干净的帧再用单帧框选区域做手工补洗。
影响:web/components/lightbox.tsx、docs/source-analysis.html。后端暂未新增 batch API,前端复用 POST /jobs/{id}/frames/{idx}/cleanup 顺序执行。
问题:面板标题仍叫“关键帧详情 · 元素提取”,里面还露出普通 cutout 抠图、AI 提取、元素清单等旧流程入口;“选用此帧 / 加入目标帧”也无法说明实际价值,因为抽帧阶段已经筛过图,进入画面工作台的关键帧默认就应该参与素材准备。
改动:KeyframePanelNode 标题改为“关键帧素材准备”;FrameLightbox 的主体页改成“主体识别 / 主体清单 / 主体资产包”,移除普通抠图列表、AI 提取按钮、详情内的目标帧开关以及手动/框选加主体入口,改为只显示“已在素材准备流程”的状态说明;VisualLabNode 上方缩略图也不再展示普通抠图分组,只展示关键帧、主体包、场景图和视频任务。
影响:web/components/lightbox.tsx、web/components/nodes/index.tsx、docs/source-analysis.html。底层旧 cutout 数据和接口暂保留兼容历史任务,但不再作为新素材准备流程的可见入口。
问题:画面工作台从展示缩略图扩展为素材生产中枢后,关键帧、主体资产包、场景图和视频任务继续混在一个列表里会让流程不清晰;关键帧详情面板也把清洗、识别、主体生成和场景生成都堆在一屏。
改动:VisualLabNode 改成素材准备进度看板,显示关键帧素材、主体资产、场景图和分镜/视频四个入口。FrameLightbox 新增“原图/清洗、主体资产、场景图、审核”四个页签,素材审核信息从普通列表中拆出来。
影响:web/components/nodes/index.tsx、web/components/lightbox.tsx、docs/source-analysis.html。这轮只重排工作台信息架构,批量自动准备队列仍留到下一阶段。
问题:抽帧阶段已经筛过图,画面工作台第一步应把已选关键帧转成可用于生视频的干净素材:同一主体一套多视角/动作/表情图,再基于主体生成每帧去主体场景图,而不是继续手动逐张抠普通 cutout。
改动:KeyFrame 新增 scene_assets 和 quality_report;KeyElement 新增 subject_kind 与 subject_assets。后端新增 generateSubjectAssets 和 generateSceneAsset,主体资产支持白/黑背景、原尺寸/固定尺寸、物体视角、人物/生物动作与喜怒哀乐等表情;当已选关键帧共同指向一个主体时,前端会把这些帧作为 source_frame_indices 传入,后端拼接参考板。
影响:api/main.py、web/lib/api.ts、web/components/lightbox.tsx、web/components/nodes/index.tsx、docs/source-analysis.html。生成出的素材保存在 jobs/<jobId>/assets,可作为 asset 类型复制到后续分镜槽位。
问题:抽帧精度不应该每次都让用户判断;点击一个视频抽帧后,其他视频不应被全局禁用,而应该可以先后排队。另外打开视频抽帧侧边面板后,也应能自动抽帧。
改动:quality 新增 auto 默认值,后端按 CPU 核数、内存和视频时长解析为快速或精细;为了展示稳定,auto 不再自动进入极准,极准仅在用户手动选择时启用。后端新增内存队列 ANALYZE_QUEUE,多个 analyze 请求按顺序执行;前端轮询所有运行中的 job,不只轮询当前 active job。VideoFramePanelNode 内也加入同一套自动抽帧工具条。
影响:api/main.py、web/lib/api.ts、web/app/page.tsx、web/components/nodes/index.tsx、docs/source-analysis.html。队列目前是进程内队列,重启后不会恢复未执行的排队任务。
问题:每个缩略图上方同时放目标、张数、精度和按钮太拥挤;另外追加抽帧时可能没有新增图片。
根因:追加模式下 frames 目录已经存在,但后端仍使用非 exist_ok 的 mkdir,触发 File exists 后任务进入解析失败。
改动:工具条默认只显示目标、抽帧/追加和设置按钮;张数、精度折叠到设置里。后端改为允许已存在的 frames 目录,追加模式不再因目录存在失败。缩略图高度增大到 192px,横屏/竖屏都按真实比例显示;抽帧评分也按视频原比例缩放,不固定 16:9。
影响:api/main.py、web/app/page.tsx、web/components/nodes/index.tsx、docs/source-analysis.html。已用临时 job 验证 append:已有 1 张关键帧时追加 3 张后变为 4 张。
问题:当前抽帧默认偏轻量,用户机器是 Apple M2 Max、12 核 CPU、38 核 GPU、64GB 内存,足以承受更密集的本地候选扫描;但需要在 UI 里提示算力档位,避免长视频误用重模式。
改动:后端 /jobs/{id}/analyze 新增 quality 参数:快速为 2fps/360px,精细为 8fps/720px,极准为 12fps/960px;高精度模式还会提高本地评分图分辨率,保留竖屏比例,不再把竖屏压扁到 16:9。每个缩略图工具条新增精度选择。
影响:api/main.py、web/lib/api.ts、web/app/page.tsx、web/components/nodes/index.tsx、docs/source-analysis.html。实测本机 64.5s、1080×1920、60fps 视频,12fps/960px 扫描 774 张候选约 2.61s;重型 ffmpeg 场景/模糊滤镜约 21.63s,因此继续使用本地 PIL/NumPy 评分更划算。
问题:统一放在缩略图浮条上方的抽帧工具条仍然不够明确,用户无法一眼判断当前会抽哪一个视频。
改动:抽帧目标、张数、精度和抽帧按钮改为渲染在每个视频缩略图正上方,并且每个 job 独立保存目标、张数和精度设置。点击某个缩略图上方的抽帧按钮时,前端直接把该 jobId 传给 analyzeJob,同时切换 active job 并进入该 job 的进度轮询。
影响:web/app/page.tsx、web/components/nodes/index.tsx、docs/source-analysis.html。后续与输入视频相关的快捷操作都应优先贴近对应缩略图,不再依赖全局当前选择的心智。
问题:自动抽帧入口放在 Input 卡片正文里,离视频缩略图和预览工作区较远;用户需要在看缩略图时快速切目标、切张数并反复抽取。
改动:输入视频缩略图浮条上方新增自动抽帧快捷工具条,包含抽帧目标、张数快捷项和抽帧按钮。前端新增 frameCount 状态并把目标 / 张数传给 analyzeJob;已有关键帧时默认用 mode=append 追加抽取。
影响:api/main.py、web/lib/api.ts、web/app/page.tsx、web/components/nodes/index.tsx、docs/source-analysis.html。后端追加模式会保留已有关键帧,避开非常接近的时间点,并用新的 frame index 落盘。
问题:单一“自动抽帧”无法表达这次要清晰人物、下次要转场变化或表情瞬间的不同目标;但把抽帧做成复杂参数面板会破坏 Input 卡片的轻量工作流。
改动:Input 节点新增抽帧目标,默认“综合关键帧”,可切换清晰主体、转场变化、表情瞬间、动作峰值。后端 /jobs/{id}/analyze 新增 target 参数,先低清低帧率扫描候选,再按目标评分、pHash 去重、时序分桶,最后只对选中的时间点从原视频抽高质量关键帧。
影响:api/main.py、web/lib/api.ts、web/app/page.tsx、web/components/nodes/index.tsx、docs/source-analysis.html。当前“人物/动物表情”是本地近似评分,后续可把候选小图接入视觉模型重排。
问题:输入视频缩略图改为单击打开抽帧面板后,面板播放器如果自动播放带声音,会打断工作流。
改动:VideoFramePanelNode 的主播放器增加 muted,默认静音自动播放;用户仍可通过浏览器视频 controls 自行取消静音。
影响:web/components/nodes/index.tsx、docs/source-analysis.html。
问题:视频抽帧面板和画面工作台详情面板框架一致后,标题栏颜色也需要分别跟各自来源卡片一致;输入视频缩略图仍需要双击才能打开抽帧面板,操作偏重。
改动:视频抽帧面板标题栏使用 --grad-input,画面工作台详情面板标题栏使用 --grad-ai;输入视频缩略图改为单击打开抽帧面板,hover 仍负责尺寸预览。
影响:web/components/nodes/index.tsx、docs/source-analysis.html。后续面板颜色应从来源卡片类型继承。
问题:关键帧详情 / 元素提取面板虽然默认左侧吸附,但外层仍是旧橙色“钉住”框架,和视频抽帧面板的紫色标题栏、画布/左/右/底吸附按钮不一致。
改动:KeyframePanelNode 改为和 VideoFramePanelNode 同一套 Canvas Panel 外壳:紫色标题栏、画布模式、吸附左侧、吸附右侧、吸附底部、缩放、关闭和右下角拖拽缩放。面板定位状态从单一 pinned 语义升级为 framePanelDock。
影响:web/app/page.tsx、web/components/nodes/index.tsx、docs/source-analysis.html。后续工作面板应复用这套 Canvas Panel 框架。
问题:画面工作台详情面板外层已有“关键帧详情 · 元素提取”工具栏,内层 FrameLightbox 嵌入态又显示一条橙红分镜导航栏,视觉上像两个窗口叠在一起。
改动:FrameLightbox 在 embedded 模式下不再渲染自己的顶部工具栏和外边框;上一帧 / 下一帧导航移动到 KeyframePanelNode 外层标题栏。
影响:web/components/lightbox.tsx、web/components/nodes/index.tsx、docs/source-analysis.html。非嵌入式 lightbox 保留原标题栏。
问题:画面工作台点击关键帧后,关键帧详情 / 元素提取面板仍默认作为画布节点出现,还会触发 fitView 拉动画布;和视频抽帧面板默认左侧吸附的规则不一致。
改动:framePanelDock 初始值改为 left;从关闭状态打开关键帧详情时默认吸附左侧。若面板已打开,用户切回画布模式后继续切换关键帧,不会被强制吸回左侧;默认吸附状态下也不再触发画布 fitView。
影响:web/app/page.tsx、docs/source-analysis.html。画面工作台处理面板现在与视频抽帧面板保持同一默认策略:先贴左侧,需要时再切回画布。
问题:视频抽帧面板默认以画布节点方式打开时,用户还要再点一次吸附左侧,和“处理面板先贴边、需要时再拖回画布”的工作习惯不一致。
改动:videoPanelDock 初始值改为 left;从关闭状态双击输入视频缩略图时默认吸附左侧。面板已打开后,用户手动切换到画布 / 右侧 / 底部不会被找回动作覆盖。
影响:web/app/page.tsx、docs/source-analysis.html。后续同类处理面板应优先考虑“默认贴边,必要时切回画布”的交互。
问题:视频抽帧面板只能新增关键帧,用户看到“已抽关键帧”后不能在同一工作上下文里清理误抽的帧。
改动:已抽关键帧缩略图右上角增加删除按钮,点击后按 jobId + frameIdx 删除对应关键帧;删除期间显示小号 loading。图片类素材仍沿用快速删除策略,不弹确认。
影响:web/app/page.tsx、web/components/nodes/index.tsx、docs/source-analysis.html。视频抽帧面板不再依赖当前 active job 来决定删除目标。
问题:视频抽帧面板吸附左侧 / 右侧时顶部仍留出明显空白;这不是实际板块遮挡,而是面板吸附样式里硬编码了 top: 72 和对应的高度预留。关键帧面板也保留了旧 storyboard 顶栏避让逻辑。
改动:新增统一吸附边距常量,视频抽帧面板和关键帧详情面板吸附时都贴近视口边缘,仅保留 8px 安全边距;移除关键帧面板对旧 data-storyboard-dock / data-storyboard-bar 的避让查询。
影响:web/components/nodes/index.tsx、docs/source-analysis.html。后续画布工作面板的吸附语义统一为“贴边”,不是为顶部旧板块预留空间。
问题:输入视频缩略图双击原来只在 Input 节点上方展开一个临时播放器,不能作为无限画布工作台移动、找回或吸附,后续其他板块也无法复用这种交互。
改动:新增 videoFramePanel ReactFlow 节点和 VideoFramePanelNode。双击输入视频缩略图会打开/找回画布内抽帧面板,面板可拖动、右下角缩放,也可一键吸附到左侧、右侧或底部边缘;面板内支持播放、时间轴定位、当前时间抽帧和查看已抽关键帧。
影响:web/app/page.tsx、web/components/nodes/index.tsx、docs/source-analysis.html。原固定全屏 VideoLightbox 不再从 Input 双击路径进入;后续处理板块应复用同类画布工作面板语义。
问题:原始尺寸和 Fit 比例之前是左上角小号单行文字,用户在快速扫缩略图时不够醒目,无法马上感知素材分辨率差异。
改动:HoverPreview 左上角改为两层信息徽章:标题固定为“原始尺寸”,主数字用大号等宽字体显示 宽 × 高,旁边保留 Fit 百分比或 1:1 原寸 状态。
影响:web/components/nodes/hover-preview.tsx、docs/source-analysis.html。定位和 Fit / 1:1 行为不变,只提升尺寸信息可读性。
问题:浏览器原生删除确认会突然出现在页面顶部,和无限画布的操作上下文割裂;图片类素材如果每次删除都确认,也会拖慢快速整理素材的节奏。
改动:输入视频和生成视频任务删除改为画布内确认层,背景轻遮罩并支持点击背景 / Esc 取消;关键帧和元素提取图属于可快速整理的图片素材,点击删除后直接执行。
影响:web/components/nodes/index.tsx、docs/source-analysis.html。视频删除仍走既有删除接口;图片删除仍走原有回调,只调整确认策略。
问题:画布顶部输入视频缩略图只有切换和预览,没有删除入口;用户清理视频队列时只能删关键帧或生成视频任务,不能删除整个输入视频。
改动:新增 DELETE /jobs/{id},前端新增 deleteJob 和 onDeleteJob;Input 缩略图右上角常驻删除按钮,确认后移除该 job、清理 URL 参数,并删除本地 jobs/<id> 目录。
影响:api/main.py、web/lib/api.ts、web/app/page.tsx、web/components/nodes/index.tsx、docs/source-analysis.html。
问题:有些源视频和图片分辨率很大,完全按原尺寸展示会撑爆画布;但统一固定预览大小又会丢失素材真实尺寸感知。
改动:HoverPreview 默认按原比例适应可视区域,角标显示原始分辨率和当前 Fit 百分比;点击钉住后可切换到 1:1,超大素材在预览框内滚动查看局部。
影响:web/components/nodes/hover-preview.tsx。视觉缩略图高度同步放大,图片缩略图的复制 / 删除按钮改为常驻大号 icon。
问题:节点上方缩略图横排内容多时,原生横向滚动条太细且在画布缩放下不容易点中,用户很难拖动。
改动:新增 FloatingThumbnailStrip / ThumbnailScrollRail,在缩略图下方显示明显的大号紫色拖动轨道;轨道支持点击跳转、按住拖动和键盘左右移动,并用 nodrag nopan 避免误触发画布拖拽。
影响:web/components/nodes/index.tsx、web/app/globals.css、docs/source-analysis.html。Input、VisualLab 以及保留的旧视觉节点缩略图条共用同一交互。
问题:镜头拆解、元素改造、生成视频三个卡片在主画布上占同等权重,但它们只是视觉素材状态展示和入口;真正处理都在点击后的工作台/面板中完成。
改动:新增 VisualLabNode,把关键帧、元素 cutout、视频任务缩略图合并到一个“画面工作台 · Visual Lab”卡片里;DAG 从 Input → Keyframe → Storyboard → VideoGen → Compose 简化为 Input → VisualLab → Compose,音频线仍独立。
影响:web/app/page.tsx、web/components/nodes/index.tsx、docs/source-analysis.html。底层数据、接口和旧节点组件暂不删除。
问题:点击或轻微拖动卡片右下角缩放把手时,节点会突然偏移/跳变,影响在无限画布上精调卡片大小。
原因:getComputedStyle(nodeEl).width/height 读到的已经是 ReactFlow 节点坐标下的布局尺寸,旧逻辑又除了一次 zoom,导致拖动起始宽高被放大或缩小;点击时 1px 级 pointermove 也会立刻写入错误宽高。
改动:起始宽高直接使用 computed style,只有鼠标移动量按 zoom 换算;增加 2px 点击死区,单纯点击缩放角不再改写节点尺寸。
影响:web/components/nodes/resize-handle.tsx、docs/source-analysis.html。
问题:用户要的是“鼠标停在卡片缩略图上时,原尺寸图片/视频在该缩略图上方边缘展示,并且仍属于无限画布”;不能贴节点卡片上边缘,也不能放到页面 fixed 层。
改动:HoverPreview 增加缩略图锚点坐标,预览层仍渲染在 ReactFlow 节点 DOM 内,但用缩略图的中心 x 和 top y 定位,预览底边贴缩略图上边缘;Input 视频、镜头拆解关键帧、元素改造 cutout、生成视频缩略图统一走该逻辑。
影响:web/components/nodes/hover-preview.tsx、web/components/nodes/index.tsx、docs/source-analysis.html。
问题:前端只从 URL ?job= 读 job 列表,没有任何本地或后端列表回填,打开 / 不带参数就是空白,之前跑过的 job 看不见。
改动:后端新增 GET /jobs 列表接口(返回 JobSummary:id/url/status/progress/duration/width/height/video_url/frame_count/video_count/thumbnail/error/mtime,按 state.json mtime 倒序,可带 limit)。前端 page.tsx 启动逻辑:URL 有 ?job= 时尊重 URL;没有时自动调 listJobs() 拿全部历史,反转后让最新 job 落在末尾(active)。持久化基于 api/jobs/<id>/state.json 磁盘文件,不依赖浏览器存储,换浏览器/清缓存都不会傻。
影响:api/main.py(JobSummary 类型 + list_jobs endpoint)、web/lib/api.ts(JobSummary + listJobs)、web/app/page.tsx(启动 useEffect)。
问题:本轮参考素材的主体可能是人形骷髅/透明骨骼人,不应被提示词强行替换成普通真人;核心是“用了 SKG 颈部按摩仪后状态变好”。
改动:prompt 允许保留人形骷髅作为视觉隐喻,要求正确佩戴 U 形颈部按摩仪,并通过从僵硬/揉脖子/疲惫到抬头/肩颈舒展/放松来表现状态改善;同时禁止恐怖化、血腥化或夸大医疗治愈。
影响:web/app/page.tsx。
问题:已经有真实 SKG 产品图后,提示词还偏“借鉴原视频”,容易让模型保留竞品或改变产品形态。
改动:生成视频 prompt 明确“上传的 SKG 产品图是唯一产品真源”,首尾帧只控制起止构图、场景和动作,原视频链接只参考节奏和镜头调度;增加产品一致性、产品呈现、禁止非 SKG 产品/竞品包装/随机新增结构等约束。
影响:web/app/page.tsx。
问题:SKG 产品参考不能只依赖从关键帧/元素里复制,用户需要手动上传同一产品的多角度图。
改动:SKG 产品参考 区支持点击上传和拖拽上传图片,一次可传多张,最多保留 6 张。后端新增 POST /jobs/{job_id}/assets 保存产品图资产,并返回 kind: "asset" 的 ImageRef;生成视频时这些资产会作为产品参考传入 Ark。
影响:web/components/storyboard-workbench.tsx、web/lib/api.ts、api/main.py。
问题:首尾帧可以控制视频起止,但还需要单独指定 SKG 产品图,避免模型只模仿原视频动作而没有稳定产品外观。
改动:分镜编排区新增 SKG 产品 槽,和首帧、尾帧并列;生成视频时把该槽作为 product_image 提交。Ark 请求会附加一张 reference_image 产品参考图;如果接口不接受额外参考图,后端自动回退到首尾帧生成。
影响:web/components/storyboard-workbench.tsx、web/app/page.tsx、api/main.py。
问题:赶交付时,顶部横向分镜缩略条占空间,4 图槽也不如“首帧到尾帧”直接;用户希望直接做首尾帧视频生成。
改动:移除 StoryboardBar 的横向分镜缩略图区域,只保留标题栏和展开按钮;StoryboardWorkbench 改成首帧 / 尾帧两个槽,首帧默认当前分镜,尾帧默认下一张已选分镜,也可从剪贴板粘贴指定结束画面。后端 /storyboard/video 支持 first_image/last_image,Ark 请求同时传 first_frame/last_frame,如果接口不接受尾帧字段则自动回退到单首帧。
影响:web/components/storyboard-bar.tsx、web/components/storyboard-workbench.tsx、web/app/page.tsx、web/lib/api.ts、api/main.py。
问题:用户赶交付,希望直接把上传的原视频链接给视频模型参考,而不是只靠单张关键帧。
改动:前端提交生视频时增加 source_ref: { kind: "source_video", url: job.url };Ark 请求体在文本 prompt 和首帧之外追加 video_url 参考视频,用于模仿节奏、镜头运动和动作顺序。如果 Ark 返回 400/422 不接受参考视频字段,后端自动回退到“当前关键帧首帧生成”,保证这次不会直接阻断出片。
影响:web/app/page.tsx、web/lib/api.ts、api/main.py、docs/source-analysis.html。
问题:赶交付时不适合再让 4 图槽决定首帧;如果某个槽里是抠图元素,模型会拿碎元素当第一帧,视频容易不连贯。
改动:“生成视频”按钮改成直接用当前分镜关键帧作为首帧提交,4 图槽和改造目标只作为提示词参考;提示词强调一镜到底、首帧稳定、时间线连续、禁止跳切/换场景/主体变形。后端取关键帧时优先使用未应用的清洗版,否则使用当前 frame 文件。
影响:web/app/page.tsx、web/components/storyboard-workbench.tsx、api/main.py。
问题:用户提供火山方舟 https://ark.cn-beijing.volces.com/api/v3 作为生视频通道;这个通道不是 Poe 的 /videos 形态,而是内容生成异步任务。
改动:后端识别 Ark base 后,提交改为内容生成任务接口,火山方舟直连使用 POST /contents/generations/tasks,SKG 豆包网关使用 POST /api/v3/contents/generations/tasks。请求体使用 content 数组:文本 prompt + 首帧 image_url data URL;轮询对应的 {id} 任务地址,成功后读取 content.video_url 下载 MP4。本机默认 Seedance 模型改为 Ark 可见的 doubao-seedance-2-0-fast-260128。
影响:api/main.py、api/.env.example、docs/source-analysis.html。本机 api/.env 需要把 VIDEO_API_BASE_URL/VIDEO_API_KEY/VIDEO_CREATE_PATHS/VIDEO_STATUS_PATH 指向 Ark。
问题:SKG ezlink 的 OpenAI 兼容 base 可列出部分模型,但常规 /videos 入口返回 404/unsupported;用户确认可用的视频模型在 Poe 通道里。
改动:后端新增 POE_API_BASE_URL/POE_API_KEY 配置,未显式配置 VIDEO_API_BASE_URL 时优先走 Poe;Seedance / Kling / Veo/Voe 业务别名默认映射到 Poe 真实模型 seedance-2-fast、kling-omni、veo-3.1-fast。Poe 提交使用 input_image base64,继续轮询 /videos/{id} 并下载 /videos/{id}/content。
影响:api/main.py、api/.env.example、docs/source-analysis.html。密钥只放本地 api/.env,不进入源码解析页。
问题:虽然当前探测到常见视频入口返回 404/unsupported,但模型层确实有视频模型,不能在前端简单判定“未开通”并禁用。
改动:撤掉分镜编排里的前置禁用;后端允许提交 seedance / kling / veo / voe,并支持通过 VIDEO_CREATE_PATHS 逗号分隔配置多个候选生成入口,逐个尝试。
影响:api/main.py、api/.env.example、web/app/page.tsx、web/components/storyboard-workbench.tsx。
问题:提交生视频失败时,前端把 generateStoryboardVideo 503 {"detail": ...} 原样展示,用户无法快速判断是配置、端点还是 UI 问题。
改动:generateStoryboardVideo 解析后端 JSON 的 detail 后再抛错;后端错误文案区分“模型存在”和“入口不可用”;Video Gen 失败卡把 /videos 404 长错误压缩成一句可读原因。
影响:web/lib/api.ts、web/components/nodes/index.tsx、api/main.py。
问题:Video Gen 节点上方失败/完成任务卡只有整卡点击复制,不够明确;失败任务也无法从界面清掉。
改动:每张视频任务卡左上角增加复制 prompt 按钮,右上角增加删除任务按钮;后端新增 DELETE /jobs/{job_id}/storyboard-videos/{video_id},删除 generated_videos 记录并清理本地任务目录。
影响:web/components/nodes/index.tsx、web/app/page.tsx、web/lib/api.ts、api/main.py。
问题:4 图槽已经粘贴参考图后,用户要直接调用生视频 API,而不是只生成 prompt 或图片任务。
改动:分镜编排明细区增加 Seedance / Kling / Veo 3 模型选择和“调用模型生成视频”按钮;后端新增 /jobs/{job_id}/frames/{idx}/storyboard/video。提交后按 VIDEO_CREATE_PATHS 逐个尝试生成入口,成功后轮询并保存 MP4;失败时保留任务卡和具体入口错误,方便继续排查网关实际路径。VideoGenNode 读取 job.generated_videos 展示排队、生成中、失败和完成视频。
影响:api/main.py、api/.env.example、web/components/storyboard-workbench.tsx、web/components/nodes/index.tsx、web/app/page.tsx、web/lib/api.ts。Sora 不再作为默认模型;真实模型 ID 通过 VIDEO_MODEL_SEEDANCE、VIDEO_MODEL_KLING、VIDEO_MODEL_VEO3 配置,真实视频 API 地址通过 VIDEO_API_BASE_URL/VIDEO_API_KEY 配置。
问题:分镜编排明细区默认占用太多顶部面积,展开后下方画布空间不足。
改动:明细区默认高度降为 320px,并增加底部拖拽手柄,可上推缩到 180px,也可下拉放大查看完整内容。
影响:web/components/storyboard-workbench.tsx。
问题:顶部分镜缩略图条和下方内嵌工作台都带分镜导航,看起来像两个不同板块。
改动:StoryboardBar 成为唯一分镜导航;StoryboardWorkbench 移除自己的标题栏、左侧分镜列表和底部快捷栏,只保留当前分镜的 4 图槽与改造目标明细。
影响:web/components/storyboard-bar.tsx、web/components/storyboard-workbench.tsx、web/app/page.tsx。
问题:元素改造节点等入口仍会打开 fixed inset-0 的全屏 StoryboardWorkbench,用户感觉像跳转页面。
改动:移除 StoryboardWorkbench 的 portal 全屏承载方式,改为渲染在顶部分镜栏下方;所有“打开编排”入口只展开这个内嵌区域。
影响:web/components/storyboard-workbench.tsx、web/components/storyboard-bar.tsx、web/app/page.tsx、web/components/nodes/index.tsx。
问题:关键帧详情钉住在浏览器左侧固定位置时,会遮挡顶部分镜头编排栏展开后的缩略图区域。
改动:给 StoryboardBar 增加稳定 DOM 标记;钉住面板实时读取该区域下边缘,并吸附到其下方。展开 / 折叠分镜头编排时,钉住面板自动让位。
影响:web/components/storyboard-bar.tsx、web/components/nodes/index.tsx。
问题:顶部 StoryboardBar 的“进入编排”和分镜缩略图点击会打开全屏 StoryboardWorkbench,打断当前画布流程。
改动:顶部按钮改为“展开编排”,只下拉展示当前分镜列表;缩略图点击只聚焦该分镜,不再触发全屏跳转。后续已把工作台整体改成内嵌下拉,见上方最新记录。
影响:web/components/storyboard-bar.tsx、web/app/page.tsx。
问题:钉住后仍像自由浮层一样停在画布附近,用户继续缩放画布或调整面板尺寸时容易把它和画布节点混在一起。
改动:钉住后统一吸附到浏览器左侧边缘,脱离 ReactFlow 画布缩放;钉住瞬间把当前可见大小转换成面板真实尺寸,之后只由右下角拖拽或标题栏按钮调整。
影响:web/components/nodes/index.tsx;钉住语义从“原地浮在上层”改为“左侧停靠工作面板”。
问题:只有按钮缩放不够直观;钉住后仍作为画布节点,会继续随 ReactFlow 画布缩放。
改动:增加右下角拖拽缩放手柄;钉住时通过 portal 固定到浏览器上层,脱离 ReactFlow 画布缩放和平移。
影响:web/components/nodes/index.tsx、web/app/page.tsx;未钉住时仍是画布节点,钉住后保持屏幕固定位置。
问题:面板可以拖动后,用户仍可能误拖;切换图片时希望保持固定工作位置。
改动:在标题栏增加钉子按钮。钉住后面板节点禁止拖动,切换关键帧只切换内容不移动位置;取消钉住后可继续拖动。
影响:web/app/page.tsx、web/components/nodes/index.tsx。
问题:用户把关键帧详情面板拖到合适位置后,再点击下一张关键帧会把面板拉回默认位置,造成视觉疲劳。
改动:已打开的面板只切换内容,不移动位置;只有面板不存在、首次打开时才放到默认位置并自动聚焦。
影响:web/app/page.tsx;关闭后重新打开仍会出现在默认位置。
问题:关键帧详情面板作为画布节点后可以随画布缩放,但面板自身没有尺寸控制,用户无法单独放大或缩小它。
改动:在面板标题栏增加 -、百分比重置、+ 控制,支持 75% 到 135% 的面板级缩放。
影响:web/app/page.tsx、web/components/nodes/index.tsx;点击新关键帧仍会找回到默认位置,缩放比例保留。
问题:关键帧详情 / 元素提取面板固定在左侧 drawer,和 ReactFlow 无限画布割裂,也不会跟随画布缩放。
改动:移除主页面隐藏渲染的 Dashboard drawer 承载方式,新增独立 keyframePanel ReactFlow 节点来挂载 FrameLightbox。
影响:web/app/page.tsx、web/components/nodes/index.tsx;点关键帧后面板默认出现在流程左侧空白画布里,不遮挡 Input / Keyframe 主节点;标题栏可拖动,跟随 ReactFlow 平移和缩放。再次点击关键帧缩略图会把面板找回到默认位置,并自动把视野拉到“关键帧 + 面板”。
问题:元素改造节点的 hover 预览虽然已改为节点内显示,但仍比关键帧节点复杂,多了“来源原帧 / 提取元素”两栏和元素名称,信息过载。
改动:改成和镜头拆解关键帧一致的简单预览:只显示来源原帧,底部显示分镜编号和时间。
影响:web/components/nodes/index.tsx;元素改造板块 hover 现在更轻,不干扰当前判断。
问题:上一版把元素预览用 createPortal 挂到 body,DevTools 里会出现额外 fixed 层,交互形态和关键帧节点不一致。
改动:改成节点内 group-hover 预览,不再向 body 插入预览层。后续又简化为只展示来源原帧,见上方最新记录。
影响:web/components/nodes/index.tsx;元素改造板块的 DOM 和交互效果更接近关键帧缩略图。
目的:把产品功能区、源码位置、接口、数据模型、需求描述方式固定下来,减少“描述不准导致改偏”。
影响:新增 docs/source-analysis.html,不接入 Next 应用,不影响工作台运行。
以后描述:可以直接引用本页的功能区名称、节点职责和源码文件名。
问题:元素改造节点上方小图 hover 没有像镜头拆解节点一样显示原图预览,并且首次修复时出现运行时错误。
原因:节点内部 overflow 裁剪了预览;随后 portal 预览里把变量写成了不存在的 aspectRatio。
影响:web/components/nodes/index.tsx。该记录之后又改为节点内预览,见上方最新记录。
问题:Vision 识别可能错,但元素列表像最终结果;点击提取图会跳页面,打断用户思路。
改动:支持元素改名、改英文提示、改位置、删除元素、重复提取、删除单张提取图;提取图不再用链接跳新页。
影响:FrameLightbox、web/lib/api.ts、PATCH /jobs/{job_id}/frames/{idx}/elements/{element_id}。
问题:从 Storyboard 或顶部分镜条进入编排时,没有明确定位到用户正在看的那一帧。
改动:工作台接受 focusedFrame,点击缩略图会打开工作台并聚焦对应分镜。
影响:page.tsx、StoryboardBar、StoryboardWorkbench、StoryboardNode。
问题:SKG 网关 audio 不通时,视觉解析也容易被标记失败。
改动:analyze 主流程强调拆轨和关键帧,声音文案轨独立处理。
影响:api/main.py、page.tsx、节点语义说明。
以后任何改动只要影响产品理解、节点职责、界面行为、数据模型、API、运行方式或用户操作路径,都要同步更新本页的对应章节和“变更记录”。
| 改动类型 | 必须更新本页哪里 | 原因 |
|---|---|---|
| 节点文案 / 节点功能 | 业务管线、节点职责边界、界面区域到源码、变更记录 | 避免用户按旧节点理解描述需求。 |
| 新增 / 修改接口 | 接口地图、数据模型、变更记录 | 避免前后端契约不清。 |
| 新增数据字段 | 数据模型、源码结构地图、变更记录 | 刷新恢复和 state.json 依赖字段一致。 |
| 改交互路径 | 界面区域到源码、需求描述模板、变更记录 | 用户描述“点击哪里”时必须和真实路径一致。 |
| 修 bug | 变更记录;如果暴露新坑,也更新当前已通与阻塞 | 让后续同类问题能快速定位。 |