Use this meta-skill instead of answering directly when the current user asks to generate an AI short-drama or 短剧 from a topic. The workflow infers render style, character identity, and shot count (1-10, default 5) from the request (filling in conservative defaults when missing), drafts a strict shot-by-shot shooting script, and pauses for a free-form review. A direct approval can continue; an adjustment only re-drafts and previews the script, then requires a second explicit approval before any external media call. After approval it generates one universal full-cast identity-reference image plus per-shot composition images, then per-shot video clips (each video anchored to BOTH the universal reference image and its own composition image so the character identity AND scene layout stay consistent), bookends them with a title card and an ending card, burns subtitles in the user's language, and saves the script alongside the final MP4. Do not use it for slide decks, document-decision analysis, single-image generat
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
A direct command skips the review prompt. Inspect the source before running it.
name: meta-short-drama
description: "Use this meta-skill instead of answering directly when the current user asks to generate an AI short-drama or 短剧 from a topic. The workflow infers render style, character identity, and shot count (1-10, default 5) from the request (filling in conservative defaults when missing), drafts a strict shot-by-shot shooting script, and pauses for a free-form review. A direct approval can continue; an adjustment only re-drafts and previews the script, then requires a second explicit approval before any external media call. After approval it generates one universal full-cast identity-reference image plus per-shot composition images, then per-shot video clips (each video anchored to BOTH the universal reference image and its own composition image so the character identity AND scene layout stay consistent), bookends them with a title card and an ending card, burns subtitles in the user's language, and saves the script alongside the final MP4. Do not use it for slide decks, document-decision analysis, single-image generation, isolated script writing, or pasted historical short-drama examples."
description_zh: "当用户要求根据主题生成 AI 短剧时,使用此元技能而非直接回答。工作流会推断渲染风格、角色身份和镜头数(1-10,默认 5),起草逐镜头脚本并暂停供自由评审。直接批准后继续;若用户提出调整,只会重新起草和预览脚本,并在任何外部媒体调用前再次要求明确批准。批准后生成通用全员身份参考图、逐镜构图图和视频片段,以双重参考保持角色与布局一致,再添加片头片尾、烧录用户语言字幕,并把脚本与最终 MP4 一并保存。不用于幻灯片、文档决策、单图生成、独立脚本写作或粘贴的历史短剧示例。"
kind: meta
meta_priority: 75
always: false
final_text_mode: "step:deliver"
request_template:
outcome: "Short-drama script and generation plan with review pause before media generation."
outcome_zh: "短剧剧本和生成计划,并在媒体生成前暂停让用户审阅。"
outcome_en: "Short-drama script and generation plan with review pause before media generation."
fields:
- name: story_topic
label_zh: "故事主题"
label_en: "Story topic"
required: true
- name: render_style
label_zh: "渲染风格"
label_en: "Render style"
required: false
- name: character_identity
label_zh: "角色设定"
label_en: "Character identity"
required: false
- name: shot_count
label_zh: "镜头数量"
label_en: "Shot count"
required: false
default: 5
- name: audience
label_zh: "受众"
label_en: "Audience"
required: false
default: "short-video viewer"
default_zh: "短视频观众"
default_en: "short-video viewer"
- name: language
label_zh: "输出语言"
label_en: "Output language"
required: false
default: "match the user's language"
default_zh: "跟随用户语言"
default_en: "match the user's language"
assumptions:
- "Pause for a free-form review; if edits are requested, show the revised script and require a second explicit approval before generating media."
- "Keep shot count between 1 and 10 and use conservative defaults when unspecified."
assumptions_zh:
- "生成媒体前允许用户自由审阅;若提出修改,会先展示修订稿并再次要求明确批准。"
- "镜头数量保持在 1 到 10 之间,未说明时使用保守默认值。"
assumptions_en:
- "Pause for a free-form review; if edits are requested, show the revised script and require a second explicit approval before generating media."
- "Keep shot count between 1 and 10 and use conservative defaults when unspecified."
output_contract:
append_to_final_text: false
required_sections:
- "Story/script summary"
- "Review or adjustment status"
- "Generated media status"
- "Saved deliverable locations"
assumptions:
- "Visual identity and shot count use conservative defaults when absent."
unverified:
- "Third-party media generation quality until generated assets are inspected."
artifacts:
- name: "short_drama_video"
required: false
- name: "script_file"
required: false
eval_prompts:
name: "short-drama-baseline"
prompt: "Create a five-shot short-drama plan from a topic, including review status and deliverable locations."
rubric:
"Story/script summary"
"Review or adjustment status"
"Generated media status"
"Saved deliverable locations"
preference_keys:
preferred_language
short_drama_render_style
policy_tags:
generated-media-review
user-approval-before-media
triggers:
"生成短剧"
"生成一个短剧"
"生成一段短剧"
"做一个AI短剧"
"帮我做一个短剧"
"三分镜短剧"
"短视频分镜成片"
"分镜成片"
"generate a short drama"
"generate short drama"
"make a short drama from"
"topic to short drama mp4"
"shot list to final mp4"
provenance:
origin: opensquilla-original
license: Apache-2.0
metadata:
platform:
requires:
bins: ["ffmpeg", "ffprobe"]
install:
id: intake_extract
label: "需求提取"
label_en: "Requirement extraction"
kind: llm_chat
with:
system: "Extract or invent a short-drama intake contract. Match the user's language for RENDER_STYLE / IDENTITY_ANCHOR. Be conservative — pick safe defaults rather than asking the user."
task: |
Read the request and emit exactly this 8-line block, in this
order, with no extra commentary:
This SKILL.md is very large, so SkillsMP previews the first section here.View on GitHub
TOPIC: <one short line — the actual story/product topic>
RENDER_STYLE: <render aesthetic, one line in user's language>
AUTO_FILLED_RENDER_STYLE: <yes|no>
STYLE_POLICY_WARNING: <none, or one concise warning in user's language>
IDENTITY_ANCHOR: <one line in user's language describing main character(s)>
AUTO_FILLED_IDENTITY_ANCHOR: <yes|no>
N_SHOTS: <integer 1..10, default 5>
AUTO_FILLED_N_SHOTS: <yes|no>
Rules:
- Detect dominant language of the request. Use that language for
RENDER_STYLE and IDENTITY_ANCHOR. Downstream models accept
Chinese natively (seedance is Chinese-first).
- If user named a render style verbatim → copy it exactly,
AUTO_FILLED_RENDER_STYLE: no. Never silently rewrite an explicit
style. If that explicit style asks for photorealistic human footage,
realistic human portraits, or a real-person likeness, emit this
concise warning in the user's language in STYLE_POLICY_WARNING:
Chinese: 写实人物参考可能被上游媒体提供商策略拒绝;若发生将停止重试并使用降级动效。
English: Photoreal human references may be rejected by the upstream media provider; if so, retries stop and a degraded animation is used.
Otherwise emit STYLE_POLICY_WARNING: none.
- Else INFER a render style from the TOPIC's genre, era, and
tone. For any human-led or urban story, prefer an unmistakably
fictional stylized illustration, not photoreal footage or a
real-person appearance. Pick whichever of these
best fits the story you just read; fall through to a fresh
descriptor if none match exactly. Use the user's language.
* 现代职场 / 都市爽剧 / 商战 / 反转 / corporate drama →
虚构 2D 编辑插画, 图形小说阴影, 戏剧化高对比配色
/ Clearly fictional 2D editorial illustration, graphic-novel shading, dramatic high-contrast palette
* 古风 / 武侠 / 仙侠 / 宫廷 / wuxia / xianxia →
水墨风, 中国传统工笔画, 柔和留白构图
/ Ink-wash painting, traditional Chinese gongbi style
* 校园 / 青春 / 恋爱 / 治愈 / slice-of-life / romance →
虚构手绘青春插画, 柔和纸张纹理, 温暖调色
/ Clearly fictional hand-drawn slice-of-life illustration, soft paper texture, warm palette
* 科幻 / 赛博朋克 / 未来 / sci-fi / cyberpunk →
虚构 2D 科幻概念插画, 赛博朋克霓虹, 体积光雾气
/ Clearly fictional 2D sci-fi concept illustration, cyberpunk neon, volumetric haze
* 恐怖 / 悬疑 / 惊悚 / horror / thriller / noir →
虚构黑色图形小说插画, 高反差暗调, 风格化阴影
/ Clearly fictional noir graphic-novel illustration, high contrast, stylized shadow
* 童话 / 绘本 / 儿童 / fairytale / picture-book / kids →
水彩绘本插画, 柔和纸面纹理, 暖色调
/ Watercolour storybook, soft paper texture, warm palette
* 商品 / 广告 / 带货 / product / commercial →
影棚布光, 浅景深产品特写, 干净背景
/ Studio lighting, hero-product close-up, clean background
* 美食 / 烹饪 / food / cooking →
顶光美食摄影, 自然质感, 浅景深
/ Top-down food photography, natural texture, shallow DOF
* 科普 / 教学 / 信息图 / explainer / educational →
扁平信息图风格, 简洁配色, 平面构图
/ Flat infographic style, clean palette, geometric layout
* 卡通 / 动画 / 二次元 / 萌系 — only when the user really
wants anime → 2D 动漫插画, 扁平上色, 柔和赛璐璐阴影
/ 2D anime illustration, flat cel-shading
* none of the above → write ONE descriptive line that
matches the topic's mood. If people are central, it MUST say
clearly fictional stylized illustration. Photography may only
be auto-selected for non-human subjects such as products or food.
AUTO_FILLED_RENDER_STYLE: yes
STYLE_POLICY_WARNING: none
- If user described main character(s) with at least
ethnicity + age + hair + outfit → summarise ≤40 words,
AUTO_FILLED_IDENTITY_ANCHOR: no.
- Else invent ONE or TWO original characters fitting the TOPIC.
- If user named shot count (3 个分镜 / "5 shots" / etc.) → use it
clamped 1..10, AUTO_FILLED_N_SHOTS: no.
- Else default N_SHOTS: 5, AUTO_FILLED_N_SHOTS: yes.
- Never ask the user a question. The user reviews in step 3.
User request:
{{ inputs.user_message | xml_escape | truncate(1500) }}
id: script_draft
label: "剧本初稿"
label_en: "Draft script"
kind: agent
skill: ai-video-script
depends_on: [intake_extract]
with:
task: |
Generate a strict-format short-drama shooting script following
ai-video-script's SKILL.md OUTPUT FORMAT section. Use the
N_SHOTS value from the intake contract below (clamp 1..10).
DURATION_S always means STORY-CONTENT duration: the sum of the
active shot durations. Default content duration: 50 (~10s per
shot for the default 5 shots). The finished MP4 adds a fixed
2s title card + 2s ending card, so its expected duration is
content DURATION_S + 4s. ASPECT_RATIO: 9:16.
Output style: plain text only. No emoji, no decorative symbols.
Do not call publish_artifact or any other tool. The meta-skill
captures this step's final assistant text directly, so your final
message must contain the complete script itself, not a file link,
artifact marker, or "[Used tool: ...]" placeholder.
Language: match the user's request language for every field.
Both downstream models accept CJK natively — do NOT translate
Chinese stories into English.
IDENTITY_ANCHOR and RENDER_STYLE below are caller-supplied —
paste them byte-for-byte into every shot's IMAGE_PROMPT and
VIDEO_PROMPT. Do not paraphrase or invent alternates.
Intake contract:
{{ outputs.intake_extract | truncate(1500) }}
User original request:
{{ inputs.user_message | xml_escape | truncate(1200) }}
Emit OVERVIEW.IDENTITY_ANCHOR, OVERVIEW.RENDER_STYLE, and
OVERVIEW.N_SHOTS lines so downstream steps can re-extract them.
intro_en: |
The script is ready. Below is the script preview plus the assumptions I made about style, character identity, and shot count.
Items marked AUTO_FILLED: yes were filled conservatively and can be changed. The draft script was saved to script.txt in this run directory; if you edit that file directly, the next step will reread it and include your manual edits.
Reply naturally: say "continue" if it looks good, describe any style, character, shot-count, or shot-level changes, or say "cancel" to stop. An edit request only triggers a free re-draft and does not authorize any media provider call. After an edit, the revised preview requires a new explicit "continue generation" approval.
USD cost range for the script awaiting authorization:
{{ outputs.script_draft | short_drama_media_cost('en') }}
This authorization applies only to the shot count and billable story duration in the current script below, and cost only occurs if you continue.
Data boundary: continuing sends script prompts and generated reference images to the configured external image/video providers. Do not upload or request replication of unauthorized real-person photos or other personal sensitive data; photoreal human inputs may be rejected by upstream policy.
Duration note: script DURATION_S is story-shot content time. The final MP4 adds a fixed 2-second title card and 2-second ending card; for example, 3 seconds of content produces an approximately 7-second final video.
=== Assumptions I made ===
{{ outputs.intake_extract | truncate(1200) }}
=== Script draft ===
{{ outputs.script_draft }}
A single string field already preserves a multi-line free-form reply.
Keep model extraction off so no prefill can be mistaken for consent.
nl_extract: false
fields:
- name: review
type: string
required: true
prompt: |
用户对脚本草稿的整段回复 — 直接把用户说的所有文字原样
放进这个字段,不要总结、不要重写、不要解释。这是一个
catch-all 字段:任何同意/拒绝/修改意见/吐槽/闲聊都属于这里。
The user's verbatim reply about the script draft. Copy the
user's entire reply text into this single field — do not
summarise, paraphrase, translate, or split it. This is a
catch-all: approvals, rejections, edits, off-topic remarks
all belong here. Empty replies remain invalid and never imply
consent.
prompt_zh: |
用户对脚本草稿的整段回复。原样放进这个字段,不要总结、不要重写、不要解释。任何同意、拒绝、修改意见、吐槽或闲聊都属于这里。
prompt_en: |
The user's verbatim reply about the script draft. Copy the entire reply into this single field; do not summarize, paraphrase, translate, or split it. Approvals, rejections, edits, off-topic remarks, and empty replies all belong here.
max_chars: 4000
cancel_keywords: ["cancel", "取消", "算了", "停止", "stop", "abort"]
timeout_hours: 24
id: script_revised
label: "剧本修订"
label_en: "Script revision"
kind: agent
skill: ai-video-script
depends_on: [review_intent, script_reread]
when: "'DECISION: revise' in outputs.review_intent and 'HAS_OVERRIDES: yes' in outputs.review_intent"
with:
task: |
Re-draft the script applying the user's overrides. Keep the
same OUTPUT FORMAT as ai-video-script's SKILL.md. If NEW_N_SHOTS
is an integer, use exactly that many shot blocks (1..10).
Otherwise keep the original N_SHOTS.
Output style: plain text only. No emoji.
Language: keep the user's original request language.
Apply overrides in priority: NEW_NOTES → NEW_N_SHOTS →
NEW_RENDER_STYLE → NEW_IDENTITY_ANCHOR. "unchanged" fields
inherit from the previous script verbatim.
NEW_NOTES is the user's verbatim requested adjustment. Apply style,
identity, shot-count, and shot-detail instructions found there even
when the corresponding normalized field says "unchanged".
Previous script (re-read from disk — if the user hand-edited
script.txt during review, those edits are already baked in
here, so preserve them):
{{ outputs.script_reread }}
Parsed overrides:
{{ outputs.review_intent | truncate(1500) }}
User original request:
{{ inputs.user_message | xml_escape | truncate(800) }}
当前快照的美元成本区间(取代上一版估算):
{{ (outputs.get('script_revised', '') or outputs.script_reread) | short_drama_media_cost('zh') }}
你的新授权只适用于下方快照的镜头数和实际提供商计费剧情时长。确认后的文件修改不会改变本次执行快照。
=== 待执行脚本快照 ===
{{ outputs.get('script_revised', '') or outputs.script_reread }}
intro_en: |
The exact script snapshot awaiting execution is ready. Review it below. Only a new explicit "continue generation", "approve", or "proceed" reply authorizes sending prompts and reference images to the configured external media providers and incurring cost. An edit request never counts as approval.
Updated USD cost range for this snapshot (replaces the previous estimate):
{{ (outputs.get('script_revised', '') or outputs.script_reread) | short_drama_media_cost('en') }}
Your new authorization applies only to the shot count and actual provider-billed story duration in the snapshot below. File edits after confirmation do not change this execution snapshot.
=== Script snapshot awaiting execution ===
{{ outputs.get('script_revised', '') or outputs.script_reread }}
nl_extract: false
fields:
- name: review
type: string
required: true
prompt: |
用户对修订稿的整段确认回复。原样复制,不要总结或改写。
Copy the user's complete confirmation reply verbatim. Do not
summarize, paraphrase, translate, or infer approval.
prompt_zh: "用户对修订稿的整段确认回复。原样复制,不要总结或改写。"
prompt_en: "Copy the user's complete confirmation reply verbatim; do not summarize, paraphrase, translate, or infer approval."
max_chars: 4000
cancel_keywords: ["cancel", "取消", "算了", "停止", "stop", "abort"]
timeout_hours: 24
id: title_extract
label: "标题提取"
label_en: "Title extraction"
kind: llm_chat
depends_on: [final_script, review_normalize]
when: "'DECISION: proceed' in outputs.review_normalize"
with:
system: "Return one line of text. No quotes, no prefix, no commentary."
task: |
From the script, output exactly the value after "TITLE:"
inside the "=== OVERVIEW ===" block. Single line.
id: subtitle_extract
label: "字幕提取"
label_en: "Subtitle extraction"
kind: llm_chat
depends_on: [final_script, review_normalize]
when: "'DECISION: proceed' in outputs.review_normalize"
with:
system: "Return one line of text. No quotes, no prefix, no commentary."
task: |
Compose a short subtitle for the cover card describing this
drama in 5-12 characters (or 2-4 English words). Match the
script's language. Examples:
Chinese script → "AI 短剧 · 30 秒"
English script → "AI Short Drama · 30s"
id: ending_text_extract
label: "结尾文案"
label_en: "Closing copy"
kind: llm_chat
depends_on: [final_script, review_normalize]
when: "'DECISION: proceed' in outputs.review_normalize"
with:
system: "Return one line of text. No quotes, no prefix, no commentary."
task: |
Output the appropriate ending-card text. Single line, no commentary.
Chinese script → 完
English script → THE END
Other languages → THE END
Script (sample to detect language):
{{ outputs.final_script | short_drama_section('OVERVIEW') }}
id: reference_prompt_extract
label: "参考提示"
label_en: "Reference prompt"
kind: llm_chat
depends_on: [final_script, review_normalize]
when: "'DECISION: proceed' in outputs.review_normalize"
with:
system: "Return one line of text. No quotes, no prefix, no commentary."
task: |
Build a single-line image prompt for a full-cast identity
reference card. The picture must show EVERY named character
that appears in ANY shot of the script (NOT just the
OVERVIEW.IDENTITY_ANCHOR anchors — supporting cast, cameo
characters, anyone the script mentions by name in any SHOT
block also belongs here), standing together in a neutral
lineup against a neutral backdrop. The downstream video model
uses this image as the universal identity anchor for every
shot.
Procedure (do these silently in your head; only emit the final
single-line prompt):
1. Read the entire script. Enumerate every distinct named
character that appears in ANY SHOT_N block's IMAGE_PROMPT
or VIDEO_PROMPT. Include characters who appear in only one
shot. Deduplicate by name. Let N be the count.
2. For each character, write the most complete canonical
attribute string the script gives them (name, age,
ethnicity, hair, outfit, distinguishing accessory). Pull
missing fields from OVERVIEW.IDENTITY_ANCHOR if needed.
3. Compose the final prompt as a single line in this exact
order:
<char 1 description>; <char 2 description>; ...; <char N description>, ALL <N> characters standing side by side in a horizontal full-body group lineup, every character clearly visible from head to toe, evenly spaced across frame, wide-angle full-cast lineup, neutral studio lighting, neutral light grey backdrop, no props, no background scene, character-design lineup composition, <OVERVIEW.RENDER_STYLE verbatim>, --ar 9:16
- Use ; (semicolon) BETWEEN characters, exactly as in the
examples above.
- State the integer N explicitly inside "ALL <N> characters".
- If N = 1, still say "ALL 1 character" and drop the
"side by side / horizontal lineup" phrasing — write
"single-character full-body portrait" instead.
Output a single line. No quotes. No commentary outside the
prompt itself.
Reference-relevant context (from the exact full script snapshot;
includes every SHOT_N block, not just OVERVIEW):
{{ outputs.final_script | short_drama_reference_context }}
id: shot1_img_prompt
label: "镜头1图提示"
label_en: "Shot 1 image prompt"
kind: llm_chat
depends_on: [final_script, review_normalize]
when: "'DECISION: proceed' in outputs.review_normalize and '=== SHOT_1 ===' in outputs.final_script.splitlines()"
with:
system: "Return one line of text. No quotes, no prefix, no commentary."
task: |
If the script contains a "=== SHOT_1 ===" block:
output exactly the value after "IMAGE_PROMPT:" inside that block.
Single line, no quotes, no label.
If it does NOT (because N_SHOTS < 1):
output exactly the literal sentinel: SHOT_ABSENT
id: shot1_vid_prompt
label: "镜头1视频提示"
label_en: "Shot 1 video prompt"
kind: llm_chat
depends_on: [final_script, review_normalize]
when: "'DECISION: proceed' in outputs.review_normalize and '=== SHOT_1 ===' in outputs.final_script.splitlines()"
with:
system: "Return one line of text. No quotes, no prefix, no commentary."
task: |
If the script contains a "=== SHOT_1 ===" block:
output exactly the value after "VIDEO_PROMPT:" inside that block.
Single line.
If it does NOT: output exactly: SHOT_ABSENT
id: shot2_img_prompt
label: "镜头2图提示"
label_en: "Shot 2 image prompt"
kind: llm_chat
depends_on: [final_script, review_normalize]
when: "'DECISION: proceed' in outputs.review_normalize and '=== SHOT_2 ===' in outputs.final_script.splitlines()"
with:
system: "Return one line of text. No quotes, no prefix, no commentary."
task: |
If the script contains a "=== SHOT_2 ===" block:
output exactly the value after "IMAGE_PROMPT:" inside that block.
Single line, no quotes, no label.
If it does NOT (because N_SHOTS < 2):
output exactly the literal sentinel: SHOT_ABSENT
id: shot2_vid_prompt
label: "镜头2视频提示"
label_en: "Shot 2 video prompt"
kind: llm_chat
depends_on: [final_script, review_normalize]
when: "'DECISION: proceed' in outputs.review_normalize and '=== SHOT_2 ===' in outputs.final_script.splitlines()"
with:
system: "Return one line of text. No quotes, no prefix, no commentary."
task: |
If the script contains a "=== SHOT_2 ===" block:
output exactly the value after "VIDEO_PROMPT:" inside that block.
Single line.
If it does NOT: output exactly: SHOT_ABSENT
id: shot3_img_prompt
label: "镜头3图提示"
label_en: "Shot 3 image prompt"
kind: llm_chat
depends_on: [final_script, review_normalize]
when: "'DECISION: proceed' in outputs.review_normalize and '=== SHOT_3 ===' in outputs.final_script.splitlines()"
with:
system: "Return one line of text. No quotes, no prefix, no commentary."
task: |
If the script contains a "=== SHOT_3 ===" block:
output exactly the value after "IMAGE_PROMPT:" inside that block.
Single line, no quotes, no label.
If it does NOT (because N_SHOTS < 3):
output exactly the literal sentinel: SHOT_ABSENT
id: shot3_vid_prompt
label: "镜头3视频提示"
label_en: "Shot 3 video prompt"
kind: llm_chat
depends_on: [final_script, review_normalize]
when: "'DECISION: proceed' in outputs.review_normalize and '=== SHOT_3 ===' in outputs.final_script.splitlines()"
with:
system: "Return one line of text. No quotes, no prefix, no commentary."
task: |
If the script contains a "=== SHOT_3 ===" block:
output exactly the value after "VIDEO_PROMPT:" inside that block.
Single line.
If it does NOT: output exactly: SHOT_ABSENT
id: shot4_img_prompt
label: "镜头4图提示"
label_en: "Shot 4 image prompt"
kind: llm_chat
depends_on: [final_script, review_normalize]
when: "'DECISION: proceed' in outputs.review_normalize and '=== SHOT_4 ===' in outputs.final_script.splitlines()"
with:
system: "Return one line of text. No quotes, no prefix, no commentary."
task: |
If the script contains a "=== SHOT_4 ===" block:
output exactly the value after "IMAGE_PROMPT:" inside that block.
Single line, no quotes, no label.
If it does NOT (because N_SHOTS < 4):
output exactly the literal sentinel: SHOT_ABSENT
id: shot4_vid_prompt
label: "镜头4视频提示"
label_en: "Shot 4 video prompt"
kind: llm_chat
depends_on: [final_script, review_normalize]
when: "'DECISION: proceed' in outputs.review_normalize and '=== SHOT_4 ===' in outputs.final_script.splitlines()"
with:
system: "Return one line of text. No quotes, no prefix, no commentary."
task: |
If the script contains a "=== SHOT_4 ===" block:
output exactly the value after "VIDEO_PROMPT:" inside that block.
Single line.
If it does NOT: output exactly: SHOT_ABSENT
id: shot5_img_prompt
label: "镜头5图提示"
label_en: "Shot 5 image prompt"
kind: llm_chat
depends_on: [final_script, review_normalize]
when: "'DECISION: proceed' in outputs.review_normalize and '=== SHOT_5 ===' in outputs.final_script.splitlines()"
with:
system: "Return one line of text. No quotes, no prefix, no commentary."
task: |
If the script contains a "=== SHOT_5 ===" block:
output exactly the value after "IMAGE_PROMPT:" inside that block.
Single line, no quotes, no label.
If it does NOT (because N_SHOTS < 5):
output exactly the literal sentinel: SHOT_ABSENT
id: shot5_vid_prompt
label: "镜头5视频提示"
label_en: "Shot 5 video prompt"
kind: llm_chat
depends_on: [final_script, review_normalize]
when: "'DECISION: proceed' in outputs.review_normalize and '=== SHOT_5 ===' in outputs.final_script.splitlines()"
with:
system: "Return one line of text. No quotes, no prefix, no commentary."
task: |
If the script contains a "=== SHOT_5 ===" block:
output exactly the value after "VIDEO_PROMPT:" inside that block.
Single line.
If it does NOT: output exactly: SHOT_ABSENT
id: shot6_img_prompt
label: "镜头6图提示"
label_en: "Shot 6 image prompt"
kind: llm_chat
depends_on: [final_script, review_normalize]
when: "'DECISION: proceed' in outputs.review_normalize and '=== SHOT_6 ===' in outputs.final_script.splitlines()"
with:
system: "Return one line of text. No quotes, no prefix, no commentary."
task: |
If the script contains a "=== SHOT_6 ===" block:
output exactly the value after "IMAGE_PROMPT:" inside that block.
Single line, no quotes, no label.
If it does NOT (because N_SHOTS < 6):
output exactly the literal sentinel: SHOT_ABSENT
id: shot6_vid_prompt
label: "镜头6视频提示"
label_en: "Shot 6 video prompt"
kind: llm_chat
depends_on: [final_script, review_normalize]
when: "'DECISION: proceed' in outputs.review_normalize and '=== SHOT_6 ===' in outputs.final_script.splitlines()"
with:
system: "Return one line of text. No quotes, no prefix, no commentary."
task: |
If the script contains a "=== SHOT_6 ===" block:
output exactly the value after "VIDEO_PROMPT:" inside that block.
Single line.
If it does NOT: output exactly: SHOT_ABSENT
id: shot7_img_prompt
label: "镜头7图提示"
label_en: "Shot 7 image prompt"
kind: llm_chat
depends_on: [final_script, review_normalize]
when: "'DECISION: proceed' in outputs.review_normalize and '=== SHOT_7 ===' in outputs.final_script.splitlines()"
with:
system: "Return one line of text. No quotes, no prefix, no commentary."
task: |
If the script contains a "=== SHOT_7 ===" block:
output exactly the value after "IMAGE_PROMPT:" inside that block.
Single line, no quotes, no label.
If it does NOT (because N_SHOTS < 7):
output exactly the literal sentinel: SHOT_ABSENT
id: shot7_vid_prompt
label: "镜头7视频提示"
label_en: "Shot 7 video prompt"
kind: llm_chat
depends_on: [final_script, review_normalize]
when: "'DECISION: proceed' in outputs.review_normalize and '=== SHOT_7 ===' in outputs.final_script.splitlines()"
with:
system: "Return one line of text. No quotes, no prefix, no commentary."
task: |
If the script contains a "=== SHOT_7 ===" block:
output exactly the value after "VIDEO_PROMPT:" inside that block.
Single line.
If it does NOT: output exactly: SHOT_ABSENT
id: shot8_img_prompt
label: "镜头8图提示"
label_en: "Shot 8 image prompt"
kind: llm_chat
depends_on: [final_script, review_normalize]
when: "'DECISION: proceed' in outputs.review_normalize and '=== SHOT_8 ===' in outputs.final_script.splitlines()"
with:
system: "Return one line of text. No quotes, no prefix, no commentary."
task: |
If the script contains a "=== SHOT_8 ===" block:
output exactly the value after "IMAGE_PROMPT:" inside that block.
Single line, no quotes, no label.
If it does NOT (because N_SHOTS < 8):
output exactly the literal sentinel: SHOT_ABSENT
id: shot8_vid_prompt
label: "镜头8视频提示"
label_en: "Shot 8 video prompt"
kind: llm_chat
depends_on: [final_script, review_normalize]
when: "'DECISION: proceed' in outputs.review_normalize and '=== SHOT_8 ===' in outputs.final_script.splitlines()"
with:
system: "Return one line of text. No quotes, no prefix, no commentary."
task: |
If the script contains a "=== SHOT_8 ===" block:
output exactly the value after "VIDEO_PROMPT:" inside that block.
Single line.
If it does NOT: output exactly: SHOT_ABSENT
id: shot9_img_prompt
label: "镜头9图提示"
label_en: "Shot 9 image prompt"
kind: llm_chat
depends_on: [final_script, review_normalize]
when: "'DECISION: proceed' in outputs.review_normalize and '=== SHOT_9 ===' in outputs.final_script.splitlines()"
with:
system: "Return one line of text. No quotes, no prefix, no commentary."
task: |
If the script contains a "=== SHOT_9 ===" block:
output exactly the value after "IMAGE_PROMPT:" inside that block.
Single line, no quotes, no label.
If it does NOT (because N_SHOTS < 9):
output exactly the literal sentinel: SHOT_ABSENT
id: shot9_vid_prompt
label: "镜头9视频提示"
label_en: "Shot 9 video prompt"
kind: llm_chat
depends_on: [final_script, review_normalize]
when: "'DECISION: proceed' in outputs.review_normalize and '=== SHOT_9 ===' in outputs.final_script.splitlines()"
with:
system: "Return one line of text. No quotes, no prefix, no commentary."
task: |
If the script contains a "=== SHOT_9 ===" block:
output exactly the value after "VIDEO_PROMPT:" inside that block.
Single line.
If it does NOT: output exactly: SHOT_ABSENT
id: shot10_img_prompt
label: "镜头10图提示"
label_en: "Shot 10 image prompt"
kind: llm_chat
depends_on: [final_script, review_normalize]
when: "'DECISION: proceed' in outputs.review_normalize and '=== SHOT_10 ===' in outputs.final_script.splitlines()"
with:
system: "Return one line of text. No quotes, no prefix, no commentary."
task: |
If the script contains a "=== SHOT_10 ===" block:
output exactly the value after "IMAGE_PROMPT:" inside that block.
Single line, no quotes, no label.
If it does NOT (because N_SHOTS < 10):
output exactly the literal sentinel: SHOT_ABSENT
id: shot10_vid_prompt
label: "镜头10视频提示"
label_en: "Shot 10 video prompt"
kind: llm_chat
depends_on: [final_script, review_normalize]
when: "'DECISION: proceed' in outputs.review_normalize and '=== SHOT_10 ===' in outputs.final_script.splitlines()"
with:
system: "Return one line of text. No quotes, no prefix, no commentary."
task: |
If the script contains a "=== SHOT_10 ===" block:
output exactly the value after "VIDEO_PROMPT:" inside that block.
Single line.
If it does NOT: output exactly: SHOT_ABSENT
@image2 / reference[2] = scene composition (this shot)
Keeping the preamble in English even when the shot directive
is Chinese — seedance parses English instruction prefixes
reliably regardless of the user-content language.
prompt: "Mode: All-Reference. Assets Mapping: reference[1] is the full-cast fictional character-design anchor (USE for silhouette, hairstyle, costumes, and accessories; preserve the original design while allowing natural motion and expression; never infer or reproduce a real-person likeness). reference[2] is THIS shot's scene composition reference (USE for camera angle, framing, character blocking, prop placement, and background layout). Shot directive: {{ outputs.shot1_vid_prompt | truncate(700) }}"
filename: "{{ inputs.workspace_dir }}/meta_short_drama/{{ inputs.meta_run_id }}/1_shot.mp4"
input_image: ""
input_reference: "{{ inputs.workspace_dir }}/meta_short_drama/{{ inputs.meta_run_id }}/reference.png"
input_reference_2: "{{ inputs.workspace_dir }}/meta_short_drama/{{ inputs.meta_run_id }}/1_shot.png"
aspect_ratio: "9:16"
Parse the exact unique DURATION_S from the approved script with
the same strict local contract used for consent-time pricing.
Missing, repeated, non-integer, or out-of-range values fail closed.
@image2 / reference[2] = scene composition (this shot)
Keeping the preamble in English even when the shot directive
is Chinese — seedance parses English instruction prefixes
reliably regardless of the user-content language.
prompt: "Mode: All-Reference. Assets Mapping: reference[1] is the full-cast fictional character-design anchor (USE for silhouette, hairstyle, costumes, and accessories; preserve the original design while allowing natural motion and expression; never infer or reproduce a real-person likeness). reference[2] is THIS shot's scene composition reference (USE for camera angle, framing, character blocking, prop placement, and background layout). Shot directive: {{ outputs.shot2_vid_prompt | truncate(700) }}"
filename: "{{ inputs.workspace_dir }}/meta_short_drama/{{ inputs.meta_run_id }}/2_shot.mp4"
input_image: ""
input_reference: "{{ inputs.workspace_dir }}/meta_short_drama/{{ inputs.meta_run_id }}/reference.png"
input_reference_2: "{{ inputs.workspace_dir }}/meta_short_drama/{{ inputs.meta_run_id }}/2_shot.png"
aspect_ratio: "9:16"
Parse the exact unique DURATION_S from the approved script with
the same strict local contract used for consent-time pricing.
Missing, repeated, non-integer, or out-of-range values fail closed.
@image2 / reference[2] = scene composition (this shot)
Keeping the preamble in English even when the shot directive
is Chinese — seedance parses English instruction prefixes
reliably regardless of the user-content language.
prompt: "Mode: All-Reference. Assets Mapping: reference[1] is the full-cast fictional character-design anchor (USE for silhouette, hairstyle, costumes, and accessories; preserve the original design while allowing natural motion and expression; never infer or reproduce a real-person likeness). reference[2] is THIS shot's scene composition reference (USE for camera angle, framing, character blocking, prop placement, and background layout). Shot directive: {{ outputs.shot3_vid_prompt | truncate(700) }}"
filename: "{{ inputs.workspace_dir }}/meta_short_drama/{{ inputs.meta_run_id }}/3_shot.mp4"
input_image: ""
input_reference: "{{ inputs.workspace_dir }}/meta_short_drama/{{ inputs.meta_run_id }}/reference.png"
input_reference_2: "{{ inputs.workspace_dir }}/meta_short_drama/{{ inputs.meta_run_id }}/3_shot.png"
aspect_ratio: "9:16"
Parse the exact unique DURATION_S from the approved script with
the same strict local contract used for consent-time pricing.
Missing, repeated, non-integer, or out-of-range values fail closed.
@image2 / reference[2] = scene composition (this shot)
Keeping the preamble in English even when the shot directive
is Chinese — seedance parses English instruction prefixes
reliably regardless of the user-content language.
prompt: "Mode: All-Reference. Assets Mapping: reference[1] is the full-cast fictional character-design anchor (USE for silhouette, hairstyle, costumes, and accessories; preserve the original design while allowing natural motion and expression; never infer or reproduce a real-person likeness). reference[2] is THIS shot's scene composition reference (USE for camera angle, framing, character blocking, prop placement, and background layout). Shot directive: {{ outputs.shot4_vid_prompt | truncate(700) }}"
filename: "{{ inputs.workspace_dir }}/meta_short_drama/{{ inputs.meta_run_id }}/4_shot.mp4"
input_image: ""
input_reference: "{{ inputs.workspace_dir }}/meta_short_drama/{{ inputs.meta_run_id }}/reference.png"
input_reference_2: "{{ inputs.workspace_dir }}/meta_short_drama/{{ inputs.meta_run_id }}/4_shot.png"
aspect_ratio: "9:16"
Parse the exact unique DURATION_S from the approved script with
the same strict local contract used for consent-time pricing.
Missing, repeated, non-integer, or out-of-range values fail closed.
@image2 / reference[2] = scene composition (this shot)
Keeping the preamble in English even when the shot directive
is Chinese — seedance parses English instruction prefixes
reliably regardless of the user-content language.
prompt: "Mode: All-Reference. Assets Mapping: reference[1] is the full-cast fictional character-design anchor (USE for silhouette, hairstyle, costumes, and accessories; preserve the original design while allowing natural motion and expression; never infer or reproduce a real-person likeness). reference[2] is THIS shot's scene composition reference (USE for camera angle, framing, character blocking, prop placement, and background layout). Shot directive: {{ outputs.shot5_vid_prompt | truncate(700) }}"
filename: "{{ inputs.workspace_dir }}/meta_short_drama/{{ inputs.meta_run_id }}/5_shot.mp4"
input_image: ""
input_reference: "{{ inputs.workspace_dir }}/meta_short_drama/{{ inputs.meta_run_id }}/reference.png"
input_reference_2: "{{ inputs.workspace_dir }}/meta_short_drama/{{ inputs.meta_run_id }}/5_shot.png"
aspect_ratio: "9:16"
Parse the exact unique DURATION_S from the approved script with
the same strict local contract used for consent-time pricing.
Missing, repeated, non-integer, or out-of-range values fail closed.
@image2 / reference[2] = scene composition (this shot)
Keeping the preamble in English even when the shot directive
is Chinese — seedance parses English instruction prefixes
reliably regardless of the user-content language.
prompt: "Mode: All-Reference. Assets Mapping: reference[1] is the full-cast fictional character-design anchor (USE for silhouette, hairstyle, costumes, and accessories; preserve the original design while allowing natural motion and expression; never infer or reproduce a real-person likeness). reference[2] is THIS shot's scene composition reference (USE for camera angle, framing, character blocking, prop placement, and background layout). Shot directive: {{ outputs.shot6_vid_prompt | truncate(700) }}"
filename: "{{ inputs.workspace_dir }}/meta_short_drama/{{ inputs.meta_run_id }}/6_shot.mp4"
input_image: ""
input_reference: "{{ inputs.workspace_dir }}/meta_short_drama/{{ inputs.meta_run_id }}/reference.png"
input_reference_2: "{{ inputs.workspace_dir }}/meta_short_drama/{{ inputs.meta_run_id }}/6_shot.png"
aspect_ratio: "9:16"
Parse the exact unique DURATION_S from the approved script with
the same strict local contract used for consent-time pricing.
Missing, repeated, non-integer, or out-of-range values fail closed.
@image2 / reference[2] = scene composition (this shot)
Keeping the preamble in English even when the shot directive
is Chinese — seedance parses English instruction prefixes
reliably regardless of the user-content language.
prompt: "Mode: All-Reference. Assets Mapping: reference[1] is the full-cast fictional character-design anchor (USE for silhouette, hairstyle, costumes, and accessories; preserve the original design while allowing natural motion and expression; never infer or reproduce a real-person likeness). reference[2] is THIS shot's scene composition reference (USE for camera angle, framing, character blocking, prop placement, and background layout). Shot directive: {{ outputs.shot7_vid_prompt | truncate(700) }}"
filename: "{{ inputs.workspace_dir }}/meta_short_drama/{{ inputs.meta_run_id }}/7_shot.mp4"
input_image: ""
input_reference: "{{ inputs.workspace_dir }}/meta_short_drama/{{ inputs.meta_run_id }}/reference.png"
input_reference_2: "{{ inputs.workspace_dir }}/meta_short_drama/{{ inputs.meta_run_id }}/7_shot.png"
aspect_ratio: "9:16"
Parse the exact unique DURATION_S from the approved script with
the same strict local contract used for consent-time pricing.
Missing, repeated, non-integer, or out-of-range values fail closed.
@image2 / reference[2] = scene composition (this shot)
Keeping the preamble in English even when the shot directive
is Chinese — seedance parses English instruction prefixes
reliably regardless of the user-content language.
prompt: "Mode: All-Reference. Assets Mapping: reference[1] is the full-cast fictional character-design anchor (USE for silhouette, hairstyle, costumes, and accessories; preserve the original design while allowing natural motion and expression; never infer or reproduce a real-person likeness). reference[2] is THIS shot's scene composition reference (USE for camera angle, framing, character blocking, prop placement, and background layout). Shot directive: {{ outputs.shot8_vid_prompt | truncate(700) }}"
filename: "{{ inputs.workspace_dir }}/meta_short_drama/{{ inputs.meta_run_id }}/8_shot.mp4"
input_image: ""
input_reference: "{{ inputs.workspace_dir }}/meta_short_drama/{{ inputs.meta_run_id }}/reference.png"
input_reference_2: "{{ inputs.workspace_dir }}/meta_short_drama/{{ inputs.meta_run_id }}/8_shot.png"
aspect_ratio: "9:16"
Parse the exact unique DURATION_S from the approved script with
the same strict local contract used for consent-time pricing.
Missing, repeated, non-integer, or out-of-range values fail closed.