Generate Seedance 2.0 videos through WeryAI with one focused skill: text-to-video, image-to-video, multi-image video, and first-frame/last-frame transition control. This skill is intentionally strict about secret declaration and input safety: the only runtime secret is WERYAI_API_KEY, and reference media must be public https URLs rather than ad-hoc local uploads.
Dependencies: scripts/video_gen.js in this directory + WERYAI_API_KEY + Node.js 18+. No other Cursor skills are required.
Before the first real generation run:
https://www.weryai.com/api/keys.WERYAI_API_KEY.WERYAI_API_KEY in metadata.openclaw.requires.env and primaryEnv.WERYAI_API_KEY.sh
export WERYAI_API_KEY="your_api_key_here"
Use one safe check before the first paid run:
sh
node {baseDir}/scripts/video_gen.js models --mode text_to_video
node {baseDir}/scripts/video_gen.js wait --json '{"prompt":"A glowing koi swims through ink clouds","duration":5}' --dry-run
models confirms that the key is configured and the models endpoint is reachable.--dry-run confirms the request shape locally without spending credits.wait or submit-* commands still require available WeryAI balance.prompt, image, images, first_frame, last_frame, last_imagetaskId, videos, task status, model capability checksWERYAI_API_KEY, no local-file upload requirement, dry-run support, explicit paid-task warningGenerate a Seedance 2.0 text-to-video clip: a silver train exits a tunnel into sunrise mist, 9:16 verticalAnimate this HTTPS portrait with Seedance 2.0 image-to-video and keep the face consistentTurn these three storyboard images into one coherent product reveal video with consistent lightingUse these first and last frames to generate a smooth transition video with the same characterMigrate this WaveSpeed Seedance flow that uses image plus last_image into the WeryAI versionWERYAI_API_KEY must be set before running video_gen.js.image, images, first_frame, last_frame, and last_image inputs must be public https URLs. Do not pass local files.wait or submit-* run creates a paid WeryAI task.WERYAI_API_KEY: Treat it as a secret. Configure it only in the runtime environment; never write the secret value into the skill files.WERYAI_BASE_URL, WERYAI_MODELS_BASE_URL): video_gen.js defaults to https://api.weryai.com and https://api-growth-agent.weryai.com. Only override them for trusted environments.scripts/video_gen.js before production use.video_gen.js does not expand prompts for you. Before every paid call, turn the user's short brief into a complete production prompt in English unless they already gave you a final long prompt and explicitly asked you not to rewrite it.
For advanced prompt design patterns, read references/seedance-prompt-optimization.md before drafting the final API prompt.
Always add:
duration.9:16 vertical when using the default aspect ratio.Mode-specific additions:
Length: Current frozen Seedance rows in this document use a prompt limit of 2000 chars where documented. If you re-check live metadata with models, trust the live value.
Confirmation: Always show the full expanded prompt and all selected parameters in a table, then wait for the user to reply confirm or request edits.
Use this sequence whenever the user asks for stronger Seedance prompt quality or tighter control:
duration.If the request is complex, structure the prompt plan internally as:
ModeAsset mappingTimeline beatsFinal promptNegative constraintsGeneration settingsUse caseAccepted fieldsNotesText-to-videoprompt, duration, optional aspect_ratio, resolution, generate_audioDefault model is SEEDANCE_2_0.Single-image animationimage + promptKeeps the reference composition and identity.Multi-image videoimages + promptOrdered list, trimmed to the model limit.Start/end-frame guidancefirst_frame + last_frame + promptInternally normalized to ordered images.WaveSpeed-style migrationimage + last_image + promptSupported as a compatibility alias for end-frame workflows.
last_image to this skill's end-frame path. This skill accepts image + last_image as a compatibility alias and normalizes it to the ordered multi-image route.https URLs only.WERYAI_API_KEY) so installers and reviewers can see the runtime contract up front.When the user asks for "better Seedance prompts" rather than just API execution:
references/seedance-prompt-optimization.md.first_frame / last_frame or image + last_image, explicitly describe the bridge action between start and end state.images, treat them as ordered waypoints of one coherent shot, not unrelated inspirations.text, image, multi-image, or first-frame/last-frame.duration, optional aspect_ratio, optional resolution, and required HTTPS image URLs if the mode uses references.## Prompt expansion (mandatory). If the request needs tighter control, read references/seedance-prompt-optimization.md and explicitly decide mode, asset mapping, timeline beats, and negative constraints before writing the final prompt.node {baseDir}/scripts/video_gen.js models --mode multi_image_to_video before a paid request.node {baseDir}/scripts/video_gen.js wait --json '...'.errorCode and errorMessage and suggest the likely parameter fix.sh
# Check live model metadata
node {baseDir}/scripts/video_gen.js models
node {baseDir}/scripts/video_gen.js models --mode text_to_video
node {baseDir}/scripts/video_gen.js models --mode image_to_video
node {baseDir}/scripts/video_gen.js models --mode multi_image_to_video
# Text-to-video
node {baseDir}/scripts/video_gen.js wait --json '{"prompt":"A paper crane unfolds into a real bird, cinematic lighting, 9:16 vertical","duration":5}'
# Single image to video
node {baseDir}/scripts/video_gen.js wait --json '{"prompt":"Animate this portrait with subtle hair and cloth movement","image":"https://example.com/frame.png","duration":5,"aspect_ratio":"9:16","resolution":"720p"}'
# Multi-image to video
node {baseDir}/scripts/video_gen.js wait --json '{"prompt":"Turn these storyboard frames into one coherent reveal shot","images":["https://example.com/1.png","https://example.com/2.png","https://example.com/3.png"],"duration":5,"aspect_ratio":"9:16"}'
# First-frame / last-frame guided video
node {baseDir}/scripts/video_gen.js wait --json '{"prompt":"Start on the first frame and transition naturally to the last frame with the same subject and environment","first_frame":"https://example.com/start.png","last_frame":"https://example.com/end.png","duration":5,"aspect_ratio":"9:16"}'
# WaveSpeed-style compatibility alias
node {baseDir}/scripts/video_gen.js wait --json '{"prompt":"Transition smoothly from the start image to the end image","image":"https://example.com/start.png","last_image":"https://example.com/end.png","duration":5,"aspect_ratio":"9:16"}'
# Preview without spending credits
node {baseDir}/scripts/video_gen.js wait --json '{"prompt":"A glowing koi swims through ink clouds","duration":5}' --dry-run
# Poll an existing task
node {baseDir}/scripts/video_gen.js status --task-id <task-id>
Done when the user receives at least one playable video URL, or a clear failure with errorCode / errorMessage and a concrete next step. The submitted payload must stay within the selected model's supported field set.
https URLs are supported.WERYAI_API_KEY inside the repository.Frozen from the repository's current WeryAI capability snapshots. Re-run
node {baseDir}/scripts/video_gen.js modelsafter platform upgrades.
SEEDANCE_2_0)#model_keydurationsaspect_ratiosresolutionsAudionegative_promptPrompt maxSEEDANCE_2_05, 10, 159:16, 1:1, 16:9480p, 720pYesNo2000
SEEDANCE_2_0)#model_keydurationsaspect_ratiosresolutionsAudionegative_promptupload_image_limitSEEDANCE_2_05, 10, 159:16, 1:1, 16:9480p, 720pYesNo3
images array for multi-image generation.images with ordered URLs, first_frame + last_frame, or image + last_image for start/end-frame control.node {baseDir}/scripts/video_gen.js models --mode multi_image_to_video and confirm support_multiple_images, support_first_last_frame, upload_image_limit, and allowed output fields on the live account.FieldValueModelSEEDANCE_2_0Aspect ratio9:16Duration5Resolution720pAudiofalse by default; enable only when you want generated ambiencePrompt styleconcise cinematic English prompt with one clear motion beat and one final payoff
Use this when the user has only an idea and wants Seedance 2.0 to generate the clip from scratch.
Need from the user:
Flow:
Expand the brief into a full English prompt.
Keep model at SEEDANCE_2_0 unless the user explicitly wants another model.
Show a confirmation table:
📋 Ready to generate - please confirm
FieldThis runNotes
model``SEEDANCE_2_0Override only if the user explicitly requests another modelaspect_ratio``9:16Must stay inside the Seedance rowduration``5Allowed: 5 / 10 / 15resolution``720pAllowed: 480p / 720pgenerate_audio``falseTurn on only if the user wants generated ambiencepromptfull expanded promptNever show only a summary
After confirmation, run: sh
node {baseDir}/scripts/video_gen.js wait --json '{"prompt":"...","duration":5,"aspect_ratio":"9:16","resolution":"720p"}'
Use this when the user already has one reference image and wants subtle or medium motion while preserving the subject.
Need from the user:
https image URLFlow:
Expand the prompt around preservation plus motion.
Add image to the JSON body.
Confirm parameters and URL, then run: sh
node {baseDir}/scripts/video_gen.js wait --json '{"prompt":"...","image":"https://example.com/input.png","duration":5,"aspect_ratio":"9:16","resolution":"720p"}'
Use this when the user wants several frames turned into one coherent shot or short sequence.
Need from the user:
https image URLsFlow:
Treat the image order as meaningful story order.
If support is uncertain, check models --mode multi_image_to_video first.
Confirm the final prompt plus ordered images, then run:
sh
node {baseDir}/scripts/video_gen.js wait --json '{"prompt":"...","images":["https://example.com/1.png","https://example.com/2.png","https://example.com/3.png"],"duration":5,"aspect_ratio":"9:16"}'
Use this when the user wants tighter motion control from a known opening frame to a known ending frame.
Need from the user:
https start framehttps end frameFlow:
Expand the prompt so it explicitly bridges the first frame to the last frame.
Use either first_frame / last_frame, image / last_image, or pass the same two URLs through images in order.
Confirm both URLs and the full prompt, then run: sh
node {baseDir}/scripts/video_gen.js wait --json '{"prompt":"...","first_frame":"https://example.com/start.png","last_frame":"https://example.com/end.png","duration":5,"aspect_ratio":"9:16"}'
If the live registry rejects multi-image routing, reduce expectations: the runtime will fall back to single-image behavior with the first frame.