
Seedance2 Api
- 1 installs
- 404 repo stars
- Updated August 5, 2026
- aiskillstore/marketplace
This is a copy of seedance2-api by hexiaochun - installs and ranking accrue to the original listing.
seedance2-api is a skill that generates AI videos end-to-end via the Seedance 2.0 API, from storyboard to reference images to final video.
About
seedance2-api is a skill for the Seedance 2.0 API that generates AI videos from a single API key. It guides building a storyboard, generating reference images with Seedream 4.5, composing the final prompt, submitting video tasks, and polling results. It works in both MCP mode and standalone Python script mode. A developer uses it to produce AI video from a concept.
- End-to-end Seedance 2.0 AI video generation from one API key
- Builds storyboards and reference images with Seedream 4.5
- MCP and standalone Python script modes
Seedance2 Api by the numbers
- 1 all-time installs (skills.sh)
- Data as of Aug 5, 2026 (Skillselion catalog sync)
seedance2-api capabilities & compatibility
Requires an XSKILL_API_KEY from xskill.ai
- Capabilities
- video generation · image generation · storyboarding
- Works with
- openai
- Use cases
- video generation · image generation
- Pricing
- Bring your own API key
What seedance2-api says it does
Out-of-the-box Seedance 2.0 API skill — just one API key to generate AI videos.
Get your API Key: https://www.xskill.ai/#/v2/api-keys
npx skills add https://github.com/aiskillstore/marketplace --skill seedance2-apiAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 1 |
|---|---|
| repo stars | ★ 404 |
| Last updated | August 5, 2026 |
| Repository | aiskillstore/marketplace ↗ |
What it does
Generate AI videos end-to-end from a storyboard using the Seedance 2.0 API.
Who is it for?
Generating AI videos and reference images from a concept via the Seedance 2.0 and Seedream 4.5 APIs
Skip if: Video editing of existing footage or non-generative video tasks
When should I use this skill?
The user mentions seedance, AI video, storyboard, or video generation
What you get
A generated AI video assembled from a storyboard and reference images.
- Storyboard
- Reference images
- Generated video
By the numbers
- Video duration 4-15 seconds
- 5-dimension deep-dive framework
Files
Seedance 2.0 Storyboard & Video Generation
End-to-end workflow from concept to final video: Storyboard → Reference images → Submit video task → Get results.
Step 0: Determine Execution Mode (MCP or Script)
Check MCP availability first:
1. Check xskill-ai MCP service status (read mcps/user-xskill-ai/STATUS.md) 2. If MCP is available → use submit_task / get_task and other MCP tools 3. If MCP is unavailable or returns errors → switch to Script Mode
Script mode prerequisites:
1. Verify XSKILL_API_KEY environment variable is set (run echo $XSKILL_API_KEY | head -c 10) 2. If not set, prompt the user:
export XSKILL_API_KEY=sk-your-api-key
Get your API Key: https://www.xskill.ai/#/v2/api-keys3. Verify requests is installed (pip install requests)
Script path: Located under this skill's directory at scripts/seedance_api.py:
# Find via Glob tool
glob: .cursor/skills/seedance2-api/scripts/seedance_api.pyIn the following steps, each API call provides both MCP method and Script method. Choose one based on the Step 0 result.
Step 1: Understand the User's Idea
Collect the following information (proactively ask if anything is missing):
- Story concept: one-sentence summary of the video
- Duration: 4–15 seconds
- Aspect ratio: 16:9 / 9:16 / 1:1 / 21:9 / 4:3 / 3:4
- Visual style: realistic / animation / ink wash / sci-fi / cyberpunk, etc.
- Assets: existing images/videos/audio, or need AI generation
- Function mode: first & last frame control (
first_last_frames) or default omni mode (omni_reference)
Step 2: Deep Dive (5 Dimensions)
Guide the user through each dimension for richer detail:
1. Content – Who is the subject? What are they doing? Where? 2. Visuals – Lighting, color palette, texture, mood 3. Camera – Push in / pull out / pan / tilt / track / orbit / crane 4. Motion – Subject actions and pacing 5. Audio – Music style, sound effects, dialogue
Step 3: Build Storyboard Structure
Break down shots along the timeline using this formula:
[Style] _____ style, _____ seconds, _____ ratio, _____ mood
0-Xs: [Camera movement] + [Visual content] + [Action description]
X-Ys: [Camera movement] + [Visual content] + [Action description]
...
[Audio] _____ music + _____ SFX + _____ dialogue
[References] @image_file_1 _____, @video_file_1 _____See reference.md for detailed templates and examples.
Step 4: Generate Reference Images (If Needed)
If the user has no existing assets, use Seedream 4.5 to generate character art, scenes, first/last frames, etc.
Text-to-Image
<details> <summary><b>MCP Method</b></summary>
Call submit_task tool:
- model_id:
fal-ai/bytedance/seedream/v4.5/text-to-image - parameters:
- prompt: detailed image description (English works best)
- image_size: choose based on video aspect ratio
- num_images: number needed (1–6)
</details>
<details> <summary><b>Script Method</b></summary>
python .cursor/skills/seedance2-api/scripts/seedance_api.py submit \
--model "fal-ai/bytedance/seedream/v4.5/text-to-image" \
--params '{"prompt":"An astronaut in a white spacesuit...","image_size":"landscape_16_9","num_images":1}'</details>
Image Editing (Modify Existing Images)
<details> <summary><b>MCP Method</b></summary>
Call submit_task tool:
- model_id:
fal-ai/bytedance/seedream/v4.5/edit - parameters:
- prompt: editing instructions (use Figure 1/2/3 to reference images)
- image_urls: array of input image URLs
- image_size: output size
</details>
<details> <summary><b>Script Method</b></summary>
python .cursor/skills/seedance2-api/scripts/seedance_api.py submit \
--model "fal-ai/bytedance/seedream/v4.5/edit" \
--params '{"prompt":"Change the background to a forest","image_urls":["https://..."],"image_size":"landscape_16_9"}'</details>
Poll Image Results
Images typically complete in 1–2 minutes.
<details> <summary><b>MCP Method</b></summary>
Call get_task tool to check status:
- First query after 30 seconds
- Then every 30 seconds
- Extract image URL when status is
completed
</details>
<details> <summary><b>Script Method</b></summary>
Single query:
python .cursor/skills/seedance2-api/scripts/seedance_api.py query \
--task-id "TASK_ID_HERE"Auto-poll (recommended for images, interval 10s, timeout 180s):
python .cursor/skills/seedance2-api/scripts/seedance_api.py poll \
--task-id "TASK_ID_HERE" --interval 10 --timeout 180</details>
image_size Reference
| Aspect Ratio | Recommended image_size | Note |
|---|---|---|
| 16:9 | landscape_16_9 | Landscape |
| 9:16 | portrait_16_9 | Portrait |
| 4:3 | landscape_4_3 | Landscape |
| 3:4 | portrait_4_3 | Portrait |
| 1:1 | square_hd | Square |
| 21:9 | landscape_16_9 | Approximate ultrawide |
Step 5: Compose the Final Prompt
Merge the storyboard structure and reference images into the final prompt:
- Use
@image_file_1,@image_file_2, etc. to reference images in the image_files array - Use
@video_file_1, etc. to reference videos in the video_files array - Use
@audio_file_1, etc. to reference audio in the audio_files array
Reference syntax example:
@image_file_1 as character reference, follow @video_file_1 camera movement, with @audio_file_1 as background musicImportant: The Nth URL in image_files maps to @image_file_N. video_files and audio_files are independently numbered.
Step 6: Submit Video Task
Handle asset URLs:
- Seedream-generated images: URL already available, use directly
- User-provided web images: use directly
- User-provided local images: upload first to get URL (see upload methods below)
Upload Local Images
<details> <summary><b>MCP Method</b></summary>
Call upload_image tool: image_url or image_data
</details>
<details> <summary><b>Script Method</b></summary>
# Upload from URL
python .cursor/skills/seedance2-api/scripts/seedance_api.py upload \
--image-url "https://example.com/image.png"
# Upload local file
python .cursor/skills/seedance2-api/scripts/seedance_api.py upload \
--image-path "/path/to/local/image.png"</details>
Submit Seedance 2.0 Task (Omni Reference Mode)
<details> <summary><b>MCP Method</b></summary>
Call submit_task tool:
- model_id:
st-ai/super-seed2 - parameters:
- prompt: the full prompt from Step 5
- functionMode:
omni_reference(default, can be omitted) - image_files: reference image URL array (up to 9, order matches @image_file_1/2/3...)
- video_files: reference video URL array (up to 3, total duration ≤ 15s)
- audio_files: reference audio URL array (up to 3)
- ratio: aspect ratio (
16:9/9:16/1:1/21:9/4:3/3:4) - duration: integer length (
4–15) - model:
seedance_2.0_fast(default, faster) orseedance_2.0(standard quality)
</details>
<details> <summary><b>Script Method</b></summary>
python .cursor/skills/seedance2-api/scripts/seedance_api.py submit \
--model "st-ai/super-seed2" \
--params '{
"prompt": "Cinematic realistic sci-fi style, 15 seconds, 16:9...",
"functionMode": "omni_reference",
"image_files": ["https://img1.png", "https://img2.png"],
"ratio": "16:9",
"duration": 15,
"model": "seedance_2.0_fast"
}'</details>
Submit Seedance 2.0 Task (First & Last Frames Mode)
<details> <summary><b>MCP Method</b></summary>
Call submit_task tool:
- model_id:
st-ai/super-seed2 - parameters:
- prompt: video description prompt
- functionMode:
first_last_frames - filePaths: image URL array (0 = text-to-video, 1 = first frame, 2 = first & last frames)
- ratio: aspect ratio
- duration: integer length
- model:
seedance_2.0_fastorseedance_2.0
</details>
<details> <summary><b>Script Method</b></summary>
python .cursor/skills/seedance2-api/scripts/seedance_api.py submit \
--model "st-ai/super-seed2" \
--params '{
"prompt": "Camera smoothly transitions from first frame to last frame, fluid motion",
"functionMode": "first_last_frames",
"filePaths": ["https://first-frame.png", "https://last-frame.png"],
"ratio": "16:9",
"duration": 5,
"model": "seedance_2.0_fast"
}'</details>
Step 7: Poll for Video Results
Video generation takes approximately 10 minutes.
<details> <summary><b>MCP Method</b></summary>
Polling strategy: 1. After submission, inform the user: "Video is generating, estimated ~10 minutes" 2. First query after 60 seconds via get_task 3. Then every 90 seconds 4. Report status to the user after each query
</details>
<details> <summary><b>Script Method</b></summary>
Recommended: auto-poll (runs in foreground, interval 30s, timeout 600s):
python .cursor/skills/seedance2-api/scripts/seedance_api.py poll \
--task-id "TASK_ID_HERE" --interval 30 --timeout 600Progress is printed to stderr; final JSON result is printed to stdout when complete.
Manual single query:
python .cursor/skills/seedance2-api/scripts/seedance_api.py query \
--task-id "TASK_ID_HERE"</details>
Status reference:
pending→ "Queued..."processing→ "Generating..."completed→ Extract the video URL and present to the userfailed→ Report the error; suggest adjusting the prompt and retrying
Full Workflow Example
User says: "Make a video of an astronaut walking on Mars"
When MCP Is Available
1. Gather info → 15s, 16:9, cinematic sci-fi style, no existing assets
2. Generate astronaut + Mars scene images with Seedream 4.5
submit_task("fal-ai/bytedance/seedream/v4.5/text-to-image", {...})
→ poll get_task → get image URLs
3. Compose prompt → submit video task
submit_task("st-ai/super-seed2", {...})
4. Poll get_task, ~10 min later → get video URLWhen MCP Is Unavailable (Script Mode)
1. Gather info → 15s, 16:9, cinematic sci-fi style
2. Generate reference images:
python scripts/seedance_api.py submit \
--model "fal-ai/bytedance/seedream/v4.5/text-to-image" \
--params '{"prompt":"An astronaut in white spacesuit on Mars...","image_size":"landscape_16_9"}'
→ get task_id
3. Poll for image results:
python scripts/seedance_api.py poll --task-id "xxx" --interval 10 --timeout 180
→ get image URL
4. Submit video task:
python scripts/seedance_api.py submit \
--model "st-ai/super-seed2" \
--params '{"prompt":"...storyboard prompt...","functionMode":"omni_reference","image_files":["IMAGE_URL"],"ratio":"16:9","duration":15,"model":"seedance_2.0_fast"}'
→ get task_id
5. Poll for video results:
python scripts/seedance_api.py poll --task-id "xxx" --interval 30 --timeout 600
→ get video URLModel Parameters Quick Reference
Seedream 4.5 Text-to-Image
| Parameter | Type | Required | Description |
|---|---|---|---|
| prompt | string | Yes | Image description |
| image_size | string | No | auto_2K / auto_4K / square_hd / portrait_4_3 / portrait_16_9 / landscape_4_3 / landscape_16_9 |
| num_images | int | No | 1–6, default 1 |
Seedream 4.5 Image Editing
| Parameter | Type | Required | Description |
|---|---|---|---|
| prompt | string | Yes | Editing instructions, reference images as Figure 1/2/3 |
| image_urls | array | Yes | Input image URL list |
| image_size | string | No | Same as above |
| num_images | int | No | 1–6, default 1 |
Seedance 2.0 Video (Omni Reference Mode)
| Parameter | Type | Required | Description |
|---|---|---|---|
| prompt | string | Yes | Storyboard prompt, use @image_file_N/@video_file_N/@audio_file_N |
| functionMode | string | No | omni_reference (default) |
| image_files | array | No | Reference image URL array (up to 9) |
| video_files | array | No | Reference video URL array (up to 3, total ≤ 15s) |
| audio_files | array | No | Reference audio URL array (up to 3) |
| ratio | string | No | 21:9 / 16:9 / 4:3 / 1:1 / 3:4 / 9:16 |
| duration | integer | No | 4–15, default 5 |
| model | string | No | seedance_2.0_fast (default) / seedance_2.0 |
Seedance 2.0 Video (First & Last Frames Mode)
| Parameter | Type | Required | Description |
|---|---|---|---|
| prompt | string | Yes | Video description prompt |
| functionMode | string | Yes | first_last_frames |
| filePaths | array | No | Image URL array (0 = text-to-video, 1 = first frame, 2 = first & last) |
| ratio | string | No | 21:9 / 16:9 / 4:3 / 1:1 / 3:4 / 9:16 |
| duration | integer | No | 4–15, default 5 |
| model | string | No | seedance_2.0_fast (default) / seedance_2.0 |
Tools Quick Reference
MCP Tools
| Action | Tool | Key Parameters |
|---|---|---|
| Submit task | submit_task | model_id, parameters |
| Query result | get_task | task_id |
| Upload image | upload_image | image_url or image_data |
| Check balance | get_balance | (none) |
Script Commands (When MCP Is Unavailable)
| Action | Command | Description |
|---|---|---|
| Submit task | python scripts/seedance_api.py submit --model MODEL --params '{...}' | Returns task_id |
| Single query | python scripts/seedance_api.py query --task-id ID | Returns current status |
| Auto-poll | python scripts/seedance_api.py poll --task-id ID --interval N --timeout N | Blocks until done |
| Check balance | python scripts/seedance_api.py balance | Returns account balance |
| Upload image | python scripts/seedance_api.py upload --image-url URL or --image-path PATH | Returns image URL |
Script path note: Thescripts/seedance_api.pypath above is relative to.cursor/skills/seedance2-api/. Use the full path.cursor/skills/seedance2-api/scripts/seedance_api.pywhen executing, orcdinto the skill directory first.
Seedance 2.0 Limitations
- Realistic human face uploads are not supported
- Maximum 12 files: images ≤ 9 + videos ≤ 3 + audio ≤ 3
- Total video/audio reference duration ≤ 15 seconds
- Video references consume more credits
More Resources
See reference.md for detailed storyboard templates, full examples, and camera movement glossary.
Seedance 2.0 分镜参考手册
提示词公式
【风格】_____风格,_____秒,_____比例,_____氛围
【时间轴】
0-X秒:[镜头] + [画面] + [动作] + [特效]
X-Y秒:[镜头] + [画面] + [动作] + [特效]
...
【声音】_____配乐 + _____音效 + _____对白
【参考】@image_file_1 _____,@video_file_1 _____---
分镜模板
模板一:叙事故事类
【风格】电影级写实/动画/水墨/科幻风格
【时长】15秒
【画幅】16:9 / 9:16 / 2.35:1电影宽屏
0-3秒:[镜头运动],[场景建立],[主体引入]
3-7秒:[镜头运动],[情节发展],[动作描述]
7-11秒:[镜头运动],[高潮/冲突],[情绪爆发]
11-13秒:[镜头运动],[转折/过渡]
13-15秒:[镜头运动],[结尾/落版]
【声音】配乐风格 + 音效 + 对白
【参考】@image_file_1 作为首帧,@video_file_1 参考运镜模板二:产品展示类
【风格】商业广告/极简/高端/科技感
【时长】10-15秒
0-2秒:开场抓眼球,产品特写或悬念设置
2-5秒:产品全景展示,运镜环绕/推拉
5-8秒:产品细节特写,材质/工艺展示
8-12秒:使用场景,产品在实际环境中的应用
12-15秒:品牌落版,slogan展示
【声音】大气恢宏/轻快时尚/科技感配乐
【参考】@image_file_1 产品外观,@image_file_2 材质参考模板三:角色动作类
【风格】根据角色设定(武侠/科幻/现代/奇幻)
【时长】15秒
0-3秒:角色亮相,定格或缓慢展示造型
3-6秒:动作起始,准备姿势
6-11秒:核心动作展示(打斗/舞蹈/特技)
11-13秒:动作收尾,pose定格
13-15秒:特效/氛围强化,画面落版
【声音】动作音效 + 氛围配乐
【参考】@image_file_1 角色形象,@video_file_1 动作参考模板四:风景旅拍类
【风格】电影级纪录片/治愈系/史诗感
【时长】15秒
0-3秒:大景别建立镜头,展示环境全貌
3-6秒:中景推进,引入人物或细节
6-10秒:多角度切换,展示环境不同面貌
10-13秒:特写细节,光影变化
13-15秒:回到大景别或意境落版
【声音】环境音 + 氛围配乐
【参考】@image_file_1-5 场景参考模板五:视频延长/续拍
将@video_file_1延长X秒(生成长度选择X秒)
延续前视频的风格和主体:
0-X秒:[新内容描述],与前视频无缝衔接
[继续描述新增内容的时间轴]
【要求】保持角色一致性,动作连贯流畅模板六:视频编辑/改剧情
基于@video_file_1进行编辑:
【保留】原视频的运镜/部分动作/场景
【修改】[具体修改点1]
【修改】[具体修改点2]
【颠覆】[剧情反转描述]
【要求】保持镜头连贯,只在指定位置修改模板七:首尾帧视频
【功能模式】first_last_frames
【首帧】@filePaths[0] 描述
【尾帧】@filePaths[1] 描述
镜头从首帧的[描述]缓缓过渡到尾帧的[描述],
中间过程:[运镜和变化描述]
【声音】配乐风格 + 音效---
完整示例
示例一:情感叙事类
场景:男人下班回家的温情故事
电影级写实风格,15秒,2.35:1电影宽屏,温馨家庭氛围
0-3秒:中景跟随镜头,男人疲惫地走在走廊,脚步逐渐变缓,最后停在家门口
3-5秒:脸部特写,男人深呼吸,调整情绪,收起负面情绪,表情变得轻松
5-7秒:特写手部动作,翻找出钥匙,插入门锁,门打开
7-12秒:室内中景,小女儿和宠物狗欢快地跑过来迎接,男人蹲下拥抱他们
12-15秒:近景,男人脸上洋溢着幸福的笑容,室内暖光营造温馨氛围
【声音】轻缓的钢琴配乐,环境音效(脚步声、开门声、孩子的笑声)
【参考】@image_file_1 男人形象,@image_file_2 女儿形象,@image_file_3 宠物狗形象示例二:武侠动作类
场景:武侠风格双人对打
中国水墨武侠风格,15秒,16:9,枫叶飘落的秋季场景
0-2秒:远景,两位侠客对峙,一人持长枪(参考@image_file_1 @image_file_2),一人持双刀(参考@image_file_3 @image_file_4)
2-4秒:快速推近,两人眼神交锋,杀气弥漫
4-9秒:中景快速剪辑,长枪突刺,双刀格挡,武器碰撞火花四溅,模仿@video_file_1的动作节奏
9-12秒:环绕镜头,展示激烈打斗,枫叶被气浪卷起飞舞
12-15秒:定格pose,两人武器相交,画面渐隐
【声音】金属碰撞音效 + 古风激昂配乐
【参考】@image_file_1-4 角色造型,@image_file_5 枫叶林场景,@video_file_1 动作参考示例三:产品广告类
场景:咖啡品牌广告
高端商业广告风格,15秒,16:9,暖色调晨光氛围
0-3秒:微距特写,咖啡液缓缓注入杯中,油脂丰富,蒸汽升腾
3-6秒:中景环绕,手握咖啡杯,阳光透过窗户洒在桌面
6-10秒:推镜头至咖啡豆,一粒咖啡豆从上方飘落,镜头跟随推进
10-12秒:画面黑屏转场
12-15秒:文字渐显,第一行"Lucky Coffee",第二行"Breakfast",第三行"AM 7:00-10:00"
【声音】咖啡倒入声 + 轻松的爵士乐
【参考】@image_file_1 咖啡杯,@image_file_2 品牌logo示例四:创意转场类
场景:科幻世界穿梭
赛博朋克科幻风格,15秒,16:9,霓虹光效
0-2秒:首帧@image_file_1,人物戴上虚拟科幻眼镜,特写
2-5秒:极速环绕镜头,从第三人称变成人物主观视角,在AI虚拟眼镜中穿梭
5-8秒:镜头推进至深邃蓝色宇宙(参考@image_file_2),几架飞船穿梭向远方,镜头跟随
8-11秒:飞船急速穿梭到像素世界(参考@image_file_3),低空飞过像素山林,树木生长
11-13秒:视角仰拍,急速穿梭到浅绿色纹理星球(参考@image_file_4)
13-15秒:镜头掠过星球表面,画面定格
【声音】电子音效 + 科幻氛围配乐
【参考】@image_file_1 首帧人物,@image_file_2-4 场景图,@video_file_1 运镜参考示例五:一镜到底类
场景:追踪镜头穿越多个场景
谍战片风格,15秒,2.35:1电影宽屏,紧张氛围
0-3秒:首帧@image_file_1,镜头正面跟拍红衣女特工向前走,全景,路人不断遮挡
3-5秒:镜头跟随到拐角处(参考@image_file_2),固定镜头,女子离开画面
5-8秒:戴面具女孩(参考@image_file_3)在拐角处躲着恶狠狠盯着,镜头往前摇向红衣女子
8-12秒:红衣女子走进豪宅(参考@image_file_4)消失不见
12-15秒:镜头推近豪宅大门,画面定格
【要求】全程不要切镜头,一镜到底,保持紧张节奏
【参考】@image_file_1 首帧,@image_file_2 拐角,@image_file_3 面具女孩,@image_file_4 豪宅示例六:视频延长类
场景:延长已有视频
将@video_file_1延长10秒(生成长度选择10秒)
延续前视频向日葵滑板的治愈风格:
0-3秒:温暖的午后光线,镜头从街角遮阳篷慢慢下移到墙根小雏菊
3-6秒:主人公的红色板鞋入镜,他蹲在街边花摊前,笑着把向日葵拢进怀里
6-8秒:花瓣蹭过白T恤,他转身踏上滑板,花摊老板笑着喊话
8-10秒:他冲老板挥手,开始滑行,金黄花瓣落在滑板板面
【要求】与前视频保持色调一致,动作连贯流畅
【参考】@video_file_1 原视频---
镜头运动词汇表
| 中文 | 英文 | 效果 |
|---|---|---|
| 推镜头 | push in / zoom in | 强调主体,营造紧张感 |
| 拉镜头 | pull out / zoom out | 展现场景,营造疏离感 |
| 摇镜头 | pan | 左右/上下展示环境 |
| 移镜头 | dolly / truck | 平行移动,跟随主体 |
| 跟镜头 | follow | 跟随主体移动 |
| 环绕镜头 | orbit / circle | 360度展示主体 |
| 升降镜头 | crane up/down | 从上往下或从下往上 |
| 希区柯克变焦 | dolly zoom | 背景压缩/拉伸效果 |
| 手持晃动 | handheld | 纪实感/紧张感 |
| 一镜到底 | one shot | 不换镜头,连续拍摄 |
---
氛围关键词速查
光影:逆光、侧光、顶光、伦勃朗光、剪影、轮廓光、体积光、丁达尔效应
色调:暖色调、冷色调、高饱和、低饱和、黑白、赛博朋克、复古胶片
质感:电影级、纪录片风格、广告质感、MV风格、油画感、水墨感
情绪:温馨、紧张、悬疑、欢快、忧伤、史诗、治愈、惊悚
---
多模态引用语法
全能模式(omni_reference)
图片、视频、音频使用独立编号,分别对应各自数组中的顺序:
@image_file_1 作为首帧 → image_files[0]
@image_file_2 作为角色形象参考 → image_files[1]
@image_file_3 作为场景参考 → image_files[2]
@video_file_1 参考运镜方式 → video_files[0]
@video_file_2 参考动作节奏 → video_files[1]
@audio_file_1 用于配乐 → audio_files[0]
@audio_file_2 用于对白参考 → audio_files[1]兼容旧版语法:@图片1=@image_file_1,@视频1=@video_file_1,@音频1=@audio_file_1
首尾帧模式(first_last_frames)
filePaths[0] → 首帧图片
filePaths[1] → 尾帧图片(可选)- 0 张图片:纯文生视频
- 1 张图片:图生视频(首帧)
- 2 张图片:首尾帧视频
---
常见场景写法
视频延长
将@video_file_1延长X秒(生成长度选X秒)
0-X秒:[新内容],与前视频无缝衔接剧情颠覆
基于@video_file_1进行编辑:
【保留】原视频的_____
【修改】[具体改动]角色替换
将@video_file_1中的人物换成@image_file_1
保持@video_file_1的运镜和动作音乐卡点
参考@video_file_1的节奏
0-2秒:[内容]
2-4秒:音乐重拍,[内容]首尾帧过渡
【功能模式】first_last_frames
镜头从首帧缓缓过渡到尾帧,[过渡方式描述]---
Seedream 4.5 画图提示词技巧
生成 Seedance 2.0 参考图时的最佳实践:
1. 使用英文提示词:Seedream 4.5 对英文理解更好 2. 明确描述细节:包括人物外貌、服装、姿势、表情、环境 3. 指定画面构图:如 "full body shot"、"close-up portrait"、"wide angle landscape" 4. 风格一致性:所有参考图使用相同的风格描述词,确保视频画面统一 5. 匹配视频比例:image_size 与目标视频的 ratio 保持一致
角色图提示词模板:
[character description], [clothing], [pose], [expression], [art style], high quality, detailed, [aspect description]场景图提示词模板:
[environment description], [time of day], [weather/atmosphere], [lighting], [art style], cinematic composition, high quality---
优质提示词检查清单
- [ ] 时间轴清晰(0-X秒)
- [ ] 镜头语言明确(推/拉/摇/移)
- [ ] 动作描述具体
- [ ] 多模态引用规范(@image_file_N / @video_file_N / @audio_file_N)
- [ ] 声音设计完整
- [ ] 参考素材标注清楚
- [ ] image_files / video_files / audio_files 数组顺序与 @ 引用对应
- [ ] 选择了正确的功能模式(omni_reference / first_last_frames)
"""
Seedance 分镜 Skill 通用 API 脚本
供 Cursor Agent 在 MCP 不可用时通过 Shell 调用。
API Key 通过环境变量 XSKILL_API_KEY 读取。
用法:
python seedance_api.py submit --model MODEL_ID --params '{"prompt":"..."}'
python seedance_api.py query --task-id TASK_ID
python seedance_api.py poll --task-id TASK_ID [--interval 5] [--timeout 600]
python seedance_api.py balance
"""
import argparse
import json
import os
import sys
import time
import requests
BASE_URL = os.environ.get("XSKILL_BASE_URL", "https://api.xskill.ai")
API_KEY = os.environ.get("XSKILL_API_KEY", "")
CREATE_URL = f"{BASE_URL}/api/v3/tasks/create"
QUERY_URL = f"{BASE_URL}/api/v3/tasks/query"
BALANCE_URL = f"{BASE_URL}/api/v3/user/balance"
UPLOAD_URL = f"{BASE_URL}/api/v3/upload/image"
def _headers():
if not API_KEY:
print("错误: 环境变量 XSKILL_API_KEY 未设置", file=sys.stderr)
print(" export XSKILL_API_KEY=sk-your-api-key", file=sys.stderr)
print(" 获取 API Key: https://www.xskill.ai/#/v2/api-keys", file=sys.stderr)
sys.exit(1)
return {
"Content-Type": "application/json",
"Authorization": f"Bearer {API_KEY}",
}
# ------------------------------------------------------------------
# submit: 创建任务
# ------------------------------------------------------------------
def cmd_submit(args):
params = json.loads(args.params)
payload = {"model": args.model, "params": params}
resp = requests.post(CREATE_URL, json=payload, headers=_headers(), timeout=30)
result = resp.json()
if result.get("code") != 200:
print(json.dumps(result, ensure_ascii=False, indent=2))
sys.exit(1)
task_id = result["data"]["task_id"]
price = result["data"].get("price", "?")
print(json.dumps({
"task_id": task_id,
"price": price,
"status": "submitted",
"raw": result,
}, ensure_ascii=False, indent=2))
# ------------------------------------------------------------------
# query: 查询任务状态
# ------------------------------------------------------------------
def cmd_query(args):
resp = requests.post(QUERY_URL, json={"task_id": args.task_id}, headers=_headers(), timeout=30)
result = resp.json()
data = result.get("data", {})
status = data.get("status", "unknown")
output_urls = []
if status == "completed":
output = data.get("result", {}).get("output", {})
output_urls = output.get("images", []) or output.get("videos", []) or []
print(json.dumps({
"task_id": args.task_id,
"status": status,
"output_urls": output_urls,
"error": data.get("error", ""),
"raw": result,
}, ensure_ascii=False, indent=2))
# ------------------------------------------------------------------
# poll: 轮询等待任务完成
# ------------------------------------------------------------------
def cmd_poll(args):
interval = args.interval
timeout = args.timeout
elapsed = 0
print(f"[轮询] task_id={args.task_id} 间隔={interval}s 超时={timeout}s", file=sys.stderr)
while elapsed < timeout:
resp = requests.post(QUERY_URL, json={"task_id": args.task_id}, headers=_headers(), timeout=30)
result = resp.json()
data = result.get("data", {})
status = data.get("status", "unknown")
print(f"[轮询] {elapsed}s - {status}", file=sys.stderr)
if status == "completed":
output = data.get("result", {}).get("output", {})
output_urls = output.get("images", []) or output.get("videos", []) or []
print(json.dumps({
"task_id": args.task_id,
"status": "completed",
"output_urls": output_urls,
"raw": result,
}, ensure_ascii=False, indent=2))
return
if status == "failed":
print(json.dumps({
"task_id": args.task_id,
"status": "failed",
"error": data.get("error", "未知错误"),
"raw": result,
}, ensure_ascii=False, indent=2))
sys.exit(1)
time.sleep(interval)
elapsed += interval
print(json.dumps({
"task_id": args.task_id,
"status": "timeout",
"error": f"等待 {timeout}s 后仍未完成",
}, ensure_ascii=False, indent=2))
sys.exit(1)
# ------------------------------------------------------------------
# balance: 查询余额
# ------------------------------------------------------------------
def cmd_balance(args):
resp = requests.get(BALANCE_URL, headers=_headers(), timeout=30)
result = resp.json()
print(json.dumps(result, ensure_ascii=False, indent=2))
# ------------------------------------------------------------------
# upload: 上传图片
# ------------------------------------------------------------------
def cmd_upload(args):
payload = {}
if args.image_url:
payload["image_url"] = args.image_url
elif args.image_path:
import base64
with open(args.image_path, "rb") as f:
payload["image_data"] = base64.b64encode(f.read()).decode()
else:
print("错误: 需要 --image-url 或 --image-path", file=sys.stderr)
sys.exit(1)
resp = requests.post(UPLOAD_URL, json=payload, headers=_headers(), timeout=60)
result = resp.json()
print(json.dumps(result, ensure_ascii=False, indent=2))
# ------------------------------------------------------------------
# CLI 入口
# ------------------------------------------------------------------
def main():
parser = argparse.ArgumentParser(description="Seedance Storyboard API CLI")
sub = parser.add_subparsers(dest="command")
p_submit = sub.add_parser("submit", help="创建任务")
p_submit.add_argument("--model", required=True, help="模型 ID")
p_submit.add_argument("--params", required=True, help="参数 JSON 字符串")
p_query = sub.add_parser("query", help="查询任务")
p_query.add_argument("--task-id", required=True, help="任务 ID")
p_poll = sub.add_parser("poll", help="轮询等待任务完成")
p_poll.add_argument("--task-id", required=True, help="任务 ID")
p_poll.add_argument("--interval", type=int, default=5, help="轮询间隔(秒)")
p_poll.add_argument("--timeout", type=int, default=600, help="超时时间(秒)")
sub.add_parser("balance", help="查询余额")
p_upload = sub.add_parser("upload", help="上传图片")
p_upload.add_argument("--image-url", help="网络图片 URL")
p_upload.add_argument("--image-path", help="本地图片路径")
args = parser.parse_args()
commands = {
"submit": cmd_submit,
"query": cmd_query,
"poll": cmd_poll,
"balance": cmd_balance,
"upload": cmd_upload,
}
if args.command not in commands:
parser.print_help()
sys.exit(1)
commands[args.command](args)
if __name__ == "__main__":
main()
{
"schema_version": "2.0",
"meta": {
"generated_at": "2026-02-22T08:40:49.750Z",
"slug": "hexiaochun-seedance2-api",
"source_url": "https://github.com/hexiaochun/seedance2-api/tree/main/.cursor/skills/seedance2-api/",
"source_ref": "main",
"model": "claude",
"analysis_version": "3.0.0",
"source_type": "community",
"content_hash": "03dd86116c8c736774e3790bda44acdc8ba2b6421b85f29fe8cb861a78fd40ae",
"tree_hash": "137641c500e2c62b9a54b53e0ad688e897d8c2a39550913f4392bf0d0b183a80"
},
"skill": {
"name": "seedance2-api",
"description": "Out-of-the-box Seedance 2.0 API skill — just one API key to generate AI videos. Builds storyboards, generates reference images with Seedream 4.5, submits video tasks, and polls results. Supports both MCP and standalone Python script mode. Use when the user mentions seedance, AI video, storyboard, or video generation.",
"summary": "Generate AI videos from storyboards using Seedance 2.0 API. Build storyboards, create reference images with Seedream 4.5, submit video tasks, and poll for results.",
"icon": "📦",
"version": "1.0.0",
"author": "hexiaochun",
"license": "MIT",
"category": "data",
"tags": [
"ai-video",
"video-generation",
"seedance",
"storyboard",
"media"
],
"supported_tools": [
"claude",
"codex",
"claude-code"
],
"risk_factors": [
"network",
"env_access",
"scripts"
]
},
"security_audit": {
"risk_level": "low",
"is_blocked": false,
"safe_to_publish": true,
"summary": "This is a legitimate AI video generation skill that accesses the xskill.ai API. Static findings show network calls and environment variable access, which are expected for API-based skills. The detected 'external_commands' are false positives from Chinese template text in markdown code blocks. No malicious behavior detected.",
"risk_factor_evidence": [
{
"factor": "external_commands",
"evidence": [
{
"file": "reference.md",
"line_start": 5,
"line_end": 16
},
{
"file": "reference.md",
"line_start": 16,
"line_end": 24
},
{
"file": "reference.md",
"line_start": 24,
"line_end": 37
},
{
"file": "reference.md",
"line_start": 37,
"line_end": 41
},
{
"file": "reference.md",
"line_start": 41,
"line_end": 53
},
{
"file": "reference.md",
"line_start": 53,
"line_end": 57
},
{
"file": "reference.md",
"line_start": 57,
"line_end": 69
},
{
"file": "reference.md",
"line_start": 69,
"line_end": 73
},
{
"file": "reference.md",
"line_start": 73,
"line_end": 85
},
{
"file": "reference.md",
"line_start": 85,
"line_end": 89
},
{
"file": "reference.md",
"line_start": 89,
"line_end": 97
},
{
"file": "reference.md",
"line_start": 97,
"line_end": 101
},
{
"file": "reference.md",
"line_start": 101,
"line_end": 110
},
{
"file": "reference.md",
"line_start": 110,
"line_end": 114
},
{
"file": "reference.md",
"line_start": 114,
"line_end": 123
},
{
"file": "reference.md",
"line_start": 123,
"line_end": 133
},
{
"file": "reference.md",
"line_start": 133,
"line_end": 144
},
{
"file": "reference.md",
"line_start": 144,
"line_end": 150
},
{
"file": "reference.md",
"line_start": 150,
"line_end": 161
},
{
"file": "reference.md",
"line_start": 161,
"line_end": 167
},
{
"file": "reference.md",
"line_start": 167,
"line_end": 178
},
{
"file": "reference.md",
"line_start": 178,
"line_end": 184
},
{
"file": "reference.md",
"line_start": 184,
"line_end": 196
},
{
"file": "reference.md",
"line_start": 196,
"line_end": 202
},
{
"file": "reference.md",
"line_start": 202,
"line_end": 213
},
{
"file": "reference.md",
"line_start": 213,
"line_end": 219
},
{
"file": "reference.md",
"line_start": 219,
"line_end": 230
},
{
"file": "reference.md",
"line_start": 230,
"line_end": 269
},
{
"file": "reference.md",
"line_start": 269,
"line_end": 277
},
{
"file": "reference.md",
"line_start": 277,
"line_end": 279
},
{
"file": "reference.md",
"line_start": 279,
"line_end": 279
},
{
"file": "reference.md",
"line_start": 279,
"line_end": 279
},
{
"file": "reference.md",
"line_start": 279,
"line_end": 279
},
{
"file": "reference.md",
"line_start": 279,
"line_end": 279
},
{
"file": "reference.md",
"line_start": 279,
"line_end": 279
},
{
"file": "reference.md",
"line_start": 279,
"line_end": 283
},
{
"file": "reference.md",
"line_start": 283,
"line_end": 286
},
{
"file": "reference.md",
"line_start": 286,
"line_end": 297
},
{
"file": "reference.md",
"line_start": 297,
"line_end": 300
},
{
"file": "reference.md",
"line_start": 300,
"line_end": 303
},
{
"file": "reference.md",
"line_start": 303,
"line_end": 307
},
{
"file": "reference.md",
"line_start": 307,
"line_end": 310
},
{
"file": "reference.md",
"line_start": 310,
"line_end": 313
},
{
"file": "reference.md",
"line_start": 313,
"line_end": 316
},
{
"file": "reference.md",
"line_start": 316,
"line_end": 320
},
{
"file": "reference.md",
"line_start": 320,
"line_end": 323
},
{
"file": "reference.md",
"line_start": 323,
"line_end": 326
},
{
"file": "reference.md",
"line_start": 326,
"line_end": 341
},
{
"file": "reference.md",
"line_start": 341,
"line_end": 343
},
{
"file": "reference.md",
"line_start": 343,
"line_end": 346
},
{
"file": "reference.md",
"line_start": 346,
"line_end": 348
},
{
"file": "SKILL.md",
"line_start": 20,
"line_end": 20
},
{
"file": "SKILL.md",
"line_start": 20,
"line_end": 20
},
{
"file": "SKILL.md",
"line_start": 21,
"line_end": 21
},
{
"file": "SKILL.md",
"line_start": 21,
"line_end": 21
},
{
"file": "SKILL.md",
"line_start": 26,
"line_end": 26
},
{
"file": "SKILL.md",
"line_start": 26,
"line_end": 26
},
{
"file": "SKILL.md",
"line_start": 28,
"line_end": 31
},
{
"file": "SKILL.md",
"line_start": 31,
"line_end": 32
},
{
"file": "SKILL.md",
"line_start": 32,
"line_end": 32
},
{
"file": "SKILL.md",
"line_start": 32,
"line_end": 34
},
{
"file": "SKILL.md",
"line_start": 34,
"line_end": 35
},
{
"file": "SKILL.md",
"line_start": 35,
"line_end": 38
},
{
"file": "SKILL.md",
"line_start": 38,
"line_end": 51
},
{
"file": "SKILL.md",
"line_start": 51,
"line_end": 51
},
{
"file": "SKILL.md",
"line_start": 51,
"line_end": 67
},
{
"file": "SKILL.md",
"line_start": 67,
"line_end": 76
},
{
"file": "SKILL.md",
"line_start": 76,
"line_end": 89
},
{
"file": "SKILL.md",
"line_start": 89,
"line_end": 90
},
{
"file": "SKILL.md",
"line_start": 90,
"line_end": 101
},
{
"file": "SKILL.md",
"line_start": 101,
"line_end": 105
},
{
"file": "SKILL.md",
"line_start": 105,
"line_end": 114
},
{
"file": "SKILL.md",
"line_start": 114,
"line_end": 115
},
{
"file": "SKILL.md",
"line_start": 115,
"line_end": 126
},
{
"file": "SKILL.md",
"line_start": 126,
"line_end": 130
},
{
"file": "SKILL.md",
"line_start": 130,
"line_end": 141
},
{
"file": "SKILL.md",
"line_start": 141,
"line_end": 144
},
{
"file": "SKILL.md",
"line_start": 144,
"line_end": 152
},
{
"file": "SKILL.md",
"line_start": 152,
"line_end": 155
},
{
"file": "SKILL.md",
"line_start": 155,
"line_end": 158
},
{
"file": "SKILL.md",
"line_start": 158,
"line_end": 161
},
{
"file": "SKILL.md",
"line_start": 161,
"line_end": 180
},
{
"file": "SKILL.md",
"line_start": 180,
"line_end": 180
},
{
"file": "SKILL.md",
"line_start": 180,
"line_end": 181
},
{
"file": "SKILL.md",
"line_start": 181,
"line_end": 182
},
{
"file": "SKILL.md",
"line_start": 182,
"line_end": 186
},
{
"file": "SKILL.md",
"line_start": 186,
"line_end": 188
},
{
"file": "SKILL.md",
"line_start": 188,
"line_end": 190
},
{
"file": "SKILL.md",
"line_start": 190,
"line_end": 190
},
{
"file": "SKILL.md",
"line_start": 190,
"line_end": 190
},
{
"file": "SKILL.md",
"line_start": 190,
"line_end": 190
},
{
"file": "SKILL.md",
"line_start": 190,
"line_end": 204
},
{
"file": "SKILL.md",
"line_start": 204,
"line_end": 211
},
{
"file": "SKILL.md",
"line_start": 211,
"line_end": 219
},
{
"file": "SKILL.md",
"line_start": 219,
"line_end": 228
},
{
"file": "SKILL.md",
"line_start": 228,
"line_end": 229
},
{
"file": "SKILL.md",
"line_start": 229,
"line_end": 232
},
{
"file": "SKILL.md",
"line_start": 232,
"line_end": 236
},
{
"file": "SKILL.md",
"line_start": 236,
"line_end": 236
},
{
"file": "SKILL.md",
"line_start": 236,
"line_end": 236
},
{
"file": "SKILL.md",
"line_start": 236,
"line_end": 236
},
{
"file": "SKILL.md",
"line_start": 236,
"line_end": 236
},
{
"file": "SKILL.md",
"line_start": 236,
"line_end": 236
},
{
"file": "SKILL.md",
"line_start": 236,
"line_end": 237
},
{
"file": "SKILL.md",
"line_start": 237,
"line_end": 237
},
{
"file": "SKILL.md",
"line_start": 237,
"line_end": 238
},
{
"file": "SKILL.md",
"line_start": 238,
"line_end": 238
},
{
"file": "SKILL.md",
"line_start": 238,
"line_end": 245
},
{
"file": "SKILL.md",
"line_start": 245,
"line_end": 256
},
{
"file": "SKILL.md",
"line_start": 256,
"line_end": 265
},
{
"file": "SKILL.md",
"line_start": 265,
"line_end": 266
},
{
"file": "SKILL.md",
"line_start": 266,
"line_end": 269
},
{
"file": "SKILL.md",
"line_start": 269,
"line_end": 273
},
{
"file": "SKILL.md",
"line_start": 273,
"line_end": 273
},
{
"file": "SKILL.md",
"line_start": 273,
"line_end": 280
},
{
"file": "SKILL.md",
"line_start": 280,
"line_end": 291
},
{
"file": "SKILL.md",
"line_start": 291,
"line_end": 304
},
{
"file": "SKILL.md",
"line_start": 304,
"line_end": 315
},
{
"file": "SKILL.md",
"line_start": 315,
"line_end": 318
},
{
"file": "SKILL.md",
"line_start": 318,
"line_end": 324
},
{
"file": "SKILL.md",
"line_start": 324,
"line_end": 327
},
{
"file": "SKILL.md",
"line_start": 327,
"line_end": 332
},
{
"file": "SKILL.md",
"line_start": 332,
"line_end": 333
},
{
"file": "SKILL.md",
"line_start": 333,
"line_end": 334
},
{
"file": "SKILL.md",
"line_start": 334,
"line_end": 335
},
{
"file": "SKILL.md",
"line_start": 335,
"line_end": 343
},
{
"file": "SKILL.md",
"line_start": 343,
"line_end": 354
},
{
"file": "SKILL.md",
"line_start": 354,
"line_end": 358
},
{
"file": "SKILL.md",
"line_start": 358,
"line_end": 380
},
{
"file": "SKILL.md",
"line_start": 380,
"line_end": 406
},
{
"file": "SKILL.md",
"line_start": 406,
"line_end": 419
},
{
"file": "SKILL.md",
"line_start": 419,
"line_end": 440
},
{
"file": "SKILL.md",
"line_start": 440,
"line_end": 441
},
{
"file": "SKILL.md",
"line_start": 441,
"line_end": 442
},
{
"file": "SKILL.md",
"line_start": 442,
"line_end": 443
},
{
"file": "SKILL.md",
"line_start": 443,
"line_end": 444
},
{
"file": "SKILL.md",
"line_start": 444,
"line_end": 444
},
{
"file": "SKILL.md",
"line_start": 444,
"line_end": 446
},
{
"file": "SKILL.md",
"line_start": 446,
"line_end": 446
},
{
"file": "SKILL.md",
"line_start": 446,
"line_end": 446
},
{
"file": "SKILL.md",
"line_start": 446,
"line_end": 446
}
]
},
{
"factor": "network",
"evidence": [
{
"file": "scripts/seedance_api.py",
"line_start": 49,
"line_end": 49
},
{
"file": "scripts/seedance_api.py",
"line_start": 70,
"line_end": 70
},
{
"file": "scripts/seedance_api.py",
"line_start": 100,
"line_end": 100
},
{
"file": "scripts/seedance_api.py",
"line_start": 141,
"line_end": 141
},
{
"file": "scripts/seedance_api.py",
"line_start": 161,
"line_end": 161
},
{
"file": "scripts/seedance_api.py",
"line_start": 22,
"line_end": 22
},
{
"file": "scripts/seedance_api.py",
"line_start": 35,
"line_end": 35
},
{
"file": "SKILL.md",
"line_start": 5,
"line_end": 5
},
{
"file": "SKILL.md",
"line_start": 30,
"line_end": 30
},
{
"file": "SKILL.md",
"line_start": 129,
"line_end": 129
},
{
"file": "SKILL.md",
"line_start": 214,
"line_end": 214
},
{
"file": "SKILL.md",
"line_start": 251,
"line_end": 251
},
{
"file": "SKILL.md",
"line_start": 251,
"line_end": 251
},
{
"file": "SKILL.md",
"line_start": 286,
"line_end": 286
},
{
"file": "SKILL.md",
"line_start": 286,
"line_end": 286
}
]
},
{
"factor": "env_access",
"evidence": [
{
"file": "scripts/seedance_api.py",
"line_start": 22,
"line_end": 22
},
{
"file": "scripts/seedance_api.py",
"line_start": 23,
"line_end": 23
},
{
"file": "scripts/seedance_api.py",
"line_start": 5,
"line_end": 5
},
{
"file": "scripts/seedance_api.py",
"line_start": 23,
"line_end": 23
},
{
"file": "scripts/seedance_api.py",
"line_start": 23,
"line_end": 23
},
{
"file": "scripts/seedance_api.py",
"line_start": 32,
"line_end": 32
},
{
"file": "scripts/seedance_api.py",
"line_start": 33,
"line_end": 33
},
{
"file": "scripts/seedance_api.py",
"line_start": 34,
"line_end": 34
},
{
"file": "scripts/seedance_api.py",
"line_start": 39,
"line_end": 39
},
{
"file": "SKILL.md",
"line_start": 26,
"line_end": 26
},
{
"file": "SKILL.md",
"line_start": 26,
"line_end": 26
},
{
"file": "SKILL.md",
"line_start": 29,
"line_end": 29
}
]
}
],
"critical_findings": [],
"high_findings": [],
"medium_findings": [
{
"title": "API Credential Access",
"description": "Skill accesses XSKILL_API_KEY environment variable for authentication with external API. This is standard practice for API-based skills but warrants documentation.",
"locations": [
{
"file": "scripts/seedance_api.py",
"line_start": 22,
"line_end": 23
}
],
"confidence": 0.9,
"confidence_reasoning": "Direct evidence of environment variable access for API authentication. Standard and expected behavior for API client skills."
},
{
"title": "Network API Calls",
"description": "Skill makes HTTP requests to xskill.ai API endpoint for video and image generation. Expected behavior for AI video generation service.",
"locations": [
{
"file": "scripts/seedance_api.py",
"line_start": 49,
"line_end": 49
}
],
"confidence": 0.9,
"confidence_reasoning": "Direct evidence of HTTP POST requests to legitimate API endpoint (api.xskill.ai). This is the intended functionality of the skill."
}
],
"low_findings": [
{
"title": "False Positive: External Commands Detection",
"description": "Static analyzer incorrectly flagged 141 instances of 'external_commands' due to Chinese template text using backticks in markdown code blocks (e.g., 【风格】). These are documentation templates, not shell commands.",
"locations": [
{
"file": "reference.md",
"line_start": 5,
"line_end": 16
}
],
"confidence": 0.95,
"confidence_reasoning": "Chinese characters in markdown code blocks use backtick syntax for formatting, not command execution. The patterns detected are template placeholders like 【风格】, not actual shell commands."
},
{
"title": "False Positive: Weak Cryptographic Algorithm",
"description": "Static analyzer incorrectly flagged 'weak cryptographic algorithm' in multiple locations. No cryptographic code exists in this skill.",
"locations": [],
"confidence": 0.95,
"confidence_reasoning": "No cryptographic operations found in the codebase. The analyzer appears to have misidentified patterns in Chinese documentation text."
},
{
"title": "False Positive: System Reconnaissance",
"description": "Static analyzer incorrectly flagged system reconnaissance patterns. These are documentation references, not actual system scanning.",
"locations": [],
"confidence": 0.9,
"confidence_reasoning": "No system reconnaissance code detected. The findings appear to be false positives from documentation text."
}
],
"dangerous_patterns": [],
"files_scanned": 3,
"total_lines": 1030,
"audit_model": "claude",
"audited_at": "2026-02-22T08:40:49.750Z",
"risk_factors": [
"network",
"env_access",
"scripts"
]
},
"content": {
"user_title": "Generate AI Videos from Storyboards",
"value_statement": "This skill enables Claude, Codex, and Claude Code users to generate professional AI videos by building storyboards, creating reference images, and submitting video generation tasks to Seedance 2.0 API. It streamlines the complex multi-step video creation process into a simple, automated workflow.",
"seo_keywords": [
"Claude Code AI video generation",
"Seedance 2.0 skill for Claude",
"AI video generation Claude",
"storyboard to video Claude",
"Claude Code video creation",
"Seedream 4.5 image generation",
"video generation API skill",
"AI video workflow automation",
"Claude Codex media skill",
"text to video skill"
],
"actual_capabilities": [
"Build storyboards with structured templates for video prompts",
"Generate reference images using Seedream 4.5 text-to-image and editing",
"Submit video generation tasks to Seedance 2.0 API with flexible parameters",
"Poll and retrieve video results with automatic status checking",
"Support both MCP tool mode and standalone Python script mode",
"Handle multi-asset videos with image, video, and audio references"
],
"limitations": [
"Requires valid XSKILL_API_KEY for API authentication",
"Cannot generate realistic human faces in videos",
"Maximum 12 files per task: up to 9 images, 3 videos, and 3 audio files",
"Video generation takes approximately 10 minutes per task"
],
"use_cases": [
{
"title": "Content Creator Video Production",
"description": "Quickly generate marketing videos, social media content, or short films by building storyboards and letting AI handle the video generation.",
"target_user": "Content creators, marketers, social media managers"
},
{
"title": "Developer Prototyping",
"description": "Integrate AI video generation into automated workflows or pipelines using the Python script mode for programmatic video creation.",
"target_user": "Software developers building video automation tools"
},
{
"title": "Creative Concept Visualization",
"description": "Visualize creative concepts and story ideas by generating reference images and video previews before committing to full production.",
"target_user": "Filmmakers, animators, creative directors"
}
],
"prompt_templates": [
{
"title": "Basic Video Request",
"prompt": "Help me generate a video about [describe your video concept]. I want it to be [duration] seconds in [aspect ratio] format with a [style] style.",
"scenario": "User wants a simple video without existing assets"
},
{
"title": "Video with Reference Images",
"prompt": "Generate a [duration]-second [style] video at [aspect ratio]. I have reference images for the character and background. Help me build a storyboard and submit the video task to Seedance.",
"scenario": "User has reference images they want to use"
},
{
"title": "First and Last Frame Video",
"prompt": "Create a video that transitions smoothly from [describe first frame] to [describe last frame]. Use first_last_frames mode with a [duration] second duration at [aspect ratio].",
"scenario": "User wants precise control over start and end frames"
},
{
"title": "Complete Production Workflow",
"prompt": "I want to create a complete video: First, generate reference images for [describe scenes]. Then build a storyboard with camera movements and transitions. Finally, submit the video task with all assets and poll for results.",
"scenario": "User wants full end-to-end video production workflow"
}
],
"output_examples": [
{
"input": "User wants a 15-second sci-fi video of an astronaut on Mars",
"output": "Storyboard created with cinematic sci-fi style, 16:9 aspect ratio. Reference images generated for astronaut and Mars landscape. Video task submitted successfully. Poll every 30 seconds, results expected in ~10 minutes."
},
{
"input": "Generate an astronaut walking on Mars",
"output": "Step 1: Generated astronaut + Mars scene images with Seedream 4.5\nStep 2: Submitted video task with image references\nStep 3: Video is generating (~10 minutes)\nStep 4: Video completed: https://example.com/video.mp4"
}
],
"best_practices": [
"Provide detailed scene descriptions including lighting, camera movement, and mood for better video quality",
"Use the auto-poll feature with appropriate timeouts to avoid missing results",
"Generate reference images first before submitting video tasks to ensure quality assets"
],
"anti_patterns": [
"Avoid submitting vague prompts without storyboard structure - results will be poor",
"Do not exceed file limits (9 images, 3 videos, 3 audio) as tasks will fail",
"Avoid using realistic human face uploads - Seedance does not support this"
],
"faq": [
{
"question": "How do I get an API key for Seedance?",
"answer": "Get your API key from https://www.xskill.ai/#/v2/api-keys and set it as the XSKILL_API_KEY environment variable."
},
{
"question": "What is the difference between Omni Reference and First Last Frames mode?",
"answer": "Omni Reference uses multiple image/video/audio files as references throughout the video. First Last Frames mode specifically controls the exact starting and ending frames of the video."
},
{
"question": "How long does video generation take?",
"answer": "Video generation typically takes approximately 10 minutes. Use the poll command with a 600-second timeout to wait for results."
},
{
"question": "Can I use my own images in the video?",
"answer": "Yes, you can upload local images or provide URLs. Use the upload command or direct URL input when submitting tasks."
},
{
"question": "What aspect ratios are supported?",
"answer": "Supported ratios include 16:9, 9:16, 1:1, 21:9, 4:3, and 3:4."
},
{
"question": "Does this skill work without MCP?",
"answer": "Yes, the skill includes a standalone Python script (scripts/seedance_api.py) that can be run directly from the command line when MCP is unavailable."
}
]
},
"file_structure": [
{
"name": "scripts",
"type": "dir",
"path": "scripts",
"children": [
{
"name": "seedance_api.py",
"type": "file",
"path": "scripts/seedance_api.py",
"lines": 210
}
]
},
{
"name": "reference.md",
"type": "file",
"path": "reference.md",
"lines": 362
},
{
"name": "SKILL.md",
"type": "file",
"path": "SKILL.md",
"lines": 458
}
]
}
Related skills
FAQ
What is needed to run it?
It needs a single XSKILL_API_KEY and Python 3.8+ with the requests library, or the xskill-ai MCP.
How long do images take?
Reference images typically complete in 1-2 minutes.