diff --git a/.memory/worklog.json b/.memory/worklog.json
index f26f330..3644f0d 100644
--- a/.memory/worklog.json
+++ b/.memory/worklog.json
@@ -1,19 +1,5 @@
{
"entries": [
- {
- "files_changed": 1,
- "hash": "440164e",
- "message": "auto-save 2026-05-12 17:50 (~1)",
- "ts": "2026-05-12T17:51:03+08:00",
- "type": "commit"
- },
- {
- "files_changed": 2,
- "hash": "aa5ad08",
- "message": "auto-save 2026-05-12 18:29 (+1, ~1)",
- "ts": "2026-05-12T18:29:59+08:00",
- "type": "commit"
- },
{
"files_changed": 3,
"hash": "64db093",
@@ -3348,6 +3334,19 @@
"type": "session-heartbeat",
"message": "Claude 会话活跃 · 最近命令:claude · 5 项未提交变更 · 最近提交:auto-save 2026-05-14 06:27 (~4)",
"files_changed": 5
+ },
+ {
+ "ts": "2026-05-14T06:33:37+08:00",
+ "type": "commit",
+ "message": "auto-save 2026-05-14 06:33 (~5)",
+ "hash": "0d86b4c",
+ "files_changed": 5
+ },
+ {
+ "ts": "2026-05-13T22:38:51Z",
+ "type": "session-heartbeat",
+ "message": "Codex 会话活跃 · 最近命令:codex · 3 项未提交变更 · 最近提交:auto-save 2026-05-14 06:33 (~5)",
+ "files_changed": 3
}
]
}
diff --git a/docs/source-analysis.html b/docs/source-analysis.html
index d043fc7..357078d 100644
--- a/docs/source-analysis.html
+++ b/docs/source-analysis.html
@@ -623,7 +623,7 @@ api/main.py
你看到的区域关键帧素材审核面板
-
主要源码FrameLightbox;按“原图/清洗、主体资产、场景图、审核”四个页签组织;左侧只放主图/框选画布,但主体资产页左侧改为全部参考帧网格;右侧承载当前页操作、状态和结果;主体资产页只确认一个统一主体,默认用全部关键帧或已选关键帧作为参考,后端按参考重绘六张纯背景、占满画面的标准站立主体图;场景图依赖主体资产,按当前关键帧生成去主体原场景、相似新场景或同构换风格。相关接口包括 cleanupFrame、addElement、generateSubjectAssets、generateSceneAsset。
+
主要源码FrameLightbox;按“原图/清洗、主体资产、场景图、审核”四个页签组织;左侧只放主图/框选画布,但主体资产页左侧改为全部已清洗/已选参考帧网格,场景图页左侧显示全部关键帧并可勾选场景参考;右侧承载当前页操作、状态和结果。主体资产页只确认一个统一主体,后端按参考重绘六张纯背景、占满画面的标准站立主体图;场景图依赖主体资产,右侧通过地点、生成方式、风格和参考要素拼出可编辑 prompt,再按当前关键帧生成去主体原场景、相似新场景或同构换风格。相关接口包括 cleanupFrame、addElement、generateSubjectAssets、generateSceneAsset。
适合怎么描述“这一组关键帧如何共同生成一个统一主体包;某张关键帧的水印、去主体场景图和质量风险应该如何审核”。
@@ -731,7 +731,7 @@ SubjectAsset {
| 元素增改删 | 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 | 在统一主体资产之后,按当前关键帧生成去主体背景板;请求包含 scene_mode 和 scene_style,可做原场景补背景、相似新场景或同构换风格,保留历史版本用于人工审核。 |
+
| 场景资产 | POST /frames/{idx}/scene-asset | generateSceneAsset | 在统一主体资产之后,按当前关键帧生成去主体背景板;请求包含 scene_mode、scene_style、prompt 和 source_frame_indices,可用左侧选择的参考帧 + 右侧关键词生成原场景补背景、相似新场景或同构换风格,保留历史版本用于人工审核。 |
| 分镜保存 | PUT /frames/{idx}/storyboard | updateStoryboard | 保存 4 图槽、时长和改造说明。 |
| 生图 | POST /frames/{idx}/generate | generateImage | 基于关键帧或已选生成图做 image-to-image,目前可用。 |
@@ -841,6 +841,19 @@ SubjectAsset {
变更记录
这个记录不是 git log 的替代品。它记录“产品理解发生了什么变化、影响了哪些源码、你以后描述需求时该怎么说”。后续每次改功能都要补一条。
+
+
+ 2026-05-14 · 场景图改为全图参考和关键词 Prompt
+ FrameLightbox
+ Prompt
+
+
+
问题:场景图页不能只围绕当前单张图;它需要看到全部关键帧,并通过地点、风格、参考要素等关键词组合出可控 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。
+
+
2026-05-14 · 主体资产改为参考重绘六张标准图
@@ -849,7 +862,7 @@ SubjectAsset {
问题:主体资产不是抠图,也不是只看当前单帧生成多角度;主体页需要看到全部参考帧,并用这些参考重新绘制一个完整主体。
-
改动:FrameLightbox 在“主体资产”页左侧显示全部参考帧网格,小图排列,可点击切换当前帧;右侧仍负责统一主体确认和生成。人物/生物默认视图改为六张标准站立/转身图:正面、背面、左侧、右侧、左前 45°、右前 45°。
+
改动:FrameLightbox 在“主体资产”页左侧显示参考帧网格,优先纳入所有已清洗帧,额外已选帧也会并入;小图排列,可点击切换当前帧。右侧仍负责统一主体确认和生成。人物/生物默认视图改为六张标准站立/转身图:正面、背面、左侧、右侧、左前 45°、右前 45°。
后端:generateSubjectAssets prompt 改为“参考重绘”,明确禁止裁剪/抠图/粘贴源像素,要求主体完整居中、纯白/黑背景、无其他元素,并占画面约 85-95% 高度;落盘时会裁掉纯背景空白并放大主体。
影响:web/components/lightbox.tsx、web/components/nodes/index.tsx、api/main.py、docs/source-analysis.html。
diff --git a/web/components/lightbox.tsx b/web/components/lightbox.tsx
index 8406f07..d2d59ea 100644
--- a/web/components/lightbox.tsx
+++ b/web/components/lightbox.tsx
@@ -42,6 +42,27 @@ const LIVING_VIEW_OPTIONS = [
["three_quarter_right", "右前 45°"],
]
+const LIVING_EXPRESSION_OPTIONS = [
+ ["expression_neutral", "中性脸"],
+ ["expression_smile", "微笑"],
+ ["expression_happy", "开心"],
+ ["expression_serious", "严肃"],
+ ["expression_surprised", "惊讶"],
+]
+
+const LIVING_ACTION_OPTIONS = [
+ ["action_walk", "走路"],
+ ["action_turn", "转身"],
+ ["action_hold", "手持"],
+ ["action_use", "使用"],
+]
+
+const LIVING_VIEW_GROUPS = [
+ { title: "身份标准图", hint: "默认必出 · 用来锁定长相、体型、服装和比例", options: LIVING_VIEW_OPTIONS },
+ { title: "表情补充", hint: "需要口播、反应或情绪镜头时再勾", options: LIVING_EXPRESSION_OPTIONS },
+ { title: "动作补充", hint: "需要动作镜头时再勾,仍保持同一人物身份", options: LIVING_ACTION_OPTIONS },
+]
+
type LightboxTab = "clean" | "scene" | "subject" | "review"
const LIGHTBOX_TABS: Array<{ key: LightboxTab; label: string }> = [
@@ -550,6 +571,8 @@ export function FrameLightbox({ jobId, frames, activeIndex, selected, onClose, o
className="flex flex-col items-stretch gap-2 overflow-y-auto pr-1"
style={isSubjectTab
? { flex: "1 1 360px", minWidth: 220, maxWidth: 460, minHeight: 0 }
+ : isSceneTab
+ ? { flex: "1 1 430px", minWidth: 280, maxWidth: 560, minHeight: 0 }
: isCleanTab
? { flex: "1 1 500px", minWidth: 300, maxWidth: 600, minHeight: 0 }
: { flex: "1 1 560px", minWidth: 300, maxWidth: 680, minHeight: 0 }}
@@ -606,6 +629,76 @@ export function FrameLightbox({ jobId, frames, activeIndex, selected, onClose, o
这些参考帧会一起传给模型,用来重绘同一个主体;不是逐张抠图。
+ ) : isSceneTab ? (
+
+
+
场景参考图
+
+ {selectedFrameIndices.length > 0 ? `${selectedFrameIndices.length} 已选参考` : "默认当前帧"}
+
+
+
+ {frames.map((frame) => {
+ const active = frame.index === f.index
+ const checked = selected.has(frame.index)
+ return (
+
+
+
+ {frame.timestamp.toFixed(2)}s
+
+
+
+ )
+ })}
+
+
+ 左侧显示全部关键帧;点图片设为生成目标,点“选”加入场景参考。未选择时默认只参考当前目标帧。
+
+
) : (
@@ -817,12 +910,24 @@ export function FrameLightbox({ jobId, frames, activeIndex, selected, onClose, o
-
- 先用多张关键帧生成统一主体资产,再按当前关键帧去除主体并补全空场景;之后可生成相似新场景或同构换风格场景。
-
-
-
+
+ 额外关键词
+ setSceneExtraKeywords(e.target.value)}
+ placeholder="例如:玻璃、金属、夜景"
+ className="w-full rounded border border-white/10 bg-black/35 px-1.5 py-1 text-[10px] text-white/75 outline-none placeholder:text-white/25"
+ />
+
+
+
+
参考要素
+
+ {SCENE_REFERENCE_OPTIONS.map(([value, label]) => {
+ const active = sceneReferenceKeys.includes(value)
+ return (
+
+ )
+ })}
+
+
+
+
+ 场景 prompt
+
+
+
+ {!hasSubjectAssets && (
还没有主体资产。先在“主体资产”页生成主体图,场景图才能更准确地去主体和补背景。