From klingai-pack
Guides safe migration between Kling AI model versions (v1.x to v2.x+), detailing breaking changes, Python API updates, feature matrix, and parallel A/B testing.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin klingai-packThis skill is limited to using the following tools:
Guide for migrating between Kling AI model versions. Covers breaking changes, parameter differences, feature availability, and parallel testing strategies.
Creates isolated Git worktrees for feature branches with prioritized directory selection, gitignore safety checks, auto project setup for Node/Python/Rust/Go, and baseline verification.
Executes implementation plans in current session by dispatching fresh subagents per independent task, with two-stage reviews: spec compliance then code quality.
Dispatches parallel agents to independently tackle 2+ tasks like separate test failures or subsystems without shared state or dependencies.
Guide for migrating between Kling AI model versions. Covers breaking changes, parameter differences, feature availability, and parallel testing strategies.
| Version | Release | Key Changes |
|---|---|---|
| v1.0 | 2024-06 | Initial T2V + I2V |
| v1.5 | 2024-09 | 1080p, motion brush, I2V-only model |
| v1.6 | 2024-11 | Lip sync, camera paths, effects API |
| v2.0 | 2025-03 | Quality leap, kling-v2-master |
| v2.1 | 2025-06 | Optimized I2V, kling-v2-1-master for T2V |
| v2.5 Turbo | 2025-09 | 40% faster, best speed/quality ratio |
| v2.6 | 2025-12 | Native audio, 30-48 FPS, highest quality |
# v1.x request
body = {
"model_name": "kling-v1-6",
"prompt": "A sunset over mountains",
"duration": "5",
"mode": "standard",
}
# v2.x -- only model_name changes
body["model_name"] = "kling-v2-master"
Breaking changes:
kling-v2-1 is I2V-only (no text-to-video support)body["model_name"] = "kling-v2-6"
body["motion_has_audio"] = True # NEW: synchronized audio
# Cost impact: audio multiplies credits 5x
# 5s standard: 10 -> 50 credits
| Feature | v1.0 | v1.5 | v1.6 | v2.0 | v2.1 | v2.5T | v2.6 |
|---|---|---|---|---|---|---|---|
| Text-to-video | Y | Y | Y | Y | I2V only | Y | Y |
| Image-to-video | Y | Y | Y | Y | Y | Y | Y |
| Camera control | - | - | Y | Y | Y | Y | Y |
| Motion brush | - | Y | Y | Y | Y | Y | Y |
| Lip sync | - | - | Y | Y | Y | Y | Y |
| Effects | - | - | Y | Y | Y | Y | Y |
| Native audio | - | - | - | - | - | - | Y |
| 1080p | - | Y | Y | Y | Y | Y | Y |
def compare_models(prompt, models):
"""Generate same prompt across models for comparison."""
results = {}
for model in models:
r = requests.post(f"{BASE}/videos/text2video", headers=get_headers(), json={
"model_name": model, "prompt": prompt, "duration": "5", "mode": "standard",
}).json()
results[model] = {"task_id": r["data"]["task_id"], "start": time.time()}
# Poll all
while any("url" not in r for r in results.values()):
for model, info in results.items():
if "url" in info or "error" in info:
continue
r = requests.get(
f"{BASE}/videos/text2video/{info['task_id']}", headers=get_headers()
).json()
if r["data"]["task_status"] == "succeed":
info["url"] = r["data"]["task_result"]["videos"][0]["url"]
info["time"] = round(time.time() - info["start"])
elif r["data"]["task_status"] == "failed":
info["error"] = r["data"].get("task_status_msg")
time.sleep(10)
for model, info in results.items():
print(f"{model}: {info.get('url', info.get('error'))} ({info.get('time', '?')}s)")
return results
# Feature flag for instant rollback
KLING_MODEL = os.environ.get("KLING_MODEL_VERSION", "kling-v2-master")
body["model_name"] = KLING_MODEL
# To rollback: export KLING_MODEL_VERSION=kling-v1-6