
Aliyun Kling Video
- 68 installs
- 396 repo stars
- Updated July 18, 2026
- cinience/alicloud-skills
Generate videos with Kling v3 models on DashScope, covering text-to-video, image-to-video, reference-to-video, storyboard, and editing via the async API.
About
Uses the DashScope video-synthesis async API to generate videos with Kling v3 standard and omni models. A developer uses it to build text-to-video, image-to-video, reference-to-video, storyboard, or editing workflows.
- kling-v3-video-generation (t2v/i2v) and omni (r2v/editing) models
- Requires a Beijing-region DASHSCOPE_API_KEY with Kling enabled
Aliyun Kling Video by the numbers
- 68 all-time installs (skills.sh)
- Ranked #852 of 1,335 Generative Media 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-kling-videoAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 68 |
|---|---|
| repo stars | ★ 396 |
| Last updated | July 18, 2026 |
| Repository | cinience/alicloud-skills ↗ |
What it does
Generate videos with Kling v3 models on DashScope, covering text-to-video, image-to-video, reference-to-video, storyboard, and editing via the async API.
Files
Kling V3 Video Generation
Validation
mkdir -p output/aliyun-kling-video
python -m py_compile skills/ai/video/aliyun-kling-video/scripts/generate_kling_video.py && echo "py_compile_ok" > output/aliyun-kling-video/validate.txtPass criteria: command exits 0 and output/aliyun-kling-video/validate.txt is generated.
Output And Evidence
- Save task IDs, polling responses, and final video URLs to
output/aliyun-kling-video/. - Keep at least one end-to-end run log for troubleshooting.
Prerequisites
- Install dependencies (recommended in a venv):
python3 -m venv .venv
. .venv/bin/activate
python -m pip install requests- Set
DASHSCOPE_API_KEYin your environment (must be Beijing region API Key). - Enable Kling in 百炼控制台 — search "kling" and activate.
Critical model names
kling/kling-v3-video-generation— standard model: t2v, i2v (first frame, first+last frame)kling/kling-v3-omni-video-generation— omni model: adds reference-to-video, video editing, multi-subject references
Capabilities
| Capability | Model | Required media |
|---|---|---|
| Text-to-video | both | none |
| Smart storyboard (multi-shot) | both | none (use multi_prompt) |
| Image-to-video (first frame) | both | first_frame |
| Image-to-video (first+last frame) | both | first_frame + last_frame |
| Reference-to-video | omni only | refer and/or feature |
| Video editing | omni only | base + optional refer |
API endpoint (async only)
POST https://dashscope.aliyuncs.com/api/v1/services/aigc/video-generation/video-synthesisRequired headers:
Authorization: Bearer $DASHSCOPE_API_KEYContent-Type: application/jsonX-DashScope-Async: enable
Region: Beijing only. No Singapore endpoint.
Normalized interface
Request (input)
prompt(string, conditional) — up to 2500 characters. Required forshot_type=intelligence. For omni reference-to-video, use<<<element_1>>>,<<<image_1>>>,<<<video_1>>>to reference media.negative_prompt(string, optional) — content to excludemedia(array, optional) — media objects withtypeandurl:- Standard model types:
first_frame,last_frame - Omni model types:
first_frame,last_frame,refer,base,feature multi_shot(boolean, optional) — enable multi-shot generation (default: false)shot_type(string, conditional) —intelligence(AI auto-split) orcustomize(manual). Required whenmulti_shot=true.multi_prompt(array, optional) — per-shot prompts whenshot_type=customizeelement_list(array, optional) — multi-subject element images (omni model only)keep_original_sound(string, optional) —no(default) oryes, for videos (omni model only)
Request (parameters)
mode(string, optional) —pro(default, 1080P) orstd(720P)aspect_ratio(string, conditional) —16:9(default),9:16,1:1. Required for t2v and reference-to-video.duration(integer, optional) — video length [3, 15] seconds (default: 5). When using reference video, [3, 10].audio(boolean, optional) — generate audio (default: false). Affects pricing.watermark(boolean, optional) — add "可灵 AI" watermark (default: false)
Media input limits
Images (first_frame, last_frame, refer):
- Formats: JPEG, JPG, PNG (no transparency)
- Resolution: [300, 8000] pixels per side
- Max size: 10MB
Videos (base, feature):
- Formats: mp4, mov
- Duration: 3-10s
- Resolution: [720, 2160] pixels per side
- Frame rate: 24-60 fps
- Max size: 200MB
Media combination rules
kling/kling-v3-video-generation:
- i2v first frame:
first_frame(1 image) - i2v first+last:
first_frame+last_frame(1 each)
kling/kling-v3-omni-video-generation (all above plus):
- Reference:
featureonly (1 video), orreferonly (up to 7 with elements), orfeature+refer(1 video + up to 4 with elements), orfeature+first_frame(1 video + 1 image) - Video editing:
baseonly (1 video), orbase+refer(1 video + up to 4 with elements)
Response (task creation)
output.task_id(string) — valid 24 hoursoutput.task_status(string) — PENDING | RUNNING | SUCCEEDED | FAILED | CANCELEDrequest_id(string)
Response (task result)
output.video_url(string) — generated video URLoutput.watermark_video_url(string) — watermarked video URLusage.duration(integer),usage.size(string),usage.fps(integer),usage.audio(boolean)
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_kling_task(req: dict) -> str:
"""Create a Kling video generation task and return task_id."""
payload = {
"model": req.get("model", "kling/kling-v3-video-generation"),
"input": {"prompt": req.get("prompt", "")},
"parameters": {
"mode": req.get("mode", "pro"),
"duration": req.get("duration", 5),
"audio": req.get("audio", False),
"watermark": req.get("watermark", False),
},
}
if req.get("aspect_ratio"):
payload["parameters"]["aspect_ratio"] = req["aspect_ratio"]
if req.get("negative_prompt"):
payload["input"]["negative_prompt"] = req["negative_prompt"]
if req.get("media"):
payload["input"]["media"] = req["media"]
resp = requests.post(
f"{BASE_URL}/services/aigc/video-generation/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)Usage examples
# Text-to-video
task_id = create_kling_task({
"prompt": "一只小猫在月光下奔跑",
"aspect_ratio": "16:9",
"duration": 5,
"mode": "std",
})
# Image-to-video (first frame)
task_id = create_kling_task({
"prompt": "花朵绽放的延时摄影",
"media": [{"type": "first_frame", "url": "https://example.com/flower.jpg"}],
"duration": 5,
})
# Reference-to-video with omni model
task_id = create_kling_task({
"model": "kling/kling-v3-omni-video-generation",
"prompt": "一只<<<element_1>>>在月光下奔跑",
"media": [{"type": "refer", "url": "https://example.com/cat.jpg"}],
"aspect_ratio": "16:9",
})Error handling
| Error | Likely cause | Action |
|---|---|---|
| 401/403 | Missing or invalid API Key | Check env var, must be Beijing region |
400 InvalidParameter | Bad media combination or missing required params | Validate against model's media rules |
| "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-kling-video/videos/ - Override base dir with
OUTPUT_DIR.
Anti-patterns
- Do not use model names other than
kling/kling-v3-video-generationorkling/kling-v3-omni-video-generation. - Do not call this API synchronously — async header is required.
- Do not use
refer,base, orfeaturemedia types with the standard model — use omni only. - Do not mix incompatible media combinations.
- Video URLs expire; download and persist immediately.
- Beijing region only — do not use Singapore endpoint.
Workflow
1) Confirm user intent: t2v, i2v, reference-to-video, editing, or storyboard. 2) Select appropriate model (standard for basic t2v/i2v, omni for reference/editing). 3) Prepare media array with correct types and valid URLs. 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 (Kling V3 Video Generation)
Models
| Model | Capabilities |
|---|---|
| kling/kling-v3-video-generation | t2v, i2v (first frame, first+last frame), smart storyboard |
| kling/kling-v3-omni-video-generation | All above + reference-to-video, video editing, multi-subject |
Endpoint
POST https://dashscope.aliyuncs.com/api/v1/services/aigc/video-generation/video-synthesisBeijing region only. No Singapore endpoint.
Required headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Authorization | Bearer $DASHSCOPE_API_KEY |
| X-DashScope-Async | enable |
Request body
{
"model": "kling/kling-v3-video-generation",
"input": {
"prompt": "一只小猫在月光下奔跑",
"media": [
{"type": "first_frame", "url": "https://..."}
]
},
"parameters": {
"mode": "pro",
"aspect_ratio": "16:9",
"duration": 5,
"audio": false,
"watermark": false
}
}input fields
| Field | Type | Required | Description |
|---|---|---|---|
| prompt | string | Conditional | Up to 2500 chars. Required for shot_type=intelligence |
| negative_prompt | string | No | Content to exclude |
| media | array | No | Media objects (not needed for t2v) |
| multi_shot | boolean | No | Enable multi-shot (default: false) |
| shot_type | string | Conditional | intelligence or customize (when multi_shot=true) |
| multi_prompt | array | No | Per-shot prompts (when shot_type=customize) |
| element_list | array | No | Multi-subject elements (omni only) |
media types
kling/kling-v3-video-generation:
| type | Description |
|---|---|
| first_frame | First frame image (1) |
| last_frame | Last frame image (1) |
kling/kling-v3-omni-video-generation (all above plus):
| type | Description |
|---|---|
| refer | Reference image |
| base | Base video for editing |
| feature | Feature reference video |
Media combination rules (omni model)
| Task | Media combination | Limits |
|---|---|---|
| i2v first frame | first_frame | 1 image |
| i2v first+last | first_frame + last_frame | 1 each |
| Reference (video) | feature | 1 video |
| Reference (images) | refer | refer + elements ≤ 7 |
| Reference (video+images) | feature + refer | 1 video, refer + elements ≤ 4 |
| Reference (video+first) | feature + first_frame | 1 video + 1 image |
| Video editing | base | 1 video |
| Video editing + ref | base + refer | 1 video, refer + elements ≤ 4 |
Media input limits
Images: JPEG/JPG/PNG (no transparency), [300,8000]px, ≤10MB
Videos: mp4/mov, 3-10s, [720,2160]px, 24-60fps, ≤200MB
parameters fields
| Field | Type | Default | Description |
|---|---|---|---|
| mode | string | pro | pro (1080P) or std (720P) |
| aspect_ratio | string | 16:9 | 16:9, 9:16, 1:1. Required for t2v and reference-to-video |
| duration | integer | 5 | [3, 15] seconds (or [3, 10] with reference video) |
| audio | boolean | false | Generate audio (affects pricing) |
| watermark | boolean | false | "可灵 AI" watermark |
Omni model prompt references
Use <<<>>> to reference media in prompts:
<<<element_1>>>— reference an element from element_list<<<image_1>>>— reference a refer image (by media array order)<<<video_1>>>— reference a feature video
Example: 一只<<<element_1>>>在月光下奔跑
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://...",
"watermark_video_url": "https://..."
},
"usage": {
"duration": 5,
"size": "1280*720",
"fps": 24,
"video_count": 1,
"audio": false,
"SR": "720"
}
}Task statuses
| Status | Description |
|---|---|
| PENDING | Queued |
| RUNNING | Processing |
| SUCCEEDED | Complete |
| FAILED | Failed |
| CANCELED | Canceled |
| UNKNOWN | Not found or unknown |
Sources
- 可灵-视频生成 API参考 — Official API documentation
- 可灵-主体ID列表 — Pre-defined subject element IDs
- 可灵-图像生成 API参考 — Kling image generation
- 视频生成模型概览 — Model overview and selection guide
- 模型价格 — Pricing details
"""Kling V3 Video Generation via DashScope HTTP API.
Supports: text-to-video, image-to-video, reference-to-video, video editing.
Usage:
python generate_kling_video.py --prompt "a cat running under moonlight" --aspect-ratio 16:9
python generate_kling_video.py --first-frame https://example.com/img.jpg --prompt "flower blooming"
python generate_kling_video.py --model kling/kling-v3-omni-video-generation --prompt "<<<element_1>>> running" --refer img.jpg
"""
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",
)
OUTPUT_DIR = os.getenv("OUTPUT_DIR", "output/aliyun-kling-video/videos")
def _headers() -> dict:
return {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
"X-DashScope-Async": "enable",
}
def create_task(
model: str = "kling/kling-v3-video-generation",
prompt: str = "",
negative_prompt: str | None = None,
media: list[dict] | None = None,
mode: str = "pro",
aspect_ratio: str | None = None,
duration: int = 5,
audio: bool = False,
watermark: bool = False,
) -> str:
"""Submit an async Kling video task. Returns task_id."""
payload: dict = {
"model": model,
"input": {"prompt": prompt},
"parameters": {
"mode": mode,
"duration": duration,
"audio": audio,
"watermark": watermark,
},
}
if negative_prompt:
payload["input"]["negative_prompt"] = negative_prompt
if media:
payload["input"]["media"] = media
if aspect_ratio:
payload["parameters"]["aspect_ratio"] = aspect_ratio
resp = requests.post(
f"{BASE_URL}/services/aigc/video-generation/video-synthesis",
headers=_headers(),
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 _build_media(args: argparse.Namespace) -> list[dict] | None:
media = []
if args.first_frame:
media.append({"type": "first_frame", "url": args.first_frame})
if args.last_frame:
media.append({"type": "last_frame", "url": args.last_frame})
for img in args.refer or []:
media.append({"type": "refer", "url": img})
if args.base_video:
media.append({"type": "base", "url": args.base_video})
if args.feature_video:
media.append({"type": "feature", "url": args.feature_video})
return media if media else None
def main() -> None:
parser = argparse.ArgumentParser(description="Kling V3 Video Generation")
parser.add_argument("--model", default="kling/kling-v3-video-generation",
choices=["kling/kling-v3-video-generation", "kling/kling-v3-omni-video-generation"])
parser.add_argument("--prompt", default="", help="Text prompt (max 2500 chars)")
parser.add_argument("--negative-prompt", default=None)
parser.add_argument("--first-frame", help="First frame image URL")
parser.add_argument("--last-frame", help="Last frame image URL")
parser.add_argument("--refer", action="append", help="Reference image URL (omni model, repeatable)")
parser.add_argument("--base-video", help="Base video URL for editing (omni model)")
parser.add_argument("--feature-video", help="Feature reference video URL (omni model)")
parser.add_argument("--mode", default="pro", choices=["pro", "std"])
parser.add_argument("--aspect-ratio", default=None, choices=["16:9", "9:16", "1:1"])
parser.add_argument("--duration", type=int, default=5, help="Video duration 3-15s")
parser.add_argument("--audio", action="store_true", help="Generate audio")
parser.add_argument("--watermark", action="store_true")
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 (must be Beijing region)", file=sys.stderr)
sys.exit(1)
media = _build_media(args)
print(f"Creating Kling video task (model={args.model})...")
task_id = create_task(
model=args.model,
prompt=args.prompt,
negative_prompt=args.negative_prompt,
media=media,
mode=args.mode,
aspect_ratio=args.aspect_ratio,
duration=args.duration,
audio=args.audio,
watermark=args.watermark,
)
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()