getaiapi 1.3.1 → 2.0.0
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/README.md +449 -436
- package/dist/{chunk-CN4FJ4FW.js → chunk-H6MMJNJX.js} +19 -19
- package/dist/{chunk-CN4FJ4FW.js.map → chunk-H6MMJNJX.js.map} +1 -1
- package/dist/cli.d.ts +2 -1
- package/dist/cli.js +2 -3
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +460 -1
- package/dist/index.js +534 -2
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# getaiapi
|
|
2
2
|
|
|
3
|
-
**
|
|
3
|
+
**Typed AI provider SDKs. One import per provider.**
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/getaiapi)
|
|
6
6
|
[](LICENSE)
|
|
7
7
|
[](https://www.typescriptlang.org/)
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Each AI provider gets a typed namespace with one function per model. No generic `generate()`, no model strings, no mapping layers. What you type is what gets sent.
|
|
10
10
|
|
|
11
11
|
## Install
|
|
12
12
|
|
|
@@ -14,639 +14,652 @@ A unified TypeScript library that wraps 1,890+ AI models across 5 providers into
|
|
|
14
14
|
npm install getaiapi
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
-
##
|
|
17
|
+
## Kling AI
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
import { generate } from 'getaiapi'
|
|
19
|
+
69 models across 20 endpoints. Each model is a typed function with Kling-native field names.
|
|
21
20
|
|
|
22
|
-
|
|
23
|
-
model: 'flux-schnell',
|
|
24
|
-
prompt: 'a cat wearing sunglasses'
|
|
25
|
-
})
|
|
21
|
+
### Setup
|
|
26
22
|
|
|
27
|
-
|
|
23
|
+
```bash
|
|
24
|
+
export KLING_ACCESS_KEY="your-access-key"
|
|
25
|
+
export KLING_SECRET_KEY="your-secret-key"
|
|
28
26
|
```
|
|
29
27
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
**Text generation (LLMs)**
|
|
28
|
+
Or configure programmatically:
|
|
33
29
|
|
|
34
30
|
```typescript
|
|
35
|
-
|
|
36
|
-
model: 'claude-sonnet-4-6',
|
|
37
|
-
prompt: 'Explain quantum computing in one paragraph'
|
|
38
|
-
})
|
|
31
|
+
import { kling } from 'getaiapi'
|
|
39
32
|
|
|
40
|
-
|
|
33
|
+
kling.configure({ accessKey: '...', secretKey: '...' })
|
|
41
34
|
```
|
|
42
35
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
```typescript
|
|
46
|
-
const reply = await generate({
|
|
47
|
-
model: 'gpt-4o',
|
|
48
|
-
prompt: 'Write a haiku about TypeScript',
|
|
49
|
-
options: {
|
|
50
|
-
system: 'You are a creative poet.',
|
|
51
|
-
temperature: 0.9,
|
|
52
|
-
max_tokens: 100,
|
|
53
|
-
}
|
|
54
|
-
})
|
|
55
|
-
```
|
|
36
|
+
### Text to Video
|
|
56
37
|
|
|
57
|
-
|
|
38
|
+
9 models: V1 Standard, V1.6 Pro/Standard, V2 Master, V2.1 Master, V2.5 Turbo Pro, V2.6 Pro, V3 Pro/Standard.
|
|
58
39
|
|
|
59
40
|
```typescript
|
|
60
|
-
|
|
61
|
-
model: 'veo3.1',
|
|
62
|
-
prompt: 'a timelapse of a flower blooming in a garden'
|
|
63
|
-
})
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
**Image editing**
|
|
41
|
+
import { kling } from 'getaiapi'
|
|
67
42
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
43
|
+
const result = await kling.textToVideoV3Pro({
|
|
44
|
+
prompt: 'a golden retriever running on a beach at sunset',
|
|
45
|
+
duration: '5',
|
|
46
|
+
aspect_ratio: '16:9',
|
|
47
|
+
sound: 'on',
|
|
73
48
|
})
|
|
49
|
+
|
|
50
|
+
console.log(result.videos[0].url)
|
|
74
51
|
```
|
|
75
52
|
|
|
76
|
-
|
|
53
|
+
| Function | Model | Mode |
|
|
54
|
+
|----------|-------|------|
|
|
55
|
+
| `textToVideoV1Standard` | kling-v1 | std |
|
|
56
|
+
| `textToVideoV1_6Pro` | kling-v1-6 | pro |
|
|
57
|
+
| `textToVideoV1_6Standard` | kling-v1-6 | std |
|
|
58
|
+
| `textToVideoV2Master` | kling-v2-master | — |
|
|
59
|
+
| `textToVideoV2_1Master` | kling-v2-1-master | — |
|
|
60
|
+
| `textToVideoV2_5TurboPro` | kling-v2-5-turbo | pro |
|
|
61
|
+
| `textToVideoV2_6Pro` | kling-v2-6 | pro |
|
|
62
|
+
| `textToVideoV3Pro` | kling-v3 | pro |
|
|
63
|
+
| `textToVideoV3Standard` | kling-v3 | std |
|
|
64
|
+
|
|
65
|
+
**Input: `TextToVideoInput`**
|
|
77
66
|
|
|
78
67
|
```typescript
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
})
|
|
68
|
+
{
|
|
69
|
+
prompt: string // required
|
|
70
|
+
negative_prompt?: string
|
|
71
|
+
duration?: string // '5' or '10'
|
|
72
|
+
aspect_ratio?: string // '16:9', '9:16', '1:1'
|
|
73
|
+
cfg_scale?: number
|
|
74
|
+
sound?: 'on' | 'off' // generate audio
|
|
75
|
+
}
|
|
88
76
|
```
|
|
89
77
|
|
|
90
|
-
|
|
78
|
+
### Image to Video
|
|
79
|
+
|
|
80
|
+
13 models: V1 Standard, V1.5 Pro, V1.6 Pro/Standard, V2 Master, V2.1 Master/Pro/Standard, V2.5 Turbo Pro/Standard, V2.6 Pro, V3 Pro/Standard.
|
|
91
81
|
|
|
92
82
|
```typescript
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
prompt: '
|
|
96
|
-
|
|
83
|
+
const result = await kling.imageToVideoV3Pro({
|
|
84
|
+
image: 'https://example.com/photo.jpg',
|
|
85
|
+
prompt: 'animate this photo with gentle wind',
|
|
86
|
+
duration: '5',
|
|
97
87
|
})
|
|
98
88
|
```
|
|
99
89
|
|
|
100
|
-
|
|
90
|
+
| Function | Model | Mode |
|
|
91
|
+
|----------|-------|------|
|
|
92
|
+
| `imageToVideoV1Standard` | kling-v1 | std |
|
|
93
|
+
| `imageToVideoV1_5Pro` | kling-v1-5 | pro |
|
|
94
|
+
| `imageToVideoV1_6Pro` | kling-v1-6 | pro |
|
|
95
|
+
| `imageToVideoV1_6Standard` | kling-v1-6 | std |
|
|
96
|
+
| `imageToVideoV2Master` | kling-v2-master | — |
|
|
97
|
+
| `imageToVideoV2_1Master` | kling-v2-1-master | — |
|
|
98
|
+
| `imageToVideoV2_1Pro` | kling-v2-1 | pro |
|
|
99
|
+
| `imageToVideoV2_1Standard` | kling-v2-1 | std |
|
|
100
|
+
| `imageToVideoV2_5TurboPro` | kling-v2-5-turbo | pro |
|
|
101
|
+
| `imageToVideoV2_5TurboStandard` | kling-v2-5-turbo | std |
|
|
102
|
+
| `imageToVideoV2_6Pro` | kling-v2-6 | pro |
|
|
103
|
+
| `imageToVideoV3Pro` | kling-v3 | pro |
|
|
104
|
+
| `imageToVideoV3Standard` | kling-v3 | std |
|
|
105
|
+
|
|
106
|
+
**Input: `ImageToVideoInput`**
|
|
101
107
|
|
|
102
108
|
```typescript
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
109
|
+
{
|
|
110
|
+
image: string // required — URL or base64
|
|
111
|
+
prompt?: string
|
|
112
|
+
negative_prompt?: string
|
|
113
|
+
duration?: string
|
|
114
|
+
aspect_ratio?: string
|
|
115
|
+
cfg_scale?: number
|
|
116
|
+
sound?: 'on' | 'off'
|
|
117
|
+
image_tail?: string // end frame image URL
|
|
118
|
+
voice_list?: Array<{ voice_id: string }>
|
|
119
|
+
element_list?: Array<{ id: string; image: string }>
|
|
120
|
+
}
|
|
107
121
|
```
|
|
108
122
|
|
|
109
|
-
|
|
123
|
+
### Omni Video
|
|
124
|
+
|
|
125
|
+
17 models across O1 and O3 variants. Supports text-to-video, image-to-video, reference-to-video, video editing, and video reference — all through one endpoint.
|
|
110
126
|
|
|
111
127
|
```typescript
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
provider: 'kling', // uses KLING_ACCESS_KEY directly
|
|
115
|
-
prompt: 'a golden retriever running on a beach at sunset',
|
|
128
|
+
const result = await kling.omniVideoO3ProTextToVideo({
|
|
129
|
+
prompt: 'a cyberpunk city at night',
|
|
116
130
|
duration: '5',
|
|
117
|
-
|
|
131
|
+
aspect_ratio: '16:9',
|
|
118
132
|
})
|
|
119
133
|
```
|
|
120
134
|
|
|
121
|
-
|
|
135
|
+
| Function | Model | Mode |
|
|
136
|
+
|----------|-------|------|
|
|
137
|
+
| `omniVideoO1ImageToVideo` | kling-video-o1 | — |
|
|
138
|
+
| `omniVideoO1ReferenceToVideo` | kling-video-o1 | — |
|
|
139
|
+
| `omniVideoO1StandardImageToVideo` | kling-video-o1 | std |
|
|
140
|
+
| `omniVideoO1StandardReferenceToVideo` | kling-video-o1 | std |
|
|
141
|
+
| `omniVideoO1StandardVideoEdit` | kling-video-o1 | std |
|
|
142
|
+
| `omniVideoO1StandardVideoReference` | kling-video-o1 | std |
|
|
143
|
+
| `omniVideoO1VideoEdit` | kling-video-o1 | — |
|
|
144
|
+
| `omniVideoO1VideoReference` | kling-video-o1 | — |
|
|
145
|
+
| `omniVideoO3ProImageToVideo` | kling-v3-omni | pro |
|
|
146
|
+
| `omniVideoO3ProReferenceToVideo` | kling-v3-omni | pro |
|
|
147
|
+
| `omniVideoO3ProTextToVideo` | kling-v3-omni | pro |
|
|
148
|
+
| `omniVideoO3ProVideoEdit` | kling-v3-omni | pro |
|
|
149
|
+
| `omniVideoO3ProVideoReference` | kling-v3-omni | pro |
|
|
150
|
+
| `omniVideoO3StandardReferenceToVideo` | kling-v3-omni | std |
|
|
151
|
+
| `omniVideoO3StandardTextToVideo` | kling-v3-omni | std |
|
|
152
|
+
| `omniVideoO3StandardVideoEdit` | kling-v3-omni | std |
|
|
153
|
+
| `omniVideoO3StandardVideoReference` | kling-v3-omni | std |
|
|
154
|
+
|
|
155
|
+
**Input: `OmniVideoInput`**
|
|
122
156
|
|
|
123
157
|
```typescript
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
image
|
|
127
|
-
|
|
158
|
+
{
|
|
159
|
+
prompt: string // required
|
|
160
|
+
image?: string
|
|
161
|
+
negative_prompt?: string
|
|
162
|
+
duration?: string
|
|
163
|
+
aspect_ratio?: string
|
|
164
|
+
cfg_scale?: number
|
|
165
|
+
sound?: 'on' | 'off'
|
|
166
|
+
element_list?: Array<{ id: string; image: string }>
|
|
167
|
+
}
|
|
128
168
|
```
|
|
129
169
|
|
|
130
|
-
|
|
170
|
+
### Image Generation
|
|
131
171
|
|
|
132
|
-
|
|
172
|
+
2 models on `v1/images/generations` and 3 models on `v1/images/omni-image`.
|
|
133
173
|
|
|
134
174
|
```typescript
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
model: 'veo3.1',
|
|
140
|
-
prompt: 'a timelapse of a flower blooming',
|
|
175
|
+
const result = await kling.imageO1({
|
|
176
|
+
prompt: 'a watercolor painting of a mountain lake',
|
|
177
|
+
n: 2,
|
|
178
|
+
aspect_ratio: '16:9',
|
|
141
179
|
})
|
|
142
180
|
|
|
143
|
-
console.log(
|
|
144
|
-
|
|
181
|
+
console.log(result.images[0].url)
|
|
182
|
+
```
|
|
145
183
|
|
|
146
|
-
|
|
147
|
-
|
|
184
|
+
| Function | Endpoint | Model |
|
|
185
|
+
|----------|----------|-------|
|
|
186
|
+
| `imageV3TextToImage` | generations | kling-v3 |
|
|
187
|
+
| `imageV3ImageToImage` | generations | kling-v3 |
|
|
188
|
+
| `imageO1` | omni-image | kling-image-o1 |
|
|
189
|
+
| `imageO3TextToImage` | omni-image | kling-v3-omni |
|
|
190
|
+
| `imageO3ImageToImage` | omni-image | kling-v3-omni |
|
|
148
191
|
|
|
149
|
-
|
|
150
|
-
await new Promise(r => setTimeout(r, 2000))
|
|
151
|
-
result = await poll(job)
|
|
152
|
-
}
|
|
192
|
+
**Input: `ImageGenerationInput` / `OmniImageInput`**
|
|
153
193
|
|
|
154
|
-
|
|
155
|
-
|
|
194
|
+
```typescript
|
|
195
|
+
{
|
|
196
|
+
prompt: string // required
|
|
197
|
+
image?: string // for image-to-image
|
|
198
|
+
n?: number // number of outputs
|
|
199
|
+
aspect_ratio?: string
|
|
156
200
|
}
|
|
157
201
|
```
|
|
158
202
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
`submitAndPoll()` is an alias for `generate()` that makes the blocking behavior explicit:
|
|
203
|
+
### Virtual Try-On
|
|
162
204
|
|
|
163
205
|
```typescript
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
model: 'flux-schnell',
|
|
168
|
-
prompt: 'a cat in space',
|
|
206
|
+
const result = await kling.virtualTryOn({
|
|
207
|
+
human_image: 'https://example.com/person.jpg',
|
|
208
|
+
cloth_image: 'https://example.com/shirt.jpg',
|
|
169
209
|
})
|
|
170
210
|
```
|
|
171
211
|
|
|
172
|
-
|
|
212
|
+
**Input: `VirtualTryOnInput`**
|
|
173
213
|
|
|
174
|
-
|
|
214
|
+
```typescript
|
|
215
|
+
{
|
|
216
|
+
human_image: string // required
|
|
217
|
+
cloth_image: string // required
|
|
218
|
+
}
|
|
219
|
+
```
|
|
175
220
|
|
|
176
|
-
|
|
221
|
+
### AI Avatar
|
|
177
222
|
|
|
178
|
-
|
|
179
|
-
# fal-ai (1,201 models)
|
|
180
|
-
export FAL_KEY="your-fal-key"
|
|
223
|
+
4 models: V1 Pro/Standard, V2 Pro/Standard.
|
|
181
224
|
|
|
182
|
-
|
|
183
|
-
|
|
225
|
+
```typescript
|
|
226
|
+
const result = await kling.avatarV2Pro({
|
|
227
|
+
image: 'https://example.com/portrait.jpg',
|
|
228
|
+
sound_file: 'https://example.com/speech.mp3',
|
|
229
|
+
prompt: 'talking head presentation',
|
|
230
|
+
})
|
|
231
|
+
```
|
|
184
232
|
|
|
185
|
-
|
|
186
|
-
|
|
233
|
+
| Function | Mode |
|
|
234
|
+
|----------|------|
|
|
235
|
+
| `avatarV1Pro` | pro |
|
|
236
|
+
| `avatarV1Standard` | std |
|
|
237
|
+
| `avatarV2Pro` | pro |
|
|
238
|
+
| `avatarV2Standard` | std |
|
|
187
239
|
|
|
188
|
-
|
|
189
|
-
export OPENROUTER_API_KEY="your-openrouter-key"
|
|
240
|
+
**Input: `AvatarInput`**
|
|
190
241
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
242
|
+
```typescript
|
|
243
|
+
{
|
|
244
|
+
image: string // required — portrait image
|
|
245
|
+
sound_file?: string // audio for lip sync
|
|
246
|
+
prompt?: string
|
|
247
|
+
}
|
|
194
248
|
```
|
|
195
249
|
|
|
196
|
-
###
|
|
197
|
-
|
|
198
|
-
Use `configure()` to set keys in code -- useful when your env vars have different names or keys come from a secrets manager.
|
|
250
|
+
### Lip Sync
|
|
199
251
|
|
|
200
252
|
```typescript
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
configure({
|
|
204
|
-
keys: {
|
|
205
|
-
'fal-ai': process.env.MY_FAL_TOKEN,
|
|
206
|
-
'replicate': process.env.MY_REPLICATE_TOKEN,
|
|
207
|
-
'wavespeed': process.env.MY_WAVESPEED_TOKEN,
|
|
208
|
-
'openrouter': process.env.MY_OPENROUTER_TOKEN,
|
|
209
|
-
'kling': `${process.env.MY_KLING_AK}:${process.env.MY_KLING_SK}`,
|
|
210
|
-
},
|
|
253
|
+
const result = await kling.lipSyncAudioToVideo({
|
|
254
|
+
sound_file: 'https://example.com/speech.mp3',
|
|
211
255
|
})
|
|
212
256
|
```
|
|
213
257
|
|
|
214
|
-
|
|
258
|
+
| Function | Description |
|
|
259
|
+
|----------|-------------|
|
|
260
|
+
| `lipSyncAudioToVideo` | Audio-driven lip sync |
|
|
261
|
+
| `lipSyncTextToVideo` | Text-driven lip sync |
|
|
262
|
+
|
|
263
|
+
**Input: `LipSyncInput`**
|
|
215
264
|
|
|
216
265
|
```typescript
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
},
|
|
221
|
-
storage: {
|
|
222
|
-
accountId: 'your-r2-account',
|
|
223
|
-
bucketName: 'your-bucket',
|
|
224
|
-
accessKeyId: 'your-r2-key',
|
|
225
|
-
secretAccessKey: 'your-r2-secret',
|
|
226
|
-
publicUrlBase: 'https://cdn.example.com',
|
|
227
|
-
},
|
|
228
|
-
})
|
|
266
|
+
{
|
|
267
|
+
sound_file?: string // audio URL
|
|
268
|
+
}
|
|
229
269
|
```
|
|
230
270
|
|
|
231
|
-
|
|
271
|
+
### Video Effects
|
|
232
272
|
|
|
233
|
-
|
|
234
|
-
import { configureAuth } from 'getaiapi'
|
|
273
|
+
4 models: V1 Standard, V1.5 Pro, V1.6 Pro/Standard.
|
|
235
274
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
275
|
+
```typescript
|
|
276
|
+
const result = await kling.effectsV1_6Pro({
|
|
277
|
+
image: 'https://example.com/photo.jpg',
|
|
239
278
|
})
|
|
240
279
|
```
|
|
241
280
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
281
|
+
| Function |
|
|
282
|
+
|----------|
|
|
283
|
+
| `effectsV1Standard` |
|
|
284
|
+
| `effectsV1_5Pro` |
|
|
285
|
+
| `effectsV1_6Pro` |
|
|
286
|
+
| `effectsV1_6Standard` |
|
|
245
287
|
|
|
246
|
-
|
|
288
|
+
**Input: `EffectsInput`**
|
|
247
289
|
|
|
248
290
|
```typescript
|
|
249
|
-
|
|
291
|
+
{
|
|
292
|
+
image: string // required
|
|
293
|
+
}
|
|
294
|
+
```
|
|
250
295
|
|
|
251
|
-
|
|
252
|
-
const all = listModels()
|
|
296
|
+
### Motion Control
|
|
253
297
|
|
|
254
|
-
|
|
255
|
-
const imageModels = listModels({ input: 'text', output: 'image' })
|
|
298
|
+
4 models: V2.6 Pro/Standard, V3 Pro/Standard.
|
|
256
299
|
|
|
257
|
-
|
|
258
|
-
const
|
|
300
|
+
```typescript
|
|
301
|
+
const result = await kling.motionControlV3Pro({
|
|
302
|
+
image_url: 'https://example.com/scene.jpg',
|
|
303
|
+
prompt: 'camera pan left',
|
|
304
|
+
})
|
|
305
|
+
```
|
|
259
306
|
|
|
260
|
-
|
|
261
|
-
|
|
307
|
+
| Function | Model | Mode |
|
|
308
|
+
|----------|-------|------|
|
|
309
|
+
| `motionControlV2_6Pro` | kling-v2-6 | pro |
|
|
310
|
+
| `motionControlV2_6Standard` | kling-v2-6 | std |
|
|
311
|
+
| `motionControlV3Pro` | kling-v3 | pro |
|
|
312
|
+
| `motionControlV3Standard` | kling-v3 | std |
|
|
262
313
|
|
|
263
|
-
|
|
264
|
-
const model = resolveModel('flux-schnell')
|
|
265
|
-
// => { canonical_name, aliases, modality, providers }
|
|
314
|
+
**Input: `MotionControlInput`**
|
|
266
315
|
|
|
267
|
-
|
|
268
|
-
|
|
316
|
+
```typescript
|
|
317
|
+
{
|
|
318
|
+
image_url: string // required
|
|
319
|
+
video_url?: string
|
|
320
|
+
prompt?: string
|
|
321
|
+
keep_original_sound?: boolean
|
|
322
|
+
character_orientation?: string
|
|
323
|
+
element_list?: Array<{ id: string; image: string }>
|
|
324
|
+
}
|
|
269
325
|
```
|
|
270
326
|
|
|
271
|
-
|
|
327
|
+
### Text to Speech (Sync)
|
|
272
328
|
|
|
273
|
-
|
|
329
|
+
Returns immediately — no polling.
|
|
274
330
|
|
|
275
|
-
|
|
331
|
+
```typescript
|
|
332
|
+
const result = await kling.tts({ text: 'Hello world' })
|
|
333
|
+
console.log(result.audios[0].url)
|
|
334
|
+
```
|
|
276
335
|
|
|
277
|
-
**
|
|
336
|
+
**Input: `TtsInput`**
|
|
278
337
|
|
|
279
|
-
|
|
338
|
+
```typescript
|
|
339
|
+
{
|
|
340
|
+
text: string // required
|
|
341
|
+
}
|
|
342
|
+
```
|
|
280
343
|
|
|
281
|
-
|
|
282
|
-
|---|---|---|
|
|
283
|
-
| text | image | `flux-schnell`, `ideogram-v3` |
|
|
284
|
-
| text | video | `veo3.1`, `sora-2` |
|
|
285
|
-
| image, text | image | `gpt-image-1.5-edit`, `flux-2-pro-edit` |
|
|
286
|
-
| image, text | video | `kling-video-v3-pro`, `seedance-v1.5-pro` |
|
|
287
|
-
| text | audio | `elevenlabs-v3`, `minimax-music-v2` |
|
|
288
|
-
| text | text | `claude-sonnet-4-6`, `gpt-4o` |
|
|
289
|
-
| image | image | `topaz-upscale-image`, `birefnet-v2` |
|
|
290
|
-
| image | 3d | `trellis-image-to-3d` |
|
|
291
|
-
| audio | text | `whisper` |
|
|
344
|
+
### Video to Audio
|
|
292
345
|
|
|
293
|
-
|
|
346
|
+
Generates audio for a video. Returns both the merged video and the generated audio tracks.
|
|
294
347
|
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
| WaveSpeed | 66 | `WAVESPEED_API_KEY` | Native fetch |
|
|
301
|
-
| OpenRouter | 24 | `OPENROUTER_API_KEY` | Native fetch |
|
|
348
|
+
```typescript
|
|
349
|
+
const result = await kling.videoToAudio({
|
|
350
|
+
video_url: 'https://example.com/video.mp4',
|
|
351
|
+
sound_effect_prompt: 'ocean waves crashing',
|
|
352
|
+
})
|
|
302
353
|
|
|
303
|
-
|
|
354
|
+
console.log(result.videos[0].url) // merged video with audio
|
|
355
|
+
console.log(result.audios[0].url_mp3) // audio track (mp3)
|
|
356
|
+
console.log(result.audios[0].url_wav) // audio track (wav)
|
|
357
|
+
```
|
|
304
358
|
|
|
305
|
-
**
|
|
359
|
+
**Input: `VideoToAudioInput`**
|
|
306
360
|
|
|
307
|
-
|
|
361
|
+
```typescript
|
|
362
|
+
{
|
|
363
|
+
video_url?: string // mutually exclusive with video_id
|
|
364
|
+
video_id?: string // mutually exclusive with video_url
|
|
365
|
+
sound_effect_prompt?: string
|
|
366
|
+
bgm_prompt?: string // background music prompt
|
|
367
|
+
asmr_mode?: boolean // enhanced detailed sound effects
|
|
368
|
+
}
|
|
369
|
+
```
|
|
308
370
|
|
|
309
|
-
|
|
371
|
+
### Text to Audio
|
|
310
372
|
|
|
311
|
-
|
|
373
|
+
```typescript
|
|
374
|
+
const result = await kling.textToAudio({
|
|
375
|
+
prompt: 'thunderstorm with heavy rain',
|
|
376
|
+
duration: 5.0,
|
|
377
|
+
})
|
|
312
378
|
|
|
313
|
-
|
|
379
|
+
console.log(result.audios[0].url) // normalized from url_mp3
|
|
380
|
+
console.log(result.audios[0].url_mp3) // mp3 URL
|
|
381
|
+
console.log(result.audios[0].url_wav) // wav URL
|
|
382
|
+
```
|
|
314
383
|
|
|
315
|
-
**
|
|
384
|
+
**Input: `TextToAudioInput`**
|
|
316
385
|
|
|
317
386
|
```typescript
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
prompt?: string // text prompt
|
|
322
|
-
image?: string | File // input image (URL or File)
|
|
323
|
-
images?: (string | File)[] // multiple reference images
|
|
324
|
-
audio?: string | File // input audio
|
|
325
|
-
video?: string | File // input video
|
|
326
|
-
negative_prompt?: string // what to avoid
|
|
327
|
-
count?: number // number of outputs
|
|
328
|
-
size?: string | { width: number; height: number } // output dimensions
|
|
329
|
-
seed?: number // reproducibility seed
|
|
330
|
-
guidance?: number // guidance scale
|
|
331
|
-
steps?: number // inference steps
|
|
332
|
-
strength?: number // denoising strength
|
|
333
|
-
format?: 'png' | 'jpeg' | 'webp' | 'mp4' | 'mp3' | 'wav' | 'obj' | 'glb'
|
|
334
|
-
quality?: number // output quality
|
|
335
|
-
safety?: boolean // enable safety checker
|
|
336
|
-
duration?: string // output duration (video/audio)
|
|
337
|
-
options?: ProviderOptionsFor<P> // provider-specific overrides
|
|
387
|
+
{
|
|
388
|
+
prompt: string // required
|
|
389
|
+
duration: number // required — 3.0 to 10.0
|
|
338
390
|
}
|
|
339
391
|
```
|
|
340
392
|
|
|
341
|
-
|
|
393
|
+
### Voice Clone
|
|
342
394
|
|
|
343
395
|
```typescript
|
|
344
|
-
const
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
prompt: 'Animate this photo',
|
|
349
|
-
options: {
|
|
350
|
-
sound: 'on', // typed: 'on' | 'off'
|
|
351
|
-
aspect_ratio: '16:9', // typed: string
|
|
352
|
-
cfg_scale: 0.5, // typed: number
|
|
353
|
-
},
|
|
354
|
-
}
|
|
355
|
-
```
|
|
396
|
+
const result = await kling.createVoice({
|
|
397
|
+
voice_name: 'my-voice',
|
|
398
|
+
voice_url: 'https://example.com/sample.mp3',
|
|
399
|
+
})
|
|
356
400
|
|
|
357
|
-
|
|
401
|
+
console.log(result.voices[0].voice_id)
|
|
402
|
+
console.log(result.voices[0].trial_url)
|
|
403
|
+
```
|
|
358
404
|
|
|
359
|
-
**
|
|
405
|
+
**Input: `CreateVoiceInput`**
|
|
360
406
|
|
|
361
407
|
```typescript
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
status: 'completed' | 'failed'
|
|
367
|
-
outputs: OutputItem[]
|
|
368
|
-
metadata: {
|
|
369
|
-
seed?: number
|
|
370
|
-
inference_time_ms?: number
|
|
371
|
-
cost?: number
|
|
372
|
-
safety_flagged?: boolean
|
|
373
|
-
tokens?: number // total tokens (LLM only)
|
|
374
|
-
prompt_tokens?: number // input tokens (LLM only)
|
|
375
|
-
completion_tokens?: number // output tokens (LLM only)
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
interface OutputItem {
|
|
380
|
-
type: 'image' | 'video' | 'audio' | 'text' | '3d' | 'segmentation'
|
|
381
|
-
url?: string // URL for media outputs
|
|
382
|
-
content?: string // text content for LLM outputs
|
|
383
|
-
content_type: string
|
|
384
|
-
size_bytes?: number
|
|
408
|
+
{
|
|
409
|
+
voice_name: string // required
|
|
410
|
+
voice_url?: string // audio sample URL
|
|
411
|
+
video_id?: string // or extract from video
|
|
385
412
|
}
|
|
386
413
|
```
|
|
387
414
|
|
|
388
|
-
###
|
|
415
|
+
### Multi-Shot
|
|
389
416
|
|
|
390
|
-
|
|
417
|
+
Generate multi-angle reference images from a frontal image. Each image returns 3 angle variants.
|
|
391
418
|
|
|
392
419
|
```typescript
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
provider: ProviderName // which provider handled it
|
|
397
|
-
endpoint: string // needed for polling
|
|
398
|
-
status: 'pending' | 'processing' | 'completed'
|
|
399
|
-
}
|
|
400
|
-
```
|
|
420
|
+
const result = await kling.multiShot({
|
|
421
|
+
element_frontal_image: 'https://example.com/face.jpg',
|
|
422
|
+
})
|
|
401
423
|
|
|
402
|
-
|
|
424
|
+
console.log(result.images[0].url_1) // angle 1
|
|
425
|
+
console.log(result.images[0].url_2) // angle 2
|
|
426
|
+
console.log(result.images[0].url_3) // angle 3
|
|
427
|
+
```
|
|
403
428
|
|
|
404
|
-
|
|
429
|
+
**Input: `MultiShotInput`**
|
|
405
430
|
|
|
406
431
|
```typescript
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
model: string
|
|
410
|
-
provider: ProviderName
|
|
411
|
-
status: 'completed' | 'failed' | 'processing' | 'pending'
|
|
412
|
-
outputs?: OutputItem[] // populated when completed
|
|
413
|
-
metadata?: GenerateResponse['metadata'] // populated when completed
|
|
414
|
-
error?: string // populated when failed
|
|
432
|
+
{
|
|
433
|
+
element_frontal_image: string // required
|
|
415
434
|
}
|
|
416
435
|
```
|
|
417
436
|
|
|
418
|
-
###
|
|
419
|
-
|
|
420
|
-
Alias for `generate()`. Submits a job and polls until completion. Use this when you want the blocking behavior but want to be explicit about it.
|
|
421
|
-
|
|
422
|
-
### `listModels(filters?: ListModelsFilters): ModelEntry[]`
|
|
437
|
+
### Reference to Image
|
|
423
438
|
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
### `resolveModel(name: string): ModelEntry`
|
|
432
|
-
|
|
433
|
-
Resolves a model by name. Accepts canonical names, aliases, and normalized variants. Throws if no match is found.
|
|
439
|
+
```typescript
|
|
440
|
+
const result = await kling.referenceToImage({
|
|
441
|
+
prompt: 'portrait in watercolor style',
|
|
442
|
+
n: 2,
|
|
443
|
+
})
|
|
444
|
+
```
|
|
434
445
|
|
|
435
|
-
|
|
446
|
+
**Input: `ReferenceToImageInput`**
|
|
436
447
|
|
|
437
|
-
|
|
448
|
+
```typescript
|
|
449
|
+
{
|
|
450
|
+
prompt: string // required
|
|
451
|
+
n?: number
|
|
452
|
+
aspect_ratio?: string
|
|
453
|
+
}
|
|
454
|
+
```
|
|
438
455
|
|
|
439
|
-
|
|
456
|
+
### Expand Image
|
|
440
457
|
|
|
441
|
-
|
|
458
|
+
Outpainting — expand an image beyond its borders.
|
|
442
459
|
|
|
443
|
-
|
|
444
|
-
|
|
460
|
+
```typescript
|
|
461
|
+
const result = await kling.expandImage({
|
|
462
|
+
image: 'https://example.com/photo.jpg',
|
|
463
|
+
prompt: 'extend the landscape',
|
|
464
|
+
})
|
|
465
|
+
```
|
|
445
466
|
|
|
446
|
-
|
|
467
|
+
**Input: `ExpandImageInput`**
|
|
447
468
|
|
|
448
|
-
|
|
469
|
+
```typescript
|
|
470
|
+
{
|
|
471
|
+
image: string // required
|
|
472
|
+
prompt?: string
|
|
473
|
+
n?: number
|
|
474
|
+
}
|
|
475
|
+
```
|
|
449
476
|
|
|
450
|
-
|
|
451
|
-
# Required
|
|
452
|
-
export R2_ACCOUNT_ID="your-cloudflare-account-id"
|
|
453
|
-
export R2_BUCKET_NAME="your-bucket-name"
|
|
454
|
-
export R2_ACCESS_KEY_ID="your-r2-access-key"
|
|
455
|
-
export R2_SECRET_ACCESS_KEY="your-r2-secret-key"
|
|
477
|
+
### Extend Video
|
|
456
478
|
|
|
457
|
-
|
|
458
|
-
export R2_PUBLIC_URL="https://cdn.example.com"
|
|
479
|
+
Continue a video beyond its last frame.
|
|
459
480
|
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
481
|
+
```typescript
|
|
482
|
+
const result = await kling.extendVideo({
|
|
483
|
+
prompt: 'the camera continues to pan right',
|
|
484
|
+
})
|
|
463
485
|
```
|
|
464
486
|
|
|
465
|
-
|
|
487
|
+
**Input: `ExtendVideoInput`**
|
|
466
488
|
|
|
467
|
-
|
|
489
|
+
```typescript
|
|
490
|
+
{
|
|
491
|
+
prompt?: string
|
|
492
|
+
negative_prompt?: string
|
|
493
|
+
}
|
|
494
|
+
```
|
|
468
495
|
|
|
469
|
-
|
|
470
|
-
2. Go to **R2 Object Storage** in the left sidebar
|
|
471
|
-
3. Click on your bucket
|
|
472
|
-
4. Go to the **Settings** tab
|
|
473
|
-
5. Under **Public access**, click **Allow Access**
|
|
474
|
-
6. Cloudflare will provide a public URL like `https://<bucket>.<account-id>.r2.dev` — use this as your `R2_PUBLIC_URL`
|
|
475
|
-
7. (Optional) You can also connect a **Custom Domain** under the same section for a cleaner URL like `https://cdn.yourdomain.com`
|
|
496
|
+
### Identify Face (Sync)
|
|
476
497
|
|
|
477
|
-
|
|
498
|
+
Detect faces in a video for lip-sync targeting. Returns immediately — no polling.
|
|
478
499
|
|
|
479
500
|
```typescript
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
configureStorage()
|
|
501
|
+
const result = await kling.identifyFace({
|
|
502
|
+
video_url: 'https://example.com/video.mp4',
|
|
503
|
+
})
|
|
484
504
|
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
bucketName: 'your-bucket',
|
|
489
|
-
accessKeyId: 'your-key',
|
|
490
|
-
secretAccessKey: 'your-secret',
|
|
491
|
-
publicUrlBase: 'https://cdn.example.com', // optional
|
|
492
|
-
autoUpload: false, // optional
|
|
493
|
-
mode: 'public', // 'public' | 'presigned' (default: 'public')
|
|
494
|
-
presignExpiresIn: 3600, // presigned URL TTL in seconds (default: 3600)
|
|
505
|
+
console.log(result.session_id)
|
|
506
|
+
result.face_data.forEach(face => {
|
|
507
|
+
console.log(face.face_id, face.face_image, face.start_time, face.end_time)
|
|
495
508
|
})
|
|
496
509
|
```
|
|
497
510
|
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
Once storage is configured, any `Buffer`, `Blob`, `File`, or `ArrayBuffer` values in provider params are automatically uploaded to R2 and replaced with public URLs before the request is sent to the provider. This works recursively -- nested objects and arrays are traversed, so params like Kling's `elements[].frontal_image_url` are handled automatically. No code changes needed -- it just works.
|
|
511
|
+
**Input: `IdentifyFaceInput`**
|
|
501
512
|
|
|
502
513
|
```typescript
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
const result = await generate({
|
|
509
|
-
model: 'gpt-image-1.5-edit',
|
|
510
|
-
image: readFileSync('./photo.jpg'), // Buffer uploaded to R2 automatically
|
|
511
|
-
prompt: 'add a rainbow in the sky',
|
|
512
|
-
})
|
|
514
|
+
{
|
|
515
|
+
video_url?: string // mutually exclusive with video_id
|
|
516
|
+
video_id?: string // mutually exclusive with video_url
|
|
517
|
+
}
|
|
513
518
|
```
|
|
514
519
|
|
|
515
|
-
|
|
520
|
+
### Image Recognize (Sync)
|
|
521
|
+
|
|
522
|
+
Returns immediately — no polling.
|
|
516
523
|
|
|
517
524
|
```typescript
|
|
518
|
-
const result = await
|
|
519
|
-
|
|
520
|
-
image: 'https://private-server.com/img.jpg',
|
|
521
|
-
prompt: 'animate this image',
|
|
522
|
-
options: { reupload: true },
|
|
525
|
+
const result = await kling.imageRecognize({
|
|
526
|
+
image: 'https://example.com/photo.jpg',
|
|
523
527
|
})
|
|
524
528
|
```
|
|
525
529
|
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
### Cleanup / Lifecycle
|
|
530
|
+
**Input: `ImageRecognizeInput`**
|
|
529
531
|
|
|
530
|
-
|
|
532
|
+
```typescript
|
|
533
|
+
{
|
|
534
|
+
image: string // required
|
|
535
|
+
}
|
|
536
|
+
```
|
|
531
537
|
|
|
532
|
-
|
|
538
|
+
## Output Types
|
|
533
539
|
|
|
534
|
-
|
|
540
|
+
All functions return typed results based on output modality:
|
|
535
541
|
|
|
536
542
|
```typescript
|
|
537
|
-
|
|
543
|
+
// Video endpoints (textToVideo, imageToVideo, omniVideo, avatar, lipSync, effects, motionControl, extendVideo)
|
|
544
|
+
interface KlingVideoResult {
|
|
545
|
+
task_id: string
|
|
546
|
+
videos: Array<{ id: string; url: string; duration: string }>
|
|
547
|
+
}
|
|
538
548
|
|
|
539
|
-
|
|
549
|
+
// Image endpoints (imageGeneration, omniImage, virtualTryOn, referenceToImage, expandImage)
|
|
550
|
+
interface KlingImageResult {
|
|
551
|
+
task_id: string
|
|
552
|
+
images: Array<{ index: number; url: string }>
|
|
553
|
+
}
|
|
540
554
|
|
|
541
|
-
//
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
{
|
|
545
|
-
|
|
546
|
-
console.log(url) // https://cdn.example.com/uploads/a1b2c3d4-...
|
|
555
|
+
// Audio endpoints (tts, textToAudio)
|
|
556
|
+
interface KlingAudioResult {
|
|
557
|
+
task_id: string
|
|
558
|
+
audios: Array<{ id: string; url: string; url_mp3?: string; url_wav?: string; duration?: string; duration_mp3?: string; duration_wav?: string }>
|
|
559
|
+
}
|
|
547
560
|
|
|
548
|
-
//
|
|
549
|
-
|
|
550
|
-
|
|
561
|
+
// Multi-shot endpoint — 3 angle URLs per image
|
|
562
|
+
interface KlingMultiShotResult {
|
|
563
|
+
task_id: string
|
|
564
|
+
images: Array<{ index: number; url_1: string; url_2: string; url_3: string }>
|
|
565
|
+
}
|
|
551
566
|
|
|
552
|
-
|
|
567
|
+
// Voice clone endpoint
|
|
568
|
+
interface KlingVoiceResult {
|
|
569
|
+
task_id: string
|
|
570
|
+
voices: Array<{ voice_id: string; voice_name: string; trial_url: string; owned_by: string }>
|
|
571
|
+
}
|
|
553
572
|
|
|
554
|
-
|
|
573
|
+
// Video-to-audio endpoint — merged video + generated audio
|
|
574
|
+
interface KlingVideoAudioResult {
|
|
575
|
+
task_id: string
|
|
576
|
+
videos: Array<{ id: string; url: string; duration: string }>
|
|
577
|
+
audios: Array<{ id: string; url_mp3?: string; url_wav?: string; duration_mp3?: string; duration_wav?: string }>
|
|
578
|
+
}
|
|
555
579
|
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
secretAccessKey: 'your-secret',
|
|
562
|
-
mode: 'presigned', // uploadAsset returns presigned URLs
|
|
563
|
-
presignExpiresIn: 1800, // URLs expire after 30 minutes
|
|
564
|
-
})
|
|
580
|
+
// Face detection (identifyFace) — sync, no task_id
|
|
581
|
+
interface KlingFaceResult {
|
|
582
|
+
session_id: string
|
|
583
|
+
face_data: Array<{ face_id: string; face_image: string; start_time: number; end_time: number }>
|
|
584
|
+
}
|
|
565
585
|
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
586
|
+
// Generic JSON (imageRecognize)
|
|
587
|
+
interface KlingJsonResult {
|
|
588
|
+
task_id: string
|
|
589
|
+
data: unknown
|
|
590
|
+
}
|
|
570
591
|
```
|
|
571
592
|
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
```typescript
|
|
575
|
-
import { presignAsset } from 'getaiapi'
|
|
593
|
+
## Polling Control
|
|
576
594
|
|
|
577
|
-
|
|
578
|
-
// => https://<account>.r2.cloudflarestorage.com/<bucket>/uploads/my-file.png?X-Amz-Algorithm=...
|
|
595
|
+
All functions accept optional polling parameters:
|
|
579
596
|
|
|
580
|
-
|
|
581
|
-
|
|
597
|
+
```typescript
|
|
598
|
+
await kling.textToVideoV3Pro({
|
|
599
|
+
prompt: 'a sunset',
|
|
600
|
+
timeout: 600_000, // max wait time in ms (default: 300_000 = 5 min)
|
|
601
|
+
pollInterval: 5_000, // poll frequency in ms (default: 3_000)
|
|
602
|
+
})
|
|
582
603
|
```
|
|
583
604
|
|
|
584
|
-
|
|
605
|
+
Sync endpoints (`tts`, `imageRecognize`, `identifyFace`) return immediately regardless of these settings.
|
|
585
606
|
|
|
586
|
-
|
|
587
|
-
|---|---|---|
|
|
588
|
-
| `key` | `string` | Custom object key (default: auto-generated UUID) |
|
|
589
|
-
| `contentType` | `string` | MIME type (default: detected from input or `application/octet-stream`) |
|
|
590
|
-
| `prefix` | `string` | Key prefix / folder (e.g. `"uploads"`) |
|
|
591
|
-
| `maxBytes` | `number` | Max upload size in bytes (default: 500 MB) |
|
|
607
|
+
## Extra Parameters
|
|
592
608
|
|
|
593
|
-
|
|
609
|
+
All input types accept additional Kling-native fields via index signature. Pass any parameter the Kling API supports:
|
|
594
610
|
|
|
595
611
|
```typescript
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
}
|
|
601
|
-
if (err instanceof StorageError) {
|
|
602
|
-
console.error(err.operation) // 'upload' | 'delete' | 'config'
|
|
603
|
-
console.error(err.statusCode) // HTTP status from R2, if applicable
|
|
604
|
-
}
|
|
605
|
-
}
|
|
612
|
+
await kling.textToVideoV3Pro({
|
|
613
|
+
prompt: 'a sunset',
|
|
614
|
+
camera_control: { type: 'simple', config: { horizontal: 5 } },
|
|
615
|
+
callback_url: 'https://example.com/webhook',
|
|
616
|
+
})
|
|
606
617
|
```
|
|
607
618
|
|
|
608
619
|
## Error Handling
|
|
609
620
|
|
|
610
|
-
All errors extend `GetAIApiError` and can be caught uniformly or by type:
|
|
611
|
-
|
|
612
|
-
| Error | When |
|
|
613
|
-
|---|---|
|
|
614
|
-
| `AuthError` | Missing or invalid API key for a provider |
|
|
615
|
-
| `ModelNotFoundError` | Model name could not be resolved |
|
|
616
|
-
| `ValidationError` | Invalid input parameters |
|
|
617
|
-
| `ProviderError` | Provider returned an error response |
|
|
618
|
-
| `TimeoutError` | Generation exceeded the timeout |
|
|
619
|
-
| `RateLimitError` | Provider returned HTTP 429 |
|
|
620
|
-
| `StorageError` | R2 upload, delete, or config failure |
|
|
621
|
-
|
|
622
621
|
```typescript
|
|
623
|
-
import {
|
|
622
|
+
import { kling, KlingAuthError, KlingTimeoutError, KlingTaskFailedError } from 'getaiapi'
|
|
624
623
|
|
|
625
624
|
try {
|
|
626
|
-
|
|
625
|
+
await kling.textToVideoV3Pro({ prompt: 'test' })
|
|
627
626
|
} catch (err) {
|
|
628
|
-
if (err instanceof
|
|
629
|
-
|
|
627
|
+
if (err instanceof KlingAuthError) {
|
|
628
|
+
// Missing or invalid credentials
|
|
630
629
|
}
|
|
631
|
-
if (err instanceof
|
|
632
|
-
|
|
630
|
+
if (err instanceof KlingTimeoutError) {
|
|
631
|
+
// Task took too long (increase timeout)
|
|
632
|
+
}
|
|
633
|
+
if (err instanceof KlingTaskFailedError) {
|
|
634
|
+
// Kling rejected the task (content violation, bad params, etc.)
|
|
635
|
+
console.error(err.taskId, err.message)
|
|
633
636
|
}
|
|
634
637
|
}
|
|
635
638
|
```
|
|
636
639
|
|
|
637
|
-
|
|
640
|
+
| Error | Code | When |
|
|
641
|
+
|-------|------|------|
|
|
642
|
+
| `KlingAuthError` | `AUTH_ERROR` | Missing credentials or 401 response |
|
|
643
|
+
| `KlingRateLimitError` | `RATE_LIMIT` | HTTP 429 or body codes 1100-1102 |
|
|
644
|
+
| `KlingApiError` | `API_ERROR` | Provider returned an error |
|
|
645
|
+
| `KlingTimeoutError` | `TIMEOUT` | Polling exceeded timeout |
|
|
646
|
+
| `KlingTaskFailedError` | `TASK_FAILED` | Task status is 'failed' |
|
|
638
647
|
|
|
639
|
-
|
|
648
|
+
All errors extend `KlingError` which extends `Error`.
|
|
640
649
|
|
|
641
|
-
|
|
642
|
-
- `listModels({ category: '...' })` is now `listModels({ input: '...', output: '...' })`
|
|
643
|
-
- No more `readFileSync` -- works in edge runtimes without any bundler config
|
|
650
|
+
## Deprecated: v1 Unified Gateway
|
|
644
651
|
|
|
645
|
-
|
|
652
|
+
The previous `generate()`, `submit()`, `poll()` APIs and the multi-provider registry are deprecated but still exported for backward compatibility. They will be removed in the next major version.
|
|
646
653
|
|
|
647
|
-
|
|
654
|
+
```typescript
|
|
655
|
+
// Deprecated — still works but will be removed
|
|
656
|
+
import { generate } from 'getaiapi'
|
|
657
|
+
await generate({ model: 'flux-schnell', prompt: '...' })
|
|
648
658
|
|
|
649
|
-
|
|
659
|
+
// New — use provider-specific typed functions
|
|
660
|
+
import { kling } from 'getaiapi'
|
|
661
|
+
await kling.textToVideoV3Pro({ prompt: '...' })
|
|
662
|
+
```
|
|
650
663
|
|
|
651
664
|
## License
|
|
652
665
|
|