( apiKey: string, model: string, prompt: string, duration: number | undefined, aspectRatio: string | undefined, resolution: string | undefined, promptOptimizer: boolean | undefined, generateAudio: boolean | undefined, useHostedCostTracking: boolean, requestId: string, logger: ReturnType<typeof createLogger> )
| 1169 | } |
| 1170 | |
| 1171 | async function generateWithFalAI( |
| 1172 | apiKey: string, |
| 1173 | model: string, |
| 1174 | prompt: string, |
| 1175 | duration: number | undefined, |
| 1176 | aspectRatio: string | undefined, |
| 1177 | resolution: string | undefined, |
| 1178 | promptOptimizer: boolean | undefined, |
| 1179 | generateAudio: boolean | undefined, |
| 1180 | useHostedCostTracking: boolean, |
| 1181 | requestId: string, |
| 1182 | logger: ReturnType<typeof createLogger> |
| 1183 | ): Promise<{ |
| 1184 | buffer: Buffer |
| 1185 | width: number |
| 1186 | height: number |
| 1187 | jobId: string |
| 1188 | duration: number |
| 1189 | falaiCost?: FalAICostMetadata |
| 1190 | }> { |
| 1191 | logger.info(`[${requestId}] Starting Fal.ai generation with model: ${model}`) |
| 1192 | |
| 1193 | const modelConfig = FALAI_MODEL_CONFIGS[model] |
| 1194 | if (!modelConfig) { |
| 1195 | throw new Error(`Unknown Fal.ai model: ${model}`) |
| 1196 | } |
| 1197 | |
| 1198 | const requestBody: FalAIRequestBody = { prompt } |
| 1199 | const formattedDuration = formatFalAIDuration(modelConfig.durationFormat, duration) |
| 1200 | |
| 1201 | if (formattedDuration !== undefined) { |
| 1202 | requestBody.duration = formattedDuration |
| 1203 | } |
| 1204 | |
| 1205 | if (modelConfig.supportsAspectRatio && aspectRatio) { |
| 1206 | requestBody.aspect_ratio = aspectRatio |
| 1207 | } |
| 1208 | |
| 1209 | if (modelConfig.supportsResolution && resolution) { |
| 1210 | requestBody.resolution = resolution |
| 1211 | } |
| 1212 | |
| 1213 | if (modelConfig.supportsPromptOptimizer && promptOptimizer !== undefined) { |
| 1214 | requestBody.prompt_optimizer = promptOptimizer |
| 1215 | } |
| 1216 | |
| 1217 | if (modelConfig.supportsGenerateAudio && generateAudio !== undefined) { |
| 1218 | requestBody.generate_audio = generateAudio |
| 1219 | } |
| 1220 | |
| 1221 | const createResponse = await fetch(`https://queue.fal.run/${modelConfig.endpoint}`, { |
| 1222 | method: 'POST', |
| 1223 | headers: { |
| 1224 | Authorization: `Key ${apiKey}`, |
| 1225 | 'Content-Type': 'application/json', |
| 1226 | }, |
| 1227 | body: JSON.stringify(requestBody), |
| 1228 | }) |
no test coverage detected