@ai-sdk/klingai 3.0.23 → 3.0.25

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 CHANGED
@@ -1,5 +1,21 @@
1
1
  # @ai-sdk/klingai
2
2
 
3
+ ## 3.0.25
4
+
5
+ ### Patch Changes
6
+
7
+ - fa850e6: feat (video): add first-class `frameImages` and `inputReferences` call options for video generation
8
+ - Updated dependencies [fa850e6]
9
+ - @ai-sdk/provider@3.0.13
10
+ - @ai-sdk/provider-utils@4.0.34
11
+
12
+ ## 3.0.24
13
+
14
+ ### Patch Changes
15
+
16
+ - Updated dependencies [b30e43a]
17
+ - @ai-sdk/provider-utils@4.0.33
18
+
3
19
  ## 3.0.23
4
20
 
5
21
  ### Patch Changes
package/dist/index.js CHANGED
@@ -98,6 +98,36 @@ var klingaiFailedResponseHandler = (0, import_provider_utils2.createJsonErrorRes
98
98
  });
99
99
 
100
100
  // src/klingai-video-model.ts
101
+ function fileToImageString(file) {
102
+ if (file.type === "url") {
103
+ return file.url;
104
+ }
105
+ return typeof file.data === "string" ? file.data : (0, import_provider_utils3.convertUint8ArrayToBase64)(file.data);
106
+ }
107
+ function getReferenceImages(options) {
108
+ if (options.frameImages != null && options.frameImages.length > 0) {
109
+ return void 0;
110
+ }
111
+ return options.inputReferences != null && options.inputReferences.length > 0 ? options.inputReferences : void 0;
112
+ }
113
+ function getFirstFrameImage(options) {
114
+ var _a, _b;
115
+ return (_b = (_a = options.frameImages) == null ? void 0 : _a.find((frame) => frame.frameType === "first_frame")) == null ? void 0 : _b.image;
116
+ }
117
+ function resolveStartImage(options) {
118
+ var _a;
119
+ return (_a = getFirstFrameImage(options)) != null ? _a : options.image;
120
+ }
121
+ function resolveImageTail(options, klingaiOptions) {
122
+ var _a, _b, _c;
123
+ const lastFrame = (_b = (_a = options.frameImages) == null ? void 0 : _a.find(
124
+ (frame) => frame.frameType === "last_frame"
125
+ )) == null ? void 0 : _b.image;
126
+ if (lastFrame != null) {
127
+ return fileToImageString(lastFrame);
128
+ }
129
+ return (_c = klingaiOptions == null ? void 0 : klingaiOptions.imageTail) != null ? _c : void 0;
130
+ }
101
131
  function detectMode(modelId) {
102
132
  if (modelId.endsWith("-t2v")) return "t2v";
103
133
  if (modelId.endsWith("-i2v")) return "i2v";
@@ -107,10 +137,11 @@ function detectMode(modelId) {
107
137
  var modeEndpointMap = {
108
138
  t2v: "/v1/videos/text2video",
109
139
  i2v: "/v1/videos/image2video",
140
+ mi2v: "/v1/videos/multi-image2video",
110
141
  "motion-control": "/v1/videos/motion-control"
111
142
  };
112
143
  function getApiModelName(modelId, mode) {
113
- const suffix = mode === "motion-control" ? "-motion-control" : `-${mode}`;
144
+ const suffix = mode === "motion-control" ? "-motion-control" : mode === "mi2v" ? "-i2v" : `-${mode}`;
114
145
  const baseName = modelId.slice(0, -suffix.length);
115
146
  return baseName.replace(/\.0$/, "").replace(/\./g, "-");
116
147
  }
@@ -221,14 +252,30 @@ var KlingAIVideoModel = class {
221
252
  providerOptions: options.providerOptions,
222
253
  schema: klingaiVideoModelOptionsSchema
223
254
  });
255
+ const referenceImages = getReferenceImages(options);
256
+ const effectiveMode = mode === "i2v" && referenceImages != null ? "mi2v" : mode;
224
257
  let body;
225
- if (mode === "motion-control") {
258
+ if (effectiveMode === "motion-control") {
226
259
  body = this.buildMotionControlBody(options, klingaiOptions, warnings);
227
- } else if (mode === "t2v") {
260
+ } else if (effectiveMode === "t2v") {
228
261
  body = this.buildT2VBody(options, klingaiOptions, warnings);
262
+ } else if (effectiveMode === "mi2v") {
263
+ body = this.buildMultiImageBody(
264
+ options,
265
+ klingaiOptions,
266
+ referenceImages,
267
+ warnings
268
+ );
229
269
  } else {
230
270
  body = this.buildI2VBody(options, klingaiOptions, warnings);
231
271
  }
272
+ if (referenceImages != null && effectiveMode !== "mi2v") {
273
+ warnings.push({
274
+ type: "unsupported",
275
+ feature: "inputReferences",
276
+ details: "KlingAI only supports inputReferences (reference-to-video) on image-to-video models. The reference images were ignored."
277
+ });
278
+ }
232
279
  if (options.resolution) {
233
280
  warnings.push({
234
281
  type: "unsupported",
@@ -257,7 +304,7 @@ var KlingAIVideoModel = class {
257
304
  details: "KlingAI video models do not support generating multiple videos per call. Only 1 video will be generated."
258
305
  });
259
306
  }
260
- const endpointPath = modeEndpointMap[mode];
307
+ const endpointPath = modeEndpointMap[effectiveMode];
261
308
  const { value: createResponse, responseHeaders: createHeaders } = await (0, import_provider_utils3.postJsonToApi)({
262
309
  url: `${this.config.baseURL}${endpointPath}`,
263
310
  headers: (0, import_provider_utils3.combineHeaders)(
@@ -408,7 +455,7 @@ var KlingAIVideoModel = class {
408
455
  if ((klingaiOptions == null ? void 0 : klingaiOptions.watermarkEnabled) != null) {
409
456
  body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };
410
457
  }
411
- if (options.image != null) {
458
+ if (resolveStartImage(options) != null) {
412
459
  warnings.push({
413
460
  type: "unsupported",
414
461
  feature: "image",
@@ -426,15 +473,13 @@ var KlingAIVideoModel = class {
426
473
  if (options.prompt != null) {
427
474
  body.prompt = options.prompt;
428
475
  }
429
- if (options.image != null) {
430
- if (options.image.type === "url") {
431
- body.image = options.image.url;
432
- } else {
433
- body.image = typeof options.image.data === "string" ? options.image.data : (0, import_provider_utils3.convertUint8ArrayToBase64)(options.image.data);
434
- }
476
+ const startImage = resolveStartImage(options);
477
+ if (startImage != null) {
478
+ body.image = fileToImageString(startImage);
435
479
  }
436
- if ((klingaiOptions == null ? void 0 : klingaiOptions.imageTail) != null) {
437
- body.image_tail = klingaiOptions.imageTail;
480
+ const imageTail = resolveImageTail(options, klingaiOptions);
481
+ if (imageTail != null) {
482
+ body.image_tail = imageTail;
438
483
  }
439
484
  if ((klingaiOptions == null ? void 0 : klingaiOptions.negativePrompt) != null) {
440
485
  body.negative_prompt = klingaiOptions.negativePrompt;
@@ -489,6 +534,51 @@ var KlingAIVideoModel = class {
489
534
  this.addPassthroughOptions(body, klingaiOptions);
490
535
  return body;
491
536
  }
537
+ buildMultiImageBody(options, klingaiOptions, referenceImages, warnings) {
538
+ const body = {
539
+ model_name: getApiModelName(this.modelId, "mi2v"),
540
+ image_list: referenceImages.map((image) => ({
541
+ image: fileToImageString(image)
542
+ }))
543
+ };
544
+ if (options.prompt != null) {
545
+ body.prompt = options.prompt;
546
+ }
547
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.negativePrompt) != null) {
548
+ body.negative_prompt = klingaiOptions.negativePrompt;
549
+ }
550
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.cfgScale) != null) {
551
+ body.cfg_scale = klingaiOptions.cfgScale;
552
+ }
553
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.mode) != null) {
554
+ body.mode = klingaiOptions.mode;
555
+ }
556
+ if (options.aspectRatio != null) {
557
+ body.aspect_ratio = options.aspectRatio;
558
+ }
559
+ if (options.duration != null) {
560
+ body.duration = String(options.duration);
561
+ }
562
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.watermarkEnabled) != null) {
563
+ body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };
564
+ }
565
+ if (resolveStartImage(options) != null) {
566
+ warnings.push({
567
+ type: "unsupported",
568
+ feature: "frameImages",
569
+ details: "KlingAI reference-to-video does not support a separate start frame. Provide all guidance images via inputReferences instead."
570
+ });
571
+ }
572
+ if (resolveImageTail(options, klingaiOptions) != null) {
573
+ warnings.push({
574
+ type: "unsupported",
575
+ feature: "frameImages",
576
+ details: "KlingAI reference-to-video does not support a last frame (image_tail). Provide all guidance images via inputReferences instead."
577
+ });
578
+ }
579
+ this.addPassthroughOptions(body, klingaiOptions);
580
+ return body;
581
+ }
492
582
  buildMotionControlBody(options, klingaiOptions, warnings) {
493
583
  if (!(klingaiOptions == null ? void 0 : klingaiOptions.videoUrl) || !(klingaiOptions == null ? void 0 : klingaiOptions.characterOrientation) || !(klingaiOptions == null ? void 0 : klingaiOptions.mode)) {
494
584
  throw new import_provider.AISDKError({
@@ -506,12 +596,9 @@ var KlingAIVideoModel = class {
506
596
  if (options.prompt != null) {
507
597
  body.prompt = options.prompt;
508
598
  }
509
- if (options.image != null) {
510
- if (options.image.type === "url") {
511
- body.image_url = options.image.url;
512
- } else {
513
- body.image_url = typeof options.image.data === "string" ? options.image.data : (0, import_provider_utils3.convertUint8ArrayToBase64)(options.image.data);
514
- }
599
+ const startImage = resolveStartImage(options);
600
+ if (startImage != null) {
601
+ body.image_url = fileToImageString(startImage);
515
602
  }
516
603
  if (klingaiOptions.keepOriginalSound != null) {
517
604
  body.keep_original_sound = klingaiOptions.keepOriginalSound;
@@ -593,7 +680,7 @@ var klingaiTaskStatusSchema = import_v42.z.object({
593
680
  });
594
681
 
595
682
  // src/version.ts
596
- var VERSION = true ? "3.0.23" : "0.0.0-test";
683
+ var VERSION = true ? "3.0.25" : "0.0.0-test";
597
684
 
598
685
  // src/klingai-provider.ts
599
686
  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 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' | 'motion-control';\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 '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 = mode === 'motion-control' ? '-motion-control' : `-${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 let body: Record<string, unknown>;\n\n if (mode === 'motion-control') {\n body = this.buildMotionControlBody(options, klingaiOptions, warnings);\n } else if (mode === 't2v') {\n body = this.buildT2VBody(options, klingaiOptions, warnings);\n } else {\n body = this.buildI2VBody(options, klingaiOptions, warnings);\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[mode];\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 (options.image != 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 // Map standard SDK image to KlingAI's image field (first/start frame)\n if (options.image != null) {\n if (options.image.type === 'url') {\n body.image = options.image.url;\n } else {\n body.image =\n typeof options.image.data === 'string'\n ? options.image.data\n : convertUint8ArrayToBase64(options.image.data);\n }\n }\n\n // End frame image via provider options\n if (klingaiOptions?.imageTail != null) {\n body.image_tail = klingaiOptions.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 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 // Map standard SDK image option to KlingAI's image_url\n if (options.image != null) {\n if (options.image.type === 'url') {\n body.image_url = options.image.url;\n } else {\n body.image_url =\n typeof options.image.data === 'string'\n ? options.image.data\n : convertUint8ArrayToBase64(options.image.data);\n }\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 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":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAA,mBAIO;AACP,IAAAC,yBAIO;;;ACTP,4BAA4B;AAK5B,IAAM,YAAY,CAAC,QACjB,KAAK,GAAG,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,MAAM,EAAE;AAWpE,eAAsB,yBAAyB;AAAA,EAC7C;AAAA,EACA;AACF,GAGoB;AAClB,QAAM,SAAK,mCAAY;AAAA,IACrB,cAAc;AAAA,IACd,aAAa;AAAA,IACb,yBAAyB;AAAA,IACzB,aAAa;AAAA,EACf,CAAC;AAED,QAAM,SAAK,mCAAY;AAAA,IACrB,cAAc;AAAA,IACd,aAAa;AAAA,IACb,yBAAyB;AAAA,IACzB,aAAa;AAAA,EACf,CAAC;AAED,QAAM,MAAM,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAExC,QAAM,SAAS,EAAE,KAAK,SAAS,KAAK,MAAM;AAC1C,QAAM,UAAU;AAAA,IACd,KAAK;AAAA,IACL,KAAK,MAAM;AAAA;AAAA,IACX,KAAK,MAAM;AAAA;AAAA,EACb;AAEA,QAAM,UAAU,IAAI,YAAY;AAGhC,QAAM,MAAM,MAAM,OAAO,OAAO;AAAA,IAC9B;AAAA,IACA,QAAQ,OAAO,EAAE;AAAA,IACjB,EAAE,MAAM,QAAQ,MAAM,UAAU;AAAA,IAChC;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AAEA,QAAM,eAAe,GAAG,UAAU,KAAK,UAAU,MAAM,CAAC,CAAC,IAAI;AAAA,IAC3D,KAAK,UAAU,OAAO;AAAA,EACxB,CAAC;AAED,QAAM,YAAY,MAAM,OAAO,OAAO;AAAA,IACpC;AAAA,IACA;AAAA,IACA,QAAQ,OAAO,YAAY;AAAA,EAC7B;AAEA,QAAM,iBAAiB,IAAI,WAAW,SAAS;AAC/C,QAAM,kBAAkB;AAAA,IACtB,OAAO,aAAa,MAAM,MAAM,MAAM,KAAK,cAAc,CAAC;AAAA,EAC5D;AAEA,SAAO,GAAG,YAAY,IAAI,eAAe;AAC3C;;;AC1EA,sBAMO;AACP,IAAAC,yBAaO;AACP,IAAAC,aAAkB;;;ACrBlB,IAAAC,yBAA+C;AAC/C,gBAAkB;AAEX,IAAM,yBAAyB,YAAE,OAAO;AAAA,EAC7C,MAAM,YAAE,OAAO;AAAA,EACf,SAAS,YAAE,OAAO;AACpB,CAAC;AAIM,IAAM,mCAA+B,uDAA+B;AAAA,EACzE,aAAa;AAAA,EACb,gBAAgB,UAAQ,KAAK;AAC/B,CAAC;;;ADcD,SAAS,kBAAkB,MAA6C;AACtE,MAAI,KAAK,SAAS,OAAO;AACvB,WAAO,KAAK;AAAA,EACd;AACA,SAAO,OAAO,KAAK,SAAS,WACxB,KAAK,WACL,kDAA0B,KAAK,IAAI;AACzC;AAEA,SAAS,mBACP,SACkD;AAClD,MAAI,QAAQ,eAAe,QAAQ,QAAQ,YAAY,SAAS,GAAG;AACjE,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,mBAAmB,QAAQ,QAAQ,gBAAgB,SAAS,IACvE,QAAQ,kBACR;AACN;AAEA,SAAS,mBACP,SAC2C;AAlD7C;AAmDE,UAAO,mBAAQ,gBAAR,mBAAqB,KAAK,WAAS,MAAM,cAAc,mBAAvD,mBACH;AACN;AAEA,SAAS,kBACP,SAC2C;AAzD7C;AA0DE,UAAO,wBAAmB,OAAO,MAA1B,YAA+B,QAAQ;AAChD;AAEA,SAAS,iBACP,SACA,gBACoB;AAhEtB;AAiEE,QAAM,aAAY,mBAAQ,gBAAR,mBAAqB;AAAA,IACrC,WAAS,MAAM,cAAc;AAAA,QADb,mBAEf;AAEH,MAAI,aAAa,MAAM;AACrB,WAAO,kBAAkB,SAAS;AAAA,EACpC;AAEA,UAAO,sDAAgB,cAAhB,YAA6B;AACtC;AAKA,SAAS,WAAW,SAAmC;AACrD,MAAI,QAAQ,SAAS,MAAM,EAAG,QAAO;AACrC,MAAI,QAAQ,SAAS,MAAM,EAAG,QAAO;AACrC,MAAI,QAAQ,SAAS,iBAAiB,EAAG,QAAO;AAChD,QAAM,IAAI,iCAAiB,EAAE,SAAS,WAAW,aAAa,CAAC;AACjE;AAKA,IAAM,kBAAoD;AAAA,EACxD,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,kBAAkB;AACpB;AAYA,SAAS,gBAAgB,SAAiB,MAAgC;AACxE,QAAM,SACJ,SAAS,mBACL,oBACA,SAAS,SACP,SACA,IAAI,IAAI;AAChB,QAAM,WAAW,QAAQ,MAAM,GAAG,CAAC,OAAO,MAAM;AAChD,SAAO,SAAS,QAAQ,QAAQ,EAAE,EAAE,QAAQ,OAAO,GAAG;AACxD;AAsMA,IAAM,qCAAiC;AAAA,EAAW,UAChD;AAAA,IACE,aACG,OAAO;AAAA,MACN,MAAM,aAAE,KAAK,CAAC,OAAO,KAAK,CAAC,EAAE,QAAQ;AAAA,MACrC,gBAAgB,aAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,MAC9C,eAAe,aAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA;AAAA,MAE7C,gBAAgB,aAAE,OAAO,EAAE,QAAQ;AAAA,MACnC,OAAO,aAAE,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,QAAQ;AAAA,MACrC,UAAU,aAAE,OAAO,EAAE,QAAQ;AAAA,MAC7B,eAAe,aACZ,OAAO;AAAA,QACN,MAAM,aAAE,KAAK;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,QACD,QAAQ,aACL,OAAO;AAAA,UACN,YAAY,aAAE,OAAO,EAAE,QAAQ;AAAA,UAC/B,UAAU,aAAE,OAAO,EAAE,QAAQ;AAAA,UAC7B,KAAK,aAAE,OAAO,EAAE,QAAQ;AAAA,UACxB,MAAM,aAAE,OAAO,EAAE,QAAQ;AAAA,UACzB,MAAM,aAAE,OAAO,EAAE,QAAQ;AAAA,UACzB,MAAM,aAAE,OAAO,EAAE,QAAQ;AAAA,QAC3B,CAAC,EACA,QAAQ;AAAA,MACb,CAAC,EACA,QAAQ;AAAA;AAAA,MAEX,WAAW,aAAE,QAAQ,EAAE,QAAQ;AAAA,MAC/B,UAAU,aAAE,KAAK,CAAC,aAAa,cAAc,CAAC,EAAE,QAAQ;AAAA,MACxD,aAAa,aACV;AAAA,QACC,aAAE,OAAO;AAAA,UACP,OAAO,aAAE,OAAO;AAAA,UAChB,QAAQ,aAAE,OAAO;AAAA,UACjB,UAAU,aAAE,OAAO;AAAA,QACrB,CAAC;AAAA,MACH,EACC,QAAQ;AAAA;AAAA,MAEX,aAAa,aACV;AAAA,QACC,aAAE,OAAO;AAAA,UACP,YAAY,aAAE,OAAO;AAAA,QACvB,CAAC;AAAA,MACH,EACC,QAAQ;AAAA;AAAA,MAEX,WAAW,aACR;AAAA,QACC,aAAE,OAAO;AAAA,UACP,UAAU,aAAE,OAAO;AAAA,QACrB,CAAC;AAAA,MACH,EACC,QAAQ;AAAA;AAAA,MAEX,WAAW,aAAE,OAAO,EAAE,QAAQ;AAAA,MAC9B,YAAY,aAAE,OAAO,EAAE,QAAQ;AAAA,MAC/B,cAAc,aACX;AAAA,QACC,aAAE,OAAO;AAAA,UACP,MAAM,aAAE,OAAO;AAAA,UACf,cAAc,aAAE,MAAM,aAAE,OAAO,EAAE,GAAG,aAAE,OAAO,GAAG,GAAG,aAAE,OAAO,EAAE,CAAC,CAAC;AAAA,QAClE,CAAC;AAAA,MACH,EACC,QAAQ;AAAA;AAAA,MAEX,UAAU,aAAE,OAAO,EAAE,QAAQ;AAAA,MAC7B,sBAAsB,aAAE,KAAK,CAAC,SAAS,OAAO,CAAC,EAAE,QAAQ;AAAA,MACzD,mBAAmB,aAAE,KAAK,CAAC,OAAO,IAAI,CAAC,EAAE,QAAQ;AAAA,MACjD,kBAAkB,aAAE,QAAQ,EAAE,QAAQ;AAAA,IACxC,CAAC,EACA,YAAY;AAAA,EACjB;AACF;AAMA,IAAM,2BAA2B,oBAAI,IAAI;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAYM,IAAM,oBAAN,MAA6D;AAAA,EAQlE,YACW,SACQ,QACjB;AAFS;AACQ;AATnB,SAAS,uBAAuB;AAChC,SAAS,mBAAmB;AAAA,EASzB;AAAA,EAPH,IAAI,WAAmB;AACrB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAOA,MAAM,WACJ,SACuE;AA7b3E;AA8bI,UAAM,eAAc,sBAAK,OAAO,cAAZ,mBAAuB,gBAAvB,4CAA0C,oBAAI,KAAK;AACvE,UAAM,WAA8B,CAAC;AACrC,UAAM,OAAO,WAAW,KAAK,OAAO;AAEpC,UAAM,iBAAkB,UAAM,6CAAqB;AAAA,MACjD,UAAU;AAAA,MACV,iBAAiB,QAAQ;AAAA,MACzB,QAAQ;AAAA,IACV,CAAC;AAED,UAAM,kBAAkB,mBAAmB,OAAO;AAClD,UAAM,gBACJ,SAAS,SAAS,mBAAmB,OAAO,SAAS;AAEvD,QAAI;AAEJ,QAAI,kBAAkB,kBAAkB;AACtC,aAAO,KAAK,uBAAuB,SAAS,gBAAgB,QAAQ;AAAA,IACtE,WAAW,kBAAkB,OAAO;AAClC,aAAO,KAAK,aAAa,SAAS,gBAAgB,QAAQ;AAAA,IAC5D,WAAW,kBAAkB,QAAQ;AACnC,aAAO,KAAK;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,OAAO;AACL,aAAO,KAAK,aAAa,SAAS,gBAAgB,QAAQ;AAAA,IAC5D;AAEA,QAAI,mBAAmB,QAAQ,kBAAkB,QAAQ;AACvD,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SACE;AAAA,MAEJ,CAAC;AAAA,IACH;AAGA,QAAI,QAAQ,YAAY;AACtB,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,QAAI,QAAQ,MAAM;AAChB,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SACE;AAAA,MACJ,CAAC;AAAA,IACH;AAEA,QAAI,QAAQ,KAAK;AACf,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,QAAI,QAAQ,KAAK,QAAQ,QAAQ,IAAI,GAAG;AACtC,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SACE;AAAA,MAEJ,CAAC;AAAA,IACH;AAEA,UAAM,eAAe,gBAAgB,aAAa;AAGlD,UAAM,EAAE,OAAO,gBAAgB,iBAAiB,cAAc,IAC5D,UAAM,sCAAc;AAAA,MAClB,KAAK,GAAG,KAAK,OAAO,OAAO,GAAG,YAAY;AAAA,MAC1C,aAAS;AAAA,QACP,UAAM,gCAAQ,KAAK,OAAO,OAAO;AAAA,QACjC,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,MACA,+BAA2B;AAAA,QACzB;AAAA,MACF;AAAA,MACA,uBAAuB;AAAA,MACvB,aAAa,QAAQ;AAAA,MACrB,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AAEH,UAAM,UAAS,oBAAe,SAAf,mBAAqB;AACpC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,2BAAW;AAAA,QACnB,MAAM;AAAA,QACN,SAAS,mDAAmD,KAAK,UAAU,cAAc,CAAC;AAAA,MAC5F,CAAC;AAAA,IACH;AAGA,UAAM,kBAAiB,sDAAgB,mBAAhB,YAAkC;AACzD,UAAM,iBAAgB,sDAAgB,kBAAhB,YAAiC;AACvD,UAAM,YAAY,KAAK,IAAI;AAC3B,QAAI;AACJ,QAAI,kBAAsD;AAE1D,WAAO,MAAM;AACX,gBAAM,8BAAM,gBAAgB,EAAE,aAAa,QAAQ,YAAY,CAAC;AAEhE,UAAI,KAAK,IAAI,IAAI,YAAY,eAAe;AAC1C,cAAM,IAAI,2BAAW;AAAA,UACnB,MAAM;AAAA,UACN,SAAS,oCAAoC,aAAa;AAAA,QAC5D,CAAC;AAAA,MACH;AAEA,YAAM,EAAE,OAAO,gBAAgB,iBAAiB,YAAY,IAC1D,UAAM,mCAAW;AAAA,QACf,KAAK,GAAG,KAAK,OAAO,OAAO,GAAG,YAAY,IAAI,MAAM;AAAA,QACpD,aAAS;AAAA,UACP,UAAM,gCAAQ,KAAK,OAAO,OAAO;AAAA,UACjC,QAAQ;AAAA,QACV;AAAA,QACA,+BAA2B;AAAA,UACzB;AAAA,QACF;AAAA,QACA,uBAAuB;AAAA,QACvB,aAAa,QAAQ;AAAA,QACrB,OAAO,KAAK,OAAO;AAAA,MACrB,CAAC;AAEH,wBAAkB;AAClB,YAAM,cAAa,oBAAe,SAAf,mBAAqB;AAExC,UAAI,eAAe,WAAW;AAC5B,wBAAgB;AAChB;AAAA,MACF;AAEA,UAAI,eAAe,UAAU;AAC3B,cAAM,IAAI,2BAAW;AAAA,UACnB,MAAM;AAAA,UACN,SAAS,6BAA4B,0BAAe,SAAf,mBAAqB,oBAArB,YAAwC,eAAe;AAAA,QAC9F,CAAC;AAAA,MACH;AAAA,IAGF;AAEA,QAAI,GAAC,gEAAe,SAAf,mBAAqB,gBAArB,mBAAkC,WAAlC,mBAA0C,SAAQ;AACrD,YAAM,IAAI,2BAAW;AAAA,QACnB,MAAM;AAAA,QACN,SAAS,oCAAoC,KAAK,UAAU,aAAa,CAAC;AAAA,MAC5E,CAAC;AAAA,IACH;AAEA,UAAM,SAAiE,CAAC;AACxE,UAAM,gBAKD,CAAC;AAEN,eAAW,SAAS,cAAc,KAAK,YAAY,QAAQ;AACzD,UAAI,MAAM,KAAK;AACb,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,KAAK,MAAM;AAAA,UACX,WAAW;AAAA,QACb,CAAC;AACD,sBAAc,KAAK;AAAA,UACjB,KAAI,WAAM,OAAN,YAAY;AAAA,UAChB,KAAK,MAAM;AAAA,UACX,GAAI,MAAM,gBAAgB,EAAE,cAAc,MAAM,cAAc,IAAI,CAAC;AAAA,UACnE,GAAI,MAAM,WAAW,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;AAAA,QACvD,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,OAAO,WAAW,GAAG;AACvB,YAAM,IAAI,2BAAW;AAAA,QACnB,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,UAAU;AAAA,QACR,WAAW;AAAA,QACX,SAAS,KAAK;AAAA,QACd,SAAS;AAAA,MACX;AAAA,MACA,kBAAkB;AAAA,QAChB,SAAS;AAAA,UACP;AAAA,UACA,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,aACN,SACA,gBACA,UACyB;AACzB,UAAM,OAAO;AACb,UAAM,OAAgC;AAAA,MACpC,YAAY,gBAAgB,KAAK,SAAS,IAAI;AAAA,IAChD;AAEA,QAAI,QAAQ,UAAU,MAAM;AAC1B,WAAK,SAAS,QAAQ;AAAA,IACxB;AAEA,SAAI,iDAAgB,mBAAkB,MAAM;AAC1C,WAAK,kBAAkB,eAAe;AAAA,IACxC;AAEA,UAAM,QACJ,QAAQ,iBAAiB,OACrB,QAAQ,gBACN,OACA,QACF,iDAAgB;AACtB,QAAI,SAAS,MAAM;AACjB,WAAK,QAAQ;AAAA,IACf;AAEA,SAAI,iDAAgB,aAAY,MAAM;AACpC,WAAK,YAAY,eAAe;AAAA,IAClC;AAEA,SAAI,iDAAgB,SAAQ,MAAM;AAChC,WAAK,OAAO,eAAe;AAAA,IAC7B;AAEA,SAAI,iDAAgB,kBAAiB,MAAM;AACzC,WAAK,iBAAiB,eAAe;AAAA,IACvC;AAGA,QAAI,QAAQ,eAAe,MAAM;AAC/B,WAAK,eAAe,QAAQ;AAAA,IAC9B;AAGA,QAAI,QAAQ,YAAY,MAAM;AAC5B,WAAK,WAAW,OAAO,QAAQ,QAAQ;AAAA,IACzC;AAGA,SAAI,iDAAgB,cAAa,MAAM;AACrC,WAAK,aAAa,eAAe;AAAA,IACnC;AAEA,SAAI,iDAAgB,aAAY,MAAM;AACpC,WAAK,YAAY,eAAe;AAAA,IAClC;AAEA,SAAI,iDAAgB,gBAAe,MAAM;AACvC,WAAK,eAAe,eAAe;AAAA,IACrC;AAGA,SAAI,iDAAgB,cAAa,MAAM;AACrC,WAAK,aAAa,eAAe;AAAA,IACnC;AAEA,SAAI,iDAAgB,qBAAoB,MAAM;AAC5C,WAAK,iBAAiB,EAAE,SAAS,eAAe,iBAAiB;AAAA,IACnE;AAGA,QAAI,kBAAkB,OAAO,KAAK,MAAM;AACtC,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SACE;AAAA,MACJ,CAAC;AAAA,IACH;AAEA,SAAK,sBAAsB,MAAM,cAAc;AAE/C,WAAO;AAAA,EACT;AAAA,EAEQ,aACN,SACA,gBACA,UACyB;AACzB,UAAM,OAAO;AACb,UAAM,OAAgC;AAAA,MACpC,YAAY,gBAAgB,KAAK,SAAS,IAAI;AAAA,IAChD;AAEA,QAAI,QAAQ,UAAU,MAAM;AAC1B,WAAK,SAAS,QAAQ;AAAA,IACxB;AAEA,UAAM,aAAa,kBAAkB,OAAO;AAC5C,QAAI,cAAc,MAAM;AACtB,WAAK,QAAQ,kBAAkB,UAAU;AAAA,IAC3C;AAIA,UAAM,YAAY,iBAAiB,SAAS,cAAc;AAC1D,QAAI,aAAa,MAAM;AACrB,WAAK,aAAa;AAAA,IACpB;AAEA,SAAI,iDAAgB,mBAAkB,MAAM;AAC1C,WAAK,kBAAkB,eAAe;AAAA,IACxC;AAEA,UAAM,QACJ,QAAQ,iBAAiB,OACrB,QAAQ,gBACN,OACA,QACF,iDAAgB;AACtB,QAAI,SAAS,MAAM;AACjB,WAAK,QAAQ;AAAA,IACf;AAEA,SAAI,iDAAgB,aAAY,MAAM;AACpC,WAAK,YAAY,eAAe;AAAA,IAClC;AAEA,SAAI,iDAAgB,SAAQ,MAAM;AAChC,WAAK,OAAO,eAAe;AAAA,IAC7B;AAEA,SAAI,iDAAgB,kBAAiB,MAAM;AACzC,WAAK,iBAAiB,eAAe;AAAA,IACvC;AAEA,SAAI,iDAAgB,eAAc,MAAM;AACtC,WAAK,cAAc,eAAe;AAAA,IACpC;AAEA,SAAI,iDAAgB,iBAAgB,MAAM;AACxC,WAAK,gBAAgB,eAAe;AAAA,IACtC;AAGA,SAAI,iDAAgB,cAAa,MAAM;AACrC,WAAK,aAAa,eAAe;AAAA,IACnC;AAEA,SAAI,iDAAgB,aAAY,MAAM;AACpC,WAAK,YAAY,eAAe;AAAA,IAClC;AAEA,SAAI,iDAAgB,gBAAe,MAAM;AACvC,WAAK,eAAe,eAAe;AAAA,IACrC;AAGA,SAAI,iDAAgB,gBAAe,MAAM;AACvC,WAAK,eAAe,eAAe;AAAA,IACrC;AAGA,SAAI,iDAAgB,cAAa,MAAM;AACrC,WAAK,aAAa,eAAe;AAAA,IACnC;AAEA,SAAI,iDAAgB,qBAAoB,MAAM;AAC5C,WAAK,iBAAiB,EAAE,SAAS,eAAe,iBAAiB;AAAA,IACnE;AAGA,QAAI,QAAQ,YAAY,MAAM;AAC5B,WAAK,WAAW,OAAO,QAAQ,QAAQ;AAAA,IACzC;AAGA,QAAI,QAAQ,eAAe,MAAM;AAC/B,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SACE;AAAA,MAEJ,CAAC;AAAA,IACH;AAEA,SAAK,sBAAsB,MAAM,cAAc;AAE/C,WAAO;AAAA,EACT;AAAA,EAEQ,oBACN,SACA,gBACA,iBACA,UACyB;AACzB,UAAM,OAAgC;AAAA,MACpC,YAAY,gBAAgB,KAAK,SAAS,MAAM;AAAA,MAChD,YAAY,gBAAgB,IAAI,YAAU;AAAA,QACxC,OAAO,kBAAkB,KAAK;AAAA,MAChC,EAAE;AAAA,IACJ;AAEA,QAAI,QAAQ,UAAU,MAAM;AAC1B,WAAK,SAAS,QAAQ;AAAA,IACxB;AAEA,SAAI,iDAAgB,mBAAkB,MAAM;AAC1C,WAAK,kBAAkB,eAAe;AAAA,IACxC;AAEA,SAAI,iDAAgB,aAAY,MAAM;AACpC,WAAK,YAAY,eAAe;AAAA,IAClC;AAEA,SAAI,iDAAgB,SAAQ,MAAM;AAChC,WAAK,OAAO,eAAe;AAAA,IAC7B;AAEA,QAAI,QAAQ,eAAe,MAAM;AAC/B,WAAK,eAAe,QAAQ;AAAA,IAC9B;AAEA,QAAI,QAAQ,YAAY,MAAM;AAC5B,WAAK,WAAW,OAAO,QAAQ,QAAQ;AAAA,IACzC;AAEA,SAAI,iDAAgB,qBAAoB,MAAM;AAC5C,WAAK,iBAAiB,EAAE,SAAS,eAAe,iBAAiB;AAAA,IACnE;AAEA,QAAI,kBAAkB,OAAO,KAAK,MAAM;AACtC,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SACE;AAAA,MAEJ,CAAC;AAAA,IACH;AAEA,QAAI,iBAAiB,SAAS,cAAc,KAAK,MAAM;AACrD,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SACE;AAAA,MAEJ,CAAC;AAAA,IACH;AAEA,SAAK,sBAAsB,MAAM,cAAc;AAE/C,WAAO;AAAA,EACT;AAAA,EAEQ,uBACN,SACA,gBACA,UACyB;AACzB,QACE,EAAC,iDAAgB,aACjB,EAAC,iDAAgB,yBACjB,EAAC,iDAAgB,OACjB;AACA,YAAM,IAAI,2BAAW;AAAA,QACnB,MAAM;AAAA,QACN,SACE;AAAA,MACJ,CAAC;AAAA,IACH;AAEA,UAAM,OAAO;AACb,UAAM,OAAgC;AAAA,MACpC,YAAY,gBAAgB,KAAK,SAAS,IAAI;AAAA,MAC9C,WAAW,eAAe;AAAA,MAC1B,uBAAuB,eAAe;AAAA,MACtC,MAAM,eAAe;AAAA,IACvB;AAEA,QAAI,QAAQ,UAAU,MAAM;AAC1B,WAAK,SAAS,QAAQ;AAAA,IACxB;AAEA,UAAM,aAAa,kBAAkB,OAAO;AAC5C,QAAI,cAAc,MAAM;AACtB,WAAK,YAAY,kBAAkB,UAAU;AAAA,IAC/C;AAEA,QAAI,eAAe,qBAAqB,MAAM;AAC5C,WAAK,sBAAsB,eAAe;AAAA,IAC5C;AAEA,QAAI,eAAe,oBAAoB,MAAM;AAC3C,WAAK,iBAAiB,EAAE,SAAS,eAAe,iBAAiB;AAAA,IACnE;AAGA,QAAI,eAAe,eAAe,MAAM;AACtC,WAAK,eAAe,eAAe;AAAA,IACrC;AAGA,QAAI,QAAQ,aAAa;AACvB,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SACE;AAAA,MAEJ,CAAC;AAAA,IACH;AAEA,QAAI,QAAQ,UAAU;AACpB,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SACE;AAAA,MAEJ,CAAC;AAAA,IACH;AAEA,SAAK,sBAAsB,MAAM,cAAc;AAE/C,WAAO;AAAA,EACT;AAAA,EAEQ,sBACN,MACA,gBACM;AACN,QAAI,CAAC,eAAgB;AACrB,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,cAAc,GAAG;AACzD,UAAI,CAAC,yBAAyB,IAAI,GAAG,GAAG;AACtC,aAAK,GAAG,IAAI;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACF;AAGA,IAAM,0BAA0B,aAAE,OAAO;AAAA,EACvC,MAAM,aAAE,OAAO;AAAA,EACf,SAAS,aAAE,OAAO;AAAA,EAClB,YAAY,aAAE,OAAO,EAAE,QAAQ;AAAA,EAC/B,MAAM,aACH,OAAO;AAAA,IACN,SAAS,aAAE,OAAO;AAAA,IAClB,aAAa,aAAE,OAAO,EAAE,QAAQ;AAAA,IAChC,WAAW,aACR,OAAO;AAAA,MACN,kBAAkB,aAAE,OAAO,EAAE,QAAQ;AAAA,IACvC,CAAC,EACA,QAAQ;AAAA,IACX,YAAY,aAAE,OAAO,EAAE,QAAQ;AAAA,IAC/B,YAAY,aAAE,OAAO,EAAE,QAAQ;AAAA,EACjC,CAAC,EACA,QAAQ;AACb,CAAC;AAGD,IAAM,0BAA0B,aAAE,OAAO;AAAA,EACvC,MAAM,aAAE,OAAO;AAAA,EACf,SAAS,aAAE,OAAO;AAAA,EAClB,YAAY,aAAE,OAAO,EAAE,QAAQ;AAAA,EAC/B,MAAM,aACH,OAAO;AAAA,IACN,SAAS,aAAE,OAAO;AAAA,IAClB,aAAa,aAAE,OAAO;AAAA,IACtB,iBAAiB,aAAE,OAAO,EAAE,QAAQ;AAAA,IACpC,WAAW,aACR,OAAO;AAAA,MACN,kBAAkB,aAAE,OAAO,EAAE,QAAQ;AAAA,IACvC,CAAC,EACA,QAAQ;AAAA,IACX,gBAAgB,aACb,OAAO;AAAA,MACN,SAAS,aAAE,QAAQ,EAAE,QAAQ;AAAA,IAC/B,CAAC,EACA,QAAQ;AAAA,IACX,sBAAsB,aAAE,OAAO,EAAE,QAAQ;AAAA,IACzC,YAAY,aAAE,OAAO,EAAE,QAAQ;AAAA,IAC/B,YAAY,aAAE,OAAO,EAAE,QAAQ;AAAA,IAC/B,aAAa,aACV,OAAO;AAAA,MACN,QAAQ,aACL;AAAA,QACC,aAAE,OAAO;AAAA,UACP,IAAI,aAAE,OAAO,EAAE,QAAQ;AAAA,UACvB,KAAK,aAAE,OAAO,EAAE,QAAQ;AAAA,UACxB,eAAe,aAAE,OAAO,EAAE,QAAQ;AAAA,UAClC,UAAU,aAAE,OAAO,EAAE,QAAQ;AAAA,QAC/B,CAAC;AAAA,MACH,EACC,QAAQ;AAAA,IACb,CAAC,EACA,QAAQ;AAAA,EACb,CAAC,EACA,QAAQ;AACb,CAAC;;;AEniCM,IAAM,UACX,OACI,WACA;;;AJgDN,IAAM,iBAAiB;AAKhB,SAAS,cACd,UAAmC,CAAC,GACnB;AA5DnB;AA6DE,QAAM,WACJ,uDAAqB,aAAQ,YAAR,YAAmB,cAAc,MAAtD,YAA2D;AAE7D,QAAM,aAAa,YAAY;AAC7B,UAAM,QAAQ,MAAM,yBAAyB;AAAA,MAC3C,WAAW,QAAQ;AAAA,MACnB,WAAW,QAAQ;AAAA,IACrB,CAAC;AAED,eAAO;AAAA,MACL;AAAA,QACE,eAAe,UAAU,KAAK;AAAA,QAC9B,GAAG,QAAQ;AAAA,MACb;AAAA,MACA,kBAAkB,OAAO;AAAA,IAC3B;AAAA,EACF;AAEA,QAAM,mBAAmB,CAAC,YACxB,IAAI,kBAAkB,SAAS;AAAA,IAC7B,UAAU;AAAA,IACV;AAAA,IACA,SAAS;AAAA,IACT,OAAO,QAAQ;AAAA,EACjB,CAAC;AAEH,QAAM,cAAc,CAClB,SACA,cAOU;AACV,UAAM,IAAI,kCAAiB,EAAE,SAAS,UAAU,CAAC;AAAA,EACnD;AAEA,QAAM,WAA4B;AAAA,IAChC,sBAAsB;AAAA,IACtB,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,eAAe,CAAC,YAAoB,YAAY,SAAS,eAAe;AAAA,IACxE,gBAAgB,CAAC,YAAoB,YAAY,SAAS,gBAAgB;AAAA,IAC1E,YAAY,CAAC,YAAoB,YAAY,SAAS,YAAY;AAAA,EACpE;AAEA,SAAO;AACT;AAKO,IAAM,UAAU,cAAc;","names":["import_provider","import_provider_utils","import_provider_utils","import_v4","import_provider_utils"]}
package/dist/index.mjs CHANGED
@@ -90,6 +90,36 @@ var klingaiFailedResponseHandler = createJsonErrorResponseHandler({
90
90
  });
91
91
 
92
92
  // src/klingai-video-model.ts
93
+ function fileToImageString(file) {
94
+ if (file.type === "url") {
95
+ return file.url;
96
+ }
97
+ return typeof file.data === "string" ? file.data : convertUint8ArrayToBase64(file.data);
98
+ }
99
+ function getReferenceImages(options) {
100
+ if (options.frameImages != null && options.frameImages.length > 0) {
101
+ return void 0;
102
+ }
103
+ return options.inputReferences != null && options.inputReferences.length > 0 ? options.inputReferences : void 0;
104
+ }
105
+ function getFirstFrameImage(options) {
106
+ var _a, _b;
107
+ return (_b = (_a = options.frameImages) == null ? void 0 : _a.find((frame) => frame.frameType === "first_frame")) == null ? void 0 : _b.image;
108
+ }
109
+ function resolveStartImage(options) {
110
+ var _a;
111
+ return (_a = getFirstFrameImage(options)) != null ? _a : options.image;
112
+ }
113
+ function resolveImageTail(options, klingaiOptions) {
114
+ var _a, _b, _c;
115
+ const lastFrame = (_b = (_a = options.frameImages) == null ? void 0 : _a.find(
116
+ (frame) => frame.frameType === "last_frame"
117
+ )) == null ? void 0 : _b.image;
118
+ if (lastFrame != null) {
119
+ return fileToImageString(lastFrame);
120
+ }
121
+ return (_c = klingaiOptions == null ? void 0 : klingaiOptions.imageTail) != null ? _c : void 0;
122
+ }
93
123
  function detectMode(modelId) {
94
124
  if (modelId.endsWith("-t2v")) return "t2v";
95
125
  if (modelId.endsWith("-i2v")) return "i2v";
@@ -99,10 +129,11 @@ function detectMode(modelId) {
99
129
  var modeEndpointMap = {
100
130
  t2v: "/v1/videos/text2video",
101
131
  i2v: "/v1/videos/image2video",
132
+ mi2v: "/v1/videos/multi-image2video",
102
133
  "motion-control": "/v1/videos/motion-control"
103
134
  };
104
135
  function getApiModelName(modelId, mode) {
105
- const suffix = mode === "motion-control" ? "-motion-control" : `-${mode}`;
136
+ const suffix = mode === "motion-control" ? "-motion-control" : mode === "mi2v" ? "-i2v" : `-${mode}`;
106
137
  const baseName = modelId.slice(0, -suffix.length);
107
138
  return baseName.replace(/\.0$/, "").replace(/\./g, "-");
108
139
  }
@@ -213,14 +244,30 @@ var KlingAIVideoModel = class {
213
244
  providerOptions: options.providerOptions,
214
245
  schema: klingaiVideoModelOptionsSchema
215
246
  });
247
+ const referenceImages = getReferenceImages(options);
248
+ const effectiveMode = mode === "i2v" && referenceImages != null ? "mi2v" : mode;
216
249
  let body;
217
- if (mode === "motion-control") {
250
+ if (effectiveMode === "motion-control") {
218
251
  body = this.buildMotionControlBody(options, klingaiOptions, warnings);
219
- } else if (mode === "t2v") {
252
+ } else if (effectiveMode === "t2v") {
220
253
  body = this.buildT2VBody(options, klingaiOptions, warnings);
254
+ } else if (effectiveMode === "mi2v") {
255
+ body = this.buildMultiImageBody(
256
+ options,
257
+ klingaiOptions,
258
+ referenceImages,
259
+ warnings
260
+ );
221
261
  } else {
222
262
  body = this.buildI2VBody(options, klingaiOptions, warnings);
223
263
  }
264
+ if (referenceImages != null && effectiveMode !== "mi2v") {
265
+ warnings.push({
266
+ type: "unsupported",
267
+ feature: "inputReferences",
268
+ details: "KlingAI only supports inputReferences (reference-to-video) on image-to-video models. The reference images were ignored."
269
+ });
270
+ }
224
271
  if (options.resolution) {
225
272
  warnings.push({
226
273
  type: "unsupported",
@@ -249,7 +296,7 @@ var KlingAIVideoModel = class {
249
296
  details: "KlingAI video models do not support generating multiple videos per call. Only 1 video will be generated."
250
297
  });
251
298
  }
252
- const endpointPath = modeEndpointMap[mode];
299
+ const endpointPath = modeEndpointMap[effectiveMode];
253
300
  const { value: createResponse, responseHeaders: createHeaders } = await postJsonToApi({
254
301
  url: `${this.config.baseURL}${endpointPath}`,
255
302
  headers: combineHeaders(
@@ -400,7 +447,7 @@ var KlingAIVideoModel = class {
400
447
  if ((klingaiOptions == null ? void 0 : klingaiOptions.watermarkEnabled) != null) {
401
448
  body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };
402
449
  }
403
- if (options.image != null) {
450
+ if (resolveStartImage(options) != null) {
404
451
  warnings.push({
405
452
  type: "unsupported",
406
453
  feature: "image",
@@ -418,15 +465,13 @@ var KlingAIVideoModel = class {
418
465
  if (options.prompt != null) {
419
466
  body.prompt = options.prompt;
420
467
  }
421
- if (options.image != null) {
422
- if (options.image.type === "url") {
423
- body.image = options.image.url;
424
- } else {
425
- body.image = typeof options.image.data === "string" ? options.image.data : convertUint8ArrayToBase64(options.image.data);
426
- }
468
+ const startImage = resolveStartImage(options);
469
+ if (startImage != null) {
470
+ body.image = fileToImageString(startImage);
427
471
  }
428
- if ((klingaiOptions == null ? void 0 : klingaiOptions.imageTail) != null) {
429
- body.image_tail = klingaiOptions.imageTail;
472
+ const imageTail = resolveImageTail(options, klingaiOptions);
473
+ if (imageTail != null) {
474
+ body.image_tail = imageTail;
430
475
  }
431
476
  if ((klingaiOptions == null ? void 0 : klingaiOptions.negativePrompt) != null) {
432
477
  body.negative_prompt = klingaiOptions.negativePrompt;
@@ -481,6 +526,51 @@ var KlingAIVideoModel = class {
481
526
  this.addPassthroughOptions(body, klingaiOptions);
482
527
  return body;
483
528
  }
529
+ buildMultiImageBody(options, klingaiOptions, referenceImages, warnings) {
530
+ const body = {
531
+ model_name: getApiModelName(this.modelId, "mi2v"),
532
+ image_list: referenceImages.map((image) => ({
533
+ image: fileToImageString(image)
534
+ }))
535
+ };
536
+ if (options.prompt != null) {
537
+ body.prompt = options.prompt;
538
+ }
539
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.negativePrompt) != null) {
540
+ body.negative_prompt = klingaiOptions.negativePrompt;
541
+ }
542
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.cfgScale) != null) {
543
+ body.cfg_scale = klingaiOptions.cfgScale;
544
+ }
545
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.mode) != null) {
546
+ body.mode = klingaiOptions.mode;
547
+ }
548
+ if (options.aspectRatio != null) {
549
+ body.aspect_ratio = options.aspectRatio;
550
+ }
551
+ if (options.duration != null) {
552
+ body.duration = String(options.duration);
553
+ }
554
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.watermarkEnabled) != null) {
555
+ body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };
556
+ }
557
+ if (resolveStartImage(options) != null) {
558
+ warnings.push({
559
+ type: "unsupported",
560
+ feature: "frameImages",
561
+ details: "KlingAI reference-to-video does not support a separate start frame. Provide all guidance images via inputReferences instead."
562
+ });
563
+ }
564
+ if (resolveImageTail(options, klingaiOptions) != null) {
565
+ warnings.push({
566
+ type: "unsupported",
567
+ feature: "frameImages",
568
+ details: "KlingAI reference-to-video does not support a last frame (image_tail). Provide all guidance images via inputReferences instead."
569
+ });
570
+ }
571
+ this.addPassthroughOptions(body, klingaiOptions);
572
+ return body;
573
+ }
484
574
  buildMotionControlBody(options, klingaiOptions, warnings) {
485
575
  if (!(klingaiOptions == null ? void 0 : klingaiOptions.videoUrl) || !(klingaiOptions == null ? void 0 : klingaiOptions.characterOrientation) || !(klingaiOptions == null ? void 0 : klingaiOptions.mode)) {
486
576
  throw new AISDKError({
@@ -498,12 +588,9 @@ var KlingAIVideoModel = class {
498
588
  if (options.prompt != null) {
499
589
  body.prompt = options.prompt;
500
590
  }
501
- if (options.image != null) {
502
- if (options.image.type === "url") {
503
- body.image_url = options.image.url;
504
- } else {
505
- body.image_url = typeof options.image.data === "string" ? options.image.data : convertUint8ArrayToBase64(options.image.data);
506
- }
591
+ const startImage = resolveStartImage(options);
592
+ if (startImage != null) {
593
+ body.image_url = fileToImageString(startImage);
507
594
  }
508
595
  if (klingaiOptions.keepOriginalSound != null) {
509
596
  body.keep_original_sound = klingaiOptions.keepOriginalSound;
@@ -585,7 +672,7 @@ var klingaiTaskStatusSchema = z2.object({
585
672
  });
586
673
 
587
674
  // src/version.ts
588
- var VERSION = true ? "3.0.23" : "0.0.0-test";
675
+ var VERSION = true ? "3.0.25" : "0.0.0-test";
589
676
 
590
677
  // src/klingai-provider.ts
591
678
  var defaultBaseURL = "https://api-singapore.klingai.com";
@@ -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 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' | 'motion-control';\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 '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 = mode === 'motion-control' ? '-motion-control' : `-${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 let body: Record<string, unknown>;\n\n if (mode === 'motion-control') {\n body = this.buildMotionControlBody(options, klingaiOptions, warnings);\n } else if (mode === 't2v') {\n body = this.buildT2VBody(options, klingaiOptions, warnings);\n } else {\n body = this.buildI2VBody(options, klingaiOptions, warnings);\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[mode];\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 (options.image != 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 // Map standard SDK image to KlingAI's image field (first/start frame)\n if (options.image != null) {\n if (options.image.type === 'url') {\n body.image = options.image.url;\n } else {\n body.image =\n typeof options.image.data === 'string'\n ? options.image.data\n : convertUint8ArrayToBase64(options.image.data);\n }\n }\n\n // End frame image via provider options\n if (klingaiOptions?.imageTail != null) {\n body.image_tail = klingaiOptions.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 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 // Map standard SDK image option to KlingAI's image_url\n if (options.image != null) {\n if (options.image.type === 'url') {\n body.image_url = options.image.url;\n } else {\n body.image_url =\n typeof options.image.data === 'string'\n ? options.image.data\n : convertUint8ArrayToBase64(options.image.data);\n }\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 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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/klingai",
3
- "version": "3.0.23",
3
+ "version": "3.0.25",
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.12",
29
- "@ai-sdk/provider-utils": "4.0.32"
28
+ "@ai-sdk/provider": "3.0.13",
29
+ "@ai-sdk/provider-utils": "4.0.34"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@types/node": "20.17.24",
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  AISDKError,
3
3
  type Experimental_VideoModelV3,
4
+ type Experimental_VideoModelV3File,
4
5
  NoSuchModelError,
5
6
  type SharedV3Warning,
6
7
  } from '@ai-sdk/provider';
@@ -22,7 +23,56 @@ import { z } from 'zod/v4';
22
23
  import { klingaiFailedResponseHandler } from './klingai-error';
23
24
  import type { KlingAIVideoModelId } from './klingai-video-settings';
24
25
 
25
- type KlingAIVideoMode = 't2v' | 'i2v' | 'motion-control';
26
+ type KlingAIVideoMode = 't2v' | 'i2v' | 'mi2v' | 'motion-control';
27
+
28
+ function fileToImageString(file: Experimental_VideoModelV3File): string {
29
+ if (file.type === 'url') {
30
+ return file.url;
31
+ }
32
+ return typeof file.data === 'string'
33
+ ? file.data
34
+ : convertUint8ArrayToBase64(file.data);
35
+ }
36
+
37
+ function getReferenceImages(
38
+ options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],
39
+ ): Array<Experimental_VideoModelV3File> | undefined {
40
+ if (options.frameImages != null && options.frameImages.length > 0) {
41
+ return undefined;
42
+ }
43
+
44
+ return options.inputReferences != null && options.inputReferences.length > 0
45
+ ? options.inputReferences
46
+ : undefined;
47
+ }
48
+
49
+ function getFirstFrameImage(
50
+ options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],
51
+ ): Experimental_VideoModelV3File | undefined {
52
+ return options.frameImages?.find(frame => frame.frameType === 'first_frame')
53
+ ?.image;
54
+ }
55
+
56
+ function resolveStartImage(
57
+ options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],
58
+ ): Experimental_VideoModelV3File | undefined {
59
+ return getFirstFrameImage(options) ?? options.image;
60
+ }
61
+
62
+ function resolveImageTail(
63
+ options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],
64
+ klingaiOptions: KlingAIVideoModelOptions | undefined,
65
+ ): string | undefined {
66
+ const lastFrame = options.frameImages?.find(
67
+ frame => frame.frameType === 'last_frame',
68
+ )?.image;
69
+
70
+ if (lastFrame != null) {
71
+ return fileToImageString(lastFrame);
72
+ }
73
+
74
+ return klingaiOptions?.imageTail ?? undefined;
75
+ }
26
76
 
27
77
  /**
28
78
  * Detects the video generation mode from the model ID suffix.
@@ -40,6 +90,7 @@ function detectMode(modelId: string): KlingAIVideoMode {
40
90
  const modeEndpointMap: Record<KlingAIVideoMode, string> = {
41
91
  t2v: '/v1/videos/text2video',
42
92
  i2v: '/v1/videos/image2video',
93
+ mi2v: '/v1/videos/multi-image2video',
43
94
  'motion-control': '/v1/videos/motion-control',
44
95
  };
45
96
 
@@ -54,7 +105,12 @@ const modeEndpointMap: Record<KlingAIVideoMode, string> = {
54
105
  * - 'kling-v3.0-t2v' → 'kling-v3'
55
106
  */
56
107
  function getApiModelName(modelId: string, mode: KlingAIVideoMode): string {
57
- const suffix = mode === 'motion-control' ? '-motion-control' : `-${mode}`;
108
+ const suffix =
109
+ mode === 'motion-control'
110
+ ? '-motion-control'
111
+ : mode === 'mi2v'
112
+ ? '-i2v'
113
+ : `-${mode}`;
58
114
  const baseName = modelId.slice(0, -suffix.length);
59
115
  return baseName.replace(/\.0$/, '').replace(/\./g, '-');
60
116
  }
@@ -398,16 +454,37 @@ export class KlingAIVideoModel implements Experimental_VideoModelV3 {
398
454
  schema: klingaiVideoModelOptionsSchema,
399
455
  })) as KlingAIVideoModelOptions | undefined;
400
456
 
457
+ const referenceImages = getReferenceImages(options);
458
+ const effectiveMode: KlingAIVideoMode =
459
+ mode === 'i2v' && referenceImages != null ? 'mi2v' : mode;
460
+
401
461
  let body: Record<string, unknown>;
402
462
 
403
- if (mode === 'motion-control') {
463
+ if (effectiveMode === 'motion-control') {
404
464
  body = this.buildMotionControlBody(options, klingaiOptions, warnings);
405
- } else if (mode === 't2v') {
465
+ } else if (effectiveMode === 't2v') {
406
466
  body = this.buildT2VBody(options, klingaiOptions, warnings);
467
+ } else if (effectiveMode === 'mi2v') {
468
+ body = this.buildMultiImageBody(
469
+ options,
470
+ klingaiOptions,
471
+ referenceImages!,
472
+ warnings,
473
+ );
407
474
  } else {
408
475
  body = this.buildI2VBody(options, klingaiOptions, warnings);
409
476
  }
410
477
 
478
+ if (referenceImages != null && effectiveMode !== 'mi2v') {
479
+ warnings.push({
480
+ type: 'unsupported',
481
+ feature: 'inputReferences',
482
+ details:
483
+ 'KlingAI only supports inputReferences (reference-to-video) on ' +
484
+ 'image-to-video models. The reference images were ignored.',
485
+ });
486
+ }
487
+
411
488
  // Warn about universally unsupported standard options
412
489
  if (options.resolution) {
413
490
  warnings.push({
@@ -444,7 +521,7 @@ export class KlingAIVideoModel implements Experimental_VideoModelV3 {
444
521
  });
445
522
  }
446
523
 
447
- const endpointPath = modeEndpointMap[mode];
524
+ const endpointPath = modeEndpointMap[effectiveMode];
448
525
 
449
526
  // Step 1: Create the task
450
527
  const { value: createResponse, responseHeaders: createHeaders } =
@@ -649,7 +726,7 @@ export class KlingAIVideoModel implements Experimental_VideoModelV3 {
649
726
  }
650
727
 
651
728
  // Image is not supported for T2V
652
- if (options.image != null) {
729
+ if (resolveStartImage(options) != null) {
653
730
  warnings.push({
654
731
  type: 'unsupported',
655
732
  feature: 'image',
@@ -677,21 +754,16 @@ export class KlingAIVideoModel implements Experimental_VideoModelV3 {
677
754
  body.prompt = options.prompt;
678
755
  }
679
756
 
680
- // Map standard SDK image to KlingAI's image field (first/start frame)
681
- if (options.image != null) {
682
- if (options.image.type === 'url') {
683
- body.image = options.image.url;
684
- } else {
685
- body.image =
686
- typeof options.image.data === 'string'
687
- ? options.image.data
688
- : convertUint8ArrayToBase64(options.image.data);
689
- }
757
+ const startImage = resolveStartImage(options);
758
+ if (startImage != null) {
759
+ body.image = fileToImageString(startImage);
690
760
  }
691
761
 
692
- // End frame image via provider options
693
- if (klingaiOptions?.imageTail != null) {
694
- body.image_tail = klingaiOptions.imageTail;
762
+ // End frame image: prefer top-level frameImages (last_frame), fall back to
763
+ // providerOptions.klingai.imageTail.
764
+ const imageTail = resolveImageTail(options, klingaiOptions);
765
+ if (imageTail != null) {
766
+ body.image_tail = imageTail;
695
767
  }
696
768
 
697
769
  if (klingaiOptions?.negativePrompt != null) {
@@ -776,6 +848,72 @@ export class KlingAIVideoModel implements Experimental_VideoModelV3 {
776
848
  return body;
777
849
  }
778
850
 
851
+ private buildMultiImageBody(
852
+ options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],
853
+ klingaiOptions: KlingAIVideoModelOptions | undefined,
854
+ referenceImages: Array<Experimental_VideoModelV3File>,
855
+ warnings: SharedV3Warning[],
856
+ ): Record<string, unknown> {
857
+ const body: Record<string, unknown> = {
858
+ model_name: getApiModelName(this.modelId, 'mi2v'),
859
+ image_list: referenceImages.map(image => ({
860
+ image: fileToImageString(image),
861
+ })),
862
+ };
863
+
864
+ if (options.prompt != null) {
865
+ body.prompt = options.prompt;
866
+ }
867
+
868
+ if (klingaiOptions?.negativePrompt != null) {
869
+ body.negative_prompt = klingaiOptions.negativePrompt;
870
+ }
871
+
872
+ if (klingaiOptions?.cfgScale != null) {
873
+ body.cfg_scale = klingaiOptions.cfgScale;
874
+ }
875
+
876
+ if (klingaiOptions?.mode != null) {
877
+ body.mode = klingaiOptions.mode;
878
+ }
879
+
880
+ if (options.aspectRatio != null) {
881
+ body.aspect_ratio = options.aspectRatio;
882
+ }
883
+
884
+ if (options.duration != null) {
885
+ body.duration = String(options.duration);
886
+ }
887
+
888
+ if (klingaiOptions?.watermarkEnabled != null) {
889
+ body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };
890
+ }
891
+
892
+ if (resolveStartImage(options) != null) {
893
+ warnings.push({
894
+ type: 'unsupported',
895
+ feature: 'frameImages',
896
+ details:
897
+ 'KlingAI reference-to-video does not support a separate start frame. ' +
898
+ 'Provide all guidance images via inputReferences instead.',
899
+ });
900
+ }
901
+
902
+ if (resolveImageTail(options, klingaiOptions) != null) {
903
+ warnings.push({
904
+ type: 'unsupported',
905
+ feature: 'frameImages',
906
+ details:
907
+ 'KlingAI reference-to-video does not support a last frame (image_tail). ' +
908
+ 'Provide all guidance images via inputReferences instead.',
909
+ });
910
+ }
911
+
912
+ this.addPassthroughOptions(body, klingaiOptions);
913
+
914
+ return body;
915
+ }
916
+
779
917
  private buildMotionControlBody(
780
918
  options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],
781
919
  klingaiOptions: KlingAIVideoModelOptions | undefined,
@@ -805,16 +943,9 @@ export class KlingAIVideoModel implements Experimental_VideoModelV3 {
805
943
  body.prompt = options.prompt;
806
944
  }
807
945
 
808
- // Map standard SDK image option to KlingAI's image_url
809
- if (options.image != null) {
810
- if (options.image.type === 'url') {
811
- body.image_url = options.image.url;
812
- } else {
813
- body.image_url =
814
- typeof options.image.data === 'string'
815
- ? options.image.data
816
- : convertUint8ArrayToBase64(options.image.data);
817
- }
946
+ const startImage = resolveStartImage(options);
947
+ if (startImage != null) {
948
+ body.image_url = fileToImageString(startImage);
818
949
  }
819
950
 
820
951
  if (klingaiOptions.keepOriginalSound != null) {