Claude-code-plugins-plus-skills klingai-common-errors
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-common-errors" ~/.claude/skills/jeremylongshore-claude-code-plugins-plus-skills-klingai-common-errors && rm -rf "$T"
manifest:
plugins/saas-packs/klingai-pack/skills/klingai-common-errors/SKILL.mdsource content
Kling AI Common Errors
Overview
Complete error reference for the Kling AI API. Covers HTTP status codes, task-level failures, JWT issues, and generation-specific problems with tested solutions.
HTTP Error Codes
| Code | Error | Cause | Solution |
|---|---|---|---|
| Bad Request | Invalid parameters, malformed JSON | Validate all required fields; check is valid |
| Unauthorized | Invalid/expired JWT token | Regenerate JWT; verify AK/SK; check claim |
| Payment Required | Insufficient credits | Top up API resource pack or subscription |
| Forbidden | Content policy violation or API disabled | Review prompt against content policy; enable API access |
| Not Found | Invalid task_id or wrong endpoint | Verify task_id; check endpoint path spelling |
| Too Many Requests | Rate limit exceeded | Implement exponential backoff (see pattern below) |
| Internal Server Error | Kling platform issue | Retry after 30s; if persistent, check status page |
| Bad Gateway | Upstream service unavailable | Retry with backoff; typically transient |
| Service Unavailable | System maintenance | Wait and retry; check announcements |
Task-Level Failures
When HTTP returns
200 but task_status is "failed":
| Cause | Solution |
|---|---|---|
| Content policy violation | Prompt contains restricted content | Remove violent, adult, or copyrighted references |
| Image quality too low | Source image is blurry or too small | Use image >= 300x300px, clear and sharp |
| Prompt too complex | Too many scene elements | Simplify to 1-2 subjects, clear action |
| Generation timeout | Internal processing exceeded limit | Retry; reduce duration from 10s to 5s |
| Invalid image format | Unsupported file type | Use JPG, PNG, or WebP |
| Mask dimension mismatch | Mask size differs from source | Ensure mask matches source image dimensions exactly |
JWT Authentication Errors
Problem: 401
on every request
401# WRONG — missing headers parameter token = jwt.encode(payload, sk, algorithm="HS256") # CORRECT — include explicit headers token = jwt.encode(payload, sk, algorithm="HS256", headers={"alg": "HS256", "typ": "JWT"})
Problem: Token works then fails after 30 min
# WRONG — token generated once at import time TOKEN = generate_token() # CORRECT — refresh before expiry class TokenManager: def __init__(self, ak, sk): self.ak, self.sk = ak, sk self._token = None self._exp = 0 @property def token(self): if time.time() >= self._exp - 300: # 5 min buffer payload = {"iss": self.ak, "exp": int(time.time()) + 1800, "nbf": int(time.time()) - 5} self._token = jwt.encode(payload, self.sk, algorithm="HS256", headers={"alg": "HS256", "typ": "JWT"}) self._exp = int(time.time()) + 1800 return self._token
Rate Limit Handling
import time import requests def request_with_backoff(method, url, headers, json=None, max_retries=5): """Retry with exponential backoff on 429 and 5xx errors.""" for attempt in range(max_retries): response = method(url, headers=headers, json=json) if response.status_code == 429: retry_after = int(response.headers.get("Retry-After", 2 ** attempt)) print(f"Rate limited. Retrying in {retry_after}s...") time.sleep(retry_after) continue elif response.status_code >= 500: wait = 2 ** attempt print(f"Server error {response.status_code}. Retrying in {wait}s...") time.sleep(wait) continue response.raise_for_status() return response raise RuntimeError(f"Max retries ({max_retries}) exceeded")
Diagnostic Checklist
When a generation fails, check in order:
- Auth valid? — Test with a simple GET request first
- Credits available? — Check balance in developer console
- Model valid? — Verify
matches catalog exactlymodel_name - Parameters valid? —
must beduration
or"5"
(string, not int)"10" - Prompt clean? — Remove special characters, keep under 2500 chars
- Image accessible? — For I2V, verify image URL is publicly accessible
- Feature exclusivity? —
,image_tail
, anddynamic_masks
are mutually exclusivecamera_control
Debug Logging
import logging logging.basicConfig(level=logging.DEBUG) logger = logging.getLogger("kling") def debug_request(method, url, headers, json=None): """Log request/response for debugging.""" logger.debug(f"→ {method.__name__.upper()} {url}") logger.debug(f"→ Body: {json}") r = method(url, headers=headers, json=json) logger.debug(f"← Status: {r.status_code}") logger.debug(f"← Body: {r.text[:500]}") return r