全能创作与模特库收口:品牌品名输入、确认角色循环、换款落点与鱼眼模板
补充品牌品名改为预填输入框且空骨架不跳步;痛点确认角色后「继续完善方案」可继续推进;点击换款要求每次落点不同;鱼眼换装改用小云雀连环换装 prompt 模板;模特详情标签自动换行。
This commit is contained in:
@@ -8,12 +8,14 @@ key 必须是同一个中文名(会话建的时候原样存进 CreationConversat
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import re
|
||||
|
||||
CLICK_SWAP_PRESETS = frozenset({"点击换款", "点触换款", "多色商品换款"})
|
||||
_CLICK_SWAP_FINGER_GUIDANCE = (
|
||||
"形态:只出手指出镜。固定机位的商品点击换款短片。必须先确认要展示的颜色/款式/SKU 及顺序,"
|
||||
"画面只围绕同一件商品的逐款切换:机位、背景与灯光稳定,商品构图稳定。"
|
||||
"用手指点击/轻触触发换款,接触后以干净 match cut 切到下一款。"
|
||||
"撰写分镜时不要反复写「每次点击同一位置 / 点同一点」;点击动作点到为止,重点写款式变化与节奏。"
|
||||
"每一次换款的手指点击落点必须与上一次不同(点商品的不同区域/角点),禁止写或暗示「每次点击同一位置 / 点同一点 / 手指始终点同一处」;分镜与 video_prompt 要体现「本次点击位置不同于上次」,不要复读同一落点。"
|
||||
"禁止完整人物出镜、禁止生成角色定妆图、禁止改成口播/剧情/使用教程;最后才用同一构图做全款式收束。"
|
||||
)
|
||||
_CLICK_SWAP_CHARACTER_GUIDANCE = (
|
||||
@@ -61,10 +63,12 @@ VIDEO_PRESETS: dict[str, str] = {
|
||||
"节奏清晰,转场干净。商品外观严格以参考图为准。"
|
||||
),
|
||||
"鱼眼换装": (
|
||||
"鱼眼/广角近距离透视,连续换装节奏。**人物面部和身形必须全程一致**,"
|
||||
"只有服装在变。人物从第一镜起就已经穿着当前套装;换装用甩头、抬手、转身等触发瞬间切换到已穿好的下一套,"
|
||||
"禁止拍穿衣服、套袖、拉拉链等穿戴过程。"
|
||||
),
|
||||
"超广角鱼眼/近距离透视的连环换装短片。"
|
||||
"全片单一机位、同一构图与背景锁定;画面中心人物清晰、四边缘畸变拉伸,高饱和时尚质感,逐拍卡点剪辑。"
|
||||
"人物从第一镜起就已经穿着当前套装;换装发生在遮挡/甩头/甩镜等动态瞬间,瞬间切到已穿好的下一套。"
|
||||
"禁止拍穿衣服、套袖、拉拉链等穿戴过程。video_prompt 必须按「鱼眼连环换装」制作模板撰写"
|
||||
"(时长比例、标题、风格、单机位节拍、转场规则、主体、服装状态机、无对白卡点音效)。"
|
||||
),
|
||||
"点击换款": _CLICK_SWAP_GUIDANCE,
|
||||
"多色商品换款": _CLICK_SWAP_GUIDANCE,
|
||||
# 旧会话仍会保存「点触换款」,保留同一拍法约束以支持历史继续创作。
|
||||
@@ -270,10 +274,10 @@ VIDEO_PRESET_WORKFLOWS: dict[str, str] = {
|
||||
"商品拟人广告": "先确认商品外观和性格表达方式;默认无脸拟人,商品保持真实完整,台词用画外声。",
|
||||
"达人口播种草": "优先确认人物、多人出镜关系、真实体验和主卖点;生成前核对口播字数能在时长内说完,每个卖点都有画面证明。",
|
||||
"商品图一键成片": "优先从商品参考图锁定外观;自动补场景和动作,但不替换或改变用户商品图里的结构、颜色和包装。",
|
||||
"鱼眼换装": "优先确认人物参考、服装套数和展示顺序;生成前核对脸、身形、场景稳定,只有服装瞬间切换;人物始终已穿好当前套,不写穿衣过程。",
|
||||
"点击换款": "先让用户确认颜色/款式/SKU 和切换顺序;脚本只能是固定机位 + 手指点击触发换款;分镜不要反复写「每次点击同一位置」,禁止转成剧情或口播。",
|
||||
"多色商品换款": "先让用户确认颜色/款式/SKU 和切换顺序;脚本只能是固定机位 + 手指点击触发换款;分镜不要反复写「每次点击同一位置」,禁止转成剧情或口播。",
|
||||
"点触换款": "先让用户确认颜色/款式/SKU 和切换顺序;脚本只能是固定机位 + 手指点击触发换款;分镜不要反复写「每次点击同一位置」,禁止转成剧情或口播。",
|
||||
"鱼眼换装": "优先确认人物参考、服装套数N与展示顺序、本条机位(低机位仰拍/高机位俯拍/荷兰角/贴地滑行/手持环绕等择一全片不变)、场景与转场方式;时长按 N×1.5–2.5 秒估算(约 4–15 秒);write_prompt 严格用「鱼眼连环换装」模板:节拍换装 + 服装状态机,无对白,禁止穿衣过程。",
|
||||
"点击换款": "先让用户确认颜色/款式/SKU 和切换顺序;脚本只能是固定机位 + 手指点击触发换款;每次换款点击位置必须不同(换商品不同区域),禁止「每次点击同一位置 / 点同一点」。禁止转成剧情或口播。",
|
||||
"多色商品换款": "先让用户确认颜色/款式/SKU 和切换顺序;脚本只能是固定机位 + 手指点击触发换款;每次换款点击位置必须不同(换商品不同区域),禁止「每次点击同一位置 / 点同一点」。禁止转成剧情或口播。",
|
||||
"点触换款": "先让用户确认颜色/款式/SKU 和切换顺序;脚本只能是固定机位 + 手指点击触发换款;每次换款点击位置必须不同(换商品不同区域),禁止「每次点击同一位置 / 点同一点」。禁止转成剧情或口播。",
|
||||
"探店漫游": "优先确认门店动线与主推项目;用连续移动串联入口、环境、细节和服务,不做碎片化硬切。",
|
||||
"品牌质感大片": "优先确认品牌气质、材质和商品主卖点;由 Agent 决定光线和镜头,不把专业选择反复抛给用户。",
|
||||
"前后对比实测": "优先确认同一对象的前、中、后素材或可比较条件;生成前核对对比不夸大且没有缺失关键阶段。",
|
||||
@@ -313,15 +317,23 @@ VIDEO_PRESET_DELIVERY_CONTRACTS: dict[str, str] = {
|
||||
"最后以干净的产品收束。包装文字、颜色、比例和结构全程稳定,不能用 AI 生成的相似商品替代参考图。"
|
||||
),
|
||||
"鱼眼换装": (
|
||||
"【预设执行层·鱼眼换装】使用近距离鱼眼/广角透视和稳定的同一机位;人物脸、身形、发型、场景、光线连续一致。"
|
||||
"人物始终已穿着当前套装;每一套由甩头、抬手、转身等动作触发瞬间切换到已穿好的下一套,按用户提供顺序完整展示。"
|
||||
"禁止穿衣、套袖、扣扣、拉拉链等穿戴过程镜头;镜头变化来自触发动作与节奏,不额外编复杂营销剧情。"
|
||||
),
|
||||
"【预设执行层·鱼眼换装·小云雀模板】生成时尚换装短视频。"
|
||||
"比例默认 9:16;时长按服装套数 N 估算(每套约 1.5–2.5 秒,通常 4–15 秒)。"
|
||||
"风格:超广角鱼眼,中心清晰、四边缘明显畸变拉伸,高饱和,时尚质感,逐拍卡点剪辑。"
|
||||
"镜头:全片单一机位(本条自选一种并整条不变:低机位仰拍 / 高机位俯拍 / 荷兰角倾斜 / 贴地滑行 / 手持环绕);"
|
||||
"0–1 秒该机位对准主体、第 1 套造型定格 pose;之后逐拍换装,机位始终不变,仅服装与动作逐拍更新;最后一拍同机位定格收尾。"
|
||||
"转场:每次换装发生在遮挡/甩镜动态瞬间(抬手遮挡镜头 / 甩头转身划过画面 / 镜头快速甩动出虚影);"
|
||||
"转场瞬间服装切换,机位保持原位,下一拍回到同一构图。"
|
||||
"主体:只采用参考图五官、发型、妆容、姿态,不采用参考图服装与背景。"
|
||||
"服装状态机:S0 造型1 → 转场动作 → S1 造型2 → … → SN 定格收尾;"
|
||||
"全过程人物身份/体型/发型一致,机位/构图/背景锁定,仅服装逐拍变化;人物始终已穿好当前套,禁止穿戴过程镜头。"
|
||||
"声音:无对白,预留卡点 BGM,每次转场配快门/whoosh 音效。"
|
||||
),
|
||||
"点击换款": (
|
||||
"【预设执行层·点击换款·强制】这不是口播片、剧情片或普通商品展示片。"
|
||||
"使用单一固定机位和同一背景,商品构图、尺寸与角度保持稳定。"
|
||||
"换款由手指轻触/点击触发,接触后以干净 match cut 切到下一款;"
|
||||
"分镜不要反复写「每次点击同一位置 / 点同一点」,点击动作点到为止,重点写款式变化。"
|
||||
"每一次换款的手指点击落点必须与上一次不同(点商品的不同区域/角点),禁止写或暗示「每次点击同一位置 / 点同一点 / 手指始终点同一处」;分镜与 video_prompt 要体现「本次点击位置不同于上次」,不要复读同一落点。"
|
||||
"不改场景、不改机位、不运镜、不说话、不出现完整人物、不演剧情、不演示使用步骤。"
|
||||
"各款必须按用户确认的顺序逐一出现,不自行发明颜色或款式;结尾停在干净的全款式总览。"
|
||||
),
|
||||
@@ -329,7 +341,7 @@ VIDEO_PRESET_DELIVERY_CONTRACTS: dict[str, str] = {
|
||||
"【预设执行层·点击换款·强制】这不是口播片、剧情片或普通商品展示片。"
|
||||
"使用单一固定机位和同一背景,商品构图、尺寸与角度保持稳定。"
|
||||
"换款由手指轻触/点击触发,接触后以干净 match cut 切到下一款;"
|
||||
"分镜不要反复写「每次点击同一位置 / 点同一点」,点击动作点到为止,重点写款式变化。"
|
||||
"每一次换款的手指点击落点必须与上一次不同(点商品的不同区域/角点),禁止写或暗示「每次点击同一位置 / 点同一点 / 手指始终点同一处」;分镜与 video_prompt 要体现「本次点击位置不同于上次」,不要复读同一落点。"
|
||||
"不改场景、不改机位、不运镜、不说话、不出现完整人物、不演剧情、不演示使用步骤。"
|
||||
"各款必须按用户确认的顺序逐一出现,不自行发明颜色或款式;结尾停在干净的全款式总览。"
|
||||
),
|
||||
@@ -337,7 +349,7 @@ VIDEO_PRESET_DELIVERY_CONTRACTS: dict[str, str] = {
|
||||
"【预设执行层·点击换款·强制】这不是口播片、剧情片或普通商品展示片。"
|
||||
"使用单一固定机位和同一背景,商品构图、尺寸与角度保持稳定。"
|
||||
"换款由手指轻触/点击触发,接触后以干净 match cut 切到下一款;"
|
||||
"分镜不要反复写「每次点击同一位置 / 点同一点」,点击动作点到为止,重点写款式变化。"
|
||||
"每一次换款的手指点击落点必须与上一次不同(点商品的不同区域/角点),禁止写或暗示「每次点击同一位置 / 点同一点 / 手指始终点同一处」;分镜与 video_prompt 要体现「本次点击位置不同于上次」,不要复读同一落点。"
|
||||
"不改场景、不改机位、不运镜、不说话、不出现完整人物、不演剧情、不演示使用步骤。"
|
||||
"各款必须按用户确认的顺序逐一出现,不自行发明颜色或款式;结尾停在干净的全款式总览。"
|
||||
),
|
||||
@@ -403,7 +415,9 @@ _CLICK_SWAP_FINGER_CONTRACT = (
|
||||
"【预设执行层·点击换款·只出手】这不是口播片、剧情片或普通商品展示片。"
|
||||
"使用单一固定机位和同一背景,商品构图、尺寸与角度保持稳定。"
|
||||
"换款由手指轻触/点击触发,接触后以干净 match cut 切到下一款;"
|
||||
"分镜不要反复写「每次点击同一位置 / 点同一点」,点击动作点到为止,重点写款式变化。"
|
||||
"每一次换款的手指点击落点必须与上一次不同(点商品的不同区域/角点),"
|
||||
"禁止写或暗示「每次点击同一位置 / 点同一点 / 手指始终点同一处」;"
|
||||
"分镜与 video_prompt 要体现「本次点击位置不同于上次」。"
|
||||
"不改场景、不改机位、不运镜、不说话、不出现完整人物、不演剧情、不演示使用步骤、不生成角色定妆图。"
|
||||
"各款必须按用户确认的顺序逐一出现,不自行发明颜色或款式;结尾停在干净的全款式总览。"
|
||||
)
|
||||
@@ -425,10 +439,102 @@ def video_preset_delivery_contract(name: str, *, click_swap_mode: str = "") -> s
|
||||
return VIDEO_PRESET_DELIVERY_CONTRACTS.get(preset, "")
|
||||
|
||||
|
||||
|
||||
FISH_EYE_OUTFIT_PRESET = "鱼眼换装"
|
||||
|
||||
_FISH_EYE_OUTFIT_PROMPT_TEMPLATE = """
|
||||
【鱼眼连环换装 · video_prompt 强制模板(来自小云雀写法)】
|
||||
当预设为「鱼眼换装」时,write_plan / write_prompt 的 video_prompt 必须按下面骨架填写,
|
||||
用会话里真实的人物、服装套数、机位、场景与顺序替换【】占位;不要改回通用「制作级分镜四行」长文,也不要编口播。
|
||||
|
||||
时长:【4-15秒,按N推算,每套服装约1.5-2.5秒】秒
|
||||
比例:9:16
|
||||
任务:生成时尚换装短视频。
|
||||
|
||||
标题:《鱼眼连环换装·【机位名】版》
|
||||
|
||||
风格与视觉参考:
|
||||
超广角鱼眼镜头风格,画面中心人物清晰、四边缘明显畸变拉伸,
|
||||
高饱和色彩,时尚质感,逐拍卡点剪辑。
|
||||
|
||||
镜头语言:
|
||||
全片单一机位:【本条视频机位描述,如:低机位仰拍 / 高机位俯拍 /
|
||||
荷兰角倾斜 / 贴地滑行 / 手持环绕——每条视频自选一种,整条不变】
|
||||
0-1秒:该机位对准【主体】,第1套造型定格pose
|
||||
之后逐拍换装,机位始终不变,仅服装与动作逐拍更新:
|
||||
节拍1:造型1,随节拍做动作
|
||||
节拍2:造型2,随节拍做动作
|
||||
节拍3:造型3,随节拍做动作
|
||||
……按N套延伸
|
||||
最后一拍:同机位稳定构图,定格收尾pose
|
||||
|
||||
转场规则:每次换装发生在遮挡/甩镜的动态瞬间——
|
||||
【转场方式:抬手遮挡镜头 / 甩头转身划过画面 / 镜头快速甩动出虚影,
|
||||
转场瞬间服装切换,机位保持原位,下一拍回到同一构图】
|
||||
|
||||
主体:
|
||||
主体1:【人物描述】,对应@图片1
|
||||
(只采用五官、发型、妆容、姿态,不采用服装与背景)
|
||||
|
||||
服装状态机:
|
||||
S0 造型1:【服装1描述】
|
||||
→ 动作:【转场方式】
|
||||
→ S1 造型2:【服装2描述】
|
||||
→ 动作:【转场方式】
|
||||
→ ……按N套延伸
|
||||
→ SN 造型N:【服装N描述】定格收尾
|
||||
全过程不变量:人物身份、体型、发型全程一致;
|
||||
机位、构图、背景全程锁定不变,仅服装逐拍变化;
|
||||
人物始终已穿好当前套,禁止穿衣/套袖/拉拉链等穿戴过程镜头。
|
||||
|
||||
声音:无对白,预留卡点BGM位,每次转场配快门/whoosh音效
|
||||
|
||||
全片保持主体1身份一致、鱼眼畸变风格统一、
|
||||
机位与构图全片同一,背景【场景描述】不变。
|
||||
"""
|
||||
|
||||
|
||||
def is_fish_eye_outfit_preset(name: str) -> bool:
|
||||
return (name or "").strip() == FISH_EYE_OUTFIT_PRESET
|
||||
|
||||
|
||||
def fish_eye_outfit_prompt_template() -> str:
|
||||
return _FISH_EYE_OUTFIT_PROMPT_TEMPLATE.strip()
|
||||
|
||||
def is_click_swap_preset(name: str) -> bool:
|
||||
return (name or "").strip() in CLICK_SWAP_PRESETS
|
||||
|
||||
|
||||
|
||||
_SAME_CLICK_POS_RE = re.compile(
|
||||
r"(?:每次(?:都)?)?(?:点击|点触|轻触|手指(?:点击|点)?)(?:在|到)?(?:完全)?(?:相?同的?)?(?:一个位置|一(?:个)?位置|一点|同一处|同一点|同一个位置)"
|
||||
r"|每次点击同一位置"
|
||||
r"|点同一点"
|
||||
r"|手指点在完全相同的位置"
|
||||
r"|手指始终点同一"
|
||||
r"|点击位置保持不变"
|
||||
r"|固定点击位置"
|
||||
r"|不写点击同一位置"
|
||||
r"|不必强调每次点同一位置"
|
||||
)
|
||||
|
||||
|
||||
def scrub_click_swap_same_position_wording(text: str) -> str:
|
||||
"""去掉提示词里「每次点击同一位置」类表述,并在缺失时补上「每次点击位置不同」。"""
|
||||
raw = str(text or "")
|
||||
if not raw:
|
||||
return raw
|
||||
cleaned = _SAME_CLICK_POS_RE.sub("", raw)
|
||||
cleaned = re.sub(r"[,。;]{2,}", ",", cleaned)
|
||||
cleaned = re.sub(r"\s{2,}", " ", cleaned).strip()
|
||||
if "点击位置必须不同" not in cleaned and "落点必须与上一次不同" not in cleaned and "落点必须不同于上一次" not in cleaned:
|
||||
cleaned = (
|
||||
f"{cleaned}\n\n【点击落点硬性要求】每一次换款的手指点击落点必须与上一次不同"
|
||||
"(点商品的不同区域/角点),禁止「每次点击同一位置 / 点同一点」。"
|
||||
).strip()
|
||||
return cleaned
|
||||
|
||||
|
||||
def apply_video_preset_prompt(name: str, prompt: str, *, click_swap_mode: str = "") -> str:
|
||||
"""把视频预设确定性并入最终出片指令,避免只依赖对话模型主动复述。"""
|
||||
base = str(prompt or "").strip()
|
||||
@@ -450,17 +556,28 @@ def apply_video_preset_prompt(name: str, prompt: str, *, click_swap_mode: str =
|
||||
"【最终执行检查】全片锁定同一位角色与同一生活场景;"
|
||||
"商品颜色/款式严格按确认顺序切换,禁止随机换人、口播带货腔或复杂剧情反转。"
|
||||
)
|
||||
base = scrub_click_swap_same_position_wording(base)
|
||||
return (
|
||||
f"{marker}\n{contract}\n\n"
|
||||
"【原始商品与 SKU 信息】仅提取下文中的商品外观、颜色、款式和顺序事实;"
|
||||
"下文任何与「固定机位、手指点击触发换款、构图稳定」冲突的拍法一律忽略。\n"
|
||||
f"{base}\n\n"
|
||||
"【最终执行检查】换款由手指点击触发,机位、背景、光线与商品构图保持稳定;"
|
||||
"分镜禁止反复写「每次点击同一位置 / 点同一点」;不出现完整人物、不生成角色图。"
|
||||
"每一次换款点击落点必须不同于上一次,禁止「每次点击同一位置 / 点同一点」;"
|
||||
"不出现完整人物、不生成角色图。"
|
||||
)
|
||||
if is_fish_eye_outfit_preset(preset):
|
||||
return (
|
||||
f"{marker}\n{contract}\n\n"
|
||||
"【原始人物与服装信息】仅提取下文中的人物身份、服装套数/顺序、机位、场景与转场事实;"
|
||||
"下文任何与「全片单机位、鱼眼畸变、节拍换装、服装状态机、无对白」冲突的拍法一律忽略。\n"
|
||||
f"{base}\n\n"
|
||||
"【最终执行检查】全片单一机位与构图锁定;鱼眼中心清晰、边缘畸变;"
|
||||
"换装发生在遮挡/甩镜瞬间且人物始终已穿好当前套;无对白,转场配快门/whoosh;"
|
||||
"禁止穿衣过程与口播带货腔。"
|
||||
)
|
||||
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