diff --git a/lib/prompts/novel-promotion/prop_description_update.en.txt b/lib/prompts/novel-promotion/prop_description_update.en.txt new file mode 100644 index 0000000..0363f27 --- /dev/null +++ b/lib/prompts/novel-promotion/prop_description_update.en.txt @@ -0,0 +1,31 @@ +You are a prop asset description editor. + +Task: +Update the visual prop description based on the user's image-edit instruction. + +Prop name: +{prop_name} + +Original description: +{original_description} + +User instruction: +{modify_instruction} + +Reference image context (may be empty): +{image_context} + +Rules: +1. Describe only the prop itself. No usage, plot function, character action, camera direction, or scene background. +2. Preserve unchanged structure, material, color, and decorative details unless explicitly modified. +3. If reference images are provided, absorb their material, silhouette, pattern, and color cues. +4. The result must be suitable for an isolated prop asset sheet on a white background. +5. Include the prop's core structure, material, color, surface finish, decorative details, and quantity relationship when relevant. +6. Do not mention people, hands, tables, rooms, environment, atmosphere, or story purpose. +7. Return one concise English visual description. + +Output format: +Return JSON only. ⚠️ JSON SAFETY: All quotation marks MUST be converted to corner brackets「」in JSON string values: +{ + "prompt": "updated prop visual description" +} diff --git a/lib/prompts/novel-promotion/prop_description_update.zh.txt b/lib/prompts/novel-promotion/prop_description_update.zh.txt new file mode 100644 index 0000000..7536092 --- /dev/null +++ b/lib/prompts/novel-promotion/prop_description_update.zh.txt @@ -0,0 +1,30 @@ +你是一个专业的道具资产描述更新专家。 + +【任务】 +根据用户对道具图片的修改,更新道具的视觉描述词。 + +【道具名称】 +{prop_name} + +【原始道具描述】 +{original_description} + +【用户修改指令】 +{modify_instruction} + +{image_context} + +【更新规则】 +1. 只描述道具本体的静态视觉信息,不写用途、剧情、角色动作、镜头、背景环境。 +2. 优先保留原描述里未被修改的结构、材质、颜色和装饰细节。 +3. 如果有参考图片,请吸收参考图中的材质、轮廓、纹样、配色等关键视觉特征。 +4. 输出必须适合白底居中的道具资产图生成。 +5. 必须明确道具的主体结构、材质、颜色、表面处理、装饰细节和数量关系。 +6. 禁止出现人物、手部、桌面、房间、场景、光影氛围、剧情用途等信息。 +7. 使用中文输出,长度 40-100 字。 + +【输出格式】 +只返回 JSON,禁止返回任何其他内容。⚠️ 所有引号(""''等)在 JSON 字符串值中必须替换为「」,严禁出现未转义的英文双引号 ": +{ + "prompt": "更新后的道具视觉描述" +} diff --git a/lib/prompts/novel-promotion/select_prop.en.txt b/lib/prompts/novel-promotion/select_prop.en.txt index 29c2c55..d4f9969 100644 --- a/lib/prompts/novel-promotion/select_prop.en.txt +++ b/lib/prompts/novel-promotion/select_prop.en.txt @@ -3,14 +3,15 @@ You are a key story prop extractor. Task: identify only key props from the input text for an asset library that must preserve visual consistency across repeated appearances. Be conservative. Return JSON only. Core definition of a prop: -A prop is a physical object that can exist independently of any specific scene and appears across multiple scenes or timelines. An object qualifies as a prop asset only if a character can "take it away" or "move it to another scene". Most stories have very few props, or even none at all. +A prop is a physical object that can exist independently of any specific scene and appears across multiple scenes or timelines. An object qualifies as a prop asset only if a character can "take it away" or "move it to another scene", and the text provides explicit evidence that the same object is persistently carried, reused, or repeatedly referenced. Most stories have very few props, or even none at all. Output format: { "props": [ { "name": "prop name", - "summary": "one-line objective prop description" + "summary": "short human-readable prop summary", + "description": "pure visual description for image generation" } ] } @@ -18,11 +19,15 @@ Output format: Key prop criteria: 1. It must be a real physical object that actually appears in the story. 2. It must be portable — capable of being carried, transferred, or removed from its current scene by a character. -3. It must reappear across multiple scenes or timelines, requiring a consistent visual design. +3. There must be explicit textual evidence that it reappears across multiple scenes or timelines and needs a consistent visual design. Do not infer future recurrence from common sense. 4. It must satisfy at least one of the following: - characters hold it, use it, fight over it, deliver it, hide it, lose it, or search for it - it is a key tool, weapon, artifact, piece of evidence, token, key, or clue carrier - - removing it would materially weaken plot comprehension or a key action + - it is a long-term personal item, recurring special equipment, or recurring vehicle tied to a character +5. It must also satisfy at least one uniqueness/continuity condition: + - the object has a non-replaceable identity: ancestral, custom-made, unique, magical, numbered, damaged in a distinctive way, or visually singular + - the text clearly shows the same object reappearing at multiple times or in multiple scenes + - the text clearly shows a character carrying, relying on, or repeatedly searching for the same object over time Strictly exclude: 1. Ordinary background items, furniture, tableware, food, drinks, daily necessities, and decorations. @@ -32,6 +37,8 @@ Strictly exclude: 5. Abstract concepts, emotions, powers, roles, places, creatures, and body parts. 6. Scene-fixed facilities — objects that are part of or built into a scene, even if they participate in the plot (e.g. a hacked computer, a smashed window, a fireplace on fire). If the object physically belongs to the scene and cannot be taken away by a character, it is not a prop. These are "scene states" and should be handled by scene descriptions. 7. Scene-standard equipment — if an object is the default fixture of its scene type (a computer in a computer room, a stove in a kitchen, bookshelves in a library, instruments in a lab, screens in a monitoring room), do not extract it. +8. Ordinary replaceable items — even if briefly used by a character, if the story would still work with another generic item of the same kind, it is not a prop. Examples: a fork in a restaurant, a glass on a table, a pen on a desk, a generic phone, a generic umbrella, a generic suitcase, a generic book. +9. One-off action items — if an object is used in only one scene for one action and there is no explicit evidence that it recurs later, do not output it. Decision bias: 1. A specific-looking noun is not enough; it must have an explicit story function. @@ -40,27 +47,37 @@ Decision bias: 4. If you are unsure whether it deserves an asset entry, do not output it. 5. Prefer under-extraction. Never output props just to increase the count. 6. Portability test: ask yourself "Can a character put this in their pocket, bag, or car and take it to another scene?" If not, do not output it. +7. Replaceability test: ask yourself "If this were swapped for another ordinary object of the same type, would the story still work?" If yes, do not output it. +8. Continuity test: if the text does not explicitly prove later recurrence or long-term ownership, do not output it. +9. Typical scene items such as a restaurant fork, a wine glass on a table, a lamp in a room, or an office computer should default to not output. Example judgements (to calibrate your standard): ✅ Extract: a revolver the character carries at all times (cross-scene, portable) ✅ Extract: an evidence envelope (discovered, handed over, appears in multiple scenes) ✅ Extract: a time-manipulating watch worn by the protagonist (core prop, present throughout) ✅ Extract: a black SUV driven by the protagonist (cross-scene transport) +✅ Extract: an ancestral bronze dagger (unique identity, recurring, not replaceable by an ordinary object) ❌ Skip: a computer in a computer room (scene-fixed facility) ❌ Skip: a hacked computer displaying key clues (state change of a scene facility, not portable) ❌ Skip: a surveillance monitor in a monitoring room (scene-fixed facility) ❌ Skip: a refrigerator in a kitchen (scene-standard equipment) ❌ Skip: a rare book in a library (unless the character takes it away and uses it in another scene) +❌ Skip: a fork in a restaurant (ordinary replaceable tableware, even if a character uses it to eat) +❌ Skip: a wine glass on the table (single-scene ordinary object without continuity) +❌ Skip: a standard office laptop (ordinary equipment, not a recurring unique prop) Output rules: -1. Only output `name` and `summary`. -2. `name` and `summary` must both be non-empty. +1. Only output `name`, `summary`, and `description`. +2. `name`, `summary`, and `description` must all be non-empty. 3. Do not repeat props that already exist in the prop library with the exact same name. 4. Keep names stable and short. -5. Keep summaries objective. -6. Usually output no more than 3 props unless more are clearly all key props. -7. If none exist, return {"props": []}. Returning an empty array is correct in most cases. -8. Replace raw quotation marks inside JSON string values with corner brackets「」. +5. `summary` is for humans only. Keep it short and objective. Do not mention plot function, repeated appearances, character interaction, or camera language. +6. `description` is for image generation only. Keep it purely visual: material, color, shape, structure, quantity relationship, decorative detail. Do not mention usage, plot, action, people, hands, tables, environment, or background. +7. If `summary` or `description` contains phrases like "appears multiple times", "used by the character", "drives the plot", or "in the frame", it is invalid. +8. Usually output no more than 3 props unless more are clearly all key props. +9. If none exist, return {"props": []}. Returning an empty array is correct in most cases. +10. Replace raw quotation marks inside JSON string values with corner brackets「」. +11. It is better to miss borderline candidates than to misclassify ordinary scene items as props. Input: {input} diff --git a/lib/prompts/novel-promotion/select_prop.zh.txt b/lib/prompts/novel-promotion/select_prop.zh.txt index a39b3d0..ea4388a 100644 --- a/lib/prompts/novel-promotion/select_prop.zh.txt +++ b/lib/prompts/novel-promotion/select_prop.zh.txt @@ -3,14 +3,15 @@ 任务:从输入文本中只识别【关键道具】,用于建立需要长期保持外观一致的资产库。宁缺毋滥。只返回 JSON,不得包含任何额外解释或 markdown。 道具的核心定义: -道具是可以脱离特定场景独立存在的、跨场景/跨时间线出现的实体物件。一个物件必须能被角色「带走」或「转移到另一个场景」,才有资格成为道具资产。大部分故事中道具数量非常少,甚至为零。 +道具是可以脱离特定场景独立存在的、跨场景/跨时间线出现的实体物件。一个物件必须能被角色「带走」或「转移到另一个场景」,并且在文本中有明确证据表明它会被持续持有、反复使用、反复提及,才有资格成为道具资产。大部分故事中道具数量非常少,甚至为零。 输出格式: { "props": [ { "name": "道具名称", - "summary": "一句话描述道具的外观/用途" + "summary": "给人阅读的简短道具说明", + "description": "用于生成图片的纯视觉描述" } ] } @@ -18,11 +19,15 @@ 关键道具判定标准: 1. 必须是剧情中真实出现的实体物件。 2. 必须是可移动的——能够被角色携带、转移、带离当前场景。 -3. 必须跨场景或跨时间线重复出现,且需要保持外观一致。 +3. 必须有明确文本证据表明它跨场景或跨时间线重复出现,且需要保持外观一致;禁止凭常识猜测它以后还会出现。 4. 必须至少满足以下一种情况: - 被角色持有、使用、争夺、交付、隐藏、丢失、寻找 - 是推进情节的关键工具、武器、法器、证物、信物、钥匙、线索载体 - - 去掉它会明显影响剧情理解或关键动作成立 + - 是角色长期携带或反复回收使用的专属物件、独特装备、特殊交通工具 +5. 必须同时满足以下至少一条“唯一性/持续性”条件,否则不输出: + - 物件具有不可替代的独特身份,例如祖传、特制、唯一、带特殊能力、带特殊机关、带独特编号/纹样/损伤 + - 文本明确表明同一件物品在多个场景/多个时间点反复出现 + - 文本明确表明角色长期随身携带、持续依赖或反复寻找同一件物品 严格不提取: 1. 普通背景陈设、家具、餐具、食物、饮料、日用品、装饰物。 @@ -32,6 +37,8 @@ 5. 抽象概念、情绪、能力、身份、地点、生物、身体部位。 6. 场景固有设施——物件是某个场景的组成部分或内置设备,即便它参与了剧情互动(如被黑客入侵的电脑、被砸碎的窗户、着火的壁炉),只要它在物理上依附于场景、无法被角色带走,就不是道具。这类属于"场景状态",由场景描述承载。 7. 场景常规配置——如果一个物件是该类场景的标配(电脑房的电脑、厨房的灶台、图书馆的书架、实验室的仪器、监控室的屏幕),直接不提取。 +8. 普通可替换物件——即使它被角色短暂使用,只要换成同类另一件物品剧情仍成立,就不是道具。例如餐厅里的叉子、桌上的杯子、办公桌上的笔、本子、普通手机、普通雨伞、普通行李箱、普通书籍。 +9. 一次性动作依赖物件——如果它只在单个场景里承担一次动作功能,没有明确后续复现证据,不输出。 判断倾向: 1. 仅因外观具体、名词明确,不足以成为关键道具;必须有明确剧情作用。 @@ -40,27 +47,37 @@ 4. 如果不确定它是否值得进入资产库,直接不输出。 5. 优先少报,禁止为了凑数量而输出。 6. 可移动性测试:问自己"角色能把它装进口袋/背包/车里带到另一个场景吗?"如果不能,不输出。 +7. 可替换性测试:问自己"把它替换成同类另一件普通物品,剧情是否仍然成立?"如果答案是“成立”,不输出。 +8. 贯穿性测试:如果文本没有明确证据证明它会在后续再次出现或被长期持有,默认不输出。 +9. 对“餐厅里的叉子、桌上的酒杯、房间里的台灯、办公室里的电脑”这类典型场景内物件,一律默认不输出。 示例判断(帮助校准标准): ✅ 应提取:角色随身携带的左轮手枪(跨场景出现、可移动) ✅ 应提取:关键证物信封(被发现、传递、多场景出现) ✅ 应提取:主角可操控时间的手表(核心道具,贯穿全剧) ✅ 应提取:主角驾驶的黑色越野车(跨场景移动工具) +✅ 应提取:祖传青铜短剑(独特身份,反复出现,无法被普通物件替代) ❌ 不提取:电脑房里的电脑(场景固有设施) ❌ 不提取:被黑客入侵、显示关键线索的电脑(场景设施的状态变化,不可移动) ❌ 不提取:监控室的监控屏幕(场景固有设施) ❌ 不提取:厨房的冰箱(场景常规配置) ❌ 不提取:图书馆的某本古籍(除非角色将它取走带到其他场景使用) +❌ 不提取:餐厅里的叉子(普通可替换餐具,即使角色拿它吃饭或短暂拿在手里) +❌ 不提取:桌上的红酒杯(单场景普通物件,不具备贯穿性) +❌ 不提取:办公室里的普通笔记本电脑(普通设备,场景配置) 输出要求: -1. 只输出两个字段:name、summary。 -2. name 不能为空;summary 不能为空。 +1. 只输出三个字段:name、summary、description。 +2. name、summary、description 都不能为空。 3. 如果道具库里已经有完全同名道具,不要重复输出。 4. 名称尽量简洁稳定,例如"青铜匕首""录音笔""红绳手链"。 -5. summary 只写客观描述,不写剧情推断。 -6. 通常不超过 3 个;只有确实都是关键道具时才可更多。 -7. 如果没有合适道具,返回 {"props": []}。绝大多数情况下返回空数组是正确的。 -8. JSON 字符串值中的引号统一替换为「」。 +5. summary 只给人阅读,简短说明这是一个什么道具;禁止写剧情作用、使用过程、出现频次、角色互动、镜头描述。 +6. description 只写图片生成所需的静态视觉信息;只允许写材质、颜色、形状、结构、数量关系、装饰细节;禁止写用途、剧情、动作、人物、手部、桌面、环境、背景。 +7. 如果 summary 或 description 中出现"多次出现""被角色使用""推进剧情""在画面中"这类语义,视为错误,禁止输出。 +8. 通常不超过 3 个;只有确实都是关键道具时才可更多。 +9. 如果没有合适道具,返回 {"props": []}。绝大多数情况下返回空数组是正确的。 +10. JSON 字符串值中的引号统一替换为「」。 +11. 宁可漏掉边缘候选,也不要把场景里的普通物件误报为道具。 输入文本: {input} diff --git a/messages/en/assetModal.json b/messages/en/assetModal.json index 62c4338..da7f5ed 100644 --- a/messages/en/assetModal.json +++ b/messages/en/assetModal.json @@ -55,8 +55,10 @@ "title": "New Prop", "name": "Prop Name", "namePlaceholder": "Enter prop name", - "summary": "Prop Description", - "summaryPlaceholder": "Describe the prop..." + "summary": "Summary", + "summaryPlaceholder": "One-line human summary of the prop, without plot usage...", + "description": "Image Description", + "descriptionPlaceholder": "Describe only the prop itself: material, color, structure, and decoration..." }, "artStyle": { "title": "Art Style" diff --git a/messages/en/assetPicker.json b/messages/en/assetPicker.json index cbbc592..ff7fc2b 100644 --- a/messages/en/assetPicker.json +++ b/messages/en/assetPicker.json @@ -10,10 +10,10 @@ "appearances": "appearances", "images": "images", "cancel": "Cancel", - "confirmCopy": "Confirm Copy", - "copyFromGlobal": "Copy from Asset Hub", - "copySuccess": "Copy successful", - "copyFailed": "Copy failed", + "confirmCopy": "Confirm Import", + "copyFromGlobal": "Import from Asset Hub", + "copySuccess": "Import successful", + "copyFailed": "Import failed", "preview": "Preview", "stop": "Stop" } diff --git a/messages/en/assets.json b/messages/en/assets.json index af780ec..6a5be9a 100644 --- a/messages/en/assets.json +++ b/messages/en/assets.json @@ -58,7 +58,7 @@ "characterCount": "{count} Characters", "updateFailed": "Update description failed", "addFailed": "Add character failed", - "copyFromGlobal": "Copy from Asset Hub" + "copyFromGlobal": "Import from Asset Hub" }, "location": { "add": "Add Location", @@ -83,7 +83,9 @@ "deleteFailed": "Delete failed: {error}", "name": "Prop Name", "summary": "Summary", - "summaryPlaceholder": "Describe the prop", + "summaryPlaceholder": "One-line human summary of the prop, without plot usage", + "description": "Image Description", + "descriptionPlaceholder": "Describe only the prop itself: material, color, structure, and decoration", "regenerateImage": "Regenerate", "addFailed": "Add prop failed" }, @@ -171,8 +173,10 @@ "scenePrompt": "Scene Description Prompt", "appearancePrompt": "Appearance Description Prompt", "smartModify": "Smart Modify", + "modifyDescription": "AI Modify Description", "modifyPlaceholder": "e.g.: Change to night, add moonlight, add curtains...", "modifyPlaceholderCharacter": "e.g.: Change hair to blonde, height to 180cm, wear black suit...", + "modifyPlaceholderProp": "e.g.: change to brushed silver, add carvings to the handle, remove ruby decoration...", "modifying": "Smart modifying...", "modifyFailed": "Modification failed", "editCharacter": "Edit Character", @@ -344,12 +348,15 @@ "imageEdit": { "editCharacterImage": "Edit Character Image", "editLocationImage": "Edit Location Image", + "editPropImage": "Edit Prop Image", "characterLabel": "Character: {name}", "locationLabel": "Location: {name}", + "propLabel": "Prop: {name}", "editInstruction": "Edit Instruction", "subtitle": "Enter an edit instruction and optionally upload reference images", "characterPlaceholder": "Describe what you want to change, e.g.: Change hair to blonde, add glasses, change to casual clothes...", "locationPlaceholder": "Describe what you want to change, e.g.: Add more trees, change to night scene...", + "propPlaceholder": "Describe what you want to change, e.g.: change to brushed silver metal, add carved patterns to the handle, remove gem decoration...", "storyboardPlaceholder": "Describe what you want to change, e.g.: Change background color, adjust character expression...", "noAssetHint": "No assets, click \"Add Asset\" to select", "referenceImages": "Reference Images", diff --git a/messages/en/progress.json b/messages/en/progress.json index 331ca65..ec3014b 100644 --- a/messages/en/progress.json +++ b/messages/en/progress.json @@ -68,6 +68,7 @@ "aiStoryExpand": "AI story expansion", "aiModifyAppearance": "Character description modify", "aiModifyLocation": "Location description modify", + "aiModifyProp": "Prop description modify", "aiModifyShotPrompt": "Shot prompt modify", "analyzeShotVariants": "Shot variant analysis", "aiCreateCharacter": "Project character design", @@ -80,6 +81,7 @@ "assetHubAiDesignLocation": "Asset hub location design", "assetHubAiModifyCharacter": "Asset hub character modify", "assetHubAiModifyLocation": "Asset hub location modify", + "assetHubAiModifyProp": "Asset hub prop modify", "assetHubReferenceToCharacter": "Asset hub reference to character" }, "stage": { diff --git a/messages/zh/assetModal.json b/messages/zh/assetModal.json index 4f50cea..f48a42e 100644 --- a/messages/zh/assetModal.json +++ b/messages/zh/assetModal.json @@ -55,8 +55,10 @@ "title": "新建道具", "name": "道具名称", "namePlaceholder": "请输入道具名称", - "summary": "道具描述", - "summaryPlaceholder": "请输入道具描述..." + "summary": "简要说明", + "summaryPlaceholder": "一句话说明这是什么道具,不写剧情用途...", + "description": "图片描述", + "descriptionPlaceholder": "只写道具本体的材质、颜色、结构和装饰细节..." }, "artStyle": { "title": "画面风格" diff --git a/messages/zh/assetPicker.json b/messages/zh/assetPicker.json index 3e36cec..f1d7758 100644 --- a/messages/zh/assetPicker.json +++ b/messages/zh/assetPicker.json @@ -10,10 +10,10 @@ "appearances": "个形象", "images": "张图片", "cancel": "取消", - "confirmCopy": "确认复制", - "copyFromGlobal": "从资产中心复制", - "copySuccess": "复制成功", - "copyFailed": "复制失败", + "confirmCopy": "确认导入", + "copyFromGlobal": "从资产中心导入", + "copySuccess": "导入成功", + "copyFailed": "导入失败", "preview": "试听", "stop": "停止" } diff --git a/messages/zh/assets.json b/messages/zh/assets.json index a6a7748..11fd99c 100644 --- a/messages/zh/assets.json +++ b/messages/zh/assets.json @@ -58,7 +58,7 @@ "characterCount": "{count} 个角色", "updateFailed": "更新描述失败", "addFailed": "添加角色失败", - "copyFromGlobal": "从资产中心复制" + "copyFromGlobal": "从资产中心导入" }, "location": { "add": "添加场景", @@ -82,8 +82,10 @@ "deleteConfirm": "确定要删除这个道具吗?", "deleteFailed": "删除失败: {error}", "name": "道具名", - "summary": "简要描述", - "summaryPlaceholder": "描述这个道具", + "summary": "简要说明", + "summaryPlaceholder": "一句话说明这是什么道具,不写剧情用途", + "description": "图片描述", + "descriptionPlaceholder": "只写道具本体的材质、颜色、结构和装饰细节", "regenerateImage": "重新生成", "addFailed": "添加道具失败" }, @@ -171,8 +173,10 @@ "scenePrompt": "场景描述提示词", "appearancePrompt": "形象描述提示词", "smartModify": "智能修改", + "modifyDescription": "AI修改描述", "modifyPlaceholder": "例如:改成夜晚,添加月光,增加窗帘...", "modifyPlaceholderCharacter": "例如:把头发改成金色、身高改为180cm、穿黑色西装...", + "modifyPlaceholderProp": "例如:改成磨砂银质、手柄增加雕花、去掉红宝石装饰...", "modifying": "智能修改中...", "modifyFailed": "修改失败", "editCharacter": "编辑角色", @@ -344,12 +348,15 @@ "imageEdit": { "editCharacterImage": "编辑人物图片", "editLocationImage": "编辑场景图片", + "editPropImage": "编辑道具图片", "characterLabel": "人物: {name}", "locationLabel": "场景: {name}", + "propLabel": "道具: {name}", "editInstruction": "修改指令", "subtitle": "输入修改指令,可选择上传参考图片", "characterPlaceholder": "描述你想要修改的内容,例如:把头发改成金色、添加眼镜、换成休闲装...", "locationPlaceholder": "描述你想要修改的内容,例如:添加更多树木、改成夜晚场景...", + "propPlaceholder": "描述你想要修改的内容,例如:改成银色金属材质、刀柄增加雕纹、去掉宝石装饰...", "storyboardPlaceholder": "描述你想要修改的内容,例如:改变背景颜色、调整人物表情...", "noAssetHint": "暂无资产,点击\"添加资产\"选择", "referenceImages": "参考图片", diff --git a/messages/zh/progress.json b/messages/zh/progress.json index a52a52a..0b24b5a 100644 --- a/messages/zh/progress.json +++ b/messages/zh/progress.json @@ -68,6 +68,7 @@ "aiStoryExpand": "AI 故事扩写", "aiModifyAppearance": "角色描述修改", "aiModifyLocation": "场景描述修改", + "aiModifyProp": "道具描述修改", "aiModifyShotPrompt": "镜头提示词修改", "analyzeShotVariants": "镜头变体分析", "aiCreateCharacter": "项目角色设计", @@ -80,6 +81,7 @@ "assetHubAiDesignLocation": "资产库场景设计", "assetHubAiModifyCharacter": "资产库角色修改", "assetHubAiModifyLocation": "资产库场景修改", + "assetHubAiModifyProp": "资产库道具修改", "assetHubReferenceToCharacter": "资产库参考图转角色" }, "stage": { diff --git a/scripts/guards/image-reference-normalization-guard.mjs b/scripts/guards/image-reference-normalization-guard.mjs index dabe372..766c2e6 100644 --- a/scripts/guards/image-reference-normalization-guard.mjs +++ b/scripts/guards/image-reference-normalization-guard.mjs @@ -15,7 +15,8 @@ export const NORMALIZATION_HELPER_ALLOWLIST = new Set([ const ACCEPTED_NORMALIZATION_MARKERS = [ /\bnormalizeReferenceImagesForGeneration\s*\(/, /\bnormalizeToBase64ForGeneration\s*\(/, - /\bgenerateLabeledImageToCos\s*\(/, + /\bgenerateProjectLabeledImageToStorage\s*\(/, + /\bgenerateCleanImageToStorage\s*\(/, ] function fail(title, details = []) { @@ -58,7 +59,7 @@ export function inspectImageReferenceNormalization(relPath, content) { if (!usesGenerationReferenceImages(content)) return [] if (hasNormalizationMarker(content)) return [] return [ - `${relPath} uses resolveImageSourceFromGeneration with referenceImages but does not reference normalizeReferenceImagesForGeneration/normalizeToBase64ForGeneration/generateLabeledImageToCos`, + `${relPath} uses resolveImageSourceFromGeneration with referenceImages but does not reference normalizeReferenceImagesForGeneration/normalizeToBase64ForGeneration/generateProjectLabeledImageToStorage/generateCleanImageToStorage`, ] } diff --git a/src/app/[locale]/profile/components/api-config/provider-card/ProviderAdvancedFields.tsx b/src/app/[locale]/profile/components/api-config/provider-card/ProviderAdvancedFields.tsx index 8e7d7d4..16bfcb2 100644 --- a/src/app/[locale]/profile/components/api-config/provider-card/ProviderAdvancedFields.tsx +++ b/src/app/[locale]/profile/components/api-config/provider-card/ProviderAdvancedFields.tsx @@ -262,8 +262,7 @@ export function ProviderAdvancedFields({
{currentModels.map((model, index) => ( diff --git a/src/app/[locale]/profile/components/api-config/types.ts b/src/app/[locale]/profile/components/api-config/types.ts index cef4ace..e947628 100644 --- a/src/app/[locale]/profile/components/api-config/types.ts +++ b/src/app/[locale]/profile/components/api-config/types.ts @@ -146,6 +146,7 @@ export const PRESET_MODELS: PresetModel[] = [ { modelId: 'veo-3.0-fast-generate-001', name: 'Veo 3.0 Fast', type: 'video', provider: 'google' }, { modelId: 'veo-2.0-generate-001', name: 'Veo 2.0', type: 'video', provider: 'google' }, // 阿里云百炼图生视频模型 + { modelId: 'wan2.7-i2v', name: 'Wan2.7 I2V', type: 'video', provider: 'bailian' }, { modelId: 'wan2.6-i2v-flash', name: 'Wan2.6 I2V Flash', type: 'video', provider: 'bailian' }, { modelId: 'wan2.6-i2v', name: 'Wan2.6 I2V', type: 'video', provider: 'bailian' }, { modelId: 'wan2.5-i2v-preview', name: 'Wan2.5 I2V Preview', type: 'video', provider: 'bailian' }, diff --git a/src/app/[locale]/workspace/[projectId]/modes/novel-promotion/components/AssetsStage.tsx b/src/app/[locale]/workspace/[projectId]/modes/novel-promotion/components/AssetsStage.tsx index bf59db5..18f22b2 100644 --- a/src/app/[locale]/workspace/[projectId]/modes/novel-promotion/components/AssetsStage.tsx +++ b/src/app/[locale]/workspace/[projectId]/modes/novel-promotion/components/AssetsStage.tsx @@ -463,7 +463,7 @@ export default function AssetsStage({ onRegenerateGroup={handleRegenerateLocationGroup} onUndo={handleUndoLocation} onImageClick={setPreviewImage} - onImageEdit={(locId, imgIdx) => handleOpenLocationImageEdit(locId, imgIdx)} + onImageEdit={(locId, imgIdx) => handleOpenLocationImageEdit(locId, imgIdx, 'location')} onCopyFromGlobal={handleCopyLocationFromGlobal} filterIds={episodeAssetIds?.locIds ?? null} /> @@ -488,7 +488,7 @@ export default function AssetsStage({ void propAssetActions.revertRender({ id: propId }).catch(() => undefined) }} onImageClick={setPreviewImage} - onImageEdit={() => undefined} + onImageEdit={(propId, imgIdx) => handleOpenLocationImageEdit(propId, imgIdx, 'prop')} onCopyFromGlobal={handleCopyPropFromGlobal} filterIds={episodeAssetIds?.propIds ?? null} /> diff --git a/src/app/[locale]/workspace/[projectId]/modes/novel-promotion/components/WorkspaceAssetLibraryModal.tsx b/src/app/[locale]/workspace/[projectId]/modes/novel-promotion/components/WorkspaceAssetLibraryModal.tsx index 4478988..c9e3cc3 100644 --- a/src/app/[locale]/workspace/[projectId]/modes/novel-promotion/components/WorkspaceAssetLibraryModal.tsx +++ b/src/app/[locale]/workspace/[projectId]/modes/novel-promotion/components/WorkspaceAssetLibraryModal.tsx @@ -57,7 +57,7 @@ export default function WorkspaceAssetLibraryModal({
-
+
{assetsLoading && !hasCharacters && !hasLocations && (
diff --git a/src/app/[locale]/workspace/[projectId]/modes/novel-promotion/components/assets/AddLocationModal.tsx b/src/app/[locale]/workspace/[projectId]/modes/novel-promotion/components/assets/AddLocationModal.tsx index fd759f0..d4197bb 100644 --- a/src/app/[locale]/workspace/[projectId]/modes/novel-promotion/components/assets/AddLocationModal.tsx +++ b/src/app/[locale]/workspace/[projectId]/modes/novel-promotion/components/assets/AddLocationModal.tsx @@ -133,8 +133,8 @@ export default function AddLocationModal({ return (
-
-
+
+
{/* 标题 */}

diff --git a/src/app/[locale]/workspace/[projectId]/modes/novel-promotion/components/assets/AssetsStageModals.tsx b/src/app/[locale]/workspace/[projectId]/modes/novel-promotion/components/assets/AssetsStageModals.tsx index 88b02a8..98e260e 100644 --- a/src/app/[locale]/workspace/[projectId]/modes/novel-promotion/components/assets/AssetsStageModals.tsx +++ b/src/app/[locale]/workspace/[projectId]/modes/novel-promotion/components/assets/AssetsStageModals.tsx @@ -35,10 +35,12 @@ interface EditingPropState { propId: string propName: string summary: string + description: string variantId?: string } interface LocationImageEditModalState { + assetType: 'location' | 'prop' locationName: string } @@ -140,7 +142,7 @@ export default function AssetsStageModals({ {imageEditModal && (
e.stopPropagation()} > {/* 头部 */} -
+

{t('characterProfile.editDialogTitle', { name: characterName })}

-
- {/* 从资产中心复制按钮 */} +
+ {/* 从资产中心导入按钮 */}