@ai-sdk/klingai 3.0.3 → 3.0.4

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,11 @@
1
1
  # @ai-sdk/klingai
2
2
 
3
+ ## 3.0.4
4
+
5
+ ### Patch Changes
6
+
7
+ - 3b19702: feat (provider/klingai): add kling v3.0 t2v and i2v support
8
+
3
9
  ## 3.0.3
4
10
 
5
11
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { ProviderV3, Experimental_VideoModelV3 } from '@ai-sdk/provider';
2
2
  import { FetchFunction } from '@ai-sdk/provider-utils';
3
3
 
4
- type KlingAIVideoModelId = 'kling-v1-t2v' | 'kling-v1.6-t2v' | 'kling-v2-master-t2v' | 'kling-v2.1-master-t2v' | 'kling-v2.5-turbo-t2v' | 'kling-v2.6-t2v' | 'kling-v1-i2v' | 'kling-v1.5-i2v' | 'kling-v1.6-i2v' | 'kling-v2-master-i2v' | 'kling-v2.1-i2v' | 'kling-v2.1-master-i2v' | 'kling-v2.5-turbo-i2v' | 'kling-v2.6-i2v' | 'kling-v2.6-motion-control' | (string & {});
4
+ type KlingAIVideoModelId = 'kling-v1-t2v' | 'kling-v1.6-t2v' | 'kling-v2-master-t2v' | 'kling-v2.1-master-t2v' | 'kling-v2.5-turbo-t2v' | 'kling-v2.6-t2v' | 'kling-v3.0-t2v' | 'kling-v1-i2v' | 'kling-v1.5-i2v' | 'kling-v1.6-i2v' | 'kling-v2-master-i2v' | 'kling-v2.1-i2v' | 'kling-v2.1-master-i2v' | 'kling-v2.5-turbo-i2v' | 'kling-v2.6-i2v' | 'kling-v3.0-i2v' | 'kling-v2.6-motion-control' | (string & {});
5
5
 
6
6
  interface KlingAIProviderSettings {
7
7
  /**
@@ -126,6 +126,57 @@ type KlingAIVideoModelOptions = {
126
126
  y: number;
127
127
  }>;
128
128
  }> | null;
129
+ /**
130
+ * Enable multi-shot video generation (Kling v3.0+).
131
+ * When true, the video is split into up to 6 storyboard shots
132
+ * with individual prompts and durations.
133
+ *
134
+ * When multiShot is true with shotType 'customize', multiPrompt is required.
135
+ * When multiShot is true, the main prompt parameter is ignored by the API.
136
+ */
137
+ multiShot?: boolean | null;
138
+ /**
139
+ * Storyboard method for multi-shot video generation (Kling v3.0+).
140
+ * Required when multiShot is true.
141
+ *
142
+ * - `'customize'`: User-defined shots via multiPrompt.
143
+ * - `'intelligence'`: Model auto-segments based on the main prompt.
144
+ */
145
+ shotType?: 'customize' | 'intelligence' | null;
146
+ /**
147
+ * Per-shot details for multi-shot video generation (Kling v3.0+).
148
+ * Required when multiShot is true and shotType is 'customize'.
149
+ *
150
+ * Up to 6 shots. Each shot has an index, prompt (max 512 chars),
151
+ * and duration in seconds. Shot durations must sum to the total duration.
152
+ */
153
+ multiPrompt?: Array<{
154
+ index: number;
155
+ prompt: string;
156
+ duration: string;
157
+ }> | null;
158
+ /**
159
+ * Reference elements for element control (Kling v3.0+ I2V).
160
+ * Supports video character elements and multi-image elements.
161
+ * Up to 3 reference elements.
162
+ *
163
+ * Cannot coexist with voiceList on the I2V endpoint.
164
+ */
165
+ elementList?: Array<{
166
+ element_id: number;
167
+ }> | null;
168
+ /**
169
+ * Voice references for voice control (Kling v3.0+).
170
+ * Up to 2 voice references. Referenced via `<<<voice_1>>>` template
171
+ * syntax in the prompt.
172
+ *
173
+ * When voiceList is used and the prompt references voice IDs,
174
+ * sound must be set to 'on'.
175
+ * Cannot coexist with elementList on the I2V endpoint.
176
+ */
177
+ voiceList?: Array<{
178
+ voice_id: string;
179
+ }> | null;
129
180
  /**
130
181
  * URL of the reference video. The character actions in the generated video
131
182
  * are consistent with the reference video.
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { ProviderV3, Experimental_VideoModelV3 } from '@ai-sdk/provider';
2
2
  import { FetchFunction } from '@ai-sdk/provider-utils';
3
3
 
4
- type KlingAIVideoModelId = 'kling-v1-t2v' | 'kling-v1.6-t2v' | 'kling-v2-master-t2v' | 'kling-v2.1-master-t2v' | 'kling-v2.5-turbo-t2v' | 'kling-v2.6-t2v' | 'kling-v1-i2v' | 'kling-v1.5-i2v' | 'kling-v1.6-i2v' | 'kling-v2-master-i2v' | 'kling-v2.1-i2v' | 'kling-v2.1-master-i2v' | 'kling-v2.5-turbo-i2v' | 'kling-v2.6-i2v' | 'kling-v2.6-motion-control' | (string & {});
4
+ type KlingAIVideoModelId = 'kling-v1-t2v' | 'kling-v1.6-t2v' | 'kling-v2-master-t2v' | 'kling-v2.1-master-t2v' | 'kling-v2.5-turbo-t2v' | 'kling-v2.6-t2v' | 'kling-v3.0-t2v' | 'kling-v1-i2v' | 'kling-v1.5-i2v' | 'kling-v1.6-i2v' | 'kling-v2-master-i2v' | 'kling-v2.1-i2v' | 'kling-v2.1-master-i2v' | 'kling-v2.5-turbo-i2v' | 'kling-v2.6-i2v' | 'kling-v3.0-i2v' | 'kling-v2.6-motion-control' | (string & {});
5
5
 
6
6
  interface KlingAIProviderSettings {
7
7
  /**
@@ -126,6 +126,57 @@ type KlingAIVideoModelOptions = {
126
126
  y: number;
127
127
  }>;
128
128
  }> | null;
129
+ /**
130
+ * Enable multi-shot video generation (Kling v3.0+).
131
+ * When true, the video is split into up to 6 storyboard shots
132
+ * with individual prompts and durations.
133
+ *
134
+ * When multiShot is true with shotType 'customize', multiPrompt is required.
135
+ * When multiShot is true, the main prompt parameter is ignored by the API.
136
+ */
137
+ multiShot?: boolean | null;
138
+ /**
139
+ * Storyboard method for multi-shot video generation (Kling v3.0+).
140
+ * Required when multiShot is true.
141
+ *
142
+ * - `'customize'`: User-defined shots via multiPrompt.
143
+ * - `'intelligence'`: Model auto-segments based on the main prompt.
144
+ */
145
+ shotType?: 'customize' | 'intelligence' | null;
146
+ /**
147
+ * Per-shot details for multi-shot video generation (Kling v3.0+).
148
+ * Required when multiShot is true and shotType is 'customize'.
149
+ *
150
+ * Up to 6 shots. Each shot has an index, prompt (max 512 chars),
151
+ * and duration in seconds. Shot durations must sum to the total duration.
152
+ */
153
+ multiPrompt?: Array<{
154
+ index: number;
155
+ prompt: string;
156
+ duration: string;
157
+ }> | null;
158
+ /**
159
+ * Reference elements for element control (Kling v3.0+ I2V).
160
+ * Supports video character elements and multi-image elements.
161
+ * Up to 3 reference elements.
162
+ *
163
+ * Cannot coexist with voiceList on the I2V endpoint.
164
+ */
165
+ elementList?: Array<{
166
+ element_id: number;
167
+ }> | null;
168
+ /**
169
+ * Voice references for voice control (Kling v3.0+).
170
+ * Up to 2 voice references. Referenced via `<<<voice_1>>>` template
171
+ * syntax in the prompt.
172
+ *
173
+ * When voiceList is used and the prompt references voice IDs,
174
+ * sound must be set to 'on'.
175
+ * Cannot coexist with elementList on the I2V endpoint.
176
+ */
177
+ voiceList?: Array<{
178
+ voice_id: string;
179
+ }> | null;
129
180
  /**
130
181
  * URL of the reference video. The character actions in the generated video
131
182
  * are consistent with the reference video.
package/dist/index.js CHANGED
@@ -112,7 +112,7 @@ var modeEndpointMap = {
112
112
  function getApiModelName(modelId, mode) {
113
113
  const suffix = mode === "motion-control" ? "-motion-control" : `-${mode}`;
114
114
  const baseName = modelId.slice(0, -suffix.length);
115
- return baseName.replace(/\./g, "-");
115
+ return baseName.replace(/\.0$/, "").replace(/\./g, "-");
116
116
  }
117
117
  var klingaiVideoModelOptionsSchema = (0, import_provider_utils3.lazySchema)(
118
118
  () => (0, import_provider_utils3.zodSchema)(
@@ -141,6 +141,28 @@ var klingaiVideoModelOptionsSchema = (0, import_provider_utils3.lazySchema)(
141
141
  zoom: import_v42.z.number().nullish()
142
142
  }).nullish()
143
143
  }).nullish(),
144
+ // v3.0 multi-shot
145
+ multiShot: import_v42.z.boolean().nullish(),
146
+ shotType: import_v42.z.enum(["customize", "intelligence"]).nullish(),
147
+ multiPrompt: import_v42.z.array(
148
+ import_v42.z.object({
149
+ index: import_v42.z.number(),
150
+ prompt: import_v42.z.string(),
151
+ duration: import_v42.z.string()
152
+ })
153
+ ).nullish(),
154
+ // v3.0 element control (I2V)
155
+ elementList: import_v42.z.array(
156
+ import_v42.z.object({
157
+ element_id: import_v42.z.number()
158
+ })
159
+ ).nullish(),
160
+ // v3.0 voice control
161
+ voiceList: import_v42.z.array(
162
+ import_v42.z.object({
163
+ voice_id: import_v42.z.string()
164
+ })
165
+ ).nullish(),
144
166
  // I2V-specific
145
167
  imageTail: import_v42.z.string().nullish(),
146
168
  staticMask: import_v42.z.string().nullish(),
@@ -166,6 +188,11 @@ var HANDLED_PROVIDER_OPTIONS = /* @__PURE__ */ new Set([
166
188
  "sound",
167
189
  "cfgScale",
168
190
  "cameraControl",
191
+ "multiShot",
192
+ "shotType",
193
+ "multiPrompt",
194
+ "elementList",
195
+ "voiceList",
169
196
  "imageTail",
170
197
  "staticMask",
171
198
  "dynamicMasks",
@@ -365,6 +392,18 @@ var KlingAIVideoModel = class {
365
392
  if (options.duration != null) {
366
393
  body.duration = String(options.duration);
367
394
  }
395
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.multiShot) != null) {
396
+ body.multi_shot = klingaiOptions.multiShot;
397
+ }
398
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.shotType) != null) {
399
+ body.shot_type = klingaiOptions.shotType;
400
+ }
401
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.multiPrompt) != null) {
402
+ body.multi_prompt = klingaiOptions.multiPrompt;
403
+ }
404
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.voiceList) != null) {
405
+ body.voice_list = klingaiOptions.voiceList;
406
+ }
368
407
  if (options.image != null) {
369
408
  warnings.push({
370
409
  type: "unsupported",
@@ -414,6 +453,21 @@ var KlingAIVideoModel = class {
414
453
  if ((klingaiOptions == null ? void 0 : klingaiOptions.dynamicMasks) != null) {
415
454
  body.dynamic_masks = klingaiOptions.dynamicMasks;
416
455
  }
456
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.multiShot) != null) {
457
+ body.multi_shot = klingaiOptions.multiShot;
458
+ }
459
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.shotType) != null) {
460
+ body.shot_type = klingaiOptions.shotType;
461
+ }
462
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.multiPrompt) != null) {
463
+ body.multi_prompt = klingaiOptions.multiPrompt;
464
+ }
465
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.elementList) != null) {
466
+ body.element_list = klingaiOptions.elementList;
467
+ }
468
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.voiceList) != null) {
469
+ body.voice_list = klingaiOptions.voiceList;
470
+ }
417
471
  if (options.duration != null) {
418
472
  body.duration = String(options.duration);
419
473
  }
@@ -526,7 +580,7 @@ var klingaiTaskStatusSchema = import_v42.z.object({
526
580
  });
527
581
 
528
582
  // src/version.ts
529
- var VERSION = "3.0.3";
583
+ var VERSION = "3.0.4";
530
584
 
531
585
  // src/klingai-provider.ts
532
586
  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 */\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(/\\./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 // --- 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 /**\n * Whether to generate watermarked results simultaneously.\n */\n watermarkEnabled?: boolean | 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 // 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 '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 if (klingaiOptions?.sound != null) {\n body.sound = klingaiOptions.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 // 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 if (klingaiOptions?.sound != null) {\n body.sound = klingaiOptions.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 // 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 body: Record<string, unknown> = {\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 // 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","declare const __PACKAGE_VERSION__: string;\n\nexport const VERSION = __PACKAGE_VERSION__;\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 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 only) ---\n\n /**\n * Reference elements for element control (Kling v3.0+ I2V).\n * Supports video character elements and multi-image elements.\n * Up to 3 reference elements.\n *\n * Cannot coexist with voiceList on the I2V endpoint.\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 // --- 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 /**\n * Whether to generate watermarked results simultaneously.\n */\n watermarkEnabled?: boolean | 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 if (klingaiOptions?.sound != null) {\n body.sound = klingaiOptions.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 // 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 if (klingaiOptions?.sound != null) {\n body.sound = klingaiOptions.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 // 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 body: Record<string, unknown> = {\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 // 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","declare const __PACKAGE_VERSION__: string;\n\nexport const VERSION = __PACKAGE_VERSION__;\n"],"mappings":"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","names":["import_provider","import_provider_utils","import_provider_utils","import_v4","import_provider_utils"]}
package/dist/index.mjs CHANGED
@@ -104,7 +104,7 @@ var modeEndpointMap = {
104
104
  function getApiModelName(modelId, mode) {
105
105
  const suffix = mode === "motion-control" ? "-motion-control" : `-${mode}`;
106
106
  const baseName = modelId.slice(0, -suffix.length);
107
- return baseName.replace(/\./g, "-");
107
+ return baseName.replace(/\.0$/, "").replace(/\./g, "-");
108
108
  }
109
109
  var klingaiVideoModelOptionsSchema = lazySchema(
110
110
  () => zodSchema(
@@ -133,6 +133,28 @@ var klingaiVideoModelOptionsSchema = lazySchema(
133
133
  zoom: z2.number().nullish()
134
134
  }).nullish()
135
135
  }).nullish(),
136
+ // v3.0 multi-shot
137
+ multiShot: z2.boolean().nullish(),
138
+ shotType: z2.enum(["customize", "intelligence"]).nullish(),
139
+ multiPrompt: z2.array(
140
+ z2.object({
141
+ index: z2.number(),
142
+ prompt: z2.string(),
143
+ duration: z2.string()
144
+ })
145
+ ).nullish(),
146
+ // v3.0 element control (I2V)
147
+ elementList: z2.array(
148
+ z2.object({
149
+ element_id: z2.number()
150
+ })
151
+ ).nullish(),
152
+ // v3.0 voice control
153
+ voiceList: z2.array(
154
+ z2.object({
155
+ voice_id: z2.string()
156
+ })
157
+ ).nullish(),
136
158
  // I2V-specific
137
159
  imageTail: z2.string().nullish(),
138
160
  staticMask: z2.string().nullish(),
@@ -158,6 +180,11 @@ var HANDLED_PROVIDER_OPTIONS = /* @__PURE__ */ new Set([
158
180
  "sound",
159
181
  "cfgScale",
160
182
  "cameraControl",
183
+ "multiShot",
184
+ "shotType",
185
+ "multiPrompt",
186
+ "elementList",
187
+ "voiceList",
161
188
  "imageTail",
162
189
  "staticMask",
163
190
  "dynamicMasks",
@@ -357,6 +384,18 @@ var KlingAIVideoModel = class {
357
384
  if (options.duration != null) {
358
385
  body.duration = String(options.duration);
359
386
  }
387
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.multiShot) != null) {
388
+ body.multi_shot = klingaiOptions.multiShot;
389
+ }
390
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.shotType) != null) {
391
+ body.shot_type = klingaiOptions.shotType;
392
+ }
393
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.multiPrompt) != null) {
394
+ body.multi_prompt = klingaiOptions.multiPrompt;
395
+ }
396
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.voiceList) != null) {
397
+ body.voice_list = klingaiOptions.voiceList;
398
+ }
360
399
  if (options.image != null) {
361
400
  warnings.push({
362
401
  type: "unsupported",
@@ -406,6 +445,21 @@ var KlingAIVideoModel = class {
406
445
  if ((klingaiOptions == null ? void 0 : klingaiOptions.dynamicMasks) != null) {
407
446
  body.dynamic_masks = klingaiOptions.dynamicMasks;
408
447
  }
448
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.multiShot) != null) {
449
+ body.multi_shot = klingaiOptions.multiShot;
450
+ }
451
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.shotType) != null) {
452
+ body.shot_type = klingaiOptions.shotType;
453
+ }
454
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.multiPrompt) != null) {
455
+ body.multi_prompt = klingaiOptions.multiPrompt;
456
+ }
457
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.elementList) != null) {
458
+ body.element_list = klingaiOptions.elementList;
459
+ }
460
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.voiceList) != null) {
461
+ body.voice_list = klingaiOptions.voiceList;
462
+ }
409
463
  if (options.duration != null) {
410
464
  body.duration = String(options.duration);
411
465
  }
@@ -518,7 +572,7 @@ var klingaiTaskStatusSchema = z2.object({
518
572
  });
519
573
 
520
574
  // src/version.ts
521
- var VERSION = "3.0.3";
575
+ var VERSION = "3.0.4";
522
576
 
523
577
  // src/klingai-provider.ts
524
578
  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 */\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(/\\./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 // --- 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 /**\n * Whether to generate watermarked results simultaneously.\n */\n watermarkEnabled?: boolean | 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 // 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 '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 if (klingaiOptions?.sound != null) {\n body.sound = klingaiOptions.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 // 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 if (klingaiOptions?.sound != null) {\n body.sound = klingaiOptions.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 // 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 body: Record<string, unknown> = {\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 // 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","declare const __PACKAGE_VERSION__: string;\n\nexport const VERSION = __PACKAGE_VERSION__;\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 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 only) ---\n\n /**\n * Reference elements for element control (Kling v3.0+ I2V).\n * Supports video character elements and multi-image elements.\n * Up to 3 reference elements.\n *\n * Cannot coexist with voiceList on the I2V endpoint.\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 // --- 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 /**\n * Whether to generate watermarked results simultaneously.\n */\n watermarkEnabled?: boolean | 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 if (klingaiOptions?.sound != null) {\n body.sound = klingaiOptions.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 // 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 if (klingaiOptions?.sound != null) {\n body.sound = klingaiOptions.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 // 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 body: Record<string, unknown> = {\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 // 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","declare const __PACKAGE_VERSION__: string;\n\nexport const VERSION = __PACKAGE_VERSION__;\n"],"mappings":"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","names":["NoSuchModelError","z","z","NoSuchModelError"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/klingai",
3
- "version": "3.0.3",
3
+ "version": "3.0.4",
4
4
  "license": "Apache-2.0",
5
5
  "sideEffects": false,
6
6
  "main": "./dist/index.js",
@@ -25,16 +25,16 @@
25
25
  }
26
26
  },
27
27
  "dependencies": {
28
- "@ai-sdk/provider-utils": "4.0.15",
29
- "@ai-sdk/provider": "3.0.8"
28
+ "@ai-sdk/provider": "3.0.8",
29
+ "@ai-sdk/provider-utils": "4.0.15"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@types/node": "20.17.24",
33
33
  "tsup": "^8",
34
34
  "typescript": "5.8.3",
35
35
  "zod": "3.25.76",
36
- "@ai-sdk/test-server": "1.0.3",
37
- "@vercel/ai-tsconfig": "0.0.0"
36
+ "@vercel/ai-tsconfig": "0.0.0",
37
+ "@ai-sdk/test-server": "1.0.3"
38
38
  },
39
39
  "peerDependencies": {
40
40
  "zod": "^3.25.76 || ^4.1.8"
@@ -51,11 +51,12 @@ const modeEndpointMap: Record<KlingAIVideoMode, string> = {
51
51
  * - 'kling-v2.6-t2v' → 'kling-v2-6'
52
52
  * - 'kling-v2.1-master-i2v' → 'kling-v2-1-master'
53
53
  * - 'kling-v1-t2v' → 'kling-v1'
54
+ * - 'kling-v3.0-t2v' → 'kling-v3'
54
55
  */
55
56
  function getApiModelName(modelId: string, mode: KlingAIVideoMode): string {
56
57
  const suffix = mode === 'motion-control' ? '-motion-control' : `-${mode}`;
57
58
  const baseName = modelId.slice(0, -suffix.length);
58
- return baseName.replace(/\./g, '-');
59
+ return baseName.replace(/\.0$/, '').replace(/\./g, '-');
59
60
  }
60
61
 
61
62
  /**
@@ -153,6 +154,68 @@ export type KlingAIVideoModelOptions = {
153
154
  trajectories: Array<{ x: number; y: number }>;
154
155
  }> | null;
155
156
 
157
+ // --- v3.0 multi-shot options (T2V and I2V) ---
158
+
159
+ /**
160
+ * Enable multi-shot video generation (Kling v3.0+).
161
+ * When true, the video is split into up to 6 storyboard shots
162
+ * with individual prompts and durations.
163
+ *
164
+ * When multiShot is true with shotType 'customize', multiPrompt is required.
165
+ * When multiShot is true, the main prompt parameter is ignored by the API.
166
+ */
167
+ multiShot?: boolean | null;
168
+
169
+ /**
170
+ * Storyboard method for multi-shot video generation (Kling v3.0+).
171
+ * Required when multiShot is true.
172
+ *
173
+ * - `'customize'`: User-defined shots via multiPrompt.
174
+ * - `'intelligence'`: Model auto-segments based on the main prompt.
175
+ */
176
+ shotType?: 'customize' | 'intelligence' | null;
177
+
178
+ /**
179
+ * Per-shot details for multi-shot video generation (Kling v3.0+).
180
+ * Required when multiShot is true and shotType is 'customize'.
181
+ *
182
+ * Up to 6 shots. Each shot has an index, prompt (max 512 chars),
183
+ * and duration in seconds. Shot durations must sum to the total duration.
184
+ */
185
+ multiPrompt?: Array<{
186
+ index: number;
187
+ prompt: string;
188
+ duration: string;
189
+ }> | null;
190
+
191
+ // --- v3.0 element control (I2V only) ---
192
+
193
+ /**
194
+ * Reference elements for element control (Kling v3.0+ I2V).
195
+ * Supports video character elements and multi-image elements.
196
+ * Up to 3 reference elements.
197
+ *
198
+ * Cannot coexist with voiceList on the I2V endpoint.
199
+ */
200
+ elementList?: Array<{
201
+ element_id: number;
202
+ }> | null;
203
+
204
+ // --- v3.0 voice control (T2V and I2V) ---
205
+
206
+ /**
207
+ * Voice references for voice control (Kling v3.0+).
208
+ * Up to 2 voice references. Referenced via `<<<voice_1>>>` template
209
+ * syntax in the prompt.
210
+ *
211
+ * When voiceList is used and the prompt references voice IDs,
212
+ * sound must be set to 'on'.
213
+ * Cannot coexist with elementList on the I2V endpoint.
214
+ */
215
+ voiceList?: Array<{
216
+ voice_id: string;
217
+ }> | null;
218
+
156
219
  // --- Motion-control-specific options ---
157
220
 
158
221
  /**
@@ -220,6 +283,34 @@ const klingaiVideoModelOptionsSchema = lazySchema(() =>
220
283
  .nullish(),
221
284
  })
222
285
  .nullish(),
286
+ // v3.0 multi-shot
287
+ multiShot: z.boolean().nullish(),
288
+ shotType: z.enum(['customize', 'intelligence']).nullish(),
289
+ multiPrompt: z
290
+ .array(
291
+ z.object({
292
+ index: z.number(),
293
+ prompt: z.string(),
294
+ duration: z.string(),
295
+ }),
296
+ )
297
+ .nullish(),
298
+ // v3.0 element control (I2V)
299
+ elementList: z
300
+ .array(
301
+ z.object({
302
+ element_id: z.number(),
303
+ }),
304
+ )
305
+ .nullish(),
306
+ // v3.0 voice control
307
+ voiceList: z
308
+ .array(
309
+ z.object({
310
+ voice_id: z.string(),
311
+ }),
312
+ )
313
+ .nullish(),
223
314
  // I2V-specific
224
315
  imageTail: z.string().nullish(),
225
316
  staticMask: z.string().nullish(),
@@ -253,6 +344,11 @@ const HANDLED_PROVIDER_OPTIONS = new Set([
253
344
  'sound',
254
345
  'cfgScale',
255
346
  'cameraControl',
347
+ 'multiShot',
348
+ 'shotType',
349
+ 'multiPrompt',
350
+ 'elementList',
351
+ 'voiceList',
256
352
  'imageTail',
257
353
  'staticMask',
258
354
  'dynamicMasks',
@@ -520,6 +616,24 @@ export class KlingAIVideoModel implements Experimental_VideoModelV3 {
520
616
  body.duration = String(options.duration);
521
617
  }
522
618
 
619
+ // v3.0 multi-shot
620
+ if (klingaiOptions?.multiShot != null) {
621
+ body.multi_shot = klingaiOptions.multiShot;
622
+ }
623
+
624
+ if (klingaiOptions?.shotType != null) {
625
+ body.shot_type = klingaiOptions.shotType;
626
+ }
627
+
628
+ if (klingaiOptions?.multiPrompt != null) {
629
+ body.multi_prompt = klingaiOptions.multiPrompt;
630
+ }
631
+
632
+ // v3.0 voice control
633
+ if (klingaiOptions?.voiceList != null) {
634
+ body.voice_list = klingaiOptions.voiceList;
635
+ }
636
+
523
637
  // Image is not supported for T2V
524
638
  if (options.image != null) {
525
639
  warnings.push({
@@ -594,6 +708,29 @@ export class KlingAIVideoModel implements Experimental_VideoModelV3 {
594
708
  body.dynamic_masks = klingaiOptions.dynamicMasks;
595
709
  }
596
710
 
711
+ // v3.0 multi-shot
712
+ if (klingaiOptions?.multiShot != null) {
713
+ body.multi_shot = klingaiOptions.multiShot;
714
+ }
715
+
716
+ if (klingaiOptions?.shotType != null) {
717
+ body.shot_type = klingaiOptions.shotType;
718
+ }
719
+
720
+ if (klingaiOptions?.multiPrompt != null) {
721
+ body.multi_prompt = klingaiOptions.multiPrompt;
722
+ }
723
+
724
+ // v3.0 element control (I2V only)
725
+ if (klingaiOptions?.elementList != null) {
726
+ body.element_list = klingaiOptions.elementList;
727
+ }
728
+
729
+ // v3.0 voice control
730
+ if (klingaiOptions?.voiceList != null) {
731
+ body.voice_list = klingaiOptions.voiceList;
732
+ }
733
+
597
734
  // Map standard SDK duration (number → string)
598
735
  if (options.duration != null) {
599
736
  body.duration = String(options.duration);
@@ -6,6 +6,7 @@ export type KlingAIVideoModelId =
6
6
  | 'kling-v2.1-master-t2v'
7
7
  | 'kling-v2.5-turbo-t2v'
8
8
  | 'kling-v2.6-t2v'
9
+ | 'kling-v3.0-t2v'
9
10
  // Image-to-Video
10
11
  | 'kling-v1-i2v'
11
12
  | 'kling-v1.5-i2v'
@@ -15,6 +16,7 @@ export type KlingAIVideoModelId =
15
16
  | 'kling-v2.1-master-i2v'
16
17
  | 'kling-v2.5-turbo-i2v'
17
18
  | 'kling-v2.6-i2v'
19
+ | 'kling-v3.0-i2v'
18
20
  // Motion Control
19
21
  | 'kling-v2.6-motion-control'
20
22
  | (string & {});