@ai-sdk/klingai 4.0.0-beta.30 → 4.0.0-beta.32

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,29 @@
1
1
  # @ai-sdk/klingai
2
2
 
3
+ ## 4.0.0-beta.32
4
+
5
+ ### Major Changes
6
+
7
+ - 04e9009: chore: make provider implementations code patterns more consistent, including renaming certain exported symbols
8
+
9
+ For all externally exported symbols that were renamed, the old names continue to work via deprecated aliases.
10
+
11
+ ### Patch Changes
12
+
13
+ - Updated dependencies [08d2129]
14
+ - @ai-sdk/provider-utils@5.0.0-beta.30
15
+
16
+ ## 4.0.0-beta.31
17
+
18
+ ### Patch Changes
19
+
20
+ - 258c093: chore: ensure consistent import handling and avoid import duplicates or cycles
21
+ - Updated dependencies [9bd6512]
22
+ - Updated dependencies [258c093]
23
+ - Updated dependencies [b6783da]
24
+ - @ai-sdk/provider-utils@5.0.0-beta.29
25
+ - @ai-sdk/provider@4.0.0-beta.14
26
+
3
27
  ## 4.0.0-beta.30
4
28
 
5
29
  ### Patch Changes
package/dist/index.d.ts CHANGED
@@ -208,4 +208,6 @@ type KlingAIVideoModelOptions = {
208
208
  [key: string]: unknown;
209
209
  };
210
210
 
211
- export { type KlingAIProvider, type KlingAIProviderSettings, type KlingAIVideoModelId, type KlingAIVideoModelOptions, type KlingAIVideoModelOptions as KlingAIVideoProviderOptions, createKlingAI, klingai };
211
+ declare const VERSION: string;
212
+
213
+ export { type KlingAIProvider, type KlingAIProviderSettings, type KlingAIVideoModelId, type KlingAIVideoModelOptions, type KlingAIVideoModelOptions as KlingAIVideoProviderOptions, VERSION, createKlingAI, klingai };
package/dist/index.js CHANGED
@@ -69,13 +69,11 @@ import {
69
69
  createJsonResponseHandler,
70
70
  delay,
71
71
  getFromApi,
72
- lazySchema,
73
72
  parseProviderOptions,
74
73
  postJsonToApi,
75
- resolve,
76
- zodSchema
74
+ resolve
77
75
  } from "@ai-sdk/provider-utils";
78
- import { z as z2 } from "zod/v4";
76
+ import { z as z3 } from "zod/v4";
79
77
 
80
78
  // src/klingai-error.ts
81
79
  import { createJsonErrorResponseHandler } from "@ai-sdk/provider-utils";
@@ -89,23 +87,9 @@ var klingaiFailedResponseHandler = createJsonErrorResponseHandler({
89
87
  errorToMessage: (data) => data.message
90
88
  });
91
89
 
92
- // src/klingai-video-model.ts
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"
103
- };
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(/\.0$/, "").replace(/\./g, "-");
108
- }
90
+ // src/klingai-video-model-options.ts
91
+ import { lazySchema, zodSchema } from "@ai-sdk/provider-utils";
92
+ import { z as z2 } from "zod/v4";
109
93
  var klingaiVideoModelOptionsSchema = lazySchema(
110
94
  () => zodSchema(
111
95
  z2.object({
@@ -172,6 +156,24 @@ var klingaiVideoModelOptionsSchema = lazySchema(
172
156
  }).passthrough()
173
157
  )
174
158
  );
159
+
160
+ // src/klingai-video-model.ts
161
+ function detectMode(modelId) {
162
+ if (modelId.endsWith("-t2v")) return "t2v";
163
+ if (modelId.endsWith("-i2v")) return "i2v";
164
+ if (modelId.endsWith("-motion-control")) return "motion-control";
165
+ throw new NoSuchModelError({ modelId, modelType: "videoModel" });
166
+ }
167
+ var modeEndpointMap = {
168
+ t2v: "/v1/videos/text2video",
169
+ i2v: "/v1/videos/image2video",
170
+ "motion-control": "/v1/videos/motion-control"
171
+ };
172
+ function getApiModelName(modelId, mode) {
173
+ const suffix = mode === "motion-control" ? "-motion-control" : `-${mode}`;
174
+ const baseName = modelId.slice(0, -suffix.length);
175
+ return baseName.replace(/\.0$/, "").replace(/\./g, "-");
176
+ }
175
177
  var HANDLED_PROVIDER_OPTIONS = /* @__PURE__ */ new Set([
176
178
  "mode",
177
179
  "pollIntervalMs",
@@ -538,44 +540,44 @@ var KlingAIVideoModel = class {
538
540
  }
539
541
  }
540
542
  };
541
- var klingaiCreateTaskSchema = z2.object({
542
- code: z2.number(),
543
- message: z2.string(),
544
- request_id: z2.string().nullish(),
545
- data: z2.object({
546
- task_id: z2.string(),
547
- task_status: z2.string().nullish(),
548
- task_info: z2.object({
549
- external_task_id: z2.string().nullish()
543
+ var klingaiCreateTaskSchema = z3.object({
544
+ code: z3.number(),
545
+ message: z3.string(),
546
+ request_id: z3.string().nullish(),
547
+ data: z3.object({
548
+ task_id: z3.string(),
549
+ task_status: z3.string().nullish(),
550
+ task_info: z3.object({
551
+ external_task_id: z3.string().nullish()
550
552
  }).nullish(),
551
- created_at: z2.number().nullish(),
552
- updated_at: z2.number().nullish()
553
+ created_at: z3.number().nullish(),
554
+ updated_at: z3.number().nullish()
553
555
  }).nullish()
554
556
  });
555
- var klingaiTaskStatusSchema = z2.object({
556
- code: z2.number(),
557
- message: z2.string(),
558
- request_id: z2.string().nullish(),
559
- data: z2.object({
560
- task_id: z2.string(),
561
- task_status: z2.string(),
562
- task_status_msg: z2.string().nullish(),
563
- task_info: z2.object({
564
- external_task_id: z2.string().nullish()
557
+ var klingaiTaskStatusSchema = z3.object({
558
+ code: z3.number(),
559
+ message: z3.string(),
560
+ request_id: z3.string().nullish(),
561
+ data: z3.object({
562
+ task_id: z3.string(),
563
+ task_status: z3.string(),
564
+ task_status_msg: z3.string().nullish(),
565
+ task_info: z3.object({
566
+ external_task_id: z3.string().nullish()
565
567
  }).nullish(),
566
- watermark_info: z2.object({
567
- enabled: z2.boolean().nullish()
568
+ watermark_info: z3.object({
569
+ enabled: z3.boolean().nullish()
568
570
  }).nullish(),
569
- final_unit_deduction: z2.string().nullish(),
570
- created_at: z2.number().nullish(),
571
- updated_at: z2.number().nullish(),
572
- task_result: z2.object({
573
- videos: z2.array(
574
- z2.object({
575
- id: z2.string().nullish(),
576
- url: z2.string().nullish(),
577
- watermark_url: z2.string().nullish(),
578
- duration: z2.string().nullish()
571
+ final_unit_deduction: z3.string().nullish(),
572
+ created_at: z3.number().nullish(),
573
+ updated_at: z3.number().nullish(),
574
+ task_result: z3.object({
575
+ videos: z3.array(
576
+ z3.object({
577
+ id: z3.string().nullish(),
578
+ url: z3.string().nullish(),
579
+ watermark_url: z3.string().nullish(),
580
+ duration: z3.string().nullish()
579
581
  })
580
582
  ).nullish()
581
583
  }).nullish()
@@ -583,7 +585,7 @@ var klingaiTaskStatusSchema = z2.object({
583
585
  });
584
586
 
585
587
  // src/version.ts
586
- var VERSION = "4.0.0-beta.30";
588
+ var VERSION = "4.0.0-beta.32";
587
589
 
588
590
  // src/klingai-provider.ts
589
591
  var defaultBaseURL = "https://api-singapore.klingai.com";
@@ -624,6 +626,7 @@ function createKlingAI(options = {}) {
624
626
  }
625
627
  var klingai = createKlingAI();
626
628
  export {
629
+ VERSION,
627
630
  createKlingAI,
628
631
  klingai
629
632
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/klingai-provider.ts","../src/klingai-auth.ts","../src/klingai-video-model.ts","../src/klingai-error.ts","../src/version.ts"],"sourcesContent":["import {\n type Experimental_VideoModelV4 as VideoModelV4,\n type ProviderV4,\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 ProviderV4 {\n /**\n * Creates a model for video generation.\n */\n video(modelId: KlingAIVideoModelId): VideoModelV4;\n\n /**\n * Creates a model for video generation.\n */\n videoModel(modelId: KlingAIVideoModelId): VideoModelV4;\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): VideoModelV4 =>\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: 'v4' 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_VideoModelV4,\n NoSuchModelError,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertUint8ArrayToBase64,\n createJsonResponseHandler,\n delay,\n type FetchFunction,\n getFromApi,\n lazySchema,\n parseProviderOptions,\n postJsonToApi,\n type Resolvable,\n resolve,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { klingaiFailedResponseHandler } from './klingai-error';\nimport type { KlingAIVideoModelId } from './klingai-video-settings';\n\ntype KlingAIVideoMode = 't2v' | 'i2v' | 'motion-control';\n\n/**\n * Detects the video generation mode from the model ID suffix.\n */\nfunction detectMode(modelId: string): KlingAIVideoMode {\n if (modelId.endsWith('-t2v')) return 't2v';\n if (modelId.endsWith('-i2v')) return 'i2v';\n if (modelId.endsWith('-motion-control')) return 'motion-control';\n throw new NoSuchModelError({ modelId, modelType: 'videoModel' });\n}\n\n/**\n * Maps video generation mode to the KlingAI API endpoint path.\n */\nconst modeEndpointMap: Record<KlingAIVideoMode, string> = {\n t2v: '/v1/videos/text2video',\n i2v: '/v1/videos/image2video',\n 'motion-control': '/v1/videos/motion-control',\n};\n\n/**\n * Derives the KlingAI API `model_name` from the SDK model ID.\n * Strips the mode suffix and converts dots to hyphens.\n *\n * Examples:\n * - 'kling-v2.6-t2v' → 'kling-v2-6'\n * - 'kling-v2.1-master-i2v' → 'kling-v2-1-master'\n * - 'kling-v1-t2v' → 'kling-v1'\n * - 'kling-v3.0-t2v' → 'kling-v3'\n */\nfunction getApiModelName(modelId: string, mode: KlingAIVideoMode): string {\n const suffix = mode === 'motion-control' ? '-motion-control' : `-${mode}`;\n const baseName = modelId.slice(0, -suffix.length);\n return baseName.replace(/\\.0$/, '').replace(/\\./g, '-');\n}\n\n/**\n * Provider-specific options for KlingAI video generation.\n *\n * Not all options are supported by every model version and video mode (T2V, I2V,\n * motion control). See the KlingAI capability map for detailed compatibility:\n * https://app.klingai.com/global/dev/document-api/apiReference/model/skillsMap\n */\nexport type KlingAIVideoModelOptions = {\n /**\n * Video generation mode.\n *\n * - `'std'`: Standard mode — cost-effective.\n * - `'pro'`: Professional mode — higher quality but longer generation time.\n */\n mode?: 'std' | 'pro' | null;\n\n /**\n * Polling interval in milliseconds for checking task status.\n * Default: 5000 (5 seconds).\n */\n pollIntervalMs?: number | null;\n\n /**\n * Maximum time in milliseconds to wait for video generation.\n * Default: 600000 (10 minutes).\n */\n pollTimeoutMs?: number | null;\n\n // --- T2V and I2V options ---\n\n /**\n * Negative text prompt to specify what to avoid.\n * Cannot exceed 2500 characters.\n */\n negativePrompt?: string | null;\n\n /**\n * Whether to generate sound simultaneously when generating videos.\n * Only V2.6 and subsequent versions support this parameter,\n * and requires `mode: 'pro'`.\n */\n sound?: 'on' | 'off' | null;\n\n /**\n * Flexibility in video generation. The higher the value, the lower the\n * model's flexibility, and the stronger the relevance to the user's prompt.\n * Value range: [0, 1]. Kling-v2.x models do not support this parameter.\n */\n cfgScale?: number | null;\n\n /**\n * Camera movement control. If not specified, the model will intelligently\n * match based on the input text/images.\n */\n cameraControl?: {\n type:\n | 'simple'\n | 'down_back'\n | 'forward_up'\n | 'right_turn_forward'\n | 'left_turn_forward';\n config?: {\n horizontal?: number | null;\n vertical?: number | null;\n pan?: number | null;\n tilt?: number | null;\n roll?: number | null;\n zoom?: number | null;\n } | null;\n } | null;\n\n // --- I2V-specific options ---\n\n /**\n * End frame image for I2V start+end frame control.\n * Supports image URL or raw base64-encoded image data.\n * Requires `mode: 'pro'` for most models.\n */\n imageTail?: string | null;\n\n /**\n * Static brush mask image for I2V motion brush.\n * Supports image URL or raw base64-encoded image data.\n */\n staticMask?: string | null;\n\n /**\n * Dynamic brush configurations for I2V motion brush.\n * Up to 6 groups, each with a mask and motion trajectories.\n */\n dynamicMasks?: Array<{\n mask: string;\n trajectories: Array<{ x: number; y: number }>;\n }> | null;\n\n // --- v3.0 multi-shot options (T2V and I2V) ---\n\n /**\n * Enable multi-shot video generation (Kling v3.0+).\n * When true, the video is split into up to 6 storyboard shots\n * with individual prompts and durations.\n *\n * When multiShot is true with shotType 'customize', multiPrompt is required.\n * When multiShot is true, the main prompt parameter is ignored by the API.\n */\n multiShot?: boolean | null;\n\n /**\n * Storyboard method for multi-shot video generation (Kling v3.0+).\n * Required when multiShot is true.\n *\n * - `'customize'`: User-defined shots via multiPrompt.\n * - `'intelligence'`: Model auto-segments based on the main prompt.\n */\n shotType?: 'customize' | 'intelligence' | null;\n\n /**\n * Per-shot details for multi-shot video generation (Kling v3.0+).\n * Required when multiShot is true and shotType is 'customize'.\n *\n * Up to 6 shots. Each shot has an index, prompt (max 512 chars),\n * and duration in seconds. Shot durations must sum to the total duration.\n */\n multiPrompt?: Array<{\n index: number;\n prompt: string;\n duration: string;\n }> | null;\n\n // --- v3.0 element control (I2V and Motion Control) ---\n\n /**\n * Reference elements for element control (Kling v3.0+).\n * Supports video character elements and multi-image elements.\n *\n * - I2V: Up to 3 reference elements. Cannot coexist with voiceList.\n * - Motion Control: Currently only 1 element supported.\n * When referencing an element, the generated video can only\n * refer to the orientation of the person in the video.\n */\n elementList?: Array<{\n element_id: number;\n }> | null;\n\n // --- v3.0 voice control (T2V and I2V) ---\n\n /**\n * Voice references for voice control (Kling v3.0+).\n * Up to 2 voice references. Referenced via `<<<voice_1>>>` template\n * syntax in the prompt.\n *\n * When voiceList is used and the prompt references voice IDs,\n * sound must be set to 'on'.\n * Cannot coexist with elementList on the I2V endpoint.\n */\n voiceList?: Array<{\n voice_id: string;\n }> | null;\n\n // --- Shared options ---\n\n /**\n * Whether to generate watermarked results simultaneously.\n */\n watermarkEnabled?: boolean | null;\n\n // --- Motion-control-specific options ---\n\n /**\n * URL of the reference video. The character actions in the generated video\n * are consistent with the reference video.\n *\n * Supports .mp4/.mov, max 100MB, side lengths 340px–3850px,\n * duration 3–30 seconds (depends on `characterOrientation`).\n */\n videoUrl?: string | null;\n\n /**\n * Orientation of the characters in the generated video.\n *\n * - `'image'`: Same orientation as the person in the image.\n * Reference video duration max 10 seconds.\n * - `'video'`: Same orientation as the person in the video.\n * Reference video duration max 30 seconds.\n */\n characterOrientation?: 'image' | 'video' | null;\n\n /**\n * Whether to keep the original sound of the reference video.\n * Default: `'yes'`.\n */\n keepOriginalSound?: 'yes' | 'no' | null;\n\n [key: string]: unknown; // For passthrough\n};\n\nconst klingaiVideoModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z\n .object({\n mode: z.enum(['std', 'pro']).nullish(),\n pollIntervalMs: z.number().positive().nullish(),\n pollTimeoutMs: z.number().positive().nullish(),\n // T2V and I2V\n negativePrompt: z.string().nullish(),\n sound: z.enum(['on', 'off']).nullish(),\n cfgScale: z.number().nullish(),\n cameraControl: z\n .object({\n type: z.enum([\n 'simple',\n 'down_back',\n 'forward_up',\n 'right_turn_forward',\n 'left_turn_forward',\n ]),\n config: z\n .object({\n horizontal: z.number().nullish(),\n vertical: z.number().nullish(),\n pan: z.number().nullish(),\n tilt: z.number().nullish(),\n roll: z.number().nullish(),\n zoom: z.number().nullish(),\n })\n .nullish(),\n })\n .nullish(),\n // v3.0 multi-shot\n multiShot: z.boolean().nullish(),\n shotType: z.enum(['customize', 'intelligence']).nullish(),\n multiPrompt: z\n .array(\n z.object({\n index: z.number(),\n prompt: z.string(),\n duration: z.string(),\n }),\n )\n .nullish(),\n // v3.0 element control (I2V)\n elementList: z\n .array(\n z.object({\n element_id: z.number(),\n }),\n )\n .nullish(),\n // v3.0 voice control\n voiceList: z\n .array(\n z.object({\n voice_id: z.string(),\n }),\n )\n .nullish(),\n // I2V-specific\n imageTail: z.string().nullish(),\n staticMask: z.string().nullish(),\n dynamicMasks: z\n .array(\n z.object({\n mask: z.string(),\n trajectories: z.array(z.object({ x: z.number(), y: z.number() })),\n }),\n )\n .nullish(),\n // Motion-control-specific\n videoUrl: z.string().nullish(),\n characterOrientation: z.enum(['image', 'video']).nullish(),\n keepOriginalSound: z.enum(['yes', 'no']).nullish(),\n watermarkEnabled: z.boolean().nullish(),\n })\n .passthrough(),\n ),\n);\n\n/**\n * Known provider option keys that are handled explicitly and should not be\n * passed through to the API body.\n */\nconst HANDLED_PROVIDER_OPTIONS = new Set([\n 'mode',\n 'pollIntervalMs',\n 'pollTimeoutMs',\n 'negativePrompt',\n 'sound',\n 'cfgScale',\n 'cameraControl',\n 'multiShot',\n 'shotType',\n 'multiPrompt',\n 'elementList',\n 'voiceList',\n 'imageTail',\n 'staticMask',\n 'dynamicMasks',\n 'videoUrl',\n 'characterOrientation',\n 'keepOriginalSound',\n 'watermarkEnabled',\n]);\n\ninterface KlingAIVideoModelConfig {\n provider: string;\n baseURL: string;\n headers?: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class KlingAIVideoModel implements Experimental_VideoModelV4 {\n readonly specificationVersion = 'v4';\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_VideoModelV4['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<Experimental_VideoModelV4['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const warnings: SharedV4Warning[] = [];\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_VideoModelV4['doGenerate']>[0],\n klingaiOptions: KlingAIVideoModelOptions | undefined,\n warnings: SharedV4Warning[],\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 if (klingaiOptions?.watermarkEnabled != null) {\n body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };\n }\n\n // Image is not supported for T2V\n if (options.image != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'image',\n details:\n 'KlingAI text-to-video does not support image input. Use an image-to-video model instead.',\n });\n }\n\n this.addPassthroughOptions(body, klingaiOptions);\n\n return body;\n }\n\n private buildI2VBody(\n options: Parameters<Experimental_VideoModelV4['doGenerate']>[0],\n klingaiOptions: KlingAIVideoModelOptions | undefined,\n warnings: SharedV4Warning[],\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 if (klingaiOptions?.watermarkEnabled != null) {\n body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };\n }\n\n // Map standard SDK duration (number → string)\n if (options.duration != null) {\n body.duration = String(options.duration);\n }\n\n // aspectRatio is not supported for I2V (determined by input image)\n if (options.aspectRatio != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details:\n 'KlingAI image-to-video does not support aspectRatio. ' +\n 'The output dimensions are determined by the input image.',\n });\n }\n\n this.addPassthroughOptions(body, klingaiOptions);\n\n return body;\n }\n\n private buildMotionControlBody(\n options: Parameters<Experimental_VideoModelV4['doGenerate']>[0],\n klingaiOptions: KlingAIVideoModelOptions | undefined,\n warnings: SharedV4Warning[],\n ): Record<string, unknown> {\n if (\n !klingaiOptions?.videoUrl ||\n !klingaiOptions?.characterOrientation ||\n !klingaiOptions?.mode\n ) {\n throw new AISDKError({\n name: 'KLINGAI_VIDEO_MISSING_OPTIONS',\n message:\n 'KlingAI Motion Control requires providerOptions.klingai with videoUrl, characterOrientation, and mode.',\n });\n }\n\n const mode = 'motion-control' as const;\n const body: Record<string, unknown> = {\n model_name: getApiModelName(this.modelId, mode),\n video_url: klingaiOptions.videoUrl,\n character_orientation: klingaiOptions.characterOrientation,\n mode: klingaiOptions.mode,\n };\n\n if (options.prompt != null) {\n body.prompt = options.prompt;\n }\n\n // Map standard SDK image option to KlingAI's image_url\n if (options.image != null) {\n if (options.image.type === 'url') {\n body.image_url = options.image.url;\n } else {\n body.image_url =\n typeof options.image.data === 'string'\n ? options.image.data\n : convertUint8ArrayToBase64(options.image.data);\n }\n }\n\n if (klingaiOptions.keepOriginalSound != null) {\n body.keep_original_sound = klingaiOptions.keepOriginalSound;\n }\n\n if (klingaiOptions.watermarkEnabled != null) {\n body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };\n }\n\n // v3.0 element control\n if (klingaiOptions.elementList != null) {\n body.element_list = klingaiOptions.elementList;\n }\n\n // Warn about unsupported standard options for motion control\n if (options.aspectRatio) {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details:\n 'KlingAI Motion Control does not support aspectRatio. ' +\n 'The output dimensions are determined by the reference image/video.',\n });\n }\n\n if (options.duration) {\n warnings.push({\n type: 'unsupported',\n feature: 'duration',\n details:\n 'KlingAI Motion Control does not support custom duration. ' +\n 'The output duration matches the reference video duration.',\n });\n }\n\n this.addPassthroughOptions(body, klingaiOptions);\n\n return body;\n }\n\n private addPassthroughOptions(\n body: Record<string, unknown>,\n klingaiOptions: KlingAIVideoModelOptions | undefined,\n ): void {\n if (!klingaiOptions) return;\n for (const [key, value] of Object.entries(klingaiOptions)) {\n if (!HANDLED_PROVIDER_OPTIONS.has(key)) {\n body[key] = value;\n }\n }\n }\n}\n\n// Response schema for task creation (POST)\nconst klingaiCreateTaskSchema = z.object({\n code: z.number(),\n message: z.string(),\n request_id: z.string().nullish(),\n data: z\n .object({\n task_id: z.string(),\n task_status: z.string().nullish(),\n task_info: z\n .object({\n external_task_id: z.string().nullish(),\n })\n .nullish(),\n created_at: z.number().nullish(),\n updated_at: z.number().nullish(),\n })\n .nullish(),\n});\n\n// Response schema for task status query (GET)\nconst klingaiTaskStatusSchema = z.object({\n code: z.number(),\n message: z.string(),\n request_id: z.string().nullish(),\n data: z\n .object({\n task_id: z.string(),\n task_status: z.string(),\n task_status_msg: z.string().nullish(),\n task_info: z\n .object({\n external_task_id: z.string().nullish(),\n })\n .nullish(),\n watermark_info: z\n .object({\n enabled: z.boolean().nullish(),\n })\n .nullish(),\n final_unit_deduction: z.string().nullish(),\n created_at: z.number().nullish(),\n updated_at: z.number().nullish(),\n task_result: z\n .object({\n videos: z\n .array(\n z.object({\n id: z.string().nullish(),\n url: z.string().nullish(),\n watermark_url: z.string().nullish(),\n duration: z.string().nullish(),\n }),\n )\n .nullish(),\n })\n .nullish(),\n })\n .nullish(),\n});\n\ntype KlingAITaskResponse = z.infer<typeof klingaiTaskStatusSchema>;\n","import { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport const klingaiErrorDataSchema = z.object({\n code: z.number(),\n message: z.string(),\n});\n\nexport type KlingAIErrorData = z.infer<typeof klingaiErrorDataSchema>;\n\nexport const klingaiFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: klingaiErrorDataSchema,\n errorToMessage: data => data.message,\n});\n","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/klingai-video-model-options.ts","../src/version.ts"],"sourcesContent":["import {\n NoSuchModelError,\n type Experimental_VideoModelV4 as VideoModelV4,\n type ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\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 ProviderV4 {\n /**\n * Creates a model for video generation.\n */\n video(modelId: KlingAIVideoModelId): VideoModelV4;\n\n /**\n * Creates a model for video generation.\n */\n videoModel(modelId: KlingAIVideoModelId): VideoModelV4;\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): VideoModelV4 =>\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: 'v4' 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 NoSuchModelError,\n type Experimental_VideoModelV4,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertUint8ArrayToBase64,\n createJsonResponseHandler,\n delay,\n getFromApi,\n parseProviderOptions,\n postJsonToApi,\n resolve,\n type FetchFunction,\n type Resolvable,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { klingaiFailedResponseHandler } from './klingai-error';\nimport {\n klingaiVideoModelOptionsSchema,\n type KlingAIVideoModelOptions,\n} from './klingai-video-model-options';\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 * 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_VideoModelV4 {\n readonly specificationVersion = 'v4';\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_VideoModelV4['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<Experimental_VideoModelV4['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const warnings: SharedV4Warning[] = [];\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_VideoModelV4['doGenerate']>[0],\n klingaiOptions: KlingAIVideoModelOptions | undefined,\n warnings: SharedV4Warning[],\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 if (klingaiOptions?.watermarkEnabled != null) {\n body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };\n }\n\n // Image is not supported for T2V\n if (options.image != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'image',\n details:\n 'KlingAI text-to-video does not support image input. Use an image-to-video model instead.',\n });\n }\n\n this.addPassthroughOptions(body, klingaiOptions);\n\n return body;\n }\n\n private buildI2VBody(\n options: Parameters<Experimental_VideoModelV4['doGenerate']>[0],\n klingaiOptions: KlingAIVideoModelOptions | undefined,\n warnings: SharedV4Warning[],\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 if (klingaiOptions?.watermarkEnabled != null) {\n body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };\n }\n\n // Map standard SDK duration (number → string)\n if (options.duration != null) {\n body.duration = String(options.duration);\n }\n\n // aspectRatio is not supported for I2V (determined by input image)\n if (options.aspectRatio != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details:\n 'KlingAI image-to-video does not support aspectRatio. ' +\n 'The output dimensions are determined by the input image.',\n });\n }\n\n this.addPassthroughOptions(body, klingaiOptions);\n\n return body;\n }\n\n private buildMotionControlBody(\n options: Parameters<Experimental_VideoModelV4['doGenerate']>[0],\n klingaiOptions: KlingAIVideoModelOptions | undefined,\n warnings: SharedV4Warning[],\n ): Record<string, unknown> {\n if (\n !klingaiOptions?.videoUrl ||\n !klingaiOptions?.characterOrientation ||\n !klingaiOptions?.mode\n ) {\n throw new AISDKError({\n name: 'KLINGAI_VIDEO_MISSING_OPTIONS',\n message:\n 'KlingAI Motion Control requires providerOptions.klingai with videoUrl, characterOrientation, and mode.',\n });\n }\n\n const mode = 'motion-control' as const;\n const body: Record<string, unknown> = {\n model_name: getApiModelName(this.modelId, mode),\n video_url: klingaiOptions.videoUrl,\n character_orientation: klingaiOptions.characterOrientation,\n mode: klingaiOptions.mode,\n };\n\n if (options.prompt != null) {\n body.prompt = options.prompt;\n }\n\n // Map standard SDK image option to KlingAI's image_url\n if (options.image != null) {\n if (options.image.type === 'url') {\n body.image_url = options.image.url;\n } else {\n body.image_url =\n typeof options.image.data === 'string'\n ? options.image.data\n : convertUint8ArrayToBase64(options.image.data);\n }\n }\n\n if (klingaiOptions.keepOriginalSound != null) {\n body.keep_original_sound = klingaiOptions.keepOriginalSound;\n }\n\n if (klingaiOptions.watermarkEnabled != null) {\n body.watermark_info = { enabled: klingaiOptions.watermarkEnabled };\n }\n\n // v3.0 element control\n if (klingaiOptions.elementList != null) {\n body.element_list = klingaiOptions.elementList;\n }\n\n // Warn about unsupported standard options for motion control\n if (options.aspectRatio) {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details:\n 'KlingAI Motion Control does not support aspectRatio. ' +\n 'The output dimensions are determined by the reference image/video.',\n });\n }\n\n if (options.duration) {\n warnings.push({\n type: 'unsupported',\n feature: 'duration',\n details:\n 'KlingAI Motion Control does not support custom duration. ' +\n 'The output duration matches the reference video duration.',\n });\n }\n\n this.addPassthroughOptions(body, klingaiOptions);\n\n return body;\n }\n\n private addPassthroughOptions(\n body: Record<string, unknown>,\n klingaiOptions: KlingAIVideoModelOptions | undefined,\n ): void {\n if (!klingaiOptions) return;\n for (const [key, value] of Object.entries(klingaiOptions)) {\n if (!HANDLED_PROVIDER_OPTIONS.has(key)) {\n body[key] = value;\n }\n }\n }\n}\n\n// Response schema for task creation (POST)\nconst klingaiCreateTaskSchema = z.object({\n code: z.number(),\n message: z.string(),\n request_id: z.string().nullish(),\n data: z\n .object({\n task_id: z.string(),\n task_status: z.string().nullish(),\n task_info: z\n .object({\n external_task_id: z.string().nullish(),\n })\n .nullish(),\n created_at: z.number().nullish(),\n updated_at: z.number().nullish(),\n })\n .nullish(),\n});\n\n// Response schema for task status query (GET)\nconst klingaiTaskStatusSchema = z.object({\n code: z.number(),\n message: z.string(),\n request_id: z.string().nullish(),\n data: z\n .object({\n task_id: z.string(),\n task_status: z.string(),\n task_status_msg: z.string().nullish(),\n task_info: z\n .object({\n external_task_id: z.string().nullish(),\n })\n .nullish(),\n watermark_info: z\n .object({\n enabled: z.boolean().nullish(),\n })\n .nullish(),\n final_unit_deduction: z.string().nullish(),\n created_at: z.number().nullish(),\n updated_at: z.number().nullish(),\n task_result: z\n .object({\n videos: z\n .array(\n z.object({\n id: z.string().nullish(),\n url: z.string().nullish(),\n watermark_url: z.string().nullish(),\n duration: z.string().nullish(),\n }),\n )\n .nullish(),\n })\n .nullish(),\n })\n .nullish(),\n});\n\ntype KlingAITaskResponse = z.infer<typeof klingaiTaskStatusSchema>;\n","import { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport const klingaiErrorDataSchema = z.object({\n code: z.number(),\n message: z.string(),\n});\n\nexport type KlingAIErrorData = z.infer<typeof klingaiErrorDataSchema>;\n\nexport const klingaiFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: klingaiErrorDataSchema,\n errorToMessage: data => data.message,\n});\n","import { lazySchema, zodSchema } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n/**\n * Provider-specific options for KlingAI video generation.\n *\n * Not all options are supported by every model version and video mode (T2V, I2V,\n * motion control). See the KlingAI capability map for detailed compatibility:\n * https://app.klingai.com/global/dev/document-api/apiReference/model/skillsMap\n */\nexport type KlingAIVideoModelOptions = {\n /**\n * Video generation mode.\n *\n * - `'std'`: Standard mode — cost-effective.\n * - `'pro'`: Professional mode — higher quality but longer generation time.\n */\n mode?: 'std' | 'pro' | null;\n\n /**\n * Polling interval in milliseconds for checking task status.\n * Default: 5000 (5 seconds).\n */\n pollIntervalMs?: number | null;\n\n /**\n * Maximum time in milliseconds to wait for video generation.\n * Default: 600000 (10 minutes).\n */\n pollTimeoutMs?: number | null;\n\n // --- T2V and I2V options ---\n\n /**\n * Negative text prompt to specify what to avoid.\n * Cannot exceed 2500 characters.\n */\n negativePrompt?: string | null;\n\n /**\n * Whether to generate sound simultaneously when generating videos.\n * Only V2.6 and subsequent versions support this parameter,\n * and requires `mode: 'pro'`.\n */\n sound?: 'on' | 'off' | null;\n\n /**\n * Flexibility in video generation. The higher the value, the lower the\n * model's flexibility, and the stronger the relevance to the user's prompt.\n * Value range: [0, 1]. Kling-v2.x models do not support this parameter.\n */\n cfgScale?: number | null;\n\n /**\n * Camera movement control. If not specified, the model will intelligently\n * match based on the input text/images.\n */\n cameraControl?: {\n type:\n | 'simple'\n | 'down_back'\n | 'forward_up'\n | 'right_turn_forward'\n | 'left_turn_forward';\n config?: {\n horizontal?: number | null;\n vertical?: number | null;\n pan?: number | null;\n tilt?: number | null;\n roll?: number | null;\n zoom?: number | null;\n } | null;\n } | null;\n\n // --- I2V-specific options ---\n\n /**\n * End frame image for I2V start+end frame control.\n * Supports image URL or raw base64-encoded image data.\n * Requires `mode: 'pro'` for most models.\n */\n imageTail?: string | null;\n\n /**\n * Static brush mask image for I2V motion brush.\n * Supports image URL or raw base64-encoded image data.\n */\n staticMask?: string | null;\n\n /**\n * Dynamic brush configurations for I2V motion brush.\n * Up to 6 groups, each with a mask and motion trajectories.\n */\n dynamicMasks?: Array<{\n mask: string;\n trajectories: Array<{ x: number; y: number }>;\n }> | null;\n\n // --- v3.0 multi-shot options (T2V and I2V) ---\n\n /**\n * Enable multi-shot video generation (Kling v3.0+).\n * When true, the video is split into up to 6 storyboard shots\n * with individual prompts and durations.\n *\n * When multiShot is true with shotType 'customize', multiPrompt is required.\n * When multiShot is true, the main prompt parameter is ignored by the API.\n */\n multiShot?: boolean | null;\n\n /**\n * Storyboard method for multi-shot video generation (Kling v3.0+).\n * Required when multiShot is true.\n *\n * - `'customize'`: User-defined shots via multiPrompt.\n * - `'intelligence'`: Model auto-segments based on the main prompt.\n */\n shotType?: 'customize' | 'intelligence' | null;\n\n /**\n * Per-shot details for multi-shot video generation (Kling v3.0+).\n * Required when multiShot is true and shotType is 'customize'.\n *\n * Up to 6 shots. Each shot has an index, prompt (max 512 chars),\n * and duration in seconds. Shot durations must sum to the total duration.\n */\n multiPrompt?: Array<{\n index: number;\n prompt: string;\n duration: string;\n }> | null;\n\n // --- v3.0 element control (I2V and Motion Control) ---\n\n /**\n * Reference elements for element control (Kling v3.0+).\n * Supports video character elements and multi-image elements.\n *\n * - I2V: Up to 3 reference elements. Cannot coexist with voiceList.\n * - Motion Control: Currently only 1 element supported.\n * When referencing an element, the generated video can only\n * refer to the orientation of the person in the video.\n */\n elementList?: Array<{\n element_id: number;\n }> | null;\n\n // --- v3.0 voice control (T2V and I2V) ---\n\n /**\n * Voice references for voice control (Kling v3.0+).\n * Up to 2 voice references. Referenced via `<<<voice_1>>>` template\n * syntax in the prompt.\n *\n * When voiceList is used and the prompt references voice IDs,\n * sound must be set to 'on'.\n * Cannot coexist with elementList on the I2V endpoint.\n */\n voiceList?: Array<{\n voice_id: string;\n }> | null;\n\n // --- Shared options ---\n\n /**\n * Whether to generate watermarked results simultaneously.\n */\n watermarkEnabled?: boolean | null;\n\n // --- Motion-control-specific options ---\n\n /**\n * URL of the reference video. The character actions in the generated video\n * are consistent with the reference video.\n *\n * Supports .mp4/.mov, max 100MB, side lengths 340px–3850px,\n * duration 3–30 seconds (depends on `characterOrientation`).\n */\n videoUrl?: string | null;\n\n /**\n * Orientation of the characters in the generated video.\n *\n * - `'image'`: Same orientation as the person in the image.\n * Reference video duration max 10 seconds.\n * - `'video'`: Same orientation as the person in the video.\n * Reference video duration max 30 seconds.\n */\n characterOrientation?: 'image' | 'video' | null;\n\n /**\n * Whether to keep the original sound of the reference video.\n * Default: `'yes'`.\n */\n keepOriginalSound?: 'yes' | 'no' | null;\n\n [key: string]: unknown; // For passthrough\n};\n\nexport const 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","declare const __PACKAGE_VERSION__: string;\n\nexport const VERSION = __PACKAGE_VERSION__;\n"],"mappings":"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","names":["NoSuchModelError","z","z","z","NoSuchModelError"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/klingai",
3
- "version": "4.0.0-beta.30",
3
+ "version": "4.0.0-beta.32",
4
4
  "type": "module",
5
5
  "license": "Apache-2.0",
6
6
  "sideEffects": false,
@@ -25,15 +25,15 @@
25
25
  }
26
26
  },
27
27
  "dependencies": {
28
- "@ai-sdk/provider": "4.0.0-beta.13",
29
- "@ai-sdk/provider-utils": "5.0.0-beta.28"
28
+ "@ai-sdk/provider": "4.0.0-beta.14",
29
+ "@ai-sdk/provider-utils": "5.0.0-beta.30"
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": "2.0.0-beta.2",
36
+ "@ai-sdk/test-server": "2.0.0-beta.3",
37
37
  "@vercel/ai-tsconfig": "0.0.0"
38
38
  },
39
39
  "peerDependencies": {
package/src/index.ts CHANGED
@@ -8,4 +8,5 @@ export type {
8
8
  KlingAIVideoModelOptions,
9
9
  /** @deprecated Use `KlingAIVideoModelOptions` instead. */
10
10
  KlingAIVideoModelOptions as KlingAIVideoProviderOptions,
11
- } from './klingai-video-model';
11
+ } from './klingai-video-model-options';
12
+ export { VERSION } from './version';
@@ -1,12 +1,12 @@
1
1
  import {
2
+ NoSuchModelError,
2
3
  type Experimental_VideoModelV4 as VideoModelV4,
3
4
  type ProviderV4,
4
- NoSuchModelError,
5
5
  } from '@ai-sdk/provider';
6
6
  import {
7
- type FetchFunction,
8
7
  withoutTrailingSlash,
9
8
  withUserAgentSuffix,
9
+ type FetchFunction,
10
10
  } from '@ai-sdk/provider-utils';
11
11
  import { generateKlingAIAuthToken } from './klingai-auth';
12
12
  import { KlingAIVideoModel } from './klingai-video-model';
@@ -0,0 +1,279 @@
1
+ import { lazySchema, zodSchema } from '@ai-sdk/provider-utils';
2
+ import { z } from 'zod/v4';
3
+
4
+ /**
5
+ * Provider-specific options for KlingAI video generation.
6
+ *
7
+ * Not all options are supported by every model version and video mode (T2V, I2V,
8
+ * motion control). See the KlingAI capability map for detailed compatibility:
9
+ * https://app.klingai.com/global/dev/document-api/apiReference/model/skillsMap
10
+ */
11
+ export type KlingAIVideoModelOptions = {
12
+ /**
13
+ * Video generation mode.
14
+ *
15
+ * - `'std'`: Standard mode — cost-effective.
16
+ * - `'pro'`: Professional mode — higher quality but longer generation time.
17
+ */
18
+ mode?: 'std' | 'pro' | null;
19
+
20
+ /**
21
+ * Polling interval in milliseconds for checking task status.
22
+ * Default: 5000 (5 seconds).
23
+ */
24
+ pollIntervalMs?: number | null;
25
+
26
+ /**
27
+ * Maximum time in milliseconds to wait for video generation.
28
+ * Default: 600000 (10 minutes).
29
+ */
30
+ pollTimeoutMs?: number | null;
31
+
32
+ // --- T2V and I2V options ---
33
+
34
+ /**
35
+ * Negative text prompt to specify what to avoid.
36
+ * Cannot exceed 2500 characters.
37
+ */
38
+ negativePrompt?: string | null;
39
+
40
+ /**
41
+ * Whether to generate sound simultaneously when generating videos.
42
+ * Only V2.6 and subsequent versions support this parameter,
43
+ * and requires `mode: 'pro'`.
44
+ */
45
+ sound?: 'on' | 'off' | null;
46
+
47
+ /**
48
+ * Flexibility in video generation. The higher the value, the lower the
49
+ * model's flexibility, and the stronger the relevance to the user's prompt.
50
+ * Value range: [0, 1]. Kling-v2.x models do not support this parameter.
51
+ */
52
+ cfgScale?: number | null;
53
+
54
+ /**
55
+ * Camera movement control. If not specified, the model will intelligently
56
+ * match based on the input text/images.
57
+ */
58
+ cameraControl?: {
59
+ type:
60
+ | 'simple'
61
+ | 'down_back'
62
+ | 'forward_up'
63
+ | 'right_turn_forward'
64
+ | 'left_turn_forward';
65
+ config?: {
66
+ horizontal?: number | null;
67
+ vertical?: number | null;
68
+ pan?: number | null;
69
+ tilt?: number | null;
70
+ roll?: number | null;
71
+ zoom?: number | null;
72
+ } | null;
73
+ } | null;
74
+
75
+ // --- I2V-specific options ---
76
+
77
+ /**
78
+ * End frame image for I2V start+end frame control.
79
+ * Supports image URL or raw base64-encoded image data.
80
+ * Requires `mode: 'pro'` for most models.
81
+ */
82
+ imageTail?: string | null;
83
+
84
+ /**
85
+ * Static brush mask image for I2V motion brush.
86
+ * Supports image URL or raw base64-encoded image data.
87
+ */
88
+ staticMask?: string | null;
89
+
90
+ /**
91
+ * Dynamic brush configurations for I2V motion brush.
92
+ * Up to 6 groups, each with a mask and motion trajectories.
93
+ */
94
+ dynamicMasks?: Array<{
95
+ mask: string;
96
+ trajectories: Array<{ x: number; y: number }>;
97
+ }> | null;
98
+
99
+ // --- v3.0 multi-shot options (T2V and I2V) ---
100
+
101
+ /**
102
+ * Enable multi-shot video generation (Kling v3.0+).
103
+ * When true, the video is split into up to 6 storyboard shots
104
+ * with individual prompts and durations.
105
+ *
106
+ * When multiShot is true with shotType 'customize', multiPrompt is required.
107
+ * When multiShot is true, the main prompt parameter is ignored by the API.
108
+ */
109
+ multiShot?: boolean | null;
110
+
111
+ /**
112
+ * Storyboard method for multi-shot video generation (Kling v3.0+).
113
+ * Required when multiShot is true.
114
+ *
115
+ * - `'customize'`: User-defined shots via multiPrompt.
116
+ * - `'intelligence'`: Model auto-segments based on the main prompt.
117
+ */
118
+ shotType?: 'customize' | 'intelligence' | null;
119
+
120
+ /**
121
+ * Per-shot details for multi-shot video generation (Kling v3.0+).
122
+ * Required when multiShot is true and shotType is 'customize'.
123
+ *
124
+ * Up to 6 shots. Each shot has an index, prompt (max 512 chars),
125
+ * and duration in seconds. Shot durations must sum to the total duration.
126
+ */
127
+ multiPrompt?: Array<{
128
+ index: number;
129
+ prompt: string;
130
+ duration: string;
131
+ }> | null;
132
+
133
+ // --- v3.0 element control (I2V and Motion Control) ---
134
+
135
+ /**
136
+ * Reference elements for element control (Kling v3.0+).
137
+ * Supports video character elements and multi-image elements.
138
+ *
139
+ * - I2V: Up to 3 reference elements. Cannot coexist with voiceList.
140
+ * - Motion Control: Currently only 1 element supported.
141
+ * When referencing an element, the generated video can only
142
+ * refer to the orientation of the person in the video.
143
+ */
144
+ elementList?: Array<{
145
+ element_id: number;
146
+ }> | null;
147
+
148
+ // --- v3.0 voice control (T2V and I2V) ---
149
+
150
+ /**
151
+ * Voice references for voice control (Kling v3.0+).
152
+ * Up to 2 voice references. Referenced via `<<<voice_1>>>` template
153
+ * syntax in the prompt.
154
+ *
155
+ * When voiceList is used and the prompt references voice IDs,
156
+ * sound must be set to 'on'.
157
+ * Cannot coexist with elementList on the I2V endpoint.
158
+ */
159
+ voiceList?: Array<{
160
+ voice_id: string;
161
+ }> | null;
162
+
163
+ // --- Shared options ---
164
+
165
+ /**
166
+ * Whether to generate watermarked results simultaneously.
167
+ */
168
+ watermarkEnabled?: boolean | null;
169
+
170
+ // --- Motion-control-specific options ---
171
+
172
+ /**
173
+ * URL of the reference video. The character actions in the generated video
174
+ * are consistent with the reference video.
175
+ *
176
+ * Supports .mp4/.mov, max 100MB, side lengths 340px–3850px,
177
+ * duration 3–30 seconds (depends on `characterOrientation`).
178
+ */
179
+ videoUrl?: string | null;
180
+
181
+ /**
182
+ * Orientation of the characters in the generated video.
183
+ *
184
+ * - `'image'`: Same orientation as the person in the image.
185
+ * Reference video duration max 10 seconds.
186
+ * - `'video'`: Same orientation as the person in the video.
187
+ * Reference video duration max 30 seconds.
188
+ */
189
+ characterOrientation?: 'image' | 'video' | null;
190
+
191
+ /**
192
+ * Whether to keep the original sound of the reference video.
193
+ * Default: `'yes'`.
194
+ */
195
+ keepOriginalSound?: 'yes' | 'no' | null;
196
+
197
+ [key: string]: unknown; // For passthrough
198
+ };
199
+
200
+ export const klingaiVideoModelOptionsSchema = lazySchema(() =>
201
+ zodSchema(
202
+ z
203
+ .object({
204
+ mode: z.enum(['std', 'pro']).nullish(),
205
+ pollIntervalMs: z.number().positive().nullish(),
206
+ pollTimeoutMs: z.number().positive().nullish(),
207
+ // T2V and I2V
208
+ negativePrompt: z.string().nullish(),
209
+ sound: z.enum(['on', 'off']).nullish(),
210
+ cfgScale: z.number().nullish(),
211
+ cameraControl: z
212
+ .object({
213
+ type: z.enum([
214
+ 'simple',
215
+ 'down_back',
216
+ 'forward_up',
217
+ 'right_turn_forward',
218
+ 'left_turn_forward',
219
+ ]),
220
+ config: z
221
+ .object({
222
+ horizontal: z.number().nullish(),
223
+ vertical: z.number().nullish(),
224
+ pan: z.number().nullish(),
225
+ tilt: z.number().nullish(),
226
+ roll: z.number().nullish(),
227
+ zoom: z.number().nullish(),
228
+ })
229
+ .nullish(),
230
+ })
231
+ .nullish(),
232
+ // v3.0 multi-shot
233
+ multiShot: z.boolean().nullish(),
234
+ shotType: z.enum(['customize', 'intelligence']).nullish(),
235
+ multiPrompt: z
236
+ .array(
237
+ z.object({
238
+ index: z.number(),
239
+ prompt: z.string(),
240
+ duration: z.string(),
241
+ }),
242
+ )
243
+ .nullish(),
244
+ // v3.0 element control (I2V)
245
+ elementList: z
246
+ .array(
247
+ z.object({
248
+ element_id: z.number(),
249
+ }),
250
+ )
251
+ .nullish(),
252
+ // v3.0 voice control
253
+ voiceList: z
254
+ .array(
255
+ z.object({
256
+ voice_id: z.string(),
257
+ }),
258
+ )
259
+ .nullish(),
260
+ // I2V-specific
261
+ imageTail: z.string().nullish(),
262
+ staticMask: z.string().nullish(),
263
+ dynamicMasks: z
264
+ .array(
265
+ z.object({
266
+ mask: z.string(),
267
+ trajectories: z.array(z.object({ x: z.number(), y: z.number() })),
268
+ }),
269
+ )
270
+ .nullish(),
271
+ // Motion-control-specific
272
+ videoUrl: z.string().nullish(),
273
+ characterOrientation: z.enum(['image', 'video']).nullish(),
274
+ keepOriginalSound: z.enum(['yes', 'no']).nullish(),
275
+ watermarkEnabled: z.boolean().nullish(),
276
+ })
277
+ .passthrough(),
278
+ ),
279
+ );
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  AISDKError,
3
- type Experimental_VideoModelV4,
4
3
  NoSuchModelError,
4
+ type Experimental_VideoModelV4,
5
5
  type SharedV4Warning,
6
6
  } from '@ai-sdk/provider';
7
7
  import {
@@ -9,17 +9,19 @@ import {
9
9
  convertUint8ArrayToBase64,
10
10
  createJsonResponseHandler,
11
11
  delay,
12
- type FetchFunction,
13
12
  getFromApi,
14
- lazySchema,
15
13
  parseProviderOptions,
16
14
  postJsonToApi,
17
- type Resolvable,
18
15
  resolve,
19
- zodSchema,
16
+ type FetchFunction,
17
+ type Resolvable,
20
18
  } from '@ai-sdk/provider-utils';
21
19
  import { z } from 'zod/v4';
22
20
  import { klingaiFailedResponseHandler } from './klingai-error';
21
+ import {
22
+ klingaiVideoModelOptionsSchema,
23
+ type KlingAIVideoModelOptions,
24
+ } from './klingai-video-model-options';
23
25
  import type { KlingAIVideoModelId } from './klingai-video-settings';
24
26
 
25
27
  type KlingAIVideoMode = 't2v' | 'i2v' | 'motion-control';
@@ -59,283 +61,6 @@ function getApiModelName(modelId: string, mode: KlingAIVideoMode): string {
59
61
  return baseName.replace(/\.0$/, '').replace(/\./g, '-');
60
62
  }
61
63
 
62
- /**
63
- * Provider-specific options for KlingAI video generation.
64
- *
65
- * Not all options are supported by every model version and video mode (T2V, I2V,
66
- * motion control). See the KlingAI capability map for detailed compatibility:
67
- * https://app.klingai.com/global/dev/document-api/apiReference/model/skillsMap
68
- */
69
- export type KlingAIVideoModelOptions = {
70
- /**
71
- * Video generation mode.
72
- *
73
- * - `'std'`: Standard mode — cost-effective.
74
- * - `'pro'`: Professional mode — higher quality but longer generation time.
75
- */
76
- mode?: 'std' | 'pro' | null;
77
-
78
- /**
79
- * Polling interval in milliseconds for checking task status.
80
- * Default: 5000 (5 seconds).
81
- */
82
- pollIntervalMs?: number | null;
83
-
84
- /**
85
- * Maximum time in milliseconds to wait for video generation.
86
- * Default: 600000 (10 minutes).
87
- */
88
- pollTimeoutMs?: number | null;
89
-
90
- // --- T2V and I2V options ---
91
-
92
- /**
93
- * Negative text prompt to specify what to avoid.
94
- * Cannot exceed 2500 characters.
95
- */
96
- negativePrompt?: string | null;
97
-
98
- /**
99
- * Whether to generate sound simultaneously when generating videos.
100
- * Only V2.6 and subsequent versions support this parameter,
101
- * and requires `mode: 'pro'`.
102
- */
103
- sound?: 'on' | 'off' | null;
104
-
105
- /**
106
- * Flexibility in video generation. The higher the value, the lower the
107
- * model's flexibility, and the stronger the relevance to the user's prompt.
108
- * Value range: [0, 1]. Kling-v2.x models do not support this parameter.
109
- */
110
- cfgScale?: number | null;
111
-
112
- /**
113
- * Camera movement control. If not specified, the model will intelligently
114
- * match based on the input text/images.
115
- */
116
- cameraControl?: {
117
- type:
118
- | 'simple'
119
- | 'down_back'
120
- | 'forward_up'
121
- | 'right_turn_forward'
122
- | 'left_turn_forward';
123
- config?: {
124
- horizontal?: number | null;
125
- vertical?: number | null;
126
- pan?: number | null;
127
- tilt?: number | null;
128
- roll?: number | null;
129
- zoom?: number | null;
130
- } | null;
131
- } | null;
132
-
133
- // --- I2V-specific options ---
134
-
135
- /**
136
- * End frame image for I2V start+end frame control.
137
- * Supports image URL or raw base64-encoded image data.
138
- * Requires `mode: 'pro'` for most models.
139
- */
140
- imageTail?: string | null;
141
-
142
- /**
143
- * Static brush mask image for I2V motion brush.
144
- * Supports image URL or raw base64-encoded image data.
145
- */
146
- staticMask?: string | null;
147
-
148
- /**
149
- * Dynamic brush configurations for I2V motion brush.
150
- * Up to 6 groups, each with a mask and motion trajectories.
151
- */
152
- dynamicMasks?: Array<{
153
- mask: string;
154
- trajectories: Array<{ x: number; y: number }>;
155
- }> | null;
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 and Motion Control) ---
192
-
193
- /**
194
- * Reference elements for element control (Kling v3.0+).
195
- * Supports video character elements and multi-image elements.
196
- *
197
- * - I2V: Up to 3 reference elements. Cannot coexist with voiceList.
198
- * - Motion Control: Currently only 1 element supported.
199
- * When referencing an element, the generated video can only
200
- * refer to the orientation of the person in the video.
201
- */
202
- elementList?: Array<{
203
- element_id: number;
204
- }> | null;
205
-
206
- // --- v3.0 voice control (T2V and I2V) ---
207
-
208
- /**
209
- * Voice references for voice control (Kling v3.0+).
210
- * Up to 2 voice references. Referenced via `<<<voice_1>>>` template
211
- * syntax in the prompt.
212
- *
213
- * When voiceList is used and the prompt references voice IDs,
214
- * sound must be set to 'on'.
215
- * Cannot coexist with elementList on the I2V endpoint.
216
- */
217
- voiceList?: Array<{
218
- voice_id: string;
219
- }> | null;
220
-
221
- // --- Shared options ---
222
-
223
- /**
224
- * Whether to generate watermarked results simultaneously.
225
- */
226
- watermarkEnabled?: boolean | null;
227
-
228
- // --- Motion-control-specific options ---
229
-
230
- /**
231
- * URL of the reference video. The character actions in the generated video
232
- * are consistent with the reference video.
233
- *
234
- * Supports .mp4/.mov, max 100MB, side lengths 340px–3850px,
235
- * duration 3–30 seconds (depends on `characterOrientation`).
236
- */
237
- videoUrl?: string | null;
238
-
239
- /**
240
- * Orientation of the characters in the generated video.
241
- *
242
- * - `'image'`: Same orientation as the person in the image.
243
- * Reference video duration max 10 seconds.
244
- * - `'video'`: Same orientation as the person in the video.
245
- * Reference video duration max 30 seconds.
246
- */
247
- characterOrientation?: 'image' | 'video' | null;
248
-
249
- /**
250
- * Whether to keep the original sound of the reference video.
251
- * Default: `'yes'`.
252
- */
253
- keepOriginalSound?: 'yes' | 'no' | null;
254
-
255
- [key: string]: unknown; // For passthrough
256
- };
257
-
258
- const klingaiVideoModelOptionsSchema = lazySchema(() =>
259
- zodSchema(
260
- z
261
- .object({
262
- mode: z.enum(['std', 'pro']).nullish(),
263
- pollIntervalMs: z.number().positive().nullish(),
264
- pollTimeoutMs: z.number().positive().nullish(),
265
- // T2V and I2V
266
- negativePrompt: z.string().nullish(),
267
- sound: z.enum(['on', 'off']).nullish(),
268
- cfgScale: z.number().nullish(),
269
- cameraControl: z
270
- .object({
271
- type: z.enum([
272
- 'simple',
273
- 'down_back',
274
- 'forward_up',
275
- 'right_turn_forward',
276
- 'left_turn_forward',
277
- ]),
278
- config: z
279
- .object({
280
- horizontal: z.number().nullish(),
281
- vertical: z.number().nullish(),
282
- pan: z.number().nullish(),
283
- tilt: z.number().nullish(),
284
- roll: z.number().nullish(),
285
- zoom: z.number().nullish(),
286
- })
287
- .nullish(),
288
- })
289
- .nullish(),
290
- // v3.0 multi-shot
291
- multiShot: z.boolean().nullish(),
292
- shotType: z.enum(['customize', 'intelligence']).nullish(),
293
- multiPrompt: z
294
- .array(
295
- z.object({
296
- index: z.number(),
297
- prompt: z.string(),
298
- duration: z.string(),
299
- }),
300
- )
301
- .nullish(),
302
- // v3.0 element control (I2V)
303
- elementList: z
304
- .array(
305
- z.object({
306
- element_id: z.number(),
307
- }),
308
- )
309
- .nullish(),
310
- // v3.0 voice control
311
- voiceList: z
312
- .array(
313
- z.object({
314
- voice_id: z.string(),
315
- }),
316
- )
317
- .nullish(),
318
- // I2V-specific
319
- imageTail: z.string().nullish(),
320
- staticMask: z.string().nullish(),
321
- dynamicMasks: z
322
- .array(
323
- z.object({
324
- mask: z.string(),
325
- trajectories: z.array(z.object({ x: z.number(), y: z.number() })),
326
- }),
327
- )
328
- .nullish(),
329
- // Motion-control-specific
330
- videoUrl: z.string().nullish(),
331
- characterOrientation: z.enum(['image', 'video']).nullish(),
332
- keepOriginalSound: z.enum(['yes', 'no']).nullish(),
333
- watermarkEnabled: z.boolean().nullish(),
334
- })
335
- .passthrough(),
336
- ),
337
- );
338
-
339
64
  /**
340
65
  * Known provider option keys that are handled explicitly and should not be
341
66
  * passed through to the API body.