@ai-sdk/fal 2.0.9 → 2.0.11

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.
@@ -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 /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: string): never;\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 const embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'embeddingModel',\n });\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,\n textEmbeddingModel: embeddingModel,\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 combineHeaders,\n convertImageModelFileToDataUri,\n createBinaryResponseHandler,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n createStatusCodeErrorResponseHandler,\n FetchFunction,\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 files,\n mask,\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 // Handle image editing: convert files to image_url or image_urls\n if (files != null && files.length > 0) {\n const useMultipleImages = falOptions?.useMultipleImages === true;\n\n if (useMultipleImages) {\n // Use image_urls array for models that support multiple images (e.g., flux-2/edit)\n requestBody.image_urls = files.map(file =>\n convertImageModelFileToDataUri(file),\n );\n } else {\n // Use single image_url for standard image editing models\n requestBody.image_url = convertImageModelFileToDataUri(files[0]);\n\n if (files.length > 1) {\n warnings.push({\n type: 'other',\n message:\n 'Multiple input images provided but useMultipleImages is not enabled. ' +\n 'Only the first image will be used. Set providerOptions.fal.useMultipleImages ' +\n 'to true for models that support multiple images (e.g., fal-ai/flux-2/edit).',\n });\n }\n }\n }\n\n // Handle mask for inpainting\n if (mask != null) {\n requestBody.mask_url = convertImageModelFileToDataUri(mask);\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 maskUrl: 'mask_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 if (key === 'useMultipleImages') continue; // Don't send to API\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 /** @deprecated use prompt.images instead */\n imageUrl: z.string().nullish().meta({\n deprecated: true,\n description: 'Use `prompt.images` instead',\n }),\n maskUrl: z\n .string()\n .nullish()\n .meta({ deprecated: true, description: 'Use `prompt.mask` instead' }),\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 * When true, converts multiple input images to `image_urls` array instead of `image_url` string.\n */\n useMultipleImages: z.boolean().nullish(),\n\n // Deprecated snake_case versions\n image_url: z.string().nullish(),\n mask_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('mask_url', 'maskUrl');\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 if (\n data.useMultipleImages !== undefined &&\n data.useMultipleImages !== null\n ) {\n result.useMultipleImages = data.useMultipleImages;\n }\n\n for (const [key, value] of Object.entries(data)) {\n if (\n ![\n // camelCase known keys\n 'imageUrl',\n 'maskUrl',\n 'guidanceScale',\n 'numInferenceSteps',\n 'enableSafetyChecker',\n 'outputFormat',\n 'syncMode',\n 'strength',\n 'acceleration',\n 'safetyTolerance',\n 'useMultipleImages',\n // snake_case known keys\n 'image_url',\n 'mask_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"]}
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 /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: string): never;\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 const embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'embeddingModel',\n });\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,\n textEmbeddingModel: embeddingModel,\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 combineHeaders,\n convertImageModelFileToDataUri,\n createBinaryResponseHandler,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n createStatusCodeErrorResponseHandler,\n FetchFunction,\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 files,\n mask,\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 // Handle image editing: convert files to image_url or image_urls\n if (files != null && files.length > 0) {\n const useMultipleImages = falOptions?.useMultipleImages === true;\n\n if (useMultipleImages) {\n // Use image_urls array for models that support multiple images (e.g., flux-2/edit)\n requestBody.image_urls = files.map(file =>\n convertImageModelFileToDataUri(file),\n );\n } else {\n // Use single image_url for standard image editing models\n requestBody.image_url = convertImageModelFileToDataUri(files[0]);\n\n if (files.length > 1) {\n warnings.push({\n type: 'other',\n message:\n 'Multiple input images provided but useMultipleImages is not enabled. ' +\n 'Only the first image will be used. Set providerOptions.fal.useMultipleImages ' +\n 'to true for models that support multiple images (e.g., fal-ai/flux-2/edit).',\n });\n }\n }\n }\n\n // Handle mask for inpainting\n if (mask != null) {\n requestBody.mask_url = convertImageModelFileToDataUri(mask);\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 maskUrl: 'mask_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 if (key === 'useMultipleImages') continue; // Don't send to API\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 /** @deprecated use prompt.images instead */\n imageUrl: z.string().nullish().meta({\n deprecated: true,\n description: 'Use `prompt.images` instead',\n }),\n maskUrl: z\n .string()\n .nullish()\n .meta({ deprecated: true, description: 'Use `prompt.mask` instead' }),\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 * When true, converts multiple input images to `image_urls` array instead of `image_url` string.\n */\n useMultipleImages: z.boolean().nullish(),\n\n // Deprecated snake_case versions\n image_url: z.string().nullish(),\n mask_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('mask_url', 'maskUrl');\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 if (\n data.useMultipleImages !== undefined &&\n data.useMultipleImages !== null\n ) {\n result.useMultipleImages = data.useMultipleImages;\n }\n\n for (const [key, value] of Object.entries(data)) {\n if (\n ![\n // camelCase known keys\n 'imageUrl',\n 'maskUrl',\n 'guidanceScale',\n 'numInferenceSteps',\n 'enableSafetyChecker',\n 'outputFormat',\n 'syncMode',\n 'strength',\n 'acceleration',\n 'safetyTolerance',\n 'useMultipleImages',\n // snake_case known keys\n 'image_url',\n 'mask_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"]}
@@ -0,0 +1,320 @@
1
+ ---
2
+ title: Fal
3
+ description: Learn how to use Fal AI models with the AI SDK.
4
+ ---
5
+
6
+ # Fal Provider
7
+
8
+ [Fal AI](https://fal.ai/) provides a generative media platform for developers with lightning-fast inference capabilities. Their platform offers optimized performance for running diffusion models, with speeds up to 4x faster than alternatives.
9
+
10
+ ## Setup
11
+
12
+ The Fal provider is available via the `@ai-sdk/fal` module. You can install it with
13
+
14
+ <Tabs items={['pnpm', 'npm', 'yarn', 'bun']}>
15
+ <Tab>
16
+ <Snippet text="pnpm add @ai-sdk/fal" dark />
17
+ </Tab>
18
+ <Tab>
19
+ <Snippet text="npm install @ai-sdk/fal" dark />
20
+ </Tab>
21
+ <Tab>
22
+ <Snippet text="yarn add @ai-sdk/fal" dark />
23
+ </Tab>
24
+
25
+ <Tab>
26
+ <Snippet text="bun add @ai-sdk/fal" dark />
27
+ </Tab>
28
+ </Tabs>
29
+
30
+ ## Provider Instance
31
+
32
+ You can import the default provider instance `fal` from `@ai-sdk/fal`:
33
+
34
+ ```ts
35
+ import { fal } from '@ai-sdk/fal';
36
+ ```
37
+
38
+ If you need a customized setup, you can import `createFal` and create a provider instance with your settings:
39
+
40
+ ```ts
41
+ import { createFal } from '@ai-sdk/fal';
42
+
43
+ const fal = createFal({
44
+ apiKey: 'your-api-key', // optional, defaults to FAL_API_KEY environment variable, falling back to FAL_KEY
45
+ baseURL: 'custom-url', // optional
46
+ headers: {
47
+ /* custom headers */
48
+ }, // optional
49
+ });
50
+ ```
51
+
52
+ You can use the following optional settings to customize the Fal provider instance:
53
+
54
+ - **baseURL** _string_
55
+
56
+ Use a different URL prefix for API calls, e.g. to use proxy servers.
57
+ The default prefix is `https://fal.run`.
58
+
59
+ - **apiKey** _string_
60
+
61
+ API key that is being sent using the `Authorization` header.
62
+ It defaults to the `FAL_API_KEY` environment variable, falling back to `FAL_KEY`.
63
+
64
+ - **headers** _Record&lt;string,string&gt;_
65
+
66
+ Custom headers to include in the requests.
67
+
68
+ - **fetch** _(input: RequestInfo, init?: RequestInit) => Promise&lt;Response&gt;_
69
+
70
+ Custom [fetch](https://developer.mozilla.org/en-US/docs/Web/API/fetch) implementation.
71
+ You can use it as a middleware to intercept requests,
72
+ or to provide a custom fetch implementation for e.g. testing.
73
+
74
+ ## Image Models
75
+
76
+ You can create Fal image models using the `.image()` factory method.
77
+ For more on image generation with the AI SDK see [generateImage()](/docs/reference/ai-sdk-core/generate-image).
78
+
79
+ ### Basic Usage
80
+
81
+ ```ts
82
+ import { fal } from '@ai-sdk/fal';
83
+ import { generateImage } from 'ai';
84
+ import fs from 'fs';
85
+
86
+ const { image, providerMetadata } = await generateImage({
87
+ model: fal.image('fal-ai/flux/dev'),
88
+ prompt: 'A serene mountain landscape at sunset',
89
+ });
90
+
91
+ const filename = `image-${Date.now()}.png`;
92
+ fs.writeFileSync(filename, image.uint8Array);
93
+ console.log(`Image saved to ${filename}`);
94
+ ```
95
+
96
+ Fal image models may return additional information for the images and the request.
97
+
98
+ Here are some examples of properties that may be set for each image
99
+
100
+ ```js
101
+ providerMetadata.fal.images[0].nsfw; // boolean, image is not safe for work
102
+ providerMetadata.fal.images[0].width; // number, image width
103
+ providerMetadata.fal.images[0].height; // number, image height
104
+ providerMetadata.fal.images[0].content_type; // string, mime type of the image
105
+ ```
106
+
107
+ ### Model Capabilities
108
+
109
+ Fal offers many models optimized for different use cases. Here are a few popular examples. For a full list of models, see the [Fal AI Search Page](https://fal.ai/explore/search).
110
+
111
+ | Model | Description |
112
+ | ---------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
113
+ | `fal-ai/flux/dev` | FLUX.1 [dev] model for high-quality image generation |
114
+ | `fal-ai/flux-pro/kontext` | FLUX.1 Kontext [pro] handles both text and reference images as inputs, enabling targeted edits and complex transformations |
115
+ | `fal-ai/flux-pro/kontext/max` | FLUX.1 Kontext [max] with improved prompt adherence and typography generation |
116
+ | `fal-ai/flux-lora` | Super fast endpoint for FLUX.1 with LoRA support |
117
+ | `fal-ai/ideogram/character` | Generate consistent character appearances across multiple images. Maintain facial features, proportions, and distinctive traits |
118
+ | `fal-ai/qwen-image` | Qwen-Image foundation model with significant advances in complex text rendering and precise image editing |
119
+ | `fal-ai/omnigen-v2` | Unified image generation model for Image Editing, Personalized Image Generation, Virtual Try-On, Multi Person Generation and more |
120
+ | `fal-ai/bytedance/dreamina/v3.1/text-to-image` | Dreamina showcases superior picture effects with improvements in aesthetics, precise and diverse styles, and rich details |
121
+ | `fal-ai/recraft/v3/text-to-image` | SOTA in image generation with vector art and brand style capabilities |
122
+ | `fal-ai/wan/v2.2-a14b/text-to-image` | High-resolution, photorealistic images with fine-grained detail |
123
+
124
+ Fal models support the following aspect ratios:
125
+
126
+ - 1:1 (square HD)
127
+ - 16:9 (landscape)
128
+ - 9:16 (portrait)
129
+ - 4:3 (landscape)
130
+ - 3:4 (portrait)
131
+ - 16:10 (1280x800)
132
+ - 10:16 (800x1280)
133
+ - 21:9 (2560x1080)
134
+ - 9:21 (1080x2560)
135
+
136
+ Key features of Fal models include:
137
+
138
+ - Up to 4x faster inference speeds compared to alternatives
139
+ - Optimized by the Fal Inference Engine™
140
+ - Support for real-time infrastructure
141
+ - Cost-effective scaling with pay-per-use pricing
142
+ - LoRA training capabilities for model personalization
143
+
144
+ #### Modify Image
145
+
146
+ Transform existing images using text prompts.
147
+
148
+ ```ts
149
+ await generateImage({
150
+ model: fal.image('fal-ai/flux-pro/kontext/max'),
151
+ prompt: {
152
+ text: 'Put a donut next to the flour.',
153
+ images: [
154
+ 'https://v3.fal.media/files/rabbit/rmgBxhwGYb2d3pl3x9sKf_output.png',
155
+ ],
156
+ },
157
+ });
158
+ ```
159
+
160
+ Images can also be passed as base64-encoded string, a `Uint8Array`, an `ArrayBuffer`, or a `Buffer`.
161
+ A mask can be passed as well
162
+
163
+ ```ts
164
+ await generateImage({
165
+ model: fal.image('fal-ai/flux-pro/kontext/max'),
166
+ prompt: {
167
+ text: 'Put a donut next to the flour.',
168
+ images: [imageBuffer],
169
+ mask: maskBuffer,
170
+ },
171
+ });
172
+ ```
173
+
174
+ ### Provider Options
175
+
176
+ Fal image models support flexible provider options through the `providerOptions.fal` object. You can pass any parameters supported by the specific Fal model's API. Common options include:
177
+
178
+ - **imageUrl** - Reference image URL for image-to-image generation
179
+ - **strength** - Controls how much the output differs from the input image
180
+ - **guidanceScale** - Controls adherence to the prompt (range: 1-20)
181
+ - **numInferenceSteps** - Number of denoising steps (range: 1-50)
182
+ - **enableSafetyChecker** - Enable/disable safety filtering
183
+ - **outputFormat** - Output format: 'jpeg' or 'png'
184
+ - **syncMode** - Wait for completion before returning response
185
+ - **acceleration** - Speed of generation: 'none', 'regular', or 'high'
186
+ - **safetyTolerance** - Content safety filtering level (1-6, where 1 is strictest)
187
+
188
+ <Note type="warning">
189
+ **Deprecation Notice**: snake_case parameter names (e.g., `image_url`,
190
+ `guidance_scale`) are deprecated and will be removed in `@ai-sdk/fal` v2.0.
191
+ Please use camelCase names (e.g., `imageUrl`, `guidanceScale`) instead.
192
+ </Note>
193
+
194
+ Refer to the [Fal AI model documentation](https://fal.ai/models) for model-specific parameters.
195
+
196
+ ### Advanced Features
197
+
198
+ Fal's platform offers several advanced capabilities:
199
+
200
+ - **Private Model Inference**: Run your own diffusion transformer models with up to 50% faster inference
201
+ - **LoRA Training**: Train and personalize models in under 5 minutes
202
+ - **Real-time Infrastructure**: Enable new user experiences with fast inference times
203
+ - **Scalable Architecture**: Scale to thousands of GPUs when needed
204
+
205
+ For more details about Fal's capabilities and features, visit the [Fal AI documentation](https://fal.ai/docs).
206
+
207
+ ## Transcription Models
208
+
209
+ You can create models that call the [Fal transcription API](https://docs.fal.ai/guides/convert-speech-to-text)
210
+ using the `.transcription()` factory method.
211
+
212
+ The first argument is the model id without the `fal-ai/` prefix e.g. `wizper`.
213
+
214
+ ```ts
215
+ const model = fal.transcription('wizper');
216
+ ```
217
+
218
+ You can also pass additional provider-specific options using the `providerOptions` argument. For example, supplying the `batchSize` option will increase the number of audio chunks processed in parallel.
219
+
220
+ ```ts highlight="6"
221
+ import { experimental_transcribe as transcribe } from 'ai';
222
+ import { fal } from '@ai-sdk/fal';
223
+ import { readFile } from 'fs/promises';
224
+
225
+ const result = await transcribe({
226
+ model: fal.transcription('wizper'),
227
+ audio: await readFile('audio.mp3'),
228
+ providerOptions: { fal: { batchSize: 10 } },
229
+ });
230
+ ```
231
+
232
+ The following provider options are available:
233
+
234
+ - **language** _string_
235
+ Language of the audio file. If set to null, the language will be automatically detected.
236
+ Accepts ISO language codes like 'en', 'fr', 'zh', etc.
237
+ Optional.
238
+
239
+ - **diarize** _boolean_
240
+ Whether to diarize the audio file (identify different speakers).
241
+ Defaults to true.
242
+ Optional.
243
+
244
+ - **chunkLevel** _string_
245
+ Level of the chunks to return. Either 'segment' or 'word'.
246
+ Default value: "segment"
247
+ Optional.
248
+
249
+ - **version** _string_
250
+ Version of the model to use. All models are Whisper large variants.
251
+ Default value: "3"
252
+ Optional.
253
+
254
+ - **batchSize** _number_
255
+ Batch size for processing.
256
+ Default value: 64
257
+ Optional.
258
+
259
+ - **numSpeakers** _number_
260
+ Number of speakers in the audio file. If not provided, the number of speakers will be automatically detected.
261
+ Optional.
262
+
263
+ ### Model Capabilities
264
+
265
+ | Model | Transcription | Duration | Segments | Language |
266
+ | --------- | ------------------- | ------------------- | ------------------- | ------------------- |
267
+ | `whisper` | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> |
268
+ | `wizper` | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> |
269
+
270
+ ## Speech Models
271
+
272
+ You can create models that call Fal text-to-speech endpoints using the `.speech()` factory method.
273
+
274
+ ### Basic Usage
275
+
276
+ ```ts
277
+ import { experimental_generateSpeech as generateSpeech } from 'ai';
278
+ import { fal } from '@ai-sdk/fal';
279
+
280
+ const result = await generateSpeech({
281
+ model: fal.speech('fal-ai/minimax/speech-02-hd'),
282
+ text: 'Hello from the AI SDK!',
283
+ });
284
+ ```
285
+
286
+ ### Model Capabilities
287
+
288
+ | Model | Description |
289
+ | ----------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
290
+ | `fal-ai/minimax/voice-clone` | Clone a voice from a sample audio and generate speech from text prompts |
291
+ | `fal-ai/minimax/voice-design` | Design a personalized voice from a text description and generate speech from text prompts |
292
+ | `fal-ai/dia-tts/voice-clone` | Clone dialog voices from a sample audio and generate dialogs from text prompts |
293
+ | `fal-ai/minimax/speech-02-hd` | Generate speech from text prompts and different voices |
294
+ | `fal-ai/minimax/speech-02-turbo` | Generate fast speech from text prompts and different voices |
295
+ | `fal-ai/dia-tts` | Directly generates realistic dialogue from transcripts with audio conditioning for emotion control. Produces natural nonverbals like laughter and throat clearing |
296
+ | `resemble-ai/chatterboxhd/text-to-speech` | Generate expressive, natural speech with Resemble AI's Chatterbox. Features unique emotion control, instant voice cloning from short audio, and built-in watermarking |
297
+
298
+ ### Provider Options
299
+
300
+ Pass provider-specific options via `providerOptions.fal` depending on the model:
301
+
302
+ - **voice_setting** _object_
303
+
304
+ - `voice_id` (string): predefined voice ID
305
+ - `speed` (number): 0.5–2.0
306
+ - `vol` (number): 0–10
307
+ - `pitch` (number): -12–12
308
+ - `emotion` (enum): happy | sad | angry | fearful | disgusted | surprised | neutral
309
+ - `english_normalization` (boolean)
310
+
311
+ - **audio_setting** _object_
312
+ Audio configuration settings specific to the model.
313
+
314
+ - **language_boost** _enum_
315
+ Chinese | Chinese,Yue | English | Arabic | Russian | Spanish | French | Portuguese | German | Turkish | Dutch | Ukrainian | Vietnamese | Indonesian | Japanese | Italian | Korean | Thai | Polish | Romanian | Greek | Czech | Finnish | Hindi | auto
316
+
317
+ - **pronunciation_dict** _object_
318
+ Custom pronunciation dictionary for specific words.
319
+
320
+ Model-specific parameters (e.g., `audio_url`, `prompt`, `preview_text`, `ref_audio_url`, `ref_text`) can be passed directly under `providerOptions.fal` and will be forwarded to the Fal API.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/fal",
3
- "version": "2.0.9",
3
+ "version": "2.0.11",
4
4
  "license": "Apache-2.0",
5
5
  "sideEffects": false,
6
6
  "main": "./dist/index.js",
@@ -8,9 +8,14 @@
8
8
  "types": "./dist/index.d.ts",
9
9
  "files": [
10
10
  "dist/**/*",
11
+ "docs/**/*",
12
+ "src",
11
13
  "CHANGELOG.md",
12
14
  "README.md"
13
15
  ],
16
+ "directories": {
17
+ "doc": "./docs"
18
+ },
14
19
  "exports": {
15
20
  "./package.json": "./package.json",
16
21
  ".": {
@@ -28,7 +33,7 @@
28
33
  "tsup": "^8",
29
34
  "typescript": "5.8.3",
30
35
  "zod": "3.25.76",
31
- "@ai-sdk/test-server": "1.0.1",
36
+ "@ai-sdk/test-server": "1.0.2",
32
37
  "@vercel/ai-tsconfig": "0.0.0"
33
38
  },
34
39
  "peerDependencies": {
@@ -54,7 +59,7 @@
54
59
  "scripts": {
55
60
  "build": "pnpm clean && tsup --tsconfig tsconfig.build.json",
56
61
  "build:watch": "pnpm clean && tsup --watch",
57
- "clean": "del-cli dist *.tsbuildinfo",
62
+ "clean": "del-cli dist docs *.tsbuildinfo",
58
63
  "lint": "eslint \"./**/*.ts*\"",
59
64
  "type-check": "tsc --build",
60
65
  "prettier-check": "prettier --check \"./**/*.ts*\"",