@apicity/fal 0.1.0-alpha.0

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.
@@ -0,0 +1,1108 @@
1
+ import { z } from "zod";
2
+ // ---------------------------------------------------------------------------
3
+ // Pricing estimate
4
+ // ---------------------------------------------------------------------------
5
+ export const FalPricingEstimateRequestSchema = z.object({
6
+ estimate_type: z.enum(["historical_api_price", "unit_price"]),
7
+ endpoints: z.record(z.string(), z.unknown()),
8
+ });
9
+ // ---------------------------------------------------------------------------
10
+ // Queue submit
11
+ // ---------------------------------------------------------------------------
12
+ export const FalQueueSubmitRequestSchema = z.object({
13
+ endpoint_id: z.string(),
14
+ input: z.record(z.string(), z.unknown()),
15
+ webhook: z.string().optional(),
16
+ priority: z.enum(["normal", "low"]).optional(),
17
+ timeout: z.number().optional(),
18
+ no_retry: z.boolean().optional(),
19
+ runner_hint: z.string().optional(),
20
+ store_io: z.string().optional(),
21
+ object_lifecycle_preference: z.string().optional(),
22
+ });
23
+ // ---------------------------------------------------------------------------
24
+ // Logs stream
25
+ // ---------------------------------------------------------------------------
26
+ export const FalLogsStreamRequestSchema = z.object({
27
+ start: z.string().optional(),
28
+ end: z.string().optional(),
29
+ app_id: z.array(z.string()).optional(),
30
+ revision: z.string().optional(),
31
+ run_source: z
32
+ .enum(["grpc-run", "grpc-register", "gateway", "cron"])
33
+ .optional(),
34
+ traceback: z.boolean().optional(),
35
+ search: z.string().optional(),
36
+ level: z.string().optional(),
37
+ job_id: z.string().optional(),
38
+ request_id: z.string().optional(),
39
+ });
40
+ // ---------------------------------------------------------------------------
41
+ // Files upload URL
42
+ // ---------------------------------------------------------------------------
43
+ export const FalFilesUploadUrlRequestSchema = z.object({
44
+ file: z.string(),
45
+ url: z.string(),
46
+ });
47
+ // ---------------------------------------------------------------------------
48
+ // Files upload local
49
+ // ---------------------------------------------------------------------------
50
+ const blobSchema = z.instanceof(Blob);
51
+ export const FalFilesUploadLocalRequestSchema = z.object({
52
+ target_path: z.string(),
53
+ file: blobSchema,
54
+ filename: z.string().optional(),
55
+ unzip: z.boolean().optional(),
56
+ });
57
+ // ---------------------------------------------------------------------------
58
+ // Delete payloads
59
+ // ---------------------------------------------------------------------------
60
+ export const FalDeletePayloadsRequestSchema = z.object({
61
+ request_id: z.string(),
62
+ idempotency_key: z.string().optional(),
63
+ });
64
+ // ---------------------------------------------------------------------------
65
+ // Bytedance Seedance 2.0 image-to-video
66
+ // ---------------------------------------------------------------------------
67
+ export const FalSeedance2p0ImageToVideoRequestSchema = z.object({
68
+ prompt: z.string(),
69
+ image_url: z.string(),
70
+ end_image_url: z.string().optional(),
71
+ resolution: z.enum(["480p", "720p"]).optional(),
72
+ duration: z
73
+ .enum([
74
+ "auto",
75
+ "4",
76
+ "5",
77
+ "6",
78
+ "7",
79
+ "8",
80
+ "9",
81
+ "10",
82
+ "11",
83
+ "12",
84
+ "13",
85
+ "14",
86
+ "15",
87
+ ])
88
+ .optional(),
89
+ aspect_ratio: z
90
+ .enum(["auto", "21:9", "16:9", "4:3", "1:1", "3:4", "9:16"])
91
+ .optional(),
92
+ generate_audio: z.boolean().optional(),
93
+ seed: z.number().optional(),
94
+ end_user_id: z.string().optional(),
95
+ });
96
+ // ---------------------------------------------------------------------------
97
+ // Bytedance Seedance 2.0 text-to-video
98
+ // ---------------------------------------------------------------------------
99
+ export const FalSeedance2p0TextToVideoRequestSchema = z.object({
100
+ prompt: z.string(),
101
+ resolution: z.enum(["480p", "720p"]).optional(),
102
+ duration: z
103
+ .enum([
104
+ "auto",
105
+ "4",
106
+ "5",
107
+ "6",
108
+ "7",
109
+ "8",
110
+ "9",
111
+ "10",
112
+ "11",
113
+ "12",
114
+ "13",
115
+ "14",
116
+ "15",
117
+ ])
118
+ .optional(),
119
+ aspect_ratio: z
120
+ .enum(["auto", "21:9", "16:9", "4:3", "1:1", "3:4", "9:16"])
121
+ .optional(),
122
+ generate_audio: z.boolean().optional(),
123
+ seed: z.number().optional(),
124
+ end_user_id: z.string().optional(),
125
+ });
126
+ // ---------------------------------------------------------------------------
127
+ // Bytedance Seedance 2.0 Fast image-to-video
128
+ // ---------------------------------------------------------------------------
129
+ export const FalSeedance2p0FastImageToVideoRequestSchema = z.object({
130
+ prompt: z.string(),
131
+ image_url: z.string(),
132
+ end_image_url: z.string().optional(),
133
+ resolution: z.enum(["480p", "720p"]).optional(),
134
+ duration: z
135
+ .enum([
136
+ "auto",
137
+ "4",
138
+ "5",
139
+ "6",
140
+ "7",
141
+ "8",
142
+ "9",
143
+ "10",
144
+ "11",
145
+ "12",
146
+ "13",
147
+ "14",
148
+ "15",
149
+ ])
150
+ .optional(),
151
+ aspect_ratio: z
152
+ .enum(["auto", "21:9", "16:9", "4:3", "1:1", "3:4", "9:16"])
153
+ .optional(),
154
+ generate_audio: z.boolean().optional(),
155
+ seed: z.number().optional(),
156
+ end_user_id: z.string().optional(),
157
+ });
158
+ // ---------------------------------------------------------------------------
159
+ // Bytedance Seedance 2.0 Fast text-to-video
160
+ // ---------------------------------------------------------------------------
161
+ export const FalSeedance2p0FastTextToVideoRequestSchema = z.object({
162
+ prompt: z.string(),
163
+ resolution: z.enum(["480p", "720p"]).optional(),
164
+ duration: z
165
+ .enum([
166
+ "auto",
167
+ "4",
168
+ "5",
169
+ "6",
170
+ "7",
171
+ "8",
172
+ "9",
173
+ "10",
174
+ "11",
175
+ "12",
176
+ "13",
177
+ "14",
178
+ "15",
179
+ ])
180
+ .optional(),
181
+ aspect_ratio: z
182
+ .enum(["auto", "21:9", "16:9", "4:3", "1:1", "3:4", "9:16"])
183
+ .optional(),
184
+ generate_audio: z.boolean().optional(),
185
+ seed: z.number().optional(),
186
+ end_user_id: z.string().optional(),
187
+ });
188
+ // ---------------------------------------------------------------------------
189
+ // Bytedance Seedance 2.0 reference-to-video
190
+ // ---------------------------------------------------------------------------
191
+ const Seedance2p0ReferenceDurationSchema = z.enum([
192
+ "auto",
193
+ "4",
194
+ "5",
195
+ "6",
196
+ "7",
197
+ "8",
198
+ "9",
199
+ "10",
200
+ "11",
201
+ "12",
202
+ "13",
203
+ "14",
204
+ "15",
205
+ ]);
206
+ const Seedance2p0ReferenceAspectRatioSchema = z.enum([
207
+ "auto",
208
+ "21:9",
209
+ "16:9",
210
+ "4:3",
211
+ "1:1",
212
+ "3:4",
213
+ "9:16",
214
+ ]);
215
+ export const FalSeedance2p0ReferenceToVideoRequestSchema = z.object({
216
+ prompt: z.string(),
217
+ image_urls: z.array(z.string()).max(9).optional(),
218
+ video_urls: z.array(z.string()).max(3).optional(),
219
+ audio_urls: z.array(z.string()).max(3).optional(),
220
+ resolution: z.enum(["480p", "720p"]).optional(),
221
+ duration: Seedance2p0ReferenceDurationSchema.optional(),
222
+ aspect_ratio: Seedance2p0ReferenceAspectRatioSchema.optional(),
223
+ generate_audio: z.boolean().optional(),
224
+ seed: z.number().int().optional(),
225
+ end_user_id: z.string().optional(),
226
+ });
227
+ // ---------------------------------------------------------------------------
228
+ // Bytedance Seedance 2.0 Fast reference-to-video
229
+ // ---------------------------------------------------------------------------
230
+ export const FalSeedance2p0FastReferenceToVideoRequestSchema = z.object({
231
+ prompt: z.string(),
232
+ image_urls: z.array(z.string()).max(9).optional(),
233
+ video_urls: z.array(z.string()).max(3).optional(),
234
+ audio_urls: z.array(z.string()).max(3).optional(),
235
+ resolution: z.enum(["480p", "720p"]).optional(),
236
+ duration: Seedance2p0ReferenceDurationSchema.optional(),
237
+ aspect_ratio: Seedance2p0ReferenceAspectRatioSchema.optional(),
238
+ generate_audio: z.boolean().optional(),
239
+ seed: z.number().int().optional(),
240
+ end_user_id: z.string().optional(),
241
+ });
242
+ // ---------------------------------------------------------------------------
243
+ // Nano Banana 2 text-to-image
244
+ // ---------------------------------------------------------------------------
245
+ export const FalNanoBanana2TextToImageRequestSchema = z.object({
246
+ prompt: z.string(),
247
+ num_images: z.number().optional(),
248
+ seed: z.number().optional(),
249
+ aspect_ratio: z
250
+ .enum([
251
+ "auto",
252
+ "21:9",
253
+ "16:9",
254
+ "3:2",
255
+ "4:3",
256
+ "5:4",
257
+ "1:1",
258
+ "4:5",
259
+ "3:4",
260
+ "2:3",
261
+ "9:16",
262
+ "4:1",
263
+ "1:4",
264
+ "8:1",
265
+ "1:8",
266
+ ])
267
+ .optional(),
268
+ output_format: z.enum(["jpeg", "png", "webp"]).optional(),
269
+ safety_tolerance: z.enum(["1", "2", "3", "4", "5", "6"]).optional(),
270
+ sync_mode: z.boolean().optional(),
271
+ resolution: z.enum(["0.5K", "1K", "2K", "4K"]).optional(),
272
+ limit_generations: z.boolean().optional(),
273
+ enable_web_search: z.boolean().optional(),
274
+ thinking_level: z.enum(["minimal", "high"]).optional(),
275
+ });
276
+ // ---------------------------------------------------------------------------
277
+ // Nano Banana 2 edit
278
+ // ---------------------------------------------------------------------------
279
+ export const FalNanoBanana2EditRequestSchema = z.object({
280
+ prompt: z.string(),
281
+ image_urls: z.array(z.string()),
282
+ num_images: z.number().optional(),
283
+ seed: z.number().optional(),
284
+ aspect_ratio: z
285
+ .enum([
286
+ "auto",
287
+ "21:9",
288
+ "16:9",
289
+ "3:2",
290
+ "4:3",
291
+ "5:4",
292
+ "1:1",
293
+ "4:5",
294
+ "3:4",
295
+ "2:3",
296
+ "9:16",
297
+ "4:1",
298
+ "1:4",
299
+ "8:1",
300
+ "1:8",
301
+ ])
302
+ .optional(),
303
+ output_format: z.enum(["jpeg", "png", "webp"]).optional(),
304
+ safety_tolerance: z.enum(["1", "2", "3", "4", "5", "6"]).optional(),
305
+ sync_mode: z.boolean().optional(),
306
+ resolution: z.enum(["0.5K", "1K", "2K", "4K"]).optional(),
307
+ limit_generations: z.boolean().optional(),
308
+ enable_web_search: z.boolean().optional(),
309
+ thinking_level: z.enum(["minimal", "high"]).optional(),
310
+ });
311
+ // ---------------------------------------------------------------------------
312
+ // Nano Banana text-to-image
313
+ // ---------------------------------------------------------------------------
314
+ export const FalNanoBananaTextToImageRequestSchema = z.object({
315
+ prompt: z.string().min(3).max(50000),
316
+ num_images: z.number().int().min(1).max(4).optional(),
317
+ aspect_ratio: z
318
+ .enum([
319
+ "21:9",
320
+ "16:9",
321
+ "3:2",
322
+ "4:3",
323
+ "5:4",
324
+ "1:1",
325
+ "4:5",
326
+ "3:4",
327
+ "2:3",
328
+ "9:16",
329
+ ])
330
+ .optional(),
331
+ output_format: z.enum(["jpeg", "png", "webp"]).optional(),
332
+ safety_tolerance: z.enum(["1", "2", "3", "4", "5", "6"]).optional(),
333
+ seed: z.number().optional(),
334
+ sync_mode: z.boolean().optional(),
335
+ limit_generations: z.boolean().optional(),
336
+ });
337
+ // ---------------------------------------------------------------------------
338
+ // Nano Banana edit
339
+ // ---------------------------------------------------------------------------
340
+ export const FalNanoBananaEditRequestSchema = z.object({
341
+ prompt: z.string().min(3).max(50000),
342
+ image_urls: z.array(z.string()),
343
+ num_images: z.number().int().min(1).max(4).optional(),
344
+ aspect_ratio: z
345
+ .enum([
346
+ "auto",
347
+ "21:9",
348
+ "16:9",
349
+ "3:2",
350
+ "4:3",
351
+ "5:4",
352
+ "1:1",
353
+ "4:5",
354
+ "3:4",
355
+ "2:3",
356
+ "9:16",
357
+ ])
358
+ .optional(),
359
+ output_format: z.enum(["jpeg", "png", "webp"]).optional(),
360
+ safety_tolerance: z.enum(["1", "2", "3", "4", "5", "6"]).optional(),
361
+ seed: z.number().optional(),
362
+ sync_mode: z.boolean().optional(),
363
+ limit_generations: z.boolean().optional(),
364
+ });
365
+ // ---------------------------------------------------------------------------
366
+ // GPT Image 1.5 text-to-image
367
+ // ---------------------------------------------------------------------------
368
+ export const FalGptImage1p5RequestSchema = z.object({
369
+ prompt: z.string().min(2).max(32000),
370
+ image_size: z.enum(["1024x1024", "1536x1024", "1024x1536"]).optional(),
371
+ num_images: z.number().int().min(1).max(4).optional(),
372
+ background: z.enum(["auto", "transparent", "opaque"]).optional(),
373
+ output_format: z.enum(["jpeg", "png", "webp"]).optional(),
374
+ quality: z.enum(["low", "medium", "high"]).optional(),
375
+ sync_mode: z.boolean().optional(),
376
+ });
377
+ // ---------------------------------------------------------------------------
378
+ // GPT Image 1.5 edit
379
+ // ---------------------------------------------------------------------------
380
+ export const FalGptImage1p5EditRequestSchema = z.object({
381
+ prompt: z.string().min(2).max(32000),
382
+ image_urls: z.array(z.string()),
383
+ image_size: z
384
+ .enum(["auto", "1024x1024", "1536x1024", "1024x1536"])
385
+ .optional(),
386
+ background: z.enum(["auto", "transparent", "opaque"]).optional(),
387
+ quality: z.enum(["low", "medium", "high"]).optional(),
388
+ num_images: z.number().int().min(1).max(4).optional(),
389
+ input_fidelity: z.enum(["low", "high"]).optional(),
390
+ output_format: z.enum(["jpeg", "png", "webp"]).optional(),
391
+ sync_mode: z.boolean().optional(),
392
+ mask_image_url: z.string().optional(),
393
+ });
394
+ // ---------------------------------------------------------------------------
395
+ // Qwen Image text-to-image
396
+ // ---------------------------------------------------------------------------
397
+ export const FalQwenImageRequestSchema = z.object({
398
+ prompt: z.string(),
399
+ image_size: z
400
+ .union([
401
+ z.enum([
402
+ "square_hd",
403
+ "square",
404
+ "portrait_4_3",
405
+ "portrait_16_9",
406
+ "landscape_4_3",
407
+ "landscape_16_9",
408
+ ]),
409
+ z.object({ width: z.number(), height: z.number() }),
410
+ ])
411
+ .optional(),
412
+ num_inference_steps: z.number().int().min(2).max(250).optional(),
413
+ seed: z.number().int().optional(),
414
+ guidance_scale: z.number().min(0).max(20).optional(),
415
+ num_images: z.number().int().min(1).max(4).optional(),
416
+ output_format: z.enum(["jpeg", "png"]).optional(),
417
+ negative_prompt: z.string().optional(),
418
+ acceleration: z.enum(["none", "regular", "high"]).optional(),
419
+ sync_mode: z.boolean().optional(),
420
+ enable_safety_checker: z.boolean().optional(),
421
+ use_turbo: z.boolean().optional(),
422
+ });
423
+ // ---------------------------------------------------------------------------
424
+ // Qwen Image edit
425
+ // ---------------------------------------------------------------------------
426
+ export const FalQwenImageEditRequestSchema = z.object({
427
+ prompt: z.string(),
428
+ image_url: z.string(),
429
+ num_images: z.number().int().min(1).max(4).optional(),
430
+ num_inference_steps: z.number().int().min(2).max(50).optional(),
431
+ guidance_scale: z.number().min(0).max(20).optional(),
432
+ seed: z.number().int().optional(),
433
+ negative_prompt: z.string().optional(),
434
+ image_size: z
435
+ .union([
436
+ z.enum([
437
+ "square_hd",
438
+ "square",
439
+ "portrait_4_3",
440
+ "portrait_16_9",
441
+ "landscape_4_3",
442
+ "landscape_16_9",
443
+ ]),
444
+ z.object({ width: z.number(), height: z.number() }),
445
+ ])
446
+ .optional(),
447
+ output_format: z.enum(["jpeg", "png"]).optional(),
448
+ enable_safety_checker: z.boolean().optional(),
449
+ acceleration: z.enum(["none", "regular", "high"]).optional(),
450
+ sync_mode: z.boolean().optional(),
451
+ });
452
+ // ---------------------------------------------------------------------------
453
+ // Nano Banana Pro text-to-image
454
+ // ---------------------------------------------------------------------------
455
+ export const FalNanoBananaProTextToImageRequestSchema = z.object({
456
+ prompt: z.string(),
457
+ num_images: z.number().optional(),
458
+ seed: z.number().optional(),
459
+ aspect_ratio: z
460
+ .enum([
461
+ "auto",
462
+ "21:9",
463
+ "16:9",
464
+ "3:2",
465
+ "4:3",
466
+ "5:4",
467
+ "1:1",
468
+ "4:5",
469
+ "3:4",
470
+ "2:3",
471
+ "9:16",
472
+ ])
473
+ .optional(),
474
+ output_format: z.enum(["jpeg", "png", "webp"]).optional(),
475
+ safety_tolerance: z.enum(["1", "2", "3", "4", "5", "6"]).optional(),
476
+ sync_mode: z.boolean().optional(),
477
+ resolution: z.enum(["1K", "2K", "4K"]).optional(),
478
+ limit_generations: z.boolean().optional(),
479
+ enable_web_search: z.boolean().optional(),
480
+ });
481
+ // ---------------------------------------------------------------------------
482
+ // Nano Banana Pro edit
483
+ // ---------------------------------------------------------------------------
484
+ export const FalNanoBananaProEditRequestSchema = z.object({
485
+ prompt: z.string(),
486
+ image_urls: z.array(z.string()),
487
+ num_images: z.number().optional(),
488
+ seed: z.number().optional(),
489
+ aspect_ratio: z
490
+ .enum([
491
+ "auto",
492
+ "21:9",
493
+ "16:9",
494
+ "3:2",
495
+ "4:3",
496
+ "5:4",
497
+ "1:1",
498
+ "4:5",
499
+ "3:4",
500
+ "2:3",
501
+ "9:16",
502
+ ])
503
+ .optional(),
504
+ output_format: z.enum(["jpeg", "png", "webp"]).optional(),
505
+ safety_tolerance: z.enum(["1", "2", "3", "4", "5", "6"]).optional(),
506
+ sync_mode: z.boolean().optional(),
507
+ resolution: z.enum(["1K", "2K", "4K"]).optional(),
508
+ limit_generations: z.boolean().optional(),
509
+ enable_web_search: z.boolean().optional(),
510
+ });
511
+ // ---------------------------------------------------------------------------
512
+ // Bytedance Seedream v5 Lite (shared image_size)
513
+ // ---------------------------------------------------------------------------
514
+ const FalSeedreamV5LiteImageSizeSchema = z.union([
515
+ z.enum([
516
+ "square_hd",
517
+ "square",
518
+ "portrait_4_3",
519
+ "portrait_16_9",
520
+ "landscape_4_3",
521
+ "landscape_16_9",
522
+ "auto_2K",
523
+ "auto_3K",
524
+ ]),
525
+ z.object({ width: z.number(), height: z.number() }),
526
+ ]);
527
+ // ---------------------------------------------------------------------------
528
+ // Bytedance Seedream v5 Lite edit
529
+ // ---------------------------------------------------------------------------
530
+ export const FalSeedreamV5LiteEditRequestSchema = z.object({
531
+ prompt: z.string(),
532
+ image_urls: z.array(z.string()).min(1).max(10),
533
+ image_size: FalSeedreamV5LiteImageSizeSchema.optional(),
534
+ num_images: z.number().optional(),
535
+ max_images: z.number().optional(),
536
+ sync_mode: z.boolean().optional(),
537
+ enable_safety_checker: z.boolean().optional(),
538
+ });
539
+ // ---------------------------------------------------------------------------
540
+ // Bytedance Seedream v5 Lite text-to-image
541
+ // ---------------------------------------------------------------------------
542
+ export const FalSeedreamV5LiteTextToImageRequestSchema = z.object({
543
+ prompt: z.string(),
544
+ image_size: FalSeedreamV5LiteImageSizeSchema.optional(),
545
+ num_images: z.number().optional(),
546
+ max_images: z.number().optional(),
547
+ sync_mode: z.boolean().optional(),
548
+ enable_safety_checker: z.boolean().optional(),
549
+ });
550
+ // ---------------------------------------------------------------------------
551
+ // Wan v2.7 text-to-image
552
+ // ---------------------------------------------------------------------------
553
+ const FalWanV2p7ImageSizeSchema = z.union([
554
+ z.enum([
555
+ "square_hd",
556
+ "square",
557
+ "portrait_4_3",
558
+ "portrait_16_9",
559
+ "landscape_4_3",
560
+ "landscape_16_9",
561
+ ]),
562
+ z.object({
563
+ width: z.number().int().positive(),
564
+ height: z.number().int().positive(),
565
+ }),
566
+ ]);
567
+ const FalWanV2p7AspectRatioSchema = z.enum([
568
+ "16:9",
569
+ "9:16",
570
+ "1:1",
571
+ "4:3",
572
+ "3:4",
573
+ ]);
574
+ const FalWanV2p7ResolutionSchema = z.enum(["720p", "1080p"]);
575
+ const FalWanV2p7AudioSettingSchema = z.enum(["auto", "origin"]);
576
+ export const FalWanV2p7TextToImageRequestSchema = z.object({
577
+ prompt: z.string().min(1).max(500),
578
+ negative_prompt: z.string().max(500).optional(),
579
+ image_size: FalWanV2p7ImageSizeSchema.optional(),
580
+ max_images: z.number().int().min(1).max(5).optional(),
581
+ seed: z.number().int().min(0).max(2147483647).optional(),
582
+ enable_safety_checker: z.boolean().optional(),
583
+ });
584
+ // ---------------------------------------------------------------------------
585
+ // Wan v2.7 edit (image-to-image)
586
+ // ---------------------------------------------------------------------------
587
+ export const FalWanV2p7EditRequestSchema = z.object({
588
+ prompt: z.string().min(1).max(500),
589
+ image_urls: z.array(z.string().url()).min(1).max(4),
590
+ negative_prompt: z.string().max(500).optional(),
591
+ image_size: FalWanV2p7ImageSizeSchema.optional(),
592
+ num_images: z.number().int().min(1).max(4).optional(),
593
+ enable_prompt_expansion: z.boolean().optional(),
594
+ seed: z.number().int().min(0).max(2147483647).optional(),
595
+ enable_safety_checker: z.boolean().optional(),
596
+ });
597
+ // ---------------------------------------------------------------------------
598
+ // Hunyuan Image v3 Instruct Edit (image-to-image)
599
+ // ---------------------------------------------------------------------------
600
+ const FalHunyuanImageV3ImageSizeSchema = z.union([
601
+ z.enum([
602
+ "square_hd",
603
+ "square",
604
+ "portrait_4_3",
605
+ "portrait_16_9",
606
+ "landscape_4_3",
607
+ "landscape_16_9",
608
+ "auto",
609
+ ]),
610
+ z.object({
611
+ width: z.number().int().positive(),
612
+ height: z.number().int().positive(),
613
+ }),
614
+ ]);
615
+ export const FalHunyuanImageV3InstructEditRequestSchema = z.object({
616
+ prompt: z.string(),
617
+ image_urls: z.array(z.string().url()).min(1).max(3),
618
+ image_size: FalHunyuanImageV3ImageSizeSchema.optional(),
619
+ num_images: z.number().int().min(1).max(4).optional(),
620
+ guidance_scale: z.number().min(1).max(20).optional(),
621
+ seed: z.number().int().optional(),
622
+ enable_safety_checker: z.boolean().optional(),
623
+ sync_mode: z.boolean().optional(),
624
+ output_format: z.enum(["jpeg", "png"]).optional(),
625
+ });
626
+ // ---------------------------------------------------------------------------
627
+ // Wan v2.7 text-to-video
628
+ // ---------------------------------------------------------------------------
629
+ export const FalWanV2p7TextToVideoRequestSchema = z.object({
630
+ prompt: z.string().min(1).max(5000),
631
+ audio_url: z.string().url().optional(),
632
+ aspect_ratio: FalWanV2p7AspectRatioSchema.optional(),
633
+ resolution: FalWanV2p7ResolutionSchema.optional(),
634
+ duration: z.number().int().min(2).max(15).optional(),
635
+ negative_prompt: z.string().max(500).optional(),
636
+ enable_prompt_expansion: z.boolean().optional(),
637
+ seed: z.number().int().min(0).max(2147483647).optional(),
638
+ enable_safety_checker: z.boolean().optional(),
639
+ });
640
+ // ---------------------------------------------------------------------------
641
+ // Wan v2.7 image-to-video
642
+ // ---------------------------------------------------------------------------
643
+ export const FalWanV2p7ImageToVideoRequestSchema = z.object({
644
+ prompt: z.string().min(1).max(5000),
645
+ image_url: z.string().url(),
646
+ end_image_url: z.string().url().optional(),
647
+ video_url: z.string().url().optional(),
648
+ audio_url: z.string().url().optional(),
649
+ resolution: FalWanV2p7ResolutionSchema.optional(),
650
+ duration: z.number().int().min(2).max(15).optional(),
651
+ negative_prompt: z.string().max(500).optional(),
652
+ enable_prompt_expansion: z.boolean().optional(),
653
+ seed: z.number().int().min(0).max(2147483647).optional(),
654
+ enable_safety_checker: z.boolean().optional(),
655
+ });
656
+ // ---------------------------------------------------------------------------
657
+ // Wan v2.7 reference-to-video
658
+ // ---------------------------------------------------------------------------
659
+ export const FalWanV2p7ReferenceToVideoRequestSchema = z
660
+ .object({
661
+ prompt: z.string().min(1).max(5000),
662
+ reference_image_urls: z.array(z.string().url()).max(4).optional(),
663
+ reference_video_urls: z.array(z.string().url()).max(4).optional(),
664
+ negative_prompt: z.string().max(500).optional(),
665
+ aspect_ratio: FalWanV2p7AspectRatioSchema.optional(),
666
+ resolution: FalWanV2p7ResolutionSchema.optional(),
667
+ duration: z.number().int().min(2).max(10).optional(),
668
+ multi_shots: z.boolean().optional(),
669
+ seed: z.number().int().min(0).max(2147483647).optional(),
670
+ enable_safety_checker: z.boolean().optional(),
671
+ })
672
+ .refine((v) => (v.reference_image_urls && v.reference_image_urls.length > 0) ||
673
+ (v.reference_video_urls && v.reference_video_urls.length > 0), {
674
+ message: "wan/v2.7/reference-to-video requires at least one of reference_image_urls or reference_video_urls",
675
+ path: ["reference_image_urls"],
676
+ });
677
+ // ---------------------------------------------------------------------------
678
+ // Wan v2.7 edit-video
679
+ // ---------------------------------------------------------------------------
680
+ export const FalWanV2p7EditVideoRequestSchema = z.object({
681
+ prompt: z.string().min(1).max(5000),
682
+ video_url: z.string().url(),
683
+ reference_image_url: z.string().url().optional(),
684
+ resolution: FalWanV2p7ResolutionSchema.optional(),
685
+ aspect_ratio: FalWanV2p7AspectRatioSchema.optional(),
686
+ duration: z.number().int().min(0).max(10).optional(),
687
+ audio_setting: FalWanV2p7AudioSettingSchema.optional(),
688
+ negative_prompt: z.string().max(500).optional(),
689
+ seed: z.number().int().min(0).max(2147483647).optional(),
690
+ enable_safety_checker: z.boolean().optional(),
691
+ });
692
+ // ---------------------------------------------------------------------------
693
+ // xAI Grok Imagine Image
694
+ // ---------------------------------------------------------------------------
695
+ export const FalXaiGrokImagineImageRequestSchema = z.object({
696
+ prompt: z.string(),
697
+ num_images: z.number().int().min(1).max(4).optional(),
698
+ aspect_ratio: z
699
+ .enum([
700
+ "2:1",
701
+ "20:9",
702
+ "19.5:9",
703
+ "16:9",
704
+ "4:3",
705
+ "3:2",
706
+ "1:1",
707
+ "2:3",
708
+ "3:4",
709
+ "9:16",
710
+ "9:19.5",
711
+ "9:20",
712
+ "1:2",
713
+ ])
714
+ .optional(),
715
+ resolution: z.enum(["1k", "2k"]).optional(),
716
+ output_format: z.enum(["jpeg", "png", "webp"]).optional(),
717
+ sync_mode: z.boolean().optional(),
718
+ });
719
+ // ---------------------------------------------------------------------------
720
+ // xAI Grok Imagine Image edit
721
+ // ---------------------------------------------------------------------------
722
+ export const FalXaiGrokImagineImageEditRequestSchema = z.object({
723
+ prompt: z.string(),
724
+ num_images: z.number().int().min(1).max(4).optional(),
725
+ resolution: z.enum(["1k", "2k"]).optional(),
726
+ output_format: z.enum(["jpeg", "png", "webp"]).optional(),
727
+ sync_mode: z.boolean().optional(),
728
+ image_urls: z.array(z.string()).max(3).optional(),
729
+ });
730
+ // ---------------------------------------------------------------------------
731
+ // Sora 2 text-to-video
732
+ // ---------------------------------------------------------------------------
733
+ export const FalSora2TextToVideoRequestSchema = z.object({
734
+ prompt: z.string().max(5000),
735
+ model: z
736
+ .enum(["sora-2", "sora-2-2025-12-08", "sora-2-2025-10-06"])
737
+ .optional(),
738
+ resolution: z.enum(["720p"]).optional(),
739
+ aspect_ratio: z.enum(["9:16", "16:9"]).optional(),
740
+ duration: z
741
+ .union([
742
+ z.literal(4),
743
+ z.literal(8),
744
+ z.literal(12),
745
+ z.literal(16),
746
+ z.literal(20),
747
+ ])
748
+ .optional(),
749
+ delete_video: z.boolean().optional(),
750
+ character_ids: z.array(z.string()).max(2).optional(),
751
+ detect_and_block_ip: z.boolean().optional(),
752
+ });
753
+ // ---------------------------------------------------------------------------
754
+ // Sora 2 image-to-video
755
+ // ---------------------------------------------------------------------------
756
+ export const FalSora2ImageToVideoRequestSchema = z.object({
757
+ prompt: z.string().max(5000),
758
+ image_url: z.string(),
759
+ model: z
760
+ .enum(["sora-2", "sora-2-2025-12-08", "sora-2-2025-10-06"])
761
+ .optional(),
762
+ resolution: z.enum(["auto", "720p"]).optional(),
763
+ aspect_ratio: z.enum(["auto", "9:16", "16:9"]).optional(),
764
+ duration: z
765
+ .union([
766
+ z.literal(4),
767
+ z.literal(8),
768
+ z.literal(12),
769
+ z.literal(16),
770
+ z.literal(20),
771
+ ])
772
+ .optional(),
773
+ delete_video: z.boolean().optional(),
774
+ character_ids: z.array(z.string()).max(2).optional(),
775
+ detect_and_block_ip: z.boolean().optional(),
776
+ });
777
+ // ---------------------------------------------------------------------------
778
+ // Kling Video v3 Pro image-to-video
779
+ // ---------------------------------------------------------------------------
780
+ export const FalKlingVideoV3ProImageToVideoRequestSchema = z.object({
781
+ start_image_url: z.string(),
782
+ prompt: z.string().max(2500).optional(),
783
+ multi_prompt: z
784
+ .array(z.object({
785
+ prompt: z.string(),
786
+ duration: z.string().optional(),
787
+ }))
788
+ .optional(),
789
+ end_image_url: z.string().optional(),
790
+ duration: z.string().optional(),
791
+ generate_audio: z.boolean().optional(),
792
+ shot_type: z.enum(["customize"]).optional(),
793
+ negative_prompt: z.string().max(2500).optional(),
794
+ cfg_scale: z.number().min(0).max(1).optional(),
795
+ elements: z
796
+ .array(z.object({
797
+ frontal_image_url: z.string().optional(),
798
+ reference_image_urls: z.array(z.string()).optional(),
799
+ video_url: z.string().optional(),
800
+ voice_id: z.string().optional(),
801
+ }))
802
+ .optional(),
803
+ });
804
+ // ---------------------------------------------------------------------------
805
+ // Storage upload (CDN) — initiate single PUT and multipart
806
+ // ---------------------------------------------------------------------------
807
+ const FalStorageLifecycleSchema = z.object({
808
+ expiration_duration_seconds: z.number().int().positive(),
809
+ allow_io_storage: z.boolean().optional(),
810
+ });
811
+ export const FalStorageUploadInitiateRequestSchema = z.object({
812
+ file_name: z.string(),
813
+ content_type: z.string(),
814
+ storage_type: z.literal("fal-cdn-v3").optional(),
815
+ lifecycle: FalStorageLifecycleSchema.optional(),
816
+ });
817
+ export const FalStorageUploadInitiateMultipartRequestSchema = z.object({
818
+ file_name: z.string(),
819
+ content_type: z.string(),
820
+ storage_type: z.literal("fal-cdn-v3").optional(),
821
+ lifecycle: FalStorageLifecycleSchema.optional(),
822
+ });
823
+ export const FalStorageUploadCompleteMultipartRequestSchema = z.object({
824
+ upload_url: z.string(),
825
+ parts: z
826
+ .array(z.object({
827
+ partNumber: z.number().int().positive(),
828
+ etag: z.string(),
829
+ }))
830
+ .min(1),
831
+ });
832
+ // ---------------------------------------------------------------------------
833
+ // Kling Video v3 Pro text-to-video
834
+ // ---------------------------------------------------------------------------
835
+ export const FalKlingVideoV3ProTextToVideoRequestSchema = z.object({
836
+ prompt: z.string().max(2500).optional(),
837
+ multi_prompt: z
838
+ .array(z.object({
839
+ prompt: z.string(),
840
+ duration: z.string().optional(),
841
+ }))
842
+ .optional(),
843
+ duration: z.string().optional(),
844
+ generate_audio: z.boolean().optional(),
845
+ shot_type: z.enum(["customize", "intelligent"]).optional(),
846
+ aspect_ratio: z.enum(["16:9", "9:16", "1:1"]).optional(),
847
+ negative_prompt: z.string().max(2500).optional(),
848
+ cfg_scale: z.number().min(0).max(2).optional(),
849
+ });
850
+ // ---------------------------------------------------------------------------
851
+ // Kling Video v3 Standard image-to-video
852
+ // ---------------------------------------------------------------------------
853
+ export const FalKlingVideoV3StandardImageToVideoRequestSchema = z.object({
854
+ start_image_url: z.string(),
855
+ prompt: z.string().max(2500).optional(),
856
+ multi_prompt: z
857
+ .array(z.object({
858
+ prompt: z.string(),
859
+ duration: z.string().optional(),
860
+ }))
861
+ .optional(),
862
+ end_image_url: z.string().optional(),
863
+ duration: z.string().optional(),
864
+ generate_audio: z.boolean().optional(),
865
+ shot_type: z.enum(["customize", "intelligent"]).optional(),
866
+ negative_prompt: z.string().max(2500).optional(),
867
+ cfg_scale: z.number().min(0).max(2).optional(),
868
+ elements: z
869
+ .array(z.object({
870
+ frontal_image_url: z.string().optional(),
871
+ reference_image_urls: z.array(z.string()).optional(),
872
+ video_url: z.string().optional(),
873
+ voice_id: z.string().optional(),
874
+ }))
875
+ .optional(),
876
+ });
877
+ // ---------------------------------------------------------------------------
878
+ // Kling Video v3 Standard text-to-video
879
+ // ---------------------------------------------------------------------------
880
+ export const FalKlingVideoV3StandardTextToVideoRequestSchema = z.object({
881
+ prompt: z.string().max(2500).optional(),
882
+ multi_prompt: z
883
+ .array(z.object({
884
+ prompt: z.string(),
885
+ duration: z.string().optional(),
886
+ }))
887
+ .optional(),
888
+ duration: z.string().optional(),
889
+ generate_audio: z.boolean().optional(),
890
+ shot_type: z.enum(["customize", "intelligent"]).optional(),
891
+ aspect_ratio: z.enum(["16:9", "9:16", "1:1"]).optional(),
892
+ negative_prompt: z.string().max(2500).optional(),
893
+ cfg_scale: z.number().min(0).max(2).optional(),
894
+ });
895
+ // ---------------------------------------------------------------------------
896
+ // Veo 3.1 text-to-video
897
+ // ---------------------------------------------------------------------------
898
+ export const FalVeo3p1TextToVideoRequestSchema = z.object({
899
+ prompt: z.string().max(20000),
900
+ aspect_ratio: z.enum(["16:9", "9:16"]).optional(),
901
+ duration: z.enum(["4s", "6s", "8s"]).optional(),
902
+ resolution: z.enum(["720p", "1080p", "4k"]).optional(),
903
+ generate_audio: z.boolean().optional(),
904
+ negative_prompt: z.string().optional(),
905
+ seed: z.number().int().optional(),
906
+ auto_fix: z.boolean().optional(),
907
+ safety_tolerance: z.enum(["1", "2", "3", "4", "5", "6"]).optional(),
908
+ });
909
+ // ---------------------------------------------------------------------------
910
+ // Veo 3.1 image-to-video
911
+ // ---------------------------------------------------------------------------
912
+ export const FalVeo3p1ImageToVideoRequestSchema = z.object({
913
+ prompt: z.string().max(20000),
914
+ image_url: z.string(),
915
+ aspect_ratio: z.enum(["auto", "16:9", "9:16"]).optional(),
916
+ duration: z.enum(["4s", "6s", "8s"]).optional(),
917
+ resolution: z.enum(["720p", "1080p", "4k"]).optional(),
918
+ generate_audio: z.boolean().optional(),
919
+ negative_prompt: z.string().optional(),
920
+ seed: z.number().int().optional(),
921
+ auto_fix: z.boolean().optional(),
922
+ safety_tolerance: z.enum(["1", "2", "3", "4", "5", "6"]).optional(),
923
+ });
924
+ // ---------------------------------------------------------------------------
925
+ // xAI Grok Imagine Video image-to-video
926
+ // ---------------------------------------------------------------------------
927
+ export const FalXaiGrokImagineVideoImageToVideoRequestSchema = z.object({
928
+ prompt: z.string().max(4096),
929
+ image_url: z.string(),
930
+ duration: z.number().int().min(1).max(15).optional(),
931
+ aspect_ratio: z
932
+ .enum(["auto", "16:9", "4:3", "3:2", "1:1", "2:3", "3:4", "9:16"])
933
+ .optional(),
934
+ resolution: z.enum(["480p", "720p"]).optional(),
935
+ });
936
+ // ---------------------------------------------------------------------------
937
+ // xAI Grok Imagine Video reference-to-video
938
+ // ---------------------------------------------------------------------------
939
+ export const FalXaiGrokImagineVideoReferenceToVideoRequestSchema = z.object({
940
+ prompt: z.string(),
941
+ reference_image_urls: z.array(z.string()).max(7),
942
+ duration: z.number().int().min(1).max(10).optional(),
943
+ aspect_ratio: z
944
+ .enum(["16:9", "4:3", "3:2", "1:1", "2:3", "3:4", "9:16"])
945
+ .optional(),
946
+ resolution: z.enum(["480p", "720p"]).optional(),
947
+ });
948
+ // ---------------------------------------------------------------------------
949
+ // xAI Grok Imagine Video extend-video
950
+ // ---------------------------------------------------------------------------
951
+ // Upstream server-side invariant: source video length + `duration` must be
952
+ // <= 15 seconds total, else it 422s with `video_duration_too_long`. Source
953
+ // length isn't a request parameter, so this can't be validated client-side;
954
+ // it's captured in `.describe()` below.
955
+ export const FalXaiGrokImagineVideoExtendVideoRequestSchema = z.object({
956
+ prompt: z.string(),
957
+ video_url: z
958
+ .string()
959
+ .describe("Source video URL. MP4 (H.264/H.265/AV1), 2-15s. Source length + `duration` must not exceed 15s total."),
960
+ duration: z
961
+ .number()
962
+ .int()
963
+ .min(2)
964
+ .max(10)
965
+ .optional()
966
+ .describe("Extension length in seconds (2-10, default 6). Source video length + this value must not exceed 15s total (server-enforced)."),
967
+ });
968
+ // ---------------------------------------------------------------------------
969
+ // xAI Grok Imagine Video edit-video
970
+ // ---------------------------------------------------------------------------
971
+ export const FalXaiGrokImagineVideoEditVideoRequestSchema = z.object({
972
+ prompt: z.string(),
973
+ video_url: z.string(),
974
+ resolution: z.enum(["auto", "480p", "720p"]).optional(),
975
+ });
976
+ // ---------------------------------------------------------------------------
977
+ // ElevenLabs Speech to Text Scribe V2
978
+ // ---------------------------------------------------------------------------
979
+ export const FalElevenlabsSpeechToTextScribeV2RequestSchema = z.object({
980
+ audio_url: z.string(),
981
+ language_code: z.string().optional(),
982
+ tag_audio_events: z.boolean().optional(),
983
+ diarize: z.boolean().optional(),
984
+ keyterms: z.array(z.string()).optional(),
985
+ });
986
+ // ---------------------------------------------------------------------------
987
+ // Options
988
+ // ---------------------------------------------------------------------------
989
+ export const FalOptionsSchema = z.object({
990
+ apiKey: z.string().min(1),
991
+ baseURL: z.string().url().optional(),
992
+ queueBaseURL: z.string().url().optional(),
993
+ runBaseURL: z.string().url().optional(),
994
+ restBaseURL: z.string().url().optional(),
995
+ timeout: z.number().int().positive().optional(),
996
+ fetch: z
997
+ .custom()
998
+ .optional(),
999
+ });
1000
+ // ---------------------------------------------------------------------------
1001
+ // Kling Video o3 4k image-to-video
1002
+ // ---------------------------------------------------------------------------
1003
+ export const FalKlingVideoO3p4kImageToVideoRequestSchema = z.object({
1004
+ prompt: z.string().optional(),
1005
+ image_url: z.string(),
1006
+ end_image_url: z.string().optional(),
1007
+ duration: z
1008
+ .enum([
1009
+ "3",
1010
+ "4",
1011
+ "5",
1012
+ "6",
1013
+ "7",
1014
+ "8",
1015
+ "9",
1016
+ "10",
1017
+ "11",
1018
+ "12",
1019
+ "13",
1020
+ "14",
1021
+ "15",
1022
+ ])
1023
+ .optional(),
1024
+ generate_audio: z.boolean().optional(),
1025
+ multi_prompt: z
1026
+ .array(z.object({
1027
+ prompt: z.string(),
1028
+ duration: z.string().optional(),
1029
+ }))
1030
+ .optional(),
1031
+ shot_type: z.string().optional(),
1032
+ });
1033
+ // ---------------------------------------------------------------------------
1034
+ // Kling Video o3 4k reference-to-video
1035
+ // ---------------------------------------------------------------------------
1036
+ export const FalKlingVideoO3p4kReferenceToVideoRequestSchema = z.object({
1037
+ prompt: z.string().optional(),
1038
+ multi_prompt: z
1039
+ .array(z.object({
1040
+ prompt: z.string(),
1041
+ duration: z.string().optional(),
1042
+ }))
1043
+ .optional(),
1044
+ start_image_url: z.string().optional(),
1045
+ end_image_url: z.string().optional(),
1046
+ image_urls: z.array(z.string()).optional(),
1047
+ elements: z
1048
+ .array(z.object({
1049
+ frontal_image_url: z.string().optional(),
1050
+ reference_image_urls: z.array(z.string()).optional(),
1051
+ video_url: z.string().optional(),
1052
+ voice_id: z.string().optional(),
1053
+ }))
1054
+ .optional(),
1055
+ generate_audio: z.boolean().optional(),
1056
+ duration: z
1057
+ .enum([
1058
+ "3",
1059
+ "4",
1060
+ "5",
1061
+ "6",
1062
+ "7",
1063
+ "8",
1064
+ "9",
1065
+ "10",
1066
+ "11",
1067
+ "12",
1068
+ "13",
1069
+ "14",
1070
+ "15",
1071
+ ])
1072
+ .optional(),
1073
+ shot_type: z.string().optional(),
1074
+ aspect_ratio: z.enum(["16:9", "9:16", "1:1"]).optional(),
1075
+ });
1076
+ // ---------------------------------------------------------------------------
1077
+ // Kling Video o3 4k text-to-video
1078
+ // ---------------------------------------------------------------------------
1079
+ export const FalKlingVideoO3p4kTextToVideoRequestSchema = z.object({
1080
+ prompt: z.string().optional(),
1081
+ duration: z
1082
+ .enum([
1083
+ "3",
1084
+ "4",
1085
+ "5",
1086
+ "6",
1087
+ "7",
1088
+ "8",
1089
+ "9",
1090
+ "10",
1091
+ "11",
1092
+ "12",
1093
+ "13",
1094
+ "14",
1095
+ "15",
1096
+ ])
1097
+ .optional(),
1098
+ aspect_ratio: z.enum(["16:9", "9:16", "1:1"]).optional(),
1099
+ generate_audio: z.boolean().optional(),
1100
+ multi_prompt: z
1101
+ .array(z.object({
1102
+ prompt: z.string(),
1103
+ duration: z.string().optional(),
1104
+ }))
1105
+ .optional(),
1106
+ shot_type: z.string().optional(),
1107
+ });
1108
+ //# sourceMappingURL=zod.js.map