diff --git a/.memory/worklog.json b/.memory/worklog.json
index 11b30ff..f5f714f 100644
--- a/.memory/worklog.json
+++ b/.memory/worklog.json
@@ -1,19 +1,5 @@
{
"entries": [
- {
- "files_changed": 1,
- "hash": "1e4fd9e",
- "message": "auto-save 2026-05-13 07:15 (~1)",
- "ts": "2026-05-13T07:15:32+08:00",
- "type": "commit"
- },
- {
- "files_changed": 1,
- "hash": "2a5f1dd",
- "message": "auto-save 2026-05-13 07:21 (~1)",
- "ts": "2026-05-13T07:21:25+08:00",
- "type": "commit"
- },
{
"files_changed": 1,
"hash": "92794f6",
@@ -3281,6 +3267,19 @@
"type": "session-heartbeat",
"message": "Codex 会话活跃 · 最近命令:codex · 3 项未提交变更 · 最近提交:auto-save 2026-05-14 13:04 (+1, ~3)",
"files_changed": 3
+ },
+ {
+ "ts": "2026-05-14T13:10:42+08:00",
+ "type": "commit",
+ "message": "auto-save 2026-05-14 13:10 (~5)",
+ "hash": "646f945",
+ "files_changed": 5
+ },
+ {
+ "ts": "2026-05-14T05:16:11Z",
+ "type": "session-heartbeat",
+ "message": "Codex 会话活跃 · 最近命令:codex · 3 项未提交变更 · 最近提交:auto-save 2026-05-14 13:10 (~5)",
+ "files_changed": 3
}
]
}
diff --git a/docs/source-analysis.html b/docs/source-analysis.html
index 658473d..5390203 100644
--- a/docs/source-analysis.html
+++ b/docs/source-analysis.html
@@ -941,7 +941,7 @@ SubjectAsset {
问题:产品融合不能只写“人物使用产品”,还要稳定控制出场方式、景别、运镜、产品入画、佩戴贴合、使用感受和收尾;同时 SKG 产品是颈部/肩颈按摩仪,比例和佩戴位置不能跑偏。
-
改动:前端内置 36 条产品融合镜头语言模板,6 条为一组,对应建立出场、产品入画、佩戴贴合、使用感受、生活延展和收尾记忆;产品融合页新增“换一组”按钮,只刷新 6 行描述词,不改变首帧、尾帧和视频结果。视频 prompt 额外写入颈部/后颈/颈肩使用部位和真实尺寸比例约束。
+
改动:前端内置 36 条产品融合镜头语言模板,6 条为一组,对应建立出场、产品入画、佩戴贴合、使用感受、生活延展和收尾记忆;产品融合页新增“换一组”按钮,只刷新 6 行描述词,不改变已选角色和视频结果。视频 prompt 额外写入颈部/后颈/颈肩使用部位和真实尺寸比例约束。
影响:web/components/lightbox.tsx、web/app/page.tsx、docs/source-analysis.html。
diff --git a/web/components/lightbox.tsx b/web/components/lightbox.tsx
index 2adea17..194018e 100644
--- a/web/components/lightbox.tsx
+++ b/web/components/lightbox.tsx
@@ -5,7 +5,7 @@ import { X, ChevronLeft, ChevronRight, Check, Sparkles, Wand2, Loader2, Eye, Ref
import {
frameUrl, cleanedFrameUrl, apiAssetUrl,
describeFrame, cleanupFrame, applyCleanedFrame, discardCleanedFrame, addElement, updateElement, deleteElement,
- generateSceneAsset, generateSubjectAssets, resolveImageRefUrl, updateStoryboard, copyProductLibraryAsset,
+ generateSceneAsset, generateSubjectAssets, updateStoryboard, copyProductLibraryAsset,
listCharacterLibrary, copyCharacterLibraryAssets, characterLibraryImageUrl,
type AssetBackground, type AssetSize, type CharacterLibraryItem, type KeyFrame, type Job, type ImageRef, type ProductFusionShot, type SceneAssetRole, type SceneStyle, type SubjectKind,
} from "@/lib/api"
@@ -194,6 +194,56 @@ const PRODUCT_FUSION_DESCRIPTION_PRESETS = [
"备用30|舒适微表情|佩戴稳定后,透明骨架人眼神变柔和、嘴角轻扬,肩颈线条放松;镜头从产品细节回到脸部,保持广告级质感。",
]
+const CHARACTER_PROMPT_PROFILES: Record = {
+ "character-01": {
+ name: "运动阳光男",
+ subject: "清爽运动阳光男透明骨架人,身形挺拔、年轻有活力,整体气质健康明亮",
+ scenes: "晨练后卧室、阳台休息区、明亮健身房休息长椅或运动后居家放松场景",
+ usage: "运动后双手拿起 SKG,准确戴到后颈和颈肩交界处,轻按侧边控制区并微调贴合",
+ enjoyment: "从运动后的颈肩紧绷变成轻松舒展,闭眼深呼吸、肩部下沉、露出阳光放松微笑",
+ },
+ "character-02": {
+ name: "都市型男",
+ subject: "都市通勤型男透明骨架人,穿搭利落,高层公寓和商务感更强",
+ scenes: "高层公寓客厅、办公桌、商务休息区、夜晚城市窗边或会议间隙",
+ usage: "久坐办公后从桌面拿起 SKG,戴到后颈,手指轻按按键,让产品稳定贴合颈肩",
+ enjoyment: "从低头疲惫、揉脖子变为靠回椅背放松,眼神平静、嘴角微扬,呈现高效恢复感",
+ },
+ "character-03": {
+ name: "优雅白领女",
+ subject: "优雅白领女透明骨架人,姿态端正、干净精致,商业广告感更高级",
+ scenes: "办公室午休区、极简卧室、化妆镜前、柔和落地窗旁或精致公寓客厅",
+ usage: "工作间隙优雅拿起 SKG,轻放到后颈,双手细致调整两端贴合,动作慢而自然",
+ enjoyment: "从肩颈紧绷转为安静舒缓,闭眼微笑、呼吸放慢,呈现精致、自洽、舒服的状态",
+ },
+ "character-04": {
+ name: "运动辣妹",
+ subject: "运动辣妹透明骨架人,线条利落、活力强,适合健身后和生活方式广告",
+ scenes: "健身房更衣区、瑜伽垫旁、阳光客厅、运动后休息区或浴室镜前",
+ usage: "训练后拿起 SKG 戴到后颈,侧头伸展时保持产品稳定贴合,手部不遮挡产品轮廓",
+ enjoyment: "从训练后的酸胀紧绷变为轻松舒展,闭眼享受、肩颈打开,表情自信舒服",
+ },
+ "character-05": {
+ name: "绅士大叔",
+ subject: "成熟绅士大叔透明骨架人,气质稳重高级,适合书房、客厅和商务休息场景",
+ scenes: "木质书房、皮质休闲椅、安静客厅、窗边阅读角或商务酒店房间",
+ usage: "阅读或工作后从桌边拿起 SKG,稳稳戴到后颈,轻扶两端调整到颈肩正确位置",
+ enjoyment: "从沉稳疲惫变为从容舒适,缓慢闭眼、肩部放松、轻轻微笑,表达成熟克制的享受",
+ },
+}
+
+const fusionDescriptionForCharacter = (characterId: string, presetIndex: number) => {
+ const base = PRODUCT_FUSION_DESCRIPTION_PRESETS[presetIndex % PRODUCT_FUSION_DESCRIPTION_PRESETS.length]
+ const profile = CHARACTER_PROMPT_PROFILES[characterId] ?? CHARACTER_PROMPT_PROFILES[DEFAULT_CHARACTER_ID]
+ return [
+ base,
+ `角色设定:${profile.subject}。`,
+ `场景倾向:${profile.scenes}。`,
+ `产品使用:${profile.usage};产品只能在脖子、后颈、颈肩交界处使用,尺寸必须符合真实颈部按摩仪比例。`,
+ `享受状态:${profile.enjoyment};不要医疗治疗承诺,不要恐怖解剖感。`,
+ ].join("\n")
+}
+
const legacyFusionDescriptionSet = new Set(LEGACY_PRODUCT_FUSION_DESCRIPTION_PRESETS)
const shouldUseDefaultFusionDescription = (value?: string | null) => {
const text = value?.trim()