@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 CHANGED
@@ -1,5 +1,11 @@
1
1
  # @ai-sdk/fal
2
2
 
3
+ ## 2.0.0-beta.34
4
+
5
+ ### Patch Changes
6
+
7
+ - 547145a: Create a schema for Fal AI providerOptions, and deprecate snake_case parameters for camelCase options
8
+
3
9
  ## 2.0.0-beta.33
4
10
 
5
11
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { ProviderV3, ImageModelV3, TranscriptionModelV3, SpeechModelV3 } from '@ai-sdk/provider';
2
- import { FetchFunction } from '@ai-sdk/provider-utils';
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 { FetchFunction } from '@ai-sdk/provider-utils';
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 import_provider_utils5 = require("@ai-sdk/provider-utils");
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 doGenerate({
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, _b, _c, _d;
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, import_provider_utils.postJsonToApi)({
194
+ const { value, responseHeaders } = await (0, import_provider_utils2.postJsonToApi)({
67
195
  url: `${this.config.baseURL}/${this.modelId}`,
68
- headers: (0, import_provider_utils.combineHeaders)(await (0, import_provider_utils.resolve)(this.config.headers), headers),
69
- body: {
70
- prompt,
71
- seed,
72
- image_size: imageSize,
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, import_provider_utils.createJsonResponseHandler)(
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((image) => this.downloadImage(image.url, abortSignal))
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, import_provider_utils.getFromApi)({
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, import_provider_utils.createStatusCodeErrorResponseHandler)(),
140
- successfulResponseHandler: (0, import_provider_utils.createBinaryResponseHandler)(),
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 = import_v4.z.object({
175
- detail: import_v4.z.array(
176
- import_v4.z.object({
177
- loc: import_v4.z.array(import_v4.z.string()),
178
- msg: import_v4.z.string(),
179
- type: import_v4.z.string()
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 = import_v4.z.object({
184
- message: import_v4.z.string()
310
+ var falHttpErrorSchema = import_v42.z.object({
311
+ message: import_v42.z.string()
185
312
  });
186
- var falErrorSchema = import_v4.z.union([falValidationErrorSchema, falHttpErrorSchema]);
187
- var falImageSchema = import_v4.z.object({
188
- url: import_v4.z.string(),
189
- width: import_v4.z.number().nullish(),
190
- height: import_v4.z.number().nullish(),
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: import_v4.z.string().nullish(),
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: import_v4.z.string().nullish(),
195
- file_data: import_v4.z.string().optional(),
196
- file_size: import_v4.z.number().nullish()
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 = import_v4.z.object({
199
- url: import_v4.z.string(),
200
- content_type: import_v4.z.string().optional(),
201
- file_name: import_v4.z.string().nullable().optional(),
202
- file_data: import_v4.z.string().optional(),
203
- file_size: import_v4.z.number().nullable().optional()
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 = import_v4.z.object({
206
- timings: import_v4.z.object({
207
- inference: import_v4.z.number().optional()
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: import_v4.z.number().optional(),
210
- has_nsfw_concepts: import_v4.z.array(import_v4.z.boolean()).optional(),
211
- prompt: import_v4.z.string().optional(),
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: import_v4.z.array(import_v4.z.boolean()).optional(),
214
- num_inference_steps: import_v4.z.number().optional(),
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 = import_v4.z.looseObject(commonResponseSchema.shape);
220
- var falImageResponseSchema = import_v4.z.union([
221
- base.extend({ images: import_v4.z.array(falImageSchema) }),
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: import_v4.z.array(falImageSchema) }));
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, import_provider_utils.createJsonErrorResponseHandler)({
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 import_provider_utils3 = require("@ai-sdk/provider-utils");
241
- var import_v43 = require("zod/v4");
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 import_v42 = require("zod/v4");
245
- var import_provider_utils2 = require("@ai-sdk/provider-utils");
246
- var falErrorDataSchema = import_v42.z.object({
247
- error: import_v42.z.object({
248
- message: import_v42.z.string(),
249
- code: import_v42.z.number()
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, import_provider_utils2.createJsonErrorResponseHandler)({
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 = import_v43.z.object({
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: import_v43.z.union([import_v43.z.enum(["en"]), import_v43.z.string()]).nullish().default("en"),
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: import_v43.z.boolean().nullish().default(true),
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: import_v43.z.enum(["segment", "word"]).nullish().default("segment"),
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: import_v43.z.enum(["3"]).nullish().default("3"),
403
+ version: import_v44.z.enum(["3"]).nullish().default("3"),
277
404
  /**
278
405
  * Default value: 64
279
406
  */
280
- batchSize: import_v43.z.number().nullish().default(64),
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: import_v43.z.number().nullable().nullish()
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, import_provider_utils3.parseProviderOptions)({
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, import_provider_utils3.convertUint8ArrayToBase64)(options.audio);
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, import_provider_utils3.postJsonToApi)({
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, import_provider_utils3.combineHeaders)(this.config.headers(), options.headers),
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, import_provider_utils3.createJsonResponseHandler)(falJobResponseSchema),
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, import_provider_utils3.getFromApi)({
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, import_provider_utils3.combineHeaders)(this.config.headers(), options.headers),
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, import_provider_utils3.createJsonErrorResponseHandler)({
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, import_provider_utils3.createJsonResponseHandler)(
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, import_provider_utils3.delay)(pollIntervalMs);
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 = import_v43.z.object({
433
- request_id: import_v43.z.string().nullish()
559
+ var falJobResponseSchema = import_v44.z.object({
560
+ request_id: import_v44.z.string().nullish()
434
561
  });
435
- var falTranscriptionResponseSchema = import_v43.z.object({
436
- text: import_v43.z.string(),
437
- chunks: import_v43.z.array(
438
- import_v43.z.object({
439
- text: import_v43.z.string(),
440
- timestamp: import_v43.z.array(import_v43.z.number()).nullish()
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: import_v43.z.array(import_v43.z.string()).nullish()
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 import_provider_utils4 = require("@ai-sdk/provider-utils");
448
- var import_v44 = require("zod/v4");
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 = import_v44.z.looseObject({
490
- voice_setting: import_v44.z.object({
491
- speed: import_v44.z.number().nullish(),
492
- vol: import_v44.z.number().nullish(),
493
- voice_id: import_v44.z.string().nullish(),
494
- pitch: import_v44.z.number().nullish(),
495
- english_normalization: import_v44.z.boolean().nullish(),
496
- emotion: import_v44.z.enum(FAL_EMOTIONS).nullish()
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: import_v44.z.record(import_v44.z.string(), import_v44.z.unknown()).nullish(),
499
- language_boost: import_v44.z.enum(FAL_LANGUAGE_BOOSTS).nullish(),
500
- pronunciation_dict: import_v44.z.record(import_v44.z.string(), import_v44.z.string()).nullish()
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, import_provider_utils4.parseProviderOptions)({
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, import_provider_utils4.postJsonToApi)({
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, import_provider_utils4.combineHeaders)(this.config.headers(), options.headers),
688
+ headers: (0, import_provider_utils5.combineHeaders)(this.config.headers(), options.headers),
562
689
  body: requestBody,
563
690
  failedResponseHandler: falFailedResponseHandler2,
564
- successfulResponseHandler: (0, import_provider_utils4.createJsonResponseHandler)(
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, import_provider_utils4.getFromApi)({
698
+ const { value: audio } = await (0, import_provider_utils5.getFromApi)({
572
699
  url: audioUrl,
573
- failedResponseHandler: (0, import_provider_utils4.createStatusCodeErrorResponseHandler)(),
574
- successfulResponseHandler: (0, import_provider_utils4.createBinaryResponseHandler)(),
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 = import_v44.z.object({
594
- audio: import_v44.z.object({ url: import_v44.z.string() }),
595
- duration_ms: import_v44.z.number().optional(),
596
- request_id: import_v44.z.string().optional()
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.33" : "0.0.0-test";
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, import_provider_utils5.withoutTrailingSlash)((_a = options.baseURL) != null ? _a : defaultBaseURL);
638
- const getHeaders = () => (0, import_provider_utils5.withUserAgentSuffix)(
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