{"id":81848,"plugin_id":"plugin_asdk_app_6ad7a6e23400819198e9cc963ee1da61","kind":"skill","collection_source":"plugin_package","comparison_source":null,"observed_at":"2026-11-05T01:19:13.040Z","digest":"93f01d717f28b2548663ade1de97f9c94d52498fbbd23c8008ca7418efd1cdc0","against":null,"payload":{"description":"Run the ByteDance Seedance family in Visual Sandbox well: `video/seedance-2.5` (up to 30 reference images, reference video and audio lists), `video/seedance-2` (1080p and 4K), `video/seedance-2-fast`, and `video/seedance-2.0-mini`. Trigger whenever the user is about to call `vsb run video/seedance-*`, names Seedance, or asks for reference-driven video: a cast held across shots, a motion copied from a clip, a voice from an audio file, a first and last frame, a video edit, or a video extension. Covers the flags, the reference numbering, the locked aspect and duration rules per task, the price jump for a reference video, and the safety filter. Prompt craft lives in [`vsb-seedance-prompting`](../vsb-seedance-prompting/SKILL.md). Pairs with [`vsb-video`](../vsb-video/SKILL.md) for the async + poll pattern.\n","included_files":[{"relative_path":"agents/openai.yaml","size_in_bytes":280}],"name":"vsb-seedance","skill_md_contents":"---\nname: vsb-seedance\ndescription: >\n  Run the ByteDance Seedance family in Visual Sandbox well: `video/seedance-2.5`\n  (up to 30 reference images, reference video and audio lists), `video/seedance-2`\n  (1080p and 4K), `video/seedance-2-fast`, and `video/seedance-2.0-mini`.\n  Trigger whenever the user is about to call `vsb run video/seedance-*`, names\n  Seedance, or asks for reference-driven video: a cast held across shots, a\n  motion copied from a clip, a voice from an audio file, a first and last frame,\n  a video edit, or a video extension. Covers the flags, the reference numbering,\n  the locked aspect and duration rules per task, the price jump for a reference\n  video, and the safety filter. Prompt craft lives in\n  [`vsb-seedance-prompting`](../vsb-seedance-prompting/SKILL.md). Pairs with\n  [`vsb-video`](../vsb-video/SKILL.md) for the async + poll pattern.\nlicense: Proprietary. See LICENSE for the terms.\n---\n\n# Seedance (ByteDance)\n\nFour slugs share one input shape. Read the parent\n[`vsb-video`](../vsb-video/SKILL.md) first for async + poll + cancel. Read\n[`vsb-seedance-prompting`](../vsb-seedance-prompting/SKILL.md) before you write\nthe prompt. This page only adds what is specific to Seedance.\n\nVerify the live schema and price before you assume anything:\n\n```bash\nvsb schema video/seedance-2.5 --json\nvsb pricing video/seedance-2.5 --json\n```\n\n## Pick a tier\n\n| Slug | Pick it for | Resolution | Duration | Aspect |\n|------|-------------|------------|----------|--------|\n| `video/seedance-2.5` | Hero shots, many references, native audio, clips up to 30 s. The slowest model in the catalog: about 4 minutes for a short clip, longer for a long one. Draft, then finish at 1080p. | 480p, 720p, 1080p | -1, 4 to 30 | 16:9, 4:3, 1:1, 3:4, 9:16, 21:9, adaptive |\n| `video/seedance-2` | 4K output, or 1080p with up to 15 s | 480p to 4K | -1, 4 to 15 | adds 9:21 |\n| `video/seedance-2-fast` | Same inputs as `seedance-2`, faster and cheaper, 720p cap | 480p, 720p | -1, 4 to 15 | adds 9:21 |\n| `video/seedance-2.0-mini` | Drafts and batches at the lowest rate. One reference video and one reference audio only. No adaptive. | 480p, 720p | 4 to 12 | no adaptive |\n\nIterate on Mini or Fast. Finish the chosen shot on 2.5, or on 2 when the\ndelivery needs 1080p or 4K.\n\n## Inputs\n\nEvery tier takes the same fields:\n\n| Field | What it is |\n|-------|------------|\n| `prompt` | Required. Put spoken lines in double quotes. |\n| `image` | First frame. Pins the opening picture. |\n| `last_frame_image` | Last frame. Needs `image`. Same aspect as `image`. |\n| `reference_images` | JSON list of URLs. 2.5 takes up to 30, the 2.0 family fewer. Cast, wardrobe, product, set, style. |\n| `reference_videos` | JSON list of URLs. Motion, camera, pacing, the clip to edit or extend. Raises the price. |\n| `reference_audios` | JSON list of URLs. Voice timbre, dialogue, music, ambience. |\n| `generate_audio` | Default `true`. Turn off for a silent shot. |\n| `aspect_ratio`, `resolution`, `duration`, `seed` | Per tier, see the table above. |\n\nLists go in as JSON strings. Upload local files first; `vsb upload` accepts\nimage, video and audio.\n\n```bash\nCAST=$(vsb upload ./cast.jpg --json | jq -r '.url')\nSET=$(vsb upload ./set.jpg --json | jq -r '.url')\nMOVE=$(vsb upload ./move.mp4 --json | jq -r '.url')\n\nJOB=$(vsb run video/seedance-2.5 \\\n  --prompt \"$(cat prompt.txt)\" \\\n  --reference_images \"[\\\"$CAST\\\",\\\"$SET\\\"]\" \\\n  --reference_videos \"[\\\"$MOVE\\\"]\" \\\n  --aspect_ratio 16:9 \\\n  --resolution 720p \\\n  --duration 8 \\\n  --async --json | jq -r '.job_id')\n```\n\n## Reference numbering\n\nThe prompt binds each asset by its position in its list. The first URL in\n`reference_images` is `[Image1]`, the second is `[Image2]`. The first URL in\n`reference_videos` is `[Video1]`. The first URL in `reference_audios` is\n`[Audio1]`. Each list counts on its own.\n\n`image` and `last_frame_image` are not in those lists. Do not number them.\nThe model pins them as the first and last frame from the field alone.\n\nWrite the binding in the prompt for every asset you attach. An asset with no\nline in the prompt is a gamble on what the model takes from it.\n\n## Locked parameters per task\n\nThe task decides which flags you still control. Get this wrong and the run\ncomes back cropped, stretched, or the wrong length.\n\n| Task | How to run it | Aspect | Duration |\n|------|---------------|--------|----------|\n| Text or reference to video | prompt, optional reference lists | Free | Free |\n| First frame, or first and last frame | `--image`, optional `--last_frame_image` | `adaptive`. The first frame sets the shape. Both frames must share one aspect or the last frame stretches. | Free |\n| Edit a video | the clip in `reference_videos`, an edit verb in the prompt: add, remove, replace, modify, change to | `adaptive` | `-1`. The output matches the source length. Not on Mini, which has no `-1`. |\n| Extend a video | the clip in `reference_videos`, an extend verb in the prompt: extend forward, extend backward, continue | `adaptive` | The length of the new segment. The output is the new segment only; join it to the source in an editor. |\n\nA reference video with no edit or extend verb is a reference task. The model\ntakes motion, camera or pacing from it and generates a new picture at the\naspect and duration you set.\n\n## Price\n\nBilled per second of output. Two things move the rate: resolution, and\nwhether `reference_videos` is set. On 2.5 a reference video roughly\nquadruples the per-second price. Read the live table, then tell the user the\nnumber before you run:\n\n```bash\nvsb pricing video/seedance-2.5 --json\n```\n\nStart at 480p and 5 seconds while the prompt is still moving. Raise\nresolution and duration once the take reads right, with the same `--seed`.\n\n`-1` (Auto) is quoted at 30 seconds up front, because the model picks the\nlength and the credit gate cannot know it. The bill is repriced to the\ndelivered length when the clip lands. Tell the user the quote is a ceiling.\n\n## Worked examples\n\nAll examples use `--async` and the poll pattern from\n[`vsb-video`](../vsb-video/SKILL.md).\n\n### First and last frame\n\n```bash\nA=$(vsb upload ./start.jpg --json | jq -r '.url')\nB=$(vsb upload ./end.jpg --json | jq -r '.url')\nJOB=$(vsb run video/seedance-2.5 \\\n  --prompt \"The decorator rotates the turntable and pipes cream along both tiers, then moves both hands away from the cake.\" \\\n  --image \"$A\" --last_frame_image \"$B\" \\\n  --aspect_ratio adaptive --duration 6 \\\n  --async --json | jq -r '.job_id')\n```\n\n### Lip-sync a portrait to a recording\n\nA photoreal face is refused unless the person is an AI-made character and you\npass `--ai_character true` (see Gotchas). For a real person, use\nthe paths in [`vsb-video` → People who talk](../vsb-video/SKILL.md#people-who-talk-pick-the-sound-path-before-you-spend).\n\n```bash\nFACE=$(vsb upload ./host.jpg --json | jq -r '.url')\nLINE=$(vsb upload ./line.mp3 --json | jq -r '.url')\nJOB=$(vsb run video/seedance-2.5 \\\n  --prompt \"Use [Image1] for the host's face, hair and jacket; do not use the image background. Use [Audio1] as the spoken line; do not generate new dialogue. Locked-off medium shot, no camera movement. The host looks into the camera and delivers [Audio1] with small natural gestures.\" \\\n  --reference_images \"[\\\"$FACE\\\"]\" --reference_audios \"[\\\"$LINE\\\"]\" \\\n  --aspect_ratio 9:16 --duration 8 \\\n  --async --json | jq -r '.job_id')\n```\n\n### A talking AI presenter in one voice\n\nThe recipe for a presenter who says your line in your voice, clip after clip.\nIt was proven on a series of 15 s talking-head clips in October 2026.\n\n1. **The face.** One portrait from `image/gpt-image-2.5-flare`, the shot you\n   want: the framing, the room and the light. Use it in every clip. Ask the\n   user to confirm that the person is AI-made before the first run.\n2. **The line.** Speak it with `audio/elevenlabs-tts` in the voice you keep\n   (`--my_voice`, see [`vsb-audio`](../vsb-audio/SKILL.md)). Keep it about\n   10 s for a 15 s clip. Pad it: 1 s of silence before the line, then silence\n   to the clip length, so the clip opens and closes on a quiet face.\n3. **The clip.** The face in `--reference_images`, never in `--image`: a first\n   frame cannot go with reference audio (E006). `--ai_character true` is\n   required for the face to pass.\n4. **The check.** Seedance can drop words. Transcribe the clip with\n   `audio/scribe` and compare it with the line, word by word. Give the\n   speech window about 1.5 s more than the line in the prompt, and write\n   \"says every word of [Audio1] in full and in order\".\n5. **The voice.** Seedance speaks [Audio1] again in its own voice. The words\n   and the timing match the line, but the voice drifts from clip to clip. Run\n   the clip through `audio/elevenlabs-voice-changer` with the same voice, then\n   put that sound back on the clip with `tool/video-add-audio --mode replace`.\n   The lips stay in sync, because the timing does not change.\n\n```bash\nJOB=$(vsb run video/seedance-2.5 \\\n  --prompt \"Animate [Image1] exactly as it is framed: the same shot, the same angle and the same distance from the first frame to the last. He is [Image1]: his face, hair, clothes and the room behind him. Use [Audio1] as his spoken line; do not generate new dialogue. He says every word of [Audio1] in full and in order. His lips move in exact sync with [Audio1]. 0-1s: he is silent and looks into the lens. 1-12s: he says [Audio1] into the lens like a relaxed host, with small head movements. After his last word: he smiles and holds still. No subtitles. No music; only his voice and quiet room tone.\" \\\n  --reference_images \"[\\\"$FACE\\\"]\" --reference_audios \"[\\\"$LINE\\\"]\" \\\n  --ai_character true --aspect_ratio 16:9 --resolution 720p --duration 15 \\\n  --async --json | jq -r '.job_id')\n# Wait for the job (see vsb-video), then take its video URL:\nCLIP=$(vsb status \"$JOB\" --result --json | jq -r '.result.urls[0]')\nNEW=$(vsb run audio/elevenlabs-voice-changer --audio \"$CLIP\" --my_voice narrator \\\n  --remove_background_noise true --json | jq -r '.result.urls[0]')\nvsb run tool/video-add-audio --video \"$CLIP\" --audio \"$NEW\" --mode replace --json\n```\n\n### One realistic AI character across shots\n\nSeedance refuses a photoreal face unless `--ai_character true` is on. Use this\nrecipe only for a character that an image model made. Ask the user to confirm\nthat the person is AI-made and that they hold the rights, before the first\nrun. Never use it with a photo of a real person.\n\n1. Make the face. Load [`vsb-image-prompting`](../vsb-image-prompting/SKILL.md)\n   first. A front-facing head-and-shoulders portrait, even light, plain\n   background.\n2. Make a full-body shot of the same character from the face, in the outfit\n   the scenes need. Put the face in `--image_input`.\n3. Run Seedance with both images as references and the flag on. Do not set\n   `--image`: with the flag on, a first frame guides the face only.\n4. For the next shot, keep the same two references and the same words for the\n   character. Change only the action, the place and the camera.\n\n```bash\nFACE=$(vsb run image/gpt-image-2.5-flare --quality high --aspect_ratio 3:4 \\\n  --prompt \"Photorealistic studio portrait of a woman in her late twenties, shoulder-length dark wavy hair, natural skin texture, navy t-shirt, front-facing head and shoulders, soft even light, plain light-grey background.\" \\\n  --json | jq -r '.result.urls[0]')\nBODY=$(vsb run image/gpt-image-2.5-flare --quality high --aspect_ratio 9:16 \\\n  --image_input \"[\\\"$FACE\\\"]\" \\\n  --prompt \"The same woman from the reference, full body, standing, front view, navy t-shirt, mid-blue jeans, white sneakers, plain light-grey background, photorealistic studio photo.\" \\\n  --json | jq -r '.result.urls[0]')\nJOB=$(vsb run video/seedance-2.5 \\\n  --prompt \"Use [Image1] for the woman's face and hair, and [Image2] for her body and outfit. She walks toward the camera on a sunny city street and smiles. Tracking shot at eye level.\" \\\n  --reference_images \"[\\\"$FACE\\\", \\\"$BODY\\\"]\" --ai_character true \\\n  --resolution 480p --duration 5 --aspect_ratio 16:9 \\\n  --async --json | jq -r '.job_id')\n```\n\nWhat the tests showed (2026-10-07, Seedance 2.5): without the flag, the\nportrait and every character sheet with a face were refused on both\nproviders. A sheet with no face passed, but the model made up a new face. With\nthe flag, the portrait passed as a reference and as a start frame, and the\nface matched in every frame.\n\n### Edit a clip\n\n```bash\nCLIP=$(vsb upload ./ad.mp4 --json | jq -r '.url')\nJAR=$(vsb upload ./cream.jpg --json | jq -r '.url')\nJOB=$(vsb run video/seedance-2.5 \\\n  --prompt \"Edit [Video1]: replace the perfume bottle with the face cream jar from [Image1]. Keep all original motion, camera work, lighting and audio. Except for the jar, every visible person, prop and background element in [Video1] remains unchanged.\" \\\n  --reference_videos \"[\\\"$CLIP\\\"]\" --reference_images \"[\\\"$JAR\\\"]\" \\\n  --aspect_ratio adaptive --duration -1 \\\n  --async --json | jq -r '.job_id')\n```\n\n### Extend a clip forward\n\n```bash\nJOB=$(vsb run video/seedance-2.5 \\\n  --prompt \"Extend [Video1] forward. The first frame of the new segment continues from the last frame of [Video1]: same bee, same flower, same camera height, same light. Then the bee lifts off and the camera follows it to a second flower of the same kind.\" \\\n  --reference_videos \"[\\\"$CLIP\\\"]\" \\\n  --aspect_ratio adaptive --duration 5 \\\n  --async --json | jq -r '.job_id')\n```\n\n### Draft, then finish at 1080p\n\n`--draft true` makes a quick 480p preview at the 480p rate. When a take is\nright, pass its output URL as `draft_video`. The same video comes back at\n1080p, with no prompt and no other input. A draft is good for seven days,\nand only its owner can finish it.\n\n```bash\nDRAFT=$(vsb run video/seedance-2.5 \\\n  --prompt \"$(cat prompt.txt)\" \\\n  --duration 5 --draft true \\\n  --async --json | jq -r '.job_id')\nURL=$(vsb status \"$DRAFT\" --result --json | jq -r '.result.urls[0]')\n\nJOB=$(vsb run video/seedance-2.5 \\\n  --draft_video \"$URL\" \\\n  --async --json | jq -r '.job_id')\n```\n\n## Gotchas\n\n- **1080p, Draft and `draft_video` run on fal.** 480p and 720p run on\n  Replicate, at about half the fal rate. `ai_character` runs on Cloudflare,\n  so it cannot combine with 1080p or Draft.\n\n- **Safety filter (E005).** Seedance refuses \"drone\" and \"FPV\" wording; write\n  \"aerial flythrough\". On `\"Your input was flagged by the model's safety\n  filter\"`, retry the same inputs on `video/p-video` before you rewrite the\n  prompt.\n- **Photoreal faces are refused, unless `--ai_character true`.** ByteDance's\n  real-face detector rejects any `image` or reference with a photoreal face,\n  AI-generated faces included: \"flagged as sensitive\" on Replicate, \"may\n  contain real person\" on Cloudflare. Character sheets with a face are refused\n  too. A still with no face passes, but the model then invents the face.\n  `--ai_character true` sends the images through ByteDance's virtual avatar\n  library on Cloudflare, and a realistic AI face then passes and stays the\n  same. It is a promise that every person in the images is AI-made and that\n  the user holds the rights: never set it for a photo of a real person, and\n  ask the user before you set it. With it on, `image` guides the face only and\n  does not fix the opening shot, and Seedance 2.0 and 2.0 Fast cap at\n  12 s. For\n  people who talk, read [`vsb-video` → People who talk](../vsb-video/SKILL.md#people-who-talk-pick-the-sound-path-before-you-spend).\n- **A first frame excludes every reference list (E006).** `image` and\n  `last_frame_image` cannot go with `reference_images`, `reference_videos` or\n  `reference_audios`. Pick one mode.\n- **`reference_audios` needs a reference image or video.** It takes up to 10\n  clips and 30 s in total on 2.5, and 3 clips and 15 s on 2.0. It is the\n  lip-sync input, so it works only in reference mode.\n- **`use_virtual_avatar`** on the Cloudflare copy of Seedance is the input\n  behind `--ai_character`. Use the flag; there is no second input to set.\n- **Subtitles appear uninvited,** more often in portrait. Add \"No subtitles.\"\n  to every prompt that does not want them. Strip text from reference assets\n  first.\n- **Multi-view character sheets** are fine on 2.5 and harmful on the 2.0\n  family, where the model reads the views as several people. On 2.0 send one\n  headshot plus one full-body photo.\n- **Join seams on extensions.** Expect a small jump at the join. Trim about\n  6 frames off the end of the source and 1 frame off the start of the new\n  segment when you cut them together.\n- **`adaptive` is not on Mini.** Match the source aspect by hand there.\n- **The wait is real.** 2.5 runs about four minutes for a short clip and\n  longer at 12 s. Say so before the user starts to watch the spinner.\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}