Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Apply artistic styles and visual effects to Kling AI video generation. Use when creating stylized content or using effects API. Trigger with phrases like 'klingai style', 'kling ai effects', 'klingai artistic video', 'stylize klingai video'.
.claude/skills/jeremylongshore-klingai-style-transfer/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-11 | ✗→✓ | ▲ Improved | 31% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 107% | 0% |
| case-01 | ✗→✓ | ▲ Improved | -6% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 9% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 26% | 0% |
Apply artistic styles through prompt engineering, use the Effects API for pre-built visual transformations, and leverage Kolors for image-based style references. Available on v1.6+ models.
The most direct approach -- include style descriptors in your prompt:
pythonimport jwt, time, os, requests BASE = "https://api.klingai.com/v1" def get_headers(): ak, sk = os.environ["KLING_ACCESS_KEY"], os.environ["KLING_SECRET_KEY"] token = jwt.encode( {"iss": ak, "exp": int(time.time()) + 1800, "nbf": int(time.time()) - 5}, sk, algorithm="HS256", headers={"alg": "HS256", "typ": "JWT"} ) return {"Authorization": f"Bearer {token}", "Content-Type": "application/json"} # Style: Studio Ghibli watercolor response = requests.post(f"{BASE}/videos/text2video", headers=get_headers(), json={ "model_name": "kling-v2-6", "prompt": "A cozy cottage in a meadow, hand-painted watercolor style, " "soft pastel colors, Studio Ghibli aesthetic, gentle breeze", "negative_prompt": "photorealistic, harsh lighting, dark, gritty", "duration": "5", "mode": "professional", "cfg_scale": 0.7, # higher = stricter prompt adherence })
| Style | Prompt Keywords | cfg_scale | |-------|----------------|-----------| | Cinematic | "cinematic lighting, anamorphic lens, film grain, 35mm" | 0.5-0.6 | | Anime | "anime style, cel-shaded, vibrant colors, clean lines" | 0.6-0.7 | | Watercolor | "watercolor painting, soft edges, pastel, hand-painted" | 0.7-0.8 | | Oil painting | "oil painting, thick brushstrokes, impasto, canvas texture" | 0.7-0.8 | | Neon/cyberpunk | "neon lights, cyberpunk, rain, dark city, purple and blue" | 0.5-0.6 | | Vintage film | "vintage 8mm film, warm tones, light leaks, soft focus" | 0.6-0.7 | | Pixel art | "pixel art style, retro 16-bit, limited palette" | 0.8-0.9 | | Photorealistic | "photorealistic, 4K, natural lighting, DSLR quality" | 0.4-0.5 |
The Effects API applies pre-built transformations to existing images. Available on v1.6+.
Endpoint: POST https://api.klingai.com/v1/videos/effects
python# Apply an effect to an image response = requests.post(f"{BASE}/videos/effects", headers=get_headers(), json={ "model_name": "kling-v1-6", "image": "https://example.com/portrait.jpg", "effect_type": "hug", # effect to apply "duration": "5", "mode": "standard", }) task_id = response.json()["data"]["task_id"] # Poll for result as usual
| Effect | Description | |--------|-------------| | hug | Embrace/hug motion between subjects | | kiss | Kiss animation between subjects | | heart | Heart gesture or heart-shaped framing | | expand | Zoom/expand outward effect | | squish | Compression/squish animation |
Use Kolors to restyle images before converting to video:
python# Generate styled image with Kolors image_response = requests.post(f"{BASE}/images/kolors", headers=get_headers(), json={ "prompt": "A cyberpunk city street, neon signs, rain-slicked roads", "aspect_ratio": "16:9", "imageCount": 1, }) # Then use the generated image as input for I2V image_url = image_response.json()["data"]["images"][0]["url"] video_response = requests.post(f"{BASE}/videos/image2video", headers=get_headers(), json={ "model_name": "kling-v2-1", "image": image_url, "prompt": "Camera slowly pushes forward through the rain, neon reflections", "duration": "5", "mode": "professional", })
The cfg_scale parameter (0.0-1.0) controls how strictly the model follows your prompt:
| cfg_scale | Effect | |-----------|--------| | 0.0-0.3 | More creative freedom, may drift from prompt | | 0.4-0.5 | Balanced (default), natural results | | 0.6-0.7 | Stronger prompt adherence | | 0.8-1.0 | Very strict, may reduce quality/naturalness |
For style transfer: Use 0.6-0.8 to ensure the style keywords are respected.
python# Use a consistent style template for all clips in a project STYLE_TEMPLATE = { "suffix": ", cinematic lighting, 35mm film grain, warm color grading, " "anamorphic lens flare, shallow depth of field", "negative": "cartoon, anime, painting, illustration, CGI, digital art", "cfg_scale": 0.6, "model": "kling-v2-6", "mode": "professional", } def styled_generation(scene_prompt: str): return requests.post(f"{BASE}/videos/text2video", headers=get_headers(), json={ "model_name": STYLE_TEMPLATE["model"], "prompt": scene_prompt + STYLE_TEMPLATE["suffix"], "negative_prompt": STYLE_TEMPLATE["negative"], "cfg_scale": STYLE_TEMPLATE["cfg_scale"], "duration": "5", "mode": STYLE_TEMPLATE["mode"], })
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-11 | fail→pass | 15,387 | 9,852 | -36% | 1 | 1 | 0% | 2,027 | 2,664 | +31% | 0 | 0 | — |
case-10 | fail→pass | 7,888 | 7,304 | -7% | 1 | 1 | 0% | 1,444 | 2,984 | +107% | 0 | 0 | — |
case-01 | fail→pass | 22,211 | 12,929 | -42% | 1 | 1 | 0% | 3,359 | 3,153 | -6% | 0 | 0 | — |
case-02 | fail→pass | 19,861 | 13,097 | -34% | 1 | 1 | 0% | 3,043 | 3,317 | +9% | 0 | 0 | — |
case-03 | fail→fail | 22,578 | 9,789 | -57% | 1 | 1 | 0% | 3,251 | 3,516 | +8% | 0 | 0 | — |
case-04 | pass→pass | 19,029 | 12,678 | -33% | 1 | 1 | 0% | 2,414 | 2,908 | +20% | 0 | 0 | — |
case-05 | fail→fail | 21,844 | 11,867 | -46% | 1 | 1 | 0% | 2,504 | 2,824 | +13% | 0 | 0 | — |
case-06 | fail→pass | 20,850 | 8,970 | -57% | 1 | 1 | 0% | 2,565 | 3,220 | +26% | 0 | 0 | — |
case-07 | pass→pass | 16,978 | 7,816 | -54% | 1 | 1 | 0% | 3,216 | 3,226 | +0% | 0 | 0 | — |
case-08 | fail→fail | 15,161 | 7,963 | -47% | 1 | 1 | 0% | 3,161 | 3,183 | +1% | 0 | 0 | — |
case-09 | fail→pass | 20,905 | 11,198 | -46% | 1 | 1 | 0% | 3,312 | 2,844 | -14% | 0 | 0 | — |
case-12 | fail→pass | 21,350 | 22,381 | +5% | 1 | 1 | 0% | 3,490 | 5,353 | +53% | 0 | 0 | — |
case-13 | fail→pass | 15,332 | 12,576 | -18% | 1 | 1 | 0% | 2,016 | 3,049 | +51% | 0 | 0 | — |
case-14 | pass→pass | 13,042 | 13,603 | +4% | 1 | 1 | 0% | 2,215 | 3,232 | +46% | 0 | 0 | — |
case-15 | fail→pass | 15,920 | 11,967 | -25% | 1 | 1 | 0% | 2,798 | 3,421 | +22% | 0 | 0 | — |
case-16 | fail→pass | 12,020 | 7,075 | -41% | 1 | 1 | 0% | 2,163 | 2,638 | +22% | 0 | 0 | — |
case-17 | fail→pass | 23,072 | 11,470 | -50% | 1 | 1 | 0% | 2,733 | 2,901 | +6% | 0 | 0 | — |
case-18 | fail→pass | 15,402 | 10,657 | -31% | 1 | 1 | 0% | 2,392 | 2,718 | +14% | 0 | 0 | — |
case-19 | fail→fail | 11,261 | 12,202 | +8% | 1 | 1 | 0% | 2,290 | 2,958 | +29% | 0 | 0 | — |
case-20 | pass→pass | 13,251 | 16,568 | +25% | 1 | 1 | 0% | 2,638 | 4,095 | +55% | 0 | 0 | — |
case-21 | pass→pass | 26,056 | 17,171 | -34% | 1 | 1 | 0% | 2,639 | 3,946 | +50% | 0 | 0 | — |
case-22 | pass→pass | 9,031 | 4,631 | -49% | 1 | 1 | 0% | 1,867 | 2,582 | +38% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +55 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.