Claude-code-plugins-plus-skills klingai-hello-world
install
source · Clone the upstream repo
git clone https://github.com/jeremylongshore/claude-code-plugins-plus-skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/jeremylongshore/claude-code-plugins-plus-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/plugins/saas-packs/klingai-pack/skills/klingai-hello-world" ~/.claude/skills/jeremylongshore-claude-code-plugins-plus-skills-klingai-hello-world && rm -rf "$T"
manifest:
plugins/saas-packs/klingai-pack/skills/klingai-hello-world/SKILL.mdsource content
Kling AI Hello World
Overview
Generate your first AI video in under 20 lines of code. This skill walks through the complete create-poll-download cycle using the Kling AI REST API.
Base URL:
https://api.klingai.com/v1
Prerequisites
- Completed
setupklingai-install-auth - Python 3.8+ with
andrequestsPyJWT - At least 10 credits in your Kling AI account
Minimal Example — Python
import jwt, time, os, requests # --- Auth --- def get_token(): ak = os.environ["KLING_ACCESS_KEY"] sk = os.environ["KLING_SECRET_KEY"] payload = {"iss": ak, "exp": int(time.time()) + 1800, "nbf": int(time.time()) - 5} return jwt.encode(payload, sk, algorithm="HS256", headers={"alg": "HS256", "typ": "JWT"}) BASE = "https://api.klingai.com/v1" HEADERS = {"Authorization": f"Bearer {get_token()}", "Content-Type": "application/json"} # --- Step 1: Create task --- task = requests.post(f"{BASE}/videos/text2video", headers=HEADERS, json={ "model_name": "kling-v2-master", "prompt": "A golden retriever running through autumn leaves in slow motion, cinematic lighting", "duration": "5", "aspect_ratio": "16:9", "mode": "standard", }).json() task_id = task["data"]["task_id"] print(f"Task created: {task_id}") # --- Step 2: Poll until complete --- import time as t while True: t.sleep(10) status = requests.get(f"{BASE}/videos/text2video/{task_id}", headers=HEADERS).json() state = status["data"]["task_status"] print(f"Status: {state}") if state == "succeed": video_url = status["data"]["task_result"]["videos"][0]["url"] print(f"Video ready: {video_url}") break elif state == "failed": print(f"Failed: {status['data']['task_status_msg']}") break
Minimal Example — Node.js
import jwt from "jsonwebtoken"; const BASE = "https://api.klingai.com/v1"; function getHeaders() { const token = jwt.sign( { iss: process.env.KLING_ACCESS_KEY, exp: Math.floor(Date.now() / 1000) + 1800, nbf: Math.floor(Date.now() / 1000) - 5 }, process.env.KLING_SECRET_KEY, { algorithm: "HS256", header: { typ: "JWT" } } ); return { Authorization: `Bearer ${token}`, "Content-Type": "application/json" }; } // Create task const res = await fetch(`${BASE}/videos/text2video`, { method: "POST", headers: getHeaders(), body: JSON.stringify({ model_name: "kling-v2-master", prompt: "A golden retriever running through autumn leaves in slow motion", duration: "5", aspect_ratio: "16:9", mode: "standard", }), }); const { data } = await res.json(); console.log(`Task: ${data.task_id}`); // Poll const poll = setInterval(async () => { const r = await fetch(`${BASE}/videos/text2video/${data.task_id}`, { headers: getHeaders() }); const s = await r.json(); if (s.data.task_status === "succeed") { console.log("Video:", s.data.task_result.videos[0].url); clearInterval(poll); } else if (s.data.task_status === "failed") { console.error("Failed:", s.data.task_status_msg); clearInterval(poll); } }, 10000);
Response Shape
{ "code": 0, "message": "success", "data": { "task_id": "abc123...", "task_status": "succeed", "task_result": { "videos": [{ "id": "vid_001", "url": "https://cdn.klingai.com/...", "duration": "5.0" }] } } }
Task Status Values
| Status | Meaning |
|---|---|
| Task queued, waiting for processing |
| Video generation in progress |
| Complete — video URL available |
| Generation failed — check |
Common First-Run Issues
| Problem | Fix |
|---|---|
response | JWT token expired or AK/SK wrong |
| Prompt too vague — add visual detail |
Empty array | Task still processing — poll longer |
| Slow generation | Standard mode takes 60-120s; use for first test |
Cost
- 5-second standard video = 10 credits
- Free tier: 66 credits/day (refreshes daily, no rollover)