@ai-sdk/fal 2.0.0-beta.33 → 2.0.0-beta.34
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 +6 -0
- package/dist/index.d.mts +6 -2
- package/dist/index.d.ts +6 -2
- package/dist/index.js +246 -119
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +221 -93
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
package/dist/index.d.mts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ProviderV3, ImageModelV3, TranscriptionModelV3, SpeechModelV3 } from '@ai-sdk/provider';
|
|
2
|
-
import
|
|
2
|
+
import * as _ai_sdk_provider_utils from '@ai-sdk/provider-utils';
|
|
3
|
+
import { FetchFunction, InferSchema } from '@ai-sdk/provider-utils';
|
|
3
4
|
|
|
4
5
|
type FalImageModelId = 'fal-ai/aura-sr' | 'fal-ai/bria/background/remove' | 'fal-ai/bria/eraser' | 'fal-ai/bria/product-shot' | 'fal-ai/bria/reimagine' | 'bria/text-to-image/3.2' | 'fal-ai/bria/text-to-image/base' | 'fal-ai/bria/text-to-image/fast' | 'fal-ai/bria/text-to-image/hd' | 'fal-ai/bytedance/dreamina/v3.1/text-to-image' | 'fal-ai/ccsr' | 'fal-ai/clarity-upscaler' | 'fal-ai/creative-upscaler' | 'fal-ai/esrgan' | 'fal-ai/flux-general' | 'fal-ai/flux-general/differential-diffusion' | 'fal-ai/flux-general/image-to-image' | 'fal-ai/flux-general/inpainting' | 'fal-ai/flux-general/rf-inversion' | 'fal-ai/flux-kontext-lora/text-to-image' | 'fal-ai/flux-lora' | 'fal-ai/flux-lora/image-to-image' | 'fal-ai/flux-lora/inpainting' | 'fal-ai/flux-pro/kontext' | 'fal-ai/flux-pro/kontext/max' | 'fal-ai/flux-pro/v1.1' | 'fal-ai/flux-pro/v1.1-ultra' | 'fal-ai/flux-pro/v1.1-ultra-finetuned' | 'fal-ai/flux-pro/v1.1-ultra/redux' | 'fal-ai/flux-pro/v1.1/redux' | 'fal-ai/flux/dev' | 'fal-ai/flux/dev/image-to-image' | 'fal-ai/flux/dev/redux' | 'fal-ai/flux/krea' | 'fal-ai/flux/krea/image-to-image' | 'fal-ai/flux/krea/redux' | 'fal-ai/flux/schnell' | 'fal-ai/flux/schnell/redux' | 'fal-ai/ideogram/character' | 'fal-ai/ideogram/character/edit' | 'fal-ai/ideogram/character/remix' | 'fal-ai/imagen4/preview' | 'fal-ai/luma-photon' | 'fal-ai/luma-photon/flash' | 'fal-ai/object-removal' | 'fal-ai/omnigen-v2' | 'fal-ai/qwen-image' | 'fal-ai/recraft/v3/text-to-image' | 'fal-ai/recraft/v3/image-to-image' | 'fal-ai/sana/sprint' | 'fal-ai/sana/v1.5/4.8b' | 'fal-ai/sana/v1.5/1.6b' | 'fal-ai/sky-raccoon' | 'fal-ai/wan/v2.2-5b/text-to-image' | 'fal-ai/wan/v2.2-a14b/text-to-image' | 'fal-ai/fashn/tryon/v1.6' | (string & {});
|
|
5
6
|
|
|
@@ -55,6 +56,9 @@ Default fal.ai provider instance.
|
|
|
55
56
|
*/
|
|
56
57
|
declare const fal: FalProvider;
|
|
57
58
|
|
|
59
|
+
declare const falImageProviderOptionsSchema: _ai_sdk_provider_utils.LazySchema<Record<string, unknown>>;
|
|
60
|
+
type FalImageProviderOptions = InferSchema<typeof falImageProviderOptionsSchema>;
|
|
61
|
+
|
|
58
62
|
declare const VERSION: string;
|
|
59
63
|
|
|
60
|
-
export { type FalProvider, type FalProviderSettings, VERSION, createFal, fal };
|
|
64
|
+
export { type FalImageProviderOptions, type FalProvider, type FalProviderSettings, VERSION, createFal, fal };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ProviderV3, ImageModelV3, TranscriptionModelV3, SpeechModelV3 } from '@ai-sdk/provider';
|
|
2
|
-
import
|
|
2
|
+
import * as _ai_sdk_provider_utils from '@ai-sdk/provider-utils';
|
|
3
|
+
import { FetchFunction, InferSchema } from '@ai-sdk/provider-utils';
|
|
3
4
|
|
|
4
5
|
type FalImageModelId = 'fal-ai/aura-sr' | 'fal-ai/bria/background/remove' | 'fal-ai/bria/eraser' | 'fal-ai/bria/product-shot' | 'fal-ai/bria/reimagine' | 'bria/text-to-image/3.2' | 'fal-ai/bria/text-to-image/base' | 'fal-ai/bria/text-to-image/fast' | 'fal-ai/bria/text-to-image/hd' | 'fal-ai/bytedance/dreamina/v3.1/text-to-image' | 'fal-ai/ccsr' | 'fal-ai/clarity-upscaler' | 'fal-ai/creative-upscaler' | 'fal-ai/esrgan' | 'fal-ai/flux-general' | 'fal-ai/flux-general/differential-diffusion' | 'fal-ai/flux-general/image-to-image' | 'fal-ai/flux-general/inpainting' | 'fal-ai/flux-general/rf-inversion' | 'fal-ai/flux-kontext-lora/text-to-image' | 'fal-ai/flux-lora' | 'fal-ai/flux-lora/image-to-image' | 'fal-ai/flux-lora/inpainting' | 'fal-ai/flux-pro/kontext' | 'fal-ai/flux-pro/kontext/max' | 'fal-ai/flux-pro/v1.1' | 'fal-ai/flux-pro/v1.1-ultra' | 'fal-ai/flux-pro/v1.1-ultra-finetuned' | 'fal-ai/flux-pro/v1.1-ultra/redux' | 'fal-ai/flux-pro/v1.1/redux' | 'fal-ai/flux/dev' | 'fal-ai/flux/dev/image-to-image' | 'fal-ai/flux/dev/redux' | 'fal-ai/flux/krea' | 'fal-ai/flux/krea/image-to-image' | 'fal-ai/flux/krea/redux' | 'fal-ai/flux/schnell' | 'fal-ai/flux/schnell/redux' | 'fal-ai/ideogram/character' | 'fal-ai/ideogram/character/edit' | 'fal-ai/ideogram/character/remix' | 'fal-ai/imagen4/preview' | 'fal-ai/luma-photon' | 'fal-ai/luma-photon/flash' | 'fal-ai/object-removal' | 'fal-ai/omnigen-v2' | 'fal-ai/qwen-image' | 'fal-ai/recraft/v3/text-to-image' | 'fal-ai/recraft/v3/image-to-image' | 'fal-ai/sana/sprint' | 'fal-ai/sana/v1.5/4.8b' | 'fal-ai/sana/v1.5/1.6b' | 'fal-ai/sky-raccoon' | 'fal-ai/wan/v2.2-5b/text-to-image' | 'fal-ai/wan/v2.2-a14b/text-to-image' | 'fal-ai/fashn/tryon/v1.6' | (string & {});
|
|
5
6
|
|
|
@@ -55,6 +56,9 @@ Default fal.ai provider instance.
|
|
|
55
56
|
*/
|
|
56
57
|
declare const fal: FalProvider;
|
|
57
58
|
|
|
59
|
+
declare const falImageProviderOptionsSchema: _ai_sdk_provider_utils.LazySchema<Record<string, unknown>>;
|
|
60
|
+
type FalImageProviderOptions = InferSchema<typeof falImageProviderOptionsSchema>;
|
|
61
|
+
|
|
58
62
|
declare const VERSION: string;
|
|
59
63
|
|
|
60
|
-
export { type FalProvider, type FalProviderSettings, VERSION, createFal, fal };
|
|
64
|
+
export { type FalImageProviderOptions, type FalProvider, type FalProviderSettings, VERSION, createFal, fal };
|
package/dist/index.js
CHANGED
|
@@ -28,11 +28,94 @@ module.exports = __toCommonJS(src_exports);
|
|
|
28
28
|
|
|
29
29
|
// src/fal-provider.ts
|
|
30
30
|
var import_provider2 = require("@ai-sdk/provider");
|
|
31
|
-
var
|
|
31
|
+
var import_provider_utils6 = require("@ai-sdk/provider-utils");
|
|
32
32
|
|
|
33
33
|
// src/fal-image-model.ts
|
|
34
|
+
var import_provider_utils2 = require("@ai-sdk/provider-utils");
|
|
35
|
+
var import_v42 = require("zod/v4");
|
|
36
|
+
|
|
37
|
+
// src/fal-image-options.ts
|
|
34
38
|
var import_provider_utils = require("@ai-sdk/provider-utils");
|
|
35
39
|
var import_v4 = require("zod/v4");
|
|
40
|
+
var falImageProviderOptionsSchema = (0, import_provider_utils.lazySchema)(
|
|
41
|
+
() => (0, import_provider_utils.zodSchema)(
|
|
42
|
+
import_v4.z.object({
|
|
43
|
+
imageUrl: import_v4.z.string().nullish(),
|
|
44
|
+
guidanceScale: import_v4.z.number().min(1).max(20).nullish(),
|
|
45
|
+
numInferenceSteps: import_v4.z.number().min(1).max(50).nullish(),
|
|
46
|
+
enableSafetyChecker: import_v4.z.boolean().nullish(),
|
|
47
|
+
outputFormat: import_v4.z.enum(["jpeg", "png"]).nullish(),
|
|
48
|
+
syncMode: import_v4.z.boolean().nullish(),
|
|
49
|
+
strength: import_v4.z.number().nullish(),
|
|
50
|
+
acceleration: import_v4.z.enum(["none", "regular", "high"]).nullish(),
|
|
51
|
+
safetyTolerance: import_v4.z.enum(["1", "2", "3", "4", "5", "6"]).or(import_v4.z.number().min(1).max(6)).nullish(),
|
|
52
|
+
// Deprecated snake_case versions
|
|
53
|
+
image_url: import_v4.z.string().nullish(),
|
|
54
|
+
guidance_scale: import_v4.z.number().min(1).max(20).nullish(),
|
|
55
|
+
num_inference_steps: import_v4.z.number().min(1).max(50).nullish(),
|
|
56
|
+
enable_safety_checker: import_v4.z.boolean().nullish(),
|
|
57
|
+
output_format: import_v4.z.enum(["jpeg", "png"]).nullish(),
|
|
58
|
+
sync_mode: import_v4.z.boolean().nullish(),
|
|
59
|
+
safety_tolerance: import_v4.z.enum(["1", "2", "3", "4", "5", "6"]).or(import_v4.z.number().min(1).max(6)).nullish()
|
|
60
|
+
}).passthrough().transform((data) => {
|
|
61
|
+
const result = {};
|
|
62
|
+
const deprecatedKeys = [];
|
|
63
|
+
const mapKey = (snakeKey, camelKey) => {
|
|
64
|
+
const snakeValue = data[snakeKey];
|
|
65
|
+
const camelValue = data[camelKey];
|
|
66
|
+
if (snakeValue !== void 0 && snakeValue !== null) {
|
|
67
|
+
deprecatedKeys.push(snakeKey);
|
|
68
|
+
result[camelKey] = snakeValue;
|
|
69
|
+
} else if (camelValue !== void 0 && camelValue !== null) {
|
|
70
|
+
result[camelKey] = camelValue;
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
mapKey("image_url", "imageUrl");
|
|
74
|
+
mapKey("guidance_scale", "guidanceScale");
|
|
75
|
+
mapKey("num_inference_steps", "numInferenceSteps");
|
|
76
|
+
mapKey("enable_safety_checker", "enableSafetyChecker");
|
|
77
|
+
mapKey("output_format", "outputFormat");
|
|
78
|
+
mapKey("sync_mode", "syncMode");
|
|
79
|
+
mapKey("safety_tolerance", "safetyTolerance");
|
|
80
|
+
if (data.strength !== void 0 && data.strength !== null) {
|
|
81
|
+
result.strength = data.strength;
|
|
82
|
+
}
|
|
83
|
+
if (data.acceleration !== void 0 && data.acceleration !== null) {
|
|
84
|
+
result.acceleration = data.acceleration;
|
|
85
|
+
}
|
|
86
|
+
for (const [key, value] of Object.entries(data)) {
|
|
87
|
+
if (![
|
|
88
|
+
// camelCase known keys
|
|
89
|
+
"imageUrl",
|
|
90
|
+
"guidanceScale",
|
|
91
|
+
"numInferenceSteps",
|
|
92
|
+
"enableSafetyChecker",
|
|
93
|
+
"outputFormat",
|
|
94
|
+
"syncMode",
|
|
95
|
+
"strength",
|
|
96
|
+
"acceleration",
|
|
97
|
+
"safetyTolerance",
|
|
98
|
+
// snake_case known keys
|
|
99
|
+
"image_url",
|
|
100
|
+
"guidance_scale",
|
|
101
|
+
"num_inference_steps",
|
|
102
|
+
"enable_safety_checker",
|
|
103
|
+
"output_format",
|
|
104
|
+
"sync_mode",
|
|
105
|
+
"safety_tolerance"
|
|
106
|
+
].includes(key)) {
|
|
107
|
+
result[key] = value;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (deprecatedKeys.length > 0) {
|
|
111
|
+
result.__deprecatedKeys = deprecatedKeys;
|
|
112
|
+
}
|
|
113
|
+
return result;
|
|
114
|
+
})
|
|
115
|
+
)
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
// src/fal-image-model.ts
|
|
36
119
|
var FalImageModel = class {
|
|
37
120
|
constructor(modelId, config) {
|
|
38
121
|
this.modelId = modelId;
|
|
@@ -43,17 +126,15 @@ var FalImageModel = class {
|
|
|
43
126
|
get provider() {
|
|
44
127
|
return this.config.provider;
|
|
45
128
|
}
|
|
46
|
-
async
|
|
129
|
+
async getArgs({
|
|
47
130
|
prompt,
|
|
48
131
|
n,
|
|
49
132
|
size,
|
|
50
133
|
aspectRatio,
|
|
51
134
|
seed,
|
|
52
|
-
providerOptions
|
|
53
|
-
headers,
|
|
54
|
-
abortSignal
|
|
135
|
+
providerOptions
|
|
55
136
|
}) {
|
|
56
|
-
var _a
|
|
137
|
+
var _a;
|
|
57
138
|
const warnings = [];
|
|
58
139
|
let imageSize;
|
|
59
140
|
if (size) {
|
|
@@ -62,22 +143,66 @@ var FalImageModel = class {
|
|
|
62
143
|
} else if (aspectRatio) {
|
|
63
144
|
imageSize = convertAspectRatioToSize(aspectRatio);
|
|
64
145
|
}
|
|
146
|
+
const falOptions = await (0, import_provider_utils2.parseProviderOptions)({
|
|
147
|
+
provider: "fal",
|
|
148
|
+
providerOptions,
|
|
149
|
+
schema: falImageProviderOptionsSchema
|
|
150
|
+
});
|
|
151
|
+
const requestBody = {
|
|
152
|
+
prompt,
|
|
153
|
+
seed,
|
|
154
|
+
image_size: imageSize,
|
|
155
|
+
num_images: n
|
|
156
|
+
};
|
|
157
|
+
if (falOptions) {
|
|
158
|
+
const deprecatedKeys = "__deprecatedKeys" in falOptions ? falOptions.__deprecatedKeys : void 0;
|
|
159
|
+
if (deprecatedKeys && deprecatedKeys.length > 0) {
|
|
160
|
+
warnings.push({
|
|
161
|
+
type: "other",
|
|
162
|
+
message: `The following provider options use deprecated snake_case and will be removed in @ai-sdk/fal v2.0. Please use camelCase instead: ${deprecatedKeys.map((key) => {
|
|
163
|
+
const camelCase = key.replace(
|
|
164
|
+
/_([a-z])/g,
|
|
165
|
+
(_, letter) => letter.toUpperCase()
|
|
166
|
+
);
|
|
167
|
+
return `'${key}' (use '${camelCase}')`;
|
|
168
|
+
}).join(", ")}`
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
const fieldMapping = {
|
|
172
|
+
imageUrl: "image_url",
|
|
173
|
+
guidanceScale: "guidance_scale",
|
|
174
|
+
numInferenceSteps: "num_inference_steps",
|
|
175
|
+
enableSafetyChecker: "enable_safety_checker",
|
|
176
|
+
outputFormat: "output_format",
|
|
177
|
+
syncMode: "sync_mode",
|
|
178
|
+
safetyTolerance: "safety_tolerance"
|
|
179
|
+
};
|
|
180
|
+
for (const [key, value] of Object.entries(falOptions)) {
|
|
181
|
+
if (key === "__deprecatedKeys") continue;
|
|
182
|
+
const apiKey = (_a = fieldMapping[key]) != null ? _a : key;
|
|
183
|
+
if (value !== void 0) {
|
|
184
|
+
requestBody[apiKey] = value;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return { requestBody, warnings };
|
|
189
|
+
}
|
|
190
|
+
async doGenerate(options) {
|
|
191
|
+
var _a, _b, _c;
|
|
192
|
+
const { requestBody, warnings } = await this.getArgs(options);
|
|
65
193
|
const currentDate = (_c = (_b = (_a = this.config._internal) == null ? void 0 : _a.currentDate) == null ? void 0 : _b.call(_a)) != null ? _c : /* @__PURE__ */ new Date();
|
|
66
|
-
const { value, responseHeaders } = await (0,
|
|
194
|
+
const { value, responseHeaders } = await (0, import_provider_utils2.postJsonToApi)({
|
|
67
195
|
url: `${this.config.baseURL}/${this.modelId}`,
|
|
68
|
-
headers: (0,
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
num_images: n,
|
|
74
|
-
...(_d = providerOptions.fal) != null ? _d : {}
|
|
75
|
-
},
|
|
196
|
+
headers: (0, import_provider_utils2.combineHeaders)(
|
|
197
|
+
await (0, import_provider_utils2.resolve)(this.config.headers),
|
|
198
|
+
options.headers
|
|
199
|
+
),
|
|
200
|
+
body: requestBody,
|
|
76
201
|
failedResponseHandler: falFailedResponseHandler,
|
|
77
|
-
successfulResponseHandler: (0,
|
|
202
|
+
successfulResponseHandler: (0, import_provider_utils2.createJsonResponseHandler)(
|
|
78
203
|
falImageResponseSchema
|
|
79
204
|
),
|
|
80
|
-
abortSignal,
|
|
205
|
+
abortSignal: options.abortSignal,
|
|
81
206
|
fetch: this.config.fetch
|
|
82
207
|
});
|
|
83
208
|
const {
|
|
@@ -91,7 +216,9 @@ var FalImageModel = class {
|
|
|
91
216
|
...responseMetaData
|
|
92
217
|
} = value;
|
|
93
218
|
const downloadedImages = await Promise.all(
|
|
94
|
-
targetImages.map(
|
|
219
|
+
targetImages.map(
|
|
220
|
+
(image) => this.downloadImage(image.url, options.abortSignal)
|
|
221
|
+
)
|
|
95
222
|
);
|
|
96
223
|
return {
|
|
97
224
|
images: downloadedImages,
|
|
@@ -131,13 +258,13 @@ var FalImageModel = class {
|
|
|
131
258
|
};
|
|
132
259
|
}
|
|
133
260
|
async downloadImage(url, abortSignal) {
|
|
134
|
-
const { value: response } = await (0,
|
|
261
|
+
const { value: response } = await (0, import_provider_utils2.getFromApi)({
|
|
135
262
|
url,
|
|
136
263
|
// No specific headers should be needed for this request as it's a
|
|
137
264
|
// generated image provided by fal.ai.
|
|
138
265
|
abortSignal,
|
|
139
|
-
failedResponseHandler: (0,
|
|
140
|
-
successfulResponseHandler: (0,
|
|
266
|
+
failedResponseHandler: (0, import_provider_utils2.createStatusCodeErrorResponseHandler)(),
|
|
267
|
+
successfulResponseHandler: (0, import_provider_utils2.createBinaryResponseHandler)(),
|
|
141
268
|
fetch: this.config.fetch
|
|
142
269
|
});
|
|
143
270
|
return response;
|
|
@@ -171,60 +298,60 @@ function convertAspectRatioToSize(aspectRatio) {
|
|
|
171
298
|
}
|
|
172
299
|
return void 0;
|
|
173
300
|
}
|
|
174
|
-
var falValidationErrorSchema =
|
|
175
|
-
detail:
|
|
176
|
-
|
|
177
|
-
loc:
|
|
178
|
-
msg:
|
|
179
|
-
type:
|
|
301
|
+
var falValidationErrorSchema = import_v42.z.object({
|
|
302
|
+
detail: import_v42.z.array(
|
|
303
|
+
import_v42.z.object({
|
|
304
|
+
loc: import_v42.z.array(import_v42.z.string()),
|
|
305
|
+
msg: import_v42.z.string(),
|
|
306
|
+
type: import_v42.z.string()
|
|
180
307
|
})
|
|
181
308
|
)
|
|
182
309
|
});
|
|
183
|
-
var falHttpErrorSchema =
|
|
184
|
-
message:
|
|
310
|
+
var falHttpErrorSchema = import_v42.z.object({
|
|
311
|
+
message: import_v42.z.string()
|
|
185
312
|
});
|
|
186
|
-
var falErrorSchema =
|
|
187
|
-
var falImageSchema =
|
|
188
|
-
url:
|
|
189
|
-
width:
|
|
190
|
-
height:
|
|
313
|
+
var falErrorSchema = import_v42.z.union([falValidationErrorSchema, falHttpErrorSchema]);
|
|
314
|
+
var falImageSchema = import_v42.z.object({
|
|
315
|
+
url: import_v42.z.string(),
|
|
316
|
+
width: import_v42.z.number().nullish(),
|
|
317
|
+
height: import_v42.z.number().nullish(),
|
|
191
318
|
// e.g. https://fal.ai/models/fal-ai/fashn/tryon/v1.6/api#schema-output
|
|
192
|
-
content_type:
|
|
319
|
+
content_type: import_v42.z.string().nullish(),
|
|
193
320
|
// e.g. https://fal.ai/models/fal-ai/flowedit/api#schema-output
|
|
194
|
-
file_name:
|
|
195
|
-
file_data:
|
|
196
|
-
file_size:
|
|
321
|
+
file_name: import_v42.z.string().nullish(),
|
|
322
|
+
file_data: import_v42.z.string().optional(),
|
|
323
|
+
file_size: import_v42.z.number().nullish()
|
|
197
324
|
});
|
|
198
|
-
var loraFileSchema =
|
|
199
|
-
url:
|
|
200
|
-
content_type:
|
|
201
|
-
file_name:
|
|
202
|
-
file_data:
|
|
203
|
-
file_size:
|
|
325
|
+
var loraFileSchema = import_v42.z.object({
|
|
326
|
+
url: import_v42.z.string(),
|
|
327
|
+
content_type: import_v42.z.string().optional(),
|
|
328
|
+
file_name: import_v42.z.string().nullable().optional(),
|
|
329
|
+
file_data: import_v42.z.string().optional(),
|
|
330
|
+
file_size: import_v42.z.number().nullable().optional()
|
|
204
331
|
});
|
|
205
|
-
var commonResponseSchema =
|
|
206
|
-
timings:
|
|
207
|
-
inference:
|
|
332
|
+
var commonResponseSchema = import_v42.z.object({
|
|
333
|
+
timings: import_v42.z.object({
|
|
334
|
+
inference: import_v42.z.number().optional()
|
|
208
335
|
}).optional(),
|
|
209
|
-
seed:
|
|
210
|
-
has_nsfw_concepts:
|
|
211
|
-
prompt:
|
|
336
|
+
seed: import_v42.z.number().optional(),
|
|
337
|
+
has_nsfw_concepts: import_v42.z.array(import_v42.z.boolean()).optional(),
|
|
338
|
+
prompt: import_v42.z.string().optional(),
|
|
212
339
|
// https://fal.ai/models/fal-ai/lcm/api#schema-output
|
|
213
|
-
nsfw_content_detected:
|
|
214
|
-
num_inference_steps:
|
|
340
|
+
nsfw_content_detected: import_v42.z.array(import_v42.z.boolean()).optional(),
|
|
341
|
+
num_inference_steps: import_v42.z.number().optional(),
|
|
215
342
|
// https://fal.ai/models/fal-ai/lora/api#schema-output
|
|
216
343
|
debug_latents: loraFileSchema.optional(),
|
|
217
344
|
debug_per_pass_latents: loraFileSchema.optional()
|
|
218
345
|
});
|
|
219
|
-
var base =
|
|
220
|
-
var falImageResponseSchema =
|
|
221
|
-
base.extend({ images:
|
|
346
|
+
var base = import_v42.z.looseObject(commonResponseSchema.shape);
|
|
347
|
+
var falImageResponseSchema = import_v42.z.union([
|
|
348
|
+
base.extend({ images: import_v42.z.array(falImageSchema) }),
|
|
222
349
|
base.extend({ image: falImageSchema })
|
|
223
|
-
]).transform((v) => "images" in v ? v : { ...v, images: [v.image] }).pipe(base.extend({ images:
|
|
350
|
+
]).transform((v) => "images" in v ? v : { ...v, images: [v.image] }).pipe(base.extend({ images: import_v42.z.array(falImageSchema) }));
|
|
224
351
|
function isValidationError(error) {
|
|
225
352
|
return falValidationErrorSchema.safeParse(error).success;
|
|
226
353
|
}
|
|
227
|
-
var falFailedResponseHandler = (0,
|
|
354
|
+
var falFailedResponseHandler = (0, import_provider_utils2.createJsonErrorResponseHandler)({
|
|
228
355
|
errorSchema: falErrorSchema,
|
|
229
356
|
errorToMessage: (error) => {
|
|
230
357
|
var _a;
|
|
@@ -237,51 +364,51 @@ var falFailedResponseHandler = (0, import_provider_utils.createJsonErrorResponse
|
|
|
237
364
|
|
|
238
365
|
// src/fal-transcription-model.ts
|
|
239
366
|
var import_provider = require("@ai-sdk/provider");
|
|
240
|
-
var
|
|
241
|
-
var
|
|
367
|
+
var import_provider_utils4 = require("@ai-sdk/provider-utils");
|
|
368
|
+
var import_v44 = require("zod/v4");
|
|
242
369
|
|
|
243
370
|
// src/fal-error.ts
|
|
244
|
-
var
|
|
245
|
-
var
|
|
246
|
-
var falErrorDataSchema =
|
|
247
|
-
error:
|
|
248
|
-
message:
|
|
249
|
-
code:
|
|
371
|
+
var import_v43 = require("zod/v4");
|
|
372
|
+
var import_provider_utils3 = require("@ai-sdk/provider-utils");
|
|
373
|
+
var falErrorDataSchema = import_v43.z.object({
|
|
374
|
+
error: import_v43.z.object({
|
|
375
|
+
message: import_v43.z.string(),
|
|
376
|
+
code: import_v43.z.number()
|
|
250
377
|
})
|
|
251
378
|
});
|
|
252
|
-
var falFailedResponseHandler2 = (0,
|
|
379
|
+
var falFailedResponseHandler2 = (0, import_provider_utils3.createJsonErrorResponseHandler)({
|
|
253
380
|
errorSchema: falErrorDataSchema,
|
|
254
381
|
errorToMessage: (data) => data.error.message
|
|
255
382
|
});
|
|
256
383
|
|
|
257
384
|
// src/fal-transcription-model.ts
|
|
258
|
-
var falProviderOptionsSchema =
|
|
385
|
+
var falProviderOptionsSchema = import_v44.z.object({
|
|
259
386
|
/**
|
|
260
387
|
* Language of the audio file. If set to null, the language will be automatically detected. Defaults to null.
|
|
261
388
|
*
|
|
262
389
|
* If translate is selected as the task, the audio will be translated to English, regardless of the language selected.
|
|
263
390
|
*/
|
|
264
|
-
language:
|
|
391
|
+
language: import_v44.z.union([import_v44.z.enum(["en"]), import_v44.z.string()]).nullish().default("en"),
|
|
265
392
|
/**
|
|
266
393
|
* Whether to diarize the audio file. Defaults to true.
|
|
267
394
|
*/
|
|
268
|
-
diarize:
|
|
395
|
+
diarize: import_v44.z.boolean().nullish().default(true),
|
|
269
396
|
/**
|
|
270
397
|
* Level of the chunks to return. Either segment or word. Default value: "segment"
|
|
271
398
|
*/
|
|
272
|
-
chunkLevel:
|
|
399
|
+
chunkLevel: import_v44.z.enum(["segment", "word"]).nullish().default("segment"),
|
|
273
400
|
/**
|
|
274
401
|
* Version of the model to use. All of the models are the Whisper large variant. Default value: "3"
|
|
275
402
|
*/
|
|
276
|
-
version:
|
|
403
|
+
version: import_v44.z.enum(["3"]).nullish().default("3"),
|
|
277
404
|
/**
|
|
278
405
|
* Default value: 64
|
|
279
406
|
*/
|
|
280
|
-
batchSize:
|
|
407
|
+
batchSize: import_v44.z.number().nullish().default(64),
|
|
281
408
|
/**
|
|
282
409
|
* Number of speakers in the audio file. Defaults to null. If not provided, the number of speakers will be automatically detected.
|
|
283
410
|
*/
|
|
284
|
-
numSpeakers:
|
|
411
|
+
numSpeakers: import_v44.z.number().nullable().nullish()
|
|
285
412
|
});
|
|
286
413
|
var FalTranscriptionModel = class {
|
|
287
414
|
constructor(modelId, config) {
|
|
@@ -297,7 +424,7 @@ var FalTranscriptionModel = class {
|
|
|
297
424
|
}) {
|
|
298
425
|
var _a, _b, _c;
|
|
299
426
|
const warnings = [];
|
|
300
|
-
const falOptions = await (0,
|
|
427
|
+
const falOptions = await (0, import_provider_utils4.parseProviderOptions)({
|
|
301
428
|
provider: "fal",
|
|
302
429
|
providerOptions,
|
|
303
430
|
schema: falProviderOptionsSchema
|
|
@@ -328,20 +455,20 @@ var FalTranscriptionModel = class {
|
|
|
328
455
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
|
|
329
456
|
const currentDate = (_c = (_b = (_a = this.config._internal) == null ? void 0 : _a.currentDate) == null ? void 0 : _b.call(_a)) != null ? _c : /* @__PURE__ */ new Date();
|
|
330
457
|
const { body, warnings } = await this.getArgs(options);
|
|
331
|
-
const base64Audio = typeof options.audio === "string" ? options.audio : (0,
|
|
458
|
+
const base64Audio = typeof options.audio === "string" ? options.audio : (0, import_provider_utils4.convertUint8ArrayToBase64)(options.audio);
|
|
332
459
|
const audioUrl = `data:${options.mediaType};base64,${base64Audio}`;
|
|
333
|
-
const { value: queueResponse } = await (0,
|
|
460
|
+
const { value: queueResponse } = await (0, import_provider_utils4.postJsonToApi)({
|
|
334
461
|
url: this.config.url({
|
|
335
462
|
path: `https://queue.fal.run/fal-ai/${this.modelId}`,
|
|
336
463
|
modelId: this.modelId
|
|
337
464
|
}),
|
|
338
|
-
headers: (0,
|
|
465
|
+
headers: (0, import_provider_utils4.combineHeaders)(this.config.headers(), options.headers),
|
|
339
466
|
body: {
|
|
340
467
|
...body,
|
|
341
468
|
audio_url: audioUrl
|
|
342
469
|
},
|
|
343
470
|
failedResponseHandler: falFailedResponseHandler2,
|
|
344
|
-
successfulResponseHandler: (0,
|
|
471
|
+
successfulResponseHandler: (0, import_provider_utils4.createJsonResponseHandler)(falJobResponseSchema),
|
|
345
472
|
abortSignal: options.abortSignal,
|
|
346
473
|
fetch: this.config.fetch
|
|
347
474
|
});
|
|
@@ -357,12 +484,12 @@ var FalTranscriptionModel = class {
|
|
|
357
484
|
value: statusResponse,
|
|
358
485
|
responseHeaders: statusHeaders,
|
|
359
486
|
rawValue: statusRawResponse
|
|
360
|
-
} = await (0,
|
|
487
|
+
} = await (0, import_provider_utils4.getFromApi)({
|
|
361
488
|
url: this.config.url({
|
|
362
489
|
path: `https://queue.fal.run/fal-ai/${this.modelId}/requests/${queueResponse.request_id}`,
|
|
363
490
|
modelId: this.modelId
|
|
364
491
|
}),
|
|
365
|
-
headers: (0,
|
|
492
|
+
headers: (0, import_provider_utils4.combineHeaders)(this.config.headers(), options.headers),
|
|
366
493
|
failedResponseHandler: async ({
|
|
367
494
|
requestBodyValues,
|
|
368
495
|
response: response2,
|
|
@@ -377,12 +504,12 @@ var FalTranscriptionModel = class {
|
|
|
377
504
|
responseHeaders: {}
|
|
378
505
|
};
|
|
379
506
|
}
|
|
380
|
-
return (0,
|
|
507
|
+
return (0, import_provider_utils4.createJsonErrorResponseHandler)({
|
|
381
508
|
errorSchema: falErrorDataSchema,
|
|
382
509
|
errorToMessage: (data) => data.error.message
|
|
383
510
|
})({ requestBodyValues, response: response2, url });
|
|
384
511
|
},
|
|
385
|
-
successfulResponseHandler: (0,
|
|
512
|
+
successfulResponseHandler: (0, import_provider_utils4.createJsonResponseHandler)(
|
|
386
513
|
falTranscriptionResponseSchema
|
|
387
514
|
),
|
|
388
515
|
abortSignal: options.abortSignal,
|
|
@@ -405,7 +532,7 @@ var FalTranscriptionModel = class {
|
|
|
405
532
|
cause: response
|
|
406
533
|
});
|
|
407
534
|
}
|
|
408
|
-
await (0,
|
|
535
|
+
await (0, import_provider_utils4.delay)(pollIntervalMs);
|
|
409
536
|
}
|
|
410
537
|
return {
|
|
411
538
|
text: response.text,
|
|
@@ -429,23 +556,23 @@ var FalTranscriptionModel = class {
|
|
|
429
556
|
};
|
|
430
557
|
}
|
|
431
558
|
};
|
|
432
|
-
var falJobResponseSchema =
|
|
433
|
-
request_id:
|
|
559
|
+
var falJobResponseSchema = import_v44.z.object({
|
|
560
|
+
request_id: import_v44.z.string().nullish()
|
|
434
561
|
});
|
|
435
|
-
var falTranscriptionResponseSchema =
|
|
436
|
-
text:
|
|
437
|
-
chunks:
|
|
438
|
-
|
|
439
|
-
text:
|
|
440
|
-
timestamp:
|
|
562
|
+
var falTranscriptionResponseSchema = import_v44.z.object({
|
|
563
|
+
text: import_v44.z.string(),
|
|
564
|
+
chunks: import_v44.z.array(
|
|
565
|
+
import_v44.z.object({
|
|
566
|
+
text: import_v44.z.string(),
|
|
567
|
+
timestamp: import_v44.z.array(import_v44.z.number()).nullish()
|
|
441
568
|
})
|
|
442
569
|
).nullish(),
|
|
443
|
-
inferred_languages:
|
|
570
|
+
inferred_languages: import_v44.z.array(import_v44.z.string()).nullish()
|
|
444
571
|
});
|
|
445
572
|
|
|
446
573
|
// src/fal-speech-model.ts
|
|
447
|
-
var
|
|
448
|
-
var
|
|
574
|
+
var import_provider_utils5 = require("@ai-sdk/provider-utils");
|
|
575
|
+
var import_v45 = require("zod/v4");
|
|
449
576
|
|
|
450
577
|
// src/fal-api-types.ts
|
|
451
578
|
var FAL_LANGUAGE_BOOSTS = [
|
|
@@ -486,18 +613,18 @@ var FAL_EMOTIONS = [
|
|
|
486
613
|
];
|
|
487
614
|
|
|
488
615
|
// src/fal-speech-model.ts
|
|
489
|
-
var falSpeechProviderOptionsSchema =
|
|
490
|
-
voice_setting:
|
|
491
|
-
speed:
|
|
492
|
-
vol:
|
|
493
|
-
voice_id:
|
|
494
|
-
pitch:
|
|
495
|
-
english_normalization:
|
|
496
|
-
emotion:
|
|
616
|
+
var falSpeechProviderOptionsSchema = import_v45.z.looseObject({
|
|
617
|
+
voice_setting: import_v45.z.object({
|
|
618
|
+
speed: import_v45.z.number().nullish(),
|
|
619
|
+
vol: import_v45.z.number().nullish(),
|
|
620
|
+
voice_id: import_v45.z.string().nullish(),
|
|
621
|
+
pitch: import_v45.z.number().nullish(),
|
|
622
|
+
english_normalization: import_v45.z.boolean().nullish(),
|
|
623
|
+
emotion: import_v45.z.enum(FAL_EMOTIONS).nullish()
|
|
497
624
|
}).partial().nullish(),
|
|
498
|
-
audio_setting:
|
|
499
|
-
language_boost:
|
|
500
|
-
pronunciation_dict:
|
|
625
|
+
audio_setting: import_v45.z.record(import_v45.z.string(), import_v45.z.unknown()).nullish(),
|
|
626
|
+
language_boost: import_v45.z.enum(FAL_LANGUAGE_BOOSTS).nullish(),
|
|
627
|
+
pronunciation_dict: import_v45.z.record(import_v45.z.string(), import_v45.z.string()).nullish()
|
|
501
628
|
});
|
|
502
629
|
var FalSpeechModel = class {
|
|
503
630
|
constructor(modelId, config) {
|
|
@@ -517,7 +644,7 @@ var FalSpeechModel = class {
|
|
|
517
644
|
providerOptions
|
|
518
645
|
}) {
|
|
519
646
|
const warnings = [];
|
|
520
|
-
const falOptions = await (0,
|
|
647
|
+
const falOptions = await (0, import_provider_utils5.parseProviderOptions)({
|
|
521
648
|
provider: "fal",
|
|
522
649
|
providerOptions,
|
|
523
650
|
schema: falSpeechProviderOptionsSchema
|
|
@@ -553,25 +680,25 @@ var FalSpeechModel = class {
|
|
|
553
680
|
value: json,
|
|
554
681
|
responseHeaders,
|
|
555
682
|
rawValue
|
|
556
|
-
} = await (0,
|
|
683
|
+
} = await (0, import_provider_utils5.postJsonToApi)({
|
|
557
684
|
url: this.config.url({
|
|
558
685
|
path: `https://fal.run/${this.modelId}`,
|
|
559
686
|
modelId: this.modelId
|
|
560
687
|
}),
|
|
561
|
-
headers: (0,
|
|
688
|
+
headers: (0, import_provider_utils5.combineHeaders)(this.config.headers(), options.headers),
|
|
562
689
|
body: requestBody,
|
|
563
690
|
failedResponseHandler: falFailedResponseHandler2,
|
|
564
|
-
successfulResponseHandler: (0,
|
|
691
|
+
successfulResponseHandler: (0, import_provider_utils5.createJsonResponseHandler)(
|
|
565
692
|
falSpeechResponseSchema
|
|
566
693
|
),
|
|
567
694
|
abortSignal: options.abortSignal,
|
|
568
695
|
fetch: this.config.fetch
|
|
569
696
|
});
|
|
570
697
|
const audioUrl = json.audio.url;
|
|
571
|
-
const { value: audio } = await (0,
|
|
698
|
+
const { value: audio } = await (0, import_provider_utils5.getFromApi)({
|
|
572
699
|
url: audioUrl,
|
|
573
|
-
failedResponseHandler: (0,
|
|
574
|
-
successfulResponseHandler: (0,
|
|
700
|
+
failedResponseHandler: (0, import_provider_utils5.createStatusCodeErrorResponseHandler)(),
|
|
701
|
+
successfulResponseHandler: (0, import_provider_utils5.createBinaryResponseHandler)(),
|
|
575
702
|
abortSignal: options.abortSignal,
|
|
576
703
|
fetch: this.config.fetch
|
|
577
704
|
});
|
|
@@ -590,14 +717,14 @@ var FalSpeechModel = class {
|
|
|
590
717
|
};
|
|
591
718
|
}
|
|
592
719
|
};
|
|
593
|
-
var falSpeechResponseSchema =
|
|
594
|
-
audio:
|
|
595
|
-
duration_ms:
|
|
596
|
-
request_id:
|
|
720
|
+
var falSpeechResponseSchema = import_v45.z.object({
|
|
721
|
+
audio: import_v45.z.object({ url: import_v45.z.string() }),
|
|
722
|
+
duration_ms: import_v45.z.number().optional(),
|
|
723
|
+
request_id: import_v45.z.string().optional()
|
|
597
724
|
});
|
|
598
725
|
|
|
599
726
|
// src/version.ts
|
|
600
|
-
var VERSION = true ? "2.0.0-beta.
|
|
727
|
+
var VERSION = true ? "2.0.0-beta.34" : "0.0.0-test";
|
|
601
728
|
|
|
602
729
|
// src/fal-provider.ts
|
|
603
730
|
var defaultBaseURL = "https://fal.run";
|
|
@@ -634,8 +761,8 @@ function loadFalApiKey({
|
|
|
634
761
|
}
|
|
635
762
|
function createFal(options = {}) {
|
|
636
763
|
var _a;
|
|
637
|
-
const baseURL = (0,
|
|
638
|
-
const getHeaders = () => (0,
|
|
764
|
+
const baseURL = (0, import_provider_utils6.withoutTrailingSlash)((_a = options.baseURL) != null ? _a : defaultBaseURL);
|
|
765
|
+
const getHeaders = () => (0, import_provider_utils6.withUserAgentSuffix)(
|
|
639
766
|
{
|
|
640
767
|
Authorization: `Key ${loadFalApiKey({
|
|
641
768
|
apiKey: options.apiKey
|