@ai-sdk/klingai 3.0.0 → 3.0.1

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/dist/index.mjs CHANGED
@@ -90,32 +90,82 @@ var klingaiFailedResponseHandler = createJsonErrorResponseHandler({
90
90
  });
91
91
 
92
92
  // src/klingai-video-model.ts
93
- var modelEndpointMap = {
94
- "kling-v2.6-motion-control": "/v1/videos/motion-control"
93
+ function detectMode(modelId) {
94
+ if (modelId.endsWith("-t2v")) return "t2v";
95
+ if (modelId.endsWith("-i2v")) return "i2v";
96
+ if (modelId.endsWith("-motion-control")) return "motion-control";
97
+ throw new NoSuchModelError({ modelId, modelType: "videoModel" });
98
+ }
99
+ var modeEndpointMap = {
100
+ t2v: "/v1/videos/text2video",
101
+ i2v: "/v1/videos/image2video",
102
+ "motion-control": "/v1/videos/motion-control"
95
103
  };
96
- function getEndpointPath(modelId) {
97
- const endpoint = modelEndpointMap[modelId];
98
- if (!endpoint) {
99
- throw new NoSuchModelError({
100
- modelId,
101
- modelType: "videoModel"
102
- });
103
- }
104
- return endpoint;
104
+ function getApiModelName(modelId, mode) {
105
+ const suffix = mode === "motion-control" ? "-motion-control" : `-${mode}`;
106
+ const baseName = modelId.slice(0, -suffix.length);
107
+ return baseName.replace(/\./g, "-");
105
108
  }
106
109
  var klingaiVideoProviderOptionsSchema = lazySchema(
107
110
  () => zodSchema(
108
111
  z2.object({
109
- videoUrl: z2.string(),
110
- characterOrientation: z2.enum(["image", "video"]),
111
- mode: z2.enum(["std", "pro"]),
112
- keepOriginalSound: z2.enum(["yes", "no"]).nullish(),
113
- watermarkEnabled: z2.boolean().nullish(),
112
+ mode: z2.enum(["std", "pro"]).nullish(),
114
113
  pollIntervalMs: z2.number().positive().nullish(),
115
- pollTimeoutMs: z2.number().positive().nullish()
114
+ pollTimeoutMs: z2.number().positive().nullish(),
115
+ // T2V and I2V
116
+ negativePrompt: z2.string().nullish(),
117
+ sound: z2.enum(["on", "off"]).nullish(),
118
+ cfgScale: z2.number().nullish(),
119
+ cameraControl: z2.object({
120
+ type: z2.enum([
121
+ "simple",
122
+ "down_back",
123
+ "forward_up",
124
+ "right_turn_forward",
125
+ "left_turn_forward"
126
+ ]),
127
+ config: z2.object({
128
+ horizontal: z2.number().nullish(),
129
+ vertical: z2.number().nullish(),
130
+ pan: z2.number().nullish(),
131
+ tilt: z2.number().nullish(),
132
+ roll: z2.number().nullish(),
133
+ zoom: z2.number().nullish()
134
+ }).nullish()
135
+ }).nullish(),
136
+ // I2V-specific
137
+ imageTail: z2.string().nullish(),
138
+ staticMask: z2.string().nullish(),
139
+ dynamicMasks: z2.array(
140
+ z2.object({
141
+ mask: z2.string(),
142
+ trajectories: z2.array(z2.object({ x: z2.number(), y: z2.number() }))
143
+ })
144
+ ).nullish(),
145
+ // Motion-control-specific
146
+ videoUrl: z2.string().nullish(),
147
+ characterOrientation: z2.enum(["image", "video"]).nullish(),
148
+ keepOriginalSound: z2.enum(["yes", "no"]).nullish(),
149
+ watermarkEnabled: z2.boolean().nullish()
116
150
  }).passthrough()
117
151
  )
118
152
  );
153
+ var HANDLED_PROVIDER_OPTIONS = /* @__PURE__ */ new Set([
154
+ "mode",
155
+ "pollIntervalMs",
156
+ "pollTimeoutMs",
157
+ "negativePrompt",
158
+ "sound",
159
+ "cfgScale",
160
+ "cameraControl",
161
+ "imageTail",
162
+ "staticMask",
163
+ "dynamicMasks",
164
+ "videoUrl",
165
+ "characterOrientation",
166
+ "keepOriginalSound",
167
+ "watermarkEnabled"
168
+ ]);
119
169
  var KlingAIVideoModel = class {
120
170
  constructor(modelId, config) {
121
171
  this.modelId = modelId;
@@ -130,95 +180,49 @@ var KlingAIVideoModel = class {
130
180
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m;
131
181
  const currentDate = (_c = (_b = (_a = this.config._internal) == null ? void 0 : _a.currentDate) == null ? void 0 : _b.call(_a)) != null ? _c : /* @__PURE__ */ new Date();
132
182
  const warnings = [];
183
+ const mode = detectMode(this.modelId);
133
184
  const klingaiOptions = await parseProviderOptions({
134
185
  provider: "klingai",
135
186
  providerOptions: options.providerOptions,
136
187
  schema: klingaiVideoProviderOptionsSchema
137
188
  });
138
- if (!klingaiOptions) {
139
- throw new AISDKError({
140
- name: "KLINGAI_VIDEO_MISSING_OPTIONS",
141
- message: "KlingAI requires providerOptions.klingai with videoUrl, characterOrientation, and mode."
142
- });
143
- }
144
- const body = {
145
- video_url: klingaiOptions.videoUrl,
146
- character_orientation: klingaiOptions.characterOrientation,
147
- mode: klingaiOptions.mode
148
- };
149
- if (options.prompt != null) {
150
- body.prompt = options.prompt;
151
- }
152
- if (options.image != null) {
153
- if (options.image.type === "url") {
154
- body.image_url = options.image.url;
155
- } else {
156
- const base64Data = typeof options.image.data === "string" ? options.image.data : convertUint8ArrayToBase64(options.image.data);
157
- body.image_url = base64Data;
158
- }
159
- }
160
- if (klingaiOptions.keepOriginalSound !== void 0 && klingaiOptions.keepOriginalSound !== null) {
161
- body.keep_original_sound = klingaiOptions.keepOriginalSound;
162
- }
163
- if (klingaiOptions.watermarkEnabled !== void 0 && klingaiOptions.watermarkEnabled !== null) {
164
- body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };
165
- }
166
- for (const [key, value] of Object.entries(klingaiOptions)) {
167
- if (![
168
- "videoUrl",
169
- "characterOrientation",
170
- "mode",
171
- "keepOriginalSound",
172
- "watermarkEnabled",
173
- "pollIntervalMs",
174
- "pollTimeoutMs"
175
- ].includes(key)) {
176
- body[key] = value;
177
- }
178
- }
179
- if (options.aspectRatio) {
180
- warnings.push({
181
- type: "unsupported",
182
- feature: "aspectRatio",
183
- details: "KlingAI Motion Control does not support aspectRatio. The output dimensions are determined by the reference image/video."
184
- });
189
+ let body;
190
+ if (mode === "motion-control") {
191
+ body = this.buildMotionControlBody(options, klingaiOptions, warnings);
192
+ } else if (mode === "t2v") {
193
+ body = this.buildT2VBody(options, klingaiOptions, warnings);
194
+ } else {
195
+ body = this.buildI2VBody(options, klingaiOptions, warnings);
185
196
  }
186
197
  if (options.resolution) {
187
198
  warnings.push({
188
199
  type: "unsupported",
189
200
  feature: "resolution",
190
- details: "KlingAI Motion Control does not support resolution. The output resolution is determined by the reference image/video."
201
+ details: "KlingAI video models do not support the resolution option."
191
202
  });
192
203
  }
193
204
  if (options.seed) {
194
205
  warnings.push({
195
206
  type: "unsupported",
196
207
  feature: "seed",
197
- details: "KlingAI Motion Control does not support seed for deterministic generation."
198
- });
199
- }
200
- if (options.duration) {
201
- warnings.push({
202
- type: "unsupported",
203
- feature: "duration",
204
- details: "KlingAI Motion Control does not support custom duration. The output duration matches the reference video duration."
208
+ details: "KlingAI video models do not support seed for deterministic generation."
205
209
  });
206
210
  }
207
211
  if (options.fps) {
208
212
  warnings.push({
209
213
  type: "unsupported",
210
214
  feature: "fps",
211
- details: "KlingAI Motion Control does not support custom FPS."
215
+ details: "KlingAI video models do not support custom FPS."
212
216
  });
213
217
  }
214
218
  if (options.n != null && options.n > 1) {
215
219
  warnings.push({
216
220
  type: "unsupported",
217
221
  feature: "n",
218
- details: "KlingAI Motion Control does not support generating multiple videos per call. Only 1 video will be generated."
222
+ details: "KlingAI video models do not support generating multiple videos per call. Only 1 video will be generated."
219
223
  });
220
224
  }
221
- const endpointPath = getEndpointPath(this.modelId);
225
+ const endpointPath = modeEndpointMap[mode];
222
226
  const { value: createResponse, responseHeaders: createHeaders } = await postJsonToApi({
223
227
  url: `${this.config.baseURL}${endpointPath}`,
224
228
  headers: combineHeaders(
@@ -240,8 +244,8 @@ var KlingAIVideoModel = class {
240
244
  message: `No task_id returned from KlingAI API. Response: ${JSON.stringify(createResponse)}`
241
245
  });
242
246
  }
243
- const pollIntervalMs = (_e = klingaiOptions.pollIntervalMs) != null ? _e : 5e3;
244
- const pollTimeoutMs = (_f = klingaiOptions.pollTimeoutMs) != null ? _f : 6e5;
247
+ const pollIntervalMs = (_e = klingaiOptions == null ? void 0 : klingaiOptions.pollIntervalMs) != null ? _e : 5e3;
248
+ const pollTimeoutMs = (_f = klingaiOptions == null ? void 0 : klingaiOptions.pollTimeoutMs) != null ? _f : 6e5;
245
249
  const startTime = Date.now();
246
250
  let finalResponse;
247
251
  let responseHeaders = createHeaders;
@@ -324,6 +328,150 @@ var KlingAIVideoModel = class {
324
328
  }
325
329
  };
326
330
  }
331
+ buildT2VBody(options, klingaiOptions, warnings) {
332
+ const mode = "t2v";
333
+ const body = {
334
+ model_name: getApiModelName(this.modelId, mode)
335
+ };
336
+ if (options.prompt != null) {
337
+ body.prompt = options.prompt;
338
+ }
339
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.negativePrompt) != null) {
340
+ body.negative_prompt = klingaiOptions.negativePrompt;
341
+ }
342
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.sound) != null) {
343
+ body.sound = klingaiOptions.sound;
344
+ }
345
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.cfgScale) != null) {
346
+ body.cfg_scale = klingaiOptions.cfgScale;
347
+ }
348
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.mode) != null) {
349
+ body.mode = klingaiOptions.mode;
350
+ }
351
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.cameraControl) != null) {
352
+ body.camera_control = klingaiOptions.cameraControl;
353
+ }
354
+ if (options.aspectRatio != null) {
355
+ body.aspect_ratio = options.aspectRatio;
356
+ }
357
+ if (options.duration != null) {
358
+ body.duration = String(options.duration);
359
+ }
360
+ if (options.image != null) {
361
+ warnings.push({
362
+ type: "unsupported",
363
+ feature: "image",
364
+ details: "KlingAI text-to-video does not support image input. Use an image-to-video model instead."
365
+ });
366
+ }
367
+ this.addPassthroughOptions(body, klingaiOptions);
368
+ return body;
369
+ }
370
+ buildI2VBody(options, klingaiOptions, warnings) {
371
+ const mode = "i2v";
372
+ const body = {
373
+ model_name: getApiModelName(this.modelId, mode)
374
+ };
375
+ if (options.prompt != null) {
376
+ body.prompt = options.prompt;
377
+ }
378
+ if (options.image != null) {
379
+ if (options.image.type === "url") {
380
+ body.image = options.image.url;
381
+ } else {
382
+ body.image = typeof options.image.data === "string" ? options.image.data : convertUint8ArrayToBase64(options.image.data);
383
+ }
384
+ }
385
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.imageTail) != null) {
386
+ body.image_tail = klingaiOptions.imageTail;
387
+ }
388
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.negativePrompt) != null) {
389
+ body.negative_prompt = klingaiOptions.negativePrompt;
390
+ }
391
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.sound) != null) {
392
+ body.sound = klingaiOptions.sound;
393
+ }
394
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.cfgScale) != null) {
395
+ body.cfg_scale = klingaiOptions.cfgScale;
396
+ }
397
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.mode) != null) {
398
+ body.mode = klingaiOptions.mode;
399
+ }
400
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.cameraControl) != null) {
401
+ body.camera_control = klingaiOptions.cameraControl;
402
+ }
403
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.staticMask) != null) {
404
+ body.static_mask = klingaiOptions.staticMask;
405
+ }
406
+ if ((klingaiOptions == null ? void 0 : klingaiOptions.dynamicMasks) != null) {
407
+ body.dynamic_masks = klingaiOptions.dynamicMasks;
408
+ }
409
+ if (options.duration != null) {
410
+ body.duration = String(options.duration);
411
+ }
412
+ if (options.aspectRatio != null) {
413
+ warnings.push({
414
+ type: "unsupported",
415
+ feature: "aspectRatio",
416
+ details: "KlingAI image-to-video does not support aspectRatio. The output dimensions are determined by the input image."
417
+ });
418
+ }
419
+ this.addPassthroughOptions(body, klingaiOptions);
420
+ return body;
421
+ }
422
+ buildMotionControlBody(options, klingaiOptions, warnings) {
423
+ if (!(klingaiOptions == null ? void 0 : klingaiOptions.videoUrl) || !(klingaiOptions == null ? void 0 : klingaiOptions.characterOrientation) || !(klingaiOptions == null ? void 0 : klingaiOptions.mode)) {
424
+ throw new AISDKError({
425
+ name: "KLINGAI_VIDEO_MISSING_OPTIONS",
426
+ message: "KlingAI Motion Control requires providerOptions.klingai with videoUrl, characterOrientation, and mode."
427
+ });
428
+ }
429
+ const body = {
430
+ video_url: klingaiOptions.videoUrl,
431
+ character_orientation: klingaiOptions.characterOrientation,
432
+ mode: klingaiOptions.mode
433
+ };
434
+ if (options.prompt != null) {
435
+ body.prompt = options.prompt;
436
+ }
437
+ if (options.image != null) {
438
+ if (options.image.type === "url") {
439
+ body.image_url = options.image.url;
440
+ } else {
441
+ body.image_url = typeof options.image.data === "string" ? options.image.data : convertUint8ArrayToBase64(options.image.data);
442
+ }
443
+ }
444
+ if (klingaiOptions.keepOriginalSound != null) {
445
+ body.keep_original_sound = klingaiOptions.keepOriginalSound;
446
+ }
447
+ if (klingaiOptions.watermarkEnabled != null) {
448
+ body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };
449
+ }
450
+ if (options.aspectRatio) {
451
+ warnings.push({
452
+ type: "unsupported",
453
+ feature: "aspectRatio",
454
+ details: "KlingAI Motion Control does not support aspectRatio. The output dimensions are determined by the reference image/video."
455
+ });
456
+ }
457
+ if (options.duration) {
458
+ warnings.push({
459
+ type: "unsupported",
460
+ feature: "duration",
461
+ details: "KlingAI Motion Control does not support custom duration. The output duration matches the reference video duration."
462
+ });
463
+ }
464
+ this.addPassthroughOptions(body, klingaiOptions);
465
+ return body;
466
+ }
467
+ addPassthroughOptions(body, klingaiOptions) {
468
+ if (!klingaiOptions) return;
469
+ for (const [key, value] of Object.entries(klingaiOptions)) {
470
+ if (!HANDLED_PROVIDER_OPTIONS.has(key)) {
471
+ body[key] = value;
472
+ }
473
+ }
474
+ }
327
475
  };
328
476
  var klingaiCreateTaskSchema = z2.object({
329
477
  code: z2.number(),
@@ -370,7 +518,7 @@ var klingaiTaskStatusSchema = z2.object({
370
518
  });
371
519
 
372
520
  // src/version.ts
373
- var VERSION = "3.0.0";
521
+ var VERSION = "3.0.1";
374
522
 
375
523
  // src/klingai-provider.ts
376
524
  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\n/**\n * Maps known model IDs to their API endpoint paths.\n */\nconst modelEndpointMap: Record<string, string> = {\n 'kling-v2.6-motion-control': '/v1/videos/motion-control',\n};\n\nfunction getEndpointPath(modelId: string): string {\n const endpoint = modelEndpointMap[modelId];\n if (!endpoint) {\n throw new NoSuchModelError({\n modelId,\n modelType: 'videoModel',\n });\n }\n return endpoint;\n}\n\nexport type KlingAIVideoProviderOptions = {\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;\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';\n\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';\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 /**\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 [key: string]: unknown; // For passthrough\n};\n\nconst klingaiVideoProviderOptionsSchema = lazySchema(() =>\n zodSchema(\n z\n .object({\n videoUrl: z.string(),\n characterOrientation: z.enum(['image', 'video']),\n mode: z.enum(['std', 'pro']),\n keepOriginalSound: z.enum(['yes', 'no']).nullish(),\n watermarkEnabled: z.boolean().nullish(),\n pollIntervalMs: z.number().positive().nullish(),\n pollTimeoutMs: z.number().positive().nullish(),\n })\n .passthrough(),\n ),\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\n const klingaiOptions = (await parseProviderOptions({\n provider: 'klingai',\n providerOptions: options.providerOptions,\n schema: klingaiVideoProviderOptionsSchema,\n })) as KlingAIVideoProviderOptions | undefined;\n\n if (!klingaiOptions) {\n throw new AISDKError({\n name: 'KLINGAI_VIDEO_MISSING_OPTIONS',\n message:\n 'KlingAI requires providerOptions.klingai with videoUrl, characterOrientation, and mode.',\n });\n }\n\n // Build the request body for the KlingAI Motion Control endpoint\n const body: Record<string, unknown> = {\n video_url: klingaiOptions.videoUrl,\n character_orientation: klingaiOptions.characterOrientation,\n mode: klingaiOptions.mode,\n };\n\n // Map standard SDK prompt option\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 // KlingAI accepts raw base64 without the data: prefix\n const base64Data =\n typeof options.image.data === 'string'\n ? options.image.data\n : convertUint8ArrayToBase64(options.image.data);\n body.image_url = base64Data;\n }\n }\n\n // Map KlingAI-specific options\n if (\n klingaiOptions.keepOriginalSound !== undefined &&\n klingaiOptions.keepOriginalSound !== null\n ) {\n body.keep_original_sound = klingaiOptions.keepOriginalSound;\n }\n\n if (\n klingaiOptions.watermarkEnabled !== undefined &&\n klingaiOptions.watermarkEnabled !== null\n ) {\n body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };\n }\n\n // Pass through any additional provider-specific options\n for (const [key, value] of Object.entries(klingaiOptions)) {\n if (\n ![\n 'videoUrl',\n 'characterOrientation',\n 'mode',\n 'keepOriginalSound',\n 'watermarkEnabled',\n 'pollIntervalMs',\n 'pollTimeoutMs',\n ].includes(key)\n ) {\n body[key] = value;\n }\n }\n\n // Warn about unsupported standard options\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.resolution) {\n warnings.push({\n type: 'unsupported',\n feature: 'resolution',\n details:\n 'KlingAI Motion Control does not support resolution. ' +\n 'The output resolution is determined by the reference image/video.',\n });\n }\n\n if (options.seed) {\n warnings.push({\n type: 'unsupported',\n feature: 'seed',\n details:\n 'KlingAI Motion Control does not support seed for deterministic generation.',\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 if (options.fps) {\n warnings.push({\n type: 'unsupported',\n feature: 'fps',\n details: 'KlingAI Motion Control does 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 Motion Control does not support generating multiple videos per call. ' +\n 'Only 1 video will be generated.',\n });\n }\n\n // Resolve the API endpoint path for this model\n const endpointPath = getEndpointPath(this.modelId);\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\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 */\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 KlingAIVideoProviderOptions = {\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 klingaiVideoProviderOptionsSchema = 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: klingaiVideoProviderOptionsSchema,\n })) as KlingAIVideoProviderOptions | 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: KlingAIVideoProviderOptions | 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: KlingAIVideoProviderOptions | 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: KlingAIVideoProviderOptions | 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: KlingAIVideoProviderOptions | 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.0",
3
+ "version": "3.0.1",
4
4
  "license": "Apache-2.0",
5
5
  "sideEffects": false,
6
6
  "main": "./dist/index.js",
@@ -33,8 +33,8 @@
33
33
  "tsup": "^8",
34
34
  "typescript": "5.8.3",
35
35
  "zod": "3.25.76",
36
- "@vercel/ai-tsconfig": "0.0.0",
37
- "@ai-sdk/test-server": "1.0.3"
36
+ "@ai-sdk/test-server": "1.0.3",
37
+ "@vercel/ai-tsconfig": "0.0.0"
38
38
  },
39
39
  "peerDependencies": {
40
40
  "zod": "^3.25.76 || ^4.1.8"