修改全能创作
This commit is contained in:
@@ -23,8 +23,11 @@ VIDEO_PRESETS: dict[str, str] = {
|
||||
"用户没给关键功能或使用边界时,只问一次缺失事实;其余镜头用可观察的正常动作补齐。"
|
||||
),
|
||||
"剧情反转带货": (
|
||||
"轻剧情短片。必须有一个具体的困境场景 → 意外转折 → 商品成为解决问题的关键道具。"
|
||||
"商品不能在开头硬推,要等冲突立住了再自然介入。禁止把普通不便夸成严重后果。"
|
||||
"剧情反转带货不是给商品套一个故事壳。商品必须作为解决困境、解除误会、证明事实、完成翻盘或回收伏笔的关键物,"
|
||||
"并在最终 Prompt、镜头、动作、对白和反转结果中反复可见地承担这个作用。"
|
||||
"不得在故事结束后突然停下来介绍商品,也不能只在最后两秒放商品图。"
|
||||
"必须先确定故事深度,再按所选 15 秒、30 秒或 60 秒的结构写人物关系、冲突铺垫、商品介入时机、反转和情绪落点;"
|
||||
"禁止把同一条 15 秒故事机械加长或缩短。"
|
||||
),
|
||||
"商品拟人广告": (
|
||||
"把商品当成有性格的角色,但默认采用无脸拟人:商品本体保持真实完整,不在瓶身、包装或机身上新增卡通五官。"
|
||||
@@ -75,12 +78,105 @@ VIDEO_PRESETS: dict[str, str] = {
|
||||
),
|
||||
}
|
||||
|
||||
|
||||
PLOT_TWIST_PRESET = "剧情反转带货"
|
||||
|
||||
# 值同时是会话记忆中的稳定标识;label 则是用户在对话里看到的短说明。
|
||||
PLOT_TWIST_STORY_DEPTH_OPTIONS = (
|
||||
{
|
||||
"value": "15s",
|
||||
"label": "15秒|快节奏反转",
|
||||
"duration": "15 秒",
|
||||
"summary": "强冲突快速抓人,商品尽早介入并完成反转。",
|
||||
},
|
||||
{
|
||||
"value": "30s",
|
||||
"label": "30秒|轻剧情带货",
|
||||
"duration": "30 秒",
|
||||
"summary": "补足人物处境和矛盾铺垫,让商品在转折点自然发挥作用。",
|
||||
},
|
||||
{
|
||||
"value": "60s",
|
||||
"label": "60秒|完整短剧带货",
|
||||
"duration": "60 秒",
|
||||
"summary": "建立人物关系与持续矛盾,商品作为伏笔或关键线索完成翻盘。",
|
||||
},
|
||||
{
|
||||
"value": "smart",
|
||||
"label": "智能推荐",
|
||||
"duration": "",
|
||||
"summary": "结合商品卖点、素材和剧情空间推荐时长,仍由你最终决定。",
|
||||
},
|
||||
)
|
||||
|
||||
_PLOT_TWIST_DEPTH_BY_VALUE = {item["value"]: item for item in PLOT_TWIST_STORY_DEPTH_OPTIONS}
|
||||
|
||||
|
||||
def plot_twist_story_depth(value: str) -> dict | None:
|
||||
"""兼容卡片 value、展示文案和自然语言里带的秒数。"""
|
||||
raw = str(value or "").strip()
|
||||
if raw in _PLOT_TWIST_DEPTH_BY_VALUE:
|
||||
return _PLOT_TWIST_DEPTH_BY_VALUE[raw]
|
||||
if "60" in raw:
|
||||
return _PLOT_TWIST_DEPTH_BY_VALUE["60s"]
|
||||
if "30" in raw:
|
||||
return _PLOT_TWIST_DEPTH_BY_VALUE["30s"]
|
||||
if "15" in raw:
|
||||
return _PLOT_TWIST_DEPTH_BY_VALUE["15s"]
|
||||
if "智能" in raw or "推荐" in raw:
|
||||
return _PLOT_TWIST_DEPTH_BY_VALUE["smart"]
|
||||
return None
|
||||
|
||||
|
||||
def plot_twist_story_contract(value: str) -> str:
|
||||
"""真实写入出片 Prompt 的硬约束,确保预设不会退化成一行风格词。"""
|
||||
depth = plot_twist_story_depth(value)
|
||||
if depth is None:
|
||||
return ""
|
||||
if depth["value"] == "15s":
|
||||
return (
|
||||
"【剧情反转带货·15秒快节奏反转·强制执行】只保留一条主冲突,主角 1 人、最多 1 名辅助人物。"
|
||||
"0-3 秒强冲突或意外,3-6 秒问题升级,6-11 秒商品以正常使用动作介入并证明一个核心卖点,"
|
||||
"11-15 秒完成结果反转与自然行动引导。商品必须在中段前出现;对白短、直接、有记忆点;"
|
||||
"禁止复杂背景、支线、重复卖点和与商品无关的镜头。"
|
||||
)
|
||||
if depth["value"] == "30s":
|
||||
return (
|
||||
"【剧情反转带货·30秒轻剧情带货·强制执行】必须交代人物处境,可设置两人互动。"
|
||||
"0-4 秒抛出结果预告或冲突钩子,4-10 秒建立处境,10-17 秒让矛盾升级或一次错误尝试,"
|
||||
"17-24 秒商品在转折点以完整正常使用过程介入,24-28 秒回收反转与人物反应,28-30 秒自然收束。"
|
||||
"商品承担改变局面的实际作用;反转既服务剧情也证明卖点,禁止为了凑时长重复同一卖点。"
|
||||
)
|
||||
if depth["value"] == "60s":
|
||||
return (
|
||||
"【剧情反转带货·60秒完整短剧带货·强制执行】必须有人物关系、持续发展的矛盾、一次铺垫和一次回收。"
|
||||
"0-5 秒高强度钩子,5-15 秒交代关系和处境,15-28 秒矛盾逐步升级,28-38 秒主角面临选择或第一次失败,"
|
||||
"38-48 秒商品作为关键线索、工具、证据或关系转折点推进剧情,48-56 秒完成主要反转和情绪释放,"
|
||||
"56-60 秒回扣商品价值并自然转化。商品可前置为伏笔但必须在后半段真正改变结局;"
|
||||
"禁止用重复对白、无意义空镜或硬插卖点填满时长。"
|
||||
)
|
||||
return (
|
||||
"【剧情反转带货·智能推荐】先根据商品卖点、已有素材和剧情空间推荐 15、30 或 60 秒之一并说明理由;"
|
||||
"随后必须让用户选择实际时长,未确认前不得写剧情方向、策略、方案或出片指令。"
|
||||
)
|
||||
|
||||
|
||||
def apply_plot_twist_story_contract(name: str, story_depth: str, prompt: str) -> str:
|
||||
"""在最终出片指令里确定性追加所选故事深度,避免模型漏写关键结构。"""
|
||||
base = str(prompt or "").strip()
|
||||
if (name or "").strip() != PLOT_TWIST_PRESET or not base:
|
||||
return base
|
||||
contract = plot_twist_story_contract(story_depth)
|
||||
if not contract or contract in base:
|
||||
return base
|
||||
return f"{base}\n\n{contract}"
|
||||
|
||||
# 预设除了决定最终 Prompt,也决定 Agent 在素材整理、追问与生成前检查时的工作重点。
|
||||
# 这段进入系统提示词,避免把预设退化成一句风格修饰词。
|
||||
VIDEO_PRESET_WORKFLOWS: dict[str, str] = {
|
||||
"痛点解决演示": "先确认商品真实解决的具体问题与正常用法;生成前核对痛点、过程和结果都有可见证据。",
|
||||
"真实使用演示": "优先核对商品真实用途、关键步骤和可证实卖点;不为氛围而增加不合理测试。",
|
||||
"剧情反转带货": "优先确认人物关系或冲突;缺剧情时给 2–3 个可选方向,商品必须成为解决问题或反转的关键。",
|
||||
"剧情反转带货": "先让用户选故事深度(15秒快节奏反转、30秒轻剧情带货、60秒完整短剧带货或智能推荐),再给三个与时长匹配的剧情方向;商品必须成为解决问题、解除误会、证明事实、回收伏笔或完成翻盘的关键。",
|
||||
"商品拟人广告": "先确认商品外观和性格表达方式;默认无脸拟人,商品保持真实完整,台词用画外声。",
|
||||
"达人口播种草": "优先确认达人/人物、真实体验和主卖点;生成前核对口播字数能在时长内说完,每个卖点都有画面证明。",
|
||||
"商品图一键成片": "优先从商品参考图锁定外观;自动补场景和动作,但不替换或改变用户商品图里的结构、颜色和包装。",
|
||||
@@ -94,6 +190,70 @@ VIDEO_PRESET_WORKFLOWS: dict[str, str] = {
|
||||
"人物与音色替换": "先确认原视频、替换对象和替换范围;未经要求不得改变原视频的构图、动作、商品、场景或节奏。",
|
||||
}
|
||||
|
||||
# 这一层不是给聊天看的装饰文字,而是实际写入 video_prompt 的制作约束。
|
||||
# 预设示例片的效果主要来自结构、镜头和素材处理方式,不能只追加一句风格名。
|
||||
VIDEO_PRESET_DELIVERY_CONTRACTS: dict[str, str] = {
|
||||
"痛点解决演示": (
|
||||
"【预设执行层·痛点解决演示】全片严格按‘真实困扰 → 商品进入 → 正常使用过程 → 可见结果 → 自然收束’推进。"
|
||||
"开头先让目标用户看懂具体困扰;中段完整拍清产品的真实操作和一个可观察证据;"
|
||||
"结尾只回扣已经被画面证明的价值。不得虚构压力测试、绝对功效、价格或促销。"
|
||||
),
|
||||
"真实使用演示": (
|
||||
"【预设执行层·真实使用演示】像一镜到底可复核的日常实拍:先交代真实场景,再按正确用途完成步骤,"
|
||||
"用近景展示材质、动作或结果。商品全程保持正常完整;不以破损、漏液、渗水、超载或超出用途的测试制造戏剧性。"
|
||||
),
|
||||
"剧情反转带货": (
|
||||
"【预设执行层·剧情反转带货】人物关系、冲突、情绪变化和反转必须在每个关键镜头连续推进。"
|
||||
"商品不是摆拍道具:必须充当解决问题的工具、解除误会的证据、关系变化的礼物或回收伏笔的关键物;"
|
||||
"商品出现、使用和结果必须直接改变剧情走向,禁止剧情结束后再硬插卖点。"
|
||||
),
|
||||
"商品拟人广告": (
|
||||
"【预设执行层·商品拟人广告】商品本体保持真实包装、颜色、材质和结构;默认不长五官、不做口型。"
|
||||
"性格由整体运动、镜头、环境反应和画外角色声表达。每次拟人动作都要符合物理状态,趣味服务于一个真实卖点。"
|
||||
),
|
||||
"达人口播种草": (
|
||||
"【预设执行层·达人口播种草】固定一位可信的真人,在真实生活场景中自然口播。"
|
||||
"结构为:前 2–3 秒具体痛点或体验钩子 → 真实使用/质地/细节证明 → 一句个人感受 → 克制收束。"
|
||||
"口播像朋友分享,所有卖点必须被动作或特写佐证;禁止万能主播腔、堆砌卖点、画面字幕和夸张承诺。"
|
||||
),
|
||||
"商品图一键成片": (
|
||||
"【预设执行层·商品图一键成片】以用户商品图作为外观唯一事实源:先用主图确立商品,再补与真实用途匹配的场景、手部动作和细节特写,"
|
||||
"最后以干净的产品收束。包装文字、颜色、比例和结构全程稳定,不能用 AI 生成的相似商品替代参考图。"
|
||||
),
|
||||
"鱼眼换装": (
|
||||
"【预设执行层·鱼眼换装】使用近距离鱼眼/广角透视和稳定的同一机位;人物脸、身形、发型、场景、光线连续一致。"
|
||||
"每一套服装由一个清晰的身体动作触发切换,按用户提供顺序完整展示;镜头的变化来自动作和节奏,不额外编复杂营销剧情。"
|
||||
),
|
||||
"多色商品换款": (
|
||||
"【预设执行层·多色商品换款】先建立统一构图、比例、机位和光线,再以点击、触碰、转动或同一连续动作逐款切换。"
|
||||
"每个颜色/SKU 都要清晰出现且顺序可辨,商品尺寸和位置不得漂移;最后给出全部款式同框总览。"
|
||||
),
|
||||
"点触换款": (
|
||||
"【预设执行层·点触换款】先建立统一构图、比例、机位和光线,再以点击、触碰、转动或同一连续动作逐款切换。"
|
||||
"每个颜色/SKU 都要清晰出现且顺序可辨,商品尺寸和位置不得漂移;最后给出全部款式同框总览。"
|
||||
),
|
||||
"探店漫游": (
|
||||
"【预设执行层·探店漫游】用一条连续空间动线讲清入口、环境、关键细节和主推服务/商品。"
|
||||
"镜头移动要有明确去向,人物或旁白承担导览;环境、服务和商品在同一体验中自然出现,不做碎片化硬切或虚假热闹。"
|
||||
),
|
||||
"品牌质感大片": (
|
||||
"【预设执行层·品牌质感大片】少信息、高控制:围绕一个商品主角,以材质、光线、留白和镜头节奏建立品牌气质。"
|
||||
"用真实可见的表面、边缘光、环境反射和干净构图表达高级感;禁止无意义的漂浮特效、过度 CG 和堆叠卖点。"
|
||||
),
|
||||
"前后对比实测": (
|
||||
"【预设执行层·前后对比实测】同一对象、同一条件、同一机位依次呈现使用前、正常使用过程和使用后。"
|
||||
"对比必须由用户素材或可见事实支持,画面明确说明比较对象;禁止伪造夸张效果、偷换条件或把未验证功效拍成结论。"
|
||||
),
|
||||
"AI 宠物拟人": (
|
||||
"【预设执行层·AI 宠物拟人】宠物外观、体型、毛色和性格前后一致;趣味来自拟人动作与真实反应。"
|
||||
"宠物和商品的互动必须符合商品真实结构与正常用法,商品不变成玩具或获得不存在的能力;剧情里至少有一个可见卖点证据。"
|
||||
),
|
||||
"人物与音色替换": (
|
||||
"【预设执行层·人物与音色替换】严格保留原视频的构图、镜头顺序、动作、节奏、商品、场景和剪辑;"
|
||||
"只替换用户明确指定的人物、声音或两者。替换人物的脸、身形、服装和新声音要全片一致,未授权内容一律不改。"
|
||||
),
|
||||
}
|
||||
|
||||
IMAGE_PRESETS: dict[str, str] = {
|
||||
"电影感": "电影级摄影质感,宽容度高,强烈但自然的明暗层次,深邃阴影,柔和高光,冷暖色彩对比,轻微青橙调,真实环境光,局部轮廓光,适度暗角,细腻胶片颗粒,低饱和高级色调,电影调色,富有叙事感,真实摄影质感,避免过度HDR。",
|
||||
"日式清新": "日系清新摄影,高明度,低对比,柔和自然光,干净通透的空气感,白色与浅色占比高,低饱和淡彩,轻微偏冷色温,柔和肤色与高光,阴影浅淡,画面轻盈,曝光稍高但保留细节,清透自然,简洁治愈。",
|
||||
@@ -128,6 +288,24 @@ def preset_workflow_guidance(name: str) -> str:
|
||||
return VIDEO_PRESET_WORKFLOWS.get((name or "").strip(), "")
|
||||
|
||||
|
||||
def video_preset_delivery_contract(name: str) -> str:
|
||||
"""预设名 → 最终视频生成阶段必须执行的结构与镜头约束。"""
|
||||
return VIDEO_PRESET_DELIVERY_CONTRACTS.get((name or "").strip(), "")
|
||||
|
||||
|
||||
def apply_video_preset_prompt(name: str, prompt: str) -> str:
|
||||
"""把视频预设确定性并入最终出片指令,避免只依赖对话模型主动复述。"""
|
||||
base = str(prompt or "").strip()
|
||||
preset = (name or "").strip()
|
||||
contract = video_preset_delivery_contract(preset)
|
||||
if not base or not contract:
|
||||
return base
|
||||
marker = f"【视频预设】{preset}"
|
||||
if marker in base:
|
||||
return base
|
||||
return f"{base}\n\n{marker}\n{contract}"
|
||||
|
||||
|
||||
def apply_image_preset_prompt(name: str, prompt: str) -> str:
|
||||
"""将已选图片预设的风格字段确定性并入实际出图指令,不依赖 Agent 自行复述。"""
|
||||
base = str(prompt or "").strip()
|
||||
|
||||
Reference in New Issue
Block a user