@ai-sdk/klingai 3.0.28 → 3.0.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/dist/index.js +50 -14
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +50 -14
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
- package/src/klingai-video-model.ts +64 -12
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# @ai-sdk/klingai
|
|
2
2
|
|
|
3
|
+
## 3.0.29
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- e1af05f: feat (video): support video (not just image) reference inputs in `inputReferences` for reference-to-video generation
|
|
8
|
+
- Updated dependencies [e1af05f]
|
|
9
|
+
- @ai-sdk/provider@3.0.14
|
|
10
|
+
- @ai-sdk/provider-utils@4.0.38
|
|
11
|
+
|
|
3
12
|
## 3.0.28
|
|
4
13
|
|
|
5
14
|
### Patch Changes
|
package/dist/index.js
CHANGED
|
@@ -104,26 +104,62 @@ function fileToImageString(file) {
|
|
|
104
104
|
}
|
|
105
105
|
return typeof file.data === "string" ? file.data : (0, import_provider_utils3.convertUint8ArrayToBase64)(file.data);
|
|
106
106
|
}
|
|
107
|
-
function
|
|
107
|
+
function getTopLevelMediaType(mediaType) {
|
|
108
|
+
const slashIndex = mediaType.indexOf("/");
|
|
109
|
+
return slashIndex === -1 ? mediaType : mediaType.substring(0, slashIndex);
|
|
110
|
+
}
|
|
111
|
+
var isVideoFile = (file) => file.mediaType != null && getTopLevelMediaType(file.mediaType) === "video";
|
|
112
|
+
function getReferenceImages(options, warnings) {
|
|
108
113
|
if (options.frameImages != null && options.frameImages.length > 0) {
|
|
109
114
|
return void 0;
|
|
110
115
|
}
|
|
111
|
-
|
|
116
|
+
if (options.inputReferences == null || options.inputReferences.length === 0) {
|
|
117
|
+
return void 0;
|
|
118
|
+
}
|
|
119
|
+
const imageReferences = options.inputReferences.filter((reference) => {
|
|
120
|
+
if (isVideoFile(reference)) {
|
|
121
|
+
warnings.push({
|
|
122
|
+
type: "unsupported",
|
|
123
|
+
feature: "inputReferences",
|
|
124
|
+
details: "KlingAI does not support video reference inputs; the video reference was ignored."
|
|
125
|
+
});
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
return true;
|
|
129
|
+
});
|
|
130
|
+
return imageReferences.length > 0 ? imageReferences : void 0;
|
|
112
131
|
}
|
|
113
132
|
function getFirstFrameImage(options) {
|
|
114
133
|
var _a, _b;
|
|
115
134
|
return (_b = (_a = options.frameImages) == null ? void 0 : _a.find((frame) => frame.frameType === "first_frame")) == null ? void 0 : _b.image;
|
|
116
135
|
}
|
|
117
|
-
function resolveStartImage(options) {
|
|
136
|
+
function resolveStartImage(options, warnings) {
|
|
118
137
|
var _a;
|
|
119
|
-
|
|
138
|
+
const startImage = (_a = getFirstFrameImage(options)) != null ? _a : options.image;
|
|
139
|
+
if (startImage != null && isVideoFile(startImage)) {
|
|
140
|
+
warnings.push({
|
|
141
|
+
type: "unsupported",
|
|
142
|
+
feature: "frameImages",
|
|
143
|
+
details: "KlingAI does not accept video as a frame image; it was ignored."
|
|
144
|
+
});
|
|
145
|
+
return void 0;
|
|
146
|
+
}
|
|
147
|
+
return startImage;
|
|
120
148
|
}
|
|
121
|
-
function resolveImageTail(options, klingaiOptions) {
|
|
149
|
+
function resolveImageTail(options, klingaiOptions, warnings) {
|
|
122
150
|
var _a, _b, _c;
|
|
123
151
|
const lastFrame = (_b = (_a = options.frameImages) == null ? void 0 : _a.find(
|
|
124
152
|
(frame) => frame.frameType === "last_frame"
|
|
125
153
|
)) == null ? void 0 : _b.image;
|
|
126
154
|
if (lastFrame != null) {
|
|
155
|
+
if (isVideoFile(lastFrame)) {
|
|
156
|
+
warnings.push({
|
|
157
|
+
type: "unsupported",
|
|
158
|
+
feature: "frameImages",
|
|
159
|
+
details: "KlingAI does not accept video as a frame image; it was ignored."
|
|
160
|
+
});
|
|
161
|
+
return void 0;
|
|
162
|
+
}
|
|
127
163
|
return fileToImageString(lastFrame);
|
|
128
164
|
}
|
|
129
165
|
return (_c = klingaiOptions == null ? void 0 : klingaiOptions.imageTail) != null ? _c : void 0;
|
|
@@ -252,7 +288,7 @@ var KlingAIVideoModel = class {
|
|
|
252
288
|
providerOptions: options.providerOptions,
|
|
253
289
|
schema: klingaiVideoModelOptionsSchema
|
|
254
290
|
});
|
|
255
|
-
const referenceImages = getReferenceImages(options);
|
|
291
|
+
const referenceImages = getReferenceImages(options, warnings);
|
|
256
292
|
const effectiveMode = mode === "i2v" && referenceImages != null ? "mi2v" : mode;
|
|
257
293
|
let body;
|
|
258
294
|
if (effectiveMode === "motion-control") {
|
|
@@ -455,7 +491,7 @@ var KlingAIVideoModel = class {
|
|
|
455
491
|
if ((klingaiOptions == null ? void 0 : klingaiOptions.watermarkEnabled) != null) {
|
|
456
492
|
body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };
|
|
457
493
|
}
|
|
458
|
-
if (resolveStartImage(options) != null) {
|
|
494
|
+
if (resolveStartImage(options, warnings) != null) {
|
|
459
495
|
warnings.push({
|
|
460
496
|
type: "unsupported",
|
|
461
497
|
feature: "image",
|
|
@@ -473,11 +509,11 @@ var KlingAIVideoModel = class {
|
|
|
473
509
|
if (options.prompt != null) {
|
|
474
510
|
body.prompt = options.prompt;
|
|
475
511
|
}
|
|
476
|
-
const startImage = resolveStartImage(options);
|
|
512
|
+
const startImage = resolveStartImage(options, warnings);
|
|
477
513
|
if (startImage != null) {
|
|
478
514
|
body.image = fileToImageString(startImage);
|
|
479
515
|
}
|
|
480
|
-
const imageTail = resolveImageTail(options, klingaiOptions);
|
|
516
|
+
const imageTail = resolveImageTail(options, klingaiOptions, warnings);
|
|
481
517
|
if (imageTail != null) {
|
|
482
518
|
body.image_tail = imageTail;
|
|
483
519
|
}
|
|
@@ -562,14 +598,14 @@ var KlingAIVideoModel = class {
|
|
|
562
598
|
if ((klingaiOptions == null ? void 0 : klingaiOptions.watermarkEnabled) != null) {
|
|
563
599
|
body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };
|
|
564
600
|
}
|
|
565
|
-
if (resolveStartImage(options) != null) {
|
|
601
|
+
if (resolveStartImage(options, warnings) != null) {
|
|
566
602
|
warnings.push({
|
|
567
603
|
type: "unsupported",
|
|
568
|
-
feature: "
|
|
604
|
+
feature: "image",
|
|
569
605
|
details: "KlingAI reference-to-video does not support a separate start frame. Provide all guidance images via inputReferences instead."
|
|
570
606
|
});
|
|
571
607
|
}
|
|
572
|
-
if (resolveImageTail(options, klingaiOptions) != null) {
|
|
608
|
+
if (resolveImageTail(options, klingaiOptions, warnings) != null) {
|
|
573
609
|
warnings.push({
|
|
574
610
|
type: "unsupported",
|
|
575
611
|
feature: "frameImages",
|
|
@@ -596,7 +632,7 @@ var KlingAIVideoModel = class {
|
|
|
596
632
|
if (options.prompt != null) {
|
|
597
633
|
body.prompt = options.prompt;
|
|
598
634
|
}
|
|
599
|
-
const startImage = resolveStartImage(options);
|
|
635
|
+
const startImage = resolveStartImage(options, warnings);
|
|
600
636
|
if (startImage != null) {
|
|
601
637
|
body.image_url = fileToImageString(startImage);
|
|
602
638
|
}
|
|
@@ -680,7 +716,7 @@ var klingaiTaskStatusSchema = import_v42.z.object({
|
|
|
680
716
|
});
|
|
681
717
|
|
|
682
718
|
// src/version.ts
|
|
683
|
-
var VERSION = true ? "3.0.
|
|
719
|
+
var VERSION = true ? "3.0.29" : "0.0.0-test";
|
|
684
720
|
|
|
685
721
|
// src/klingai-provider.ts
|
|
686
722
|
var defaultBaseURL = "https://api-singapore.klingai.com";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/klingai-provider.ts","../src/klingai-auth.ts","../src/klingai-video-model.ts","../src/klingai-error.ts","../src/version.ts"],"sourcesContent":["export { createKlingAI, klingai } from './klingai-provider';\nexport type {\n KlingAIProvider,\n KlingAIProviderSettings,\n} from './klingai-provider';\nexport type { KlingAIVideoModelId } from './klingai-video-settings';\nexport type {\n KlingAIVideoModelOptions,\n /** @deprecated Use `KlingAIVideoModelOptions` instead. */\n KlingAIVideoModelOptions as KlingAIVideoProviderOptions,\n} from './klingai-video-model';\n","import {\n type Experimental_VideoModelV3 as VideoModelV3,\n type ProviderV3,\n NoSuchModelError,\n} from '@ai-sdk/provider';\nimport {\n type FetchFunction,\n withoutTrailingSlash,\n withUserAgentSuffix,\n} from '@ai-sdk/provider-utils';\nimport { generateKlingAIAuthToken } from './klingai-auth';\nimport { KlingAIVideoModel } from './klingai-video-model';\nimport type { KlingAIVideoModelId } from './klingai-video-settings';\nimport { VERSION } from './version';\n\nexport interface KlingAIProviderSettings {\n /**\n * KlingAI Access key. Default value is taken from the `KLINGAI_ACCESS_KEY`\n * environment variable.\n */\n accessKey?: string;\n /**\n * KlingAI Secret key. Default value is taken from the `KLINGAI_SECRET_KEY`\n * environment variable.\n */\n secretKey?: string;\n /**\n * Base URL for the API calls.\n */\n baseURL?: string;\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept\n * requests, or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport interface KlingAIProvider extends ProviderV3 {\n /**\n * Creates a model for video generation.\n */\n video(modelId: KlingAIVideoModelId): VideoModelV3;\n\n /**\n * Creates a model for video generation.\n */\n videoModel(modelId: KlingAIVideoModelId): VideoModelV3;\n}\n\nconst defaultBaseURL = 'https://api-singapore.klingai.com';\n\n/**\n * Create a KlingAI provider instance.\n */\nexport function createKlingAI(\n options: KlingAIProviderSettings = {},\n): KlingAIProvider {\n const baseURL =\n withoutTrailingSlash(options.baseURL ?? defaultBaseURL) ?? defaultBaseURL;\n\n const getHeaders = async () => {\n const token = await generateKlingAIAuthToken({\n accessKey: options.accessKey,\n secretKey: options.secretKey,\n });\n\n return withUserAgentSuffix(\n {\n Authorization: `Bearer ${token}`,\n ...options.headers,\n },\n `ai-sdk/klingai/${VERSION}`,\n );\n };\n\n const createVideoModel = (modelId: KlingAIVideoModelId): VideoModelV3 =>\n new KlingAIVideoModel(modelId, {\n provider: 'klingai.video',\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const noSuchModel = (\n modelId: string,\n modelType:\n | 'languageModel'\n | 'embeddingModel'\n | 'imageModel'\n | 'transcriptionModel'\n | 'speechModel'\n | 'rerankingModel',\n ): never => {\n throw new NoSuchModelError({ modelId, modelType });\n };\n\n const provider: KlingAIProvider = {\n specificationVersion: 'v3' as const,\n video: createVideoModel,\n videoModel: createVideoModel,\n languageModel: (modelId: string) => noSuchModel(modelId, 'languageModel'),\n embeddingModel: (modelId: string) => noSuchModel(modelId, 'embeddingModel'),\n imageModel: (modelId: string) => noSuchModel(modelId, 'imageModel'),\n };\n\n return provider;\n}\n\n/**\n * Default KlingAI provider instance.\n */\nexport const klingai = createKlingAI();\n","import { loadSetting } from '@ai-sdk/provider-utils';\n\n/**\n * Encode a string to base64url format (URL-safe base64 without padding).\n */\nconst base64url = (str: string) =>\n btoa(str).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n\n/**\n * Generate a JWT authentication token for KlingAI API access.\n *\n * Uses HS256 (HMAC-SHA256) signing via the Web Crypto API — no external\n * dependencies required. Compatible with Node.js, Edge, and browser runtimes.\n *\n * @see https://app.klingai.com/global/dev/document-api/quickStart/userManual\n * @see https://app.klingai.com/global/dev/document-api/apiReference/commonInfo\n */\nexport async function generateKlingAIAuthToken({\n accessKey,\n secretKey,\n}: {\n accessKey?: string;\n secretKey?: string;\n}): Promise<string> {\n const ak = loadSetting({\n settingValue: accessKey,\n settingName: 'accessKey',\n environmentVariableName: 'KLINGAI_ACCESS_KEY',\n description: 'KlingAI access key',\n });\n\n const sk = loadSetting({\n settingValue: secretKey,\n settingName: 'secretKey',\n environmentVariableName: 'KLINGAI_SECRET_KEY',\n description: 'KlingAI secret key',\n });\n\n const now = Math.floor(Date.now() / 1000);\n\n const header = { alg: 'HS256', typ: 'JWT' };\n const payload = {\n iss: ak,\n exp: now + 1800, // Valid for 30 minutes\n nbf: now - 5, // Valid 5 seconds before current time\n };\n\n const encoder = new TextEncoder();\n\n // Import the secret key for HMAC-SHA256 signing\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(sk),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n\n const signingInput = `${base64url(JSON.stringify(header))}.${base64url(\n JSON.stringify(payload),\n )}`;\n\n const signature = await crypto.subtle.sign(\n 'HMAC',\n key,\n encoder.encode(signingInput),\n );\n\n const signatureBytes = new Uint8Array(signature);\n const signatureBase64 = base64url(\n String.fromCharCode.apply(null, Array.from(signatureBytes)),\n );\n\n return `${signingInput}.${signatureBase64}`;\n}\n","import {\n AISDKError,\n type Experimental_VideoModelV3,\n type Experimental_VideoModelV3File,\n NoSuchModelError,\n type SharedV3Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertUint8ArrayToBase64,\n createJsonResponseHandler,\n delay,\n type FetchFunction,\n getFromApi,\n lazySchema,\n parseProviderOptions,\n postJsonToApi,\n type Resolvable,\n resolve,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { klingaiFailedResponseHandler } from './klingai-error';\nimport type { KlingAIVideoModelId } from './klingai-video-settings';\n\ntype KlingAIVideoMode = 't2v' | 'i2v' | 'mi2v' | 'motion-control';\n\nfunction fileToImageString(file: Experimental_VideoModelV3File): string {\n if (file.type === 'url') {\n return file.url;\n }\n return typeof file.data === 'string'\n ? file.data\n : convertUint8ArrayToBase64(file.data);\n}\n\nfunction getReferenceImages(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n): Array<Experimental_VideoModelV3File> | undefined {\n if (options.frameImages != null && options.frameImages.length > 0) {\n return undefined;\n }\n\n return options.inputReferences != null && options.inputReferences.length > 0\n ? options.inputReferences\n : undefined;\n}\n\nfunction getFirstFrameImage(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n): Experimental_VideoModelV3File | undefined {\n return options.frameImages?.find(frame => frame.frameType === 'first_frame')\n ?.image;\n}\n\nfunction resolveStartImage(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n): Experimental_VideoModelV3File | undefined {\n return getFirstFrameImage(options) ?? options.image;\n}\n\nfunction resolveImageTail(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n klingaiOptions: KlingAIVideoModelOptions | undefined,\n): string | undefined {\n const lastFrame = options.frameImages?.find(\n frame => frame.frameType === 'last_frame',\n )?.image;\n\n if (lastFrame != null) {\n return fileToImageString(lastFrame);\n }\n\n return klingaiOptions?.imageTail ?? undefined;\n}\n\n/**\n * Detects the video generation mode from the model ID suffix.\n */\nfunction detectMode(modelId: string): KlingAIVideoMode {\n if (modelId.endsWith('-t2v')) return 't2v';\n if (modelId.endsWith('-i2v')) return 'i2v';\n if (modelId.endsWith('-motion-control')) return 'motion-control';\n throw new NoSuchModelError({ modelId, modelType: 'videoModel' });\n}\n\n/**\n * Maps video generation mode to the KlingAI API endpoint path.\n */\nconst modeEndpointMap: Record<KlingAIVideoMode, string> = {\n t2v: '/v1/videos/text2video',\n i2v: '/v1/videos/image2video',\n mi2v: '/v1/videos/multi-image2video',\n 'motion-control': '/v1/videos/motion-control',\n};\n\n/**\n * Derives the KlingAI API `model_name` from the SDK model ID.\n * Strips the mode suffix and converts dots to hyphens.\n *\n * Examples:\n * - 'kling-v2.6-t2v' → 'kling-v2-6'\n * - 'kling-v2.1-master-i2v' → 'kling-v2-1-master'\n * - 'kling-v1-t2v' → 'kling-v1'\n * - 'kling-v3.0-t2v' → 'kling-v3'\n */\nfunction getApiModelName(modelId: string, mode: KlingAIVideoMode): string {\n const suffix =\n mode === 'motion-control'\n ? '-motion-control'\n : mode === 'mi2v'\n ? '-i2v'\n : `-${mode}`;\n const baseName = modelId.slice(0, -suffix.length);\n return baseName.replace(/\\.0$/, '').replace(/\\./g, '-');\n}\n\n/**\n * Provider-specific options for KlingAI video generation.\n *\n * Not all options are supported by every model version and video mode (T2V, I2V,\n * motion control). See the KlingAI capability map for detailed compatibility:\n * https://app.klingai.com/global/dev/document-api/apiReference/model/skillsMap\n */\nexport type KlingAIVideoModelOptions = {\n /**\n * Video generation mode.\n *\n * - `'std'`: Standard mode — cost-effective.\n * - `'pro'`: Professional mode — higher quality but longer generation time.\n */\n mode?: 'std' | 'pro' | null;\n\n /**\n * Polling interval in milliseconds for checking task status.\n * Default: 5000 (5 seconds).\n */\n pollIntervalMs?: number | null;\n\n /**\n * Maximum time in milliseconds to wait for video generation.\n * Default: 600000 (10 minutes).\n */\n pollTimeoutMs?: number | null;\n\n // --- T2V and I2V options ---\n\n /**\n * Negative text prompt to specify what to avoid.\n * Cannot exceed 2500 characters.\n */\n negativePrompt?: string | null;\n\n /**\n * Whether to generate sound simultaneously when generating videos.\n * Only V2.6 and subsequent versions support this parameter,\n * and requires `mode: 'pro'`.\n */\n sound?: 'on' | 'off' | null;\n\n /**\n * Flexibility in video generation. The higher the value, the lower the\n * model's flexibility, and the stronger the relevance to the user's prompt.\n * Value range: [0, 1]. Kling-v2.x models do not support this parameter.\n */\n cfgScale?: number | null;\n\n /**\n * Camera movement control. If not specified, the model will intelligently\n * match based on the input text/images.\n */\n cameraControl?: {\n type:\n | 'simple'\n | 'down_back'\n | 'forward_up'\n | 'right_turn_forward'\n | 'left_turn_forward';\n config?: {\n horizontal?: number | null;\n vertical?: number | null;\n pan?: number | null;\n tilt?: number | null;\n roll?: number | null;\n zoom?: number | null;\n } | null;\n } | null;\n\n // --- I2V-specific options ---\n\n /**\n * End frame image for I2V start+end frame control.\n * Supports image URL or raw base64-encoded image data.\n * Requires `mode: 'pro'` for most models.\n */\n imageTail?: string | null;\n\n /**\n * Static brush mask image for I2V motion brush.\n * Supports image URL or raw base64-encoded image data.\n */\n staticMask?: string | null;\n\n /**\n * Dynamic brush configurations for I2V motion brush.\n * Up to 6 groups, each with a mask and motion trajectories.\n */\n dynamicMasks?: Array<{\n mask: string;\n trajectories: Array<{ x: number; y: number }>;\n }> | null;\n\n // --- v3.0 multi-shot options (T2V and I2V) ---\n\n /**\n * Enable multi-shot video generation (Kling v3.0+).\n * When true, the video is split into up to 6 storyboard shots\n * with individual prompts and durations.\n *\n * When multiShot is true with shotType 'customize', multiPrompt is required.\n * When multiShot is true, the main prompt parameter is ignored by the API.\n */\n multiShot?: boolean | null;\n\n /**\n * Storyboard method for multi-shot video generation (Kling v3.0+).\n * Required when multiShot is true.\n *\n * - `'customize'`: User-defined shots via multiPrompt.\n * - `'intelligence'`: Model auto-segments based on the main prompt.\n */\n shotType?: 'customize' | 'intelligence' | null;\n\n /**\n * Per-shot details for multi-shot video generation (Kling v3.0+).\n * Required when multiShot is true and shotType is 'customize'.\n *\n * Up to 6 shots. Each shot has an index, prompt (max 512 chars),\n * and duration in seconds. Shot durations must sum to the total duration.\n */\n multiPrompt?: Array<{\n index: number;\n prompt: string;\n duration: string;\n }> | null;\n\n // --- v3.0 element control (I2V and Motion Control) ---\n\n /**\n * Reference elements for element control (Kling v3.0+).\n * Supports video character elements and multi-image elements.\n *\n * - I2V: Up to 3 reference elements. Cannot coexist with voiceList.\n * - Motion Control: Currently only 1 element supported.\n * When referencing an element, the generated video can only\n * refer to the orientation of the person in the video.\n */\n elementList?: Array<{\n element_id: number;\n }> | null;\n\n // --- v3.0 voice control (T2V and I2V) ---\n\n /**\n * Voice references for voice control (Kling v3.0+).\n * Up to 2 voice references. Referenced via `<<<voice_1>>>` template\n * syntax in the prompt.\n *\n * When voiceList is used and the prompt references voice IDs,\n * sound must be set to 'on'.\n * Cannot coexist with elementList on the I2V endpoint.\n */\n voiceList?: Array<{\n voice_id: string;\n }> | null;\n\n // --- Shared options ---\n\n /**\n * Whether to generate watermarked results simultaneously.\n */\n watermarkEnabled?: boolean | null;\n\n // --- Motion-control-specific options ---\n\n /**\n * URL of the reference video. The character actions in the generated video\n * are consistent with the reference video.\n *\n * Supports .mp4/.mov, max 100MB, side lengths 340px–3850px,\n * duration 3–30 seconds (depends on `characterOrientation`).\n */\n videoUrl?: string | null;\n\n /**\n * Orientation of the characters in the generated video.\n *\n * - `'image'`: Same orientation as the person in the image.\n * Reference video duration max 10 seconds.\n * - `'video'`: Same orientation as the person in the video.\n * Reference video duration max 30 seconds.\n */\n characterOrientation?: 'image' | 'video' | null;\n\n /**\n * Whether to keep the original sound of the reference video.\n * Default: `'yes'`.\n */\n keepOriginalSound?: 'yes' | 'no' | null;\n\n [key: string]: unknown; // For passthrough\n};\n\nconst klingaiVideoModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z\n .object({\n mode: z.enum(['std', 'pro']).nullish(),\n pollIntervalMs: z.number().positive().nullish(),\n pollTimeoutMs: z.number().positive().nullish(),\n // T2V and I2V\n negativePrompt: z.string().nullish(),\n sound: z.enum(['on', 'off']).nullish(),\n cfgScale: z.number().nullish(),\n cameraControl: z\n .object({\n type: z.enum([\n 'simple',\n 'down_back',\n 'forward_up',\n 'right_turn_forward',\n 'left_turn_forward',\n ]),\n config: z\n .object({\n horizontal: z.number().nullish(),\n vertical: z.number().nullish(),\n pan: z.number().nullish(),\n tilt: z.number().nullish(),\n roll: z.number().nullish(),\n zoom: z.number().nullish(),\n })\n .nullish(),\n })\n .nullish(),\n // v3.0 multi-shot\n multiShot: z.boolean().nullish(),\n shotType: z.enum(['customize', 'intelligence']).nullish(),\n multiPrompt: z\n .array(\n z.object({\n index: z.number(),\n prompt: z.string(),\n duration: z.string(),\n }),\n )\n .nullish(),\n // v3.0 element control (I2V)\n elementList: z\n .array(\n z.object({\n element_id: z.number(),\n }),\n )\n .nullish(),\n // v3.0 voice control\n voiceList: z\n .array(\n z.object({\n voice_id: z.string(),\n }),\n )\n .nullish(),\n // I2V-specific\n imageTail: z.string().nullish(),\n staticMask: z.string().nullish(),\n dynamicMasks: z\n .array(\n z.object({\n mask: z.string(),\n trajectories: z.array(z.object({ x: z.number(), y: z.number() })),\n }),\n )\n .nullish(),\n // Motion-control-specific\n videoUrl: z.string().nullish(),\n characterOrientation: z.enum(['image', 'video']).nullish(),\n keepOriginalSound: z.enum(['yes', 'no']).nullish(),\n watermarkEnabled: z.boolean().nullish(),\n })\n .passthrough(),\n ),\n);\n\n/**\n * Known provider option keys that are handled explicitly and should not be\n * passed through to the API body.\n */\nconst HANDLED_PROVIDER_OPTIONS = new Set([\n 'mode',\n 'pollIntervalMs',\n 'pollTimeoutMs',\n 'negativePrompt',\n 'sound',\n 'cfgScale',\n 'cameraControl',\n 'multiShot',\n 'shotType',\n 'multiPrompt',\n 'elementList',\n 'voiceList',\n 'imageTail',\n 'staticMask',\n 'dynamicMasks',\n 'videoUrl',\n 'characterOrientation',\n 'keepOriginalSound',\n 'watermarkEnabled',\n]);\n\ninterface KlingAIVideoModelConfig {\n provider: string;\n baseURL: string;\n headers?: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class KlingAIVideoModel implements Experimental_VideoModelV3 {\n readonly specificationVersion = 'v3';\n readonly maxVideosPerCall = 1;\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: KlingAIVideoModelId,\n private readonly config: KlingAIVideoModelConfig,\n ) {}\n\n async doGenerate(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<Experimental_VideoModelV3['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const warnings: SharedV3Warning[] = [];\n const mode = detectMode(this.modelId);\n\n const klingaiOptions = (await parseProviderOptions({\n provider: 'klingai',\n providerOptions: options.providerOptions,\n schema: klingaiVideoModelOptionsSchema,\n })) as KlingAIVideoModelOptions | undefined;\n\n const referenceImages = getReferenceImages(options);\n const effectiveMode: KlingAIVideoMode =\n mode === 'i2v' && referenceImages != null ? 'mi2v' : mode;\n\n let body: Record<string, unknown>;\n\n if (effectiveMode === 'motion-control') {\n body = this.buildMotionControlBody(options, klingaiOptions, warnings);\n } else if (effectiveMode === 't2v') {\n body = this.buildT2VBody(options, klingaiOptions, warnings);\n } else if (effectiveMode === 'mi2v') {\n body = this.buildMultiImageBody(\n options,\n klingaiOptions,\n referenceImages!,\n warnings,\n );\n } else {\n body = this.buildI2VBody(options, klingaiOptions, warnings);\n }\n\n if (referenceImages != null && effectiveMode !== 'mi2v') {\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details:\n 'KlingAI only supports inputReferences (reference-to-video) on ' +\n 'image-to-video models. The reference images were ignored.',\n });\n }\n\n // Warn about universally unsupported standard options\n if (options.resolution) {\n warnings.push({\n type: 'unsupported',\n feature: 'resolution',\n details: 'KlingAI video models do not support the resolution option.',\n });\n }\n\n if (options.seed) {\n warnings.push({\n type: 'unsupported',\n feature: 'seed',\n details:\n 'KlingAI video models do not support seed for deterministic generation.',\n });\n }\n\n if (options.fps) {\n warnings.push({\n type: 'unsupported',\n feature: 'fps',\n details: 'KlingAI video models do not support custom FPS.',\n });\n }\n\n if (options.n != null && options.n > 1) {\n warnings.push({\n type: 'unsupported',\n feature: 'n',\n details:\n 'KlingAI video models do not support generating multiple videos per call. ' +\n 'Only 1 video will be generated.',\n });\n }\n\n const endpointPath = modeEndpointMap[effectiveMode];\n\n // Step 1: Create the task\n const { value: createResponse, responseHeaders: createHeaders } =\n await postJsonToApi({\n url: `${this.config.baseURL}${endpointPath}`,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n body,\n successfulResponseHandler: createJsonResponseHandler(\n klingaiCreateTaskSchema,\n ),\n failedResponseHandler: klingaiFailedResponseHandler,\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const taskId = createResponse.data?.task_id;\n if (!taskId) {\n throw new AISDKError({\n name: 'KLINGAI_VIDEO_GENERATION_ERROR',\n message: `No task_id returned from KlingAI API. Response: ${JSON.stringify(createResponse)}`,\n });\n }\n\n // Step 2: Poll for task completion\n const pollIntervalMs = klingaiOptions?.pollIntervalMs ?? 5000; // 5 seconds\n const pollTimeoutMs = klingaiOptions?.pollTimeoutMs ?? 600000; // 10 minutes\n const startTime = Date.now();\n let finalResponse: KlingAITaskResponse | undefined;\n let responseHeaders: Record<string, string> | undefined = createHeaders;\n\n while (true) {\n await delay(pollIntervalMs, { abortSignal: options.abortSignal });\n\n if (Date.now() - startTime > pollTimeoutMs) {\n throw new AISDKError({\n name: 'KLINGAI_VIDEO_GENERATION_TIMEOUT',\n message: `Video generation timed out after ${pollTimeoutMs}ms`,\n });\n }\n\n const { value: statusResponse, responseHeaders: pollHeaders } =\n await getFromApi({\n url: `${this.config.baseURL}${endpointPath}/${taskId}`,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n successfulResponseHandler: createJsonResponseHandler(\n klingaiTaskStatusSchema,\n ),\n failedResponseHandler: klingaiFailedResponseHandler,\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n responseHeaders = pollHeaders;\n const taskStatus = statusResponse.data?.task_status;\n\n if (taskStatus === 'succeed') {\n finalResponse = statusResponse;\n break;\n }\n\n if (taskStatus === 'failed') {\n throw new AISDKError({\n name: 'KLINGAI_VIDEO_GENERATION_FAILED',\n message: `Video generation failed: ${statusResponse.data?.task_status_msg ?? 'Unknown error'}`,\n });\n }\n\n // Continue polling for 'submitted' and 'processing' statuses\n }\n\n if (!finalResponse?.data?.task_result?.videos?.length) {\n throw new AISDKError({\n name: 'KLINGAI_VIDEO_GENERATION_ERROR',\n message: `No videos in response. Response: ${JSON.stringify(finalResponse)}`,\n });\n }\n\n const videos: Array<{ type: 'url'; url: string; mediaType: string }> = [];\n const videoMetadata: Array<{\n id: string;\n url: string;\n watermarkUrl?: string;\n duration?: string;\n }> = [];\n\n for (const video of finalResponse.data.task_result.videos) {\n if (video.url) {\n videos.push({\n type: 'url',\n url: video.url,\n mediaType: 'video/mp4',\n });\n videoMetadata.push({\n id: video.id ?? '',\n url: video.url,\n ...(video.watermark_url ? { watermarkUrl: video.watermark_url } : {}),\n ...(video.duration ? { duration: video.duration } : {}),\n });\n }\n }\n\n if (videos.length === 0) {\n throw new AISDKError({\n name: 'KLINGAI_VIDEO_GENERATION_ERROR',\n message: 'No valid video URLs in response',\n });\n }\n\n return {\n videos,\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n providerMetadata: {\n klingai: {\n taskId,\n videos: videoMetadata,\n },\n },\n };\n }\n\n private buildT2VBody(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n klingaiOptions: KlingAIVideoModelOptions | undefined,\n warnings: SharedV3Warning[],\n ): Record<string, unknown> {\n const mode = 't2v' as const;\n const body: Record<string, unknown> = {\n model_name: getApiModelName(this.modelId, mode),\n };\n\n if (options.prompt != null) {\n body.prompt = options.prompt;\n }\n\n if (klingaiOptions?.negativePrompt != null) {\n body.negative_prompt = klingaiOptions.negativePrompt;\n }\n\n const sound =\n options.generateAudio != null\n ? options.generateAudio\n ? 'on'\n : 'off'\n : klingaiOptions?.sound;\n if (sound != null) {\n body.sound = sound;\n }\n\n if (klingaiOptions?.cfgScale != null) {\n body.cfg_scale = klingaiOptions.cfgScale;\n }\n\n if (klingaiOptions?.mode != null) {\n body.mode = klingaiOptions.mode;\n }\n\n if (klingaiOptions?.cameraControl != null) {\n body.camera_control = klingaiOptions.cameraControl;\n }\n\n // Map standard SDK aspectRatio (same format as KlingAI API)\n if (options.aspectRatio != null) {\n body.aspect_ratio = options.aspectRatio;\n }\n\n // Map standard SDK duration (number → string)\n if (options.duration != null) {\n body.duration = String(options.duration);\n }\n\n // v3.0 multi-shot\n if (klingaiOptions?.multiShot != null) {\n body.multi_shot = klingaiOptions.multiShot;\n }\n\n if (klingaiOptions?.shotType != null) {\n body.shot_type = klingaiOptions.shotType;\n }\n\n if (klingaiOptions?.multiPrompt != null) {\n body.multi_prompt = klingaiOptions.multiPrompt;\n }\n\n // v3.0 voice control\n if (klingaiOptions?.voiceList != null) {\n body.voice_list = klingaiOptions.voiceList;\n }\n\n if (klingaiOptions?.watermarkEnabled != null) {\n body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };\n }\n\n // Image is not supported for T2V\n if (resolveStartImage(options) != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'image',\n details:\n 'KlingAI text-to-video does not support image input. Use an image-to-video model instead.',\n });\n }\n\n this.addPassthroughOptions(body, klingaiOptions);\n\n return body;\n }\n\n private buildI2VBody(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n klingaiOptions: KlingAIVideoModelOptions | undefined,\n warnings: SharedV3Warning[],\n ): Record<string, unknown> {\n const mode = 'i2v' as const;\n const body: Record<string, unknown> = {\n model_name: getApiModelName(this.modelId, mode),\n };\n\n if (options.prompt != null) {\n body.prompt = options.prompt;\n }\n\n const startImage = resolveStartImage(options);\n if (startImage != null) {\n body.image = fileToImageString(startImage);\n }\n\n // End frame image: prefer top-level frameImages (last_frame), fall back to\n // providerOptions.klingai.imageTail.\n const imageTail = resolveImageTail(options, klingaiOptions);\n if (imageTail != null) {\n body.image_tail = imageTail;\n }\n\n if (klingaiOptions?.negativePrompt != null) {\n body.negative_prompt = klingaiOptions.negativePrompt;\n }\n\n const sound =\n options.generateAudio != null\n ? options.generateAudio\n ? 'on'\n : 'off'\n : klingaiOptions?.sound;\n if (sound != null) {\n body.sound = sound;\n }\n\n if (klingaiOptions?.cfgScale != null) {\n body.cfg_scale = klingaiOptions.cfgScale;\n }\n\n if (klingaiOptions?.mode != null) {\n body.mode = klingaiOptions.mode;\n }\n\n if (klingaiOptions?.cameraControl != null) {\n body.camera_control = klingaiOptions.cameraControl;\n }\n\n if (klingaiOptions?.staticMask != null) {\n body.static_mask = klingaiOptions.staticMask;\n }\n\n if (klingaiOptions?.dynamicMasks != null) {\n body.dynamic_masks = klingaiOptions.dynamicMasks;\n }\n\n // v3.0 multi-shot\n if (klingaiOptions?.multiShot != null) {\n body.multi_shot = klingaiOptions.multiShot;\n }\n\n if (klingaiOptions?.shotType != null) {\n body.shot_type = klingaiOptions.shotType;\n }\n\n if (klingaiOptions?.multiPrompt != null) {\n body.multi_prompt = klingaiOptions.multiPrompt;\n }\n\n // v3.0 element control (I2V only)\n if (klingaiOptions?.elementList != null) {\n body.element_list = klingaiOptions.elementList;\n }\n\n // v3.0 voice control\n if (klingaiOptions?.voiceList != null) {\n body.voice_list = klingaiOptions.voiceList;\n }\n\n if (klingaiOptions?.watermarkEnabled != null) {\n body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };\n }\n\n // Map standard SDK duration (number → string)\n if (options.duration != null) {\n body.duration = String(options.duration);\n }\n\n // aspectRatio is not supported for I2V (determined by input image)\n if (options.aspectRatio != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details:\n 'KlingAI image-to-video does not support aspectRatio. ' +\n 'The output dimensions are determined by the input image.',\n });\n }\n\n this.addPassthroughOptions(body, klingaiOptions);\n\n return body;\n }\n\n private buildMultiImageBody(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n klingaiOptions: KlingAIVideoModelOptions | undefined,\n referenceImages: Array<Experimental_VideoModelV3File>,\n warnings: SharedV3Warning[],\n ): Record<string, unknown> {\n const body: Record<string, unknown> = {\n model_name: getApiModelName(this.modelId, 'mi2v'),\n image_list: referenceImages.map(image => ({\n image: fileToImageString(image),\n })),\n };\n\n if (options.prompt != null) {\n body.prompt = options.prompt;\n }\n\n if (klingaiOptions?.negativePrompt != null) {\n body.negative_prompt = klingaiOptions.negativePrompt;\n }\n\n if (klingaiOptions?.cfgScale != null) {\n body.cfg_scale = klingaiOptions.cfgScale;\n }\n\n if (klingaiOptions?.mode != null) {\n body.mode = klingaiOptions.mode;\n }\n\n if (options.aspectRatio != null) {\n body.aspect_ratio = options.aspectRatio;\n }\n\n if (options.duration != null) {\n body.duration = String(options.duration);\n }\n\n if (klingaiOptions?.watermarkEnabled != null) {\n body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };\n }\n\n if (resolveStartImage(options) != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'frameImages',\n details:\n 'KlingAI reference-to-video does not support a separate start frame. ' +\n 'Provide all guidance images via inputReferences instead.',\n });\n }\n\n if (resolveImageTail(options, klingaiOptions) != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'frameImages',\n details:\n 'KlingAI reference-to-video does not support a last frame (image_tail). ' +\n 'Provide all guidance images via inputReferences instead.',\n });\n }\n\n this.addPassthroughOptions(body, klingaiOptions);\n\n return body;\n }\n\n private buildMotionControlBody(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n klingaiOptions: KlingAIVideoModelOptions | undefined,\n warnings: SharedV3Warning[],\n ): Record<string, unknown> {\n if (\n !klingaiOptions?.videoUrl ||\n !klingaiOptions?.characterOrientation ||\n !klingaiOptions?.mode\n ) {\n throw new AISDKError({\n name: 'KLINGAI_VIDEO_MISSING_OPTIONS',\n message:\n 'KlingAI Motion Control requires providerOptions.klingai with videoUrl, characterOrientation, and mode.',\n });\n }\n\n const mode = 'motion-control' as const;\n const body: Record<string, unknown> = {\n model_name: getApiModelName(this.modelId, mode),\n video_url: klingaiOptions.videoUrl,\n character_orientation: klingaiOptions.characterOrientation,\n mode: klingaiOptions.mode,\n };\n\n if (options.prompt != null) {\n body.prompt = options.prompt;\n }\n\n const startImage = resolveStartImage(options);\n if (startImage != null) {\n body.image_url = fileToImageString(startImage);\n }\n\n if (klingaiOptions.keepOriginalSound != null) {\n body.keep_original_sound = klingaiOptions.keepOriginalSound;\n }\n\n if (klingaiOptions.watermarkEnabled != null) {\n body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };\n }\n\n // v3.0 element control\n if (klingaiOptions.elementList != null) {\n body.element_list = klingaiOptions.elementList;\n }\n\n // Warn about unsupported standard options for motion control\n if (options.aspectRatio) {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details:\n 'KlingAI Motion Control does not support aspectRatio. ' +\n 'The output dimensions are determined by the reference image/video.',\n });\n }\n\n if (options.duration) {\n warnings.push({\n type: 'unsupported',\n feature: 'duration',\n details:\n 'KlingAI Motion Control does not support custom duration. ' +\n 'The output duration matches the reference video duration.',\n });\n }\n\n this.addPassthroughOptions(body, klingaiOptions);\n\n return body;\n }\n\n private addPassthroughOptions(\n body: Record<string, unknown>,\n klingaiOptions: KlingAIVideoModelOptions | undefined,\n ): void {\n if (!klingaiOptions) return;\n for (const [key, value] of Object.entries(klingaiOptions)) {\n if (!HANDLED_PROVIDER_OPTIONS.has(key)) {\n body[key] = value;\n }\n }\n }\n}\n\n// Response schema for task creation (POST)\nconst klingaiCreateTaskSchema = z.object({\n code: z.number(),\n message: z.string(),\n request_id: z.string().nullish(),\n data: z\n .object({\n task_id: z.string(),\n task_status: z.string().nullish(),\n task_info: z\n .object({\n external_task_id: z.string().nullish(),\n })\n .nullish(),\n created_at: z.number().nullish(),\n updated_at: z.number().nullish(),\n })\n .nullish(),\n});\n\n// Response schema for task status query (GET)\nconst klingaiTaskStatusSchema = z.object({\n code: z.number(),\n message: z.string(),\n request_id: z.string().nullish(),\n data: z\n .object({\n task_id: z.string(),\n task_status: z.string(),\n task_status_msg: z.string().nullish(),\n task_info: z\n .object({\n external_task_id: z.string().nullish(),\n })\n .nullish(),\n watermark_info: z\n .object({\n enabled: z.boolean().nullish(),\n })\n .nullish(),\n final_unit_deduction: z.string().nullish(),\n created_at: z.number().nullish(),\n updated_at: z.number().nullish(),\n task_result: z\n .object({\n videos: z\n .array(\n z.object({\n id: z.string().nullish(),\n url: z.string().nullish(),\n watermark_url: z.string().nullish(),\n duration: z.string().nullish(),\n }),\n )\n .nullish(),\n })\n .nullish(),\n })\n .nullish(),\n});\n\ntype KlingAITaskResponse = z.infer<typeof klingaiTaskStatusSchema>;\n","import { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport const klingaiErrorDataSchema = z.object({\n code: z.number(),\n message: z.string(),\n});\n\nexport type KlingAIErrorData = z.infer<typeof klingaiErrorDataSchema>;\n\nexport const klingaiFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: klingaiErrorDataSchema,\n errorToMessage: data => data.message,\n});\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["import_provider","import_provider_utils","import_provider_utils","import_v4","import_provider_utils"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/klingai-provider.ts","../src/klingai-auth.ts","../src/klingai-video-model.ts","../src/klingai-error.ts","../src/version.ts"],"sourcesContent":["export { createKlingAI, klingai } from './klingai-provider';\nexport type {\n KlingAIProvider,\n KlingAIProviderSettings,\n} from './klingai-provider';\nexport type { KlingAIVideoModelId } from './klingai-video-settings';\nexport type {\n KlingAIVideoModelOptions,\n /** @deprecated Use `KlingAIVideoModelOptions` instead. */\n KlingAIVideoModelOptions as KlingAIVideoProviderOptions,\n} from './klingai-video-model';\n","import {\n type Experimental_VideoModelV3 as VideoModelV3,\n type ProviderV3,\n NoSuchModelError,\n} from '@ai-sdk/provider';\nimport {\n type FetchFunction,\n withoutTrailingSlash,\n withUserAgentSuffix,\n} from '@ai-sdk/provider-utils';\nimport { generateKlingAIAuthToken } from './klingai-auth';\nimport { KlingAIVideoModel } from './klingai-video-model';\nimport type { KlingAIVideoModelId } from './klingai-video-settings';\nimport { VERSION } from './version';\n\nexport interface KlingAIProviderSettings {\n /**\n * KlingAI Access key. Default value is taken from the `KLINGAI_ACCESS_KEY`\n * environment variable.\n */\n accessKey?: string;\n /**\n * KlingAI Secret key. Default value is taken from the `KLINGAI_SECRET_KEY`\n * environment variable.\n */\n secretKey?: string;\n /**\n * Base URL for the API calls.\n */\n baseURL?: string;\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept\n * requests, or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport interface KlingAIProvider extends ProviderV3 {\n /**\n * Creates a model for video generation.\n */\n video(modelId: KlingAIVideoModelId): VideoModelV3;\n\n /**\n * Creates a model for video generation.\n */\n videoModel(modelId: KlingAIVideoModelId): VideoModelV3;\n}\n\nconst defaultBaseURL = 'https://api-singapore.klingai.com';\n\n/**\n * Create a KlingAI provider instance.\n */\nexport function createKlingAI(\n options: KlingAIProviderSettings = {},\n): KlingAIProvider {\n const baseURL =\n withoutTrailingSlash(options.baseURL ?? defaultBaseURL) ?? defaultBaseURL;\n\n const getHeaders = async () => {\n const token = await generateKlingAIAuthToken({\n accessKey: options.accessKey,\n secretKey: options.secretKey,\n });\n\n return withUserAgentSuffix(\n {\n Authorization: `Bearer ${token}`,\n ...options.headers,\n },\n `ai-sdk/klingai/${VERSION}`,\n );\n };\n\n const createVideoModel = (modelId: KlingAIVideoModelId): VideoModelV3 =>\n new KlingAIVideoModel(modelId, {\n provider: 'klingai.video',\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const noSuchModel = (\n modelId: string,\n modelType:\n | 'languageModel'\n | 'embeddingModel'\n | 'imageModel'\n | 'transcriptionModel'\n | 'speechModel'\n | 'rerankingModel',\n ): never => {\n throw new NoSuchModelError({ modelId, modelType });\n };\n\n const provider: KlingAIProvider = {\n specificationVersion: 'v3' as const,\n video: createVideoModel,\n videoModel: createVideoModel,\n languageModel: (modelId: string) => noSuchModel(modelId, 'languageModel'),\n embeddingModel: (modelId: string) => noSuchModel(modelId, 'embeddingModel'),\n imageModel: (modelId: string) => noSuchModel(modelId, 'imageModel'),\n };\n\n return provider;\n}\n\n/**\n * Default KlingAI provider instance.\n */\nexport const klingai = createKlingAI();\n","import { loadSetting } from '@ai-sdk/provider-utils';\n\n/**\n * Encode a string to base64url format (URL-safe base64 without padding).\n */\nconst base64url = (str: string) =>\n btoa(str).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n\n/**\n * Generate a JWT authentication token for KlingAI API access.\n *\n * Uses HS256 (HMAC-SHA256) signing via the Web Crypto API — no external\n * dependencies required. Compatible with Node.js, Edge, and browser runtimes.\n *\n * @see https://app.klingai.com/global/dev/document-api/quickStart/userManual\n * @see https://app.klingai.com/global/dev/document-api/apiReference/commonInfo\n */\nexport async function generateKlingAIAuthToken({\n accessKey,\n secretKey,\n}: {\n accessKey?: string;\n secretKey?: string;\n}): Promise<string> {\n const ak = loadSetting({\n settingValue: accessKey,\n settingName: 'accessKey',\n environmentVariableName: 'KLINGAI_ACCESS_KEY',\n description: 'KlingAI access key',\n });\n\n const sk = loadSetting({\n settingValue: secretKey,\n settingName: 'secretKey',\n environmentVariableName: 'KLINGAI_SECRET_KEY',\n description: 'KlingAI secret key',\n });\n\n const now = Math.floor(Date.now() / 1000);\n\n const header = { alg: 'HS256', typ: 'JWT' };\n const payload = {\n iss: ak,\n exp: now + 1800, // Valid for 30 minutes\n nbf: now - 5, // Valid 5 seconds before current time\n };\n\n const encoder = new TextEncoder();\n\n // Import the secret key for HMAC-SHA256 signing\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(sk),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n\n const signingInput = `${base64url(JSON.stringify(header))}.${base64url(\n JSON.stringify(payload),\n )}`;\n\n const signature = await crypto.subtle.sign(\n 'HMAC',\n key,\n encoder.encode(signingInput),\n );\n\n const signatureBytes = new Uint8Array(signature);\n const signatureBase64 = base64url(\n String.fromCharCode.apply(null, Array.from(signatureBytes)),\n );\n\n return `${signingInput}.${signatureBase64}`;\n}\n","import {\n AISDKError,\n type Experimental_VideoModelV3,\n type Experimental_VideoModelV3File,\n NoSuchModelError,\n type SharedV3Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertUint8ArrayToBase64,\n createJsonResponseHandler,\n delay,\n type FetchFunction,\n getFromApi,\n lazySchema,\n parseProviderOptions,\n postJsonToApi,\n type Resolvable,\n resolve,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { klingaiFailedResponseHandler } from './klingai-error';\nimport type { KlingAIVideoModelId } from './klingai-video-settings';\n\ntype KlingAIVideoMode = 't2v' | 'i2v' | 'mi2v' | 'motion-control';\n\nfunction fileToImageString(file: Experimental_VideoModelV3File): string {\n if (file.type === 'url') {\n return file.url;\n }\n return typeof file.data === 'string'\n ? file.data\n : convertUint8ArrayToBase64(file.data);\n}\n\nfunction getTopLevelMediaType(mediaType: string): string {\n const slashIndex = mediaType.indexOf('/');\n return slashIndex === -1 ? mediaType : mediaType.substring(0, slashIndex);\n}\n\n/**\n * KlingAI does not support video reference inputs. This detects whether a file\n * is a video so it can be guarded against and excluded.\n */\nconst isVideoFile = (file: Experimental_VideoModelV3File): boolean =>\n file.mediaType != null && getTopLevelMediaType(file.mediaType) === 'video';\n\nfunction getReferenceImages(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n warnings: SharedV3Warning[],\n): Array<Experimental_VideoModelV3File> | undefined {\n if (options.frameImages != null && options.frameImages.length > 0) {\n return undefined;\n }\n\n if (options.inputReferences == null || options.inputReferences.length === 0) {\n return undefined;\n }\n\n const imageReferences = options.inputReferences.filter(reference => {\n if (isVideoFile(reference)) {\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details:\n 'KlingAI does not support video reference inputs; the video ' +\n 'reference was ignored.',\n });\n return false;\n }\n return true;\n });\n\n return imageReferences.length > 0 ? imageReferences : undefined;\n}\n\nfunction getFirstFrameImage(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n): Experimental_VideoModelV3File | undefined {\n return options.frameImages?.find(frame => frame.frameType === 'first_frame')\n ?.image;\n}\n\nfunction resolveStartImage(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n warnings: SharedV3Warning[],\n): Experimental_VideoModelV3File | undefined {\n const startImage = getFirstFrameImage(options) ?? options.image;\n\n if (startImage != null && isVideoFile(startImage)) {\n warnings.push({\n type: 'unsupported',\n feature: 'frameImages',\n details:\n 'KlingAI does not accept video as a frame image; it was ignored.',\n });\n return undefined;\n }\n\n return startImage;\n}\n\nfunction resolveImageTail(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n klingaiOptions: KlingAIVideoModelOptions | undefined,\n warnings: SharedV3Warning[],\n): string | undefined {\n const lastFrame = options.frameImages?.find(\n frame => frame.frameType === 'last_frame',\n )?.image;\n\n if (lastFrame != null) {\n if (isVideoFile(lastFrame)) {\n warnings.push({\n type: 'unsupported',\n feature: 'frameImages',\n details:\n 'KlingAI does not accept video as a frame image; it was ignored.',\n });\n return undefined;\n }\n return fileToImageString(lastFrame);\n }\n\n return klingaiOptions?.imageTail ?? undefined;\n}\n\n/**\n * Detects the video generation mode from the model ID suffix.\n */\nfunction detectMode(modelId: string): KlingAIVideoMode {\n if (modelId.endsWith('-t2v')) return 't2v';\n if (modelId.endsWith('-i2v')) return 'i2v';\n if (modelId.endsWith('-motion-control')) return 'motion-control';\n throw new NoSuchModelError({ modelId, modelType: 'videoModel' });\n}\n\n/**\n * Maps video generation mode to the KlingAI API endpoint path.\n */\nconst modeEndpointMap: Record<KlingAIVideoMode, string> = {\n t2v: '/v1/videos/text2video',\n i2v: '/v1/videos/image2video',\n mi2v: '/v1/videos/multi-image2video',\n 'motion-control': '/v1/videos/motion-control',\n};\n\n/**\n * Derives the KlingAI API `model_name` from the SDK model ID.\n * Strips the mode suffix and converts dots to hyphens.\n *\n * Examples:\n * - 'kling-v2.6-t2v' → 'kling-v2-6'\n * - 'kling-v2.1-master-i2v' → 'kling-v2-1-master'\n * - 'kling-v1-t2v' → 'kling-v1'\n * - 'kling-v3.0-t2v' → 'kling-v3'\n */\nfunction getApiModelName(modelId: string, mode: KlingAIVideoMode): string {\n const suffix =\n mode === 'motion-control'\n ? '-motion-control'\n : mode === 'mi2v'\n ? '-i2v'\n : `-${mode}`;\n const baseName = modelId.slice(0, -suffix.length);\n return baseName.replace(/\\.0$/, '').replace(/\\./g, '-');\n}\n\n/**\n * Provider-specific options for KlingAI video generation.\n *\n * Not all options are supported by every model version and video mode (T2V, I2V,\n * motion control). See the KlingAI capability map for detailed compatibility:\n * https://app.klingai.com/global/dev/document-api/apiReference/model/skillsMap\n */\nexport type KlingAIVideoModelOptions = {\n /**\n * Video generation mode.\n *\n * - `'std'`: Standard mode — cost-effective.\n * - `'pro'`: Professional mode — higher quality but longer generation time.\n */\n mode?: 'std' | 'pro' | null;\n\n /**\n * Polling interval in milliseconds for checking task status.\n * Default: 5000 (5 seconds).\n */\n pollIntervalMs?: number | null;\n\n /**\n * Maximum time in milliseconds to wait for video generation.\n * Default: 600000 (10 minutes).\n */\n pollTimeoutMs?: number | null;\n\n // --- T2V and I2V options ---\n\n /**\n * Negative text prompt to specify what to avoid.\n * Cannot exceed 2500 characters.\n */\n negativePrompt?: string | null;\n\n /**\n * Whether to generate sound simultaneously when generating videos.\n * Only V2.6 and subsequent versions support this parameter,\n * and requires `mode: 'pro'`.\n */\n sound?: 'on' | 'off' | null;\n\n /**\n * Flexibility in video generation. The higher the value, the lower the\n * model's flexibility, and the stronger the relevance to the user's prompt.\n * Value range: [0, 1]. Kling-v2.x models do not support this parameter.\n */\n cfgScale?: number | null;\n\n /**\n * Camera movement control. If not specified, the model will intelligently\n * match based on the input text/images.\n */\n cameraControl?: {\n type:\n | 'simple'\n | 'down_back'\n | 'forward_up'\n | 'right_turn_forward'\n | 'left_turn_forward';\n config?: {\n horizontal?: number | null;\n vertical?: number | null;\n pan?: number | null;\n tilt?: number | null;\n roll?: number | null;\n zoom?: number | null;\n } | null;\n } | null;\n\n // --- I2V-specific options ---\n\n /**\n * End frame image for I2V start+end frame control.\n * Supports image URL or raw base64-encoded image data.\n * Requires `mode: 'pro'` for most models.\n */\n imageTail?: string | null;\n\n /**\n * Static brush mask image for I2V motion brush.\n * Supports image URL or raw base64-encoded image data.\n */\n staticMask?: string | null;\n\n /**\n * Dynamic brush configurations for I2V motion brush.\n * Up to 6 groups, each with a mask and motion trajectories.\n */\n dynamicMasks?: Array<{\n mask: string;\n trajectories: Array<{ x: number; y: number }>;\n }> | null;\n\n // --- v3.0 multi-shot options (T2V and I2V) ---\n\n /**\n * Enable multi-shot video generation (Kling v3.0+).\n * When true, the video is split into up to 6 storyboard shots\n * with individual prompts and durations.\n *\n * When multiShot is true with shotType 'customize', multiPrompt is required.\n * When multiShot is true, the main prompt parameter is ignored by the API.\n */\n multiShot?: boolean | null;\n\n /**\n * Storyboard method for multi-shot video generation (Kling v3.0+).\n * Required when multiShot is true.\n *\n * - `'customize'`: User-defined shots via multiPrompt.\n * - `'intelligence'`: Model auto-segments based on the main prompt.\n */\n shotType?: 'customize' | 'intelligence' | null;\n\n /**\n * Per-shot details for multi-shot video generation (Kling v3.0+).\n * Required when multiShot is true and shotType is 'customize'.\n *\n * Up to 6 shots. Each shot has an index, prompt (max 512 chars),\n * and duration in seconds. Shot durations must sum to the total duration.\n */\n multiPrompt?: Array<{\n index: number;\n prompt: string;\n duration: string;\n }> | null;\n\n // --- v3.0 element control (I2V and Motion Control) ---\n\n /**\n * Reference elements for element control (Kling v3.0+).\n * Supports video character elements and multi-image elements.\n *\n * - I2V: Up to 3 reference elements. Cannot coexist with voiceList.\n * - Motion Control: Currently only 1 element supported.\n * When referencing an element, the generated video can only\n * refer to the orientation of the person in the video.\n */\n elementList?: Array<{\n element_id: number;\n }> | null;\n\n // --- v3.0 voice control (T2V and I2V) ---\n\n /**\n * Voice references for voice control (Kling v3.0+).\n * Up to 2 voice references. Referenced via `<<<voice_1>>>` template\n * syntax in the prompt.\n *\n * When voiceList is used and the prompt references voice IDs,\n * sound must be set to 'on'.\n * Cannot coexist with elementList on the I2V endpoint.\n */\n voiceList?: Array<{\n voice_id: string;\n }> | null;\n\n // --- Shared options ---\n\n /**\n * Whether to generate watermarked results simultaneously.\n */\n watermarkEnabled?: boolean | null;\n\n // --- Motion-control-specific options ---\n\n /**\n * URL of the reference video. The character actions in the generated video\n * are consistent with the reference video.\n *\n * Supports .mp4/.mov, max 100MB, side lengths 340px–3850px,\n * duration 3–30 seconds (depends on `characterOrientation`).\n */\n videoUrl?: string | null;\n\n /**\n * Orientation of the characters in the generated video.\n *\n * - `'image'`: Same orientation as the person in the image.\n * Reference video duration max 10 seconds.\n * - `'video'`: Same orientation as the person in the video.\n * Reference video duration max 30 seconds.\n */\n characterOrientation?: 'image' | 'video' | null;\n\n /**\n * Whether to keep the original sound of the reference video.\n * Default: `'yes'`.\n */\n keepOriginalSound?: 'yes' | 'no' | null;\n\n [key: string]: unknown; // For passthrough\n};\n\nconst klingaiVideoModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z\n .object({\n mode: z.enum(['std', 'pro']).nullish(),\n pollIntervalMs: z.number().positive().nullish(),\n pollTimeoutMs: z.number().positive().nullish(),\n // T2V and I2V\n negativePrompt: z.string().nullish(),\n sound: z.enum(['on', 'off']).nullish(),\n cfgScale: z.number().nullish(),\n cameraControl: z\n .object({\n type: z.enum([\n 'simple',\n 'down_back',\n 'forward_up',\n 'right_turn_forward',\n 'left_turn_forward',\n ]),\n config: z\n .object({\n horizontal: z.number().nullish(),\n vertical: z.number().nullish(),\n pan: z.number().nullish(),\n tilt: z.number().nullish(),\n roll: z.number().nullish(),\n zoom: z.number().nullish(),\n })\n .nullish(),\n })\n .nullish(),\n // v3.0 multi-shot\n multiShot: z.boolean().nullish(),\n shotType: z.enum(['customize', 'intelligence']).nullish(),\n multiPrompt: z\n .array(\n z.object({\n index: z.number(),\n prompt: z.string(),\n duration: z.string(),\n }),\n )\n .nullish(),\n // v3.0 element control (I2V)\n elementList: z\n .array(\n z.object({\n element_id: z.number(),\n }),\n )\n .nullish(),\n // v3.0 voice control\n voiceList: z\n .array(\n z.object({\n voice_id: z.string(),\n }),\n )\n .nullish(),\n // I2V-specific\n imageTail: z.string().nullish(),\n staticMask: z.string().nullish(),\n dynamicMasks: z\n .array(\n z.object({\n mask: z.string(),\n trajectories: z.array(z.object({ x: z.number(), y: z.number() })),\n }),\n )\n .nullish(),\n // Motion-control-specific\n videoUrl: z.string().nullish(),\n characterOrientation: z.enum(['image', 'video']).nullish(),\n keepOriginalSound: z.enum(['yes', 'no']).nullish(),\n watermarkEnabled: z.boolean().nullish(),\n })\n .passthrough(),\n ),\n);\n\n/**\n * Known provider option keys that are handled explicitly and should not be\n * passed through to the API body.\n */\nconst HANDLED_PROVIDER_OPTIONS = new Set([\n 'mode',\n 'pollIntervalMs',\n 'pollTimeoutMs',\n 'negativePrompt',\n 'sound',\n 'cfgScale',\n 'cameraControl',\n 'multiShot',\n 'shotType',\n 'multiPrompt',\n 'elementList',\n 'voiceList',\n 'imageTail',\n 'staticMask',\n 'dynamicMasks',\n 'videoUrl',\n 'characterOrientation',\n 'keepOriginalSound',\n 'watermarkEnabled',\n]);\n\ninterface KlingAIVideoModelConfig {\n provider: string;\n baseURL: string;\n headers?: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class KlingAIVideoModel implements Experimental_VideoModelV3 {\n readonly specificationVersion = 'v3';\n readonly maxVideosPerCall = 1;\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: KlingAIVideoModelId,\n private readonly config: KlingAIVideoModelConfig,\n ) {}\n\n async doGenerate(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<Experimental_VideoModelV3['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const warnings: SharedV3Warning[] = [];\n const mode = detectMode(this.modelId);\n\n const klingaiOptions = (await parseProviderOptions({\n provider: 'klingai',\n providerOptions: options.providerOptions,\n schema: klingaiVideoModelOptionsSchema,\n })) as KlingAIVideoModelOptions | undefined;\n\n const referenceImages = getReferenceImages(options, warnings);\n const effectiveMode: KlingAIVideoMode =\n mode === 'i2v' && referenceImages != null ? 'mi2v' : mode;\n\n let body: Record<string, unknown>;\n\n if (effectiveMode === 'motion-control') {\n body = this.buildMotionControlBody(options, klingaiOptions, warnings);\n } else if (effectiveMode === 't2v') {\n body = this.buildT2VBody(options, klingaiOptions, warnings);\n } else if (effectiveMode === 'mi2v') {\n body = this.buildMultiImageBody(\n options,\n klingaiOptions,\n referenceImages!,\n warnings,\n );\n } else {\n body = this.buildI2VBody(options, klingaiOptions, warnings);\n }\n\n if (referenceImages != null && effectiveMode !== 'mi2v') {\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details:\n 'KlingAI only supports inputReferences (reference-to-video) on ' +\n 'image-to-video models. The reference images were ignored.',\n });\n }\n\n // Warn about universally unsupported standard options\n if (options.resolution) {\n warnings.push({\n type: 'unsupported',\n feature: 'resolution',\n details: 'KlingAI video models do not support the resolution option.',\n });\n }\n\n if (options.seed) {\n warnings.push({\n type: 'unsupported',\n feature: 'seed',\n details:\n 'KlingAI video models do not support seed for deterministic generation.',\n });\n }\n\n if (options.fps) {\n warnings.push({\n type: 'unsupported',\n feature: 'fps',\n details: 'KlingAI video models do not support custom FPS.',\n });\n }\n\n if (options.n != null && options.n > 1) {\n warnings.push({\n type: 'unsupported',\n feature: 'n',\n details:\n 'KlingAI video models do not support generating multiple videos per call. ' +\n 'Only 1 video will be generated.',\n });\n }\n\n const endpointPath = modeEndpointMap[effectiveMode];\n\n // Step 1: Create the task\n const { value: createResponse, responseHeaders: createHeaders } =\n await postJsonToApi({\n url: `${this.config.baseURL}${endpointPath}`,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n body,\n successfulResponseHandler: createJsonResponseHandler(\n klingaiCreateTaskSchema,\n ),\n failedResponseHandler: klingaiFailedResponseHandler,\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const taskId = createResponse.data?.task_id;\n if (!taskId) {\n throw new AISDKError({\n name: 'KLINGAI_VIDEO_GENERATION_ERROR',\n message: `No task_id returned from KlingAI API. Response: ${JSON.stringify(createResponse)}`,\n });\n }\n\n // Step 2: Poll for task completion\n const pollIntervalMs = klingaiOptions?.pollIntervalMs ?? 5000; // 5 seconds\n const pollTimeoutMs = klingaiOptions?.pollTimeoutMs ?? 600000; // 10 minutes\n const startTime = Date.now();\n let finalResponse: KlingAITaskResponse | undefined;\n let responseHeaders: Record<string, string> | undefined = createHeaders;\n\n while (true) {\n await delay(pollIntervalMs, { abortSignal: options.abortSignal });\n\n if (Date.now() - startTime > pollTimeoutMs) {\n throw new AISDKError({\n name: 'KLINGAI_VIDEO_GENERATION_TIMEOUT',\n message: `Video generation timed out after ${pollTimeoutMs}ms`,\n });\n }\n\n const { value: statusResponse, responseHeaders: pollHeaders } =\n await getFromApi({\n url: `${this.config.baseURL}${endpointPath}/${taskId}`,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n successfulResponseHandler: createJsonResponseHandler(\n klingaiTaskStatusSchema,\n ),\n failedResponseHandler: klingaiFailedResponseHandler,\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n responseHeaders = pollHeaders;\n const taskStatus = statusResponse.data?.task_status;\n\n if (taskStatus === 'succeed') {\n finalResponse = statusResponse;\n break;\n }\n\n if (taskStatus === 'failed') {\n throw new AISDKError({\n name: 'KLINGAI_VIDEO_GENERATION_FAILED',\n message: `Video generation failed: ${statusResponse.data?.task_status_msg ?? 'Unknown error'}`,\n });\n }\n\n // Continue polling for 'submitted' and 'processing' statuses\n }\n\n if (!finalResponse?.data?.task_result?.videos?.length) {\n throw new AISDKError({\n name: 'KLINGAI_VIDEO_GENERATION_ERROR',\n message: `No videos in response. Response: ${JSON.stringify(finalResponse)}`,\n });\n }\n\n const videos: Array<{ type: 'url'; url: string; mediaType: string }> = [];\n const videoMetadata: Array<{\n id: string;\n url: string;\n watermarkUrl?: string;\n duration?: string;\n }> = [];\n\n for (const video of finalResponse.data.task_result.videos) {\n if (video.url) {\n videos.push({\n type: 'url',\n url: video.url,\n mediaType: 'video/mp4',\n });\n videoMetadata.push({\n id: video.id ?? '',\n url: video.url,\n ...(video.watermark_url ? { watermarkUrl: video.watermark_url } : {}),\n ...(video.duration ? { duration: video.duration } : {}),\n });\n }\n }\n\n if (videos.length === 0) {\n throw new AISDKError({\n name: 'KLINGAI_VIDEO_GENERATION_ERROR',\n message: 'No valid video URLs in response',\n });\n }\n\n return {\n videos,\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n providerMetadata: {\n klingai: {\n taskId,\n videos: videoMetadata,\n },\n },\n };\n }\n\n private buildT2VBody(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n klingaiOptions: KlingAIVideoModelOptions | undefined,\n warnings: SharedV3Warning[],\n ): Record<string, unknown> {\n const mode = 't2v' as const;\n const body: Record<string, unknown> = {\n model_name: getApiModelName(this.modelId, mode),\n };\n\n if (options.prompt != null) {\n body.prompt = options.prompt;\n }\n\n if (klingaiOptions?.negativePrompt != null) {\n body.negative_prompt = klingaiOptions.negativePrompt;\n }\n\n const sound =\n options.generateAudio != null\n ? options.generateAudio\n ? 'on'\n : 'off'\n : klingaiOptions?.sound;\n if (sound != null) {\n body.sound = sound;\n }\n\n if (klingaiOptions?.cfgScale != null) {\n body.cfg_scale = klingaiOptions.cfgScale;\n }\n\n if (klingaiOptions?.mode != null) {\n body.mode = klingaiOptions.mode;\n }\n\n if (klingaiOptions?.cameraControl != null) {\n body.camera_control = klingaiOptions.cameraControl;\n }\n\n // Map standard SDK aspectRatio (same format as KlingAI API)\n if (options.aspectRatio != null) {\n body.aspect_ratio = options.aspectRatio;\n }\n\n // Map standard SDK duration (number → string)\n if (options.duration != null) {\n body.duration = String(options.duration);\n }\n\n // v3.0 multi-shot\n if (klingaiOptions?.multiShot != null) {\n body.multi_shot = klingaiOptions.multiShot;\n }\n\n if (klingaiOptions?.shotType != null) {\n body.shot_type = klingaiOptions.shotType;\n }\n\n if (klingaiOptions?.multiPrompt != null) {\n body.multi_prompt = klingaiOptions.multiPrompt;\n }\n\n // v3.0 voice control\n if (klingaiOptions?.voiceList != null) {\n body.voice_list = klingaiOptions.voiceList;\n }\n\n if (klingaiOptions?.watermarkEnabled != null) {\n body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };\n }\n\n // Image is not supported for T2V\n if (resolveStartImage(options, warnings) != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'image',\n details:\n 'KlingAI text-to-video does not support image input. Use an image-to-video model instead.',\n });\n }\n\n this.addPassthroughOptions(body, klingaiOptions);\n\n return body;\n }\n\n private buildI2VBody(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n klingaiOptions: KlingAIVideoModelOptions | undefined,\n warnings: SharedV3Warning[],\n ): Record<string, unknown> {\n const mode = 'i2v' as const;\n const body: Record<string, unknown> = {\n model_name: getApiModelName(this.modelId, mode),\n };\n\n if (options.prompt != null) {\n body.prompt = options.prompt;\n }\n\n const startImage = resolveStartImage(options, warnings);\n if (startImage != null) {\n body.image = fileToImageString(startImage);\n }\n\n // End frame image: prefer top-level frameImages (last_frame), fall back to\n // providerOptions.klingai.imageTail.\n const imageTail = resolveImageTail(options, klingaiOptions, warnings);\n if (imageTail != null) {\n body.image_tail = imageTail;\n }\n\n if (klingaiOptions?.negativePrompt != null) {\n body.negative_prompt = klingaiOptions.negativePrompt;\n }\n\n const sound =\n options.generateAudio != null\n ? options.generateAudio\n ? 'on'\n : 'off'\n : klingaiOptions?.sound;\n if (sound != null) {\n body.sound = sound;\n }\n\n if (klingaiOptions?.cfgScale != null) {\n body.cfg_scale = klingaiOptions.cfgScale;\n }\n\n if (klingaiOptions?.mode != null) {\n body.mode = klingaiOptions.mode;\n }\n\n if (klingaiOptions?.cameraControl != null) {\n body.camera_control = klingaiOptions.cameraControl;\n }\n\n if (klingaiOptions?.staticMask != null) {\n body.static_mask = klingaiOptions.staticMask;\n }\n\n if (klingaiOptions?.dynamicMasks != null) {\n body.dynamic_masks = klingaiOptions.dynamicMasks;\n }\n\n // v3.0 multi-shot\n if (klingaiOptions?.multiShot != null) {\n body.multi_shot = klingaiOptions.multiShot;\n }\n\n if (klingaiOptions?.shotType != null) {\n body.shot_type = klingaiOptions.shotType;\n }\n\n if (klingaiOptions?.multiPrompt != null) {\n body.multi_prompt = klingaiOptions.multiPrompt;\n }\n\n // v3.0 element control (I2V only)\n if (klingaiOptions?.elementList != null) {\n body.element_list = klingaiOptions.elementList;\n }\n\n // v3.0 voice control\n if (klingaiOptions?.voiceList != null) {\n body.voice_list = klingaiOptions.voiceList;\n }\n\n if (klingaiOptions?.watermarkEnabled != null) {\n body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };\n }\n\n // Map standard SDK duration (number → string)\n if (options.duration != null) {\n body.duration = String(options.duration);\n }\n\n // aspectRatio is not supported for I2V (determined by input image)\n if (options.aspectRatio != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details:\n 'KlingAI image-to-video does not support aspectRatio. ' +\n 'The output dimensions are determined by the input image.',\n });\n }\n\n this.addPassthroughOptions(body, klingaiOptions);\n\n return body;\n }\n\n private buildMultiImageBody(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n klingaiOptions: KlingAIVideoModelOptions | undefined,\n referenceImages: Array<Experimental_VideoModelV3File>,\n warnings: SharedV3Warning[],\n ): Record<string, unknown> {\n const body: Record<string, unknown> = {\n model_name: getApiModelName(this.modelId, 'mi2v'),\n image_list: referenceImages.map(image => ({\n image: fileToImageString(image),\n })),\n };\n\n if (options.prompt != null) {\n body.prompt = options.prompt;\n }\n\n if (klingaiOptions?.negativePrompt != null) {\n body.negative_prompt = klingaiOptions.negativePrompt;\n }\n\n if (klingaiOptions?.cfgScale != null) {\n body.cfg_scale = klingaiOptions.cfgScale;\n }\n\n if (klingaiOptions?.mode != null) {\n body.mode = klingaiOptions.mode;\n }\n\n if (options.aspectRatio != null) {\n body.aspect_ratio = options.aspectRatio;\n }\n\n if (options.duration != null) {\n body.duration = String(options.duration);\n }\n\n if (klingaiOptions?.watermarkEnabled != null) {\n body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };\n }\n\n if (resolveStartImage(options, warnings) != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'image',\n details:\n 'KlingAI reference-to-video does not support a separate start frame. ' +\n 'Provide all guidance images via inputReferences instead.',\n });\n }\n\n if (resolveImageTail(options, klingaiOptions, warnings) != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'frameImages',\n details:\n 'KlingAI reference-to-video does not support a last frame (image_tail). ' +\n 'Provide all guidance images via inputReferences instead.',\n });\n }\n\n this.addPassthroughOptions(body, klingaiOptions);\n\n return body;\n }\n\n private buildMotionControlBody(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n klingaiOptions: KlingAIVideoModelOptions | undefined,\n warnings: SharedV3Warning[],\n ): Record<string, unknown> {\n if (\n !klingaiOptions?.videoUrl ||\n !klingaiOptions?.characterOrientation ||\n !klingaiOptions?.mode\n ) {\n throw new AISDKError({\n name: 'KLINGAI_VIDEO_MISSING_OPTIONS',\n message:\n 'KlingAI Motion Control requires providerOptions.klingai with videoUrl, characterOrientation, and mode.',\n });\n }\n\n const mode = 'motion-control' as const;\n const body: Record<string, unknown> = {\n model_name: getApiModelName(this.modelId, mode),\n video_url: klingaiOptions.videoUrl,\n character_orientation: klingaiOptions.characterOrientation,\n mode: klingaiOptions.mode,\n };\n\n if (options.prompt != null) {\n body.prompt = options.prompt;\n }\n\n const startImage = resolveStartImage(options, warnings);\n if (startImage != null) {\n body.image_url = fileToImageString(startImage);\n }\n\n if (klingaiOptions.keepOriginalSound != null) {\n body.keep_original_sound = klingaiOptions.keepOriginalSound;\n }\n\n if (klingaiOptions.watermarkEnabled != null) {\n body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };\n }\n\n // v3.0 element control\n if (klingaiOptions.elementList != null) {\n body.element_list = klingaiOptions.elementList;\n }\n\n // Warn about unsupported standard options for motion control\n if (options.aspectRatio) {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details:\n 'KlingAI Motion Control does not support aspectRatio. ' +\n 'The output dimensions are determined by the reference image/video.',\n });\n }\n\n if (options.duration) {\n warnings.push({\n type: 'unsupported',\n feature: 'duration',\n details:\n 'KlingAI Motion Control does not support custom duration. ' +\n 'The output duration matches the reference video duration.',\n });\n }\n\n this.addPassthroughOptions(body, klingaiOptions);\n\n return body;\n }\n\n private addPassthroughOptions(\n body: Record<string, unknown>,\n klingaiOptions: KlingAIVideoModelOptions | undefined,\n ): void {\n if (!klingaiOptions) return;\n for (const [key, value] of Object.entries(klingaiOptions)) {\n if (!HANDLED_PROVIDER_OPTIONS.has(key)) {\n body[key] = value;\n }\n }\n }\n}\n\n// Response schema for task creation (POST)\nconst klingaiCreateTaskSchema = z.object({\n code: z.number(),\n message: z.string(),\n request_id: z.string().nullish(),\n data: z\n .object({\n task_id: z.string(),\n task_status: z.string().nullish(),\n task_info: z\n .object({\n external_task_id: z.string().nullish(),\n })\n .nullish(),\n created_at: z.number().nullish(),\n updated_at: z.number().nullish(),\n })\n .nullish(),\n});\n\n// Response schema for task status query (GET)\nconst klingaiTaskStatusSchema = z.object({\n code: z.number(),\n message: z.string(),\n request_id: z.string().nullish(),\n data: z\n .object({\n task_id: z.string(),\n task_status: z.string(),\n task_status_msg: z.string().nullish(),\n task_info: z\n .object({\n external_task_id: z.string().nullish(),\n })\n .nullish(),\n watermark_info: z\n .object({\n enabled: z.boolean().nullish(),\n })\n .nullish(),\n final_unit_deduction: z.string().nullish(),\n created_at: z.number().nullish(),\n updated_at: z.number().nullish(),\n task_result: z\n .object({\n videos: z\n .array(\n z.object({\n id: z.string().nullish(),\n url: z.string().nullish(),\n watermark_url: z.string().nullish(),\n duration: z.string().nullish(),\n }),\n )\n .nullish(),\n })\n .nullish(),\n })\n .nullish(),\n});\n\ntype KlingAITaskResponse = z.infer<typeof klingaiTaskStatusSchema>;\n","import { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport const klingaiErrorDataSchema = z.object({\n code: z.number(),\n message: z.string(),\n});\n\nexport type KlingAIErrorData = z.infer<typeof klingaiErrorDataSchema>;\n\nexport const klingaiFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: klingaiErrorDataSchema,\n errorToMessage: data => data.message,\n});\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["import_provider","import_provider_utils","import_provider_utils","import_v4","import_provider_utils"]}
|
package/dist/index.mjs
CHANGED
|
@@ -96,26 +96,62 @@ function fileToImageString(file) {
|
|
|
96
96
|
}
|
|
97
97
|
return typeof file.data === "string" ? file.data : convertUint8ArrayToBase64(file.data);
|
|
98
98
|
}
|
|
99
|
-
function
|
|
99
|
+
function getTopLevelMediaType(mediaType) {
|
|
100
|
+
const slashIndex = mediaType.indexOf("/");
|
|
101
|
+
return slashIndex === -1 ? mediaType : mediaType.substring(0, slashIndex);
|
|
102
|
+
}
|
|
103
|
+
var isVideoFile = (file) => file.mediaType != null && getTopLevelMediaType(file.mediaType) === "video";
|
|
104
|
+
function getReferenceImages(options, warnings) {
|
|
100
105
|
if (options.frameImages != null && options.frameImages.length > 0) {
|
|
101
106
|
return void 0;
|
|
102
107
|
}
|
|
103
|
-
|
|
108
|
+
if (options.inputReferences == null || options.inputReferences.length === 0) {
|
|
109
|
+
return void 0;
|
|
110
|
+
}
|
|
111
|
+
const imageReferences = options.inputReferences.filter((reference) => {
|
|
112
|
+
if (isVideoFile(reference)) {
|
|
113
|
+
warnings.push({
|
|
114
|
+
type: "unsupported",
|
|
115
|
+
feature: "inputReferences",
|
|
116
|
+
details: "KlingAI does not support video reference inputs; the video reference was ignored."
|
|
117
|
+
});
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
return true;
|
|
121
|
+
});
|
|
122
|
+
return imageReferences.length > 0 ? imageReferences : void 0;
|
|
104
123
|
}
|
|
105
124
|
function getFirstFrameImage(options) {
|
|
106
125
|
var _a, _b;
|
|
107
126
|
return (_b = (_a = options.frameImages) == null ? void 0 : _a.find((frame) => frame.frameType === "first_frame")) == null ? void 0 : _b.image;
|
|
108
127
|
}
|
|
109
|
-
function resolveStartImage(options) {
|
|
128
|
+
function resolveStartImage(options, warnings) {
|
|
110
129
|
var _a;
|
|
111
|
-
|
|
130
|
+
const startImage = (_a = getFirstFrameImage(options)) != null ? _a : options.image;
|
|
131
|
+
if (startImage != null && isVideoFile(startImage)) {
|
|
132
|
+
warnings.push({
|
|
133
|
+
type: "unsupported",
|
|
134
|
+
feature: "frameImages",
|
|
135
|
+
details: "KlingAI does not accept video as a frame image; it was ignored."
|
|
136
|
+
});
|
|
137
|
+
return void 0;
|
|
138
|
+
}
|
|
139
|
+
return startImage;
|
|
112
140
|
}
|
|
113
|
-
function resolveImageTail(options, klingaiOptions) {
|
|
141
|
+
function resolveImageTail(options, klingaiOptions, warnings) {
|
|
114
142
|
var _a, _b, _c;
|
|
115
143
|
const lastFrame = (_b = (_a = options.frameImages) == null ? void 0 : _a.find(
|
|
116
144
|
(frame) => frame.frameType === "last_frame"
|
|
117
145
|
)) == null ? void 0 : _b.image;
|
|
118
146
|
if (lastFrame != null) {
|
|
147
|
+
if (isVideoFile(lastFrame)) {
|
|
148
|
+
warnings.push({
|
|
149
|
+
type: "unsupported",
|
|
150
|
+
feature: "frameImages",
|
|
151
|
+
details: "KlingAI does not accept video as a frame image; it was ignored."
|
|
152
|
+
});
|
|
153
|
+
return void 0;
|
|
154
|
+
}
|
|
119
155
|
return fileToImageString(lastFrame);
|
|
120
156
|
}
|
|
121
157
|
return (_c = klingaiOptions == null ? void 0 : klingaiOptions.imageTail) != null ? _c : void 0;
|
|
@@ -244,7 +280,7 @@ var KlingAIVideoModel = class {
|
|
|
244
280
|
providerOptions: options.providerOptions,
|
|
245
281
|
schema: klingaiVideoModelOptionsSchema
|
|
246
282
|
});
|
|
247
|
-
const referenceImages = getReferenceImages(options);
|
|
283
|
+
const referenceImages = getReferenceImages(options, warnings);
|
|
248
284
|
const effectiveMode = mode === "i2v" && referenceImages != null ? "mi2v" : mode;
|
|
249
285
|
let body;
|
|
250
286
|
if (effectiveMode === "motion-control") {
|
|
@@ -447,7 +483,7 @@ var KlingAIVideoModel = class {
|
|
|
447
483
|
if ((klingaiOptions == null ? void 0 : klingaiOptions.watermarkEnabled) != null) {
|
|
448
484
|
body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };
|
|
449
485
|
}
|
|
450
|
-
if (resolveStartImage(options) != null) {
|
|
486
|
+
if (resolveStartImage(options, warnings) != null) {
|
|
451
487
|
warnings.push({
|
|
452
488
|
type: "unsupported",
|
|
453
489
|
feature: "image",
|
|
@@ -465,11 +501,11 @@ var KlingAIVideoModel = class {
|
|
|
465
501
|
if (options.prompt != null) {
|
|
466
502
|
body.prompt = options.prompt;
|
|
467
503
|
}
|
|
468
|
-
const startImage = resolveStartImage(options);
|
|
504
|
+
const startImage = resolveStartImage(options, warnings);
|
|
469
505
|
if (startImage != null) {
|
|
470
506
|
body.image = fileToImageString(startImage);
|
|
471
507
|
}
|
|
472
|
-
const imageTail = resolveImageTail(options, klingaiOptions);
|
|
508
|
+
const imageTail = resolveImageTail(options, klingaiOptions, warnings);
|
|
473
509
|
if (imageTail != null) {
|
|
474
510
|
body.image_tail = imageTail;
|
|
475
511
|
}
|
|
@@ -554,14 +590,14 @@ var KlingAIVideoModel = class {
|
|
|
554
590
|
if ((klingaiOptions == null ? void 0 : klingaiOptions.watermarkEnabled) != null) {
|
|
555
591
|
body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };
|
|
556
592
|
}
|
|
557
|
-
if (resolveStartImage(options) != null) {
|
|
593
|
+
if (resolveStartImage(options, warnings) != null) {
|
|
558
594
|
warnings.push({
|
|
559
595
|
type: "unsupported",
|
|
560
|
-
feature: "
|
|
596
|
+
feature: "image",
|
|
561
597
|
details: "KlingAI reference-to-video does not support a separate start frame. Provide all guidance images via inputReferences instead."
|
|
562
598
|
});
|
|
563
599
|
}
|
|
564
|
-
if (resolveImageTail(options, klingaiOptions) != null) {
|
|
600
|
+
if (resolveImageTail(options, klingaiOptions, warnings) != null) {
|
|
565
601
|
warnings.push({
|
|
566
602
|
type: "unsupported",
|
|
567
603
|
feature: "frameImages",
|
|
@@ -588,7 +624,7 @@ var KlingAIVideoModel = class {
|
|
|
588
624
|
if (options.prompt != null) {
|
|
589
625
|
body.prompt = options.prompt;
|
|
590
626
|
}
|
|
591
|
-
const startImage = resolveStartImage(options);
|
|
627
|
+
const startImage = resolveStartImage(options, warnings);
|
|
592
628
|
if (startImage != null) {
|
|
593
629
|
body.image_url = fileToImageString(startImage);
|
|
594
630
|
}
|
|
@@ -672,7 +708,7 @@ var klingaiTaskStatusSchema = z2.object({
|
|
|
672
708
|
});
|
|
673
709
|
|
|
674
710
|
// src/version.ts
|
|
675
|
-
var VERSION = true ? "3.0.
|
|
711
|
+
var VERSION = true ? "3.0.29" : "0.0.0-test";
|
|
676
712
|
|
|
677
713
|
// src/klingai-provider.ts
|
|
678
714
|
var defaultBaseURL = "https://api-singapore.klingai.com";
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/klingai-provider.ts","../src/klingai-auth.ts","../src/klingai-video-model.ts","../src/klingai-error.ts","../src/version.ts"],"sourcesContent":["import {\n type Experimental_VideoModelV3 as VideoModelV3,\n type ProviderV3,\n NoSuchModelError,\n} from '@ai-sdk/provider';\nimport {\n type FetchFunction,\n withoutTrailingSlash,\n withUserAgentSuffix,\n} from '@ai-sdk/provider-utils';\nimport { generateKlingAIAuthToken } from './klingai-auth';\nimport { KlingAIVideoModel } from './klingai-video-model';\nimport type { KlingAIVideoModelId } from './klingai-video-settings';\nimport { VERSION } from './version';\n\nexport interface KlingAIProviderSettings {\n /**\n * KlingAI Access key. Default value is taken from the `KLINGAI_ACCESS_KEY`\n * environment variable.\n */\n accessKey?: string;\n /**\n * KlingAI Secret key. Default value is taken from the `KLINGAI_SECRET_KEY`\n * environment variable.\n */\n secretKey?: string;\n /**\n * Base URL for the API calls.\n */\n baseURL?: string;\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept\n * requests, or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport interface KlingAIProvider extends ProviderV3 {\n /**\n * Creates a model for video generation.\n */\n video(modelId: KlingAIVideoModelId): VideoModelV3;\n\n /**\n * Creates a model for video generation.\n */\n videoModel(modelId: KlingAIVideoModelId): VideoModelV3;\n}\n\nconst defaultBaseURL = 'https://api-singapore.klingai.com';\n\n/**\n * Create a KlingAI provider instance.\n */\nexport function createKlingAI(\n options: KlingAIProviderSettings = {},\n): KlingAIProvider {\n const baseURL =\n withoutTrailingSlash(options.baseURL ?? defaultBaseURL) ?? defaultBaseURL;\n\n const getHeaders = async () => {\n const token = await generateKlingAIAuthToken({\n accessKey: options.accessKey,\n secretKey: options.secretKey,\n });\n\n return withUserAgentSuffix(\n {\n Authorization: `Bearer ${token}`,\n ...options.headers,\n },\n `ai-sdk/klingai/${VERSION}`,\n );\n };\n\n const createVideoModel = (modelId: KlingAIVideoModelId): VideoModelV3 =>\n new KlingAIVideoModel(modelId, {\n provider: 'klingai.video',\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const noSuchModel = (\n modelId: string,\n modelType:\n | 'languageModel'\n | 'embeddingModel'\n | 'imageModel'\n | 'transcriptionModel'\n | 'speechModel'\n | 'rerankingModel',\n ): never => {\n throw new NoSuchModelError({ modelId, modelType });\n };\n\n const provider: KlingAIProvider = {\n specificationVersion: 'v3' as const,\n video: createVideoModel,\n videoModel: createVideoModel,\n languageModel: (modelId: string) => noSuchModel(modelId, 'languageModel'),\n embeddingModel: (modelId: string) => noSuchModel(modelId, 'embeddingModel'),\n imageModel: (modelId: string) => noSuchModel(modelId, 'imageModel'),\n };\n\n return provider;\n}\n\n/**\n * Default KlingAI provider instance.\n */\nexport const klingai = createKlingAI();\n","import { loadSetting } from '@ai-sdk/provider-utils';\n\n/**\n * Encode a string to base64url format (URL-safe base64 without padding).\n */\nconst base64url = (str: string) =>\n btoa(str).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n\n/**\n * Generate a JWT authentication token for KlingAI API access.\n *\n * Uses HS256 (HMAC-SHA256) signing via the Web Crypto API — no external\n * dependencies required. Compatible with Node.js, Edge, and browser runtimes.\n *\n * @see https://app.klingai.com/global/dev/document-api/quickStart/userManual\n * @see https://app.klingai.com/global/dev/document-api/apiReference/commonInfo\n */\nexport async function generateKlingAIAuthToken({\n accessKey,\n secretKey,\n}: {\n accessKey?: string;\n secretKey?: string;\n}): Promise<string> {\n const ak = loadSetting({\n settingValue: accessKey,\n settingName: 'accessKey',\n environmentVariableName: 'KLINGAI_ACCESS_KEY',\n description: 'KlingAI access key',\n });\n\n const sk = loadSetting({\n settingValue: secretKey,\n settingName: 'secretKey',\n environmentVariableName: 'KLINGAI_SECRET_KEY',\n description: 'KlingAI secret key',\n });\n\n const now = Math.floor(Date.now() / 1000);\n\n const header = { alg: 'HS256', typ: 'JWT' };\n const payload = {\n iss: ak,\n exp: now + 1800, // Valid for 30 minutes\n nbf: now - 5, // Valid 5 seconds before current time\n };\n\n const encoder = new TextEncoder();\n\n // Import the secret key for HMAC-SHA256 signing\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(sk),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n\n const signingInput = `${base64url(JSON.stringify(header))}.${base64url(\n JSON.stringify(payload),\n )}`;\n\n const signature = await crypto.subtle.sign(\n 'HMAC',\n key,\n encoder.encode(signingInput),\n );\n\n const signatureBytes = new Uint8Array(signature);\n const signatureBase64 = base64url(\n String.fromCharCode.apply(null, Array.from(signatureBytes)),\n );\n\n return `${signingInput}.${signatureBase64}`;\n}\n","import {\n AISDKError,\n type Experimental_VideoModelV3,\n type Experimental_VideoModelV3File,\n NoSuchModelError,\n type SharedV3Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertUint8ArrayToBase64,\n createJsonResponseHandler,\n delay,\n type FetchFunction,\n getFromApi,\n lazySchema,\n parseProviderOptions,\n postJsonToApi,\n type Resolvable,\n resolve,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { klingaiFailedResponseHandler } from './klingai-error';\nimport type { KlingAIVideoModelId } from './klingai-video-settings';\n\ntype KlingAIVideoMode = 't2v' | 'i2v' | 'mi2v' | 'motion-control';\n\nfunction fileToImageString(file: Experimental_VideoModelV3File): string {\n if (file.type === 'url') {\n return file.url;\n }\n return typeof file.data === 'string'\n ? file.data\n : convertUint8ArrayToBase64(file.data);\n}\n\nfunction getReferenceImages(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n): Array<Experimental_VideoModelV3File> | undefined {\n if (options.frameImages != null && options.frameImages.length > 0) {\n return undefined;\n }\n\n return options.inputReferences != null && options.inputReferences.length > 0\n ? options.inputReferences\n : undefined;\n}\n\nfunction getFirstFrameImage(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n): Experimental_VideoModelV3File | undefined {\n return options.frameImages?.find(frame => frame.frameType === 'first_frame')\n ?.image;\n}\n\nfunction resolveStartImage(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n): Experimental_VideoModelV3File | undefined {\n return getFirstFrameImage(options) ?? options.image;\n}\n\nfunction resolveImageTail(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n klingaiOptions: KlingAIVideoModelOptions | undefined,\n): string | undefined {\n const lastFrame = options.frameImages?.find(\n frame => frame.frameType === 'last_frame',\n )?.image;\n\n if (lastFrame != null) {\n return fileToImageString(lastFrame);\n }\n\n return klingaiOptions?.imageTail ?? undefined;\n}\n\n/**\n * Detects the video generation mode from the model ID suffix.\n */\nfunction detectMode(modelId: string): KlingAIVideoMode {\n if (modelId.endsWith('-t2v')) return 't2v';\n if (modelId.endsWith('-i2v')) return 'i2v';\n if (modelId.endsWith('-motion-control')) return 'motion-control';\n throw new NoSuchModelError({ modelId, modelType: 'videoModel' });\n}\n\n/**\n * Maps video generation mode to the KlingAI API endpoint path.\n */\nconst modeEndpointMap: Record<KlingAIVideoMode, string> = {\n t2v: '/v1/videos/text2video',\n i2v: '/v1/videos/image2video',\n mi2v: '/v1/videos/multi-image2video',\n 'motion-control': '/v1/videos/motion-control',\n};\n\n/**\n * Derives the KlingAI API `model_name` from the SDK model ID.\n * Strips the mode suffix and converts dots to hyphens.\n *\n * Examples:\n * - 'kling-v2.6-t2v' → 'kling-v2-6'\n * - 'kling-v2.1-master-i2v' → 'kling-v2-1-master'\n * - 'kling-v1-t2v' → 'kling-v1'\n * - 'kling-v3.0-t2v' → 'kling-v3'\n */\nfunction getApiModelName(modelId: string, mode: KlingAIVideoMode): string {\n const suffix =\n mode === 'motion-control'\n ? '-motion-control'\n : mode === 'mi2v'\n ? '-i2v'\n : `-${mode}`;\n const baseName = modelId.slice(0, -suffix.length);\n return baseName.replace(/\\.0$/, '').replace(/\\./g, '-');\n}\n\n/**\n * Provider-specific options for KlingAI video generation.\n *\n * Not all options are supported by every model version and video mode (T2V, I2V,\n * motion control). See the KlingAI capability map for detailed compatibility:\n * https://app.klingai.com/global/dev/document-api/apiReference/model/skillsMap\n */\nexport type KlingAIVideoModelOptions = {\n /**\n * Video generation mode.\n *\n * - `'std'`: Standard mode — cost-effective.\n * - `'pro'`: Professional mode — higher quality but longer generation time.\n */\n mode?: 'std' | 'pro' | null;\n\n /**\n * Polling interval in milliseconds for checking task status.\n * Default: 5000 (5 seconds).\n */\n pollIntervalMs?: number | null;\n\n /**\n * Maximum time in milliseconds to wait for video generation.\n * Default: 600000 (10 minutes).\n */\n pollTimeoutMs?: number | null;\n\n // --- T2V and I2V options ---\n\n /**\n * Negative text prompt to specify what to avoid.\n * Cannot exceed 2500 characters.\n */\n negativePrompt?: string | null;\n\n /**\n * Whether to generate sound simultaneously when generating videos.\n * Only V2.6 and subsequent versions support this parameter,\n * and requires `mode: 'pro'`.\n */\n sound?: 'on' | 'off' | null;\n\n /**\n * Flexibility in video generation. The higher the value, the lower the\n * model's flexibility, and the stronger the relevance to the user's prompt.\n * Value range: [0, 1]. Kling-v2.x models do not support this parameter.\n */\n cfgScale?: number | null;\n\n /**\n * Camera movement control. If not specified, the model will intelligently\n * match based on the input text/images.\n */\n cameraControl?: {\n type:\n | 'simple'\n | 'down_back'\n | 'forward_up'\n | 'right_turn_forward'\n | 'left_turn_forward';\n config?: {\n horizontal?: number | null;\n vertical?: number | null;\n pan?: number | null;\n tilt?: number | null;\n roll?: number | null;\n zoom?: number | null;\n } | null;\n } | null;\n\n // --- I2V-specific options ---\n\n /**\n * End frame image for I2V start+end frame control.\n * Supports image URL or raw base64-encoded image data.\n * Requires `mode: 'pro'` for most models.\n */\n imageTail?: string | null;\n\n /**\n * Static brush mask image for I2V motion brush.\n * Supports image URL or raw base64-encoded image data.\n */\n staticMask?: string | null;\n\n /**\n * Dynamic brush configurations for I2V motion brush.\n * Up to 6 groups, each with a mask and motion trajectories.\n */\n dynamicMasks?: Array<{\n mask: string;\n trajectories: Array<{ x: number; y: number }>;\n }> | null;\n\n // --- v3.0 multi-shot options (T2V and I2V) ---\n\n /**\n * Enable multi-shot video generation (Kling v3.0+).\n * When true, the video is split into up to 6 storyboard shots\n * with individual prompts and durations.\n *\n * When multiShot is true with shotType 'customize', multiPrompt is required.\n * When multiShot is true, the main prompt parameter is ignored by the API.\n */\n multiShot?: boolean | null;\n\n /**\n * Storyboard method for multi-shot video generation (Kling v3.0+).\n * Required when multiShot is true.\n *\n * - `'customize'`: User-defined shots via multiPrompt.\n * - `'intelligence'`: Model auto-segments based on the main prompt.\n */\n shotType?: 'customize' | 'intelligence' | null;\n\n /**\n * Per-shot details for multi-shot video generation (Kling v3.0+).\n * Required when multiShot is true and shotType is 'customize'.\n *\n * Up to 6 shots. Each shot has an index, prompt (max 512 chars),\n * and duration in seconds. Shot durations must sum to the total duration.\n */\n multiPrompt?: Array<{\n index: number;\n prompt: string;\n duration: string;\n }> | null;\n\n // --- v3.0 element control (I2V and Motion Control) ---\n\n /**\n * Reference elements for element control (Kling v3.0+).\n * Supports video character elements and multi-image elements.\n *\n * - I2V: Up to 3 reference elements. Cannot coexist with voiceList.\n * - Motion Control: Currently only 1 element supported.\n * When referencing an element, the generated video can only\n * refer to the orientation of the person in the video.\n */\n elementList?: Array<{\n element_id: number;\n }> | null;\n\n // --- v3.0 voice control (T2V and I2V) ---\n\n /**\n * Voice references for voice control (Kling v3.0+).\n * Up to 2 voice references. Referenced via `<<<voice_1>>>` template\n * syntax in the prompt.\n *\n * When voiceList is used and the prompt references voice IDs,\n * sound must be set to 'on'.\n * Cannot coexist with elementList on the I2V endpoint.\n */\n voiceList?: Array<{\n voice_id: string;\n }> | null;\n\n // --- Shared options ---\n\n /**\n * Whether to generate watermarked results simultaneously.\n */\n watermarkEnabled?: boolean | null;\n\n // --- Motion-control-specific options ---\n\n /**\n * URL of the reference video. The character actions in the generated video\n * are consistent with the reference video.\n *\n * Supports .mp4/.mov, max 100MB, side lengths 340px–3850px,\n * duration 3–30 seconds (depends on `characterOrientation`).\n */\n videoUrl?: string | null;\n\n /**\n * Orientation of the characters in the generated video.\n *\n * - `'image'`: Same orientation as the person in the image.\n * Reference video duration max 10 seconds.\n * - `'video'`: Same orientation as the person in the video.\n * Reference video duration max 30 seconds.\n */\n characterOrientation?: 'image' | 'video' | null;\n\n /**\n * Whether to keep the original sound of the reference video.\n * Default: `'yes'`.\n */\n keepOriginalSound?: 'yes' | 'no' | null;\n\n [key: string]: unknown; // For passthrough\n};\n\nconst klingaiVideoModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z\n .object({\n mode: z.enum(['std', 'pro']).nullish(),\n pollIntervalMs: z.number().positive().nullish(),\n pollTimeoutMs: z.number().positive().nullish(),\n // T2V and I2V\n negativePrompt: z.string().nullish(),\n sound: z.enum(['on', 'off']).nullish(),\n cfgScale: z.number().nullish(),\n cameraControl: z\n .object({\n type: z.enum([\n 'simple',\n 'down_back',\n 'forward_up',\n 'right_turn_forward',\n 'left_turn_forward',\n ]),\n config: z\n .object({\n horizontal: z.number().nullish(),\n vertical: z.number().nullish(),\n pan: z.number().nullish(),\n tilt: z.number().nullish(),\n roll: z.number().nullish(),\n zoom: z.number().nullish(),\n })\n .nullish(),\n })\n .nullish(),\n // v3.0 multi-shot\n multiShot: z.boolean().nullish(),\n shotType: z.enum(['customize', 'intelligence']).nullish(),\n multiPrompt: z\n .array(\n z.object({\n index: z.number(),\n prompt: z.string(),\n duration: z.string(),\n }),\n )\n .nullish(),\n // v3.0 element control (I2V)\n elementList: z\n .array(\n z.object({\n element_id: z.number(),\n }),\n )\n .nullish(),\n // v3.0 voice control\n voiceList: z\n .array(\n z.object({\n voice_id: z.string(),\n }),\n )\n .nullish(),\n // I2V-specific\n imageTail: z.string().nullish(),\n staticMask: z.string().nullish(),\n dynamicMasks: z\n .array(\n z.object({\n mask: z.string(),\n trajectories: z.array(z.object({ x: z.number(), y: z.number() })),\n }),\n )\n .nullish(),\n // Motion-control-specific\n videoUrl: z.string().nullish(),\n characterOrientation: z.enum(['image', 'video']).nullish(),\n keepOriginalSound: z.enum(['yes', 'no']).nullish(),\n watermarkEnabled: z.boolean().nullish(),\n })\n .passthrough(),\n ),\n);\n\n/**\n * Known provider option keys that are handled explicitly and should not be\n * passed through to the API body.\n */\nconst HANDLED_PROVIDER_OPTIONS = new Set([\n 'mode',\n 'pollIntervalMs',\n 'pollTimeoutMs',\n 'negativePrompt',\n 'sound',\n 'cfgScale',\n 'cameraControl',\n 'multiShot',\n 'shotType',\n 'multiPrompt',\n 'elementList',\n 'voiceList',\n 'imageTail',\n 'staticMask',\n 'dynamicMasks',\n 'videoUrl',\n 'characterOrientation',\n 'keepOriginalSound',\n 'watermarkEnabled',\n]);\n\ninterface KlingAIVideoModelConfig {\n provider: string;\n baseURL: string;\n headers?: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class KlingAIVideoModel implements Experimental_VideoModelV3 {\n readonly specificationVersion = 'v3';\n readonly maxVideosPerCall = 1;\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: KlingAIVideoModelId,\n private readonly config: KlingAIVideoModelConfig,\n ) {}\n\n async doGenerate(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<Experimental_VideoModelV3['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const warnings: SharedV3Warning[] = [];\n const mode = detectMode(this.modelId);\n\n const klingaiOptions = (await parseProviderOptions({\n provider: 'klingai',\n providerOptions: options.providerOptions,\n schema: klingaiVideoModelOptionsSchema,\n })) as KlingAIVideoModelOptions | undefined;\n\n const referenceImages = getReferenceImages(options);\n const effectiveMode: KlingAIVideoMode =\n mode === 'i2v' && referenceImages != null ? 'mi2v' : mode;\n\n let body: Record<string, unknown>;\n\n if (effectiveMode === 'motion-control') {\n body = this.buildMotionControlBody(options, klingaiOptions, warnings);\n } else if (effectiveMode === 't2v') {\n body = this.buildT2VBody(options, klingaiOptions, warnings);\n } else if (effectiveMode === 'mi2v') {\n body = this.buildMultiImageBody(\n options,\n klingaiOptions,\n referenceImages!,\n warnings,\n );\n } else {\n body = this.buildI2VBody(options, klingaiOptions, warnings);\n }\n\n if (referenceImages != null && effectiveMode !== 'mi2v') {\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details:\n 'KlingAI only supports inputReferences (reference-to-video) on ' +\n 'image-to-video models. The reference images were ignored.',\n });\n }\n\n // Warn about universally unsupported standard options\n if (options.resolution) {\n warnings.push({\n type: 'unsupported',\n feature: 'resolution',\n details: 'KlingAI video models do not support the resolution option.',\n });\n }\n\n if (options.seed) {\n warnings.push({\n type: 'unsupported',\n feature: 'seed',\n details:\n 'KlingAI video models do not support seed for deterministic generation.',\n });\n }\n\n if (options.fps) {\n warnings.push({\n type: 'unsupported',\n feature: 'fps',\n details: 'KlingAI video models do not support custom FPS.',\n });\n }\n\n if (options.n != null && options.n > 1) {\n warnings.push({\n type: 'unsupported',\n feature: 'n',\n details:\n 'KlingAI video models do not support generating multiple videos per call. ' +\n 'Only 1 video will be generated.',\n });\n }\n\n const endpointPath = modeEndpointMap[effectiveMode];\n\n // Step 1: Create the task\n const { value: createResponse, responseHeaders: createHeaders } =\n await postJsonToApi({\n url: `${this.config.baseURL}${endpointPath}`,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n body,\n successfulResponseHandler: createJsonResponseHandler(\n klingaiCreateTaskSchema,\n ),\n failedResponseHandler: klingaiFailedResponseHandler,\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const taskId = createResponse.data?.task_id;\n if (!taskId) {\n throw new AISDKError({\n name: 'KLINGAI_VIDEO_GENERATION_ERROR',\n message: `No task_id returned from KlingAI API. Response: ${JSON.stringify(createResponse)}`,\n });\n }\n\n // Step 2: Poll for task completion\n const pollIntervalMs = klingaiOptions?.pollIntervalMs ?? 5000; // 5 seconds\n const pollTimeoutMs = klingaiOptions?.pollTimeoutMs ?? 600000; // 10 minutes\n const startTime = Date.now();\n let finalResponse: KlingAITaskResponse | undefined;\n let responseHeaders: Record<string, string> | undefined = createHeaders;\n\n while (true) {\n await delay(pollIntervalMs, { abortSignal: options.abortSignal });\n\n if (Date.now() - startTime > pollTimeoutMs) {\n throw new AISDKError({\n name: 'KLINGAI_VIDEO_GENERATION_TIMEOUT',\n message: `Video generation timed out after ${pollTimeoutMs}ms`,\n });\n }\n\n const { value: statusResponse, responseHeaders: pollHeaders } =\n await getFromApi({\n url: `${this.config.baseURL}${endpointPath}/${taskId}`,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n successfulResponseHandler: createJsonResponseHandler(\n klingaiTaskStatusSchema,\n ),\n failedResponseHandler: klingaiFailedResponseHandler,\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n responseHeaders = pollHeaders;\n const taskStatus = statusResponse.data?.task_status;\n\n if (taskStatus === 'succeed') {\n finalResponse = statusResponse;\n break;\n }\n\n if (taskStatus === 'failed') {\n throw new AISDKError({\n name: 'KLINGAI_VIDEO_GENERATION_FAILED',\n message: `Video generation failed: ${statusResponse.data?.task_status_msg ?? 'Unknown error'}`,\n });\n }\n\n // Continue polling for 'submitted' and 'processing' statuses\n }\n\n if (!finalResponse?.data?.task_result?.videos?.length) {\n throw new AISDKError({\n name: 'KLINGAI_VIDEO_GENERATION_ERROR',\n message: `No videos in response. Response: ${JSON.stringify(finalResponse)}`,\n });\n }\n\n const videos: Array<{ type: 'url'; url: string; mediaType: string }> = [];\n const videoMetadata: Array<{\n id: string;\n url: string;\n watermarkUrl?: string;\n duration?: string;\n }> = [];\n\n for (const video of finalResponse.data.task_result.videos) {\n if (video.url) {\n videos.push({\n type: 'url',\n url: video.url,\n mediaType: 'video/mp4',\n });\n videoMetadata.push({\n id: video.id ?? '',\n url: video.url,\n ...(video.watermark_url ? { watermarkUrl: video.watermark_url } : {}),\n ...(video.duration ? { duration: video.duration } : {}),\n });\n }\n }\n\n if (videos.length === 0) {\n throw new AISDKError({\n name: 'KLINGAI_VIDEO_GENERATION_ERROR',\n message: 'No valid video URLs in response',\n });\n }\n\n return {\n videos,\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n providerMetadata: {\n klingai: {\n taskId,\n videos: videoMetadata,\n },\n },\n };\n }\n\n private buildT2VBody(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n klingaiOptions: KlingAIVideoModelOptions | undefined,\n warnings: SharedV3Warning[],\n ): Record<string, unknown> {\n const mode = 't2v' as const;\n const body: Record<string, unknown> = {\n model_name: getApiModelName(this.modelId, mode),\n };\n\n if (options.prompt != null) {\n body.prompt = options.prompt;\n }\n\n if (klingaiOptions?.negativePrompt != null) {\n body.negative_prompt = klingaiOptions.negativePrompt;\n }\n\n const sound =\n options.generateAudio != null\n ? options.generateAudio\n ? 'on'\n : 'off'\n : klingaiOptions?.sound;\n if (sound != null) {\n body.sound = sound;\n }\n\n if (klingaiOptions?.cfgScale != null) {\n body.cfg_scale = klingaiOptions.cfgScale;\n }\n\n if (klingaiOptions?.mode != null) {\n body.mode = klingaiOptions.mode;\n }\n\n if (klingaiOptions?.cameraControl != null) {\n body.camera_control = klingaiOptions.cameraControl;\n }\n\n // Map standard SDK aspectRatio (same format as KlingAI API)\n if (options.aspectRatio != null) {\n body.aspect_ratio = options.aspectRatio;\n }\n\n // Map standard SDK duration (number → string)\n if (options.duration != null) {\n body.duration = String(options.duration);\n }\n\n // v3.0 multi-shot\n if (klingaiOptions?.multiShot != null) {\n body.multi_shot = klingaiOptions.multiShot;\n }\n\n if (klingaiOptions?.shotType != null) {\n body.shot_type = klingaiOptions.shotType;\n }\n\n if (klingaiOptions?.multiPrompt != null) {\n body.multi_prompt = klingaiOptions.multiPrompt;\n }\n\n // v3.0 voice control\n if (klingaiOptions?.voiceList != null) {\n body.voice_list = klingaiOptions.voiceList;\n }\n\n if (klingaiOptions?.watermarkEnabled != null) {\n body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };\n }\n\n // Image is not supported for T2V\n if (resolveStartImage(options) != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'image',\n details:\n 'KlingAI text-to-video does not support image input. Use an image-to-video model instead.',\n });\n }\n\n this.addPassthroughOptions(body, klingaiOptions);\n\n return body;\n }\n\n private buildI2VBody(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n klingaiOptions: KlingAIVideoModelOptions | undefined,\n warnings: SharedV3Warning[],\n ): Record<string, unknown> {\n const mode = 'i2v' as const;\n const body: Record<string, unknown> = {\n model_name: getApiModelName(this.modelId, mode),\n };\n\n if (options.prompt != null) {\n body.prompt = options.prompt;\n }\n\n const startImage = resolveStartImage(options);\n if (startImage != null) {\n body.image = fileToImageString(startImage);\n }\n\n // End frame image: prefer top-level frameImages (last_frame), fall back to\n // providerOptions.klingai.imageTail.\n const imageTail = resolveImageTail(options, klingaiOptions);\n if (imageTail != null) {\n body.image_tail = imageTail;\n }\n\n if (klingaiOptions?.negativePrompt != null) {\n body.negative_prompt = klingaiOptions.negativePrompt;\n }\n\n const sound =\n options.generateAudio != null\n ? options.generateAudio\n ? 'on'\n : 'off'\n : klingaiOptions?.sound;\n if (sound != null) {\n body.sound = sound;\n }\n\n if (klingaiOptions?.cfgScale != null) {\n body.cfg_scale = klingaiOptions.cfgScale;\n }\n\n if (klingaiOptions?.mode != null) {\n body.mode = klingaiOptions.mode;\n }\n\n if (klingaiOptions?.cameraControl != null) {\n body.camera_control = klingaiOptions.cameraControl;\n }\n\n if (klingaiOptions?.staticMask != null) {\n body.static_mask = klingaiOptions.staticMask;\n }\n\n if (klingaiOptions?.dynamicMasks != null) {\n body.dynamic_masks = klingaiOptions.dynamicMasks;\n }\n\n // v3.0 multi-shot\n if (klingaiOptions?.multiShot != null) {\n body.multi_shot = klingaiOptions.multiShot;\n }\n\n if (klingaiOptions?.shotType != null) {\n body.shot_type = klingaiOptions.shotType;\n }\n\n if (klingaiOptions?.multiPrompt != null) {\n body.multi_prompt = klingaiOptions.multiPrompt;\n }\n\n // v3.0 element control (I2V only)\n if (klingaiOptions?.elementList != null) {\n body.element_list = klingaiOptions.elementList;\n }\n\n // v3.0 voice control\n if (klingaiOptions?.voiceList != null) {\n body.voice_list = klingaiOptions.voiceList;\n }\n\n if (klingaiOptions?.watermarkEnabled != null) {\n body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };\n }\n\n // Map standard SDK duration (number → string)\n if (options.duration != null) {\n body.duration = String(options.duration);\n }\n\n // aspectRatio is not supported for I2V (determined by input image)\n if (options.aspectRatio != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details:\n 'KlingAI image-to-video does not support aspectRatio. ' +\n 'The output dimensions are determined by the input image.',\n });\n }\n\n this.addPassthroughOptions(body, klingaiOptions);\n\n return body;\n }\n\n private buildMultiImageBody(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n klingaiOptions: KlingAIVideoModelOptions | undefined,\n referenceImages: Array<Experimental_VideoModelV3File>,\n warnings: SharedV3Warning[],\n ): Record<string, unknown> {\n const body: Record<string, unknown> = {\n model_name: getApiModelName(this.modelId, 'mi2v'),\n image_list: referenceImages.map(image => ({\n image: fileToImageString(image),\n })),\n };\n\n if (options.prompt != null) {\n body.prompt = options.prompt;\n }\n\n if (klingaiOptions?.negativePrompt != null) {\n body.negative_prompt = klingaiOptions.negativePrompt;\n }\n\n if (klingaiOptions?.cfgScale != null) {\n body.cfg_scale = klingaiOptions.cfgScale;\n }\n\n if (klingaiOptions?.mode != null) {\n body.mode = klingaiOptions.mode;\n }\n\n if (options.aspectRatio != null) {\n body.aspect_ratio = options.aspectRatio;\n }\n\n if (options.duration != null) {\n body.duration = String(options.duration);\n }\n\n if (klingaiOptions?.watermarkEnabled != null) {\n body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };\n }\n\n if (resolveStartImage(options) != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'frameImages',\n details:\n 'KlingAI reference-to-video does not support a separate start frame. ' +\n 'Provide all guidance images via inputReferences instead.',\n });\n }\n\n if (resolveImageTail(options, klingaiOptions) != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'frameImages',\n details:\n 'KlingAI reference-to-video does not support a last frame (image_tail). ' +\n 'Provide all guidance images via inputReferences instead.',\n });\n }\n\n this.addPassthroughOptions(body, klingaiOptions);\n\n return body;\n }\n\n private buildMotionControlBody(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n klingaiOptions: KlingAIVideoModelOptions | undefined,\n warnings: SharedV3Warning[],\n ): Record<string, unknown> {\n if (\n !klingaiOptions?.videoUrl ||\n !klingaiOptions?.characterOrientation ||\n !klingaiOptions?.mode\n ) {\n throw new AISDKError({\n name: 'KLINGAI_VIDEO_MISSING_OPTIONS',\n message:\n 'KlingAI Motion Control requires providerOptions.klingai with videoUrl, characterOrientation, and mode.',\n });\n }\n\n const mode = 'motion-control' as const;\n const body: Record<string, unknown> = {\n model_name: getApiModelName(this.modelId, mode),\n video_url: klingaiOptions.videoUrl,\n character_orientation: klingaiOptions.characterOrientation,\n mode: klingaiOptions.mode,\n };\n\n if (options.prompt != null) {\n body.prompt = options.prompt;\n }\n\n const startImage = resolveStartImage(options);\n if (startImage != null) {\n body.image_url = fileToImageString(startImage);\n }\n\n if (klingaiOptions.keepOriginalSound != null) {\n body.keep_original_sound = klingaiOptions.keepOriginalSound;\n }\n\n if (klingaiOptions.watermarkEnabled != null) {\n body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };\n }\n\n // v3.0 element control\n if (klingaiOptions.elementList != null) {\n body.element_list = klingaiOptions.elementList;\n }\n\n // Warn about unsupported standard options for motion control\n if (options.aspectRatio) {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details:\n 'KlingAI Motion Control does not support aspectRatio. ' +\n 'The output dimensions are determined by the reference image/video.',\n });\n }\n\n if (options.duration) {\n warnings.push({\n type: 'unsupported',\n feature: 'duration',\n details:\n 'KlingAI Motion Control does not support custom duration. ' +\n 'The output duration matches the reference video duration.',\n });\n }\n\n this.addPassthroughOptions(body, klingaiOptions);\n\n return body;\n }\n\n private addPassthroughOptions(\n body: Record<string, unknown>,\n klingaiOptions: KlingAIVideoModelOptions | undefined,\n ): void {\n if (!klingaiOptions) return;\n for (const [key, value] of Object.entries(klingaiOptions)) {\n if (!HANDLED_PROVIDER_OPTIONS.has(key)) {\n body[key] = value;\n }\n }\n }\n}\n\n// Response schema for task creation (POST)\nconst klingaiCreateTaskSchema = z.object({\n code: z.number(),\n message: z.string(),\n request_id: z.string().nullish(),\n data: z\n .object({\n task_id: z.string(),\n task_status: z.string().nullish(),\n task_info: z\n .object({\n external_task_id: z.string().nullish(),\n })\n .nullish(),\n created_at: z.number().nullish(),\n updated_at: z.number().nullish(),\n })\n .nullish(),\n});\n\n// Response schema for task status query (GET)\nconst klingaiTaskStatusSchema = z.object({\n code: z.number(),\n message: z.string(),\n request_id: z.string().nullish(),\n data: z\n .object({\n task_id: z.string(),\n task_status: z.string(),\n task_status_msg: z.string().nullish(),\n task_info: z\n .object({\n external_task_id: z.string().nullish(),\n })\n .nullish(),\n watermark_info: z\n .object({\n enabled: z.boolean().nullish(),\n })\n .nullish(),\n final_unit_deduction: z.string().nullish(),\n created_at: z.number().nullish(),\n updated_at: z.number().nullish(),\n task_result: z\n .object({\n videos: z\n .array(\n z.object({\n id: z.string().nullish(),\n url: z.string().nullish(),\n watermark_url: z.string().nullish(),\n duration: z.string().nullish(),\n }),\n )\n .nullish(),\n })\n .nullish(),\n })\n .nullish(),\n});\n\ntype KlingAITaskResponse = z.infer<typeof klingaiTaskStatusSchema>;\n","import { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport const klingaiErrorDataSchema = z.object({\n code: z.number(),\n message: z.string(),\n});\n\nexport type KlingAIErrorData = z.infer<typeof klingaiErrorDataSchema>;\n\nexport const klingaiFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: klingaiErrorDataSchema,\n errorToMessage: data => data.message,\n});\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["NoSuchModelError","z","z","NoSuchModelError"]}
|
|
1
|
+
{"version":3,"sources":["../src/klingai-provider.ts","../src/klingai-auth.ts","../src/klingai-video-model.ts","../src/klingai-error.ts","../src/version.ts"],"sourcesContent":["import {\n type Experimental_VideoModelV3 as VideoModelV3,\n type ProviderV3,\n NoSuchModelError,\n} from '@ai-sdk/provider';\nimport {\n type FetchFunction,\n withoutTrailingSlash,\n withUserAgentSuffix,\n} from '@ai-sdk/provider-utils';\nimport { generateKlingAIAuthToken } from './klingai-auth';\nimport { KlingAIVideoModel } from './klingai-video-model';\nimport type { KlingAIVideoModelId } from './klingai-video-settings';\nimport { VERSION } from './version';\n\nexport interface KlingAIProviderSettings {\n /**\n * KlingAI Access key. Default value is taken from the `KLINGAI_ACCESS_KEY`\n * environment variable.\n */\n accessKey?: string;\n /**\n * KlingAI Secret key. Default value is taken from the `KLINGAI_SECRET_KEY`\n * environment variable.\n */\n secretKey?: string;\n /**\n * Base URL for the API calls.\n */\n baseURL?: string;\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept\n * requests, or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport interface KlingAIProvider extends ProviderV3 {\n /**\n * Creates a model for video generation.\n */\n video(modelId: KlingAIVideoModelId): VideoModelV3;\n\n /**\n * Creates a model for video generation.\n */\n videoModel(modelId: KlingAIVideoModelId): VideoModelV3;\n}\n\nconst defaultBaseURL = 'https://api-singapore.klingai.com';\n\n/**\n * Create a KlingAI provider instance.\n */\nexport function createKlingAI(\n options: KlingAIProviderSettings = {},\n): KlingAIProvider {\n const baseURL =\n withoutTrailingSlash(options.baseURL ?? defaultBaseURL) ?? defaultBaseURL;\n\n const getHeaders = async () => {\n const token = await generateKlingAIAuthToken({\n accessKey: options.accessKey,\n secretKey: options.secretKey,\n });\n\n return withUserAgentSuffix(\n {\n Authorization: `Bearer ${token}`,\n ...options.headers,\n },\n `ai-sdk/klingai/${VERSION}`,\n );\n };\n\n const createVideoModel = (modelId: KlingAIVideoModelId): VideoModelV3 =>\n new KlingAIVideoModel(modelId, {\n provider: 'klingai.video',\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const noSuchModel = (\n modelId: string,\n modelType:\n | 'languageModel'\n | 'embeddingModel'\n | 'imageModel'\n | 'transcriptionModel'\n | 'speechModel'\n | 'rerankingModel',\n ): never => {\n throw new NoSuchModelError({ modelId, modelType });\n };\n\n const provider: KlingAIProvider = {\n specificationVersion: 'v3' as const,\n video: createVideoModel,\n videoModel: createVideoModel,\n languageModel: (modelId: string) => noSuchModel(modelId, 'languageModel'),\n embeddingModel: (modelId: string) => noSuchModel(modelId, 'embeddingModel'),\n imageModel: (modelId: string) => noSuchModel(modelId, 'imageModel'),\n };\n\n return provider;\n}\n\n/**\n * Default KlingAI provider instance.\n */\nexport const klingai = createKlingAI();\n","import { loadSetting } from '@ai-sdk/provider-utils';\n\n/**\n * Encode a string to base64url format (URL-safe base64 without padding).\n */\nconst base64url = (str: string) =>\n btoa(str).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n\n/**\n * Generate a JWT authentication token for KlingAI API access.\n *\n * Uses HS256 (HMAC-SHA256) signing via the Web Crypto API — no external\n * dependencies required. Compatible with Node.js, Edge, and browser runtimes.\n *\n * @see https://app.klingai.com/global/dev/document-api/quickStart/userManual\n * @see https://app.klingai.com/global/dev/document-api/apiReference/commonInfo\n */\nexport async function generateKlingAIAuthToken({\n accessKey,\n secretKey,\n}: {\n accessKey?: string;\n secretKey?: string;\n}): Promise<string> {\n const ak = loadSetting({\n settingValue: accessKey,\n settingName: 'accessKey',\n environmentVariableName: 'KLINGAI_ACCESS_KEY',\n description: 'KlingAI access key',\n });\n\n const sk = loadSetting({\n settingValue: secretKey,\n settingName: 'secretKey',\n environmentVariableName: 'KLINGAI_SECRET_KEY',\n description: 'KlingAI secret key',\n });\n\n const now = Math.floor(Date.now() / 1000);\n\n const header = { alg: 'HS256', typ: 'JWT' };\n const payload = {\n iss: ak,\n exp: now + 1800, // Valid for 30 minutes\n nbf: now - 5, // Valid 5 seconds before current time\n };\n\n const encoder = new TextEncoder();\n\n // Import the secret key for HMAC-SHA256 signing\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(sk),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n\n const signingInput = `${base64url(JSON.stringify(header))}.${base64url(\n JSON.stringify(payload),\n )}`;\n\n const signature = await crypto.subtle.sign(\n 'HMAC',\n key,\n encoder.encode(signingInput),\n );\n\n const signatureBytes = new Uint8Array(signature);\n const signatureBase64 = base64url(\n String.fromCharCode.apply(null, Array.from(signatureBytes)),\n );\n\n return `${signingInput}.${signatureBase64}`;\n}\n","import {\n AISDKError,\n type Experimental_VideoModelV3,\n type Experimental_VideoModelV3File,\n NoSuchModelError,\n type SharedV3Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertUint8ArrayToBase64,\n createJsonResponseHandler,\n delay,\n type FetchFunction,\n getFromApi,\n lazySchema,\n parseProviderOptions,\n postJsonToApi,\n type Resolvable,\n resolve,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { klingaiFailedResponseHandler } from './klingai-error';\nimport type { KlingAIVideoModelId } from './klingai-video-settings';\n\ntype KlingAIVideoMode = 't2v' | 'i2v' | 'mi2v' | 'motion-control';\n\nfunction fileToImageString(file: Experimental_VideoModelV3File): string {\n if (file.type === 'url') {\n return file.url;\n }\n return typeof file.data === 'string'\n ? file.data\n : convertUint8ArrayToBase64(file.data);\n}\n\nfunction getTopLevelMediaType(mediaType: string): string {\n const slashIndex = mediaType.indexOf('/');\n return slashIndex === -1 ? mediaType : mediaType.substring(0, slashIndex);\n}\n\n/**\n * KlingAI does not support video reference inputs. This detects whether a file\n * is a video so it can be guarded against and excluded.\n */\nconst isVideoFile = (file: Experimental_VideoModelV3File): boolean =>\n file.mediaType != null && getTopLevelMediaType(file.mediaType) === 'video';\n\nfunction getReferenceImages(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n warnings: SharedV3Warning[],\n): Array<Experimental_VideoModelV3File> | undefined {\n if (options.frameImages != null && options.frameImages.length > 0) {\n return undefined;\n }\n\n if (options.inputReferences == null || options.inputReferences.length === 0) {\n return undefined;\n }\n\n const imageReferences = options.inputReferences.filter(reference => {\n if (isVideoFile(reference)) {\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details:\n 'KlingAI does not support video reference inputs; the video ' +\n 'reference was ignored.',\n });\n return false;\n }\n return true;\n });\n\n return imageReferences.length > 0 ? imageReferences : undefined;\n}\n\nfunction getFirstFrameImage(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n): Experimental_VideoModelV3File | undefined {\n return options.frameImages?.find(frame => frame.frameType === 'first_frame')\n ?.image;\n}\n\nfunction resolveStartImage(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n warnings: SharedV3Warning[],\n): Experimental_VideoModelV3File | undefined {\n const startImage = getFirstFrameImage(options) ?? options.image;\n\n if (startImage != null && isVideoFile(startImage)) {\n warnings.push({\n type: 'unsupported',\n feature: 'frameImages',\n details:\n 'KlingAI does not accept video as a frame image; it was ignored.',\n });\n return undefined;\n }\n\n return startImage;\n}\n\nfunction resolveImageTail(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n klingaiOptions: KlingAIVideoModelOptions | undefined,\n warnings: SharedV3Warning[],\n): string | undefined {\n const lastFrame = options.frameImages?.find(\n frame => frame.frameType === 'last_frame',\n )?.image;\n\n if (lastFrame != null) {\n if (isVideoFile(lastFrame)) {\n warnings.push({\n type: 'unsupported',\n feature: 'frameImages',\n details:\n 'KlingAI does not accept video as a frame image; it was ignored.',\n });\n return undefined;\n }\n return fileToImageString(lastFrame);\n }\n\n return klingaiOptions?.imageTail ?? undefined;\n}\n\n/**\n * Detects the video generation mode from the model ID suffix.\n */\nfunction detectMode(modelId: string): KlingAIVideoMode {\n if (modelId.endsWith('-t2v')) return 't2v';\n if (modelId.endsWith('-i2v')) return 'i2v';\n if (modelId.endsWith('-motion-control')) return 'motion-control';\n throw new NoSuchModelError({ modelId, modelType: 'videoModel' });\n}\n\n/**\n * Maps video generation mode to the KlingAI API endpoint path.\n */\nconst modeEndpointMap: Record<KlingAIVideoMode, string> = {\n t2v: '/v1/videos/text2video',\n i2v: '/v1/videos/image2video',\n mi2v: '/v1/videos/multi-image2video',\n 'motion-control': '/v1/videos/motion-control',\n};\n\n/**\n * Derives the KlingAI API `model_name` from the SDK model ID.\n * Strips the mode suffix and converts dots to hyphens.\n *\n * Examples:\n * - 'kling-v2.6-t2v' → 'kling-v2-6'\n * - 'kling-v2.1-master-i2v' → 'kling-v2-1-master'\n * - 'kling-v1-t2v' → 'kling-v1'\n * - 'kling-v3.0-t2v' → 'kling-v3'\n */\nfunction getApiModelName(modelId: string, mode: KlingAIVideoMode): string {\n const suffix =\n mode === 'motion-control'\n ? '-motion-control'\n : mode === 'mi2v'\n ? '-i2v'\n : `-${mode}`;\n const baseName = modelId.slice(0, -suffix.length);\n return baseName.replace(/\\.0$/, '').replace(/\\./g, '-');\n}\n\n/**\n * Provider-specific options for KlingAI video generation.\n *\n * Not all options are supported by every model version and video mode (T2V, I2V,\n * motion control). See the KlingAI capability map for detailed compatibility:\n * https://app.klingai.com/global/dev/document-api/apiReference/model/skillsMap\n */\nexport type KlingAIVideoModelOptions = {\n /**\n * Video generation mode.\n *\n * - `'std'`: Standard mode — cost-effective.\n * - `'pro'`: Professional mode — higher quality but longer generation time.\n */\n mode?: 'std' | 'pro' | null;\n\n /**\n * Polling interval in milliseconds for checking task status.\n * Default: 5000 (5 seconds).\n */\n pollIntervalMs?: number | null;\n\n /**\n * Maximum time in milliseconds to wait for video generation.\n * Default: 600000 (10 minutes).\n */\n pollTimeoutMs?: number | null;\n\n // --- T2V and I2V options ---\n\n /**\n * Negative text prompt to specify what to avoid.\n * Cannot exceed 2500 characters.\n */\n negativePrompt?: string | null;\n\n /**\n * Whether to generate sound simultaneously when generating videos.\n * Only V2.6 and subsequent versions support this parameter,\n * and requires `mode: 'pro'`.\n */\n sound?: 'on' | 'off' | null;\n\n /**\n * Flexibility in video generation. The higher the value, the lower the\n * model's flexibility, and the stronger the relevance to the user's prompt.\n * Value range: [0, 1]. Kling-v2.x models do not support this parameter.\n */\n cfgScale?: number | null;\n\n /**\n * Camera movement control. If not specified, the model will intelligently\n * match based on the input text/images.\n */\n cameraControl?: {\n type:\n | 'simple'\n | 'down_back'\n | 'forward_up'\n | 'right_turn_forward'\n | 'left_turn_forward';\n config?: {\n horizontal?: number | null;\n vertical?: number | null;\n pan?: number | null;\n tilt?: number | null;\n roll?: number | null;\n zoom?: number | null;\n } | null;\n } | null;\n\n // --- I2V-specific options ---\n\n /**\n * End frame image for I2V start+end frame control.\n * Supports image URL or raw base64-encoded image data.\n * Requires `mode: 'pro'` for most models.\n */\n imageTail?: string | null;\n\n /**\n * Static brush mask image for I2V motion brush.\n * Supports image URL or raw base64-encoded image data.\n */\n staticMask?: string | null;\n\n /**\n * Dynamic brush configurations for I2V motion brush.\n * Up to 6 groups, each with a mask and motion trajectories.\n */\n dynamicMasks?: Array<{\n mask: string;\n trajectories: Array<{ x: number; y: number }>;\n }> | null;\n\n // --- v3.0 multi-shot options (T2V and I2V) ---\n\n /**\n * Enable multi-shot video generation (Kling v3.0+).\n * When true, the video is split into up to 6 storyboard shots\n * with individual prompts and durations.\n *\n * When multiShot is true with shotType 'customize', multiPrompt is required.\n * When multiShot is true, the main prompt parameter is ignored by the API.\n */\n multiShot?: boolean | null;\n\n /**\n * Storyboard method for multi-shot video generation (Kling v3.0+).\n * Required when multiShot is true.\n *\n * - `'customize'`: User-defined shots via multiPrompt.\n * - `'intelligence'`: Model auto-segments based on the main prompt.\n */\n shotType?: 'customize' | 'intelligence' | null;\n\n /**\n * Per-shot details for multi-shot video generation (Kling v3.0+).\n * Required when multiShot is true and shotType is 'customize'.\n *\n * Up to 6 shots. Each shot has an index, prompt (max 512 chars),\n * and duration in seconds. Shot durations must sum to the total duration.\n */\n multiPrompt?: Array<{\n index: number;\n prompt: string;\n duration: string;\n }> | null;\n\n // --- v3.0 element control (I2V and Motion Control) ---\n\n /**\n * Reference elements for element control (Kling v3.0+).\n * Supports video character elements and multi-image elements.\n *\n * - I2V: Up to 3 reference elements. Cannot coexist with voiceList.\n * - Motion Control: Currently only 1 element supported.\n * When referencing an element, the generated video can only\n * refer to the orientation of the person in the video.\n */\n elementList?: Array<{\n element_id: number;\n }> | null;\n\n // --- v3.0 voice control (T2V and I2V) ---\n\n /**\n * Voice references for voice control (Kling v3.0+).\n * Up to 2 voice references. Referenced via `<<<voice_1>>>` template\n * syntax in the prompt.\n *\n * When voiceList is used and the prompt references voice IDs,\n * sound must be set to 'on'.\n * Cannot coexist with elementList on the I2V endpoint.\n */\n voiceList?: Array<{\n voice_id: string;\n }> | null;\n\n // --- Shared options ---\n\n /**\n * Whether to generate watermarked results simultaneously.\n */\n watermarkEnabled?: boolean | null;\n\n // --- Motion-control-specific options ---\n\n /**\n * URL of the reference video. The character actions in the generated video\n * are consistent with the reference video.\n *\n * Supports .mp4/.mov, max 100MB, side lengths 340px–3850px,\n * duration 3–30 seconds (depends on `characterOrientation`).\n */\n videoUrl?: string | null;\n\n /**\n * Orientation of the characters in the generated video.\n *\n * - `'image'`: Same orientation as the person in the image.\n * Reference video duration max 10 seconds.\n * - `'video'`: Same orientation as the person in the video.\n * Reference video duration max 30 seconds.\n */\n characterOrientation?: 'image' | 'video' | null;\n\n /**\n * Whether to keep the original sound of the reference video.\n * Default: `'yes'`.\n */\n keepOriginalSound?: 'yes' | 'no' | null;\n\n [key: string]: unknown; // For passthrough\n};\n\nconst klingaiVideoModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z\n .object({\n mode: z.enum(['std', 'pro']).nullish(),\n pollIntervalMs: z.number().positive().nullish(),\n pollTimeoutMs: z.number().positive().nullish(),\n // T2V and I2V\n negativePrompt: z.string().nullish(),\n sound: z.enum(['on', 'off']).nullish(),\n cfgScale: z.number().nullish(),\n cameraControl: z\n .object({\n type: z.enum([\n 'simple',\n 'down_back',\n 'forward_up',\n 'right_turn_forward',\n 'left_turn_forward',\n ]),\n config: z\n .object({\n horizontal: z.number().nullish(),\n vertical: z.number().nullish(),\n pan: z.number().nullish(),\n tilt: z.number().nullish(),\n roll: z.number().nullish(),\n zoom: z.number().nullish(),\n })\n .nullish(),\n })\n .nullish(),\n // v3.0 multi-shot\n multiShot: z.boolean().nullish(),\n shotType: z.enum(['customize', 'intelligence']).nullish(),\n multiPrompt: z\n .array(\n z.object({\n index: z.number(),\n prompt: z.string(),\n duration: z.string(),\n }),\n )\n .nullish(),\n // v3.0 element control (I2V)\n elementList: z\n .array(\n z.object({\n element_id: z.number(),\n }),\n )\n .nullish(),\n // v3.0 voice control\n voiceList: z\n .array(\n z.object({\n voice_id: z.string(),\n }),\n )\n .nullish(),\n // I2V-specific\n imageTail: z.string().nullish(),\n staticMask: z.string().nullish(),\n dynamicMasks: z\n .array(\n z.object({\n mask: z.string(),\n trajectories: z.array(z.object({ x: z.number(), y: z.number() })),\n }),\n )\n .nullish(),\n // Motion-control-specific\n videoUrl: z.string().nullish(),\n characterOrientation: z.enum(['image', 'video']).nullish(),\n keepOriginalSound: z.enum(['yes', 'no']).nullish(),\n watermarkEnabled: z.boolean().nullish(),\n })\n .passthrough(),\n ),\n);\n\n/**\n * Known provider option keys that are handled explicitly and should not be\n * passed through to the API body.\n */\nconst HANDLED_PROVIDER_OPTIONS = new Set([\n 'mode',\n 'pollIntervalMs',\n 'pollTimeoutMs',\n 'negativePrompt',\n 'sound',\n 'cfgScale',\n 'cameraControl',\n 'multiShot',\n 'shotType',\n 'multiPrompt',\n 'elementList',\n 'voiceList',\n 'imageTail',\n 'staticMask',\n 'dynamicMasks',\n 'videoUrl',\n 'characterOrientation',\n 'keepOriginalSound',\n 'watermarkEnabled',\n]);\n\ninterface KlingAIVideoModelConfig {\n provider: string;\n baseURL: string;\n headers?: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class KlingAIVideoModel implements Experimental_VideoModelV3 {\n readonly specificationVersion = 'v3';\n readonly maxVideosPerCall = 1;\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: KlingAIVideoModelId,\n private readonly config: KlingAIVideoModelConfig,\n ) {}\n\n async doGenerate(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<Experimental_VideoModelV3['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const warnings: SharedV3Warning[] = [];\n const mode = detectMode(this.modelId);\n\n const klingaiOptions = (await parseProviderOptions({\n provider: 'klingai',\n providerOptions: options.providerOptions,\n schema: klingaiVideoModelOptionsSchema,\n })) as KlingAIVideoModelOptions | undefined;\n\n const referenceImages = getReferenceImages(options, warnings);\n const effectiveMode: KlingAIVideoMode =\n mode === 'i2v' && referenceImages != null ? 'mi2v' : mode;\n\n let body: Record<string, unknown>;\n\n if (effectiveMode === 'motion-control') {\n body = this.buildMotionControlBody(options, klingaiOptions, warnings);\n } else if (effectiveMode === 't2v') {\n body = this.buildT2VBody(options, klingaiOptions, warnings);\n } else if (effectiveMode === 'mi2v') {\n body = this.buildMultiImageBody(\n options,\n klingaiOptions,\n referenceImages!,\n warnings,\n );\n } else {\n body = this.buildI2VBody(options, klingaiOptions, warnings);\n }\n\n if (referenceImages != null && effectiveMode !== 'mi2v') {\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details:\n 'KlingAI only supports inputReferences (reference-to-video) on ' +\n 'image-to-video models. The reference images were ignored.',\n });\n }\n\n // Warn about universally unsupported standard options\n if (options.resolution) {\n warnings.push({\n type: 'unsupported',\n feature: 'resolution',\n details: 'KlingAI video models do not support the resolution option.',\n });\n }\n\n if (options.seed) {\n warnings.push({\n type: 'unsupported',\n feature: 'seed',\n details:\n 'KlingAI video models do not support seed for deterministic generation.',\n });\n }\n\n if (options.fps) {\n warnings.push({\n type: 'unsupported',\n feature: 'fps',\n details: 'KlingAI video models do not support custom FPS.',\n });\n }\n\n if (options.n != null && options.n > 1) {\n warnings.push({\n type: 'unsupported',\n feature: 'n',\n details:\n 'KlingAI video models do not support generating multiple videos per call. ' +\n 'Only 1 video will be generated.',\n });\n }\n\n const endpointPath = modeEndpointMap[effectiveMode];\n\n // Step 1: Create the task\n const { value: createResponse, responseHeaders: createHeaders } =\n await postJsonToApi({\n url: `${this.config.baseURL}${endpointPath}`,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n body,\n successfulResponseHandler: createJsonResponseHandler(\n klingaiCreateTaskSchema,\n ),\n failedResponseHandler: klingaiFailedResponseHandler,\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const taskId = createResponse.data?.task_id;\n if (!taskId) {\n throw new AISDKError({\n name: 'KLINGAI_VIDEO_GENERATION_ERROR',\n message: `No task_id returned from KlingAI API. Response: ${JSON.stringify(createResponse)}`,\n });\n }\n\n // Step 2: Poll for task completion\n const pollIntervalMs = klingaiOptions?.pollIntervalMs ?? 5000; // 5 seconds\n const pollTimeoutMs = klingaiOptions?.pollTimeoutMs ?? 600000; // 10 minutes\n const startTime = Date.now();\n let finalResponse: KlingAITaskResponse | undefined;\n let responseHeaders: Record<string, string> | undefined = createHeaders;\n\n while (true) {\n await delay(pollIntervalMs, { abortSignal: options.abortSignal });\n\n if (Date.now() - startTime > pollTimeoutMs) {\n throw new AISDKError({\n name: 'KLINGAI_VIDEO_GENERATION_TIMEOUT',\n message: `Video generation timed out after ${pollTimeoutMs}ms`,\n });\n }\n\n const { value: statusResponse, responseHeaders: pollHeaders } =\n await getFromApi({\n url: `${this.config.baseURL}${endpointPath}/${taskId}`,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n successfulResponseHandler: createJsonResponseHandler(\n klingaiTaskStatusSchema,\n ),\n failedResponseHandler: klingaiFailedResponseHandler,\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n responseHeaders = pollHeaders;\n const taskStatus = statusResponse.data?.task_status;\n\n if (taskStatus === 'succeed') {\n finalResponse = statusResponse;\n break;\n }\n\n if (taskStatus === 'failed') {\n throw new AISDKError({\n name: 'KLINGAI_VIDEO_GENERATION_FAILED',\n message: `Video generation failed: ${statusResponse.data?.task_status_msg ?? 'Unknown error'}`,\n });\n }\n\n // Continue polling for 'submitted' and 'processing' statuses\n }\n\n if (!finalResponse?.data?.task_result?.videos?.length) {\n throw new AISDKError({\n name: 'KLINGAI_VIDEO_GENERATION_ERROR',\n message: `No videos in response. Response: ${JSON.stringify(finalResponse)}`,\n });\n }\n\n const videos: Array<{ type: 'url'; url: string; mediaType: string }> = [];\n const videoMetadata: Array<{\n id: string;\n url: string;\n watermarkUrl?: string;\n duration?: string;\n }> = [];\n\n for (const video of finalResponse.data.task_result.videos) {\n if (video.url) {\n videos.push({\n type: 'url',\n url: video.url,\n mediaType: 'video/mp4',\n });\n videoMetadata.push({\n id: video.id ?? '',\n url: video.url,\n ...(video.watermark_url ? { watermarkUrl: video.watermark_url } : {}),\n ...(video.duration ? { duration: video.duration } : {}),\n });\n }\n }\n\n if (videos.length === 0) {\n throw new AISDKError({\n name: 'KLINGAI_VIDEO_GENERATION_ERROR',\n message: 'No valid video URLs in response',\n });\n }\n\n return {\n videos,\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n providerMetadata: {\n klingai: {\n taskId,\n videos: videoMetadata,\n },\n },\n };\n }\n\n private buildT2VBody(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n klingaiOptions: KlingAIVideoModelOptions | undefined,\n warnings: SharedV3Warning[],\n ): Record<string, unknown> {\n const mode = 't2v' as const;\n const body: Record<string, unknown> = {\n model_name: getApiModelName(this.modelId, mode),\n };\n\n if (options.prompt != null) {\n body.prompt = options.prompt;\n }\n\n if (klingaiOptions?.negativePrompt != null) {\n body.negative_prompt = klingaiOptions.negativePrompt;\n }\n\n const sound =\n options.generateAudio != null\n ? options.generateAudio\n ? 'on'\n : 'off'\n : klingaiOptions?.sound;\n if (sound != null) {\n body.sound = sound;\n }\n\n if (klingaiOptions?.cfgScale != null) {\n body.cfg_scale = klingaiOptions.cfgScale;\n }\n\n if (klingaiOptions?.mode != null) {\n body.mode = klingaiOptions.mode;\n }\n\n if (klingaiOptions?.cameraControl != null) {\n body.camera_control = klingaiOptions.cameraControl;\n }\n\n // Map standard SDK aspectRatio (same format as KlingAI API)\n if (options.aspectRatio != null) {\n body.aspect_ratio = options.aspectRatio;\n }\n\n // Map standard SDK duration (number → string)\n if (options.duration != null) {\n body.duration = String(options.duration);\n }\n\n // v3.0 multi-shot\n if (klingaiOptions?.multiShot != null) {\n body.multi_shot = klingaiOptions.multiShot;\n }\n\n if (klingaiOptions?.shotType != null) {\n body.shot_type = klingaiOptions.shotType;\n }\n\n if (klingaiOptions?.multiPrompt != null) {\n body.multi_prompt = klingaiOptions.multiPrompt;\n }\n\n // v3.0 voice control\n if (klingaiOptions?.voiceList != null) {\n body.voice_list = klingaiOptions.voiceList;\n }\n\n if (klingaiOptions?.watermarkEnabled != null) {\n body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };\n }\n\n // Image is not supported for T2V\n if (resolveStartImage(options, warnings) != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'image',\n details:\n 'KlingAI text-to-video does not support image input. Use an image-to-video model instead.',\n });\n }\n\n this.addPassthroughOptions(body, klingaiOptions);\n\n return body;\n }\n\n private buildI2VBody(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n klingaiOptions: KlingAIVideoModelOptions | undefined,\n warnings: SharedV3Warning[],\n ): Record<string, unknown> {\n const mode = 'i2v' as const;\n const body: Record<string, unknown> = {\n model_name: getApiModelName(this.modelId, mode),\n };\n\n if (options.prompt != null) {\n body.prompt = options.prompt;\n }\n\n const startImage = resolveStartImage(options, warnings);\n if (startImage != null) {\n body.image = fileToImageString(startImage);\n }\n\n // End frame image: prefer top-level frameImages (last_frame), fall back to\n // providerOptions.klingai.imageTail.\n const imageTail = resolveImageTail(options, klingaiOptions, warnings);\n if (imageTail != null) {\n body.image_tail = imageTail;\n }\n\n if (klingaiOptions?.negativePrompt != null) {\n body.negative_prompt = klingaiOptions.negativePrompt;\n }\n\n const sound =\n options.generateAudio != null\n ? options.generateAudio\n ? 'on'\n : 'off'\n : klingaiOptions?.sound;\n if (sound != null) {\n body.sound = sound;\n }\n\n if (klingaiOptions?.cfgScale != null) {\n body.cfg_scale = klingaiOptions.cfgScale;\n }\n\n if (klingaiOptions?.mode != null) {\n body.mode = klingaiOptions.mode;\n }\n\n if (klingaiOptions?.cameraControl != null) {\n body.camera_control = klingaiOptions.cameraControl;\n }\n\n if (klingaiOptions?.staticMask != null) {\n body.static_mask = klingaiOptions.staticMask;\n }\n\n if (klingaiOptions?.dynamicMasks != null) {\n body.dynamic_masks = klingaiOptions.dynamicMasks;\n }\n\n // v3.0 multi-shot\n if (klingaiOptions?.multiShot != null) {\n body.multi_shot = klingaiOptions.multiShot;\n }\n\n if (klingaiOptions?.shotType != null) {\n body.shot_type = klingaiOptions.shotType;\n }\n\n if (klingaiOptions?.multiPrompt != null) {\n body.multi_prompt = klingaiOptions.multiPrompt;\n }\n\n // v3.0 element control (I2V only)\n if (klingaiOptions?.elementList != null) {\n body.element_list = klingaiOptions.elementList;\n }\n\n // v3.0 voice control\n if (klingaiOptions?.voiceList != null) {\n body.voice_list = klingaiOptions.voiceList;\n }\n\n if (klingaiOptions?.watermarkEnabled != null) {\n body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };\n }\n\n // Map standard SDK duration (number → string)\n if (options.duration != null) {\n body.duration = String(options.duration);\n }\n\n // aspectRatio is not supported for I2V (determined by input image)\n if (options.aspectRatio != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details:\n 'KlingAI image-to-video does not support aspectRatio. ' +\n 'The output dimensions are determined by the input image.',\n });\n }\n\n this.addPassthroughOptions(body, klingaiOptions);\n\n return body;\n }\n\n private buildMultiImageBody(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n klingaiOptions: KlingAIVideoModelOptions | undefined,\n referenceImages: Array<Experimental_VideoModelV3File>,\n warnings: SharedV3Warning[],\n ): Record<string, unknown> {\n const body: Record<string, unknown> = {\n model_name: getApiModelName(this.modelId, 'mi2v'),\n image_list: referenceImages.map(image => ({\n image: fileToImageString(image),\n })),\n };\n\n if (options.prompt != null) {\n body.prompt = options.prompt;\n }\n\n if (klingaiOptions?.negativePrompt != null) {\n body.negative_prompt = klingaiOptions.negativePrompt;\n }\n\n if (klingaiOptions?.cfgScale != null) {\n body.cfg_scale = klingaiOptions.cfgScale;\n }\n\n if (klingaiOptions?.mode != null) {\n body.mode = klingaiOptions.mode;\n }\n\n if (options.aspectRatio != null) {\n body.aspect_ratio = options.aspectRatio;\n }\n\n if (options.duration != null) {\n body.duration = String(options.duration);\n }\n\n if (klingaiOptions?.watermarkEnabled != null) {\n body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };\n }\n\n if (resolveStartImage(options, warnings) != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'image',\n details:\n 'KlingAI reference-to-video does not support a separate start frame. ' +\n 'Provide all guidance images via inputReferences instead.',\n });\n }\n\n if (resolveImageTail(options, klingaiOptions, warnings) != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'frameImages',\n details:\n 'KlingAI reference-to-video does not support a last frame (image_tail). ' +\n 'Provide all guidance images via inputReferences instead.',\n });\n }\n\n this.addPassthroughOptions(body, klingaiOptions);\n\n return body;\n }\n\n private buildMotionControlBody(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n klingaiOptions: KlingAIVideoModelOptions | undefined,\n warnings: SharedV3Warning[],\n ): Record<string, unknown> {\n if (\n !klingaiOptions?.videoUrl ||\n !klingaiOptions?.characterOrientation ||\n !klingaiOptions?.mode\n ) {\n throw new AISDKError({\n name: 'KLINGAI_VIDEO_MISSING_OPTIONS',\n message:\n 'KlingAI Motion Control requires providerOptions.klingai with videoUrl, characterOrientation, and mode.',\n });\n }\n\n const mode = 'motion-control' as const;\n const body: Record<string, unknown> = {\n model_name: getApiModelName(this.modelId, mode),\n video_url: klingaiOptions.videoUrl,\n character_orientation: klingaiOptions.characterOrientation,\n mode: klingaiOptions.mode,\n };\n\n if (options.prompt != null) {\n body.prompt = options.prompt;\n }\n\n const startImage = resolveStartImage(options, warnings);\n if (startImage != null) {\n body.image_url = fileToImageString(startImage);\n }\n\n if (klingaiOptions.keepOriginalSound != null) {\n body.keep_original_sound = klingaiOptions.keepOriginalSound;\n }\n\n if (klingaiOptions.watermarkEnabled != null) {\n body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };\n }\n\n // v3.0 element control\n if (klingaiOptions.elementList != null) {\n body.element_list = klingaiOptions.elementList;\n }\n\n // Warn about unsupported standard options for motion control\n if (options.aspectRatio) {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details:\n 'KlingAI Motion Control does not support aspectRatio. ' +\n 'The output dimensions are determined by the reference image/video.',\n });\n }\n\n if (options.duration) {\n warnings.push({\n type: 'unsupported',\n feature: 'duration',\n details:\n 'KlingAI Motion Control does not support custom duration. ' +\n 'The output duration matches the reference video duration.',\n });\n }\n\n this.addPassthroughOptions(body, klingaiOptions);\n\n return body;\n }\n\n private addPassthroughOptions(\n body: Record<string, unknown>,\n klingaiOptions: KlingAIVideoModelOptions | undefined,\n ): void {\n if (!klingaiOptions) return;\n for (const [key, value] of Object.entries(klingaiOptions)) {\n if (!HANDLED_PROVIDER_OPTIONS.has(key)) {\n body[key] = value;\n }\n }\n }\n}\n\n// Response schema for task creation (POST)\nconst klingaiCreateTaskSchema = z.object({\n code: z.number(),\n message: z.string(),\n request_id: z.string().nullish(),\n data: z\n .object({\n task_id: z.string(),\n task_status: z.string().nullish(),\n task_info: z\n .object({\n external_task_id: z.string().nullish(),\n })\n .nullish(),\n created_at: z.number().nullish(),\n updated_at: z.number().nullish(),\n })\n .nullish(),\n});\n\n// Response schema for task status query (GET)\nconst klingaiTaskStatusSchema = z.object({\n code: z.number(),\n message: z.string(),\n request_id: z.string().nullish(),\n data: z\n .object({\n task_id: z.string(),\n task_status: z.string(),\n task_status_msg: z.string().nullish(),\n task_info: z\n .object({\n external_task_id: z.string().nullish(),\n })\n .nullish(),\n watermark_info: z\n .object({\n enabled: z.boolean().nullish(),\n })\n .nullish(),\n final_unit_deduction: z.string().nullish(),\n created_at: z.number().nullish(),\n updated_at: z.number().nullish(),\n task_result: z\n .object({\n videos: z\n .array(\n z.object({\n id: z.string().nullish(),\n url: z.string().nullish(),\n watermark_url: z.string().nullish(),\n duration: z.string().nullish(),\n }),\n )\n .nullish(),\n })\n .nullish(),\n })\n .nullish(),\n});\n\ntype KlingAITaskResponse = z.infer<typeof klingaiTaskStatusSchema>;\n","import { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport const klingaiErrorDataSchema = z.object({\n code: z.number(),\n message: z.string(),\n});\n\nexport type KlingAIErrorData = z.infer<typeof klingaiErrorDataSchema>;\n\nexport const klingaiFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: klingaiErrorDataSchema,\n errorToMessage: data => data.message,\n});\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["NoSuchModelError","z","z","NoSuchModelError"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/klingai",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.29",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -25,8 +25,8 @@
|
|
|
25
25
|
}
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@ai-sdk/provider": "3.0.
|
|
29
|
-
"@ai-sdk/provider-utils": "4.0.
|
|
28
|
+
"@ai-sdk/provider": "3.0.14",
|
|
29
|
+
"@ai-sdk/provider-utils": "4.0.38"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"@types/node": "20.17.24",
|
|
@@ -34,16 +34,45 @@ function fileToImageString(file: Experimental_VideoModelV3File): string {
|
|
|
34
34
|
: convertUint8ArrayToBase64(file.data);
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
function getTopLevelMediaType(mediaType: string): string {
|
|
38
|
+
const slashIndex = mediaType.indexOf('/');
|
|
39
|
+
return slashIndex === -1 ? mediaType : mediaType.substring(0, slashIndex);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* KlingAI does not support video reference inputs. This detects whether a file
|
|
44
|
+
* is a video so it can be guarded against and excluded.
|
|
45
|
+
*/
|
|
46
|
+
const isVideoFile = (file: Experimental_VideoModelV3File): boolean =>
|
|
47
|
+
file.mediaType != null && getTopLevelMediaType(file.mediaType) === 'video';
|
|
48
|
+
|
|
37
49
|
function getReferenceImages(
|
|
38
50
|
options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],
|
|
51
|
+
warnings: SharedV3Warning[],
|
|
39
52
|
): Array<Experimental_VideoModelV3File> | undefined {
|
|
40
53
|
if (options.frameImages != null && options.frameImages.length > 0) {
|
|
41
54
|
return undefined;
|
|
42
55
|
}
|
|
43
56
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
57
|
+
if (options.inputReferences == null || options.inputReferences.length === 0) {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const imageReferences = options.inputReferences.filter(reference => {
|
|
62
|
+
if (isVideoFile(reference)) {
|
|
63
|
+
warnings.push({
|
|
64
|
+
type: 'unsupported',
|
|
65
|
+
feature: 'inputReferences',
|
|
66
|
+
details:
|
|
67
|
+
'KlingAI does not support video reference inputs; the video ' +
|
|
68
|
+
'reference was ignored.',
|
|
69
|
+
});
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
return true;
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
return imageReferences.length > 0 ? imageReferences : undefined;
|
|
47
76
|
}
|
|
48
77
|
|
|
49
78
|
function getFirstFrameImage(
|
|
@@ -55,19 +84,42 @@ function getFirstFrameImage(
|
|
|
55
84
|
|
|
56
85
|
function resolveStartImage(
|
|
57
86
|
options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],
|
|
87
|
+
warnings: SharedV3Warning[],
|
|
58
88
|
): Experimental_VideoModelV3File | undefined {
|
|
59
|
-
|
|
89
|
+
const startImage = getFirstFrameImage(options) ?? options.image;
|
|
90
|
+
|
|
91
|
+
if (startImage != null && isVideoFile(startImage)) {
|
|
92
|
+
warnings.push({
|
|
93
|
+
type: 'unsupported',
|
|
94
|
+
feature: 'frameImages',
|
|
95
|
+
details:
|
|
96
|
+
'KlingAI does not accept video as a frame image; it was ignored.',
|
|
97
|
+
});
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return startImage;
|
|
60
102
|
}
|
|
61
103
|
|
|
62
104
|
function resolveImageTail(
|
|
63
105
|
options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],
|
|
64
106
|
klingaiOptions: KlingAIVideoModelOptions | undefined,
|
|
107
|
+
warnings: SharedV3Warning[],
|
|
65
108
|
): string | undefined {
|
|
66
109
|
const lastFrame = options.frameImages?.find(
|
|
67
110
|
frame => frame.frameType === 'last_frame',
|
|
68
111
|
)?.image;
|
|
69
112
|
|
|
70
113
|
if (lastFrame != null) {
|
|
114
|
+
if (isVideoFile(lastFrame)) {
|
|
115
|
+
warnings.push({
|
|
116
|
+
type: 'unsupported',
|
|
117
|
+
feature: 'frameImages',
|
|
118
|
+
details:
|
|
119
|
+
'KlingAI does not accept video as a frame image; it was ignored.',
|
|
120
|
+
});
|
|
121
|
+
return undefined;
|
|
122
|
+
}
|
|
71
123
|
return fileToImageString(lastFrame);
|
|
72
124
|
}
|
|
73
125
|
|
|
@@ -454,7 +506,7 @@ export class KlingAIVideoModel implements Experimental_VideoModelV3 {
|
|
|
454
506
|
schema: klingaiVideoModelOptionsSchema,
|
|
455
507
|
})) as KlingAIVideoModelOptions | undefined;
|
|
456
508
|
|
|
457
|
-
const referenceImages = getReferenceImages(options);
|
|
509
|
+
const referenceImages = getReferenceImages(options, warnings);
|
|
458
510
|
const effectiveMode: KlingAIVideoMode =
|
|
459
511
|
mode === 'i2v' && referenceImages != null ? 'mi2v' : mode;
|
|
460
512
|
|
|
@@ -726,7 +778,7 @@ export class KlingAIVideoModel implements Experimental_VideoModelV3 {
|
|
|
726
778
|
}
|
|
727
779
|
|
|
728
780
|
// Image is not supported for T2V
|
|
729
|
-
if (resolveStartImage(options) != null) {
|
|
781
|
+
if (resolveStartImage(options, warnings) != null) {
|
|
730
782
|
warnings.push({
|
|
731
783
|
type: 'unsupported',
|
|
732
784
|
feature: 'image',
|
|
@@ -754,14 +806,14 @@ export class KlingAIVideoModel implements Experimental_VideoModelV3 {
|
|
|
754
806
|
body.prompt = options.prompt;
|
|
755
807
|
}
|
|
756
808
|
|
|
757
|
-
const startImage = resolveStartImage(options);
|
|
809
|
+
const startImage = resolveStartImage(options, warnings);
|
|
758
810
|
if (startImage != null) {
|
|
759
811
|
body.image = fileToImageString(startImage);
|
|
760
812
|
}
|
|
761
813
|
|
|
762
814
|
// End frame image: prefer top-level frameImages (last_frame), fall back to
|
|
763
815
|
// providerOptions.klingai.imageTail.
|
|
764
|
-
const imageTail = resolveImageTail(options, klingaiOptions);
|
|
816
|
+
const imageTail = resolveImageTail(options, klingaiOptions, warnings);
|
|
765
817
|
if (imageTail != null) {
|
|
766
818
|
body.image_tail = imageTail;
|
|
767
819
|
}
|
|
@@ -889,17 +941,17 @@ export class KlingAIVideoModel implements Experimental_VideoModelV3 {
|
|
|
889
941
|
body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };
|
|
890
942
|
}
|
|
891
943
|
|
|
892
|
-
if (resolveStartImage(options) != null) {
|
|
944
|
+
if (resolveStartImage(options, warnings) != null) {
|
|
893
945
|
warnings.push({
|
|
894
946
|
type: 'unsupported',
|
|
895
|
-
feature: '
|
|
947
|
+
feature: 'image',
|
|
896
948
|
details:
|
|
897
949
|
'KlingAI reference-to-video does not support a separate start frame. ' +
|
|
898
950
|
'Provide all guidance images via inputReferences instead.',
|
|
899
951
|
});
|
|
900
952
|
}
|
|
901
953
|
|
|
902
|
-
if (resolveImageTail(options, klingaiOptions) != null) {
|
|
954
|
+
if (resolveImageTail(options, klingaiOptions, warnings) != null) {
|
|
903
955
|
warnings.push({
|
|
904
956
|
type: 'unsupported',
|
|
905
957
|
feature: 'frameImages',
|
|
@@ -943,7 +995,7 @@ export class KlingAIVideoModel implements Experimental_VideoModelV3 {
|
|
|
943
995
|
body.prompt = options.prompt;
|
|
944
996
|
}
|
|
945
997
|
|
|
946
|
-
const startImage = resolveStartImage(options);
|
|
998
|
+
const startImage = resolveStartImage(options, warnings);
|
|
947
999
|
if (startImage != null) {
|
|
948
1000
|
body.image_url = fileToImageString(startImage);
|
|
949
1001
|
}
|