Video Generation System — Render descriptions into real MP4 video
Overview
This skill renders an actual video by calling the Seedance API (BytePlus ModelArk) through an async
submit → poll → download flow. It is the motion companion to the Image Generation System. It is
subject-agnostic: it builds the prompt from whatever the user types and has no built-in
character, persona, or stored identity. Whatever the user describes is what gets animated.
Video is expensive — a single clip can cost ~$1–$3.50. The cost-confirmation gate (Step 5) is
mandatory and non-negotiable.
Protocol
Extract motion intent from user input. Read the typed description and pull out: subject,
scene/setting, camera movement (static / slow push-in / orbit / handheld / dolly / crane),
pacing (calm drift vs energetic), and mood. The prompt is built from their words only —
never from a stored character profile, an "appearance" file, or any baked-in identity.
(Optional) Consult the Library System. IF the Library System feature is installed AND the user
references a saved entry (e.g. "use my noir style"), read that user-authored entry and fold it
into the prompt. This is the only persisted source the skill reads, and it is 100% user-owned
content — never a shipped persona.
(Optional) Image-to-video. IF the user wants to animate a local still (e.g. one produced by
the Image Generation System), pass it to the helper as -FirstFrame (opening frame),
-LastFrame (closing frame), or -ReferenceImages (style/subject anchors). The helper base64's
local files automatically — no hosting needed. URLs are also accepted.
Resolve the output path.
- Default folder:
media-generation/video-generation/ inside the user's memory root (created at
install; its path is recorded in master-memory.md).
- Honor an explicit
to [path] override.
- Sanitize the filename (strip
< > : " / \ | ? *, lowercase, hyphenate whitespace) and append a
-YYYYMMDD-HHmmss.mp4 timestamp suffix.
MANDATORY cost-confirmation gate. Run the helper with -WhatIfCost (no API call) to get the
estimate for the chosen resolution/duration. Present it clearly, emphasizing video is pricey,
and get an explicit go-ahead. NEVER auto-fire a paid render.
Invoke the render helper (async submit → poll → download) and report the result.
- PowerShell:
& Invoke-VideoGen.ps1 -Prompt "<final prompt>" -OutFile "<resolved path>" -Resolution "<480p|720p|1080p>" -Duration <seconds> -AspectRatio "16:9" [-FirstFrame "<path|url>"]
- Bash:
invoke-video-gen.sh --prompt "<final prompt>" --outfile "<resolved path>" --resolution "<res>" --duration <seconds> [--first-frame "<path|url>"]
- Report back the
saved_path, the cost estimate, elapsed time, and task_id.
Resolution & Duration Reference
| Resolution |
Indicative cost/sec (USD) |
Notes |
480p |
~$0.05 |
cheapest — good for drafts/smoke tests |
720p |
~$0.10 |
balanced |
1080p |
~$0.23 |
highest quality, highest cost |
Cost ≈ rate × duration. Default to a short duration unless the user asks otherwise. Verify current
pricing at BytePlus ModelArk — these are indicative only.
Mandatory Rules
- Build prompts only from user input (plus optional user-owned Library entries). The feature is
subject-agnostic — no baked-in character, persona, or appearance.
- Always confirm the cost via
-WhatIfCost before a paid render (Step 5). No silent paid calls.
Video is expensive — never skip this.
- Always save into
media-generation/video-generation/ unless the user overrides with a path.
- Never commit
.env, never print the API key, never include the key in any output.
- Surface sanitized errors (the scripts strip
ark-/sk- patterns). Never auto-retry a failed
render — API errors (moderation, quota, malformed) need human diagnosis.
- The helper is canonical — never inline the HTTP submit/poll/download logic in conversation;
always call the script.
1---2name: video-generation3description: MUST use when the user wants to RENDER or GENERATE an actual video / MP4 from a description, or ANIMATE a local image. Triggers on "render a video", "generate video", "make a video", "create a video", "animate this", "animate this image", "bring this to life". Builds the motion prompt from what the user types (subject-agnostic, no built-in persona), optionally pulls a saved reference from the Library System, supports text-to-video and image-to-video, confirms cost (video is expensive), then calls the Seedance API (async submit/poll/download) and saves an MP4.4---56# Video Generation System — Render descriptions into real MP4 video78## Overview910This skill renders an actual video by calling the Seedance API (BytePlus ModelArk) through an async11submit → poll → download flow. It is the motion companion to the Image Generation System. It is12**subject-agnostic**: it builds the prompt from whatever the user types and has **no built-in13character, persona, or stored identity**. Whatever the user describes is what gets animated.1415**Video is expensive** — a single clip can cost ~$1–$3.50. The cost-confirmation gate (Step 5) is16mandatory and non-negotiable.1718## Protocol19201. **Extract motion intent from user input.** Read the typed description and pull out: subject,21 scene/setting, **camera movement** (static / slow push-in / orbit / handheld / dolly / crane),22 **pacing** (calm drift vs energetic), and mood. The prompt is built *from their words only* —23 never from a stored character profile, an "appearance" file, or any baked-in identity.24252. **(Optional) Consult the Library System.** IF the Library System feature is installed AND the user26 references a saved entry (e.g. *"use my noir style"*), read that user-authored entry and fold it27 into the prompt. This is the only persisted source the skill reads, and it is 100% user-owned28 content — never a shipped persona.29303. **(Optional) Image-to-video.** IF the user wants to animate a local still (e.g. one produced by31 the Image Generation System), pass it to the helper as `-FirstFrame` (opening frame),32 `-LastFrame` (closing frame), or `-ReferenceImages` (style/subject anchors). The helper base64's33 local files automatically — no hosting needed. URLs are also accepted.34354. **Resolve the output path.**36 - Default folder: `media-generation/video-generation/` inside the user's memory root (created at37 install; its path is recorded in `master-memory.md`).38 - Honor an explicit `to [path]` override.39 - Sanitize the filename (strip `< > : " / \ | ? *`, lowercase, hyphenate whitespace) and append a40 `-YYYYMMDD-HHmmss.mp4` timestamp suffix.41425. **MANDATORY cost-confirmation gate.** Run the helper with `-WhatIfCost` (no API call) to get the43 estimate for the chosen resolution/duration. Present it clearly, **emphasizing video is pricey**,44 and get an explicit go-ahead. NEVER auto-fire a paid render.45466. **Invoke the render helper** (async submit → poll → download) and report the result.47 - PowerShell:48 ```powershell49 & Invoke-VideoGen.ps1 -Prompt "<final prompt>" -OutFile "<resolved path>" -Resolution "<480p|720p|1080p>" -Duration <seconds> -AspectRatio "16:9" [-FirstFrame "<path|url>"]50 ```51 - Bash:52 ```bash53 invoke-video-gen.sh --prompt "<final prompt>" --outfile "<resolved path>" --resolution "<res>" --duration <seconds> [--first-frame "<path|url>"]54 ```55 - Report back the `saved_path`, the cost estimate, elapsed time, and `task_id`.5657## Resolution & Duration Reference5859| Resolution | Indicative cost/sec (USD) | Notes |60|------------|---------------------------|-------|61| `480p` | ~$0.05 | cheapest — good for drafts/smoke tests |62| `720p` | ~$0.10 | balanced |63| `1080p` | ~$0.23 | highest quality, highest cost |6465Cost ≈ rate × duration. Default to a short duration unless the user asks otherwise. **Verify current66pricing at BytePlus ModelArk** — these are indicative only.6768## Mandatory Rules69701. **Build prompts only from user input** (plus optional user-owned Library entries). The feature is71 subject-agnostic — no baked-in character, persona, or appearance.722. **Always confirm the cost** via `-WhatIfCost` before a paid render (Step 5). No silent paid calls.73 Video is expensive — never skip this.743. **Always save into `media-generation/video-generation/`** unless the user overrides with a path.754. **Never commit `.env`**, never print the API key, never include the key in any output.765. **Surface sanitized errors** (the scripts strip `ark-`/`sk-` patterns). Never auto-retry a failed77 render — API errors (moderation, quota, malformed) need human diagnosis.786. **The helper is canonical** — never inline the HTTP submit/poll/download logic in conversation;79 always call the script.