@ai-sdk/fal 2.0.0-beta.36 → 2.0.0-beta.38

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,36 @@
1
1
  # @ai-sdk/fal
2
2
 
3
+ ## 2.0.0-beta.38
4
+
5
+ ### Patch Changes
6
+
7
+ - 457318b: chore(provider,ai): switch to SharedV3Warning and unified warnings
8
+ - Updated dependencies [457318b]
9
+ - @ai-sdk/provider@3.0.0-beta.20
10
+ - @ai-sdk/provider-utils@4.0.0-beta.37
11
+
12
+ ## 2.0.0-beta.37
13
+
14
+ ### Patch Changes
15
+
16
+ - 8d9e8ad: chore(provider): remove generics from EmbeddingModelV3
17
+
18
+ Before
19
+
20
+ ```ts
21
+ model.textEmbeddingModel('my-model-id');
22
+ ```
23
+
24
+ After
25
+
26
+ ```ts
27
+ model.embeddingModel('my-model-id');
28
+ ```
29
+
30
+ - Updated dependencies [8d9e8ad]
31
+ - @ai-sdk/provider@3.0.0-beta.19
32
+ - @ai-sdk/provider-utils@4.0.0-beta.36
33
+
3
34
  ## 2.0.0-beta.36
4
35
 
5
36
  ### Patch Changes
package/dist/index.js CHANGED
@@ -658,16 +658,16 @@ var FalSpeechModel = class {
658
658
  };
659
659
  if (language) {
660
660
  warnings.push({
661
- type: "unsupported-setting",
662
- setting: "language",
661
+ type: "unsupported",
662
+ feature: "language",
663
663
  details: "fal speech models don't support 'language' directly; consider providerOptions.fal.language_boost"
664
664
  });
665
665
  }
666
666
  if (outputFormat && outputFormat !== "url" && outputFormat !== "hex") {
667
667
  warnings.push({
668
- type: "unsupported-setting",
669
- setting: "outputFormat",
670
- details: `Unsupported or unhandled outputFormat: ${outputFormat}. Using 'url' instead.`
668
+ type: "unsupported",
669
+ feature: "outputFormat",
670
+ details: `Unsupported outputFormat: ${outputFormat}. Using 'url' instead.`
671
671
  });
672
672
  }
673
673
  return { requestBody, warnings };
@@ -724,7 +724,7 @@ var falSpeechResponseSchema = import_v45.z.object({
724
724
  });
725
725
 
726
726
  // src/version.ts
727
- var VERSION = true ? "2.0.0-beta.36" : "0.0.0-test";
727
+ var VERSION = true ? "2.0.0-beta.38" : "0.0.0-test";
728
728
 
729
729
  // src/fal-provider.ts
730
730
  var defaultBaseURL = "https://fal.run";
@@ -793,17 +793,17 @@ function createFal(options = {}) {
793
793
  specificationVersion: "v3",
794
794
  imageModel: createImageModel,
795
795
  image: createImageModel,
796
- languageModel: () => {
796
+ languageModel: (modelId) => {
797
797
  throw new import_provider2.NoSuchModelError({
798
- modelId: "languageModel",
798
+ modelId,
799
799
  modelType: "languageModel"
800
800
  });
801
801
  },
802
802
  speech: createSpeechModel,
803
- textEmbeddingModel: () => {
803
+ embeddingModel: (modelId) => {
804
804
  throw new import_provider2.NoSuchModelError({
805
- modelId: "textEmbeddingModel",
806
- modelType: "textEmbeddingModel"
805
+ modelId,
806
+ modelType: "embeddingModel"
807
807
  });
808
808
  },
809
809
  transcription: createTranscriptionModel
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/fal-provider.ts","../src/fal-image-model.ts","../src/fal-image-options.ts","../src/fal-transcription-model.ts","../src/fal-error.ts","../src/fal-speech-model.ts","../src/fal-api-types.ts","../src/version.ts"],"sourcesContent":["export { createFal, fal } from './fal-provider';\nexport type { FalProvider, FalProviderSettings } from './fal-provider';\nexport type { FalImageProviderOptions } from './fal-image-options';\nexport { VERSION } from './version';\n","import {\n ImageModelV3,\n NoSuchModelError,\n ProviderV3,\n SpeechModelV3,\n TranscriptionModelV3,\n} from '@ai-sdk/provider';\nimport type { FetchFunction } from '@ai-sdk/provider-utils';\nimport {\n withoutTrailingSlash,\n withUserAgentSuffix,\n} from '@ai-sdk/provider-utils';\nimport { FalImageModel } from './fal-image-model';\nimport { FalImageModelId } from './fal-image-settings';\nimport { FalTranscriptionModelId } from './fal-transcription-options';\nimport { FalTranscriptionModel } from './fal-transcription-model';\nimport { FalSpeechModelId } from './fal-speech-settings';\nimport { FalSpeechModel } from './fal-speech-model';\nimport { VERSION } from './version';\n\nexport interface FalProviderSettings {\n /**\nfal.ai API key. Default value is taken from the `FAL_API_KEY` environment\nvariable, falling back to `FAL_KEY`.\n */\n apiKey?: string;\n\n /**\nBase URL for the API calls.\nThe default prefix is `https://fal.run`.\n */\n baseURL?: string;\n\n /**\nCustom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\nCustom fetch implementation. You can use it as a middleware to intercept\nrequests, or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport interface FalProvider extends ProviderV3 {\n /**\nCreates a model for image generation.\n */\n image(modelId: FalImageModelId): ImageModelV3;\n\n /**\nCreates a model for image generation.\n */\n imageModel(modelId: FalImageModelId): ImageModelV3;\n\n /**\nCreates a model for transcription.\n */\n transcription(modelId: FalTranscriptionModelId): TranscriptionModelV3;\n\n /**\nCreates a model for speech generation.\n */\n speech(modelId: FalSpeechModelId): SpeechModelV3;\n}\n\nconst defaultBaseURL = 'https://fal.run';\n\nfunction loadFalApiKey({\n apiKey,\n description = 'fal.ai',\n}: {\n apiKey: string | undefined;\n description?: string;\n}): string {\n if (typeof apiKey === 'string') {\n return apiKey;\n }\n\n if (apiKey != null) {\n throw new Error(`${description} API key must be a string.`);\n }\n\n if (typeof process === 'undefined') {\n throw new Error(\n `${description} API key is missing. Pass it using the 'apiKey' parameter. Environment variables are not supported in this environment.`,\n );\n }\n\n let envApiKey = process.env.FAL_API_KEY;\n if (envApiKey == null) {\n envApiKey = process.env.FAL_KEY;\n }\n\n if (envApiKey == null) {\n throw new Error(\n `${description} API key is missing. Pass it using the 'apiKey' parameter or set either the FAL_API_KEY or FAL_KEY environment variable.`,\n );\n }\n\n if (typeof envApiKey !== 'string') {\n throw new Error(\n `${description} API key must be a string. The value of the environment variable is not a string.`,\n );\n }\n\n return envApiKey;\n}\n\n/**\nCreate a fal.ai provider instance.\n */\nexport function createFal(options: FalProviderSettings = {}): FalProvider {\n const baseURL = withoutTrailingSlash(options.baseURL ?? defaultBaseURL);\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Key ${loadFalApiKey({\n apiKey: options.apiKey,\n })}`,\n ...options.headers,\n },\n `ai-sdk/fal/${VERSION}`,\n );\n\n const createImageModel = (modelId: FalImageModelId) =>\n new FalImageModel(modelId, {\n provider: 'fal.image',\n baseURL: baseURL ?? defaultBaseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createSpeechModel = (modelId: FalSpeechModelId) =>\n new FalSpeechModel(modelId, {\n provider: `fal.speech`,\n url: ({ path }) => path,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createTranscriptionModel = (modelId: FalTranscriptionModelId) =>\n new FalTranscriptionModel(modelId, {\n provider: `fal.transcription`,\n url: ({ path }) => path,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n return {\n specificationVersion: 'v3' as const,\n imageModel: createImageModel,\n image: createImageModel,\n languageModel: () => {\n throw new NoSuchModelError({\n modelId: 'languageModel',\n modelType: 'languageModel',\n });\n },\n speech: createSpeechModel,\n textEmbeddingModel: () => {\n throw new NoSuchModelError({\n modelId: 'textEmbeddingModel',\n modelType: 'textEmbeddingModel',\n });\n },\n transcription: createTranscriptionModel,\n };\n}\n\n/**\nDefault fal.ai provider instance.\n */\nexport const fal = createFal();\n","import type { ImageModelV3, ImageModelV3CallWarning } from '@ai-sdk/provider';\nimport type { Resolvable } from '@ai-sdk/provider-utils';\nimport {\n FetchFunction,\n combineHeaders,\n createBinaryResponseHandler,\n createJsonResponseHandler,\n createJsonErrorResponseHandler,\n createStatusCodeErrorResponseHandler,\n getFromApi,\n parseProviderOptions,\n postJsonToApi,\n resolve,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { FalImageModelId, FalImageSize } from './fal-image-settings';\nimport { falImageProviderOptionsSchema } from './fal-image-options';\n\ninterface FalImageModelConfig {\n provider: string;\n baseURL: string;\n headers?: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class FalImageModel implements ImageModelV3 {\n readonly specificationVersion = 'v3';\n readonly maxImagesPerCall = 1;\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: FalImageModelId,\n private readonly config: FalImageModelConfig,\n ) {}\n\n private async getArgs({\n prompt,\n n,\n size,\n aspectRatio,\n seed,\n providerOptions,\n }: Parameters<ImageModelV3['doGenerate']>[0]) {\n const warnings: Array<ImageModelV3CallWarning> = [];\n\n let imageSize: FalImageSize | undefined;\n if (size) {\n const [width, height] = size.split('x').map(Number);\n imageSize = { width, height };\n } else if (aspectRatio) {\n imageSize = convertAspectRatioToSize(aspectRatio);\n }\n\n const falOptions = await parseProviderOptions({\n provider: 'fal',\n providerOptions,\n schema: falImageProviderOptionsSchema,\n });\n\n const requestBody: Record<string, unknown> = {\n prompt,\n seed,\n image_size: imageSize,\n num_images: n,\n };\n\n if (falOptions) {\n const deprecatedKeys =\n '__deprecatedKeys' in falOptions\n ? (falOptions.__deprecatedKeys as string[])\n : undefined;\n\n if (deprecatedKeys && deprecatedKeys.length > 0) {\n warnings.push({\n type: 'other',\n message: `The following provider options use deprecated snake_case and will be removed in @ai-sdk/fal v2.0. Please use camelCase instead: ${deprecatedKeys\n .map(key => {\n const camelCase = key.replace(/_([a-z])/g, (_, letter) =>\n letter.toUpperCase(),\n );\n return `'${key}' (use '${camelCase}')`;\n })\n .join(', ')}`,\n });\n }\n\n const fieldMapping: Record<string, string> = {\n imageUrl: 'image_url',\n guidanceScale: 'guidance_scale',\n numInferenceSteps: 'num_inference_steps',\n enableSafetyChecker: 'enable_safety_checker',\n outputFormat: 'output_format',\n syncMode: 'sync_mode',\n safetyTolerance: 'safety_tolerance',\n };\n\n for (const [key, value] of Object.entries(falOptions)) {\n if (key === '__deprecatedKeys') continue;\n const apiKey = fieldMapping[key] ?? key;\n\n if (value !== undefined) {\n requestBody[apiKey] = value;\n }\n }\n }\n\n return { requestBody, warnings } as const;\n }\n\n async doGenerate(\n options: Parameters<ImageModelV3['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<ImageModelV3['doGenerate']>>> {\n const { requestBody, warnings } = await this.getArgs(options);\n\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const { value, responseHeaders } = await postJsonToApi({\n url: `${this.config.baseURL}/${this.modelId}`,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n body: requestBody,\n failedResponseHandler: falFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n falImageResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const {\n images: targetImages,\n // prompt is just passed through and not a revised prompt per image\n prompt: _prompt,\n // NSFW information is normalized merged into `providerMetadata.fal.images`\n has_nsfw_concepts,\n nsfw_content_detected,\n // pass through other properties to providerMetadata\n ...responseMetaData\n } = value;\n\n // download the images:\n const downloadedImages = await Promise.all(\n targetImages.map(image =>\n this.downloadImage(image.url, options.abortSignal),\n ),\n );\n\n return {\n images: downloadedImages,\n warnings,\n response: {\n modelId: this.modelId,\n timestamp: currentDate,\n headers: responseHeaders,\n },\n providerMetadata: {\n fal: {\n images: targetImages.map((image, index) => {\n const {\n url,\n content_type: contentType,\n file_name: fileName,\n file_data: fileData,\n file_size: fileSize,\n ...imageMetaData\n } = image;\n\n const nsfw =\n has_nsfw_concepts?.[index] ?? nsfw_content_detected?.[index];\n\n return {\n ...imageMetaData,\n ...removeOnlyUndefined({\n contentType,\n fileName,\n fileData,\n fileSize,\n nsfw,\n }),\n };\n }),\n ...responseMetaData,\n },\n },\n };\n }\n\n private async downloadImage(\n url: string,\n abortSignal: AbortSignal | undefined,\n ): Promise<Uint8Array> {\n const { value: response } = await getFromApi({\n url,\n // No specific headers should be needed for this request as it's a\n // generated image provided by fal.ai.\n abortSignal,\n failedResponseHandler: createStatusCodeErrorResponseHandler(),\n successfulResponseHandler: createBinaryResponseHandler(),\n fetch: this.config.fetch,\n });\n return response;\n }\n}\n\nfunction removeOnlyUndefined<T extends Record<string, unknown>>(obj: T) {\n return Object.fromEntries(\n Object.entries(obj).filter(([, v]) => v !== undefined),\n ) as Partial<T>;\n}\n\n/**\nConverts an aspect ratio to an image size compatible with fal.ai APIs.\n@param aspectRatio - The aspect ratio to convert.\n@returns The image size.\n */\nfunction convertAspectRatioToSize(\n aspectRatio: `${number}:${number}`,\n): FalImageSize | undefined {\n switch (aspectRatio) {\n case '1:1':\n return 'square_hd';\n case '16:9':\n return 'landscape_16_9';\n case '9:16':\n return 'portrait_16_9';\n case '4:3':\n return 'landscape_4_3';\n case '3:4':\n return 'portrait_4_3';\n case '16:10':\n return { width: 1280, height: 800 };\n case '10:16':\n return { width: 800, height: 1280 };\n case '21:9':\n return { width: 2560, height: 1080 };\n case '9:21':\n return { width: 1080, height: 2560 };\n }\n return undefined;\n}\n\n// Validation error has a particular payload to inform the exact property that is invalid\nconst falValidationErrorSchema = z.object({\n detail: z.array(\n z.object({\n loc: z.array(z.string()),\n msg: z.string(),\n type: z.string(),\n }),\n ),\n});\n\ntype ValidationError = z.infer<typeof falValidationErrorSchema>;\n\n// Other errors have a message property\nconst falHttpErrorSchema = z.object({\n message: z.string(),\n});\n\nconst falErrorSchema = z.union([falValidationErrorSchema, falHttpErrorSchema]);\n\nconst falImageSchema = z.object({\n url: z.string(),\n width: z.number().nullish(),\n height: z.number().nullish(),\n // e.g. https://fal.ai/models/fal-ai/fashn/tryon/v1.6/api#schema-output\n content_type: z.string().nullish(),\n // e.g. https://fal.ai/models/fal-ai/flowedit/api#schema-output\n file_name: z.string().nullish(),\n file_data: z.string().optional(),\n file_size: z.number().nullish(),\n});\n\n// https://fal.ai/models/fal-ai/lora/api#type-File\nconst loraFileSchema = z.object({\n url: z.string(),\n content_type: z.string().optional(),\n file_name: z.string().nullable().optional(),\n file_data: z.string().optional(),\n file_size: z.number().nullable().optional(),\n});\n\nconst commonResponseSchema = z.object({\n timings: z\n .object({\n inference: z.number().optional(),\n })\n .optional(),\n seed: z.number().optional(),\n has_nsfw_concepts: z.array(z.boolean()).optional(),\n prompt: z.string().optional(),\n // https://fal.ai/models/fal-ai/lcm/api#schema-output\n nsfw_content_detected: z.array(z.boolean()).optional(),\n num_inference_steps: z.number().optional(),\n // https://fal.ai/models/fal-ai/lora/api#schema-output\n debug_latents: loraFileSchema.optional(),\n debug_per_pass_latents: loraFileSchema.optional(),\n});\n\n// Most FAL image models respond with an array of images, but some have a response\n// with a single image, e.g. https://fal.ai/models/easel-ai/easel-avatar/api#schema-output\nconst base = z.looseObject(commonResponseSchema.shape);\nconst falImageResponseSchema = z\n .union([\n base.extend({ images: z.array(falImageSchema) }),\n base.extend({ image: falImageSchema }),\n ])\n .transform(v => ('images' in v ? v : { ...v, images: [v.image] }))\n .pipe(base.extend({ images: z.array(falImageSchema) }));\n\nfunction isValidationError(error: unknown): error is ValidationError {\n return falValidationErrorSchema.safeParse(error).success;\n}\n\nconst falFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: falErrorSchema,\n errorToMessage: error => {\n if (isValidationError(error)) {\n return error.detail\n .map(detail => `${detail.loc.join('.')}: ${detail.msg}`)\n .join('\\n');\n }\n return error.message ?? 'Unknown fal error';\n },\n});\n","import { InferSchema, lazySchema, zodSchema } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport const falImageProviderOptionsSchema = lazySchema(() =>\n zodSchema(\n z\n .object({\n imageUrl: z.string().nullish(),\n guidanceScale: z.number().min(1).max(20).nullish(),\n numInferenceSteps: z.number().min(1).max(50).nullish(),\n enableSafetyChecker: z.boolean().nullish(),\n outputFormat: z.enum(['jpeg', 'png']).nullish(),\n syncMode: z.boolean().nullish(),\n strength: z.number().nullish(),\n acceleration: z.enum(['none', 'regular', 'high']).nullish(),\n safetyTolerance: z\n .enum(['1', '2', '3', '4', '5', '6'])\n .or(z.number().min(1).max(6))\n .nullish(),\n\n // Deprecated snake_case versions\n image_url: z.string().nullish(),\n guidance_scale: z.number().min(1).max(20).nullish(),\n num_inference_steps: z.number().min(1).max(50).nullish(),\n enable_safety_checker: z.boolean().nullish(),\n output_format: z.enum(['jpeg', 'png']).nullish(),\n sync_mode: z.boolean().nullish(),\n safety_tolerance: z\n .enum(['1', '2', '3', '4', '5', '6'])\n .or(z.number().min(1).max(6))\n .nullish(),\n })\n .passthrough()\n .transform(data => {\n const result: Record<string, unknown> = {};\n const deprecatedKeys: string[] = [];\n\n const mapKey = (snakeKey: string, camelKey: string) => {\n const snakeValue = data[snakeKey as keyof typeof data];\n const camelValue = data[camelKey as keyof typeof data];\n\n // If snake_case is used, mark it as deprecated\n if (snakeValue !== undefined && snakeValue !== null) {\n deprecatedKeys.push(snakeKey);\n result[camelKey] = snakeValue;\n } else if (camelValue !== undefined && camelValue !== null) {\n result[camelKey] = camelValue;\n }\n };\n\n // Map all known parameters\n mapKey('image_url', 'imageUrl');\n mapKey('guidance_scale', 'guidanceScale');\n mapKey('num_inference_steps', 'numInferenceSteps');\n mapKey('enable_safety_checker', 'enableSafetyChecker');\n mapKey('output_format', 'outputFormat');\n mapKey('sync_mode', 'syncMode');\n mapKey('safety_tolerance', 'safetyTolerance');\n\n // These don't have snake_case equivalents\n if (data.strength !== undefined && data.strength !== null) {\n result.strength = data.strength;\n }\n if (data.acceleration !== undefined && data.acceleration !== null) {\n result.acceleration = data.acceleration;\n }\n\n for (const [key, value] of Object.entries(data)) {\n if (\n ![\n // camelCase known keys\n 'imageUrl',\n 'guidanceScale',\n 'numInferenceSteps',\n 'enableSafetyChecker',\n 'outputFormat',\n 'syncMode',\n 'strength',\n 'acceleration',\n 'safetyTolerance',\n // snake_case known keys\n 'image_url',\n 'guidance_scale',\n 'num_inference_steps',\n 'enable_safety_checker',\n 'output_format',\n 'sync_mode',\n 'safety_tolerance',\n ].includes(key)\n ) {\n result[key] = value;\n }\n }\n\n if (deprecatedKeys.length > 0) {\n (result as any).__deprecatedKeys = deprecatedKeys;\n }\n\n return result;\n }),\n ),\n);\n\nexport type FalImageProviderOptions = InferSchema<\n typeof falImageProviderOptionsSchema\n>;\n","import {\n AISDKError,\n TranscriptionModelV3,\n TranscriptionModelV3CallWarning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertUint8ArrayToBase64,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n delay,\n getFromApi,\n parseProviderOptions,\n postJsonToApi,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { FalConfig } from './fal-config';\nimport { falErrorDataSchema, falFailedResponseHandler } from './fal-error';\nimport { FalTranscriptionModelId } from './fal-transcription-options';\nimport { FalTranscriptionAPITypes } from './fal-api-types';\n\n// https://fal.ai/models/fal-ai/whisper/api?platform=http\nconst falProviderOptionsSchema = z.object({\n /**\n * Language of the audio file. If set to null, the language will be automatically detected. Defaults to null.\n *\n * If translate is selected as the task, the audio will be translated to English, regardless of the language selected.\n */\n language: z\n .union([z.enum(['en']), z.string()])\n .nullish()\n .default('en'),\n\n /**\n * Whether to diarize the audio file. Defaults to true.\n */\n diarize: z.boolean().nullish().default(true),\n\n /**\n * Level of the chunks to return. Either segment or word. Default value: \"segment\"\n */\n chunkLevel: z.enum(['segment', 'word']).nullish().default('segment'),\n\n /**\n * Version of the model to use. All of the models are the Whisper large variant. Default value: \"3\"\n */\n version: z.enum(['3']).nullish().default('3'),\n\n /**\n * Default value: 64\n */\n batchSize: z.number().nullish().default(64),\n\n /**\n * Number of speakers in the audio file. Defaults to null. If not provided, the number of speakers will be automatically detected.\n */\n numSpeakers: z.number().nullable().nullish(),\n});\n\nexport type FalTranscriptionCallOptions = z.infer<\n typeof falProviderOptionsSchema\n>;\n\ninterface FalTranscriptionModelConfig extends FalConfig {\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class FalTranscriptionModel implements TranscriptionModelV3 {\n readonly specificationVersion = 'v3';\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: FalTranscriptionModelId,\n private readonly config: FalTranscriptionModelConfig,\n ) {}\n\n private async getArgs({\n providerOptions,\n }: Parameters<TranscriptionModelV3['doGenerate']>[0]) {\n const warnings: TranscriptionModelV3CallWarning[] = [];\n\n // Parse provider options\n const falOptions = await parseProviderOptions({\n provider: 'fal',\n providerOptions,\n schema: falProviderOptionsSchema,\n });\n\n // Create form data with base fields\n const body: Omit<FalTranscriptionAPITypes, 'audio_url'> = {\n task: 'transcribe',\n diarize: true,\n chunk_level: 'word',\n };\n\n // Add provider-specific options\n if (falOptions) {\n body.language = falOptions.language as never;\n body.version = falOptions.version ?? undefined;\n body.batch_size = falOptions.batchSize ?? undefined;\n body.num_speakers = falOptions.numSpeakers ?? undefined;\n\n if (typeof falOptions.diarize === 'boolean') {\n body.diarize = falOptions.diarize;\n }\n\n if (falOptions.chunkLevel) {\n body.chunk_level = falOptions.chunkLevel;\n }\n }\n\n return {\n body,\n warnings,\n };\n }\n\n async doGenerate(\n options: Parameters<TranscriptionModelV3['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<TranscriptionModelV3['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const { body, warnings } = await this.getArgs(options);\n\n const base64Audio =\n typeof options.audio === 'string'\n ? options.audio\n : convertUint8ArrayToBase64(options.audio);\n\n const audioUrl = `data:${options.mediaType};base64,${base64Audio}`;\n\n const { value: queueResponse } = await postJsonToApi({\n url: this.config.url({\n path: `https://queue.fal.run/fal-ai/${this.modelId}`,\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n body: {\n ...body,\n audio_url: audioUrl,\n },\n failedResponseHandler: falFailedResponseHandler,\n successfulResponseHandler:\n createJsonResponseHandler(falJobResponseSchema),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n // Poll for completion with timeout\n const startTime = Date.now();\n const timeoutMs = 60000; // 60 seconds timeout\n const pollIntervalMs = 1000; // 1 second interval\n\n let response;\n let responseHeaders;\n let rawResponse;\n\n while (true) {\n try {\n const {\n value: statusResponse,\n responseHeaders: statusHeaders,\n rawValue: statusRawResponse,\n } = await getFromApi({\n url: this.config.url({\n path: `https://queue.fal.run/fal-ai/${this.modelId}/requests/${queueResponse.request_id}`,\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n failedResponseHandler: async ({\n requestBodyValues,\n response,\n url,\n }) => {\n const clone = response.clone();\n const body = (await clone.json()) as { detail: string };\n\n if (body.detail === 'Request is still in progress') {\n // This is not an error, just a status update that the request is still processing\n // Continue polling by returning a special error that signals to continue\n return {\n value: new Error('Request is still in progress'),\n rawValue: body,\n responseHeaders: {},\n };\n }\n\n return createJsonErrorResponseHandler({\n errorSchema: falErrorDataSchema,\n errorToMessage: data => data.error.message,\n })({ requestBodyValues, response, url });\n },\n successfulResponseHandler: createJsonResponseHandler(\n falTranscriptionResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n response = statusResponse;\n responseHeaders = statusHeaders;\n rawResponse = statusRawResponse;\n break;\n } catch (error) {\n // If the error message indicates the request is still in progress, ignore it and continue polling\n if (\n error instanceof Error &&\n error.message === 'Request is still in progress'\n ) {\n // Continue with the polling loop\n } else {\n // Re-throw any other errors\n throw error;\n }\n }\n\n // Check if we've exceeded the timeout\n if (Date.now() - startTime > timeoutMs) {\n throw new AISDKError({\n message: 'Transcription request timed out after 60 seconds',\n name: 'TranscriptionRequestTimedOut',\n cause: response,\n });\n }\n\n // Wait before polling again\n await delay(pollIntervalMs);\n }\n\n return {\n text: response.text,\n segments:\n response.chunks?.map(chunk => ({\n text: chunk.text,\n startSecond: chunk.timestamp?.at(0) ?? 0,\n endSecond: chunk.timestamp?.at(1) ?? 0,\n })) ?? [],\n language: response.inferred_languages?.at(0) ?? undefined,\n durationInSeconds: response.chunks?.at(-1)?.timestamp?.at(1) ?? undefined,\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n body: rawResponse,\n },\n };\n }\n}\n\nconst falJobResponseSchema = z.object({\n request_id: z.string().nullish(),\n});\n\nconst falTranscriptionResponseSchema = z.object({\n text: z.string(),\n chunks: z\n .array(\n z.object({\n text: z.string(),\n timestamp: z.array(z.number()).nullish(),\n }),\n )\n .nullish(),\n inferred_languages: z.array(z.string()).nullish(),\n});\n","import { z } from 'zod/v4';\nimport { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';\n\nexport const falErrorDataSchema = z.object({\n error: z.object({\n message: z.string(),\n code: z.number(),\n }),\n});\n\nexport type FalErrorData = z.infer<typeof falErrorDataSchema>;\n\nexport const falFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: falErrorDataSchema,\n errorToMessage: data => data.error.message,\n});\n","import { SpeechModelV3, SpeechModelV3CallWarning } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createBinaryResponseHandler,\n createJsonResponseHandler,\n createStatusCodeErrorResponseHandler,\n getFromApi,\n parseProviderOptions,\n postJsonToApi,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { FalConfig } from './fal-config';\nimport { falFailedResponseHandler } from './fal-error';\nimport { FAL_EMOTIONS, FAL_LANGUAGE_BOOSTS } from './fal-api-types';\nimport { FalSpeechModelId } from './fal-speech-settings';\n\nconst falSpeechProviderOptionsSchema = z.looseObject({\n voice_setting: z\n .object({\n speed: z.number().nullish(),\n vol: z.number().nullish(),\n voice_id: z.string().nullish(),\n pitch: z.number().nullish(),\n english_normalization: z.boolean().nullish(),\n emotion: z.enum(FAL_EMOTIONS).nullish(),\n })\n .partial()\n .nullish(),\n audio_setting: z.record(z.string(), z.unknown()).nullish(),\n language_boost: z.enum(FAL_LANGUAGE_BOOSTS).nullish(),\n pronunciation_dict: z.record(z.string(), z.string()).nullish(),\n});\n\nexport type FalSpeechCallOptions = z.infer<\n typeof falSpeechProviderOptionsSchema\n>;\n\ninterface FalSpeechModelConfig extends FalConfig {\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class FalSpeechModel implements SpeechModelV3 {\n readonly specificationVersion = 'v3';\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: FalSpeechModelId,\n private readonly config: FalSpeechModelConfig,\n ) {}\n\n private async getArgs({\n text,\n voice,\n outputFormat,\n speed,\n language,\n providerOptions,\n }: Parameters<SpeechModelV3['doGenerate']>[0]) {\n const warnings: SpeechModelV3CallWarning[] = [];\n\n const falOptions = await parseProviderOptions({\n provider: 'fal',\n providerOptions,\n schema: falSpeechProviderOptionsSchema,\n });\n\n const requestBody = {\n text,\n output_format: outputFormat === 'hex' ? 'hex' : 'url',\n voice,\n speed,\n ...falOptions,\n };\n\n // Language is not directly supported; warn and ignore\n if (language) {\n warnings.push({\n type: 'unsupported-setting',\n setting: 'language',\n details:\n \"fal speech models don't support 'language' directly; consider providerOptions.fal.language_boost\",\n });\n }\n\n // warn on invalid values (and on hex until we support hex response handling)\n if (outputFormat && outputFormat !== 'url' && outputFormat !== 'hex') {\n warnings.push({\n type: 'unsupported-setting',\n setting: 'outputFormat',\n details: `Unsupported or unhandled outputFormat: ${outputFormat}. Using 'url' instead.`,\n });\n }\n\n return { requestBody, warnings } as const;\n }\n\n async doGenerate(\n options: Parameters<SpeechModelV3['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<SpeechModelV3['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const { requestBody, warnings } = await this.getArgs(options);\n\n const {\n value: json,\n responseHeaders,\n rawValue,\n } = await postJsonToApi({\n url: this.config.url({\n path: `https://fal.run/${this.modelId}`,\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n body: requestBody,\n failedResponseHandler: falFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n falSpeechResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const audioUrl = json.audio.url;\n const { value: audio } = await getFromApi({\n url: audioUrl,\n failedResponseHandler: createStatusCodeErrorResponseHandler(),\n successfulResponseHandler: createBinaryResponseHandler(),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n audio,\n warnings,\n request: {\n body: JSON.stringify(requestBody),\n },\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n body: rawValue,\n },\n };\n }\n}\n\nconst falSpeechResponseSchema = z.object({\n audio: z.object({ url: z.string() }),\n duration_ms: z.number().optional(),\n request_id: z.string().optional(),\n});\n","export type FalTranscriptionAPITypes = {\n /**\n * URL of the audio file to transcribe. Supported formats: mp3, mp4, mpeg, mpga, m4a, wav or webm.\n */\n audio_url: string;\n\n /**\n * Task to perform on the audio file. Either transcribe or translate. Default value: \"transcribe\"\n */\n task?: 'transcribe' | 'translate';\n\n /**\n * Language of the audio file. If set to null, the language will be automatically detected. Defaults to null.\n *\n * If translate is selected as the task, the audio will be translated to English, regardless of the language selected.\n */\n language?:\n | 'af'\n | 'am'\n | 'ar'\n | 'as'\n | 'az'\n | 'ba'\n | 'be'\n | 'bg'\n | 'bn'\n | 'bo'\n | 'br'\n | 'bs'\n | 'ca'\n | 'cs'\n | 'cy'\n | 'da'\n | 'de'\n | 'el'\n | 'en'\n | 'es'\n | 'et'\n | 'eu'\n | 'fa'\n | 'fi'\n | 'fo'\n | 'fr'\n | 'gl'\n | 'gu'\n | 'ha'\n | 'haw'\n | 'he'\n | 'hi'\n | 'hr'\n | 'ht'\n | 'hu'\n | 'hy'\n | 'id'\n | 'is'\n | 'it'\n | 'ja'\n | 'jw'\n | 'ka'\n | 'kk'\n | 'km'\n | 'kn'\n | 'ko'\n | 'la'\n | 'lb'\n | 'ln'\n | 'lo'\n | 'lt'\n | 'lv'\n | 'mg'\n | 'mi'\n | 'mk'\n | 'ml'\n | 'mn'\n | 'mr'\n | 'ms'\n | 'mt'\n | 'my'\n | 'ne'\n | 'nl'\n | 'nn'\n | 'no'\n | 'oc'\n | 'pa'\n | 'pl'\n | 'ps'\n | 'pt'\n | 'ro'\n | 'ru'\n | 'sa'\n | 'sd'\n | 'si'\n | 'sk'\n | 'sl'\n | 'sn'\n | 'so'\n | 'sq'\n | 'sr'\n | 'su'\n | 'sv'\n | 'sw'\n | 'ta'\n | 'te'\n | 'tg'\n | 'th'\n | 'tk'\n | 'tl'\n | 'tr'\n | 'tt'\n | 'uk'\n | 'ur'\n | 'uz'\n | 'vi'\n | 'yi'\n | 'yo'\n | 'yue'\n | 'zh'\n | null;\n\n /**\n * Whether to diarize the audio file. Defaults to true.\n */\n diarize?: boolean;\n\n /**\n * Level of the chunks to return. Either segment or word. Default value: \"segment\"\n */\n chunk_level?: 'segment' | 'word';\n\n /**\n * Version of the model to use. All of the models are the Whisper large variant. Default value: \"3\"\n */\n version?: '3';\n\n /**\n * Default value: 64\n */\n batch_size?: number;\n\n /**\n * Prompt to use for generation. Defaults to an empty string. Default value: \"\"\n */\n prompt?: string;\n\n /**\n * Number of speakers in the audio file. Defaults to null. If not provided, the number of speakers will be automatically detected.\n */\n num_speakers?: number | null;\n};\n\nexport const FAL_LANGUAGE_BOOSTS = [\n 'Chinese',\n 'Chinese,Yue',\n 'English',\n 'Arabic',\n 'Russian',\n 'Spanish',\n 'French',\n 'Portuguese',\n 'German',\n 'Turkish',\n 'Dutch',\n 'Ukrainian',\n 'Vietnamese',\n 'Indonesian',\n 'Japanese',\n 'Italian',\n 'Korean',\n 'Thai',\n 'Polish',\n 'Romanian',\n 'Greek',\n 'Czech',\n 'Finnish',\n 'Hindi',\n 'auto',\n] as const;\nexport type FalLanguageBoost = (typeof FAL_LANGUAGE_BOOSTS)[number];\n\nexport const FAL_EMOTIONS = [\n 'happy',\n 'sad',\n 'angry',\n 'fearful',\n 'disgusted',\n 'surprised',\n 'neutral',\n] as const;\nexport type FalEmotion = (typeof FAL_EMOTIONS)[number];\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["import_provider","import_provider_utils","import_provider_utils","import_v4","_a","import_provider_utils","import_v4","import_v4","import_provider_utils","falFailedResponseHandler","falFailedResponseHandler","response","body","_a","_b","_c","_d","import_provider_utils","import_v4","falFailedResponseHandler"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/fal-provider.ts","../src/fal-image-model.ts","../src/fal-image-options.ts","../src/fal-transcription-model.ts","../src/fal-error.ts","../src/fal-speech-model.ts","../src/fal-api-types.ts","../src/version.ts"],"sourcesContent":["export { createFal, fal } from './fal-provider';\nexport type { FalProvider, FalProviderSettings } from './fal-provider';\nexport type { FalImageProviderOptions } from './fal-image-options';\nexport { VERSION } from './version';\n","import {\n ImageModelV3,\n NoSuchModelError,\n ProviderV3,\n SpeechModelV3,\n TranscriptionModelV3,\n} from '@ai-sdk/provider';\nimport type { FetchFunction } from '@ai-sdk/provider-utils';\nimport {\n withoutTrailingSlash,\n withUserAgentSuffix,\n} from '@ai-sdk/provider-utils';\nimport { FalImageModel } from './fal-image-model';\nimport { FalImageModelId } from './fal-image-settings';\nimport { FalTranscriptionModelId } from './fal-transcription-options';\nimport { FalTranscriptionModel } from './fal-transcription-model';\nimport { FalSpeechModelId } from './fal-speech-settings';\nimport { FalSpeechModel } from './fal-speech-model';\nimport { VERSION } from './version';\n\nexport interface FalProviderSettings {\n /**\nfal.ai API key. Default value is taken from the `FAL_API_KEY` environment\nvariable, falling back to `FAL_KEY`.\n */\n apiKey?: string;\n\n /**\nBase URL for the API calls.\nThe default prefix is `https://fal.run`.\n */\n baseURL?: string;\n\n /**\nCustom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\nCustom fetch implementation. You can use it as a middleware to intercept\nrequests, or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport interface FalProvider extends ProviderV3 {\n /**\nCreates a model for image generation.\n */\n image(modelId: FalImageModelId): ImageModelV3;\n\n /**\nCreates a model for image generation.\n */\n imageModel(modelId: FalImageModelId): ImageModelV3;\n\n /**\nCreates a model for transcription.\n */\n transcription(modelId: FalTranscriptionModelId): TranscriptionModelV3;\n\n /**\nCreates a model for speech generation.\n */\n speech(modelId: FalSpeechModelId): SpeechModelV3;\n}\n\nconst defaultBaseURL = 'https://fal.run';\n\nfunction loadFalApiKey({\n apiKey,\n description = 'fal.ai',\n}: {\n apiKey: string | undefined;\n description?: string;\n}): string {\n if (typeof apiKey === 'string') {\n return apiKey;\n }\n\n if (apiKey != null) {\n throw new Error(`${description} API key must be a string.`);\n }\n\n if (typeof process === 'undefined') {\n throw new Error(\n `${description} API key is missing. Pass it using the 'apiKey' parameter. Environment variables are not supported in this environment.`,\n );\n }\n\n let envApiKey = process.env.FAL_API_KEY;\n if (envApiKey == null) {\n envApiKey = process.env.FAL_KEY;\n }\n\n if (envApiKey == null) {\n throw new Error(\n `${description} API key is missing. Pass it using the 'apiKey' parameter or set either the FAL_API_KEY or FAL_KEY environment variable.`,\n );\n }\n\n if (typeof envApiKey !== 'string') {\n throw new Error(\n `${description} API key must be a string. The value of the environment variable is not a string.`,\n );\n }\n\n return envApiKey;\n}\n\n/**\nCreate a fal.ai provider instance.\n */\nexport function createFal(options: FalProviderSettings = {}): FalProvider {\n const baseURL = withoutTrailingSlash(options.baseURL ?? defaultBaseURL);\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Key ${loadFalApiKey({\n apiKey: options.apiKey,\n })}`,\n ...options.headers,\n },\n `ai-sdk/fal/${VERSION}`,\n );\n\n const createImageModel = (modelId: FalImageModelId) =>\n new FalImageModel(modelId, {\n provider: 'fal.image',\n baseURL: baseURL ?? defaultBaseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createSpeechModel = (modelId: FalSpeechModelId) =>\n new FalSpeechModel(modelId, {\n provider: `fal.speech`,\n url: ({ path }) => path,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createTranscriptionModel = (modelId: FalTranscriptionModelId) =>\n new FalTranscriptionModel(modelId, {\n provider: `fal.transcription`,\n url: ({ path }) => path,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n return {\n specificationVersion: 'v3' as const,\n imageModel: createImageModel,\n image: createImageModel,\n languageModel: (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'languageModel',\n });\n },\n speech: createSpeechModel,\n embeddingModel: (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'embeddingModel',\n });\n },\n transcription: createTranscriptionModel,\n };\n}\n\n/**\nDefault fal.ai provider instance.\n */\nexport const fal = createFal();\n","import type { ImageModelV3, SharedV3Warning } from '@ai-sdk/provider';\nimport type { Resolvable } from '@ai-sdk/provider-utils';\nimport {\n FetchFunction,\n combineHeaders,\n createBinaryResponseHandler,\n createJsonResponseHandler,\n createJsonErrorResponseHandler,\n createStatusCodeErrorResponseHandler,\n getFromApi,\n parseProviderOptions,\n postJsonToApi,\n resolve,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { FalImageModelId, FalImageSize } from './fal-image-settings';\nimport { falImageProviderOptionsSchema } from './fal-image-options';\n\ninterface FalImageModelConfig {\n provider: string;\n baseURL: string;\n headers?: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class FalImageModel implements ImageModelV3 {\n readonly specificationVersion = 'v3';\n readonly maxImagesPerCall = 1;\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: FalImageModelId,\n private readonly config: FalImageModelConfig,\n ) {}\n\n private async getArgs({\n prompt,\n n,\n size,\n aspectRatio,\n seed,\n providerOptions,\n }: Parameters<ImageModelV3['doGenerate']>[0]) {\n const warnings: Array<SharedV3Warning> = [];\n\n let imageSize: FalImageSize | undefined;\n if (size) {\n const [width, height] = size.split('x').map(Number);\n imageSize = { width, height };\n } else if (aspectRatio) {\n imageSize = convertAspectRatioToSize(aspectRatio);\n }\n\n const falOptions = await parseProviderOptions({\n provider: 'fal',\n providerOptions,\n schema: falImageProviderOptionsSchema,\n });\n\n const requestBody: Record<string, unknown> = {\n prompt,\n seed,\n image_size: imageSize,\n num_images: n,\n };\n\n if (falOptions) {\n const deprecatedKeys =\n '__deprecatedKeys' in falOptions\n ? (falOptions.__deprecatedKeys as string[])\n : undefined;\n\n if (deprecatedKeys && deprecatedKeys.length > 0) {\n warnings.push({\n type: 'other',\n message: `The following provider options use deprecated snake_case and will be removed in @ai-sdk/fal v2.0. Please use camelCase instead: ${deprecatedKeys\n .map(key => {\n const camelCase = key.replace(/_([a-z])/g, (_, letter) =>\n letter.toUpperCase(),\n );\n return `'${key}' (use '${camelCase}')`;\n })\n .join(', ')}`,\n });\n }\n\n const fieldMapping: Record<string, string> = {\n imageUrl: 'image_url',\n guidanceScale: 'guidance_scale',\n numInferenceSteps: 'num_inference_steps',\n enableSafetyChecker: 'enable_safety_checker',\n outputFormat: 'output_format',\n syncMode: 'sync_mode',\n safetyTolerance: 'safety_tolerance',\n };\n\n for (const [key, value] of Object.entries(falOptions)) {\n if (key === '__deprecatedKeys') continue;\n const apiKey = fieldMapping[key] ?? key;\n\n if (value !== undefined) {\n requestBody[apiKey] = value;\n }\n }\n }\n\n return { requestBody, warnings } as const;\n }\n\n async doGenerate(\n options: Parameters<ImageModelV3['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<ImageModelV3['doGenerate']>>> {\n const { requestBody, warnings } = await this.getArgs(options);\n\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const { value, responseHeaders } = await postJsonToApi({\n url: `${this.config.baseURL}/${this.modelId}`,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n body: requestBody,\n failedResponseHandler: falFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n falImageResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const {\n images: targetImages,\n // prompt is just passed through and not a revised prompt per image\n prompt: _prompt,\n // NSFW information is normalized merged into `providerMetadata.fal.images`\n has_nsfw_concepts,\n nsfw_content_detected,\n // pass through other properties to providerMetadata\n ...responseMetaData\n } = value;\n\n // download the images:\n const downloadedImages = await Promise.all(\n targetImages.map(image =>\n this.downloadImage(image.url, options.abortSignal),\n ),\n );\n\n return {\n images: downloadedImages,\n warnings,\n response: {\n modelId: this.modelId,\n timestamp: currentDate,\n headers: responseHeaders,\n },\n providerMetadata: {\n fal: {\n images: targetImages.map((image, index) => {\n const {\n url,\n content_type: contentType,\n file_name: fileName,\n file_data: fileData,\n file_size: fileSize,\n ...imageMetaData\n } = image;\n\n const nsfw =\n has_nsfw_concepts?.[index] ?? nsfw_content_detected?.[index];\n\n return {\n ...imageMetaData,\n ...removeOnlyUndefined({\n contentType,\n fileName,\n fileData,\n fileSize,\n nsfw,\n }),\n };\n }),\n ...responseMetaData,\n },\n },\n };\n }\n\n private async downloadImage(\n url: string,\n abortSignal: AbortSignal | undefined,\n ): Promise<Uint8Array> {\n const { value: response } = await getFromApi({\n url,\n // No specific headers should be needed for this request as it's a\n // generated image provided by fal.ai.\n abortSignal,\n failedResponseHandler: createStatusCodeErrorResponseHandler(),\n successfulResponseHandler: createBinaryResponseHandler(),\n fetch: this.config.fetch,\n });\n return response;\n }\n}\n\nfunction removeOnlyUndefined<T extends Record<string, unknown>>(obj: T) {\n return Object.fromEntries(\n Object.entries(obj).filter(([, v]) => v !== undefined),\n ) as Partial<T>;\n}\n\n/**\nConverts an aspect ratio to an image size compatible with fal.ai APIs.\n@param aspectRatio - The aspect ratio to convert.\n@returns The image size.\n */\nfunction convertAspectRatioToSize(\n aspectRatio: `${number}:${number}`,\n): FalImageSize | undefined {\n switch (aspectRatio) {\n case '1:1':\n return 'square_hd';\n case '16:9':\n return 'landscape_16_9';\n case '9:16':\n return 'portrait_16_9';\n case '4:3':\n return 'landscape_4_3';\n case '3:4':\n return 'portrait_4_3';\n case '16:10':\n return { width: 1280, height: 800 };\n case '10:16':\n return { width: 800, height: 1280 };\n case '21:9':\n return { width: 2560, height: 1080 };\n case '9:21':\n return { width: 1080, height: 2560 };\n }\n return undefined;\n}\n\n// Validation error has a particular payload to inform the exact property that is invalid\nconst falValidationErrorSchema = z.object({\n detail: z.array(\n z.object({\n loc: z.array(z.string()),\n msg: z.string(),\n type: z.string(),\n }),\n ),\n});\n\ntype ValidationError = z.infer<typeof falValidationErrorSchema>;\n\n// Other errors have a message property\nconst falHttpErrorSchema = z.object({\n message: z.string(),\n});\n\nconst falErrorSchema = z.union([falValidationErrorSchema, falHttpErrorSchema]);\n\nconst falImageSchema = z.object({\n url: z.string(),\n width: z.number().nullish(),\n height: z.number().nullish(),\n // e.g. https://fal.ai/models/fal-ai/fashn/tryon/v1.6/api#schema-output\n content_type: z.string().nullish(),\n // e.g. https://fal.ai/models/fal-ai/flowedit/api#schema-output\n file_name: z.string().nullish(),\n file_data: z.string().optional(),\n file_size: z.number().nullish(),\n});\n\n// https://fal.ai/models/fal-ai/lora/api#type-File\nconst loraFileSchema = z.object({\n url: z.string(),\n content_type: z.string().optional(),\n file_name: z.string().nullable().optional(),\n file_data: z.string().optional(),\n file_size: z.number().nullable().optional(),\n});\n\nconst commonResponseSchema = z.object({\n timings: z\n .object({\n inference: z.number().optional(),\n })\n .optional(),\n seed: z.number().optional(),\n has_nsfw_concepts: z.array(z.boolean()).optional(),\n prompt: z.string().optional(),\n // https://fal.ai/models/fal-ai/lcm/api#schema-output\n nsfw_content_detected: z.array(z.boolean()).optional(),\n num_inference_steps: z.number().optional(),\n // https://fal.ai/models/fal-ai/lora/api#schema-output\n debug_latents: loraFileSchema.optional(),\n debug_per_pass_latents: loraFileSchema.optional(),\n});\n\n// Most FAL image models respond with an array of images, but some have a response\n// with a single image, e.g. https://fal.ai/models/easel-ai/easel-avatar/api#schema-output\nconst base = z.looseObject(commonResponseSchema.shape);\nconst falImageResponseSchema = z\n .union([\n base.extend({ images: z.array(falImageSchema) }),\n base.extend({ image: falImageSchema }),\n ])\n .transform(v => ('images' in v ? v : { ...v, images: [v.image] }))\n .pipe(base.extend({ images: z.array(falImageSchema) }));\n\nfunction isValidationError(error: unknown): error is ValidationError {\n return falValidationErrorSchema.safeParse(error).success;\n}\n\nconst falFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: falErrorSchema,\n errorToMessage: error => {\n if (isValidationError(error)) {\n return error.detail\n .map(detail => `${detail.loc.join('.')}: ${detail.msg}`)\n .join('\\n');\n }\n return error.message ?? 'Unknown fal error';\n },\n});\n","import { InferSchema, lazySchema, zodSchema } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport const falImageProviderOptionsSchema = lazySchema(() =>\n zodSchema(\n z\n .object({\n imageUrl: z.string().nullish(),\n guidanceScale: z.number().min(1).max(20).nullish(),\n numInferenceSteps: z.number().min(1).max(50).nullish(),\n enableSafetyChecker: z.boolean().nullish(),\n outputFormat: z.enum(['jpeg', 'png']).nullish(),\n syncMode: z.boolean().nullish(),\n strength: z.number().nullish(),\n acceleration: z.enum(['none', 'regular', 'high']).nullish(),\n safetyTolerance: z\n .enum(['1', '2', '3', '4', '5', '6'])\n .or(z.number().min(1).max(6))\n .nullish(),\n\n // Deprecated snake_case versions\n image_url: z.string().nullish(),\n guidance_scale: z.number().min(1).max(20).nullish(),\n num_inference_steps: z.number().min(1).max(50).nullish(),\n enable_safety_checker: z.boolean().nullish(),\n output_format: z.enum(['jpeg', 'png']).nullish(),\n sync_mode: z.boolean().nullish(),\n safety_tolerance: z\n .enum(['1', '2', '3', '4', '5', '6'])\n .or(z.number().min(1).max(6))\n .nullish(),\n })\n .passthrough()\n .transform(data => {\n const result: Record<string, unknown> = {};\n const deprecatedKeys: string[] = [];\n\n const mapKey = (snakeKey: string, camelKey: string) => {\n const snakeValue = data[snakeKey as keyof typeof data];\n const camelValue = data[camelKey as keyof typeof data];\n\n // If snake_case is used, mark it as deprecated\n if (snakeValue !== undefined && snakeValue !== null) {\n deprecatedKeys.push(snakeKey);\n result[camelKey] = snakeValue;\n } else if (camelValue !== undefined && camelValue !== null) {\n result[camelKey] = camelValue;\n }\n };\n\n // Map all known parameters\n mapKey('image_url', 'imageUrl');\n mapKey('guidance_scale', 'guidanceScale');\n mapKey('num_inference_steps', 'numInferenceSteps');\n mapKey('enable_safety_checker', 'enableSafetyChecker');\n mapKey('output_format', 'outputFormat');\n mapKey('sync_mode', 'syncMode');\n mapKey('safety_tolerance', 'safetyTolerance');\n\n // These don't have snake_case equivalents\n if (data.strength !== undefined && data.strength !== null) {\n result.strength = data.strength;\n }\n if (data.acceleration !== undefined && data.acceleration !== null) {\n result.acceleration = data.acceleration;\n }\n\n for (const [key, value] of Object.entries(data)) {\n if (\n ![\n // camelCase known keys\n 'imageUrl',\n 'guidanceScale',\n 'numInferenceSteps',\n 'enableSafetyChecker',\n 'outputFormat',\n 'syncMode',\n 'strength',\n 'acceleration',\n 'safetyTolerance',\n // snake_case known keys\n 'image_url',\n 'guidance_scale',\n 'num_inference_steps',\n 'enable_safety_checker',\n 'output_format',\n 'sync_mode',\n 'safety_tolerance',\n ].includes(key)\n ) {\n result[key] = value;\n }\n }\n\n if (deprecatedKeys.length > 0) {\n (result as any).__deprecatedKeys = deprecatedKeys;\n }\n\n return result;\n }),\n ),\n);\n\nexport type FalImageProviderOptions = InferSchema<\n typeof falImageProviderOptionsSchema\n>;\n","import {\n AISDKError,\n TranscriptionModelV3,\n SharedV3Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertUint8ArrayToBase64,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n delay,\n getFromApi,\n parseProviderOptions,\n postJsonToApi,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { FalConfig } from './fal-config';\nimport { falErrorDataSchema, falFailedResponseHandler } from './fal-error';\nimport { FalTranscriptionModelId } from './fal-transcription-options';\nimport { FalTranscriptionAPITypes } from './fal-api-types';\n\n// https://fal.ai/models/fal-ai/whisper/api?platform=http\nconst falProviderOptionsSchema = z.object({\n /**\n * Language of the audio file. If set to null, the language will be automatically detected. Defaults to null.\n *\n * If translate is selected as the task, the audio will be translated to English, regardless of the language selected.\n */\n language: z\n .union([z.enum(['en']), z.string()])\n .nullish()\n .default('en'),\n\n /**\n * Whether to diarize the audio file. Defaults to true.\n */\n diarize: z.boolean().nullish().default(true),\n\n /**\n * Level of the chunks to return. Either segment or word. Default value: \"segment\"\n */\n chunkLevel: z.enum(['segment', 'word']).nullish().default('segment'),\n\n /**\n * Version of the model to use. All of the models are the Whisper large variant. Default value: \"3\"\n */\n version: z.enum(['3']).nullish().default('3'),\n\n /**\n * Default value: 64\n */\n batchSize: z.number().nullish().default(64),\n\n /**\n * Number of speakers in the audio file. Defaults to null. If not provided, the number of speakers will be automatically detected.\n */\n numSpeakers: z.number().nullable().nullish(),\n});\n\nexport type FalTranscriptionCallOptions = z.infer<\n typeof falProviderOptionsSchema\n>;\n\ninterface FalTranscriptionModelConfig extends FalConfig {\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class FalTranscriptionModel implements TranscriptionModelV3 {\n readonly specificationVersion = 'v3';\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: FalTranscriptionModelId,\n private readonly config: FalTranscriptionModelConfig,\n ) {}\n\n private async getArgs({\n providerOptions,\n }: Parameters<TranscriptionModelV3['doGenerate']>[0]) {\n const warnings: SharedV3Warning[] = [];\n\n // Parse provider options\n const falOptions = await parseProviderOptions({\n provider: 'fal',\n providerOptions,\n schema: falProviderOptionsSchema,\n });\n\n // Create form data with base fields\n const body: Omit<FalTranscriptionAPITypes, 'audio_url'> = {\n task: 'transcribe',\n diarize: true,\n chunk_level: 'word',\n };\n\n // Add provider-specific options\n if (falOptions) {\n body.language = falOptions.language as never;\n body.version = falOptions.version ?? undefined;\n body.batch_size = falOptions.batchSize ?? undefined;\n body.num_speakers = falOptions.numSpeakers ?? undefined;\n\n if (typeof falOptions.diarize === 'boolean') {\n body.diarize = falOptions.diarize;\n }\n\n if (falOptions.chunkLevel) {\n body.chunk_level = falOptions.chunkLevel;\n }\n }\n\n return {\n body,\n warnings,\n };\n }\n\n async doGenerate(\n options: Parameters<TranscriptionModelV3['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<TranscriptionModelV3['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const { body, warnings } = await this.getArgs(options);\n\n const base64Audio =\n typeof options.audio === 'string'\n ? options.audio\n : convertUint8ArrayToBase64(options.audio);\n\n const audioUrl = `data:${options.mediaType};base64,${base64Audio}`;\n\n const { value: queueResponse } = await postJsonToApi({\n url: this.config.url({\n path: `https://queue.fal.run/fal-ai/${this.modelId}`,\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n body: {\n ...body,\n audio_url: audioUrl,\n },\n failedResponseHandler: falFailedResponseHandler,\n successfulResponseHandler:\n createJsonResponseHandler(falJobResponseSchema),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n // Poll for completion with timeout\n const startTime = Date.now();\n const timeoutMs = 60000; // 60 seconds timeout\n const pollIntervalMs = 1000; // 1 second interval\n\n let response;\n let responseHeaders;\n let rawResponse;\n\n while (true) {\n try {\n const {\n value: statusResponse,\n responseHeaders: statusHeaders,\n rawValue: statusRawResponse,\n } = await getFromApi({\n url: this.config.url({\n path: `https://queue.fal.run/fal-ai/${this.modelId}/requests/${queueResponse.request_id}`,\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n failedResponseHandler: async ({\n requestBodyValues,\n response,\n url,\n }) => {\n const clone = response.clone();\n const body = (await clone.json()) as { detail: string };\n\n if (body.detail === 'Request is still in progress') {\n // This is not an error, just a status update that the request is still processing\n // Continue polling by returning a special error that signals to continue\n return {\n value: new Error('Request is still in progress'),\n rawValue: body,\n responseHeaders: {},\n };\n }\n\n return createJsonErrorResponseHandler({\n errorSchema: falErrorDataSchema,\n errorToMessage: data => data.error.message,\n })({ requestBodyValues, response, url });\n },\n successfulResponseHandler: createJsonResponseHandler(\n falTranscriptionResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n response = statusResponse;\n responseHeaders = statusHeaders;\n rawResponse = statusRawResponse;\n break;\n } catch (error) {\n // If the error message indicates the request is still in progress, ignore it and continue polling\n if (\n error instanceof Error &&\n error.message === 'Request is still in progress'\n ) {\n // Continue with the polling loop\n } else {\n // Re-throw any other errors\n throw error;\n }\n }\n\n // Check if we've exceeded the timeout\n if (Date.now() - startTime > timeoutMs) {\n throw new AISDKError({\n message: 'Transcription request timed out after 60 seconds',\n name: 'TranscriptionRequestTimedOut',\n cause: response,\n });\n }\n\n // Wait before polling again\n await delay(pollIntervalMs);\n }\n\n return {\n text: response.text,\n segments:\n response.chunks?.map(chunk => ({\n text: chunk.text,\n startSecond: chunk.timestamp?.at(0) ?? 0,\n endSecond: chunk.timestamp?.at(1) ?? 0,\n })) ?? [],\n language: response.inferred_languages?.at(0) ?? undefined,\n durationInSeconds: response.chunks?.at(-1)?.timestamp?.at(1) ?? undefined,\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n body: rawResponse,\n },\n };\n }\n}\n\nconst falJobResponseSchema = z.object({\n request_id: z.string().nullish(),\n});\n\nconst falTranscriptionResponseSchema = z.object({\n text: z.string(),\n chunks: z\n .array(\n z.object({\n text: z.string(),\n timestamp: z.array(z.number()).nullish(),\n }),\n )\n .nullish(),\n inferred_languages: z.array(z.string()).nullish(),\n});\n","import { z } from 'zod/v4';\nimport { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';\n\nexport const falErrorDataSchema = z.object({\n error: z.object({\n message: z.string(),\n code: z.number(),\n }),\n});\n\nexport type FalErrorData = z.infer<typeof falErrorDataSchema>;\n\nexport const falFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: falErrorDataSchema,\n errorToMessage: data => data.error.message,\n});\n","import { SpeechModelV3, SharedV3Warning } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createBinaryResponseHandler,\n createJsonResponseHandler,\n createStatusCodeErrorResponseHandler,\n getFromApi,\n parseProviderOptions,\n postJsonToApi,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { FalConfig } from './fal-config';\nimport { falFailedResponseHandler } from './fal-error';\nimport { FAL_EMOTIONS, FAL_LANGUAGE_BOOSTS } from './fal-api-types';\nimport { FalSpeechModelId } from './fal-speech-settings';\n\nconst falSpeechProviderOptionsSchema = z.looseObject({\n voice_setting: z\n .object({\n speed: z.number().nullish(),\n vol: z.number().nullish(),\n voice_id: z.string().nullish(),\n pitch: z.number().nullish(),\n english_normalization: z.boolean().nullish(),\n emotion: z.enum(FAL_EMOTIONS).nullish(),\n })\n .partial()\n .nullish(),\n audio_setting: z.record(z.string(), z.unknown()).nullish(),\n language_boost: z.enum(FAL_LANGUAGE_BOOSTS).nullish(),\n pronunciation_dict: z.record(z.string(), z.string()).nullish(),\n});\n\nexport type FalSpeechCallOptions = z.infer<\n typeof falSpeechProviderOptionsSchema\n>;\n\ninterface FalSpeechModelConfig extends FalConfig {\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class FalSpeechModel implements SpeechModelV3 {\n readonly specificationVersion = 'v3';\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: FalSpeechModelId,\n private readonly config: FalSpeechModelConfig,\n ) {}\n\n private async getArgs({\n text,\n voice,\n outputFormat,\n speed,\n language,\n providerOptions,\n }: Parameters<SpeechModelV3['doGenerate']>[0]) {\n const warnings: SharedV3Warning[] = [];\n\n const falOptions = await parseProviderOptions({\n provider: 'fal',\n providerOptions,\n schema: falSpeechProviderOptionsSchema,\n });\n\n const requestBody = {\n text,\n output_format: outputFormat === 'hex' ? 'hex' : 'url',\n voice,\n speed,\n ...falOptions,\n };\n\n // Language is not directly supported; warn and ignore\n if (language) {\n warnings.push({\n type: 'unsupported',\n feature: 'language',\n details:\n \"fal speech models don't support 'language' directly; consider providerOptions.fal.language_boost\",\n });\n }\n\n // warn on invalid values (and on hex until we support hex response handling)\n if (outputFormat && outputFormat !== 'url' && outputFormat !== 'hex') {\n warnings.push({\n type: 'unsupported',\n feature: 'outputFormat',\n details: `Unsupported outputFormat: ${outputFormat}. Using 'url' instead.`,\n });\n }\n\n return { requestBody, warnings } as const;\n }\n\n async doGenerate(\n options: Parameters<SpeechModelV3['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<SpeechModelV3['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const { requestBody, warnings } = await this.getArgs(options);\n\n const {\n value: json,\n responseHeaders,\n rawValue,\n } = await postJsonToApi({\n url: this.config.url({\n path: `https://fal.run/${this.modelId}`,\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n body: requestBody,\n failedResponseHandler: falFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n falSpeechResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const audioUrl = json.audio.url;\n const { value: audio } = await getFromApi({\n url: audioUrl,\n failedResponseHandler: createStatusCodeErrorResponseHandler(),\n successfulResponseHandler: createBinaryResponseHandler(),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n audio,\n warnings,\n request: {\n body: JSON.stringify(requestBody),\n },\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n body: rawValue,\n },\n };\n }\n}\n\nconst falSpeechResponseSchema = z.object({\n audio: z.object({ url: z.string() }),\n duration_ms: z.number().optional(),\n request_id: z.string().optional(),\n});\n","export type FalTranscriptionAPITypes = {\n /**\n * URL of the audio file to transcribe. Supported formats: mp3, mp4, mpeg, mpga, m4a, wav or webm.\n */\n audio_url: string;\n\n /**\n * Task to perform on the audio file. Either transcribe or translate. Default value: \"transcribe\"\n */\n task?: 'transcribe' | 'translate';\n\n /**\n * Language of the audio file. If set to null, the language will be automatically detected. Defaults to null.\n *\n * If translate is selected as the task, the audio will be translated to English, regardless of the language selected.\n */\n language?:\n | 'af'\n | 'am'\n | 'ar'\n | 'as'\n | 'az'\n | 'ba'\n | 'be'\n | 'bg'\n | 'bn'\n | 'bo'\n | 'br'\n | 'bs'\n | 'ca'\n | 'cs'\n | 'cy'\n | 'da'\n | 'de'\n | 'el'\n | 'en'\n | 'es'\n | 'et'\n | 'eu'\n | 'fa'\n | 'fi'\n | 'fo'\n | 'fr'\n | 'gl'\n | 'gu'\n | 'ha'\n | 'haw'\n | 'he'\n | 'hi'\n | 'hr'\n | 'ht'\n | 'hu'\n | 'hy'\n | 'id'\n | 'is'\n | 'it'\n | 'ja'\n | 'jw'\n | 'ka'\n | 'kk'\n | 'km'\n | 'kn'\n | 'ko'\n | 'la'\n | 'lb'\n | 'ln'\n | 'lo'\n | 'lt'\n | 'lv'\n | 'mg'\n | 'mi'\n | 'mk'\n | 'ml'\n | 'mn'\n | 'mr'\n | 'ms'\n | 'mt'\n | 'my'\n | 'ne'\n | 'nl'\n | 'nn'\n | 'no'\n | 'oc'\n | 'pa'\n | 'pl'\n | 'ps'\n | 'pt'\n | 'ro'\n | 'ru'\n | 'sa'\n | 'sd'\n | 'si'\n | 'sk'\n | 'sl'\n | 'sn'\n | 'so'\n | 'sq'\n | 'sr'\n | 'su'\n | 'sv'\n | 'sw'\n | 'ta'\n | 'te'\n | 'tg'\n | 'th'\n | 'tk'\n | 'tl'\n | 'tr'\n | 'tt'\n | 'uk'\n | 'ur'\n | 'uz'\n | 'vi'\n | 'yi'\n | 'yo'\n | 'yue'\n | 'zh'\n | null;\n\n /**\n * Whether to diarize the audio file. Defaults to true.\n */\n diarize?: boolean;\n\n /**\n * Level of the chunks to return. Either segment or word. Default value: \"segment\"\n */\n chunk_level?: 'segment' | 'word';\n\n /**\n * Version of the model to use. All of the models are the Whisper large variant. Default value: \"3\"\n */\n version?: '3';\n\n /**\n * Default value: 64\n */\n batch_size?: number;\n\n /**\n * Prompt to use for generation. Defaults to an empty string. Default value: \"\"\n */\n prompt?: string;\n\n /**\n * Number of speakers in the audio file. Defaults to null. If not provided, the number of speakers will be automatically detected.\n */\n num_speakers?: number | null;\n};\n\nexport const FAL_LANGUAGE_BOOSTS = [\n 'Chinese',\n 'Chinese,Yue',\n 'English',\n 'Arabic',\n 'Russian',\n 'Spanish',\n 'French',\n 'Portuguese',\n 'German',\n 'Turkish',\n 'Dutch',\n 'Ukrainian',\n 'Vietnamese',\n 'Indonesian',\n 'Japanese',\n 'Italian',\n 'Korean',\n 'Thai',\n 'Polish',\n 'Romanian',\n 'Greek',\n 'Czech',\n 'Finnish',\n 'Hindi',\n 'auto',\n] as const;\nexport type FalLanguageBoost = (typeof FAL_LANGUAGE_BOOSTS)[number];\n\nexport const FAL_EMOTIONS = [\n 'happy',\n 'sad',\n 'angry',\n 'fearful',\n 'disgusted',\n 'surprised',\n 'neutral',\n] as const;\nexport type FalEmotion = (typeof FAL_EMOTIONS)[number];\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["import_provider","import_provider_utils","import_provider_utils","import_v4","_a","import_provider_utils","import_v4","import_v4","import_provider_utils","falFailedResponseHandler","falFailedResponseHandler","response","body","_a","_b","_c","_d","import_provider_utils","import_v4","falFailedResponseHandler"]}
package/dist/index.mjs CHANGED
@@ -664,16 +664,16 @@ var FalSpeechModel = class {
664
664
  };
665
665
  if (language) {
666
666
  warnings.push({
667
- type: "unsupported-setting",
668
- setting: "language",
667
+ type: "unsupported",
668
+ feature: "language",
669
669
  details: "fal speech models don't support 'language' directly; consider providerOptions.fal.language_boost"
670
670
  });
671
671
  }
672
672
  if (outputFormat && outputFormat !== "url" && outputFormat !== "hex") {
673
673
  warnings.push({
674
- type: "unsupported-setting",
675
- setting: "outputFormat",
676
- details: `Unsupported or unhandled outputFormat: ${outputFormat}. Using 'url' instead.`
674
+ type: "unsupported",
675
+ feature: "outputFormat",
676
+ details: `Unsupported outputFormat: ${outputFormat}. Using 'url' instead.`
677
677
  });
678
678
  }
679
679
  return { requestBody, warnings };
@@ -730,7 +730,7 @@ var falSpeechResponseSchema = z5.object({
730
730
  });
731
731
 
732
732
  // src/version.ts
733
- var VERSION = true ? "2.0.0-beta.36" : "0.0.0-test";
733
+ var VERSION = true ? "2.0.0-beta.38" : "0.0.0-test";
734
734
 
735
735
  // src/fal-provider.ts
736
736
  var defaultBaseURL = "https://fal.run";
@@ -799,17 +799,17 @@ function createFal(options = {}) {
799
799
  specificationVersion: "v3",
800
800
  imageModel: createImageModel,
801
801
  image: createImageModel,
802
- languageModel: () => {
802
+ languageModel: (modelId) => {
803
803
  throw new NoSuchModelError({
804
- modelId: "languageModel",
804
+ modelId,
805
805
  modelType: "languageModel"
806
806
  });
807
807
  },
808
808
  speech: createSpeechModel,
809
- textEmbeddingModel: () => {
809
+ embeddingModel: (modelId) => {
810
810
  throw new NoSuchModelError({
811
- modelId: "textEmbeddingModel",
812
- modelType: "textEmbeddingModel"
811
+ modelId,
812
+ modelType: "embeddingModel"
813
813
  });
814
814
  },
815
815
  transcription: createTranscriptionModel
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/fal-provider.ts","../src/fal-image-model.ts","../src/fal-image-options.ts","../src/fal-transcription-model.ts","../src/fal-error.ts","../src/fal-speech-model.ts","../src/fal-api-types.ts","../src/version.ts"],"sourcesContent":["import {\n ImageModelV3,\n NoSuchModelError,\n ProviderV3,\n SpeechModelV3,\n TranscriptionModelV3,\n} from '@ai-sdk/provider';\nimport type { FetchFunction } from '@ai-sdk/provider-utils';\nimport {\n withoutTrailingSlash,\n withUserAgentSuffix,\n} from '@ai-sdk/provider-utils';\nimport { FalImageModel } from './fal-image-model';\nimport { FalImageModelId } from './fal-image-settings';\nimport { FalTranscriptionModelId } from './fal-transcription-options';\nimport { FalTranscriptionModel } from './fal-transcription-model';\nimport { FalSpeechModelId } from './fal-speech-settings';\nimport { FalSpeechModel } from './fal-speech-model';\nimport { VERSION } from './version';\n\nexport interface FalProviderSettings {\n /**\nfal.ai API key. Default value is taken from the `FAL_API_KEY` environment\nvariable, falling back to `FAL_KEY`.\n */\n apiKey?: string;\n\n /**\nBase URL for the API calls.\nThe default prefix is `https://fal.run`.\n */\n baseURL?: string;\n\n /**\nCustom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\nCustom fetch implementation. You can use it as a middleware to intercept\nrequests, or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport interface FalProvider extends ProviderV3 {\n /**\nCreates a model for image generation.\n */\n image(modelId: FalImageModelId): ImageModelV3;\n\n /**\nCreates a model for image generation.\n */\n imageModel(modelId: FalImageModelId): ImageModelV3;\n\n /**\nCreates a model for transcription.\n */\n transcription(modelId: FalTranscriptionModelId): TranscriptionModelV3;\n\n /**\nCreates a model for speech generation.\n */\n speech(modelId: FalSpeechModelId): SpeechModelV3;\n}\n\nconst defaultBaseURL = 'https://fal.run';\n\nfunction loadFalApiKey({\n apiKey,\n description = 'fal.ai',\n}: {\n apiKey: string | undefined;\n description?: string;\n}): string {\n if (typeof apiKey === 'string') {\n return apiKey;\n }\n\n if (apiKey != null) {\n throw new Error(`${description} API key must be a string.`);\n }\n\n if (typeof process === 'undefined') {\n throw new Error(\n `${description} API key is missing. Pass it using the 'apiKey' parameter. Environment variables are not supported in this environment.`,\n );\n }\n\n let envApiKey = process.env.FAL_API_KEY;\n if (envApiKey == null) {\n envApiKey = process.env.FAL_KEY;\n }\n\n if (envApiKey == null) {\n throw new Error(\n `${description} API key is missing. Pass it using the 'apiKey' parameter or set either the FAL_API_KEY or FAL_KEY environment variable.`,\n );\n }\n\n if (typeof envApiKey !== 'string') {\n throw new Error(\n `${description} API key must be a string. The value of the environment variable is not a string.`,\n );\n }\n\n return envApiKey;\n}\n\n/**\nCreate a fal.ai provider instance.\n */\nexport function createFal(options: FalProviderSettings = {}): FalProvider {\n const baseURL = withoutTrailingSlash(options.baseURL ?? defaultBaseURL);\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Key ${loadFalApiKey({\n apiKey: options.apiKey,\n })}`,\n ...options.headers,\n },\n `ai-sdk/fal/${VERSION}`,\n );\n\n const createImageModel = (modelId: FalImageModelId) =>\n new FalImageModel(modelId, {\n provider: 'fal.image',\n baseURL: baseURL ?? defaultBaseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createSpeechModel = (modelId: FalSpeechModelId) =>\n new FalSpeechModel(modelId, {\n provider: `fal.speech`,\n url: ({ path }) => path,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createTranscriptionModel = (modelId: FalTranscriptionModelId) =>\n new FalTranscriptionModel(modelId, {\n provider: `fal.transcription`,\n url: ({ path }) => path,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n return {\n specificationVersion: 'v3' as const,\n imageModel: createImageModel,\n image: createImageModel,\n languageModel: () => {\n throw new NoSuchModelError({\n modelId: 'languageModel',\n modelType: 'languageModel',\n });\n },\n speech: createSpeechModel,\n textEmbeddingModel: () => {\n throw new NoSuchModelError({\n modelId: 'textEmbeddingModel',\n modelType: 'textEmbeddingModel',\n });\n },\n transcription: createTranscriptionModel,\n };\n}\n\n/**\nDefault fal.ai provider instance.\n */\nexport const fal = createFal();\n","import type { ImageModelV3, ImageModelV3CallWarning } from '@ai-sdk/provider';\nimport type { Resolvable } from '@ai-sdk/provider-utils';\nimport {\n FetchFunction,\n combineHeaders,\n createBinaryResponseHandler,\n createJsonResponseHandler,\n createJsonErrorResponseHandler,\n createStatusCodeErrorResponseHandler,\n getFromApi,\n parseProviderOptions,\n postJsonToApi,\n resolve,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { FalImageModelId, FalImageSize } from './fal-image-settings';\nimport { falImageProviderOptionsSchema } from './fal-image-options';\n\ninterface FalImageModelConfig {\n provider: string;\n baseURL: string;\n headers?: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class FalImageModel implements ImageModelV3 {\n readonly specificationVersion = 'v3';\n readonly maxImagesPerCall = 1;\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: FalImageModelId,\n private readonly config: FalImageModelConfig,\n ) {}\n\n private async getArgs({\n prompt,\n n,\n size,\n aspectRatio,\n seed,\n providerOptions,\n }: Parameters<ImageModelV3['doGenerate']>[0]) {\n const warnings: Array<ImageModelV3CallWarning> = [];\n\n let imageSize: FalImageSize | undefined;\n if (size) {\n const [width, height] = size.split('x').map(Number);\n imageSize = { width, height };\n } else if (aspectRatio) {\n imageSize = convertAspectRatioToSize(aspectRatio);\n }\n\n const falOptions = await parseProviderOptions({\n provider: 'fal',\n providerOptions,\n schema: falImageProviderOptionsSchema,\n });\n\n const requestBody: Record<string, unknown> = {\n prompt,\n seed,\n image_size: imageSize,\n num_images: n,\n };\n\n if (falOptions) {\n const deprecatedKeys =\n '__deprecatedKeys' in falOptions\n ? (falOptions.__deprecatedKeys as string[])\n : undefined;\n\n if (deprecatedKeys && deprecatedKeys.length > 0) {\n warnings.push({\n type: 'other',\n message: `The following provider options use deprecated snake_case and will be removed in @ai-sdk/fal v2.0. Please use camelCase instead: ${deprecatedKeys\n .map(key => {\n const camelCase = key.replace(/_([a-z])/g, (_, letter) =>\n letter.toUpperCase(),\n );\n return `'${key}' (use '${camelCase}')`;\n })\n .join(', ')}`,\n });\n }\n\n const fieldMapping: Record<string, string> = {\n imageUrl: 'image_url',\n guidanceScale: 'guidance_scale',\n numInferenceSteps: 'num_inference_steps',\n enableSafetyChecker: 'enable_safety_checker',\n outputFormat: 'output_format',\n syncMode: 'sync_mode',\n safetyTolerance: 'safety_tolerance',\n };\n\n for (const [key, value] of Object.entries(falOptions)) {\n if (key === '__deprecatedKeys') continue;\n const apiKey = fieldMapping[key] ?? key;\n\n if (value !== undefined) {\n requestBody[apiKey] = value;\n }\n }\n }\n\n return { requestBody, warnings } as const;\n }\n\n async doGenerate(\n options: Parameters<ImageModelV3['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<ImageModelV3['doGenerate']>>> {\n const { requestBody, warnings } = await this.getArgs(options);\n\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const { value, responseHeaders } = await postJsonToApi({\n url: `${this.config.baseURL}/${this.modelId}`,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n body: requestBody,\n failedResponseHandler: falFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n falImageResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const {\n images: targetImages,\n // prompt is just passed through and not a revised prompt per image\n prompt: _prompt,\n // NSFW information is normalized merged into `providerMetadata.fal.images`\n has_nsfw_concepts,\n nsfw_content_detected,\n // pass through other properties to providerMetadata\n ...responseMetaData\n } = value;\n\n // download the images:\n const downloadedImages = await Promise.all(\n targetImages.map(image =>\n this.downloadImage(image.url, options.abortSignal),\n ),\n );\n\n return {\n images: downloadedImages,\n warnings,\n response: {\n modelId: this.modelId,\n timestamp: currentDate,\n headers: responseHeaders,\n },\n providerMetadata: {\n fal: {\n images: targetImages.map((image, index) => {\n const {\n url,\n content_type: contentType,\n file_name: fileName,\n file_data: fileData,\n file_size: fileSize,\n ...imageMetaData\n } = image;\n\n const nsfw =\n has_nsfw_concepts?.[index] ?? nsfw_content_detected?.[index];\n\n return {\n ...imageMetaData,\n ...removeOnlyUndefined({\n contentType,\n fileName,\n fileData,\n fileSize,\n nsfw,\n }),\n };\n }),\n ...responseMetaData,\n },\n },\n };\n }\n\n private async downloadImage(\n url: string,\n abortSignal: AbortSignal | undefined,\n ): Promise<Uint8Array> {\n const { value: response } = await getFromApi({\n url,\n // No specific headers should be needed for this request as it's a\n // generated image provided by fal.ai.\n abortSignal,\n failedResponseHandler: createStatusCodeErrorResponseHandler(),\n successfulResponseHandler: createBinaryResponseHandler(),\n fetch: this.config.fetch,\n });\n return response;\n }\n}\n\nfunction removeOnlyUndefined<T extends Record<string, unknown>>(obj: T) {\n return Object.fromEntries(\n Object.entries(obj).filter(([, v]) => v !== undefined),\n ) as Partial<T>;\n}\n\n/**\nConverts an aspect ratio to an image size compatible with fal.ai APIs.\n@param aspectRatio - The aspect ratio to convert.\n@returns The image size.\n */\nfunction convertAspectRatioToSize(\n aspectRatio: `${number}:${number}`,\n): FalImageSize | undefined {\n switch (aspectRatio) {\n case '1:1':\n return 'square_hd';\n case '16:9':\n return 'landscape_16_9';\n case '9:16':\n return 'portrait_16_9';\n case '4:3':\n return 'landscape_4_3';\n case '3:4':\n return 'portrait_4_3';\n case '16:10':\n return { width: 1280, height: 800 };\n case '10:16':\n return { width: 800, height: 1280 };\n case '21:9':\n return { width: 2560, height: 1080 };\n case '9:21':\n return { width: 1080, height: 2560 };\n }\n return undefined;\n}\n\n// Validation error has a particular payload to inform the exact property that is invalid\nconst falValidationErrorSchema = z.object({\n detail: z.array(\n z.object({\n loc: z.array(z.string()),\n msg: z.string(),\n type: z.string(),\n }),\n ),\n});\n\ntype ValidationError = z.infer<typeof falValidationErrorSchema>;\n\n// Other errors have a message property\nconst falHttpErrorSchema = z.object({\n message: z.string(),\n});\n\nconst falErrorSchema = z.union([falValidationErrorSchema, falHttpErrorSchema]);\n\nconst falImageSchema = z.object({\n url: z.string(),\n width: z.number().nullish(),\n height: z.number().nullish(),\n // e.g. https://fal.ai/models/fal-ai/fashn/tryon/v1.6/api#schema-output\n content_type: z.string().nullish(),\n // e.g. https://fal.ai/models/fal-ai/flowedit/api#schema-output\n file_name: z.string().nullish(),\n file_data: z.string().optional(),\n file_size: z.number().nullish(),\n});\n\n// https://fal.ai/models/fal-ai/lora/api#type-File\nconst loraFileSchema = z.object({\n url: z.string(),\n content_type: z.string().optional(),\n file_name: z.string().nullable().optional(),\n file_data: z.string().optional(),\n file_size: z.number().nullable().optional(),\n});\n\nconst commonResponseSchema = z.object({\n timings: z\n .object({\n inference: z.number().optional(),\n })\n .optional(),\n seed: z.number().optional(),\n has_nsfw_concepts: z.array(z.boolean()).optional(),\n prompt: z.string().optional(),\n // https://fal.ai/models/fal-ai/lcm/api#schema-output\n nsfw_content_detected: z.array(z.boolean()).optional(),\n num_inference_steps: z.number().optional(),\n // https://fal.ai/models/fal-ai/lora/api#schema-output\n debug_latents: loraFileSchema.optional(),\n debug_per_pass_latents: loraFileSchema.optional(),\n});\n\n// Most FAL image models respond with an array of images, but some have a response\n// with a single image, e.g. https://fal.ai/models/easel-ai/easel-avatar/api#schema-output\nconst base = z.looseObject(commonResponseSchema.shape);\nconst falImageResponseSchema = z\n .union([\n base.extend({ images: z.array(falImageSchema) }),\n base.extend({ image: falImageSchema }),\n ])\n .transform(v => ('images' in v ? v : { ...v, images: [v.image] }))\n .pipe(base.extend({ images: z.array(falImageSchema) }));\n\nfunction isValidationError(error: unknown): error is ValidationError {\n return falValidationErrorSchema.safeParse(error).success;\n}\n\nconst falFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: falErrorSchema,\n errorToMessage: error => {\n if (isValidationError(error)) {\n return error.detail\n .map(detail => `${detail.loc.join('.')}: ${detail.msg}`)\n .join('\\n');\n }\n return error.message ?? 'Unknown fal error';\n },\n});\n","import { InferSchema, lazySchema, zodSchema } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport const falImageProviderOptionsSchema = lazySchema(() =>\n zodSchema(\n z\n .object({\n imageUrl: z.string().nullish(),\n guidanceScale: z.number().min(1).max(20).nullish(),\n numInferenceSteps: z.number().min(1).max(50).nullish(),\n enableSafetyChecker: z.boolean().nullish(),\n outputFormat: z.enum(['jpeg', 'png']).nullish(),\n syncMode: z.boolean().nullish(),\n strength: z.number().nullish(),\n acceleration: z.enum(['none', 'regular', 'high']).nullish(),\n safetyTolerance: z\n .enum(['1', '2', '3', '4', '5', '6'])\n .or(z.number().min(1).max(6))\n .nullish(),\n\n // Deprecated snake_case versions\n image_url: z.string().nullish(),\n guidance_scale: z.number().min(1).max(20).nullish(),\n num_inference_steps: z.number().min(1).max(50).nullish(),\n enable_safety_checker: z.boolean().nullish(),\n output_format: z.enum(['jpeg', 'png']).nullish(),\n sync_mode: z.boolean().nullish(),\n safety_tolerance: z\n .enum(['1', '2', '3', '4', '5', '6'])\n .or(z.number().min(1).max(6))\n .nullish(),\n })\n .passthrough()\n .transform(data => {\n const result: Record<string, unknown> = {};\n const deprecatedKeys: string[] = [];\n\n const mapKey = (snakeKey: string, camelKey: string) => {\n const snakeValue = data[snakeKey as keyof typeof data];\n const camelValue = data[camelKey as keyof typeof data];\n\n // If snake_case is used, mark it as deprecated\n if (snakeValue !== undefined && snakeValue !== null) {\n deprecatedKeys.push(snakeKey);\n result[camelKey] = snakeValue;\n } else if (camelValue !== undefined && camelValue !== null) {\n result[camelKey] = camelValue;\n }\n };\n\n // Map all known parameters\n mapKey('image_url', 'imageUrl');\n mapKey('guidance_scale', 'guidanceScale');\n mapKey('num_inference_steps', 'numInferenceSteps');\n mapKey('enable_safety_checker', 'enableSafetyChecker');\n mapKey('output_format', 'outputFormat');\n mapKey('sync_mode', 'syncMode');\n mapKey('safety_tolerance', 'safetyTolerance');\n\n // These don't have snake_case equivalents\n if (data.strength !== undefined && data.strength !== null) {\n result.strength = data.strength;\n }\n if (data.acceleration !== undefined && data.acceleration !== null) {\n result.acceleration = data.acceleration;\n }\n\n for (const [key, value] of Object.entries(data)) {\n if (\n ![\n // camelCase known keys\n 'imageUrl',\n 'guidanceScale',\n 'numInferenceSteps',\n 'enableSafetyChecker',\n 'outputFormat',\n 'syncMode',\n 'strength',\n 'acceleration',\n 'safetyTolerance',\n // snake_case known keys\n 'image_url',\n 'guidance_scale',\n 'num_inference_steps',\n 'enable_safety_checker',\n 'output_format',\n 'sync_mode',\n 'safety_tolerance',\n ].includes(key)\n ) {\n result[key] = value;\n }\n }\n\n if (deprecatedKeys.length > 0) {\n (result as any).__deprecatedKeys = deprecatedKeys;\n }\n\n return result;\n }),\n ),\n);\n\nexport type FalImageProviderOptions = InferSchema<\n typeof falImageProviderOptionsSchema\n>;\n","import {\n AISDKError,\n TranscriptionModelV3,\n TranscriptionModelV3CallWarning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertUint8ArrayToBase64,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n delay,\n getFromApi,\n parseProviderOptions,\n postJsonToApi,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { FalConfig } from './fal-config';\nimport { falErrorDataSchema, falFailedResponseHandler } from './fal-error';\nimport { FalTranscriptionModelId } from './fal-transcription-options';\nimport { FalTranscriptionAPITypes } from './fal-api-types';\n\n// https://fal.ai/models/fal-ai/whisper/api?platform=http\nconst falProviderOptionsSchema = z.object({\n /**\n * Language of the audio file. If set to null, the language will be automatically detected. Defaults to null.\n *\n * If translate is selected as the task, the audio will be translated to English, regardless of the language selected.\n */\n language: z\n .union([z.enum(['en']), z.string()])\n .nullish()\n .default('en'),\n\n /**\n * Whether to diarize the audio file. Defaults to true.\n */\n diarize: z.boolean().nullish().default(true),\n\n /**\n * Level of the chunks to return. Either segment or word. Default value: \"segment\"\n */\n chunkLevel: z.enum(['segment', 'word']).nullish().default('segment'),\n\n /**\n * Version of the model to use. All of the models are the Whisper large variant. Default value: \"3\"\n */\n version: z.enum(['3']).nullish().default('3'),\n\n /**\n * Default value: 64\n */\n batchSize: z.number().nullish().default(64),\n\n /**\n * Number of speakers in the audio file. Defaults to null. If not provided, the number of speakers will be automatically detected.\n */\n numSpeakers: z.number().nullable().nullish(),\n});\n\nexport type FalTranscriptionCallOptions = z.infer<\n typeof falProviderOptionsSchema\n>;\n\ninterface FalTranscriptionModelConfig extends FalConfig {\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class FalTranscriptionModel implements TranscriptionModelV3 {\n readonly specificationVersion = 'v3';\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: FalTranscriptionModelId,\n private readonly config: FalTranscriptionModelConfig,\n ) {}\n\n private async getArgs({\n providerOptions,\n }: Parameters<TranscriptionModelV3['doGenerate']>[0]) {\n const warnings: TranscriptionModelV3CallWarning[] = [];\n\n // Parse provider options\n const falOptions = await parseProviderOptions({\n provider: 'fal',\n providerOptions,\n schema: falProviderOptionsSchema,\n });\n\n // Create form data with base fields\n const body: Omit<FalTranscriptionAPITypes, 'audio_url'> = {\n task: 'transcribe',\n diarize: true,\n chunk_level: 'word',\n };\n\n // Add provider-specific options\n if (falOptions) {\n body.language = falOptions.language as never;\n body.version = falOptions.version ?? undefined;\n body.batch_size = falOptions.batchSize ?? undefined;\n body.num_speakers = falOptions.numSpeakers ?? undefined;\n\n if (typeof falOptions.diarize === 'boolean') {\n body.diarize = falOptions.diarize;\n }\n\n if (falOptions.chunkLevel) {\n body.chunk_level = falOptions.chunkLevel;\n }\n }\n\n return {\n body,\n warnings,\n };\n }\n\n async doGenerate(\n options: Parameters<TranscriptionModelV3['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<TranscriptionModelV3['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const { body, warnings } = await this.getArgs(options);\n\n const base64Audio =\n typeof options.audio === 'string'\n ? options.audio\n : convertUint8ArrayToBase64(options.audio);\n\n const audioUrl = `data:${options.mediaType};base64,${base64Audio}`;\n\n const { value: queueResponse } = await postJsonToApi({\n url: this.config.url({\n path: `https://queue.fal.run/fal-ai/${this.modelId}`,\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n body: {\n ...body,\n audio_url: audioUrl,\n },\n failedResponseHandler: falFailedResponseHandler,\n successfulResponseHandler:\n createJsonResponseHandler(falJobResponseSchema),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n // Poll for completion with timeout\n const startTime = Date.now();\n const timeoutMs = 60000; // 60 seconds timeout\n const pollIntervalMs = 1000; // 1 second interval\n\n let response;\n let responseHeaders;\n let rawResponse;\n\n while (true) {\n try {\n const {\n value: statusResponse,\n responseHeaders: statusHeaders,\n rawValue: statusRawResponse,\n } = await getFromApi({\n url: this.config.url({\n path: `https://queue.fal.run/fal-ai/${this.modelId}/requests/${queueResponse.request_id}`,\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n failedResponseHandler: async ({\n requestBodyValues,\n response,\n url,\n }) => {\n const clone = response.clone();\n const body = (await clone.json()) as { detail: string };\n\n if (body.detail === 'Request is still in progress') {\n // This is not an error, just a status update that the request is still processing\n // Continue polling by returning a special error that signals to continue\n return {\n value: new Error('Request is still in progress'),\n rawValue: body,\n responseHeaders: {},\n };\n }\n\n return createJsonErrorResponseHandler({\n errorSchema: falErrorDataSchema,\n errorToMessage: data => data.error.message,\n })({ requestBodyValues, response, url });\n },\n successfulResponseHandler: createJsonResponseHandler(\n falTranscriptionResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n response = statusResponse;\n responseHeaders = statusHeaders;\n rawResponse = statusRawResponse;\n break;\n } catch (error) {\n // If the error message indicates the request is still in progress, ignore it and continue polling\n if (\n error instanceof Error &&\n error.message === 'Request is still in progress'\n ) {\n // Continue with the polling loop\n } else {\n // Re-throw any other errors\n throw error;\n }\n }\n\n // Check if we've exceeded the timeout\n if (Date.now() - startTime > timeoutMs) {\n throw new AISDKError({\n message: 'Transcription request timed out after 60 seconds',\n name: 'TranscriptionRequestTimedOut',\n cause: response,\n });\n }\n\n // Wait before polling again\n await delay(pollIntervalMs);\n }\n\n return {\n text: response.text,\n segments:\n response.chunks?.map(chunk => ({\n text: chunk.text,\n startSecond: chunk.timestamp?.at(0) ?? 0,\n endSecond: chunk.timestamp?.at(1) ?? 0,\n })) ?? [],\n language: response.inferred_languages?.at(0) ?? undefined,\n durationInSeconds: response.chunks?.at(-1)?.timestamp?.at(1) ?? undefined,\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n body: rawResponse,\n },\n };\n }\n}\n\nconst falJobResponseSchema = z.object({\n request_id: z.string().nullish(),\n});\n\nconst falTranscriptionResponseSchema = z.object({\n text: z.string(),\n chunks: z\n .array(\n z.object({\n text: z.string(),\n timestamp: z.array(z.number()).nullish(),\n }),\n )\n .nullish(),\n inferred_languages: z.array(z.string()).nullish(),\n});\n","import { z } from 'zod/v4';\nimport { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';\n\nexport const falErrorDataSchema = z.object({\n error: z.object({\n message: z.string(),\n code: z.number(),\n }),\n});\n\nexport type FalErrorData = z.infer<typeof falErrorDataSchema>;\n\nexport const falFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: falErrorDataSchema,\n errorToMessage: data => data.error.message,\n});\n","import { SpeechModelV3, SpeechModelV3CallWarning } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createBinaryResponseHandler,\n createJsonResponseHandler,\n createStatusCodeErrorResponseHandler,\n getFromApi,\n parseProviderOptions,\n postJsonToApi,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { FalConfig } from './fal-config';\nimport { falFailedResponseHandler } from './fal-error';\nimport { FAL_EMOTIONS, FAL_LANGUAGE_BOOSTS } from './fal-api-types';\nimport { FalSpeechModelId } from './fal-speech-settings';\n\nconst falSpeechProviderOptionsSchema = z.looseObject({\n voice_setting: z\n .object({\n speed: z.number().nullish(),\n vol: z.number().nullish(),\n voice_id: z.string().nullish(),\n pitch: z.number().nullish(),\n english_normalization: z.boolean().nullish(),\n emotion: z.enum(FAL_EMOTIONS).nullish(),\n })\n .partial()\n .nullish(),\n audio_setting: z.record(z.string(), z.unknown()).nullish(),\n language_boost: z.enum(FAL_LANGUAGE_BOOSTS).nullish(),\n pronunciation_dict: z.record(z.string(), z.string()).nullish(),\n});\n\nexport type FalSpeechCallOptions = z.infer<\n typeof falSpeechProviderOptionsSchema\n>;\n\ninterface FalSpeechModelConfig extends FalConfig {\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class FalSpeechModel implements SpeechModelV3 {\n readonly specificationVersion = 'v3';\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: FalSpeechModelId,\n private readonly config: FalSpeechModelConfig,\n ) {}\n\n private async getArgs({\n text,\n voice,\n outputFormat,\n speed,\n language,\n providerOptions,\n }: Parameters<SpeechModelV3['doGenerate']>[0]) {\n const warnings: SpeechModelV3CallWarning[] = [];\n\n const falOptions = await parseProviderOptions({\n provider: 'fal',\n providerOptions,\n schema: falSpeechProviderOptionsSchema,\n });\n\n const requestBody = {\n text,\n output_format: outputFormat === 'hex' ? 'hex' : 'url',\n voice,\n speed,\n ...falOptions,\n };\n\n // Language is not directly supported; warn and ignore\n if (language) {\n warnings.push({\n type: 'unsupported-setting',\n setting: 'language',\n details:\n \"fal speech models don't support 'language' directly; consider providerOptions.fal.language_boost\",\n });\n }\n\n // warn on invalid values (and on hex until we support hex response handling)\n if (outputFormat && outputFormat !== 'url' && outputFormat !== 'hex') {\n warnings.push({\n type: 'unsupported-setting',\n setting: 'outputFormat',\n details: `Unsupported or unhandled outputFormat: ${outputFormat}. Using 'url' instead.`,\n });\n }\n\n return { requestBody, warnings } as const;\n }\n\n async doGenerate(\n options: Parameters<SpeechModelV3['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<SpeechModelV3['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const { requestBody, warnings } = await this.getArgs(options);\n\n const {\n value: json,\n responseHeaders,\n rawValue,\n } = await postJsonToApi({\n url: this.config.url({\n path: `https://fal.run/${this.modelId}`,\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n body: requestBody,\n failedResponseHandler: falFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n falSpeechResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const audioUrl = json.audio.url;\n const { value: audio } = await getFromApi({\n url: audioUrl,\n failedResponseHandler: createStatusCodeErrorResponseHandler(),\n successfulResponseHandler: createBinaryResponseHandler(),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n audio,\n warnings,\n request: {\n body: JSON.stringify(requestBody),\n },\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n body: rawValue,\n },\n };\n }\n}\n\nconst falSpeechResponseSchema = z.object({\n audio: z.object({ url: z.string() }),\n duration_ms: z.number().optional(),\n request_id: z.string().optional(),\n});\n","export type FalTranscriptionAPITypes = {\n /**\n * URL of the audio file to transcribe. Supported formats: mp3, mp4, mpeg, mpga, m4a, wav or webm.\n */\n audio_url: string;\n\n /**\n * Task to perform on the audio file. Either transcribe or translate. Default value: \"transcribe\"\n */\n task?: 'transcribe' | 'translate';\n\n /**\n * Language of the audio file. If set to null, the language will be automatically detected. Defaults to null.\n *\n * If translate is selected as the task, the audio will be translated to English, regardless of the language selected.\n */\n language?:\n | 'af'\n | 'am'\n | 'ar'\n | 'as'\n | 'az'\n | 'ba'\n | 'be'\n | 'bg'\n | 'bn'\n | 'bo'\n | 'br'\n | 'bs'\n | 'ca'\n | 'cs'\n | 'cy'\n | 'da'\n | 'de'\n | 'el'\n | 'en'\n | 'es'\n | 'et'\n | 'eu'\n | 'fa'\n | 'fi'\n | 'fo'\n | 'fr'\n | 'gl'\n | 'gu'\n | 'ha'\n | 'haw'\n | 'he'\n | 'hi'\n | 'hr'\n | 'ht'\n | 'hu'\n | 'hy'\n | 'id'\n | 'is'\n | 'it'\n | 'ja'\n | 'jw'\n | 'ka'\n | 'kk'\n | 'km'\n | 'kn'\n | 'ko'\n | 'la'\n | 'lb'\n | 'ln'\n | 'lo'\n | 'lt'\n | 'lv'\n | 'mg'\n | 'mi'\n | 'mk'\n | 'ml'\n | 'mn'\n | 'mr'\n | 'ms'\n | 'mt'\n | 'my'\n | 'ne'\n | 'nl'\n | 'nn'\n | 'no'\n | 'oc'\n | 'pa'\n | 'pl'\n | 'ps'\n | 'pt'\n | 'ro'\n | 'ru'\n | 'sa'\n | 'sd'\n | 'si'\n | 'sk'\n | 'sl'\n | 'sn'\n | 'so'\n | 'sq'\n | 'sr'\n | 'su'\n | 'sv'\n | 'sw'\n | 'ta'\n | 'te'\n | 'tg'\n | 'th'\n | 'tk'\n | 'tl'\n | 'tr'\n | 'tt'\n | 'uk'\n | 'ur'\n | 'uz'\n | 'vi'\n | 'yi'\n | 'yo'\n | 'yue'\n | 'zh'\n | null;\n\n /**\n * Whether to diarize the audio file. Defaults to true.\n */\n diarize?: boolean;\n\n /**\n * Level of the chunks to return. Either segment or word. Default value: \"segment\"\n */\n chunk_level?: 'segment' | 'word';\n\n /**\n * Version of the model to use. All of the models are the Whisper large variant. Default value: \"3\"\n */\n version?: '3';\n\n /**\n * Default value: 64\n */\n batch_size?: number;\n\n /**\n * Prompt to use for generation. Defaults to an empty string. Default value: \"\"\n */\n prompt?: string;\n\n /**\n * Number of speakers in the audio file. Defaults to null. If not provided, the number of speakers will be automatically detected.\n */\n num_speakers?: number | null;\n};\n\nexport const FAL_LANGUAGE_BOOSTS = [\n 'Chinese',\n 'Chinese,Yue',\n 'English',\n 'Arabic',\n 'Russian',\n 'Spanish',\n 'French',\n 'Portuguese',\n 'German',\n 'Turkish',\n 'Dutch',\n 'Ukrainian',\n 'Vietnamese',\n 'Indonesian',\n 'Japanese',\n 'Italian',\n 'Korean',\n 'Thai',\n 'Polish',\n 'Romanian',\n 'Greek',\n 'Czech',\n 'Finnish',\n 'Hindi',\n 'auto',\n] as const;\nexport type FalLanguageBoost = (typeof FAL_LANGUAGE_BOOSTS)[number];\n\nexport const FAL_EMOTIONS = [\n 'happy',\n 'sad',\n 'angry',\n 'fearful',\n 'disgusted',\n 'surprised',\n 'neutral',\n] as const;\nexport type FalEmotion = (typeof FAL_EMOTIONS)[number];\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["z","_a","z","combineHeaders","createJsonErrorResponseHandler","createJsonResponseHandler","getFromApi","parseProviderOptions","postJsonToApi","z","z","createJsonErrorResponseHandler","falFailedResponseHandler","z","parseProviderOptions","postJsonToApi","combineHeaders","falFailedResponseHandler","createJsonResponseHandler","getFromApi","response","body","createJsonErrorResponseHandler","_a","_b","_c","_d","combineHeaders","createBinaryResponseHandler","createJsonResponseHandler","createStatusCodeErrorResponseHandler","getFromApi","parseProviderOptions","postJsonToApi","z","z","parseProviderOptions","postJsonToApi","combineHeaders","falFailedResponseHandler","createJsonResponseHandler","getFromApi","createStatusCodeErrorResponseHandler","createBinaryResponseHandler"]}
1
+ {"version":3,"sources":["../src/fal-provider.ts","../src/fal-image-model.ts","../src/fal-image-options.ts","../src/fal-transcription-model.ts","../src/fal-error.ts","../src/fal-speech-model.ts","../src/fal-api-types.ts","../src/version.ts"],"sourcesContent":["import {\n ImageModelV3,\n NoSuchModelError,\n ProviderV3,\n SpeechModelV3,\n TranscriptionModelV3,\n} from '@ai-sdk/provider';\nimport type { FetchFunction } from '@ai-sdk/provider-utils';\nimport {\n withoutTrailingSlash,\n withUserAgentSuffix,\n} from '@ai-sdk/provider-utils';\nimport { FalImageModel } from './fal-image-model';\nimport { FalImageModelId } from './fal-image-settings';\nimport { FalTranscriptionModelId } from './fal-transcription-options';\nimport { FalTranscriptionModel } from './fal-transcription-model';\nimport { FalSpeechModelId } from './fal-speech-settings';\nimport { FalSpeechModel } from './fal-speech-model';\nimport { VERSION } from './version';\n\nexport interface FalProviderSettings {\n /**\nfal.ai API key. Default value is taken from the `FAL_API_KEY` environment\nvariable, falling back to `FAL_KEY`.\n */\n apiKey?: string;\n\n /**\nBase URL for the API calls.\nThe default prefix is `https://fal.run`.\n */\n baseURL?: string;\n\n /**\nCustom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\nCustom fetch implementation. You can use it as a middleware to intercept\nrequests, or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport interface FalProvider extends ProviderV3 {\n /**\nCreates a model for image generation.\n */\n image(modelId: FalImageModelId): ImageModelV3;\n\n /**\nCreates a model for image generation.\n */\n imageModel(modelId: FalImageModelId): ImageModelV3;\n\n /**\nCreates a model for transcription.\n */\n transcription(modelId: FalTranscriptionModelId): TranscriptionModelV3;\n\n /**\nCreates a model for speech generation.\n */\n speech(modelId: FalSpeechModelId): SpeechModelV3;\n}\n\nconst defaultBaseURL = 'https://fal.run';\n\nfunction loadFalApiKey({\n apiKey,\n description = 'fal.ai',\n}: {\n apiKey: string | undefined;\n description?: string;\n}): string {\n if (typeof apiKey === 'string') {\n return apiKey;\n }\n\n if (apiKey != null) {\n throw new Error(`${description} API key must be a string.`);\n }\n\n if (typeof process === 'undefined') {\n throw new Error(\n `${description} API key is missing. Pass it using the 'apiKey' parameter. Environment variables are not supported in this environment.`,\n );\n }\n\n let envApiKey = process.env.FAL_API_KEY;\n if (envApiKey == null) {\n envApiKey = process.env.FAL_KEY;\n }\n\n if (envApiKey == null) {\n throw new Error(\n `${description} API key is missing. Pass it using the 'apiKey' parameter or set either the FAL_API_KEY or FAL_KEY environment variable.`,\n );\n }\n\n if (typeof envApiKey !== 'string') {\n throw new Error(\n `${description} API key must be a string. The value of the environment variable is not a string.`,\n );\n }\n\n return envApiKey;\n}\n\n/**\nCreate a fal.ai provider instance.\n */\nexport function createFal(options: FalProviderSettings = {}): FalProvider {\n const baseURL = withoutTrailingSlash(options.baseURL ?? defaultBaseURL);\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Key ${loadFalApiKey({\n apiKey: options.apiKey,\n })}`,\n ...options.headers,\n },\n `ai-sdk/fal/${VERSION}`,\n );\n\n const createImageModel = (modelId: FalImageModelId) =>\n new FalImageModel(modelId, {\n provider: 'fal.image',\n baseURL: baseURL ?? defaultBaseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createSpeechModel = (modelId: FalSpeechModelId) =>\n new FalSpeechModel(modelId, {\n provider: `fal.speech`,\n url: ({ path }) => path,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createTranscriptionModel = (modelId: FalTranscriptionModelId) =>\n new FalTranscriptionModel(modelId, {\n provider: `fal.transcription`,\n url: ({ path }) => path,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n return {\n specificationVersion: 'v3' as const,\n imageModel: createImageModel,\n image: createImageModel,\n languageModel: (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'languageModel',\n });\n },\n speech: createSpeechModel,\n embeddingModel: (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'embeddingModel',\n });\n },\n transcription: createTranscriptionModel,\n };\n}\n\n/**\nDefault fal.ai provider instance.\n */\nexport const fal = createFal();\n","import type { ImageModelV3, SharedV3Warning } from '@ai-sdk/provider';\nimport type { Resolvable } from '@ai-sdk/provider-utils';\nimport {\n FetchFunction,\n combineHeaders,\n createBinaryResponseHandler,\n createJsonResponseHandler,\n createJsonErrorResponseHandler,\n createStatusCodeErrorResponseHandler,\n getFromApi,\n parseProviderOptions,\n postJsonToApi,\n resolve,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { FalImageModelId, FalImageSize } from './fal-image-settings';\nimport { falImageProviderOptionsSchema } from './fal-image-options';\n\ninterface FalImageModelConfig {\n provider: string;\n baseURL: string;\n headers?: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class FalImageModel implements ImageModelV3 {\n readonly specificationVersion = 'v3';\n readonly maxImagesPerCall = 1;\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: FalImageModelId,\n private readonly config: FalImageModelConfig,\n ) {}\n\n private async getArgs({\n prompt,\n n,\n size,\n aspectRatio,\n seed,\n providerOptions,\n }: Parameters<ImageModelV3['doGenerate']>[0]) {\n const warnings: Array<SharedV3Warning> = [];\n\n let imageSize: FalImageSize | undefined;\n if (size) {\n const [width, height] = size.split('x').map(Number);\n imageSize = { width, height };\n } else if (aspectRatio) {\n imageSize = convertAspectRatioToSize(aspectRatio);\n }\n\n const falOptions = await parseProviderOptions({\n provider: 'fal',\n providerOptions,\n schema: falImageProviderOptionsSchema,\n });\n\n const requestBody: Record<string, unknown> = {\n prompt,\n seed,\n image_size: imageSize,\n num_images: n,\n };\n\n if (falOptions) {\n const deprecatedKeys =\n '__deprecatedKeys' in falOptions\n ? (falOptions.__deprecatedKeys as string[])\n : undefined;\n\n if (deprecatedKeys && deprecatedKeys.length > 0) {\n warnings.push({\n type: 'other',\n message: `The following provider options use deprecated snake_case and will be removed in @ai-sdk/fal v2.0. Please use camelCase instead: ${deprecatedKeys\n .map(key => {\n const camelCase = key.replace(/_([a-z])/g, (_, letter) =>\n letter.toUpperCase(),\n );\n return `'${key}' (use '${camelCase}')`;\n })\n .join(', ')}`,\n });\n }\n\n const fieldMapping: Record<string, string> = {\n imageUrl: 'image_url',\n guidanceScale: 'guidance_scale',\n numInferenceSteps: 'num_inference_steps',\n enableSafetyChecker: 'enable_safety_checker',\n outputFormat: 'output_format',\n syncMode: 'sync_mode',\n safetyTolerance: 'safety_tolerance',\n };\n\n for (const [key, value] of Object.entries(falOptions)) {\n if (key === '__deprecatedKeys') continue;\n const apiKey = fieldMapping[key] ?? key;\n\n if (value !== undefined) {\n requestBody[apiKey] = value;\n }\n }\n }\n\n return { requestBody, warnings } as const;\n }\n\n async doGenerate(\n options: Parameters<ImageModelV3['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<ImageModelV3['doGenerate']>>> {\n const { requestBody, warnings } = await this.getArgs(options);\n\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const { value, responseHeaders } = await postJsonToApi({\n url: `${this.config.baseURL}/${this.modelId}`,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n body: requestBody,\n failedResponseHandler: falFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n falImageResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const {\n images: targetImages,\n // prompt is just passed through and not a revised prompt per image\n prompt: _prompt,\n // NSFW information is normalized merged into `providerMetadata.fal.images`\n has_nsfw_concepts,\n nsfw_content_detected,\n // pass through other properties to providerMetadata\n ...responseMetaData\n } = value;\n\n // download the images:\n const downloadedImages = await Promise.all(\n targetImages.map(image =>\n this.downloadImage(image.url, options.abortSignal),\n ),\n );\n\n return {\n images: downloadedImages,\n warnings,\n response: {\n modelId: this.modelId,\n timestamp: currentDate,\n headers: responseHeaders,\n },\n providerMetadata: {\n fal: {\n images: targetImages.map((image, index) => {\n const {\n url,\n content_type: contentType,\n file_name: fileName,\n file_data: fileData,\n file_size: fileSize,\n ...imageMetaData\n } = image;\n\n const nsfw =\n has_nsfw_concepts?.[index] ?? nsfw_content_detected?.[index];\n\n return {\n ...imageMetaData,\n ...removeOnlyUndefined({\n contentType,\n fileName,\n fileData,\n fileSize,\n nsfw,\n }),\n };\n }),\n ...responseMetaData,\n },\n },\n };\n }\n\n private async downloadImage(\n url: string,\n abortSignal: AbortSignal | undefined,\n ): Promise<Uint8Array> {\n const { value: response } = await getFromApi({\n url,\n // No specific headers should be needed for this request as it's a\n // generated image provided by fal.ai.\n abortSignal,\n failedResponseHandler: createStatusCodeErrorResponseHandler(),\n successfulResponseHandler: createBinaryResponseHandler(),\n fetch: this.config.fetch,\n });\n return response;\n }\n}\n\nfunction removeOnlyUndefined<T extends Record<string, unknown>>(obj: T) {\n return Object.fromEntries(\n Object.entries(obj).filter(([, v]) => v !== undefined),\n ) as Partial<T>;\n}\n\n/**\nConverts an aspect ratio to an image size compatible with fal.ai APIs.\n@param aspectRatio - The aspect ratio to convert.\n@returns The image size.\n */\nfunction convertAspectRatioToSize(\n aspectRatio: `${number}:${number}`,\n): FalImageSize | undefined {\n switch (aspectRatio) {\n case '1:1':\n return 'square_hd';\n case '16:9':\n return 'landscape_16_9';\n case '9:16':\n return 'portrait_16_9';\n case '4:3':\n return 'landscape_4_3';\n case '3:4':\n return 'portrait_4_3';\n case '16:10':\n return { width: 1280, height: 800 };\n case '10:16':\n return { width: 800, height: 1280 };\n case '21:9':\n return { width: 2560, height: 1080 };\n case '9:21':\n return { width: 1080, height: 2560 };\n }\n return undefined;\n}\n\n// Validation error has a particular payload to inform the exact property that is invalid\nconst falValidationErrorSchema = z.object({\n detail: z.array(\n z.object({\n loc: z.array(z.string()),\n msg: z.string(),\n type: z.string(),\n }),\n ),\n});\n\ntype ValidationError = z.infer<typeof falValidationErrorSchema>;\n\n// Other errors have a message property\nconst falHttpErrorSchema = z.object({\n message: z.string(),\n});\n\nconst falErrorSchema = z.union([falValidationErrorSchema, falHttpErrorSchema]);\n\nconst falImageSchema = z.object({\n url: z.string(),\n width: z.number().nullish(),\n height: z.number().nullish(),\n // e.g. https://fal.ai/models/fal-ai/fashn/tryon/v1.6/api#schema-output\n content_type: z.string().nullish(),\n // e.g. https://fal.ai/models/fal-ai/flowedit/api#schema-output\n file_name: z.string().nullish(),\n file_data: z.string().optional(),\n file_size: z.number().nullish(),\n});\n\n// https://fal.ai/models/fal-ai/lora/api#type-File\nconst loraFileSchema = z.object({\n url: z.string(),\n content_type: z.string().optional(),\n file_name: z.string().nullable().optional(),\n file_data: z.string().optional(),\n file_size: z.number().nullable().optional(),\n});\n\nconst commonResponseSchema = z.object({\n timings: z\n .object({\n inference: z.number().optional(),\n })\n .optional(),\n seed: z.number().optional(),\n has_nsfw_concepts: z.array(z.boolean()).optional(),\n prompt: z.string().optional(),\n // https://fal.ai/models/fal-ai/lcm/api#schema-output\n nsfw_content_detected: z.array(z.boolean()).optional(),\n num_inference_steps: z.number().optional(),\n // https://fal.ai/models/fal-ai/lora/api#schema-output\n debug_latents: loraFileSchema.optional(),\n debug_per_pass_latents: loraFileSchema.optional(),\n});\n\n// Most FAL image models respond with an array of images, but some have a response\n// with a single image, e.g. https://fal.ai/models/easel-ai/easel-avatar/api#schema-output\nconst base = z.looseObject(commonResponseSchema.shape);\nconst falImageResponseSchema = z\n .union([\n base.extend({ images: z.array(falImageSchema) }),\n base.extend({ image: falImageSchema }),\n ])\n .transform(v => ('images' in v ? v : { ...v, images: [v.image] }))\n .pipe(base.extend({ images: z.array(falImageSchema) }));\n\nfunction isValidationError(error: unknown): error is ValidationError {\n return falValidationErrorSchema.safeParse(error).success;\n}\n\nconst falFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: falErrorSchema,\n errorToMessage: error => {\n if (isValidationError(error)) {\n return error.detail\n .map(detail => `${detail.loc.join('.')}: ${detail.msg}`)\n .join('\\n');\n }\n return error.message ?? 'Unknown fal error';\n },\n});\n","import { InferSchema, lazySchema, zodSchema } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport const falImageProviderOptionsSchema = lazySchema(() =>\n zodSchema(\n z\n .object({\n imageUrl: z.string().nullish(),\n guidanceScale: z.number().min(1).max(20).nullish(),\n numInferenceSteps: z.number().min(1).max(50).nullish(),\n enableSafetyChecker: z.boolean().nullish(),\n outputFormat: z.enum(['jpeg', 'png']).nullish(),\n syncMode: z.boolean().nullish(),\n strength: z.number().nullish(),\n acceleration: z.enum(['none', 'regular', 'high']).nullish(),\n safetyTolerance: z\n .enum(['1', '2', '3', '4', '5', '6'])\n .or(z.number().min(1).max(6))\n .nullish(),\n\n // Deprecated snake_case versions\n image_url: z.string().nullish(),\n guidance_scale: z.number().min(1).max(20).nullish(),\n num_inference_steps: z.number().min(1).max(50).nullish(),\n enable_safety_checker: z.boolean().nullish(),\n output_format: z.enum(['jpeg', 'png']).nullish(),\n sync_mode: z.boolean().nullish(),\n safety_tolerance: z\n .enum(['1', '2', '3', '4', '5', '6'])\n .or(z.number().min(1).max(6))\n .nullish(),\n })\n .passthrough()\n .transform(data => {\n const result: Record<string, unknown> = {};\n const deprecatedKeys: string[] = [];\n\n const mapKey = (snakeKey: string, camelKey: string) => {\n const snakeValue = data[snakeKey as keyof typeof data];\n const camelValue = data[camelKey as keyof typeof data];\n\n // If snake_case is used, mark it as deprecated\n if (snakeValue !== undefined && snakeValue !== null) {\n deprecatedKeys.push(snakeKey);\n result[camelKey] = snakeValue;\n } else if (camelValue !== undefined && camelValue !== null) {\n result[camelKey] = camelValue;\n }\n };\n\n // Map all known parameters\n mapKey('image_url', 'imageUrl');\n mapKey('guidance_scale', 'guidanceScale');\n mapKey('num_inference_steps', 'numInferenceSteps');\n mapKey('enable_safety_checker', 'enableSafetyChecker');\n mapKey('output_format', 'outputFormat');\n mapKey('sync_mode', 'syncMode');\n mapKey('safety_tolerance', 'safetyTolerance');\n\n // These don't have snake_case equivalents\n if (data.strength !== undefined && data.strength !== null) {\n result.strength = data.strength;\n }\n if (data.acceleration !== undefined && data.acceleration !== null) {\n result.acceleration = data.acceleration;\n }\n\n for (const [key, value] of Object.entries(data)) {\n if (\n ![\n // camelCase known keys\n 'imageUrl',\n 'guidanceScale',\n 'numInferenceSteps',\n 'enableSafetyChecker',\n 'outputFormat',\n 'syncMode',\n 'strength',\n 'acceleration',\n 'safetyTolerance',\n // snake_case known keys\n 'image_url',\n 'guidance_scale',\n 'num_inference_steps',\n 'enable_safety_checker',\n 'output_format',\n 'sync_mode',\n 'safety_tolerance',\n ].includes(key)\n ) {\n result[key] = value;\n }\n }\n\n if (deprecatedKeys.length > 0) {\n (result as any).__deprecatedKeys = deprecatedKeys;\n }\n\n return result;\n }),\n ),\n);\n\nexport type FalImageProviderOptions = InferSchema<\n typeof falImageProviderOptionsSchema\n>;\n","import {\n AISDKError,\n TranscriptionModelV3,\n SharedV3Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertUint8ArrayToBase64,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n delay,\n getFromApi,\n parseProviderOptions,\n postJsonToApi,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { FalConfig } from './fal-config';\nimport { falErrorDataSchema, falFailedResponseHandler } from './fal-error';\nimport { FalTranscriptionModelId } from './fal-transcription-options';\nimport { FalTranscriptionAPITypes } from './fal-api-types';\n\n// https://fal.ai/models/fal-ai/whisper/api?platform=http\nconst falProviderOptionsSchema = z.object({\n /**\n * Language of the audio file. If set to null, the language will be automatically detected. Defaults to null.\n *\n * If translate is selected as the task, the audio will be translated to English, regardless of the language selected.\n */\n language: z\n .union([z.enum(['en']), z.string()])\n .nullish()\n .default('en'),\n\n /**\n * Whether to diarize the audio file. Defaults to true.\n */\n diarize: z.boolean().nullish().default(true),\n\n /**\n * Level of the chunks to return. Either segment or word. Default value: \"segment\"\n */\n chunkLevel: z.enum(['segment', 'word']).nullish().default('segment'),\n\n /**\n * Version of the model to use. All of the models are the Whisper large variant. Default value: \"3\"\n */\n version: z.enum(['3']).nullish().default('3'),\n\n /**\n * Default value: 64\n */\n batchSize: z.number().nullish().default(64),\n\n /**\n * Number of speakers in the audio file. Defaults to null. If not provided, the number of speakers will be automatically detected.\n */\n numSpeakers: z.number().nullable().nullish(),\n});\n\nexport type FalTranscriptionCallOptions = z.infer<\n typeof falProviderOptionsSchema\n>;\n\ninterface FalTranscriptionModelConfig extends FalConfig {\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class FalTranscriptionModel implements TranscriptionModelV3 {\n readonly specificationVersion = 'v3';\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: FalTranscriptionModelId,\n private readonly config: FalTranscriptionModelConfig,\n ) {}\n\n private async getArgs({\n providerOptions,\n }: Parameters<TranscriptionModelV3['doGenerate']>[0]) {\n const warnings: SharedV3Warning[] = [];\n\n // Parse provider options\n const falOptions = await parseProviderOptions({\n provider: 'fal',\n providerOptions,\n schema: falProviderOptionsSchema,\n });\n\n // Create form data with base fields\n const body: Omit<FalTranscriptionAPITypes, 'audio_url'> = {\n task: 'transcribe',\n diarize: true,\n chunk_level: 'word',\n };\n\n // Add provider-specific options\n if (falOptions) {\n body.language = falOptions.language as never;\n body.version = falOptions.version ?? undefined;\n body.batch_size = falOptions.batchSize ?? undefined;\n body.num_speakers = falOptions.numSpeakers ?? undefined;\n\n if (typeof falOptions.diarize === 'boolean') {\n body.diarize = falOptions.diarize;\n }\n\n if (falOptions.chunkLevel) {\n body.chunk_level = falOptions.chunkLevel;\n }\n }\n\n return {\n body,\n warnings,\n };\n }\n\n async doGenerate(\n options: Parameters<TranscriptionModelV3['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<TranscriptionModelV3['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const { body, warnings } = await this.getArgs(options);\n\n const base64Audio =\n typeof options.audio === 'string'\n ? options.audio\n : convertUint8ArrayToBase64(options.audio);\n\n const audioUrl = `data:${options.mediaType};base64,${base64Audio}`;\n\n const { value: queueResponse } = await postJsonToApi({\n url: this.config.url({\n path: `https://queue.fal.run/fal-ai/${this.modelId}`,\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n body: {\n ...body,\n audio_url: audioUrl,\n },\n failedResponseHandler: falFailedResponseHandler,\n successfulResponseHandler:\n createJsonResponseHandler(falJobResponseSchema),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n // Poll for completion with timeout\n const startTime = Date.now();\n const timeoutMs = 60000; // 60 seconds timeout\n const pollIntervalMs = 1000; // 1 second interval\n\n let response;\n let responseHeaders;\n let rawResponse;\n\n while (true) {\n try {\n const {\n value: statusResponse,\n responseHeaders: statusHeaders,\n rawValue: statusRawResponse,\n } = await getFromApi({\n url: this.config.url({\n path: `https://queue.fal.run/fal-ai/${this.modelId}/requests/${queueResponse.request_id}`,\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n failedResponseHandler: async ({\n requestBodyValues,\n response,\n url,\n }) => {\n const clone = response.clone();\n const body = (await clone.json()) as { detail: string };\n\n if (body.detail === 'Request is still in progress') {\n // This is not an error, just a status update that the request is still processing\n // Continue polling by returning a special error that signals to continue\n return {\n value: new Error('Request is still in progress'),\n rawValue: body,\n responseHeaders: {},\n };\n }\n\n return createJsonErrorResponseHandler({\n errorSchema: falErrorDataSchema,\n errorToMessage: data => data.error.message,\n })({ requestBodyValues, response, url });\n },\n successfulResponseHandler: createJsonResponseHandler(\n falTranscriptionResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n response = statusResponse;\n responseHeaders = statusHeaders;\n rawResponse = statusRawResponse;\n break;\n } catch (error) {\n // If the error message indicates the request is still in progress, ignore it and continue polling\n if (\n error instanceof Error &&\n error.message === 'Request is still in progress'\n ) {\n // Continue with the polling loop\n } else {\n // Re-throw any other errors\n throw error;\n }\n }\n\n // Check if we've exceeded the timeout\n if (Date.now() - startTime > timeoutMs) {\n throw new AISDKError({\n message: 'Transcription request timed out after 60 seconds',\n name: 'TranscriptionRequestTimedOut',\n cause: response,\n });\n }\n\n // Wait before polling again\n await delay(pollIntervalMs);\n }\n\n return {\n text: response.text,\n segments:\n response.chunks?.map(chunk => ({\n text: chunk.text,\n startSecond: chunk.timestamp?.at(0) ?? 0,\n endSecond: chunk.timestamp?.at(1) ?? 0,\n })) ?? [],\n language: response.inferred_languages?.at(0) ?? undefined,\n durationInSeconds: response.chunks?.at(-1)?.timestamp?.at(1) ?? undefined,\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n body: rawResponse,\n },\n };\n }\n}\n\nconst falJobResponseSchema = z.object({\n request_id: z.string().nullish(),\n});\n\nconst falTranscriptionResponseSchema = z.object({\n text: z.string(),\n chunks: z\n .array(\n z.object({\n text: z.string(),\n timestamp: z.array(z.number()).nullish(),\n }),\n )\n .nullish(),\n inferred_languages: z.array(z.string()).nullish(),\n});\n","import { z } from 'zod/v4';\nimport { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';\n\nexport const falErrorDataSchema = z.object({\n error: z.object({\n message: z.string(),\n code: z.number(),\n }),\n});\n\nexport type FalErrorData = z.infer<typeof falErrorDataSchema>;\n\nexport const falFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: falErrorDataSchema,\n errorToMessage: data => data.error.message,\n});\n","import { SpeechModelV3, SharedV3Warning } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createBinaryResponseHandler,\n createJsonResponseHandler,\n createStatusCodeErrorResponseHandler,\n getFromApi,\n parseProviderOptions,\n postJsonToApi,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { FalConfig } from './fal-config';\nimport { falFailedResponseHandler } from './fal-error';\nimport { FAL_EMOTIONS, FAL_LANGUAGE_BOOSTS } from './fal-api-types';\nimport { FalSpeechModelId } from './fal-speech-settings';\n\nconst falSpeechProviderOptionsSchema = z.looseObject({\n voice_setting: z\n .object({\n speed: z.number().nullish(),\n vol: z.number().nullish(),\n voice_id: z.string().nullish(),\n pitch: z.number().nullish(),\n english_normalization: z.boolean().nullish(),\n emotion: z.enum(FAL_EMOTIONS).nullish(),\n })\n .partial()\n .nullish(),\n audio_setting: z.record(z.string(), z.unknown()).nullish(),\n language_boost: z.enum(FAL_LANGUAGE_BOOSTS).nullish(),\n pronunciation_dict: z.record(z.string(), z.string()).nullish(),\n});\n\nexport type FalSpeechCallOptions = z.infer<\n typeof falSpeechProviderOptionsSchema\n>;\n\ninterface FalSpeechModelConfig extends FalConfig {\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class FalSpeechModel implements SpeechModelV3 {\n readonly specificationVersion = 'v3';\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: FalSpeechModelId,\n private readonly config: FalSpeechModelConfig,\n ) {}\n\n private async getArgs({\n text,\n voice,\n outputFormat,\n speed,\n language,\n providerOptions,\n }: Parameters<SpeechModelV3['doGenerate']>[0]) {\n const warnings: SharedV3Warning[] = [];\n\n const falOptions = await parseProviderOptions({\n provider: 'fal',\n providerOptions,\n schema: falSpeechProviderOptionsSchema,\n });\n\n const requestBody = {\n text,\n output_format: outputFormat === 'hex' ? 'hex' : 'url',\n voice,\n speed,\n ...falOptions,\n };\n\n // Language is not directly supported; warn and ignore\n if (language) {\n warnings.push({\n type: 'unsupported',\n feature: 'language',\n details:\n \"fal speech models don't support 'language' directly; consider providerOptions.fal.language_boost\",\n });\n }\n\n // warn on invalid values (and on hex until we support hex response handling)\n if (outputFormat && outputFormat !== 'url' && outputFormat !== 'hex') {\n warnings.push({\n type: 'unsupported',\n feature: 'outputFormat',\n details: `Unsupported outputFormat: ${outputFormat}. Using 'url' instead.`,\n });\n }\n\n return { requestBody, warnings } as const;\n }\n\n async doGenerate(\n options: Parameters<SpeechModelV3['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<SpeechModelV3['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const { requestBody, warnings } = await this.getArgs(options);\n\n const {\n value: json,\n responseHeaders,\n rawValue,\n } = await postJsonToApi({\n url: this.config.url({\n path: `https://fal.run/${this.modelId}`,\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n body: requestBody,\n failedResponseHandler: falFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n falSpeechResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const audioUrl = json.audio.url;\n const { value: audio } = await getFromApi({\n url: audioUrl,\n failedResponseHandler: createStatusCodeErrorResponseHandler(),\n successfulResponseHandler: createBinaryResponseHandler(),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n audio,\n warnings,\n request: {\n body: JSON.stringify(requestBody),\n },\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n body: rawValue,\n },\n };\n }\n}\n\nconst falSpeechResponseSchema = z.object({\n audio: z.object({ url: z.string() }),\n duration_ms: z.number().optional(),\n request_id: z.string().optional(),\n});\n","export type FalTranscriptionAPITypes = {\n /**\n * URL of the audio file to transcribe. Supported formats: mp3, mp4, mpeg, mpga, m4a, wav or webm.\n */\n audio_url: string;\n\n /**\n * Task to perform on the audio file. Either transcribe or translate. Default value: \"transcribe\"\n */\n task?: 'transcribe' | 'translate';\n\n /**\n * Language of the audio file. If set to null, the language will be automatically detected. Defaults to null.\n *\n * If translate is selected as the task, the audio will be translated to English, regardless of the language selected.\n */\n language?:\n | 'af'\n | 'am'\n | 'ar'\n | 'as'\n | 'az'\n | 'ba'\n | 'be'\n | 'bg'\n | 'bn'\n | 'bo'\n | 'br'\n | 'bs'\n | 'ca'\n | 'cs'\n | 'cy'\n | 'da'\n | 'de'\n | 'el'\n | 'en'\n | 'es'\n | 'et'\n | 'eu'\n | 'fa'\n | 'fi'\n | 'fo'\n | 'fr'\n | 'gl'\n | 'gu'\n | 'ha'\n | 'haw'\n | 'he'\n | 'hi'\n | 'hr'\n | 'ht'\n | 'hu'\n | 'hy'\n | 'id'\n | 'is'\n | 'it'\n | 'ja'\n | 'jw'\n | 'ka'\n | 'kk'\n | 'km'\n | 'kn'\n | 'ko'\n | 'la'\n | 'lb'\n | 'ln'\n | 'lo'\n | 'lt'\n | 'lv'\n | 'mg'\n | 'mi'\n | 'mk'\n | 'ml'\n | 'mn'\n | 'mr'\n | 'ms'\n | 'mt'\n | 'my'\n | 'ne'\n | 'nl'\n | 'nn'\n | 'no'\n | 'oc'\n | 'pa'\n | 'pl'\n | 'ps'\n | 'pt'\n | 'ro'\n | 'ru'\n | 'sa'\n | 'sd'\n | 'si'\n | 'sk'\n | 'sl'\n | 'sn'\n | 'so'\n | 'sq'\n | 'sr'\n | 'su'\n | 'sv'\n | 'sw'\n | 'ta'\n | 'te'\n | 'tg'\n | 'th'\n | 'tk'\n | 'tl'\n | 'tr'\n | 'tt'\n | 'uk'\n | 'ur'\n | 'uz'\n | 'vi'\n | 'yi'\n | 'yo'\n | 'yue'\n | 'zh'\n | null;\n\n /**\n * Whether to diarize the audio file. Defaults to true.\n */\n diarize?: boolean;\n\n /**\n * Level of the chunks to return. Either segment or word. Default value: \"segment\"\n */\n chunk_level?: 'segment' | 'word';\n\n /**\n * Version of the model to use. All of the models are the Whisper large variant. Default value: \"3\"\n */\n version?: '3';\n\n /**\n * Default value: 64\n */\n batch_size?: number;\n\n /**\n * Prompt to use for generation. Defaults to an empty string. Default value: \"\"\n */\n prompt?: string;\n\n /**\n * Number of speakers in the audio file. Defaults to null. If not provided, the number of speakers will be automatically detected.\n */\n num_speakers?: number | null;\n};\n\nexport const FAL_LANGUAGE_BOOSTS = [\n 'Chinese',\n 'Chinese,Yue',\n 'English',\n 'Arabic',\n 'Russian',\n 'Spanish',\n 'French',\n 'Portuguese',\n 'German',\n 'Turkish',\n 'Dutch',\n 'Ukrainian',\n 'Vietnamese',\n 'Indonesian',\n 'Japanese',\n 'Italian',\n 'Korean',\n 'Thai',\n 'Polish',\n 'Romanian',\n 'Greek',\n 'Czech',\n 'Finnish',\n 'Hindi',\n 'auto',\n] as const;\nexport type FalLanguageBoost = (typeof FAL_LANGUAGE_BOOSTS)[number];\n\nexport const FAL_EMOTIONS = [\n 'happy',\n 'sad',\n 'angry',\n 'fearful',\n 'disgusted',\n 'surprised',\n 'neutral',\n] as const;\nexport type FalEmotion = (typeof FAL_EMOTIONS)[number];\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["z","_a","z","combineHeaders","createJsonErrorResponseHandler","createJsonResponseHandler","getFromApi","parseProviderOptions","postJsonToApi","z","z","createJsonErrorResponseHandler","falFailedResponseHandler","z","parseProviderOptions","postJsonToApi","combineHeaders","falFailedResponseHandler","createJsonResponseHandler","getFromApi","response","body","createJsonErrorResponseHandler","_a","_b","_c","_d","combineHeaders","createBinaryResponseHandler","createJsonResponseHandler","createStatusCodeErrorResponseHandler","getFromApi","parseProviderOptions","postJsonToApi","z","z","parseProviderOptions","postJsonToApi","combineHeaders","falFailedResponseHandler","createJsonResponseHandler","getFromApi","createStatusCodeErrorResponseHandler","createBinaryResponseHandler"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/fal",
3
- "version": "2.0.0-beta.36",
3
+ "version": "2.0.0-beta.38",
4
4
  "license": "Apache-2.0",
5
5
  "sideEffects": false,
6
6
  "main": "./dist/index.js",
@@ -20,16 +20,16 @@
20
20
  }
21
21
  },
22
22
  "dependencies": {
23
- "@ai-sdk/provider": "3.0.0-beta.18",
24
- "@ai-sdk/provider-utils": "4.0.0-beta.35"
23
+ "@ai-sdk/provider": "3.0.0-beta.20",
24
+ "@ai-sdk/provider-utils": "4.0.0-beta.37"
25
25
  },
26
26
  "devDependencies": {
27
27
  "@types/node": "20.17.24",
28
28
  "tsup": "^8",
29
29
  "typescript": "5.8.3",
30
30
  "zod": "3.25.76",
31
- "@vercel/ai-tsconfig": "0.0.0",
32
- "@ai-sdk/test-server": "1.0.0-beta.1"
31
+ "@ai-sdk/test-server": "1.0.0-beta.1",
32
+ "@vercel/ai-tsconfig": "0.0.0"
33
33
  },
34
34
  "peerDependencies": {
35
35
  "zod": "^3.25.76 || ^4.1.8"