@ai-sdk/fal 2.0.35 → 2.0.37

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,26 @@
1
1
  # @ai-sdk/fal
2
2
 
3
+ ## 2.0.37
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [779f5cd]
8
+ - @ai-sdk/provider-utils@4.0.30
9
+
10
+ ## 2.0.36
11
+
12
+ ### Patch Changes
13
+
14
+ - bfa5864: fix: only send provider credentials to same-origin response-supplied URLs
15
+
16
+ Several provider clients followed a URL taken from the provider's API response (a polling/status URL or a final media URL such as `polling_url`, `urls.get`, `result_url`, `result.sample`, or `video.uri`) and reused the authenticated headers — or appended `?key=<API_KEY>` — on that request. Because the host of the response-supplied URL was never validated, the long-lived API key was sent to whatever host the response named (a CDN in the benign case, or an attacker-chosen host if the provider response was tampered with), allowing credential exfiltration.
17
+
18
+ A new `isSameOrigin` helper is added to `@ai-sdk/provider-utils`, and the affected fetches in `@ai-sdk/black-forest-labs`, `@ai-sdk/fireworks`, `@ai-sdk/replicate`, `@ai-sdk/gladia`, `@ai-sdk/fal`, and `@ai-sdk/google` now attach credentials only when the followed URL is same-origin with the provider's configured API origin. Requests to a foreign origin are made without the credential.
19
+
20
+ - Updated dependencies [bfa5864]
21
+ - Updated dependencies [f42aa79]
22
+ - @ai-sdk/provider-utils@4.0.29
23
+
3
24
  ## 2.0.35
4
25
 
5
26
  ### Patch Changes
package/dist/index.js CHANGED
@@ -859,11 +859,12 @@ var FalVideoModel = class {
859
859
  }
860
860
  }
861
861
  }
862
+ const submitUrl = this.config.url({
863
+ path: `https://queue.fal.run/fal-ai/${this.normalizedModelId}`,
864
+ modelId: this.modelId
865
+ });
862
866
  const { value: queueResponse } = await (0, import_provider_utils6.postJsonToApi)({
863
- url: this.config.url({
864
- path: `https://queue.fal.run/fal-ai/${this.normalizedModelId}`,
865
- modelId: this.modelId
866
- }),
867
+ url: submitUrl,
867
868
  headers: (0, import_provider_utils6.combineHeaders)(this.config.headers(), options.headers),
868
869
  body,
869
870
  failedResponseHandler: falFailedResponseHandler2,
@@ -885,12 +886,15 @@ var FalVideoModel = class {
885
886
  let responseHeaders;
886
887
  while (true) {
887
888
  try {
889
+ const statusUrl = this.config.url({
890
+ path: responseUrl,
891
+ modelId: this.modelId
892
+ });
888
893
  const { value: statusResponse, responseHeaders: statusHeaders } = await (0, import_provider_utils6.getFromApi)({
889
- url: this.config.url({
890
- path: responseUrl,
891
- modelId: this.modelId
892
- }),
893
- headers: (0, import_provider_utils6.combineHeaders)(this.config.headers(), options.headers),
894
+ url: statusUrl,
895
+ // The status URL comes from the queue response; only send
896
+ // credentials when it stays on the provider's own origin.
897
+ headers: (0, import_provider_utils6.isSameOrigin)(statusUrl, submitUrl) ? (0, import_provider_utils6.combineHeaders)(this.config.headers(), options.headers) : void 0,
894
898
  failedResponseHandler: async ({
895
899
  response: response2,
896
900
  url,
@@ -1002,7 +1006,7 @@ var falVideoResponseSchema = import_v46.z.object({
1002
1006
  });
1003
1007
 
1004
1008
  // src/version.ts
1005
- var VERSION = true ? "2.0.35" : "0.0.0-test";
1009
+ var VERSION = true ? "2.0.37" : "0.0.0-test";
1006
1010
 
1007
1011
  // src/fal-provider.ts
1008
1012
  var defaultBaseURL = "https://fal.run";
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/fal-video-model.ts","../src/version.ts"],"sourcesContent":["export type { FalProvider, FalProviderSettings } from './fal-provider';\nexport { createFal, fal } from './fal-provider';\nexport type {\n FalImageModelOptions,\n /** @deprecated Use `FalImageModelOptions` instead. */\n FalImageModelOptions as FalImageProviderOptions,\n} from './fal-image-options';\nexport type { FalSpeechModelOptions } from './fal-speech-model';\nexport type { FalTranscriptionModelOptions } from './fal-transcription-model';\nexport type {\n FalVideoModelOptions,\n /** @deprecated Use `FalVideoModelOptions` instead. */\n FalVideoModelOptions as FalVideoProviderOptions,\n} from './fal-video-model';\nexport type { FalVideoModelId } from './fal-video-settings';\nexport { VERSION } from './version';\n","import {\n NoSuchModelError,\n type Experimental_VideoModelV3,\n type ImageModelV3,\n type ProviderV3,\n type SpeechModelV3,\n type TranscriptionModelV3,\n} from '@ai-sdk/provider';\nimport {\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { FalImageModel } from './fal-image-model';\nimport type { FalImageModelId } from './fal-image-settings';\nimport type { FalTranscriptionModelId } from './fal-transcription-options';\nimport { FalTranscriptionModel } from './fal-transcription-model';\nimport type { FalSpeechModelId } from './fal-speech-settings';\nimport { FalSpeechModel } from './fal-speech-model';\nimport { FalVideoModel } from './fal-video-model';\nimport type { FalVideoModelId } from './fal-video-settings';\nimport { VERSION } from './version';\n\nexport interface FalProviderSettings {\n /**\n * fal.ai API key. Default value is taken from the `FAL_API_KEY` environment\n * variable, falling back to `FAL_KEY`.\n */\n apiKey?: string;\n\n /**\n * Base URL for the API calls.\n * The default prefix is `https://fal.run`.\n */\n baseURL?: string;\n\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept\n * requests, or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport interface FalProvider extends ProviderV3 {\n /**\n * Creates a model for image generation.\n */\n image(modelId: FalImageModelId): ImageModelV3;\n\n /**\n * Creates a model for image generation.\n */\n imageModel(modelId: FalImageModelId): ImageModelV3;\n\n /**\n * Creates a model for transcription.\n */\n transcription(modelId: FalTranscriptionModelId): TranscriptionModelV3;\n\n /**\n * Creates a model for video generation.\n */\n video(modelId: FalVideoModelId): Experimental_VideoModelV3;\n\n /**\n * Creates a model for video generation.\n */\n videoModel(modelId: FalVideoModelId): Experimental_VideoModelV3;\n\n /**\n * Creates 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/**\n * Create 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 createVideoModel = (modelId: FalVideoModelId) =>\n new FalVideoModel(modelId, {\n provider: 'fal.video',\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 video: createVideoModel,\n videoModel: createVideoModel,\n };\n}\n\n/**\n * Default fal.ai provider instance.\n */\nexport const fal = createFal();\n","import type { ImageModelV3, SharedV3Warning } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertImageModelFileToDataUri,\n createBinaryResponseHandler,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n createStatusCodeErrorResponseHandler,\n getFromApi,\n parseProviderOptions,\n postJsonToApi,\n resolve,\n type Resolvable,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport type { FalImageModelId, FalImageSize } from './fal-image-settings';\nimport { falImageModelOptionsSchema } 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: falImageModelOptionsSchema,\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/**\n * Converts 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 {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport const falImageModelOptionsSchema = 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 FalImageModelOptions = InferSchema<\n typeof falImageModelOptionsSchema\n>;\n","import {\n AISDKError,\n type TranscriptionModelV3,\n type 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 type { FalConfig } from './fal-config';\nimport { falErrorDataSchema, falFailedResponseHandler } from './fal-error';\nimport type { FalTranscriptionModelId } from './fal-transcription-options';\nimport type { FalTranscriptionAPITypes } from './fal-api-types';\n\n// https://fal.ai/models/fal-ai/whisper/api?platform=http\nconst falTranscriptionModelOptionsSchema = 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 FalTranscriptionModelOptions = z.infer<\n typeof falTranscriptionModelOptionsSchema\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: falTranscriptionModelOptionsSchema,\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 type { 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 type { FalConfig } from './fal-config';\nimport { falFailedResponseHandler } from './fal-error';\nimport { FAL_EMOTIONS, FAL_LANGUAGE_BOOSTS } from './fal-api-types';\nimport type { FalSpeechModelId } from './fal-speech-settings';\n\nconst falSpeechModelOptionsSchema = 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 FalSpeechModelOptions = z.infer<typeof falSpeechModelOptionsSchema>;\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: falSpeechModelOptionsSchema,\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","import {\n AISDKError,\n type Experimental_VideoModelV3,\n type SharedV3Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertImageModelFileToDataUri,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n delay,\n getFromApi,\n lazySchema,\n parseProviderOptions,\n postJsonToApi,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport type { FalConfig } from './fal-config';\nimport { falErrorDataSchema, falFailedResponseHandler } from './fal-error';\nimport type { FalVideoModelId } from './fal-video-settings';\n\nexport type FalVideoModelOptions = {\n loop?: boolean | null;\n motionStrength?: number | null;\n pollIntervalMs?: number | null;\n pollTimeoutMs?: number | null;\n resolution?: string | null;\n negativePrompt?: string | null;\n promptOptimizer?: boolean | null;\n [key: string]: unknown; // For passthrough\n};\n\n// Provider options schema for FAL video generation\nexport const falVideoModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z\n .object({\n // Video loop - only for Luma models\n loop: z.boolean().nullish(),\n\n // Motion strength (provider-specific)\n motionStrength: z.number().min(0).max(1).nullish(),\n\n // Polling configuration\n pollIntervalMs: z.number().positive().nullish(),\n pollTimeoutMs: z.number().positive().nullish(),\n\n // Resolution (model-specific, e.g., '480p', '720p', '1080p')\n resolution: z.string().nullish(),\n\n // Model-specific parameters\n negativePrompt: z.string().nullish(),\n promptOptimizer: z.boolean().nullish(),\n })\n .passthrough(),\n ),\n);\n\ninterface FalVideoModelConfig extends FalConfig {\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class FalVideoModel implements Experimental_VideoModelV3 {\n readonly specificationVersion = 'v3';\n readonly maxVideosPerCall = 1; // FAL video models support 1 video at a time\n\n get provider(): string {\n return this.config.provider;\n }\n\n private get normalizedModelId(): string {\n return this.modelId.replace(/^fal-ai\\//, '').replace(/^fal\\//, '');\n }\n\n constructor(\n readonly modelId: FalVideoModelId,\n private readonly config: FalVideoModelConfig,\n ) {}\n\n async doGenerate(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<Experimental_VideoModelV3['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const warnings: SharedV3Warning[] = [];\n\n const falOptions = (await parseProviderOptions({\n provider: 'fal',\n providerOptions: options.providerOptions,\n schema: falVideoModelOptionsSchema,\n })) as FalVideoModelOptions | undefined;\n\n const body: Record<string, unknown> = {};\n\n if (options.prompt != null) {\n body.prompt = options.prompt;\n }\n\n if (options.image != null) {\n if (options.image.type === 'url') {\n body.image_url = options.image.url;\n } else {\n body.image_url = convertImageModelFileToDataUri(options.image);\n }\n }\n\n if (options.aspectRatio) {\n body.aspect_ratio = options.aspectRatio;\n }\n\n if (options.duration) {\n body.duration = `${options.duration}s`;\n }\n\n if (options.seed) {\n body.seed = options.seed;\n }\n\n if (falOptions != null) {\n const opts = falOptions;\n if (opts.loop !== undefined && opts.loop !== null) {\n body.loop = opts.loop;\n }\n if (opts.motionStrength !== undefined && opts.motionStrength !== null) {\n body.motion_strength = opts.motionStrength;\n }\n if (opts.resolution !== undefined && opts.resolution !== null) {\n body.resolution = opts.resolution;\n }\n if (opts.negativePrompt !== undefined && opts.negativePrompt !== null) {\n body.negative_prompt = opts.negativePrompt;\n }\n if (opts.promptOptimizer !== undefined && opts.promptOptimizer !== null) {\n body.prompt_optimizer = opts.promptOptimizer;\n }\n\n for (const [key, value] of Object.entries(opts)) {\n if (\n ![\n 'loop',\n 'motionStrength',\n 'pollIntervalMs',\n 'pollTimeoutMs',\n 'resolution',\n 'negativePrompt',\n 'promptOptimizer',\n ].includes(key)\n ) {\n body[key] = value;\n }\n }\n }\n\n const { value: queueResponse } = await postJsonToApi({\n url: this.config.url({\n path: `https://queue.fal.run/fal-ai/${this.normalizedModelId}`,\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n body,\n failedResponseHandler: falFailedResponseHandler,\n successfulResponseHandler:\n createJsonResponseHandler(falJobResponseSchema),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const responseUrl = queueResponse.response_url;\n if (!responseUrl) {\n throw new AISDKError({\n name: 'FAL_VIDEO_GENERATION_ERROR',\n message: 'No response URL returned from queue endpoint',\n });\n }\n\n const pollIntervalMs = falOptions?.pollIntervalMs ?? 2000; // 2 seconds\n const pollTimeoutMs = falOptions?.pollTimeoutMs ?? 300000; // 5 minutes\n const startTime = Date.now();\n let response: FalVideoResponse;\n let responseHeaders: Record<string, string> | undefined;\n\n while (true) {\n try {\n const { value: statusResponse, responseHeaders: statusHeaders } =\n await getFromApi({\n url: this.config.url({\n path: responseUrl,\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n failedResponseHandler: async ({\n response,\n url,\n requestBodyValues,\n }) => {\n const body = await response.clone().json();\n\n if (body.detail === 'Request is still in progress') {\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 })({ response, url, requestBodyValues });\n },\n successfulResponseHandler: createJsonResponseHandler(\n falVideoResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n response = statusResponse;\n responseHeaders = statusHeaders;\n break;\n } catch (error) {\n if (\n error instanceof Error &&\n error.message === 'Request is still in progress'\n ) {\n // Continue polling\n } else {\n throw error;\n }\n }\n\n if (Date.now() - startTime > pollTimeoutMs) {\n throw new AISDKError({\n name: 'FAL_VIDEO_GENERATION_TIMEOUT',\n message: `Video generation request timed out after ${pollTimeoutMs}ms`,\n });\n }\n\n await delay(pollIntervalMs);\n\n if (options.abortSignal?.aborted) {\n throw new AISDKError({\n name: 'FAL_VIDEO_GENERATION_ABORTED',\n message: 'Video generation request was aborted',\n });\n }\n }\n\n const videoUrl = response.video?.url;\n\n if (!videoUrl || !response.video) {\n throw new AISDKError({\n name: 'FAL_VIDEO_GENERATION_ERROR',\n message: 'No video URL in response',\n });\n }\n\n return {\n videos: [\n {\n type: 'url',\n url: videoUrl,\n mediaType: response.video.content_type || 'video/mp4',\n },\n ],\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n providerMetadata: {\n fal: {\n videos: [\n {\n url: videoUrl,\n width: response.video.width,\n height: response.video.height,\n duration: response.video.duration,\n fps: response.video.fps,\n contentType: response.video.content_type,\n },\n ],\n ...(response.seed !== undefined ? { seed: response.seed } : {}),\n ...(response.timings ? { timings: response.timings } : {}),\n ...(response.has_nsfw_concepts !== undefined\n ? { has_nsfw_concepts: response.has_nsfw_concepts }\n : {}),\n ...(response.prompt ? { prompt: response.prompt } : {}),\n },\n },\n };\n }\n}\n\nconst falJobResponseSchema = z.object({\n request_id: z.string().nullish(),\n response_url: z.string().nullish(),\n});\n\nconst falVideoResponseSchema = z.object({\n video: z\n .object({\n url: z.string(),\n width: z.number().nullish(),\n height: z.number().nullish(),\n duration: z.number().nullish(),\n fps: z.number().nullish(),\n content_type: z.string().nullish(),\n })\n .nullish(),\n seed: z.number().nullish(),\n timings: z\n .object({\n inference: z.number().nullish(),\n })\n .nullish(),\n has_nsfw_concepts: z.array(z.boolean()).nullish(),\n prompt: z.string().nullish(),\n});\n\ntype FalVideoResponse = z.infer<typeof falVideoResponseSchema>;\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","import_provider","import_provider_utils","import_v4","falFailedResponseHandler","falJobResponseSchema","response","body"]}
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/fal-video-model.ts","../src/version.ts"],"sourcesContent":["export type { FalProvider, FalProviderSettings } from './fal-provider';\nexport { createFal, fal } from './fal-provider';\nexport type {\n FalImageModelOptions,\n /** @deprecated Use `FalImageModelOptions` instead. */\n FalImageModelOptions as FalImageProviderOptions,\n} from './fal-image-options';\nexport type { FalSpeechModelOptions } from './fal-speech-model';\nexport type { FalTranscriptionModelOptions } from './fal-transcription-model';\nexport type {\n FalVideoModelOptions,\n /** @deprecated Use `FalVideoModelOptions` instead. */\n FalVideoModelOptions as FalVideoProviderOptions,\n} from './fal-video-model';\nexport type { FalVideoModelId } from './fal-video-settings';\nexport { VERSION } from './version';\n","import {\n NoSuchModelError,\n type Experimental_VideoModelV3,\n type ImageModelV3,\n type ProviderV3,\n type SpeechModelV3,\n type TranscriptionModelV3,\n} from '@ai-sdk/provider';\nimport {\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { FalImageModel } from './fal-image-model';\nimport type { FalImageModelId } from './fal-image-settings';\nimport type { FalTranscriptionModelId } from './fal-transcription-options';\nimport { FalTranscriptionModel } from './fal-transcription-model';\nimport type { FalSpeechModelId } from './fal-speech-settings';\nimport { FalSpeechModel } from './fal-speech-model';\nimport { FalVideoModel } from './fal-video-model';\nimport type { FalVideoModelId } from './fal-video-settings';\nimport { VERSION } from './version';\n\nexport interface FalProviderSettings {\n /**\n * fal.ai API key. Default value is taken from the `FAL_API_KEY` environment\n * variable, falling back to `FAL_KEY`.\n */\n apiKey?: string;\n\n /**\n * Base URL for the API calls.\n * The default prefix is `https://fal.run`.\n */\n baseURL?: string;\n\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept\n * requests, or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport interface FalProvider extends ProviderV3 {\n /**\n * Creates a model for image generation.\n */\n image(modelId: FalImageModelId): ImageModelV3;\n\n /**\n * Creates a model for image generation.\n */\n imageModel(modelId: FalImageModelId): ImageModelV3;\n\n /**\n * Creates a model for transcription.\n */\n transcription(modelId: FalTranscriptionModelId): TranscriptionModelV3;\n\n /**\n * Creates a model for video generation.\n */\n video(modelId: FalVideoModelId): Experimental_VideoModelV3;\n\n /**\n * Creates a model for video generation.\n */\n videoModel(modelId: FalVideoModelId): Experimental_VideoModelV3;\n\n /**\n * Creates 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/**\n * Create 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 createVideoModel = (modelId: FalVideoModelId) =>\n new FalVideoModel(modelId, {\n provider: 'fal.video',\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 video: createVideoModel,\n videoModel: createVideoModel,\n };\n}\n\n/**\n * Default fal.ai provider instance.\n */\nexport const fal = createFal();\n","import type { ImageModelV3, SharedV3Warning } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertImageModelFileToDataUri,\n createBinaryResponseHandler,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n createStatusCodeErrorResponseHandler,\n getFromApi,\n parseProviderOptions,\n postJsonToApi,\n resolve,\n type Resolvable,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport type { FalImageModelId, FalImageSize } from './fal-image-settings';\nimport { falImageModelOptionsSchema } 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: falImageModelOptionsSchema,\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/**\n * Converts 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 {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport const falImageModelOptionsSchema = 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 FalImageModelOptions = InferSchema<\n typeof falImageModelOptionsSchema\n>;\n","import {\n AISDKError,\n type TranscriptionModelV3,\n type 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 type { FalConfig } from './fal-config';\nimport { falErrorDataSchema, falFailedResponseHandler } from './fal-error';\nimport type { FalTranscriptionModelId } from './fal-transcription-options';\nimport type { FalTranscriptionAPITypes } from './fal-api-types';\n\n// https://fal.ai/models/fal-ai/whisper/api?platform=http\nconst falTranscriptionModelOptionsSchema = 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 FalTranscriptionModelOptions = z.infer<\n typeof falTranscriptionModelOptionsSchema\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: falTranscriptionModelOptionsSchema,\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 type { 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 type { FalConfig } from './fal-config';\nimport { falFailedResponseHandler } from './fal-error';\nimport { FAL_EMOTIONS, FAL_LANGUAGE_BOOSTS } from './fal-api-types';\nimport type { FalSpeechModelId } from './fal-speech-settings';\n\nconst falSpeechModelOptionsSchema = 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 FalSpeechModelOptions = z.infer<typeof falSpeechModelOptionsSchema>;\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: falSpeechModelOptionsSchema,\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","import {\n AISDKError,\n type Experimental_VideoModelV3,\n type SharedV3Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertImageModelFileToDataUri,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n delay,\n getFromApi,\n isSameOrigin,\n lazySchema,\n parseProviderOptions,\n postJsonToApi,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport type { FalConfig } from './fal-config';\nimport { falErrorDataSchema, falFailedResponseHandler } from './fal-error';\nimport type { FalVideoModelId } from './fal-video-settings';\n\nexport type FalVideoModelOptions = {\n loop?: boolean | null;\n motionStrength?: number | null;\n pollIntervalMs?: number | null;\n pollTimeoutMs?: number | null;\n resolution?: string | null;\n negativePrompt?: string | null;\n promptOptimizer?: boolean | null;\n [key: string]: unknown; // For passthrough\n};\n\n// Provider options schema for FAL video generation\nexport const falVideoModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z\n .object({\n // Video loop - only for Luma models\n loop: z.boolean().nullish(),\n\n // Motion strength (provider-specific)\n motionStrength: z.number().min(0).max(1).nullish(),\n\n // Polling configuration\n pollIntervalMs: z.number().positive().nullish(),\n pollTimeoutMs: z.number().positive().nullish(),\n\n // Resolution (model-specific, e.g., '480p', '720p', '1080p')\n resolution: z.string().nullish(),\n\n // Model-specific parameters\n negativePrompt: z.string().nullish(),\n promptOptimizer: z.boolean().nullish(),\n })\n .passthrough(),\n ),\n);\n\ninterface FalVideoModelConfig extends FalConfig {\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class FalVideoModel implements Experimental_VideoModelV3 {\n readonly specificationVersion = 'v3';\n readonly maxVideosPerCall = 1; // FAL video models support 1 video at a time\n\n get provider(): string {\n return this.config.provider;\n }\n\n private get normalizedModelId(): string {\n return this.modelId.replace(/^fal-ai\\//, '').replace(/^fal\\//, '');\n }\n\n constructor(\n readonly modelId: FalVideoModelId,\n private readonly config: FalVideoModelConfig,\n ) {}\n\n async doGenerate(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<Experimental_VideoModelV3['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const warnings: SharedV3Warning[] = [];\n\n const falOptions = (await parseProviderOptions({\n provider: 'fal',\n providerOptions: options.providerOptions,\n schema: falVideoModelOptionsSchema,\n })) as FalVideoModelOptions | undefined;\n\n const body: Record<string, unknown> = {};\n\n if (options.prompt != null) {\n body.prompt = options.prompt;\n }\n\n if (options.image != null) {\n if (options.image.type === 'url') {\n body.image_url = options.image.url;\n } else {\n body.image_url = convertImageModelFileToDataUri(options.image);\n }\n }\n\n if (options.aspectRatio) {\n body.aspect_ratio = options.aspectRatio;\n }\n\n if (options.duration) {\n body.duration = `${options.duration}s`;\n }\n\n if (options.seed) {\n body.seed = options.seed;\n }\n\n if (falOptions != null) {\n const opts = falOptions;\n if (opts.loop !== undefined && opts.loop !== null) {\n body.loop = opts.loop;\n }\n if (opts.motionStrength !== undefined && opts.motionStrength !== null) {\n body.motion_strength = opts.motionStrength;\n }\n if (opts.resolution !== undefined && opts.resolution !== null) {\n body.resolution = opts.resolution;\n }\n if (opts.negativePrompt !== undefined && opts.negativePrompt !== null) {\n body.negative_prompt = opts.negativePrompt;\n }\n if (opts.promptOptimizer !== undefined && opts.promptOptimizer !== null) {\n body.prompt_optimizer = opts.promptOptimizer;\n }\n\n for (const [key, value] of Object.entries(opts)) {\n if (\n ![\n 'loop',\n 'motionStrength',\n 'pollIntervalMs',\n 'pollTimeoutMs',\n 'resolution',\n 'negativePrompt',\n 'promptOptimizer',\n ].includes(key)\n ) {\n body[key] = value;\n }\n }\n }\n\n const submitUrl = this.config.url({\n path: `https://queue.fal.run/fal-ai/${this.normalizedModelId}`,\n modelId: this.modelId,\n });\n const { value: queueResponse } = await postJsonToApi({\n url: submitUrl,\n headers: combineHeaders(this.config.headers(), options.headers),\n body,\n failedResponseHandler: falFailedResponseHandler,\n successfulResponseHandler:\n createJsonResponseHandler(falJobResponseSchema),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const responseUrl = queueResponse.response_url;\n if (!responseUrl) {\n throw new AISDKError({\n name: 'FAL_VIDEO_GENERATION_ERROR',\n message: 'No response URL returned from queue endpoint',\n });\n }\n\n const pollIntervalMs = falOptions?.pollIntervalMs ?? 2000; // 2 seconds\n const pollTimeoutMs = falOptions?.pollTimeoutMs ?? 300000; // 5 minutes\n const startTime = Date.now();\n let response: FalVideoResponse;\n let responseHeaders: Record<string, string> | undefined;\n\n while (true) {\n try {\n const statusUrl = this.config.url({\n path: responseUrl,\n modelId: this.modelId,\n });\n const { value: statusResponse, responseHeaders: statusHeaders } =\n await getFromApi({\n url: statusUrl,\n // The status URL comes from the queue response; only send\n // credentials when it stays on the provider's own origin.\n headers: isSameOrigin(statusUrl, submitUrl)\n ? combineHeaders(this.config.headers(), options.headers)\n : undefined,\n failedResponseHandler: async ({\n response,\n url,\n requestBodyValues,\n }) => {\n const body = await response.clone().json();\n\n if (body.detail === 'Request is still in progress') {\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 })({ response, url, requestBodyValues });\n },\n successfulResponseHandler: createJsonResponseHandler(\n falVideoResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n response = statusResponse;\n responseHeaders = statusHeaders;\n break;\n } catch (error) {\n if (\n error instanceof Error &&\n error.message === 'Request is still in progress'\n ) {\n // Continue polling\n } else {\n throw error;\n }\n }\n\n if (Date.now() - startTime > pollTimeoutMs) {\n throw new AISDKError({\n name: 'FAL_VIDEO_GENERATION_TIMEOUT',\n message: `Video generation request timed out after ${pollTimeoutMs}ms`,\n });\n }\n\n await delay(pollIntervalMs);\n\n if (options.abortSignal?.aborted) {\n throw new AISDKError({\n name: 'FAL_VIDEO_GENERATION_ABORTED',\n message: 'Video generation request was aborted',\n });\n }\n }\n\n const videoUrl = response.video?.url;\n\n if (!videoUrl || !response.video) {\n throw new AISDKError({\n name: 'FAL_VIDEO_GENERATION_ERROR',\n message: 'No video URL in response',\n });\n }\n\n return {\n videos: [\n {\n type: 'url',\n url: videoUrl,\n mediaType: response.video.content_type || 'video/mp4',\n },\n ],\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n providerMetadata: {\n fal: {\n videos: [\n {\n url: videoUrl,\n width: response.video.width,\n height: response.video.height,\n duration: response.video.duration,\n fps: response.video.fps,\n contentType: response.video.content_type,\n },\n ],\n ...(response.seed !== undefined ? { seed: response.seed } : {}),\n ...(response.timings ? { timings: response.timings } : {}),\n ...(response.has_nsfw_concepts !== undefined\n ? { has_nsfw_concepts: response.has_nsfw_concepts }\n : {}),\n ...(response.prompt ? { prompt: response.prompt } : {}),\n },\n },\n };\n }\n}\n\nconst falJobResponseSchema = z.object({\n request_id: z.string().nullish(),\n response_url: z.string().nullish(),\n});\n\nconst falVideoResponseSchema = z.object({\n video: z\n .object({\n url: z.string(),\n width: z.number().nullish(),\n height: z.number().nullish(),\n duration: z.number().nullish(),\n fps: z.number().nullish(),\n content_type: z.string().nullish(),\n })\n .nullish(),\n seed: z.number().nullish(),\n timings: z\n .object({\n inference: z.number().nullish(),\n })\n .nullish(),\n has_nsfw_concepts: z.array(z.boolean()).nullish(),\n prompt: z.string().nullish(),\n});\n\ntype FalVideoResponse = z.infer<typeof falVideoResponseSchema>;\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","import_provider","import_provider_utils","import_v4","falFailedResponseHandler","falJobResponseSchema","response","body"]}
package/dist/index.mjs CHANGED
@@ -784,6 +784,7 @@ import {
784
784
  createJsonResponseHandler as createJsonResponseHandler4,
785
785
  delay as delay2,
786
786
  getFromApi as getFromApi4,
787
+ isSameOrigin,
787
788
  lazySchema as lazySchema2,
788
789
  parseProviderOptions as parseProviderOptions4,
789
790
  postJsonToApi as postJsonToApi4,
@@ -882,11 +883,12 @@ var FalVideoModel = class {
882
883
  }
883
884
  }
884
885
  }
886
+ const submitUrl = this.config.url({
887
+ path: `https://queue.fal.run/fal-ai/${this.normalizedModelId}`,
888
+ modelId: this.modelId
889
+ });
885
890
  const { value: queueResponse } = await postJsonToApi4({
886
- url: this.config.url({
887
- path: `https://queue.fal.run/fal-ai/${this.normalizedModelId}`,
888
- modelId: this.modelId
889
- }),
891
+ url: submitUrl,
890
892
  headers: combineHeaders4(this.config.headers(), options.headers),
891
893
  body,
892
894
  failedResponseHandler: falFailedResponseHandler2,
@@ -908,12 +910,15 @@ var FalVideoModel = class {
908
910
  let responseHeaders;
909
911
  while (true) {
910
912
  try {
913
+ const statusUrl = this.config.url({
914
+ path: responseUrl,
915
+ modelId: this.modelId
916
+ });
911
917
  const { value: statusResponse, responseHeaders: statusHeaders } = await getFromApi4({
912
- url: this.config.url({
913
- path: responseUrl,
914
- modelId: this.modelId
915
- }),
916
- headers: combineHeaders4(this.config.headers(), options.headers),
918
+ url: statusUrl,
919
+ // The status URL comes from the queue response; only send
920
+ // credentials when it stays on the provider's own origin.
921
+ headers: isSameOrigin(statusUrl, submitUrl) ? combineHeaders4(this.config.headers(), options.headers) : void 0,
917
922
  failedResponseHandler: async ({
918
923
  response: response2,
919
924
  url,
@@ -1025,7 +1030,7 @@ var falVideoResponseSchema = z6.object({
1025
1030
  });
1026
1031
 
1027
1032
  // src/version.ts
1028
- var VERSION = true ? "2.0.35" : "0.0.0-test";
1033
+ var VERSION = true ? "2.0.37" : "0.0.0-test";
1029
1034
 
1030
1035
  // src/fal-provider.ts
1031
1036
  var defaultBaseURL = "https://fal.run";
@@ -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/fal-video-model.ts","../src/version.ts"],"sourcesContent":["import {\n NoSuchModelError,\n type Experimental_VideoModelV3,\n type ImageModelV3,\n type ProviderV3,\n type SpeechModelV3,\n type TranscriptionModelV3,\n} from '@ai-sdk/provider';\nimport {\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { FalImageModel } from './fal-image-model';\nimport type { FalImageModelId } from './fal-image-settings';\nimport type { FalTranscriptionModelId } from './fal-transcription-options';\nimport { FalTranscriptionModel } from './fal-transcription-model';\nimport type { FalSpeechModelId } from './fal-speech-settings';\nimport { FalSpeechModel } from './fal-speech-model';\nimport { FalVideoModel } from './fal-video-model';\nimport type { FalVideoModelId } from './fal-video-settings';\nimport { VERSION } from './version';\n\nexport interface FalProviderSettings {\n /**\n * fal.ai API key. Default value is taken from the `FAL_API_KEY` environment\n * variable, falling back to `FAL_KEY`.\n */\n apiKey?: string;\n\n /**\n * Base URL for the API calls.\n * The default prefix is `https://fal.run`.\n */\n baseURL?: string;\n\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept\n * requests, or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport interface FalProvider extends ProviderV3 {\n /**\n * Creates a model for image generation.\n */\n image(modelId: FalImageModelId): ImageModelV3;\n\n /**\n * Creates a model for image generation.\n */\n imageModel(modelId: FalImageModelId): ImageModelV3;\n\n /**\n * Creates a model for transcription.\n */\n transcription(modelId: FalTranscriptionModelId): TranscriptionModelV3;\n\n /**\n * Creates a model for video generation.\n */\n video(modelId: FalVideoModelId): Experimental_VideoModelV3;\n\n /**\n * Creates a model for video generation.\n */\n videoModel(modelId: FalVideoModelId): Experimental_VideoModelV3;\n\n /**\n * Creates 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/**\n * Create 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 createVideoModel = (modelId: FalVideoModelId) =>\n new FalVideoModel(modelId, {\n provider: 'fal.video',\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 video: createVideoModel,\n videoModel: createVideoModel,\n };\n}\n\n/**\n * Default fal.ai provider instance.\n */\nexport const fal = createFal();\n","import type { ImageModelV3, SharedV3Warning } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertImageModelFileToDataUri,\n createBinaryResponseHandler,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n createStatusCodeErrorResponseHandler,\n getFromApi,\n parseProviderOptions,\n postJsonToApi,\n resolve,\n type Resolvable,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport type { FalImageModelId, FalImageSize } from './fal-image-settings';\nimport { falImageModelOptionsSchema } 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: falImageModelOptionsSchema,\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/**\n * Converts 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 {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport const falImageModelOptionsSchema = 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 FalImageModelOptions = InferSchema<\n typeof falImageModelOptionsSchema\n>;\n","import {\n AISDKError,\n type TranscriptionModelV3,\n type 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 type { FalConfig } from './fal-config';\nimport { falErrorDataSchema, falFailedResponseHandler } from './fal-error';\nimport type { FalTranscriptionModelId } from './fal-transcription-options';\nimport type { FalTranscriptionAPITypes } from './fal-api-types';\n\n// https://fal.ai/models/fal-ai/whisper/api?platform=http\nconst falTranscriptionModelOptionsSchema = 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 FalTranscriptionModelOptions = z.infer<\n typeof falTranscriptionModelOptionsSchema\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: falTranscriptionModelOptionsSchema,\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 type { 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 type { FalConfig } from './fal-config';\nimport { falFailedResponseHandler } from './fal-error';\nimport { FAL_EMOTIONS, FAL_LANGUAGE_BOOSTS } from './fal-api-types';\nimport type { FalSpeechModelId } from './fal-speech-settings';\n\nconst falSpeechModelOptionsSchema = 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 FalSpeechModelOptions = z.infer<typeof falSpeechModelOptionsSchema>;\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: falSpeechModelOptionsSchema,\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","import {\n AISDKError,\n type Experimental_VideoModelV3,\n type SharedV3Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertImageModelFileToDataUri,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n delay,\n getFromApi,\n lazySchema,\n parseProviderOptions,\n postJsonToApi,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport type { FalConfig } from './fal-config';\nimport { falErrorDataSchema, falFailedResponseHandler } from './fal-error';\nimport type { FalVideoModelId } from './fal-video-settings';\n\nexport type FalVideoModelOptions = {\n loop?: boolean | null;\n motionStrength?: number | null;\n pollIntervalMs?: number | null;\n pollTimeoutMs?: number | null;\n resolution?: string | null;\n negativePrompt?: string | null;\n promptOptimizer?: boolean | null;\n [key: string]: unknown; // For passthrough\n};\n\n// Provider options schema for FAL video generation\nexport const falVideoModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z\n .object({\n // Video loop - only for Luma models\n loop: z.boolean().nullish(),\n\n // Motion strength (provider-specific)\n motionStrength: z.number().min(0).max(1).nullish(),\n\n // Polling configuration\n pollIntervalMs: z.number().positive().nullish(),\n pollTimeoutMs: z.number().positive().nullish(),\n\n // Resolution (model-specific, e.g., '480p', '720p', '1080p')\n resolution: z.string().nullish(),\n\n // Model-specific parameters\n negativePrompt: z.string().nullish(),\n promptOptimizer: z.boolean().nullish(),\n })\n .passthrough(),\n ),\n);\n\ninterface FalVideoModelConfig extends FalConfig {\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class FalVideoModel implements Experimental_VideoModelV3 {\n readonly specificationVersion = 'v3';\n readonly maxVideosPerCall = 1; // FAL video models support 1 video at a time\n\n get provider(): string {\n return this.config.provider;\n }\n\n private get normalizedModelId(): string {\n return this.modelId.replace(/^fal-ai\\//, '').replace(/^fal\\//, '');\n }\n\n constructor(\n readonly modelId: FalVideoModelId,\n private readonly config: FalVideoModelConfig,\n ) {}\n\n async doGenerate(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<Experimental_VideoModelV3['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const warnings: SharedV3Warning[] = [];\n\n const falOptions = (await parseProviderOptions({\n provider: 'fal',\n providerOptions: options.providerOptions,\n schema: falVideoModelOptionsSchema,\n })) as FalVideoModelOptions | undefined;\n\n const body: Record<string, unknown> = {};\n\n if (options.prompt != null) {\n body.prompt = options.prompt;\n }\n\n if (options.image != null) {\n if (options.image.type === 'url') {\n body.image_url = options.image.url;\n } else {\n body.image_url = convertImageModelFileToDataUri(options.image);\n }\n }\n\n if (options.aspectRatio) {\n body.aspect_ratio = options.aspectRatio;\n }\n\n if (options.duration) {\n body.duration = `${options.duration}s`;\n }\n\n if (options.seed) {\n body.seed = options.seed;\n }\n\n if (falOptions != null) {\n const opts = falOptions;\n if (opts.loop !== undefined && opts.loop !== null) {\n body.loop = opts.loop;\n }\n if (opts.motionStrength !== undefined && opts.motionStrength !== null) {\n body.motion_strength = opts.motionStrength;\n }\n if (opts.resolution !== undefined && opts.resolution !== null) {\n body.resolution = opts.resolution;\n }\n if (opts.negativePrompt !== undefined && opts.negativePrompt !== null) {\n body.negative_prompt = opts.negativePrompt;\n }\n if (opts.promptOptimizer !== undefined && opts.promptOptimizer !== null) {\n body.prompt_optimizer = opts.promptOptimizer;\n }\n\n for (const [key, value] of Object.entries(opts)) {\n if (\n ![\n 'loop',\n 'motionStrength',\n 'pollIntervalMs',\n 'pollTimeoutMs',\n 'resolution',\n 'negativePrompt',\n 'promptOptimizer',\n ].includes(key)\n ) {\n body[key] = value;\n }\n }\n }\n\n const { value: queueResponse } = await postJsonToApi({\n url: this.config.url({\n path: `https://queue.fal.run/fal-ai/${this.normalizedModelId}`,\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n body,\n failedResponseHandler: falFailedResponseHandler,\n successfulResponseHandler:\n createJsonResponseHandler(falJobResponseSchema),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const responseUrl = queueResponse.response_url;\n if (!responseUrl) {\n throw new AISDKError({\n name: 'FAL_VIDEO_GENERATION_ERROR',\n message: 'No response URL returned from queue endpoint',\n });\n }\n\n const pollIntervalMs = falOptions?.pollIntervalMs ?? 2000; // 2 seconds\n const pollTimeoutMs = falOptions?.pollTimeoutMs ?? 300000; // 5 minutes\n const startTime = Date.now();\n let response: FalVideoResponse;\n let responseHeaders: Record<string, string> | undefined;\n\n while (true) {\n try {\n const { value: statusResponse, responseHeaders: statusHeaders } =\n await getFromApi({\n url: this.config.url({\n path: responseUrl,\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n failedResponseHandler: async ({\n response,\n url,\n requestBodyValues,\n }) => {\n const body = await response.clone().json();\n\n if (body.detail === 'Request is still in progress') {\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 })({ response, url, requestBodyValues });\n },\n successfulResponseHandler: createJsonResponseHandler(\n falVideoResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n response = statusResponse;\n responseHeaders = statusHeaders;\n break;\n } catch (error) {\n if (\n error instanceof Error &&\n error.message === 'Request is still in progress'\n ) {\n // Continue polling\n } else {\n throw error;\n }\n }\n\n if (Date.now() - startTime > pollTimeoutMs) {\n throw new AISDKError({\n name: 'FAL_VIDEO_GENERATION_TIMEOUT',\n message: `Video generation request timed out after ${pollTimeoutMs}ms`,\n });\n }\n\n await delay(pollIntervalMs);\n\n if (options.abortSignal?.aborted) {\n throw new AISDKError({\n name: 'FAL_VIDEO_GENERATION_ABORTED',\n message: 'Video generation request was aborted',\n });\n }\n }\n\n const videoUrl = response.video?.url;\n\n if (!videoUrl || !response.video) {\n throw new AISDKError({\n name: 'FAL_VIDEO_GENERATION_ERROR',\n message: 'No video URL in response',\n });\n }\n\n return {\n videos: [\n {\n type: 'url',\n url: videoUrl,\n mediaType: response.video.content_type || 'video/mp4',\n },\n ],\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n providerMetadata: {\n fal: {\n videos: [\n {\n url: videoUrl,\n width: response.video.width,\n height: response.video.height,\n duration: response.video.duration,\n fps: response.video.fps,\n contentType: response.video.content_type,\n },\n ],\n ...(response.seed !== undefined ? { seed: response.seed } : {}),\n ...(response.timings ? { timings: response.timings } : {}),\n ...(response.has_nsfw_concepts !== undefined\n ? { has_nsfw_concepts: response.has_nsfw_concepts }\n : {}),\n ...(response.prompt ? { prompt: response.prompt } : {}),\n },\n },\n };\n }\n}\n\nconst falJobResponseSchema = z.object({\n request_id: z.string().nullish(),\n response_url: z.string().nullish(),\n});\n\nconst falVideoResponseSchema = z.object({\n video: z\n .object({\n url: z.string(),\n width: z.number().nullish(),\n height: z.number().nullish(),\n duration: z.number().nullish(),\n fps: z.number().nullish(),\n content_type: z.string().nullish(),\n })\n .nullish(),\n seed: z.number().nullish(),\n timings: z\n .object({\n inference: z.number().nullish(),\n })\n .nullish(),\n has_nsfw_concepts: z.array(z.boolean()).nullish(),\n prompt: z.string().nullish(),\n});\n\ntype FalVideoResponse = z.infer<typeof falVideoResponseSchema>;\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":";AAAA;AAAA,EACE;AAAA,OAMK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OAEK;;;ACXP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AACP,SAAS,KAAAA,UAAS;;;ACflB;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AACP,SAAS,SAAS;AAEX,IAAM,6BAA6B;AAAA,EAAW,MACnD;AAAA,IACE,EACG,OAAO;AAAA;AAAA,MAEN,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK;AAAA,QAClC,YAAY;AAAA,QACZ,aAAa;AAAA,MACf,CAAC;AAAA,MACD,SAAS,EACN,OAAO,EACP,QAAQ,EACR,KAAK,EAAE,YAAY,MAAM,aAAa,4BAA4B,CAAC;AAAA,MACtE,eAAe,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ;AAAA,MACjD,mBAAmB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ;AAAA,MACrD,qBAAqB,EAAE,QAAQ,EAAE,QAAQ;AAAA,MACzC,cAAc,EAAE,KAAK,CAAC,QAAQ,KAAK,CAAC,EAAE,QAAQ;AAAA,MAC9C,UAAU,EAAE,QAAQ,EAAE,QAAQ;AAAA,MAC9B,UAAU,EAAE,OAAO,EAAE,QAAQ;AAAA,MAC7B,cAAc,EAAE,KAAK,CAAC,QAAQ,WAAW,MAAM,CAAC,EAAE,QAAQ;AAAA,MAC1D,iBAAiB,EACd,KAAK,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,CAAC,EACnC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,EAC3B,QAAQ;AAAA;AAAA;AAAA;AAAA,MAIX,mBAAmB,EAAE,QAAQ,EAAE,QAAQ;AAAA;AAAA,MAGvC,WAAW,EAAE,OAAO,EAAE,QAAQ;AAAA,MAC9B,UAAU,EAAE,OAAO,EAAE,QAAQ;AAAA,MAC7B,gBAAgB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ;AAAA,MAClD,qBAAqB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ;AAAA,MACvD,uBAAuB,EAAE,QAAQ,EAAE,QAAQ;AAAA,MAC3C,eAAe,EAAE,KAAK,CAAC,QAAQ,KAAK,CAAC,EAAE,QAAQ;AAAA,MAC/C,WAAW,EAAE,QAAQ,EAAE,QAAQ;AAAA,MAC/B,kBAAkB,EACf,KAAK,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,CAAC,EACnC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,EAC3B,QAAQ;AAAA,IACb,CAAC,EACA,YAAY,EACZ,UAAU,UAAQ;AACjB,YAAM,SAAkC,CAAC;AACzC,YAAM,iBAA2B,CAAC;AAElC,YAAM,SAAS,CAAC,UAAkB,aAAqB;AACrD,cAAM,aAAa,KAAK,QAA6B;AACrD,cAAM,aAAa,KAAK,QAA6B;AAGrD,YAAI,eAAe,UAAa,eAAe,MAAM;AACnD,yBAAe,KAAK,QAAQ;AAC5B,iBAAO,QAAQ,IAAI;AAAA,QACrB,WAAW,eAAe,UAAa,eAAe,MAAM;AAC1D,iBAAO,QAAQ,IAAI;AAAA,QACrB;AAAA,MACF;AAGA,aAAO,aAAa,UAAU;AAC9B,aAAO,YAAY,SAAS;AAC5B,aAAO,kBAAkB,eAAe;AACxC,aAAO,uBAAuB,mBAAmB;AACjD,aAAO,yBAAyB,qBAAqB;AACrD,aAAO,iBAAiB,cAAc;AACtC,aAAO,aAAa,UAAU;AAC9B,aAAO,oBAAoB,iBAAiB;AAG5C,UAAI,KAAK,aAAa,UAAa,KAAK,aAAa,MAAM;AACzD,eAAO,WAAW,KAAK;AAAA,MACzB;AACA,UAAI,KAAK,iBAAiB,UAAa,KAAK,iBAAiB,MAAM;AACjE,eAAO,eAAe,KAAK;AAAA,MAC7B;AACA,UACE,KAAK,sBAAsB,UAC3B,KAAK,sBAAsB,MAC3B;AACA,eAAO,oBAAoB,KAAK;AAAA,MAClC;AAEA,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,YACE,CAAC;AAAA;AAAA,UAEC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,UAEA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,EAAE,SAAS,GAAG,GACd;AACA,iBAAO,GAAG,IAAI;AAAA,QAChB;AAAA,MACF;AAEA,UAAI,eAAe,SAAS,GAAG;AAC7B,QAAC,OAAe,mBAAmB;AAAA,MACrC;AAEA,aAAO;AAAA,IACT,CAAC;AAAA,EACL;AACF;;;ADnGO,IAAM,gBAAN,MAA4C;AAAA,EAQjD,YACW,SACQ,QACjB;AAFS;AACQ;AATnB,SAAS,uBAAuB;AAChC,SAAS,mBAAmB;AAAA,EASzB;AAAA,EAPH,IAAI,WAAmB;AACrB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAOA,MAAc,QAAQ;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAA8C;AAnDhD;AAoDI,UAAM,WAAmC,CAAC;AAE1C,QAAI;AACJ,QAAI,MAAM;AACR,YAAM,CAAC,OAAO,MAAM,IAAI,KAAK,MAAM,GAAG,EAAE,IAAI,MAAM;AAClD,kBAAY,EAAE,OAAO,OAAO;AAAA,IAC9B,WAAW,aAAa;AACtB,kBAAY,yBAAyB,WAAW;AAAA,IAClD;AAEA,UAAM,aAAa,MAAM,qBAAqB;AAAA,MAC5C,UAAU;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AAED,UAAM,cAAuC;AAAA,MAC3C;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ,YAAY;AAAA,IACd;AAGA,QAAI,SAAS,QAAQ,MAAM,SAAS,GAAG;AACrC,YAAM,qBAAoB,yCAAY,uBAAsB;AAE5D,UAAI,mBAAmB;AAErB,oBAAY,aAAa,MAAM;AAAA,UAAI,UACjC,+BAA+B,IAAI;AAAA,QACrC;AAAA,MACF,OAAO;AAEL,oBAAY,YAAY,+BAA+B,MAAM,CAAC,CAAC;AAE/D,YAAI,MAAM,SAAS,GAAG;AACpB,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,SACE;AAAA,UAGJ,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,QAAI,QAAQ,MAAM;AAChB,kBAAY,WAAW,+BAA+B,IAAI;AAAA,IAC5D;AAEA,QAAI,YAAY;AACd,YAAM,iBACJ,sBAAsB,aACjB,WAAW,mBACZ;AAEN,UAAI,kBAAkB,eAAe,SAAS,GAAG;AAC/C,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS,mIAAmI,eACzI,IAAI,SAAO;AACV,kBAAM,YAAY,IAAI;AAAA,cAAQ;AAAA,cAAa,CAAC,GAAG,WAC7C,OAAO,YAAY;AAAA,YACrB;AACA,mBAAO,IAAI,GAAG,WAAW,SAAS;AAAA,UACpC,CAAC,EACA,KAAK,IAAI,CAAC;AAAA,QACf,CAAC;AAAA,MACH;AAEA,YAAM,eAAuC;AAAA,QAC3C,UAAU;AAAA,QACV,SAAS;AAAA,QACT,eAAe;AAAA,QACf,mBAAmB;AAAA,QACnB,qBAAqB;AAAA,QACrB,cAAc;AAAA,QACd,UAAU;AAAA,QACV,iBAAiB;AAAA,MACnB;AAEA,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AACrD,YAAI,QAAQ,mBAAoB;AAChC,YAAI,QAAQ,oBAAqB;AACjC,cAAM,UAAS,kBAAa,GAAG,MAAhB,YAAqB;AAEpC,YAAI,UAAU,QAAW;AACvB,sBAAY,MAAM,IAAI;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAEA,WAAO,EAAE,aAAa,SAAS;AAAA,EACjC;AAAA,EAEA,MAAM,WACJ,SAC0D;AAxJ9D;AAyJI,UAAM,EAAE,aAAa,SAAS,IAAI,MAAM,KAAK,QAAQ,OAAO;AAE5D,UAAM,eAAc,sBAAK,OAAO,cAAZ,mBAAuB,gBAAvB,4CAA0C,oBAAI,KAAK;AACvE,UAAM,EAAE,OAAO,gBAAgB,IAAI,MAAM,cAAc;AAAA,MACrD,KAAK,GAAG,KAAK,OAAO,OAAO,IAAI,KAAK,OAAO;AAAA,MAC3C,SAAS;AAAA,QACP,MAAM,QAAQ,KAAK,OAAO,OAAO;AAAA,QACjC,QAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,MACN,uBAAuB;AAAA,MACvB,2BAA2B;AAAA,QACzB;AAAA,MACF;AAAA,MACA,aAAa,QAAQ;AAAA,MACrB,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AAED,UAAM;AAAA,MACJ,QAAQ;AAAA;AAAA,MAER,QAAQ;AAAA;AAAA,MAER;AAAA,MACA;AAAA;AAAA,MAEA,GAAG;AAAA,IACL,IAAI;AAGJ,UAAM,mBAAmB,MAAM,QAAQ;AAAA,MACrC,aAAa;AAAA,QAAI,WACf,KAAK,cAAc,MAAM,KAAK,QAAQ,WAAW;AAAA,MACnD;AAAA,IACF;AAEA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR;AAAA,MACA,UAAU;AAAA,QACR,SAAS,KAAK;AAAA,QACd,WAAW;AAAA,QACX,SAAS;AAAA,MACX;AAAA,MACA,kBAAkB;AAAA,QAChB,KAAK;AAAA,UACH,QAAQ,aAAa,IAAI,CAAC,OAAO,UAAU;AAvMrD,gBAAAC;AAwMY,kBAAM;AAAA,cACJ;AAAA,cACA,cAAc;AAAA,cACd,WAAW;AAAA,cACX,WAAW;AAAA,cACX,WAAW;AAAA,cACX,GAAG;AAAA,YACL,IAAI;AAEJ,kBAAM,QACJA,MAAA,uDAAoB,WAApB,OAAAA,MAA8B,+DAAwB;AAExD,mBAAO;AAAA,cACL,GAAG;AAAA,cACH,GAAG,oBAAoB;AAAA,gBACrB;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF,CAAC;AAAA,YACH;AAAA,UACF,CAAC;AAAA,UACD,GAAG;AAAA,QACL;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,cACZ,KACA,aACqB;AACrB,UAAM,EAAE,OAAO,SAAS,IAAI,MAAM,WAAW;AAAA,MAC3C;AAAA;AAAA;AAAA,MAGA;AAAA,MACA,uBAAuB,qCAAqC;AAAA,MAC5D,2BAA2B,4BAA4B;AAAA,MACvD,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AACD,WAAO;AAAA,EACT;AACF;AAEA,SAAS,oBAAuD,KAAQ;AACtE,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,MAAM,MAAS;AAAA,EACvD;AACF;AAOA,SAAS,yBACP,aAC0B;AAC1B,UAAQ,aAAa;AAAA,IACnB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,EAAE,OAAO,MAAM,QAAQ,IAAI;AAAA,IACpC,KAAK;AACH,aAAO,EAAE,OAAO,KAAK,QAAQ,KAAK;AAAA,IACpC,KAAK;AACH,aAAO,EAAE,OAAO,MAAM,QAAQ,KAAK;AAAA,IACrC,KAAK;AACH,aAAO,EAAE,OAAO,MAAM,QAAQ,KAAK;AAAA,EACvC;AACA,SAAO;AACT;AAGA,IAAM,2BAA2BC,GAAE,OAAO;AAAA,EACxC,QAAQA,GAAE;AAAA,IACRA,GAAE,OAAO;AAAA,MACP,KAAKA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,MACvB,KAAKA,GAAE,OAAO;AAAA,MACd,MAAMA,GAAE,OAAO;AAAA,IACjB,CAAC;AAAA,EACH;AACF,CAAC;AAKD,IAAM,qBAAqBA,GAAE,OAAO;AAAA,EAClC,SAASA,GAAE,OAAO;AACpB,CAAC;AAED,IAAM,iBAAiBA,GAAE,MAAM,CAAC,0BAA0B,kBAAkB,CAAC;AAE7E,IAAM,iBAAiBA,GAAE,OAAO;AAAA,EAC9B,KAAKA,GAAE,OAAO;AAAA,EACd,OAAOA,GAAE,OAAO,EAAE,QAAQ;AAAA,EAC1B,QAAQA,GAAE,OAAO,EAAE,QAAQ;AAAA;AAAA,EAE3B,cAAcA,GAAE,OAAO,EAAE,QAAQ;AAAA;AAAA,EAEjC,WAAWA,GAAE,OAAO,EAAE,QAAQ;AAAA,EAC9B,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,WAAWA,GAAE,OAAO,EAAE,QAAQ;AAChC,CAAC;AAGD,IAAM,iBAAiBA,GAAE,OAAO;AAAA,EAC9B,KAAKA,GAAE,OAAO;AAAA,EACd,cAAcA,GAAE,OAAO,EAAE,SAAS;AAAA,EAClC,WAAWA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC1C,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,WAAWA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAC5C,CAAC;AAED,IAAM,uBAAuBA,GAAE,OAAO;AAAA,EACpC,SAASA,GACN,OAAO;AAAA,IACN,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,EACjC,CAAC,EACA,SAAS;AAAA,EACZ,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,mBAAmBA,GAAE,MAAMA,GAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EACjD,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAE5B,uBAAuBA,GAAE,MAAMA,GAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EACrD,qBAAqBA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAEzC,eAAe,eAAe,SAAS;AAAA,EACvC,wBAAwB,eAAe,SAAS;AAClD,CAAC;AAID,IAAM,OAAOA,GAAE,YAAY,qBAAqB,KAAK;AACrD,IAAM,yBAAyBA,GAC5B,MAAM;AAAA,EACL,KAAK,OAAO,EAAE,QAAQA,GAAE,MAAM,cAAc,EAAE,CAAC;AAAA,EAC/C,KAAK,OAAO,EAAE,OAAO,eAAe,CAAC;AACvC,CAAC,EACA,UAAU,OAAM,YAAY,IAAI,IAAI,EAAE,GAAG,GAAG,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAE,EAChE,KAAK,KAAK,OAAO,EAAE,QAAQA,GAAE,MAAM,cAAc,EAAE,CAAC,CAAC;AAExD,SAAS,kBAAkB,OAA0C;AACnE,SAAO,yBAAyB,UAAU,KAAK,EAAE;AACnD;AAEA,IAAM,2BAA2B,+BAA+B;AAAA,EAC9D,aAAa;AAAA,EACb,gBAAgB,WAAS;AAtW3B;AAuWI,QAAI,kBAAkB,KAAK,GAAG;AAC5B,aAAO,MAAM,OACV,IAAI,YAAU,GAAG,OAAO,IAAI,KAAK,GAAG,CAAC,KAAK,OAAO,GAAG,EAAE,EACtD,KAAK,IAAI;AAAA,IACd;AACA,YAAO,WAAM,YAAN,YAAiB;AAAA,EAC1B;AACF,CAAC;;;AE9WD;AAAA,EACE;AAAA,OAGK;AACP;AAAA,EACE,kBAAAC;AAAA,EACA;AAAA,EACA,kCAAAC;AAAA,EACA,6BAAAC;AAAA,EACA;AAAA,EACA,cAAAC;AAAA,EACA,wBAAAC;AAAA,EACA,iBAAAC;AAAA,OACK;AACP,SAAS,KAAAC,UAAS;;;ACflB,SAAS,KAAAC,UAAS;AAClB,SAAS,kCAAAC,uCAAsC;AAExC,IAAM,qBAAqBD,GAAE,OAAO;AAAA,EACzC,OAAOA,GAAE,OAAO;AAAA,IACd,SAASA,GAAE,OAAO;AAAA,IAClB,MAAMA,GAAE,OAAO;AAAA,EACjB,CAAC;AACH,CAAC;AAIM,IAAME,4BAA2BD,gCAA+B;AAAA,EACrE,aAAa;AAAA,EACb,gBAAgB,UAAQ,KAAK,MAAM;AACrC,CAAC;;;ADOD,IAAM,qCAAqCE,GAAE,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMlD,UAAUA,GACP,MAAM,CAACA,GAAE,KAAK,CAAC,IAAI,CAAC,GAAGA,GAAE,OAAO,CAAC,CAAC,EAClC,QAAQ,EACR,QAAQ,IAAI;AAAA;AAAA;AAAA;AAAA,EAKf,SAASA,GAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA;AAAA;AAAA;AAAA,EAK3C,YAAYA,GAAE,KAAK,CAAC,WAAW,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,SAAS;AAAA;AAAA;AAAA;AAAA,EAKnE,SAASA,GAAE,KAAK,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAG;AAAA;AAAA;AAAA;AAAA,EAK5C,WAAWA,GAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE;AAAA;AAAA;AAAA;AAAA,EAK1C,aAAaA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAC7C,CAAC;AAYM,IAAM,wBAAN,MAA4D;AAAA,EAOjE,YACW,SACQ,QACjB;AAFS;AACQ;AARnB,SAAS,uBAAuB;AAAA,EAS7B;AAAA,EAPH,IAAI,WAAmB;AACrB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAOA,MAAc,QAAQ;AAAA,IACpB;AAAA,EACF,GAAsD;AAnFxD;AAoFI,UAAM,WAA8B,CAAC;AAGrC,UAAM,aAAa,MAAMC,sBAAqB;AAAA,MAC5C,UAAU;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AAGD,UAAM,OAAoD;AAAA,MACxD,MAAM;AAAA,MACN,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAGA,QAAI,YAAY;AACd,WAAK,WAAW,WAAW;AAC3B,WAAK,WAAU,gBAAW,YAAX,YAAsB;AACrC,WAAK,cAAa,gBAAW,cAAX,YAAwB;AAC1C,WAAK,gBAAe,gBAAW,gBAAX,YAA0B;AAE9C,UAAI,OAAO,WAAW,YAAY,WAAW;AAC3C,aAAK,UAAU,WAAW;AAAA,MAC5B;AAEA,UAAI,WAAW,YAAY;AACzB,aAAK,cAAc,WAAW;AAAA,MAChC;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WACJ,SACkE;AA5HtE;AA6HI,UAAM,eAAc,sBAAK,OAAO,cAAZ,mBAAuB,gBAAvB,4CAA0C,oBAAI,KAAK;AACvE,UAAM,EAAE,MAAM,SAAS,IAAI,MAAM,KAAK,QAAQ,OAAO;AAErD,UAAM,cACJ,OAAO,QAAQ,UAAU,WACrB,QAAQ,QACR,0BAA0B,QAAQ,KAAK;AAE7C,UAAM,WAAW,QAAQ,QAAQ,SAAS,WAAW,WAAW;AAEhE,UAAM,EAAE,OAAO,cAAc,IAAI,MAAMC,eAAc;AAAA,MACnD,KAAK,KAAK,OAAO,IAAI;AAAA,QACnB,MAAM,gCAAgC,KAAK,OAAO;AAAA,QAClD,SAAS,KAAK;AAAA,MAChB,CAAC;AAAA,MACD,SAASC,gBAAe,KAAK,OAAO,QAAQ,GAAG,QAAQ,OAAO;AAAA,MAC9D,MAAM;AAAA,QACJ,GAAG;AAAA,QACH,WAAW;AAAA,MACb;AAAA,MACA,uBAAuBC;AAAA,MACvB,2BACEC,2BAA0B,oBAAoB;AAAA,MAChD,aAAa,QAAQ;AAAA,MACrB,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AAGD,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,YAAY;AAClB,UAAM,iBAAiB;AAEvB,QAAI;AACJ,QAAI;AACJ,QAAI;AAEJ,WAAO,MAAM;AACX,UAAI;AACF,cAAM;AAAA,UACJ,OAAO;AAAA,UACP,iBAAiB;AAAA,UACjB,UAAU;AAAA,QACZ,IAAI,MAAMC,YAAW;AAAA,UACnB,KAAK,KAAK,OAAO,IAAI;AAAA,YACnB,MAAM,gCAAgC,KAAK,OAAO,aAAa,cAAc,UAAU;AAAA,YACvF,SAAS,KAAK;AAAA,UAChB,CAAC;AAAA,UACD,SAASH,gBAAe,KAAK,OAAO,QAAQ,GAAG,QAAQ,OAAO;AAAA,UAC9D,uBAAuB,OAAO;AAAA,YAC5B;AAAA,YACA,UAAAI;AAAA,YACA;AAAA,UACF,MAAM;AACJ,kBAAM,QAAQA,UAAS,MAAM;AAC7B,kBAAMC,QAAQ,MAAM,MAAM,KAAK;AAE/B,gBAAIA,MAAK,WAAW,gCAAgC;AAGlD,qBAAO;AAAA,gBACL,OAAO,IAAI,MAAM,8BAA8B;AAAA,gBAC/C,UAAUA;AAAA,gBACV,iBAAiB,CAAC;AAAA,cACpB;AAAA,YACF;AAEA,mBAAOC,gCAA+B;AAAA,cACpC,aAAa;AAAA,cACb,gBAAgB,UAAQ,KAAK,MAAM;AAAA,YACrC,CAAC,EAAE,EAAE,mBAAmB,UAAAF,WAAU,IAAI,CAAC;AAAA,UACzC;AAAA,UACA,2BAA2BF;AAAA,YACzB;AAAA,UACF;AAAA,UACA,aAAa,QAAQ;AAAA,UACrB,OAAO,KAAK,OAAO;AAAA,QACrB,CAAC;AAED,mBAAW;AACX,0BAAkB;AAClB,sBAAc;AACd;AAAA,MACF,SAAS,OAAO;AAEd,YACE,iBAAiB,SACjB,MAAM,YAAY,gCAClB;AAAA,QAEF,OAAO;AAEL,gBAAM;AAAA,QACR;AAAA,MACF;AAGA,UAAI,KAAK,IAAI,IAAI,YAAY,WAAW;AACtC,cAAM,IAAI,WAAW;AAAA,UACnB,SAAS;AAAA,UACT,MAAM;AAAA,UACN,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAGA,YAAM,MAAM,cAAc;AAAA,IAC5B;AAEA,WAAO;AAAA,MACL,MAAM,SAAS;AAAA,MACf,WACE,oBAAS,WAAT,mBAAiB,IAAI,WAAM;AA5OnC,YAAAK,KAAAC,KAAAC,KAAAC;AA4OuC;AAAA,UAC7B,MAAM,MAAM;AAAA,UACZ,cAAaF,OAAAD,MAAA,MAAM,cAAN,gBAAAA,IAAiB,GAAG,OAApB,OAAAC,MAA0B;AAAA,UACvC,YAAWE,OAAAD,MAAA,MAAM,cAAN,gBAAAA,IAAiB,GAAG,OAApB,OAAAC,MAA0B;AAAA,QACvC;AAAA,aAJA,YAIO,CAAC;AAAA,MACV,WAAU,oBAAS,uBAAT,mBAA6B,GAAG,OAAhC,YAAsC;AAAA,MAChD,oBAAmB,gCAAS,WAAT,mBAAiB,GAAG,QAApB,mBAAyB,cAAzB,mBAAoC,GAAG,OAAvC,YAA6C;AAAA,MAChE;AAAA,MACA,UAAU;AAAA,QACR,WAAW;AAAA,QACX,SAAS,KAAK;AAAA,QACd,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,uBAAuBb,GAAE,OAAO;AAAA,EACpC,YAAYA,GAAE,OAAO,EAAE,QAAQ;AACjC,CAAC;AAED,IAAM,iCAAiCA,GAAE,OAAO;AAAA,EAC9C,MAAMA,GAAE,OAAO;AAAA,EACf,QAAQA,GACL;AAAA,IACCA,GAAE,OAAO;AAAA,MACP,MAAMA,GAAE,OAAO;AAAA,MACf,WAAWA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ;AAAA,IACzC,CAAC;AAAA,EACH,EACC,QAAQ;AAAA,EACX,oBAAoBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ;AAClD,CAAC;;;AE5QD;AAAA,EACE,kBAAAc;AAAA,EACA,+BAAAC;AAAA,EACA,6BAAAC;AAAA,EACA,wCAAAC;AAAA,EACA,cAAAC;AAAA,EACA,wBAAAC;AAAA,EACA,iBAAAC;AAAA,OACK;AACP,SAAS,KAAAC,UAAS;;;AC4IX,IAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,eAAe;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;AD3KA,IAAM,8BAA8BC,GAAE,YAAY;AAAA,EAChD,eAAeA,GACZ,OAAO;AAAA,IACN,OAAOA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC1B,KAAKA,GAAE,OAAO,EAAE,QAAQ;AAAA,IACxB,UAAUA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC7B,OAAOA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC1B,uBAAuBA,GAAE,QAAQ,EAAE,QAAQ;AAAA,IAC3C,SAASA,GAAE,KAAK,YAAY,EAAE,QAAQ;AAAA,EACxC,CAAC,EACA,QAAQ,EACR,QAAQ;AAAA,EACX,eAAeA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC,EAAE,QAAQ;AAAA,EACzD,gBAAgBA,GAAE,KAAK,mBAAmB,EAAE,QAAQ;AAAA,EACpD,oBAAoBA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC,EAAE,QAAQ;AAC/D,CAAC;AAUM,IAAM,iBAAN,MAA8C;AAAA,EAOnD,YACW,SACQ,QACjB;AAFS;AACQ;AARnB,SAAS,uBAAuB;AAAA,EAS7B;AAAA,EAPH,IAAI,WAAmB;AACrB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAOA,MAAc,QAAQ;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAA+C;AAC7C,UAAM,WAA8B,CAAC;AAErC,UAAM,aAAa,MAAMC,sBAAqB;AAAA,MAC5C,UAAU;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AAED,UAAM,cAAc;AAAA,MAClB;AAAA,MACA,eAAe,iBAAiB,QAAQ,QAAQ;AAAA,MAChD;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL;AAGA,QAAI,UAAU;AACZ,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SACE;AAAA,MACJ,CAAC;AAAA,IACH;AAGA,QAAI,gBAAgB,iBAAiB,SAAS,iBAAiB,OAAO;AACpE,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS,6BAA6B,YAAY;AAAA,MACpD,CAAC;AAAA,IACH;AAEA,WAAO,EAAE,aAAa,SAAS;AAAA,EACjC;AAAA,EAEA,MAAM,WACJ,SAC2D;AArG/D;AAsGI,UAAM,eAAc,sBAAK,OAAO,cAAZ,mBAAuB,gBAAvB,4CAA0C,oBAAI,KAAK;AACvE,UAAM,EAAE,aAAa,SAAS,IAAI,MAAM,KAAK,QAAQ,OAAO;AAE5D,UAAM;AAAA,MACJ,OAAO;AAAA,MACP;AAAA,MACA;AAAA,IACF,IAAI,MAAMC,eAAc;AAAA,MACtB,KAAK,KAAK,OAAO,IAAI;AAAA,QACnB,MAAM,mBAAmB,KAAK,OAAO;AAAA,QACrC,SAAS,KAAK;AAAA,MAChB,CAAC;AAAA,MACD,SAASC,gBAAe,KAAK,OAAO,QAAQ,GAAG,QAAQ,OAAO;AAAA,MAC9D,MAAM;AAAA,MACN,uBAAuBC;AAAA,MACvB,2BAA2BC;AAAA,QACzB;AAAA,MACF;AAAA,MACA,aAAa,QAAQ;AAAA,MACrB,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AAED,UAAM,WAAW,KAAK,MAAM;AAC5B,UAAM,EAAE,OAAO,MAAM,IAAI,MAAMC,YAAW;AAAA,MACxC,KAAK;AAAA,MACL,uBAAuBC,sCAAqC;AAAA,MAC5D,2BAA2BC,6BAA4B;AAAA,MACvD,aAAa,QAAQ;AAAA,MACrB,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AAED,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,SAAS;AAAA,QACP,MAAM,KAAK,UAAU,WAAW;AAAA,MAClC;AAAA,MACA,UAAU;AAAA,QACR,WAAW;AAAA,QACX,SAAS,KAAK;AAAA,QACd,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,0BAA0BR,GAAE,OAAO;AAAA,EACvC,OAAOA,GAAE,OAAO,EAAE,KAAKA,GAAE,OAAO,EAAE,CAAC;AAAA,EACnC,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,EACjC,YAAYA,GAAE,OAAO,EAAE,SAAS;AAClC,CAAC;;;AEzJD;AAAA,EACE,cAAAS;AAAA,OAGK;AACP;AAAA,EACE,kBAAAC;AAAA,EACA,kCAAAC;AAAA,EACA,kCAAAC;AAAA,EACA,6BAAAC;AAAA,EACA,SAAAC;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC;AAAA,EACA,wBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,aAAAC;AAAA,OACK;AACP,SAAS,KAAAC,UAAS;AAiBX,IAAM,6BAA6BC;AAAA,EAAW,MACnDC;AAAA,IACEC,GACG,OAAO;AAAA;AAAA,MAEN,MAAMA,GAAE,QAAQ,EAAE,QAAQ;AAAA;AAAA,MAG1B,gBAAgBA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ;AAAA;AAAA,MAGjD,gBAAgBA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,MAC9C,eAAeA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA;AAAA,MAG7C,YAAYA,GAAE,OAAO,EAAE,QAAQ;AAAA;AAAA,MAG/B,gBAAgBA,GAAE,OAAO,EAAE,QAAQ;AAAA,MACnC,iBAAiBA,GAAE,QAAQ,EAAE,QAAQ;AAAA,IACvC,CAAC,EACA,YAAY;AAAA,EACjB;AACF;AAQO,IAAM,gBAAN,MAAyD;AAAA,EAY9D,YACW,SACQ,QACjB;AAFS;AACQ;AAbnB,SAAS,uBAAuB;AAChC,SAAS,mBAAmB;AAAA,EAazB;AAAA;AAAA,EAXH,IAAI,WAAmB;AACrB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAY,oBAA4B;AACtC,WAAO,KAAK,QAAQ,QAAQ,aAAa,EAAE,EAAE,QAAQ,UAAU,EAAE;AAAA,EACnE;AAAA,EAOA,MAAM,WACJ,SACuE;AApF3E;AAqFI,UAAM,eAAc,sBAAK,OAAO,cAAZ,mBAAuB,gBAAvB,4CAA0C,oBAAI,KAAK;AACvE,UAAM,WAA8B,CAAC;AAErC,UAAM,aAAc,MAAMC,sBAAqB;AAAA,MAC7C,UAAU;AAAA,MACV,iBAAiB,QAAQ;AAAA,MACzB,QAAQ;AAAA,IACV,CAAC;AAED,UAAM,OAAgC,CAAC;AAEvC,QAAI,QAAQ,UAAU,MAAM;AAC1B,WAAK,SAAS,QAAQ;AAAA,IACxB;AAEA,QAAI,QAAQ,SAAS,MAAM;AACzB,UAAI,QAAQ,MAAM,SAAS,OAAO;AAChC,aAAK,YAAY,QAAQ,MAAM;AAAA,MACjC,OAAO;AACL,aAAK,YAAYC,gCAA+B,QAAQ,KAAK;AAAA,MAC/D;AAAA,IACF;AAEA,QAAI,QAAQ,aAAa;AACvB,WAAK,eAAe,QAAQ;AAAA,IAC9B;AAEA,QAAI,QAAQ,UAAU;AACpB,WAAK,WAAW,GAAG,QAAQ,QAAQ;AAAA,IACrC;AAEA,QAAI,QAAQ,MAAM;AAChB,WAAK,OAAO,QAAQ;AAAA,IACtB;AAEA,QAAI,cAAc,MAAM;AACtB,YAAM,OAAO;AACb,UAAI,KAAK,SAAS,UAAa,KAAK,SAAS,MAAM;AACjD,aAAK,OAAO,KAAK;AAAA,MACnB;AACA,UAAI,KAAK,mBAAmB,UAAa,KAAK,mBAAmB,MAAM;AACrE,aAAK,kBAAkB,KAAK;AAAA,MAC9B;AACA,UAAI,KAAK,eAAe,UAAa,KAAK,eAAe,MAAM;AAC7D,aAAK,aAAa,KAAK;AAAA,MACzB;AACA,UAAI,KAAK,mBAAmB,UAAa,KAAK,mBAAmB,MAAM;AACrE,aAAK,kBAAkB,KAAK;AAAA,MAC9B;AACA,UAAI,KAAK,oBAAoB,UAAa,KAAK,oBAAoB,MAAM;AACvE,aAAK,mBAAmB,KAAK;AAAA,MAC/B;AAEA,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,YACE,CAAC;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,EAAE,SAAS,GAAG,GACd;AACA,eAAK,GAAG,IAAI;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAEA,UAAM,EAAE,OAAO,cAAc,IAAI,MAAMC,eAAc;AAAA,MACnD,KAAK,KAAK,OAAO,IAAI;AAAA,QACnB,MAAM,gCAAgC,KAAK,iBAAiB;AAAA,QAC5D,SAAS,KAAK;AAAA,MAChB,CAAC;AAAA,MACD,SAASC,gBAAe,KAAK,OAAO,QAAQ,GAAG,QAAQ,OAAO;AAAA,MAC9D;AAAA,MACA,uBAAuBC;AAAA,MACvB,2BACEC,2BAA0BC,qBAAoB;AAAA,MAChD,aAAa,QAAQ;AAAA,MACrB,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AAED,UAAM,cAAc,cAAc;AAClC,QAAI,CAAC,aAAa;AAChB,YAAM,IAAIC,YAAW;AAAA,QACnB,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,UAAM,kBAAiB,8CAAY,mBAAZ,YAA8B;AACrD,UAAM,iBAAgB,8CAAY,kBAAZ,YAA6B;AACnD,UAAM,YAAY,KAAK,IAAI;AAC3B,QAAI;AACJ,QAAI;AAEJ,WAAO,MAAM;AACX,UAAI;AACF,cAAM,EAAE,OAAO,gBAAgB,iBAAiB,cAAc,IAC5D,MAAMC,YAAW;AAAA,UACf,KAAK,KAAK,OAAO,IAAI;AAAA,YACnB,MAAM;AAAA,YACN,SAAS,KAAK;AAAA,UAChB,CAAC;AAAA,UACD,SAASL,gBAAe,KAAK,OAAO,QAAQ,GAAG,QAAQ,OAAO;AAAA,UAC9D,uBAAuB,OAAO;AAAA,YAC5B,UAAAM;AAAA,YACA;AAAA,YACA;AAAA,UACF,MAAM;AACJ,kBAAMC,QAAO,MAAMD,UAAS,MAAM,EAAE,KAAK;AAEzC,gBAAIC,MAAK,WAAW,gCAAgC;AAClD,qBAAO;AAAA,gBACL,OAAO,IAAI,MAAM,8BAA8B;AAAA,gBAC/C,UAAUA;AAAA,gBACV,iBAAiB,CAAC;AAAA,cACpB;AAAA,YACF;AAEA,mBAAOC,gCAA+B;AAAA,cACpC,aAAa;AAAA,cACb,gBAAgB,UAAQ,KAAK,MAAM;AAAA,YACrC,CAAC,EAAE,EAAE,UAAAF,WAAU,KAAK,kBAAkB,CAAC;AAAA,UACzC;AAAA,UACA,2BAA2BJ;AAAA,YACzB;AAAA,UACF;AAAA,UACA,aAAa,QAAQ;AAAA,UACrB,OAAO,KAAK,OAAO;AAAA,QACrB,CAAC;AAEH,mBAAW;AACX,0BAAkB;AAClB;AAAA,MACF,SAAS,OAAO;AACd,YACE,iBAAiB,SACjB,MAAM,YAAY,gCAClB;AAAA,QAEF,OAAO;AACL,gBAAM;AAAA,QACR;AAAA,MACF;AAEA,UAAI,KAAK,IAAI,IAAI,YAAY,eAAe;AAC1C,cAAM,IAAIE,YAAW;AAAA,UACnB,MAAM;AAAA,UACN,SAAS,4CAA4C,aAAa;AAAA,QACpE,CAAC;AAAA,MACH;AAEA,YAAMK,OAAM,cAAc;AAE1B,WAAI,aAAQ,gBAAR,mBAAqB,SAAS;AAChC,cAAM,IAAIL,YAAW;AAAA,UACnB,MAAM;AAAA,UACN,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AAAA,IACF;AAEA,UAAM,YAAW,cAAS,UAAT,mBAAgB;AAEjC,QAAI,CAAC,YAAY,CAAC,SAAS,OAAO;AAChC,YAAM,IAAIA,YAAW;AAAA,QACnB,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL,QAAQ;AAAA,QACN;AAAA,UACE,MAAM;AAAA,UACN,KAAK;AAAA,UACL,WAAW,SAAS,MAAM,gBAAgB;AAAA,QAC5C;AAAA,MACF;AAAA,MACA;AAAA,MACA,UAAU;AAAA,QACR,WAAW;AAAA,QACX,SAAS,KAAK;AAAA,QACd,SAAS;AAAA,MACX;AAAA,MACA,kBAAkB;AAAA,QAChB,KAAK;AAAA,UACH,QAAQ;AAAA,YACN;AAAA,cACE,KAAK;AAAA,cACL,OAAO,SAAS,MAAM;AAAA,cACtB,QAAQ,SAAS,MAAM;AAAA,cACvB,UAAU,SAAS,MAAM;AAAA,cACzB,KAAK,SAAS,MAAM;AAAA,cACpB,aAAa,SAAS,MAAM;AAAA,YAC9B;AAAA,UACF;AAAA,UACA,GAAI,SAAS,SAAS,SAAY,EAAE,MAAM,SAAS,KAAK,IAAI,CAAC;AAAA,UAC7D,GAAI,SAAS,UAAU,EAAE,SAAS,SAAS,QAAQ,IAAI,CAAC;AAAA,UACxD,GAAI,SAAS,sBAAsB,SAC/B,EAAE,mBAAmB,SAAS,kBAAkB,IAChD,CAAC;AAAA,UACL,GAAI,SAAS,SAAS,EAAE,QAAQ,SAAS,OAAO,IAAI,CAAC;AAAA,QACvD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAMD,wBAAuBP,GAAE,OAAO;AAAA,EACpC,YAAYA,GAAE,OAAO,EAAE,QAAQ;AAAA,EAC/B,cAAcA,GAAE,OAAO,EAAE,QAAQ;AACnC,CAAC;AAED,IAAM,yBAAyBA,GAAE,OAAO;AAAA,EACtC,OAAOA,GACJ,OAAO;AAAA,IACN,KAAKA,GAAE,OAAO;AAAA,IACd,OAAOA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC1B,QAAQA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC3B,UAAUA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC7B,KAAKA,GAAE,OAAO,EAAE,QAAQ;AAAA,IACxB,cAAcA,GAAE,OAAO,EAAE,QAAQ;AAAA,EACnC,CAAC,EACA,QAAQ;AAAA,EACX,MAAMA,GAAE,OAAO,EAAE,QAAQ;AAAA,EACzB,SAASA,GACN,OAAO;AAAA,IACN,WAAWA,GAAE,OAAO,EAAE,QAAQ;AAAA,EAChC,CAAC,EACA,QAAQ;AAAA,EACX,mBAAmBA,GAAE,MAAMA,GAAE,QAAQ,CAAC,EAAE,QAAQ;AAAA,EAChD,QAAQA,GAAE,OAAO,EAAE,QAAQ;AAC7B,CAAC;;;AC/TM,IAAM,UACX,OACI,WACA;;;ARgFN,IAAM,iBAAiB;AAEvB,SAAS,cAAc;AAAA,EACrB;AAAA,EACA,cAAc;AAChB,GAGW;AACT,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO;AAAA,EACT;AAEA,MAAI,UAAU,MAAM;AAClB,UAAM,IAAI,MAAM,GAAG,WAAW,4BAA4B;AAAA,EAC5D;AAEA,MAAI,OAAO,YAAY,aAAa;AAClC,UAAM,IAAI;AAAA,MACR,GAAG,WAAW;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,YAAY,QAAQ,IAAI;AAC5B,MAAI,aAAa,MAAM;AACrB,gBAAY,QAAQ,IAAI;AAAA,EAC1B;AAEA,MAAI,aAAa,MAAM;AACrB,UAAM,IAAI;AAAA,MACR,GAAG,WAAW;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,OAAO,cAAc,UAAU;AACjC,UAAM,IAAI;AAAA,MACR,GAAG,WAAW;AAAA,IAChB;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,UAAU,UAA+B,CAAC,GAAgB;AAnI1E;AAoIE,QAAM,UAAU,sBAAqB,aAAQ,YAAR,YAAmB,cAAc;AACtE,QAAM,aAAa,MACjB;AAAA,IACE;AAAA,MACE,eAAe,OAAO,cAAc;AAAA,QAClC,QAAQ,QAAQ;AAAA,MAClB,CAAC,CAAC;AAAA,MACF,GAAG,QAAQ;AAAA,IACb;AAAA,IACA,cAAc,OAAO;AAAA,EACvB;AAEF,QAAM,mBAAmB,CAAC,YACxB,IAAI,cAAc,SAAS;AAAA,IACzB,UAAU;AAAA,IACV,SAAS,4BAAW;AAAA,IACpB,SAAS;AAAA,IACT,OAAO,QAAQ;AAAA,EACjB,CAAC;AAEH,QAAM,oBAAoB,CAAC,YACzB,IAAI,eAAe,SAAS;AAAA,IAC1B,UAAU;AAAA,IACV,KAAK,CAAC,EAAE,KAAK,MAAM;AAAA,IACnB,SAAS;AAAA,IACT,OAAO,QAAQ;AAAA,EACjB,CAAC;AAEH,QAAM,2BAA2B,CAAC,YAChC,IAAI,sBAAsB,SAAS;AAAA,IACjC,UAAU;AAAA,IACV,KAAK,CAAC,EAAE,KAAK,MAAM;AAAA,IACnB,SAAS;AAAA,IACT,OAAO,QAAQ;AAAA,EACjB,CAAC;AAEH,QAAM,mBAAmB,CAAC,YACxB,IAAI,cAAc,SAAS;AAAA,IACzB,UAAU;AAAA,IACV,KAAK,CAAC,EAAE,KAAK,MAAM;AAAA,IACnB,SAAS;AAAA,IACT,OAAO,QAAQ;AAAA,EACjB,CAAC;AAEH,QAAM,iBAAiB,CAAC,YAAoB;AAC1C,UAAM,IAAI,iBAAiB;AAAA,MACzB;AAAA,MACA,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,sBAAsB;AAAA,IACtB,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,eAAe,CAAC,YAAoB;AAClC,YAAM,IAAI,iBAAiB;AAAA,QACzB;AAAA,QACA,WAAW;AAAA,MACb,CAAC;AAAA,IACH;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA,oBAAoB;AAAA,IACpB,eAAe;AAAA,IACf,OAAO;AAAA,IACP,YAAY;AAAA,EACd;AACF;AAKO,IAAM,MAAM,UAAU;","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","AISDKError","combineHeaders","convertImageModelFileToDataUri","createJsonErrorResponseHandler","createJsonResponseHandler","delay","getFromApi","lazySchema","parseProviderOptions","postJsonToApi","zodSchema","z","lazySchema","zodSchema","z","parseProviderOptions","convertImageModelFileToDataUri","postJsonToApi","combineHeaders","falFailedResponseHandler","createJsonResponseHandler","falJobResponseSchema","AISDKError","getFromApi","response","body","createJsonErrorResponseHandler","delay"]}
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/fal-video-model.ts","../src/version.ts"],"sourcesContent":["import {\n NoSuchModelError,\n type Experimental_VideoModelV3,\n type ImageModelV3,\n type ProviderV3,\n type SpeechModelV3,\n type TranscriptionModelV3,\n} from '@ai-sdk/provider';\nimport {\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { FalImageModel } from './fal-image-model';\nimport type { FalImageModelId } from './fal-image-settings';\nimport type { FalTranscriptionModelId } from './fal-transcription-options';\nimport { FalTranscriptionModel } from './fal-transcription-model';\nimport type { FalSpeechModelId } from './fal-speech-settings';\nimport { FalSpeechModel } from './fal-speech-model';\nimport { FalVideoModel } from './fal-video-model';\nimport type { FalVideoModelId } from './fal-video-settings';\nimport { VERSION } from './version';\n\nexport interface FalProviderSettings {\n /**\n * fal.ai API key. Default value is taken from the `FAL_API_KEY` environment\n * variable, falling back to `FAL_KEY`.\n */\n apiKey?: string;\n\n /**\n * Base URL for the API calls.\n * The default prefix is `https://fal.run`.\n */\n baseURL?: string;\n\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept\n * requests, or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport interface FalProvider extends ProviderV3 {\n /**\n * Creates a model for image generation.\n */\n image(modelId: FalImageModelId): ImageModelV3;\n\n /**\n * Creates a model for image generation.\n */\n imageModel(modelId: FalImageModelId): ImageModelV3;\n\n /**\n * Creates a model for transcription.\n */\n transcription(modelId: FalTranscriptionModelId): TranscriptionModelV3;\n\n /**\n * Creates a model for video generation.\n */\n video(modelId: FalVideoModelId): Experimental_VideoModelV3;\n\n /**\n * Creates a model for video generation.\n */\n videoModel(modelId: FalVideoModelId): Experimental_VideoModelV3;\n\n /**\n * Creates 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/**\n * Create 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 createVideoModel = (modelId: FalVideoModelId) =>\n new FalVideoModel(modelId, {\n provider: 'fal.video',\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 video: createVideoModel,\n videoModel: createVideoModel,\n };\n}\n\n/**\n * Default fal.ai provider instance.\n */\nexport const fal = createFal();\n","import type { ImageModelV3, SharedV3Warning } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertImageModelFileToDataUri,\n createBinaryResponseHandler,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n createStatusCodeErrorResponseHandler,\n getFromApi,\n parseProviderOptions,\n postJsonToApi,\n resolve,\n type Resolvable,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport type { FalImageModelId, FalImageSize } from './fal-image-settings';\nimport { falImageModelOptionsSchema } 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: falImageModelOptionsSchema,\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/**\n * Converts 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 {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport const falImageModelOptionsSchema = 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 FalImageModelOptions = InferSchema<\n typeof falImageModelOptionsSchema\n>;\n","import {\n AISDKError,\n type TranscriptionModelV3,\n type 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 type { FalConfig } from './fal-config';\nimport { falErrorDataSchema, falFailedResponseHandler } from './fal-error';\nimport type { FalTranscriptionModelId } from './fal-transcription-options';\nimport type { FalTranscriptionAPITypes } from './fal-api-types';\n\n// https://fal.ai/models/fal-ai/whisper/api?platform=http\nconst falTranscriptionModelOptionsSchema = 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 FalTranscriptionModelOptions = z.infer<\n typeof falTranscriptionModelOptionsSchema\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: falTranscriptionModelOptionsSchema,\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 type { 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 type { FalConfig } from './fal-config';\nimport { falFailedResponseHandler } from './fal-error';\nimport { FAL_EMOTIONS, FAL_LANGUAGE_BOOSTS } from './fal-api-types';\nimport type { FalSpeechModelId } from './fal-speech-settings';\n\nconst falSpeechModelOptionsSchema = 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 FalSpeechModelOptions = z.infer<typeof falSpeechModelOptionsSchema>;\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: falSpeechModelOptionsSchema,\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","import {\n AISDKError,\n type Experimental_VideoModelV3,\n type SharedV3Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertImageModelFileToDataUri,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n delay,\n getFromApi,\n isSameOrigin,\n lazySchema,\n parseProviderOptions,\n postJsonToApi,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport type { FalConfig } from './fal-config';\nimport { falErrorDataSchema, falFailedResponseHandler } from './fal-error';\nimport type { FalVideoModelId } from './fal-video-settings';\n\nexport type FalVideoModelOptions = {\n loop?: boolean | null;\n motionStrength?: number | null;\n pollIntervalMs?: number | null;\n pollTimeoutMs?: number | null;\n resolution?: string | null;\n negativePrompt?: string | null;\n promptOptimizer?: boolean | null;\n [key: string]: unknown; // For passthrough\n};\n\n// Provider options schema for FAL video generation\nexport const falVideoModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z\n .object({\n // Video loop - only for Luma models\n loop: z.boolean().nullish(),\n\n // Motion strength (provider-specific)\n motionStrength: z.number().min(0).max(1).nullish(),\n\n // Polling configuration\n pollIntervalMs: z.number().positive().nullish(),\n pollTimeoutMs: z.number().positive().nullish(),\n\n // Resolution (model-specific, e.g., '480p', '720p', '1080p')\n resolution: z.string().nullish(),\n\n // Model-specific parameters\n negativePrompt: z.string().nullish(),\n promptOptimizer: z.boolean().nullish(),\n })\n .passthrough(),\n ),\n);\n\ninterface FalVideoModelConfig extends FalConfig {\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class FalVideoModel implements Experimental_VideoModelV3 {\n readonly specificationVersion = 'v3';\n readonly maxVideosPerCall = 1; // FAL video models support 1 video at a time\n\n get provider(): string {\n return this.config.provider;\n }\n\n private get normalizedModelId(): string {\n return this.modelId.replace(/^fal-ai\\//, '').replace(/^fal\\//, '');\n }\n\n constructor(\n readonly modelId: FalVideoModelId,\n private readonly config: FalVideoModelConfig,\n ) {}\n\n async doGenerate(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<Experimental_VideoModelV3['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const warnings: SharedV3Warning[] = [];\n\n const falOptions = (await parseProviderOptions({\n provider: 'fal',\n providerOptions: options.providerOptions,\n schema: falVideoModelOptionsSchema,\n })) as FalVideoModelOptions | undefined;\n\n const body: Record<string, unknown> = {};\n\n if (options.prompt != null) {\n body.prompt = options.prompt;\n }\n\n if (options.image != null) {\n if (options.image.type === 'url') {\n body.image_url = options.image.url;\n } else {\n body.image_url = convertImageModelFileToDataUri(options.image);\n }\n }\n\n if (options.aspectRatio) {\n body.aspect_ratio = options.aspectRatio;\n }\n\n if (options.duration) {\n body.duration = `${options.duration}s`;\n }\n\n if (options.seed) {\n body.seed = options.seed;\n }\n\n if (falOptions != null) {\n const opts = falOptions;\n if (opts.loop !== undefined && opts.loop !== null) {\n body.loop = opts.loop;\n }\n if (opts.motionStrength !== undefined && opts.motionStrength !== null) {\n body.motion_strength = opts.motionStrength;\n }\n if (opts.resolution !== undefined && opts.resolution !== null) {\n body.resolution = opts.resolution;\n }\n if (opts.negativePrompt !== undefined && opts.negativePrompt !== null) {\n body.negative_prompt = opts.negativePrompt;\n }\n if (opts.promptOptimizer !== undefined && opts.promptOptimizer !== null) {\n body.prompt_optimizer = opts.promptOptimizer;\n }\n\n for (const [key, value] of Object.entries(opts)) {\n if (\n ![\n 'loop',\n 'motionStrength',\n 'pollIntervalMs',\n 'pollTimeoutMs',\n 'resolution',\n 'negativePrompt',\n 'promptOptimizer',\n ].includes(key)\n ) {\n body[key] = value;\n }\n }\n }\n\n const submitUrl = this.config.url({\n path: `https://queue.fal.run/fal-ai/${this.normalizedModelId}`,\n modelId: this.modelId,\n });\n const { value: queueResponse } = await postJsonToApi({\n url: submitUrl,\n headers: combineHeaders(this.config.headers(), options.headers),\n body,\n failedResponseHandler: falFailedResponseHandler,\n successfulResponseHandler:\n createJsonResponseHandler(falJobResponseSchema),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const responseUrl = queueResponse.response_url;\n if (!responseUrl) {\n throw new AISDKError({\n name: 'FAL_VIDEO_GENERATION_ERROR',\n message: 'No response URL returned from queue endpoint',\n });\n }\n\n const pollIntervalMs = falOptions?.pollIntervalMs ?? 2000; // 2 seconds\n const pollTimeoutMs = falOptions?.pollTimeoutMs ?? 300000; // 5 minutes\n const startTime = Date.now();\n let response: FalVideoResponse;\n let responseHeaders: Record<string, string> | undefined;\n\n while (true) {\n try {\n const statusUrl = this.config.url({\n path: responseUrl,\n modelId: this.modelId,\n });\n const { value: statusResponse, responseHeaders: statusHeaders } =\n await getFromApi({\n url: statusUrl,\n // The status URL comes from the queue response; only send\n // credentials when it stays on the provider's own origin.\n headers: isSameOrigin(statusUrl, submitUrl)\n ? combineHeaders(this.config.headers(), options.headers)\n : undefined,\n failedResponseHandler: async ({\n response,\n url,\n requestBodyValues,\n }) => {\n const body = await response.clone().json();\n\n if (body.detail === 'Request is still in progress') {\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 })({ response, url, requestBodyValues });\n },\n successfulResponseHandler: createJsonResponseHandler(\n falVideoResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n response = statusResponse;\n responseHeaders = statusHeaders;\n break;\n } catch (error) {\n if (\n error instanceof Error &&\n error.message === 'Request is still in progress'\n ) {\n // Continue polling\n } else {\n throw error;\n }\n }\n\n if (Date.now() - startTime > pollTimeoutMs) {\n throw new AISDKError({\n name: 'FAL_VIDEO_GENERATION_TIMEOUT',\n message: `Video generation request timed out after ${pollTimeoutMs}ms`,\n });\n }\n\n await delay(pollIntervalMs);\n\n if (options.abortSignal?.aborted) {\n throw new AISDKError({\n name: 'FAL_VIDEO_GENERATION_ABORTED',\n message: 'Video generation request was aborted',\n });\n }\n }\n\n const videoUrl = response.video?.url;\n\n if (!videoUrl || !response.video) {\n throw new AISDKError({\n name: 'FAL_VIDEO_GENERATION_ERROR',\n message: 'No video URL in response',\n });\n }\n\n return {\n videos: [\n {\n type: 'url',\n url: videoUrl,\n mediaType: response.video.content_type || 'video/mp4',\n },\n ],\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n providerMetadata: {\n fal: {\n videos: [\n {\n url: videoUrl,\n width: response.video.width,\n height: response.video.height,\n duration: response.video.duration,\n fps: response.video.fps,\n contentType: response.video.content_type,\n },\n ],\n ...(response.seed !== undefined ? { seed: response.seed } : {}),\n ...(response.timings ? { timings: response.timings } : {}),\n ...(response.has_nsfw_concepts !== undefined\n ? { has_nsfw_concepts: response.has_nsfw_concepts }\n : {}),\n ...(response.prompt ? { prompt: response.prompt } : {}),\n },\n },\n };\n }\n}\n\nconst falJobResponseSchema = z.object({\n request_id: z.string().nullish(),\n response_url: z.string().nullish(),\n});\n\nconst falVideoResponseSchema = z.object({\n video: z\n .object({\n url: z.string(),\n width: z.number().nullish(),\n height: z.number().nullish(),\n duration: z.number().nullish(),\n fps: z.number().nullish(),\n content_type: z.string().nullish(),\n })\n .nullish(),\n seed: z.number().nullish(),\n timings: z\n .object({\n inference: z.number().nullish(),\n })\n .nullish(),\n has_nsfw_concepts: z.array(z.boolean()).nullish(),\n prompt: z.string().nullish(),\n});\n\ntype FalVideoResponse = z.infer<typeof falVideoResponseSchema>;\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","AISDKError","combineHeaders","convertImageModelFileToDataUri","createJsonErrorResponseHandler","createJsonResponseHandler","delay","getFromApi","lazySchema","parseProviderOptions","postJsonToApi","zodSchema","z","lazySchema","zodSchema","z","parseProviderOptions","convertImageModelFileToDataUri","postJsonToApi","combineHeaders","falFailedResponseHandler","createJsonResponseHandler","falJobResponseSchema","AISDKError","getFromApi","response","body","createJsonErrorResponseHandler","delay"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/fal",
3
- "version": "2.0.35",
3
+ "version": "2.0.37",
4
4
  "license": "Apache-2.0",
5
5
  "sideEffects": false,
6
6
  "main": "./dist/index.js",
@@ -30,7 +30,7 @@
30
30
  },
31
31
  "dependencies": {
32
32
  "@ai-sdk/provider": "3.0.10",
33
- "@ai-sdk/provider-utils": "4.0.28"
33
+ "@ai-sdk/provider-utils": "4.0.30"
34
34
  },
35
35
  "devDependencies": {
36
36
  "@types/node": "20.17.24",
@@ -10,6 +10,7 @@ import {
10
10
  createJsonResponseHandler,
11
11
  delay,
12
12
  getFromApi,
13
+ isSameOrigin,
13
14
  lazySchema,
14
15
  parseProviderOptions,
15
16
  postJsonToApi,
@@ -153,11 +154,12 @@ export class FalVideoModel implements Experimental_VideoModelV3 {
153
154
  }
154
155
  }
155
156
 
157
+ const submitUrl = this.config.url({
158
+ path: `https://queue.fal.run/fal-ai/${this.normalizedModelId}`,
159
+ modelId: this.modelId,
160
+ });
156
161
  const { value: queueResponse } = await postJsonToApi({
157
- url: this.config.url({
158
- path: `https://queue.fal.run/fal-ai/${this.normalizedModelId}`,
159
- modelId: this.modelId,
160
- }),
162
+ url: submitUrl,
161
163
  headers: combineHeaders(this.config.headers(), options.headers),
162
164
  body,
163
165
  failedResponseHandler: falFailedResponseHandler,
@@ -183,13 +185,18 @@ export class FalVideoModel implements Experimental_VideoModelV3 {
183
185
 
184
186
  while (true) {
185
187
  try {
188
+ const statusUrl = this.config.url({
189
+ path: responseUrl,
190
+ modelId: this.modelId,
191
+ });
186
192
  const { value: statusResponse, responseHeaders: statusHeaders } =
187
193
  await getFromApi({
188
- url: this.config.url({
189
- path: responseUrl,
190
- modelId: this.modelId,
191
- }),
192
- headers: combineHeaders(this.config.headers(), options.headers),
194
+ url: statusUrl,
195
+ // The status URL comes from the queue response; only send
196
+ // credentials when it stays on the provider's own origin.
197
+ headers: isSameOrigin(statusUrl, submitUrl)
198
+ ? combineHeaders(this.config.headers(), options.headers)
199
+ : undefined,
193
200
  failedResponseHandler: async ({
194
201
  response,
195
202
  url,