
Aliyun Wan Animate Move
- 49 installs
- 396 repo stars
- Updated July 18, 2026
- cinience/alicloud-skills
Provides aliyun-wan-animate-move capabilities for Claude Code workflows.
About
aliyun-wan-animate-move enables Provides aliyun-wan-animate-move capabilities for Claude Code workflows.. Use it to automate and enhance your development workflow with AI-powered capabilities.
- Enhances Claude Code
- Production-ready
Aliyun Wan Animate Move by the numbers
- 49 all-time installs (skills.sh)
- Ranked #1,313 of 2,245 Frontend Development skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/cinience/alicloud-skills --skill aliyun-wan-animate-moveAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 49 |
|---|---|
| repo stars | ★ 396 |
| Last updated | July 18, 2026 |
| Repository | cinience/alicloud-skills ↗ |
What it does
Provides aliyun-wan-animate-move capabilities for Claude Code workflows.
Files
Wan 2.2 Animate Move (Image-to-Motion)
Validation
mkdir -p output/aliyun-wan-animate-move
python -m py_compile skills/ai/video/aliyun-wan-animate-move/scripts/generate_animate_move.py && echo "py_compile_ok" > output/aliyun-wan-animate-move/validate.txtPass criteria: command exits 0 and output/aliyun-wan-animate-move/validate.txt is generated.
Output And Evidence
- Save task IDs, polling responses, and final video URLs to
output/aliyun-wan-animate-move/. - Keep at least one end-to-end run log for troubleshooting.
Prerequisites
- Install SDK (recommended in a venv):
python3 -m venv .venv
. .venv/bin/activate
python -m pip install requests- Set
DASHSCOPE_API_KEYin your environment, or adddashscope_api_keyto~/.alibabacloud/credentials.
Critical model names
wan2.2-animate-move-- supports motion transfer from reference video to character image
Capabilities
| Capability | Description | Required inputs |
|---|---|---|
| Motion transfer | Transfer actions/expressions from reference video to character image | image_url + video_url |
Service modes
| Mode | Description |
|---|---|
wan-std | Standard mode, faster generation, cost-effective, suitable for preview and basic animation |
wan-pro | Professional mode, smoother animation, better quality, longer processing time |
API endpoint (async only)
POST https://dashscope.aliyuncs.com/api/v1/services/aigc/image2video/video-synthesisRequired headers:
Authorization: Bearer $DASHSCOPE_API_KEYContent-Type: application/jsonX-DashScope-Async: enable
Singapore endpoint: replace dashscope.aliyuncs.com with dashscope-intl.aliyuncs.com.
Normalized interface
Request
image_url(string, required) -- public HTTP/HTTPS URL of the character imagevideo_url(string, required) -- public HTTP/HTTPS URL of the reference motion videowatermark(boolean, optional) -- add watermark (default: false)mode(string, required) --wan-stdorwan-procheck_image(boolean, optional) -- whether to perform image detection (default: true)
Image input limits
- Formats: JPG, JPEG, PNG, BMP, WEBP
- Resolution: [200, 4096] pixels per side
- Aspect ratio: 1:3 to 3:1
- Max size: 5MB
- Content: single person, facing camera, face fully visible, moderate proportion in frame
Video input limits
- Formats: MP4, AVI, MOV
- Duration: 2-30s
- Resolution: [200, 2048] pixels per side
- Aspect ratio: 1:3 to 3:1
- Max size: 200MB
- Content: single person, facing camera, face fully visible, moderate proportion in frame
Response (task creation)
output.task_id(string) -- use for polling, valid 24 hoursoutput.task_status(string) -- PENDING | RUNNING | SUCCEEDED | FAILED | CANCELED | UNKNOWNrequest_id(string)
Response (task result)
output.video_url(string) -- generated video URLusage.video_count(integer)usage.video_duration(integer) -- duration in seconds
Quick start (Python + HTTP)
import os
import json
import time
import requests
API_KEY = os.getenv("DASHSCOPE_API_KEY")
BASE_URL = "https://dashscope.aliyuncs.com/api/v1"
def create_animate_move_task(image_url: str, video_url: str, mode: str = "wan-std") -> str:
"""Create an animate-move task and return task_id."""
payload = {
"model": "wan2.2-animate-move",
"input": {
"image_url": image_url,
"video_url": video_url,
"watermark": False,
},
"parameters": {
"mode": mode,
},
}
resp = requests.post(
f"{BASE_URL}/services/aigc/image2video/video-synthesis",
headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
"X-DashScope-Async": "enable",
},
json=payload,
)
resp.raise_for_status()
data = resp.json()
return data["output"]["task_id"]
def poll_task(task_id: str, interval: int = 15) -> dict:
"""Poll until task completes. Returns final response."""
while True:
resp = requests.get(
f"{BASE_URL}/tasks/{task_id}",
headers={"Authorization": f"Bearer {API_KEY}"},
)
resp.raise_for_status()
data = resp.json()
status = data["output"]["task_status"]
if status in ("SUCCEEDED", "FAILED", "CANCELED"):
return data
time.sleep(interval)Error handling
| Error | Likely cause | Action |
|---|---|---|
| 401/403 | Missing or invalid DASHSCOPE_API_KEY | Check env var or credentials file |
400 InvalidParameter | Unsupported image/video format, bad dimensions, missing fields | Validate parameters |
| "does not support synchronous calls" | Missing X-DashScope-Async: enable header | Add required header |
| 429 | Rate limit or quota | Retry with backoff |
Output location
- Default output:
output/aliyun-wan-animate-move/videos/ - Override base dir with
OUTPUT_DIR.
Anti-patterns
- Do not use model names other than
wan2.2-animate-move. - Do not call this API synchronously -- async header is required.
- Do not use multiple people in image or video -- single person only.
- Video URLs expire after 24 hours; download and persist immediately.
- Do not use images with occluded faces or extreme proportions.
Workflow
1) Confirm user intent: transfer motion from reference video to character image. 2) Select service mode: wan-std (fast/cheap) or wan-pro (high quality). 3) Prepare image URL and video URL with valid formats and dimensions. 4) Create async task and poll for results. 5) Download and save generated video before URL expiration.
References
- See
references/api_reference.mdfor full HTTP API details. - See
references/sources.mdfor source links.
DashScope API Reference (Wan 2.2 Animate Move)
Model
| Model | Capabilities | Modes |
|---|---|---|
| wan2.2-animate-move | Motion transfer from reference video to character image | wan-std, wan-pro |
Endpoint
POST https://dashscope.aliyuncs.com/api/v1/services/aigc/image2video/video-synthesisSingapore: https://dashscope-intl.aliyuncs.com/api/v1/services/aigc/image2video/video-synthesis
Required headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Authorization | Bearer $DASHSCOPE_API_KEY |
| X-DashScope-Async | enable |
Request body
{
"model": "wan2.2-animate-move",
"input": {
"image_url": "https://example.com/person.jpg",
"video_url": "https://example.com/dance.mp4",
"watermark": false
},
"parameters": {
"mode": "wan-std",
"check_image": true
}
}input fields
| Field | Type | Required | Description |
|---|---|---|---|
| image_url | string | Yes | Public HTTP/HTTPS URL of the character image |
| video_url | string | Yes | Public HTTP/HTTPS URL of the reference motion video |
| watermark | boolean | No | Add "AI generated" watermark (default: false) |
Image requirements
| Constraint | Value |
|---|---|
| Formats | JPG, JPEG, PNG, BMP, WEBP |
| Resolution | [200, 4096] pixels per side |
| Aspect ratio | 1:3 to 3:1 |
| Max size | 5MB |
| Content | Single person, facing camera, face fully visible, moderate proportion |
Video requirements
| Constraint | Value |
|---|---|
| Formats | MP4, AVI, MOV |
| Duration | 2-30s |
| Resolution | [200, 2048] pixels per side |
| Aspect ratio | 1:3 to 3:1 |
| Max size | 200MB |
| Content | Single person, facing camera, face fully visible, moderate proportion |
parameters fields
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| mode | string | Yes | - | wan-std (standard) or wan-pro (professional) |
| check_image | boolean | No | true | Whether to perform image detection |
Task creation response
{
"output": {
"task_status": "PENDING",
"task_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
},
"request_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Task polling
GET https://dashscope.aliyuncs.com/api/v1/tasks/{task_id}
Header: Authorization: Bearer $DASHSCOPE_API_KEYSuccess response
{
"request_id": "...",
"output": {
"task_id": "...",
"task_status": "SUCCEEDED",
"video_url": "https://..."
},
"usage": {
"video_count": 1,
"video_duration": 5
}
}Task statuses
| Status | Description |
|---|---|
| PENDING | Queued |
| RUNNING | Processing |
| SUCCEEDED | Complete |
| FAILED | Failed |
| CANCELED | Canceled |
| UNKNOWN | Not found or unknown |
Sources
- 万相-图生动作API参考 -- Official API documentation
- 视频生成模型概览 -- Model overview and selection guide
- 模型价格 -- Pricing details
- 上传文件获取临时URL -- File upload for OSS temporary URLs
"""Wan 2.2 Animate Move generation via DashScope HTTP API.
Transfers actions/expressions from a reference video onto a character image.
Usage:
python generate_animate_move.py --image-url https://example.com/person.jpg --video-url https://example.com/dance.mp4
python generate_animate_move.py --image-url https://example.com/person.jpg --video-url https://example.com/dance.mp4 --mode wan-pro
"""
import argparse
import json
import os
import sys
import time
import requests
API_KEY = os.getenv("DASHSCOPE_API_KEY", "")
BASE_URL = os.getenv(
"DASHSCOPE_BASE_URL",
"https://dashscope.aliyuncs.com/api/v1",
)
MODEL = "wan2.2-animate-move"
OUTPUT_DIR = os.getenv("OUTPUT_DIR", "output/aliyun-wan-animate-move/videos")
def _headers(async_mode: bool = True) -> dict:
h = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
}
if async_mode:
h["X-DashScope-Async"] = "enable"
return h
def create_task(
image_url: str,
video_url: str,
mode: str = "wan-std",
watermark: bool = False,
check_image: bool = True,
) -> str:
"""Submit an async animate-move task. Returns task_id."""
payload: dict = {
"model": MODEL,
"input": {
"image_url": image_url,
"video_url": video_url,
"watermark": watermark,
},
"parameters": {
"mode": mode,
"check_image": check_image,
},
}
resp = requests.post(
f"{BASE_URL}/services/aigc/image2video/video-synthesis",
headers=_headers(async_mode=True),
json=payload,
)
resp.raise_for_status()
data = resp.json()
if "output" not in data or "task_id" not in data["output"]:
raise RuntimeError(f"Unexpected response: {json.dumps(data, ensure_ascii=False)}")
return data["output"]["task_id"]
def poll_task(task_id: str, interval: int = 15) -> dict:
"""Poll until terminal status. Returns full response."""
while True:
resp = requests.get(
f"{BASE_URL}/tasks/{task_id}",
headers={"Authorization": f"Bearer {API_KEY}"},
)
resp.raise_for_status()
data = resp.json()
status = data["output"]["task_status"]
print(f" status: {status}")
if status in ("SUCCEEDED", "FAILED", "CANCELED"):
return data
time.sleep(interval)
def main() -> None:
parser = argparse.ArgumentParser(description="Wan 2.2 Animate Move")
parser.add_argument("--image-url", required=True, help="Character image URL")
parser.add_argument("--video-url", required=True, help="Reference motion video URL")
parser.add_argument("--mode", default="wan-std", choices=["wan-std", "wan-pro"],
help="Service mode: wan-std (fast) or wan-pro (quality)")
parser.add_argument("--watermark", action="store_true", help="Add AI watermark")
parser.add_argument("--no-check-image", action="store_true",
help="Skip image detection")
parser.add_argument("--output", default=OUTPUT_DIR, help="Output directory")
args = parser.parse_args()
if not API_KEY:
print("Error: DASHSCOPE_API_KEY not set", file=sys.stderr)
sys.exit(1)
print(f"Creating animate-move task (mode={args.mode})...")
task_id = create_task(
image_url=args.image_url,
video_url=args.video_url,
mode=args.mode,
watermark=args.watermark,
check_image=not args.no_check_image,
)
print(f"Task created: {task_id}")
print("Polling for result...")
result = poll_task(task_id)
os.makedirs(args.output, exist_ok=True)
out_path = os.path.join(args.output, f"{task_id}.json")
with open(out_path, "w") as f:
json.dump(result, f, indent=2, ensure_ascii=False)
status = result["output"]["task_status"]
if status == "SUCCEEDED":
video_url = result["output"].get("video_url", "")
print(f"Video URL: {video_url}")
else:
print(f"Task {status}: {json.dumps(result, ensure_ascii=False)}", file=sys.stderr)
sys.exit(1)
print(f"Result saved to {out_path}")
if __name__ == "__main__":
main()