( apiKey: string, body: ImageToolBody, requestId: string, logger: ReturnType<typeof createLogger> )
| 730 | } |
| 731 | |
| 732 | async function generateWithFalAI( |
| 733 | apiKey: string, |
| 734 | body: ImageToolBody, |
| 735 | requestId: string, |
| 736 | logger: ReturnType<typeof createLogger> |
| 737 | ): Promise<GeneratedImageResult> { |
| 738 | const model = body.model || 'nano-banana-2' |
| 739 | const modelConfig = FALAI_IMAGE_MODEL_CONFIGS[model] |
| 740 | if (!modelConfig) { |
| 741 | throw new Error(`Unknown Fal.ai image model: ${model}`) |
| 742 | } |
| 743 | |
| 744 | const requestBody: Record<string, string | number | boolean> = { |
| 745 | prompt: body.prompt, |
| 746 | sync_mode: false, |
| 747 | } |
| 748 | |
| 749 | if (modelConfig.maxNumImages) { |
| 750 | requestBody.num_images = clampInteger(body.numImages, 1, modelConfig.maxNumImages, 1) |
| 751 | } |
| 752 | if (modelConfig.supportsSeed && body.seed !== undefined) { |
| 753 | requestBody.seed = body.seed |
| 754 | } |
| 755 | if (modelConfig.sizeOptions && modelConfig.defaultSize) { |
| 756 | requestBody.image_size = pickAllowed( |
| 757 | body.size, |
| 758 | modelConfig.sizeOptions, |
| 759 | modelConfig.defaultSize |
| 760 | ) |
| 761 | } |
| 762 | if (modelConfig.aspectRatios && modelConfig.defaultAspectRatio) { |
| 763 | requestBody.aspect_ratio = pickAllowed( |
| 764 | body.aspectRatio, |
| 765 | modelConfig.aspectRatios, |
| 766 | modelConfig.defaultAspectRatio |
| 767 | ) |
| 768 | } |
| 769 | if (modelConfig.resolutionOptions && modelConfig.defaultResolution) { |
| 770 | requestBody.resolution = pickAllowed( |
| 771 | body.resolution, |
| 772 | modelConfig.resolutionOptions, |
| 773 | modelConfig.defaultResolution |
| 774 | ) |
| 775 | } |
| 776 | if (modelConfig.outputFormats && modelConfig.defaultOutputFormat) { |
| 777 | requestBody.output_format = pickAllowed( |
| 778 | body.outputFormat, |
| 779 | modelConfig.outputFormats, |
| 780 | modelConfig.defaultOutputFormat |
| 781 | ) |
| 782 | } |
| 783 | if (modelConfig.qualityOptions && modelConfig.defaultQuality) { |
| 784 | requestBody.quality = pickAllowed( |
| 785 | body.quality, |
| 786 | modelConfig.qualityOptions, |
| 787 | modelConfig.defaultQuality |
| 788 | ) |
| 789 | } |
no test coverage detected