vidspotai-shared 1.0.70 → 1.0.71-dev.1

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.
Files changed (504) hide show
  1. package/lib/globals/aiModels/enums.d.ts +63 -6
  2. package/lib/globals/aiModels/enums.d.ts.map +1 -1
  3. package/lib/globals/aiModels/enums.js +78 -9
  4. package/lib/globals/aiModels/index.d.ts +10 -3
  5. package/lib/globals/aiModels/index.d.ts.map +1 -1
  6. package/lib/globals/aiModels/index.js +14 -3
  7. package/lib/globals/aiModels/providers/alibaba.d.ts +4 -0
  8. package/lib/globals/aiModels/providers/alibaba.d.ts.map +1 -0
  9. package/lib/globals/aiModels/providers/alibaba.js +194 -0
  10. package/lib/globals/aiModels/providers/bytedance.d.ts.map +1 -1
  11. package/lib/globals/aiModels/providers/bytedance.js +19 -0
  12. package/lib/globals/aiModels/providers/elevenlabs.d.ts +14 -0
  13. package/lib/globals/aiModels/providers/elevenlabs.d.ts.map +1 -0
  14. package/lib/globals/aiModels/providers/elevenlabs.js +29 -0
  15. package/lib/globals/aiModels/providers/google.d.ts.map +1 -1
  16. package/lib/globals/aiModels/providers/google.js +150 -2
  17. package/lib/globals/aiModels/providers/kling.d.ts.map +1 -1
  18. package/lib/globals/aiModels/providers/kling.js +280 -37
  19. package/lib/globals/aiModels/providers/minimax.d.ts.map +1 -1
  20. package/lib/globals/aiModels/providers/minimax.js +73 -2
  21. package/lib/globals/aiModels/providers/openai.d.ts.map +1 -1
  22. package/lib/globals/aiModels/providers/openai.js +90 -6
  23. package/lib/globals/aiModels/providers/pixverse.d.ts.map +1 -1
  24. package/lib/globals/aiModels/providers/pixverse.js +111 -29
  25. package/lib/globals/aiModels/providers/pixverseTemplates.d.ts +36 -0
  26. package/lib/globals/aiModels/providers/pixverseTemplates.d.ts.map +1 -0
  27. package/lib/globals/aiModels/providers/pixverseTemplates.js +42 -0
  28. package/lib/globals/aiModels/providers/runway.d.ts.map +1 -1
  29. package/lib/globals/aiModels/providers/runway.js +64 -2
  30. package/lib/globals/aiModels/tierHelpers.d.ts +33 -0
  31. package/lib/globals/aiModels/tierHelpers.d.ts.map +1 -0
  32. package/lib/globals/aiModels/tierHelpers.js +109 -0
  33. package/lib/globals/aiModels/types.d.ts +20 -1
  34. package/lib/globals/aiModels/types.d.ts.map +1 -1
  35. package/lib/globals/ttsModels/index.d.ts +2 -0
  36. package/lib/globals/ttsModels/index.d.ts.map +1 -1
  37. package/lib/globals/ttsModels/index.js +9 -1
  38. package/lib/globals/ttsModels/providers/minimax.d.ts +8 -0
  39. package/lib/globals/ttsModels/providers/minimax.d.ts.map +1 -0
  40. package/lib/globals/ttsModels/providers/minimax.js +18 -0
  41. package/lib/globals/ttsModels/providers/openai.d.ts +12 -0
  42. package/lib/globals/ttsModels/providers/openai.d.ts.map +1 -0
  43. package/lib/globals/ttsModels/providers/openai.js +22 -0
  44. package/lib/globals/ttsModels/types.d.ts +1 -1
  45. package/lib/globals/ttsModels/types.d.ts.map +1 -1
  46. package/lib/globals/ttsModels/voices.d.ts +39 -4
  47. package/lib/globals/ttsModels/voices.d.ts.map +1 -1
  48. package/lib/globals/ttsModels/voices.js +273 -26
  49. package/lib/globals/types.d.ts +59 -1
  50. package/lib/globals/types.d.ts.map +1 -1
  51. package/lib/globals/types.js +81 -2
  52. package/lib/index.d.ts +1 -0
  53. package/lib/index.d.ts.map +1 -1
  54. package/lib/index.js +1 -0
  55. package/lib/models/agent.model.d.ts +363 -0
  56. package/lib/models/agent.model.d.ts.map +1 -0
  57. package/lib/models/agent.model.js +21 -0
  58. package/lib/models/cachedAsset.model.d.ts +18 -0
  59. package/lib/models/cachedAsset.model.d.ts.map +1 -0
  60. package/lib/models/cachedAsset.model.js +2 -0
  61. package/lib/models/cachedRawAsset.model.d.ts +20 -0
  62. package/lib/models/cachedRawAsset.model.d.ts.map +1 -0
  63. package/lib/models/cachedRawAsset.model.js +2 -0
  64. package/lib/models/image.model.d.ts +47 -0
  65. package/lib/models/image.model.d.ts.map +1 -0
  66. package/lib/models/image.model.js +2 -0
  67. package/lib/models/index.d.ts +7 -0
  68. package/lib/models/index.d.ts.map +1 -1
  69. package/lib/models/index.js +7 -0
  70. package/lib/models/mediaUpload.model.d.ts +19 -0
  71. package/lib/models/mediaUpload.model.d.ts.map +1 -0
  72. package/lib/models/mediaUpload.model.js +2 -0
  73. package/lib/models/notification.model.d.ts +25 -0
  74. package/lib/models/notification.model.d.ts.map +1 -0
  75. package/lib/models/notification.model.js +2 -0
  76. package/lib/models/ref.model.d.ts +80 -0
  77. package/lib/models/ref.model.d.ts.map +1 -0
  78. package/lib/models/ref.model.js +13 -0
  79. package/lib/models/share.model.d.ts +29 -0
  80. package/lib/models/share.model.d.ts.map +1 -0
  81. package/lib/models/share.model.js +2 -0
  82. package/lib/models/user.model.d.ts +12 -1
  83. package/lib/models/user.model.d.ts.map +1 -1
  84. package/lib/models/video.model.d.ts +120 -0
  85. package/lib/models/video.model.d.ts.map +1 -1
  86. package/lib/models/video.model.js +10 -0
  87. package/lib/schemas/agentPersona.schema.d.ts +10 -0
  88. package/lib/schemas/agentPersona.schema.d.ts.map +1 -0
  89. package/lib/schemas/agentPersona.schema.js +11 -0
  90. package/lib/schemas/agentRunJob.schema.d.ts +105 -0
  91. package/lib/schemas/agentRunJob.schema.d.ts.map +1 -0
  92. package/lib/schemas/agentRunJob.schema.js +88 -0
  93. package/lib/schemas/brandKit.schema.d.ts +113 -0
  94. package/lib/schemas/brandKit.schema.d.ts.map +1 -0
  95. package/lib/schemas/brandKit.schema.js +46 -0
  96. package/lib/schemas/brief.schema.d.ts +263 -0
  97. package/lib/schemas/brief.schema.d.ts.map +1 -0
  98. package/lib/schemas/brief.schema.js +157 -0
  99. package/lib/schemas/index.d.ts +7 -0
  100. package/lib/schemas/index.d.ts.map +1 -0
  101. package/lib/schemas/index.js +22 -0
  102. package/lib/schemas/project.schema.d.ts +1025 -0
  103. package/lib/schemas/project.schema.d.ts.map +1 -0
  104. package/lib/schemas/project.schema.js +256 -0
  105. package/lib/schemas/videoPlan.schema.d.ts +590 -0
  106. package/lib/schemas/videoPlan.schema.d.ts.map +1 -0
  107. package/lib/schemas/videoPlan.schema.js +412 -0
  108. package/lib/services/agent/beatSnap.d.ts +10 -0
  109. package/lib/services/agent/beatSnap.d.ts.map +1 -0
  110. package/lib/services/agent/beatSnap.js +128 -0
  111. package/lib/services/agent/bibleBuilder.d.ts +43 -0
  112. package/lib/services/agent/bibleBuilder.d.ts.map +1 -0
  113. package/lib/services/agent/bibleBuilder.js +102 -0
  114. package/lib/services/agent/bibleImageVision.d.ts +45 -0
  115. package/lib/services/agent/bibleImageVision.d.ts.map +1 -0
  116. package/lib/services/agent/bibleImageVision.js +169 -0
  117. package/lib/services/agent/chatAgent.d.ts +79 -0
  118. package/lib/services/agent/chatAgent.d.ts.map +1 -0
  119. package/lib/services/agent/chatAgent.js +136 -0
  120. package/lib/services/agent/costPreflight.d.ts +61 -0
  121. package/lib/services/agent/costPreflight.d.ts.map +1 -0
  122. package/lib/services/agent/costPreflight.js +143 -0
  123. package/lib/services/agent/critic.d.ts +103 -0
  124. package/lib/services/agent/critic.d.ts.map +1 -0
  125. package/lib/services/agent/critic.js +139 -0
  126. package/lib/services/agent/editClassifier.d.ts +262 -0
  127. package/lib/services/agent/editClassifier.d.ts.map +1 -0
  128. package/lib/services/agent/editClassifier.js +186 -0
  129. package/lib/services/agent/eval/index.d.ts +5 -0
  130. package/lib/services/agent/eval/index.d.ts.map +1 -0
  131. package/lib/services/agent/eval/index.js +20 -0
  132. package/lib/services/agent/eval/judge.d.ts +14 -0
  133. package/lib/services/agent/eval/judge.d.ts.map +1 -0
  134. package/lib/services/agent/eval/judge.js +96 -0
  135. package/lib/services/agent/eval/recorder.d.ts +28 -0
  136. package/lib/services/agent/eval/recorder.d.ts.map +1 -0
  137. package/lib/services/agent/eval/recorder.js +100 -0
  138. package/lib/services/agent/eval/seedBriefs.d.ts +16 -0
  139. package/lib/services/agent/eval/seedBriefs.d.ts.map +1 -0
  140. package/lib/services/agent/eval/seedBriefs.js +1188 -0
  141. package/lib/services/agent/eval/types.d.ts +230 -0
  142. package/lib/services/agent/eval/types.d.ts.map +1 -0
  143. package/lib/services/agent/eval/types.js +73 -0
  144. package/lib/services/agent/executor.d.ts +141 -0
  145. package/lib/services/agent/executor.d.ts.map +1 -0
  146. package/lib/services/agent/executor.js +561 -0
  147. package/lib/services/agent/globalActions.d.ts +49 -0
  148. package/lib/services/agent/globalActions.d.ts.map +1 -0
  149. package/lib/services/agent/globalActions.js +328 -0
  150. package/lib/services/agent/index.d.ts +38 -0
  151. package/lib/services/agent/index.d.ts.map +1 -0
  152. package/lib/services/agent/index.js +53 -0
  153. package/lib/services/agent/llmCaller.d.ts +144 -0
  154. package/lib/services/agent/llmCaller.d.ts.map +1 -0
  155. package/lib/services/agent/llmCaller.js +16 -0
  156. package/lib/services/agent/llmCallerAnthropic.d.ts +90 -0
  157. package/lib/services/agent/llmCallerAnthropic.d.ts.map +1 -0
  158. package/lib/services/agent/llmCallerAnthropic.js +255 -0
  159. package/lib/services/agent/llmCallerGateway.d.ts +61 -0
  160. package/lib/services/agent/llmCallerGateway.d.ts.map +1 -0
  161. package/lib/services/agent/llmCallerGateway.js +360 -0
  162. package/lib/services/agent/llmCallerRegistry.d.ts +6 -0
  163. package/lib/services/agent/llmCallerRegistry.d.ts.map +1 -0
  164. package/lib/services/agent/llmCallerRegistry.js +39 -0
  165. package/lib/services/agent/modelQualityNotes.d.ts +100 -0
  166. package/lib/services/agent/modelQualityNotes.d.ts.map +1 -0
  167. package/lib/services/agent/modelQualityNotes.js +248 -0
  168. package/lib/services/agent/modelRouter.d.ts +41 -0
  169. package/lib/services/agent/modelRouter.d.ts.map +1 -0
  170. package/lib/services/agent/modelRouter.js +65 -0
  171. package/lib/services/agent/musicSelect.d.ts +23 -0
  172. package/lib/services/agent/musicSelect.d.ts.map +1 -0
  173. package/lib/services/agent/musicSelect.js +109 -0
  174. package/lib/services/agent/overlayRenderer.d.ts +67 -0
  175. package/lib/services/agent/overlayRenderer.d.ts.map +1 -0
  176. package/lib/services/agent/overlayRenderer.js +253 -0
  177. package/lib/services/agent/perSceneCritic.d.ts +90 -0
  178. package/lib/services/agent/perSceneCritic.d.ts.map +1 -0
  179. package/lib/services/agent/perSceneCritic.js +125 -0
  180. package/lib/services/agent/personas.d.ts +78 -0
  181. package/lib/services/agent/personas.d.ts.map +1 -0
  182. package/lib/services/agent/personas.js +177 -0
  183. package/lib/services/agent/planDiff.d.ts +76 -0
  184. package/lib/services/agent/planDiff.d.ts.map +1 -0
  185. package/lib/services/agent/planDiff.js +182 -0
  186. package/lib/services/agent/planMutations.d.ts +46 -0
  187. package/lib/services/agent/planMutations.d.ts.map +1 -0
  188. package/lib/services/agent/planMutations.js +120 -0
  189. package/lib/services/agent/planner/Planner.d.ts +107 -0
  190. package/lib/services/agent/planner/Planner.d.ts.map +1 -0
  191. package/lib/services/agent/planner/Planner.js +591 -0
  192. package/lib/services/agent/planner/overlaySanity.d.ts +7 -0
  193. package/lib/services/agent/planner/overlaySanity.d.ts.map +1 -0
  194. package/lib/services/agent/planner/overlaySanity.js +86 -0
  195. package/lib/services/agent/planner/promptSections.d.ts +25 -0
  196. package/lib/services/agent/planner/promptSections.d.ts.map +1 -0
  197. package/lib/services/agent/planner/promptSections.js +174 -0
  198. package/lib/services/agent/planner/repair.d.ts +16 -0
  199. package/lib/services/agent/planner/repair.d.ts.map +1 -0
  200. package/lib/services/agent/planner/repair.js +51 -0
  201. package/lib/services/agent/planner/structuralRules.d.ts +10 -0
  202. package/lib/services/agent/planner/structuralRules.d.ts.map +1 -0
  203. package/lib/services/agent/planner/structuralRules.js +111 -0
  204. package/lib/services/agent/planner/validators.d.ts +65 -0
  205. package/lib/services/agent/planner/validators.d.ts.map +1 -0
  206. package/lib/services/agent/planner/validators.js +284 -0
  207. package/lib/services/agent/planner.d.ts +3 -0
  208. package/lib/services/agent/planner.d.ts.map +1 -0
  209. package/lib/services/agent/planner.js +14 -0
  210. package/lib/services/agent/providerFallback/chains.d.ts +100 -0
  211. package/lib/services/agent/providerFallback/chains.d.ts.map +1 -0
  212. package/lib/services/agent/providerFallback/chains.js +198 -0
  213. package/lib/services/agent/providerFallback/classifier.d.ts +36 -0
  214. package/lib/services/agent/providerFallback/classifier.d.ts.map +1 -0
  215. package/lib/services/agent/providerFallback/classifier.js +103 -0
  216. package/lib/services/agent/providerFallback/index.d.ts +4 -0
  217. package/lib/services/agent/providerFallback/index.d.ts.map +1 -0
  218. package/lib/services/agent/providerFallback/index.js +19 -0
  219. package/lib/services/agent/providerFallback/withFallback.d.ts +60 -0
  220. package/lib/services/agent/providerFallback/withFallback.d.ts.map +1 -0
  221. package/lib/services/agent/providerFallback/withFallback.js +93 -0
  222. package/lib/services/agent/providerTaskCache.d.ts +50 -0
  223. package/lib/services/agent/providerTaskCache.d.ts.map +1 -0
  224. package/lib/services/agent/providerTaskCache.js +98 -0
  225. package/lib/services/agent/qualityGate.d.ts +82 -0
  226. package/lib/services/agent/qualityGate.d.ts.map +1 -0
  227. package/lib/services/agent/qualityGate.js +232 -0
  228. package/lib/services/agent/referenceImageRenderer.d.ts +37 -0
  229. package/lib/services/agent/referenceImageRenderer.d.ts.map +1 -0
  230. package/lib/services/agent/referenceImageRenderer.js +92 -0
  231. package/lib/services/agent/regenCore.d.ts +60 -0
  232. package/lib/services/agent/regenCore.d.ts.map +1 -0
  233. package/lib/services/agent/regenCore.js +487 -0
  234. package/lib/services/agent/runHelpers.d.ts +44 -0
  235. package/lib/services/agent/runHelpers.d.ts.map +1 -0
  236. package/lib/services/agent/runHelpers.js +196 -0
  237. package/lib/services/agent/sceneLayoutVision.d.ts +90 -0
  238. package/lib/services/agent/sceneLayoutVision.d.ts.map +1 -0
  239. package/lib/services/agent/sceneLayoutVision.js +212 -0
  240. package/lib/services/agent/stitchedVideoCritic.d.ts +136 -0
  241. package/lib/services/agent/stitchedVideoCritic.d.ts.map +1 -0
  242. package/lib/services/agent/stitchedVideoCritic.gemini.d.ts +26 -0
  243. package/lib/services/agent/stitchedVideoCritic.gemini.d.ts.map +1 -0
  244. package/lib/services/agent/stitchedVideoCritic.gemini.js +198 -0
  245. package/lib/services/agent/stitchedVideoCritic.js +162 -0
  246. package/lib/services/agent/taskPoller.d.ts +65 -0
  247. package/lib/services/agent/taskPoller.d.ts.map +1 -0
  248. package/lib/services/agent/taskPoller.js +176 -0
  249. package/lib/services/agent/textOverlayStyles.d.ts +60 -0
  250. package/lib/services/agent/textOverlayStyles.d.ts.map +1 -0
  251. package/lib/services/agent/textOverlayStyles.js +174 -0
  252. package/lib/services/agent/toolRegistry.d.ts +73 -0
  253. package/lib/services/agent/toolRegistry.d.ts.map +1 -0
  254. package/lib/services/agent/toolRegistry.js +95 -0
  255. package/lib/services/agent/tools/analyzeReference.tool.d.ts +36 -0
  256. package/lib/services/agent/tools/analyzeReference.tool.d.ts.map +1 -0
  257. package/lib/services/agent/tools/analyzeReference.tool.js +44 -0
  258. package/lib/services/agent/tools/animateImage.tool.d.ts +24 -0
  259. package/lib/services/agent/tools/animateImage.tool.d.ts.map +1 -0
  260. package/lib/services/agent/tools/animateImage.tool.js +115 -0
  261. package/lib/services/agent/tools/animateImageWithMotionBrush.tool.d.ts +32 -0
  262. package/lib/services/agent/tools/animateImageWithMotionBrush.tool.d.ts.map +1 -0
  263. package/lib/services/agent/tools/animateImageWithMotionBrush.tool.js +135 -0
  264. package/lib/services/agent/tools/composeScene.tool.d.ts +978 -0
  265. package/lib/services/agent/tools/composeScene.tool.d.ts.map +1 -0
  266. package/lib/services/agent/tools/composeScene.tool.js +90 -0
  267. package/lib/services/agent/tools/estimateCost.tool.d.ts +352 -0
  268. package/lib/services/agent/tools/estimateCost.tool.d.ts.map +1 -0
  269. package/lib/services/agent/tools/estimateCost.tool.js +62 -0
  270. package/lib/services/agent/tools/generateAvatarVideo.tool.d.ts +32 -0
  271. package/lib/services/agent/tools/generateAvatarVideo.tool.d.ts.map +1 -0
  272. package/lib/services/agent/tools/generateAvatarVideo.tool.js +143 -0
  273. package/lib/services/agent/tools/generateCaptions.tool.d.ts +42 -0
  274. package/lib/services/agent/tools/generateCaptions.tool.d.ts.map +1 -0
  275. package/lib/services/agent/tools/generateCaptions.tool.js +196 -0
  276. package/lib/services/agent/tools/generateImage.tool.d.ts +74 -0
  277. package/lib/services/agent/tools/generateImage.tool.d.ts.map +1 -0
  278. package/lib/services/agent/tools/generateImage.tool.js +206 -0
  279. package/lib/services/agent/tools/generateVideo.tool.d.ts +31 -0
  280. package/lib/services/agent/tools/generateVideo.tool.d.ts.map +1 -0
  281. package/lib/services/agent/tools/generateVideo.tool.js +153 -0
  282. package/lib/services/agent/tools/generateVoiceover.tool.d.ts +44 -0
  283. package/lib/services/agent/tools/generateVoiceover.tool.d.ts.map +1 -0
  284. package/lib/services/agent/tools/generateVoiceover.tool.js +206 -0
  285. package/lib/services/agent/tools/index.d.ts +20 -0
  286. package/lib/services/agent/tools/index.d.ts.map +1 -0
  287. package/lib/services/agent/tools/index.js +35 -0
  288. package/lib/services/agent/tools/planVideo.tool.d.ts +343 -0
  289. package/lib/services/agent/tools/planVideo.tool.d.ts.map +1 -0
  290. package/lib/services/agent/tools/planVideo.tool.js +46 -0
  291. package/lib/services/agent/tools/render.tool.d.ts +367 -0
  292. package/lib/services/agent/tools/render.tool.d.ts.map +1 -0
  293. package/lib/services/agent/tools/render.tool.js +48 -0
  294. package/lib/services/agent/tools/searchMusic.tool.d.ts +49 -0
  295. package/lib/services/agent/tools/searchMusic.tool.d.ts.map +1 -0
  296. package/lib/services/agent/tools/searchMusic.tool.js +74 -0
  297. package/lib/services/agent/tools/searchStock.tool.d.ts +41 -0
  298. package/lib/services/agent/tools/searchStock.tool.d.ts.map +1 -0
  299. package/lib/services/agent/tools/searchStock.tool.js +314 -0
  300. package/lib/services/agent/tools/searchUserLibrary.tool.d.ts +59 -0
  301. package/lib/services/agent/tools/searchUserLibrary.tool.d.ts.map +1 -0
  302. package/lib/services/agent/tools/searchUserLibrary.tool.js +58 -0
  303. package/lib/services/agent/ttsDuration.d.ts +29 -0
  304. package/lib/services/agent/ttsDuration.d.ts.map +1 -0
  305. package/lib/services/agent/ttsDuration.js +60 -0
  306. package/lib/services/aiGen/aiGenFactory.service.d.ts +21 -1
  307. package/lib/services/aiGen/aiGenFactory.service.d.ts.map +1 -1
  308. package/lib/services/aiGen/aiGenFactory.service.js +84 -21
  309. package/lib/services/aiGen/canonicalAdapters/cameraControl.types.d.ts +31 -0
  310. package/lib/services/aiGen/canonicalAdapters/cameraControl.types.d.ts.map +1 -0
  311. package/lib/services/aiGen/canonicalAdapters/cameraControl.types.js +2 -0
  312. package/lib/services/aiGen/canonicalAdapters/index.d.ts +3 -0
  313. package/lib/services/aiGen/canonicalAdapters/index.d.ts.map +1 -0
  314. package/lib/services/aiGen/canonicalAdapters/index.js +18 -0
  315. package/lib/services/aiGen/canonicalAdapters/multiShot.types.d.ts +23 -0
  316. package/lib/services/aiGen/canonicalAdapters/multiShot.types.d.ts.map +1 -0
  317. package/lib/services/aiGen/canonicalAdapters/multiShot.types.js +12 -0
  318. package/lib/services/aiGen/helpers.d.ts.map +1 -1
  319. package/lib/services/aiGen/helpers.js +10 -0
  320. package/lib/services/aiGen/providers/alibaba/alibaba.d.ts +14 -3
  321. package/lib/services/aiGen/providers/alibaba/alibaba.d.ts.map +1 -1
  322. package/lib/services/aiGen/providers/alibaba/alibaba.js +155 -22
  323. package/lib/services/aiGen/providers/baseAiGenProvider.service.d.ts +22 -4
  324. package/lib/services/aiGen/providers/baseAiGenProvider.service.d.ts.map +1 -1
  325. package/lib/services/aiGen/providers/baseAiGenProvider.service.js +32 -0
  326. package/lib/services/aiGen/providers/bytedance/bytedance.service.d.ts.map +1 -1
  327. package/lib/services/aiGen/providers/bytedance/bytedance.service.js +10 -1
  328. package/lib/services/aiGen/providers/elevenlabs/elevenlabs.service.d.ts +18 -0
  329. package/lib/services/aiGen/providers/elevenlabs/elevenlabs.service.d.ts.map +1 -0
  330. package/lib/services/aiGen/providers/elevenlabs/elevenlabs.service.js +102 -0
  331. package/lib/services/aiGen/providers/fal/falImage.service.d.ts +15 -0
  332. package/lib/services/aiGen/providers/fal/falImage.service.d.ts.map +1 -0
  333. package/lib/services/aiGen/providers/fal/falImage.service.js +141 -0
  334. package/lib/services/aiGen/providers/fal/index.d.ts +2 -0
  335. package/lib/services/aiGen/providers/fal/index.d.ts.map +1 -0
  336. package/lib/services/aiGen/providers/fal/index.js +17 -0
  337. package/lib/services/aiGen/providers/google/google.service.d.ts +11 -2
  338. package/lib/services/aiGen/providers/google/google.service.d.ts.map +1 -1
  339. package/lib/services/aiGen/providers/google/google.service.js +245 -28
  340. package/lib/services/aiGen/providers/index.d.ts +3 -0
  341. package/lib/services/aiGen/providers/index.d.ts.map +1 -1
  342. package/lib/services/aiGen/providers/index.js +3 -0
  343. package/lib/services/aiGen/providers/kling/cameraAdapter.d.ts +4 -0
  344. package/lib/services/aiGen/providers/kling/cameraAdapter.d.ts.map +1 -0
  345. package/lib/services/aiGen/providers/kling/cameraAdapter.js +53 -0
  346. package/lib/services/aiGen/providers/kling/index.d.ts +1 -0
  347. package/lib/services/aiGen/providers/kling/index.d.ts.map +1 -1
  348. package/lib/services/aiGen/providers/kling/index.js +1 -0
  349. package/lib/services/aiGen/providers/kling/kling.service.d.ts +12 -1
  350. package/lib/services/aiGen/providers/kling/kling.service.d.ts.map +1 -1
  351. package/lib/services/aiGen/providers/kling/kling.service.js +357 -26
  352. package/lib/services/aiGen/providers/kling/klingImage.service.d.ts +21 -0
  353. package/lib/services/aiGen/providers/kling/klingImage.service.d.ts.map +1 -0
  354. package/lib/services/aiGen/providers/kling/klingImage.service.js +208 -0
  355. package/lib/services/aiGen/providers/kling/types.d.ts +105 -0
  356. package/lib/services/aiGen/providers/kling/types.d.ts.map +1 -1
  357. package/lib/services/aiGen/providers/minimax/minimax.service.d.ts +15 -2
  358. package/lib/services/aiGen/providers/minimax/minimax.service.d.ts.map +1 -1
  359. package/lib/services/aiGen/providers/minimax/minimax.service.js +127 -1
  360. package/lib/services/aiGen/providers/minimax/types.d.ts +10 -1
  361. package/lib/services/aiGen/providers/minimax/types.d.ts.map +1 -1
  362. package/lib/services/aiGen/providers/openai/openai.service.d.ts +8 -2
  363. package/lib/services/aiGen/providers/openai/openai.service.d.ts.map +1 -1
  364. package/lib/services/aiGen/providers/openai/openai.service.js +184 -7
  365. package/lib/services/aiGen/providers/pexels/index.d.ts +2 -0
  366. package/lib/services/aiGen/providers/pexels/index.d.ts.map +1 -0
  367. package/lib/services/aiGen/providers/{azure → pexels}/index.js +1 -1
  368. package/lib/services/aiGen/providers/pexels/pexels.service.d.ts +11 -0
  369. package/lib/services/aiGen/providers/pexels/pexels.service.d.ts.map +1 -0
  370. package/lib/services/aiGen/providers/pexels/pexels.service.js +150 -0
  371. package/lib/services/aiGen/providers/pixabay/index.d.ts +2 -0
  372. package/lib/services/aiGen/providers/pixabay/index.d.ts.map +1 -0
  373. package/lib/services/aiGen/providers/pixabay/index.js +17 -0
  374. package/lib/services/aiGen/providers/pixabay/pixabay.service.d.ts +12 -0
  375. package/lib/services/aiGen/providers/pixabay/pixabay.service.d.ts.map +1 -0
  376. package/lib/services/aiGen/providers/pixabay/pixabay.service.js +156 -0
  377. package/lib/services/aiGen/providers/pixverse/pixverse.service.d.ts.map +1 -1
  378. package/lib/services/aiGen/providers/pixverse/pixverse.service.js +125 -2
  379. package/lib/services/aiGen/providers/runway/cameraAdapter.d.ts +3 -0
  380. package/lib/services/aiGen/providers/runway/cameraAdapter.d.ts.map +1 -0
  381. package/lib/services/aiGen/providers/runway/cameraAdapter.js +46 -0
  382. package/lib/services/aiGen/providers/runway/runway.service.d.ts +12 -2
  383. package/lib/services/aiGen/providers/runway/runway.service.d.ts.map +1 -1
  384. package/lib/services/aiGen/providers/runway/runway.service.js +224 -21
  385. package/lib/services/aiGen/providers/types.d.ts +263 -6
  386. package/lib/services/aiGen/providers/types.d.ts.map +1 -1
  387. package/lib/services/aiGen/providers/unsplash/index.d.ts +2 -0
  388. package/lib/services/aiGen/providers/unsplash/index.d.ts.map +1 -0
  389. package/lib/services/aiGen/providers/unsplash/index.js +17 -0
  390. package/lib/services/aiGen/providers/unsplash/unsplash.service.d.ts +16 -0
  391. package/lib/services/aiGen/providers/unsplash/unsplash.service.d.ts.map +1 -0
  392. package/lib/services/aiGen/providers/unsplash/unsplash.service.js +131 -0
  393. package/lib/services/apiUsageCounter.service.d.ts +20 -0
  394. package/lib/services/apiUsageCounter.service.d.ts.map +1 -0
  395. package/lib/services/apiUsageCounter.service.js +84 -0
  396. package/lib/services/asr/assemblyai.service.d.ts +72 -0
  397. package/lib/services/asr/assemblyai.service.d.ts.map +1 -0
  398. package/lib/services/asr/assemblyai.service.js +89 -0
  399. package/lib/services/asr/index.d.ts +3 -0
  400. package/lib/services/asr/index.d.ts.map +1 -0
  401. package/lib/services/asr/index.js +18 -0
  402. package/lib/services/asr/whisper.service.d.ts +18 -0
  403. package/lib/services/asr/whisper.service.d.ts.map +1 -0
  404. package/lib/services/asr/whisper.service.js +151 -0
  405. package/lib/services/assetCache.service.d.ts +54 -0
  406. package/lib/services/assetCache.service.d.ts.map +1 -0
  407. package/lib/services/assetCache.service.js +109 -0
  408. package/lib/services/audioAnalysis/index.d.ts +2 -0
  409. package/lib/services/audioAnalysis/index.d.ts.map +1 -0
  410. package/lib/services/audioAnalysis/index.js +17 -0
  411. package/lib/services/audioAnalysis/onsetDetection.service.d.ts +50 -0
  412. package/lib/services/audioAnalysis/onsetDetection.service.d.ts.map +1 -0
  413. package/lib/services/audioAnalysis/onsetDetection.service.js +140 -0
  414. package/lib/services/bullmq.service.d.ts +6 -1
  415. package/lib/services/bullmq.service.d.ts.map +1 -1
  416. package/lib/services/bullmq.service.js +62 -14
  417. package/lib/services/credit.service.d.ts.map +1 -1
  418. package/lib/services/credit.service.js +45 -7
  419. package/lib/services/credits/pricing.d.ts +58 -0
  420. package/lib/services/credits/pricing.d.ts.map +1 -0
  421. package/lib/services/credits/pricing.js +111 -0
  422. package/lib/services/editor/designToProject.d.ts +75 -0
  423. package/lib/services/editor/designToProject.d.ts.map +1 -0
  424. package/lib/services/editor/designToProject.js +295 -0
  425. package/lib/services/editor/planToProject.d.ts +84 -0
  426. package/lib/services/editor/planToProject.d.ts.map +1 -0
  427. package/lib/services/editor/planToProject.js +395 -0
  428. package/lib/services/editor/projectToDesign.d.ts +4 -0
  429. package/lib/services/editor/projectToDesign.d.ts.map +1 -0
  430. package/lib/services/editor/projectToDesign.js +186 -0
  431. package/lib/services/firestore.service.d.ts +19 -0
  432. package/lib/services/firestore.service.d.ts.map +1 -1
  433. package/lib/services/firestore.service.js +33 -0
  434. package/lib/services/gcp/index.d.ts +1 -0
  435. package/lib/services/gcp/index.d.ts.map +1 -1
  436. package/lib/services/gcp/index.js +1 -0
  437. package/lib/services/gcp/uploadAudioBuffer.d.ts +13 -0
  438. package/lib/services/gcp/uploadAudioBuffer.d.ts.map +1 -0
  439. package/lib/services/gcp/uploadAudioBuffer.js +28 -0
  440. package/lib/services/index.d.ts +13 -0
  441. package/lib/services/index.d.ts.map +1 -1
  442. package/lib/services/index.js +13 -0
  443. package/lib/services/musicGen/index.d.ts +6 -0
  444. package/lib/services/musicGen/index.d.ts.map +1 -0
  445. package/lib/services/musicGen/index.js +26 -0
  446. package/lib/services/musicGen/musicSearchFactory.service.d.ts +14 -0
  447. package/lib/services/musicGen/musicSearchFactory.service.d.ts.map +1 -0
  448. package/lib/services/musicGen/musicSearchFactory.service.js +59 -0
  449. package/lib/services/musicGen/providers/curated.service.d.ts +24 -0
  450. package/lib/services/musicGen/providers/curated.service.d.ts.map +1 -0
  451. package/lib/services/musicGen/providers/curated.service.js +173 -0
  452. package/lib/services/musicGen/providers/jamendo.service.d.ts +8 -0
  453. package/lib/services/musicGen/providers/jamendo.service.d.ts.map +1 -0
  454. package/lib/services/musicGen/providers/jamendo.service.js +113 -0
  455. package/lib/services/musicGen/providers/mubert.service.d.ts +10 -0
  456. package/lib/services/musicGen/providers/mubert.service.d.ts.map +1 -0
  457. package/lib/services/musicGen/providers/mubert.service.js +128 -0
  458. package/lib/services/musicGen/types.d.ts +46 -0
  459. package/lib/services/musicGen/types.d.ts.map +1 -0
  460. package/lib/services/musicGen/types.js +10 -0
  461. package/lib/services/notification.service.d.ts +22 -0
  462. package/lib/services/notification.service.d.ts.map +1 -0
  463. package/lib/services/notification.service.js +76 -0
  464. package/lib/services/rateLimiter/distributedRateLimiter.service.d.ts +78 -0
  465. package/lib/services/rateLimiter/distributedRateLimiter.service.d.ts.map +1 -0
  466. package/lib/services/rateLimiter/distributedRateLimiter.service.js +269 -0
  467. package/lib/services/rateLimiter/index.d.ts +2 -0
  468. package/lib/services/rateLimiter/index.d.ts.map +1 -0
  469. package/lib/services/rateLimiter/index.js +17 -0
  470. package/lib/services/redis.service.d.ts +9 -0
  471. package/lib/services/redis.service.d.ts.map +1 -1
  472. package/lib/services/redis.service.js +20 -11
  473. package/lib/services/redisOptions.d.ts +22 -0
  474. package/lib/services/redisOptions.d.ts.map +1 -0
  475. package/lib/services/redisOptions.js +51 -0
  476. package/lib/services/tts/index.d.ts +2 -0
  477. package/lib/services/tts/index.d.ts.map +1 -1
  478. package/lib/services/tts/index.js +2 -0
  479. package/lib/services/tts/providers/elevenlabs.service.d.ts.map +1 -1
  480. package/lib/services/tts/providers/elevenlabs.service.js +91 -24
  481. package/lib/services/tts/providers/minimax.service.d.ts +14 -0
  482. package/lib/services/tts/providers/minimax.service.d.ts.map +1 -0
  483. package/lib/services/tts/providers/minimax.service.js +78 -0
  484. package/lib/services/tts/providers/openai.service.d.ts +14 -0
  485. package/lib/services/tts/providers/openai.service.d.ts.map +1 -0
  486. package/lib/services/tts/providers/openai.service.js +73 -0
  487. package/lib/services/tts/ttsFactory.service.d.ts.map +1 -1
  488. package/lib/services/tts/ttsFactory.service.js +6 -0
  489. package/lib/services/tts/types.d.ts +33 -0
  490. package/lib/services/tts/types.d.ts.map +1 -1
  491. package/lib/utils/errors.d.ts +8 -0
  492. package/lib/utils/errors.d.ts.map +1 -1
  493. package/lib/utils/errors.js +8 -0
  494. package/lib/utils/helpers.d.ts +13 -0
  495. package/lib/utils/helpers.d.ts.map +1 -1
  496. package/lib/utils/helpers.js +49 -6
  497. package/lib/utils/logger.d.ts.map +1 -1
  498. package/lib/utils/logger.js +37 -1
  499. package/package.json +5 -1
  500. package/lib/services/aiGen/providers/azure/azure.service.d.ts +0 -14
  501. package/lib/services/aiGen/providers/azure/azure.service.d.ts.map +0 -1
  502. package/lib/services/aiGen/providers/azure/azure.service.js +0 -108
  503. package/lib/services/aiGen/providers/azure/index.d.ts +0 -2
  504. package/lib/services/aiGen/providers/azure/index.d.ts.map +0 -1
@@ -0,0 +1,18 @@
1
+ import { BaseAiGenProviderService } from "../baseAiGenProvider.service";
2
+ import { CreditUsageParams, SfxGenerationParams, SfxGenerationResult } from "../types";
3
+ /**
4
+ * ElevenLabs aiGen provider — currently only sound-effects.
5
+ * (TTS lives in the separate `services/tts/` subsystem.)
6
+ */
7
+ export declare class ElevenLabsAiGenService extends BaseAiGenProviderService {
8
+ private readonly baseUrl;
9
+ private readonly apiKey;
10
+ constructor();
11
+ /**
12
+ * ElevenLabs Sound Effects. Sync — POST /v1/sound-generation returns mp3 binary.
13
+ * Body: { text, duration_seconds?, prompt_influence?, loop? }
14
+ */
15
+ generateSoundEffects(params: SfxGenerationParams): Promise<SfxGenerationResult>;
16
+ getCreditUsed({ modelKey, duration, multiClip }: CreditUsageParams): number;
17
+ }
18
+ //# sourceMappingURL=elevenlabs.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elevenlabs.service.d.ts","sourceRoot":"","sources":["../../../../../src/services/aiGen/providers/elevenlabs/elevenlabs.service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,UAAU,CAAC;AAGlB;;;GAGG;AACH,qBAAa,sBAAuB,SAAQ,wBAAwB;IAClE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;IAE1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;;IAWhC;;;OAGG;IACG,oBAAoB,CACxB,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,mBAAmB,CAAC;IA0D/B,aAAa,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAiB,EAAE,EAAE,iBAAiB,GAAG,MAAM;CAkBpF"}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ElevenLabsAiGenService = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const aiModels_1 = require("../../../../globals/aiModels");
9
+ const firebase_1 = require("../../../../libs/firebase");
10
+ const baseAiGenProvider_service_1 = require("../baseAiGenProvider.service");
11
+ const helpers_1 = require("../../../../utils/helpers");
12
+ /**
13
+ * ElevenLabs aiGen provider — currently only sound-effects.
14
+ * (TTS lives in the separate `services/tts/` subsystem.)
15
+ */
16
+ class ElevenLabsAiGenService extends baseAiGenProvider_service_1.BaseAiGenProviderService {
17
+ constructor() {
18
+ super();
19
+ this.baseUrl = "https://api.elevenlabs.io/v1";
20
+ const raw = process.env.ELEVENLABS_API_KEY?.trim();
21
+ if (!raw) {
22
+ throw new Error("Missing ELEVENLABS_API_KEY in environment variables");
23
+ }
24
+ this.apiKey = raw;
25
+ }
26
+ /**
27
+ * ElevenLabs Sound Effects. Sync — POST /v1/sound-generation returns mp3 binary.
28
+ * Body: { text, duration_seconds?, prompt_influence?, loop? }
29
+ */
30
+ async generateSoundEffects(params) {
31
+ const body = {
32
+ text: params.prompt,
33
+ ...(params.durationSec !== undefined
34
+ ? { duration_seconds: params.durationSec }
35
+ : {}),
36
+ ...(params.promptInfluence !== undefined
37
+ ? { prompt_influence: params.promptInfluence }
38
+ : {}),
39
+ ...(params.loop !== undefined ? { loop: params.loop } : {}),
40
+ };
41
+ try {
42
+ const resp = await axios_1.default.post(`${this.baseUrl}/sound-generation`, body, {
43
+ headers: {
44
+ "xi-api-key": this.apiKey,
45
+ "Content-Type": "application/json",
46
+ Accept: "audio/mpeg",
47
+ },
48
+ responseType: "arraybuffer",
49
+ timeout: 120000,
50
+ });
51
+ const buffer = Buffer.from(resp.data);
52
+ const path = `sfx/elevenlabs/${params.outputFilename}.mp3`;
53
+ const file = (0, firebase_1.getBucket)().file(path);
54
+ await file.save(buffer, { contentType: "audio/mpeg" });
55
+ const [signed] = await file.getSignedUrl({
56
+ action: "read",
57
+ expires: "03-09-2491",
58
+ });
59
+ return {
60
+ audioUrl: signed,
61
+ mimeType: "audio/mpeg",
62
+ extension: "mp3",
63
+ durationSec: params.durationSec,
64
+ };
65
+ }
66
+ catch (err) {
67
+ if (err.response?.data) {
68
+ let detail = "";
69
+ try {
70
+ const bodyStr = Buffer.from(err.response.data).toString("utf8");
71
+ const parsed = JSON.parse(bodyStr);
72
+ detail = parsed?.detail?.message ?? parsed?.detail ?? bodyStr;
73
+ }
74
+ catch {
75
+ detail = Buffer.from(err.response.data).toString("utf8");
76
+ }
77
+ const wrapped = new Error(`ElevenLabs SFX ${err.response.status}: ${detail} [promptLen=${params.prompt?.length ?? 0}]`);
78
+ wrapped.cause = err;
79
+ throw wrapped;
80
+ }
81
+ throw err;
82
+ }
83
+ }
84
+ getCreditUsed({ modelKey, duration, multiClip = false }) {
85
+ const modelConfig = aiModels_1.aiModelConfigs[modelKey];
86
+ const isSfx = modelConfig?.type?.some((t) => t === "sound-effects");
87
+ if (isSfx && modelConfig?.cost) {
88
+ const perSecond = modelConfig.cost.perSecond;
89
+ const fixed = modelConfig.cost.fixed;
90
+ // Prefer per-second when caller knows the requested duration; otherwise
91
+ // fall back to the worst-case fixed ceiling so we never under-charge.
92
+ const cost = typeof duration === "number" && typeof perSecond === "number"
93
+ ? perSecond * duration
94
+ : fixed;
95
+ if (typeof cost === "number") {
96
+ return (0, helpers_1.getCreditsFromCost)(cost, !multiClip);
97
+ }
98
+ }
99
+ return (0, helpers_1.getCreditsFromCost)(0.08, !multiClip);
100
+ }
101
+ }
102
+ exports.ElevenLabsAiGenService = ElevenLabsAiGenService;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * fal.ai image-generation provider — DISABLED.
3
+ *
4
+ * The provider class was written but never wired into `imageServicesMap`
5
+ * (no enum entry, no factory registration). Disabled here to make the
6
+ * orphan status explicit. Re-enable steps:
7
+ * 1. Add EImageGenModels entries for fal-flux-{schnell,1.1-pro,1.1-pro-ultra}
8
+ * 2. Register FalImageProviderService in imageServicesMap (aiGenFactory.service.ts)
9
+ * 3. Restore the implementation from the comment block below + re-enable
10
+ * `packages/shared/src/services/agent/tools/generateImage.tool.ts`.
11
+ */
12
+ export declare class FalImageProviderService {
13
+ constructor();
14
+ }
15
+ //# sourceMappingURL=falImage.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"falImage.service.d.ts","sourceRoot":"","sources":["../../../../../src/services/aiGen/providers/fal/falImage.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,qBAAa,uBAAuB;;CAMnC"}
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ /**
3
+ * fal.ai image-generation provider — DISABLED.
4
+ *
5
+ * The provider class was written but never wired into `imageServicesMap`
6
+ * (no enum entry, no factory registration). Disabled here to make the
7
+ * orphan status explicit. Re-enable steps:
8
+ * 1. Add EImageGenModels entries for fal-flux-{schnell,1.1-pro,1.1-pro-ultra}
9
+ * 2. Register FalImageProviderService in imageServicesMap (aiGenFactory.service.ts)
10
+ * 3. Restore the implementation from the comment block below + re-enable
11
+ * `packages/shared/src/services/agent/tools/generateImage.tool.ts`.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.FalImageProviderService = void 0;
15
+ class FalImageProviderService {
16
+ constructor() {
17
+ throw new Error("FalImageProviderService is disabled. See falImage.service.ts header for re-enable steps.");
18
+ }
19
+ }
20
+ exports.FalImageProviderService = FalImageProviderService;
21
+ /*
22
+ // --- Original implementation preserved for re-enable. ---
23
+ import axios from "axios";
24
+ import { BaseAiGenProviderService } from "../baseAiGenProvider.service";
25
+ import {
26
+ CreditUsageParams,
27
+ ImageGenerationParams,
28
+ ImageGenerationResult,
29
+ } from "../types";
30
+
31
+ const FAL_MODEL_ENDPOINTS: Record<string, string> = {
32
+ "fal-flux-1.1-pro": "https://fal.run/fal-ai/flux-pro/v1.1",
33
+ "fal-flux-1.1-pro-ultra": "https://fal.run/fal-ai/flux-pro/v1.1-ultra",
34
+ "fal-flux-schnell": "https://fal.run/fal-ai/flux/schnell",
35
+ };
36
+
37
+ interface FalImagePayload {
38
+ prompt: string;
39
+ image_size?: string | { width: number; height: number };
40
+ num_inference_steps?: number;
41
+ enable_safety_checker?: boolean;
42
+ seed?: number;
43
+ }
44
+
45
+ interface FalImageResponse {
46
+ images: Array<{ url: string; width?: number; height?: number }>;
47
+ seed?: number;
48
+ request_id?: string;
49
+ }
50
+
51
+ export class FalImageProviderService extends BaseAiGenProviderService {
52
+ private readonly apiKey: string | undefined = process.env.FAL_API_KEY;
53
+
54
+ async generateImage(
55
+ params: ImageGenerationParams
56
+ ): Promise<ImageGenerationResult> {
57
+ if (!this.apiKey) {
58
+ throw new Error(
59
+ "FAL_API_KEY not set — fal image provider cannot generate"
60
+ );
61
+ }
62
+
63
+ const endpoint = FAL_MODEL_ENDPOINTS[params.modelKey];
64
+ if (!endpoint) {
65
+ throw new Error(`Unknown fal model key: ${params.modelKey}`);
66
+ }
67
+
68
+ const payload: FalImagePayload = {
69
+ prompt: params.prompt,
70
+ image_size: this.mapAspectToImageSize(
71
+ params.dimensions,
72
+ params.aspectRatio
73
+ ),
74
+ };
75
+
76
+ const headers: Record<string, string> = {
77
+ Authorization: `Key ${this.apiKey}`,
78
+ "Content-Type": "application/json",
79
+ };
80
+ if (params.idempotencyKey) {
81
+ headers["X-Fal-Idempotency-Key"] = params.idempotencyKey;
82
+ }
83
+
84
+ const { data } = await axios.post<FalImageResponse>(endpoint, payload, {
85
+ headers,
86
+ timeout: 60_000,
87
+ });
88
+
89
+ const first = data.images?.[0];
90
+ if (!first?.url) {
91
+ throw new Error("fal returned no image");
92
+ }
93
+
94
+ return {
95
+ imageUrl: first.url,
96
+ width: first.width,
97
+ height: first.height,
98
+ providerRequestId: data.request_id,
99
+ };
100
+ }
101
+
102
+ getCreditUsed(params: CreditUsageParams): number {
103
+ const key = params.modelKey as unknown as string;
104
+ switch (key) {
105
+ case "fal-flux-1.1-pro-ultra":
106
+ return 6;
107
+ case "fal-flux-1.1-pro":
108
+ return 4;
109
+ case "fal-flux-schnell":
110
+ return 1;
111
+ default:
112
+ return 4;
113
+ }
114
+ }
115
+
116
+ private mapAspectToImageSize(
117
+ dimensions: string | undefined,
118
+ aspectRatio: string | undefined
119
+ ): FalImagePayload["image_size"] {
120
+ if (dimensions) {
121
+ const parts = dimensions.split("x").map((n) => parseInt(n, 10));
122
+ const w = parts[0];
123
+ const h = parts[1];
124
+ if (Number.isFinite(w) && Number.isFinite(h)) {
125
+ return { width: w!, height: h! };
126
+ }
127
+ }
128
+ switch (aspectRatio) {
129
+ case "9:16":
130
+ return "portrait_16_9";
131
+ case "16:9":
132
+ return "landscape_16_9";
133
+ case "4:5":
134
+ return "portrait_4_3";
135
+ case "1:1":
136
+ default:
137
+ return "square_hd";
138
+ }
139
+ }
140
+ }
141
+ */
@@ -0,0 +1,2 @@
1
+ export * from "./falImage.service";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/services/aiGen/providers/fal/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./falImage.service"), exports);
@@ -1,5 +1,5 @@
1
1
  import { BaseAiGenProviderService } from "../baseAiGenProvider.service";
2
- import { CreditUsageParams, VideoGenerationParams, VideoGenerationResult, VideoStatusParams, VideoStatusResult } from "../types";
2
+ import { CreditUsageParams, ImageGenerationParams, ImageGenerationResult, MusicGenerationParams, MusicGenerationResult, VideoGenerationParams, VideoGenerationResult, VideoStatusParams, VideoStatusResult } from "../types";
3
3
  export declare class GoogleService extends BaseAiGenProviderService {
4
4
  private ai;
5
5
  private static readonly MAX_RETRY_ATTEMPTS;
@@ -12,6 +12,15 @@ export declare class GoogleService extends BaseAiGenProviderService {
12
12
  private withTransientRetry;
13
13
  generateVideo(params: VideoGenerationParams): Promise<VideoGenerationResult>;
14
14
  checkVideoStatus({ task, outputFilename, outputFilePath, }: VideoStatusParams): Promise<VideoStatusResult>;
15
- getCreditUsed({ modelKey, duration, resolution, multiClip }: CreditUsageParams): number;
15
+ generateImage(params: ImageGenerationParams): Promise<ImageGenerationResult>;
16
+ /**
17
+ * Lyria 2 (Vertex AI). Sync — POST {region}-aiplatform.googleapis.com/.../lyria-002:predict
18
+ * returns base64-encoded WAV audio inline. Auth via ADC on the function service
19
+ * account (or GOOGLE_APPLICATION_CREDENTIALS locally).
20
+ *
21
+ * Required env: GCP_PROJECT_ID. Optional: GCP_LOCATION (default us-central1).
22
+ */
23
+ generateMusic(params: MusicGenerationParams): Promise<MusicGenerationResult>;
24
+ getCreditUsed({ modelKey, duration, resolution, multiClip, numImages, imageSize }: CreditUsageParams): number;
16
25
  }
17
26
  //# sourceMappingURL=google.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"google.service.d.ts","sourceRoot":"","sources":["../../../../../src/services/aiGen/providers/google/google.service.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,UAAU,CAAC;AA2FlB,qBAAa,aAAc,SAAQ,wBAAwB;IACzD,OAAO,CAAC,EAAE,CAAc;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAK;;IAO/C;;;;OAIG;YACW,kBAAkB;IA+B1B,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IAqE3B,gBAAgB,CAAC,EACrB,IAAI,EACJ,cAAc,EACd,cAAyB,GAC1B,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAuFjD,aAAa,CAAC,EAAE,QAAQ,EAAE,QAAY,EAAE,UAAmB,EAAE,SAAiB,EAAE,EAAE,iBAAiB,GAAG,MAAM;CAiB7G"}
1
+ {"version":3,"file":"google.service.d.ts","sourceRoot":"","sources":["../../../../../src/services/aiGen/providers/google/google.service.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAoIlB,qBAAa,aAAc,SAAQ,wBAAwB;IACzD,OAAO,CAAC,EAAE,CAAc;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAK;;IAO/C;;;;OAIG;YACW,kBAAkB;IA+B1B,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IA2E3B,gBAAgB,CAAC,EACrB,IAAI,EACJ,cAAc,EACd,cAAyB,GAC1B,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA0F3C,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IAsGjC;;;;;;OAMG;IACG,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IAqEjC,aAAa,CAAC,EAAE,QAAQ,EAAE,QAAY,EAAE,UAAmB,EAAE,SAAiB,EAAE,SAAa,EAAE,SAAS,EAAE,EAAE,iBAAiB,GAAG,MAAM;CA8BvI"}
@@ -15,6 +15,7 @@ const logger_1 = require("../../../../utils/logger");
15
15
  const errors_1 = require("../../../../utils/errors");
16
16
  const helpers_2 = require("../../helpers");
17
17
  const baseAiGenProvider_service_1 = require("../baseAiGenProvider.service");
18
+ const google_auth_library_1 = require("google-auth-library");
18
19
  const fs_1 = require("fs");
19
20
  const promises_2 = require("stream/promises");
20
21
  // Codes from undici / Node net layer that indicate a transient network failure
@@ -71,6 +72,41 @@ function isTransientFetchError(err) {
71
72
  const code = err.code ?? err.cause?.code;
72
73
  return !!code && TRANSIENT_NETWORK_CODES.has(code);
73
74
  }
75
+ const VEO_3_1_MODELS = new Set([
76
+ aiModels_1.EVideoGenModels.GOOGLE_VEO_3_1,
77
+ aiModels_1.EVideoGenModels.GOOGLE_VEO_3_1_FAST,
78
+ aiModels_1.EVideoGenModels.GOOGLE_VEO_3_1_LITE,
79
+ ]);
80
+ function inferImageMime(url) {
81
+ const lower = (url.split("?")[0] ?? url).toLowerCase();
82
+ if (lower.endsWith(".jpg") || lower.endsWith(".jpeg"))
83
+ return "image/jpeg";
84
+ if (lower.endsWith(".webp"))
85
+ return "image/webp";
86
+ return "image/png";
87
+ }
88
+ async function fetchAsImage(url) {
89
+ const resp = await fetch(url);
90
+ // fetch() does NOT throw on 4xx/5xx — surface the HTTP error so we don't
91
+ // encode an HTML error page as image bytes (Veo silently rejects them).
92
+ if (!resp.ok) {
93
+ throw new errors_1.UserFacingError(`Input image could not be downloaded (HTTP ${resp.status}). The image URL may have expired or been deleted.`);
94
+ }
95
+ const buf = Buffer.from(await resp.arrayBuffer());
96
+ // 0-byte body slips through resp.ok if the upstream wrote an empty file.
97
+ // Veo treats empty bytes as content-filtered (no error, no video).
98
+ if (buf.length === 0) {
99
+ throw new errors_1.UserFacingError("Input image is empty (0 bytes). Please re-upload the image.");
100
+ }
101
+ // Prefer Content-Type from the response (authoritative — set by Firebase
102
+ // Storage upload metadata) over URL-extension inference. Hardcoded
103
+ // image/png caused Veo to reject JPEG bytes labelled PNG with no detail.
104
+ const respContentType = resp.headers.get("content-type") ?? "";
105
+ return {
106
+ mimeType: pickImageMimeType(respContentType, url),
107
+ imageBytes: buf.toString("base64"),
108
+ };
109
+ }
74
110
  /**
75
111
  * Maps `@google/genai` `ApiError` failures (whose message is a JSON string)
76
112
  * to a `UserFacingError` with a stable code the frontend can translate.
@@ -146,42 +182,46 @@ class GoogleService extends baseAiGenProvider_service_1.BaseAiGenProviderService
146
182
  (0, helpers_2.validateParams)(params);
147
183
  const modelConfig = aiModels_1.aiModelConfigs[params.modelKey];
148
184
  const modelId = modelConfig.modelId;
185
+ const isVeo3_1 = VEO_3_1_MODELS.has(params.modelKey);
149
186
  const request = {
150
187
  model: modelId,
151
188
  prompt: params.prompt,
152
- // image:
153
189
  config: {
154
190
  aspectRatio: params.aspectRatio,
155
191
  resolution: params.resolution,
156
192
  durationSeconds: params.duration,
193
+ ...(params.seed !== undefined ? { seed: params.seed } : {}),
194
+ ...(params.personGeneration ? { personGeneration: params.personGeneration } : {}),
195
+ ...(params.negativePrompt ? { negativePrompt: params.negativePrompt } : {}),
196
+ ...(params.audio !== undefined ? { generateAudio: params.audio } : {}),
197
+ ...(params.promptOptimizer !== undefined ? { enhancePrompt: params.promptOptimizer } : {}),
157
198
  },
158
199
  };
159
- if (params.inputImageUrl) {
160
- const imgResp = await this.withTransientRetry("input-image fetch", () => fetch(params.inputImageUrl));
161
- // BUG #3 fix: fetch() does NOT throw on 4xx/5xx — it returns a Response
162
- // with the error body. Without this check we'd encode an HTML error page
163
- // as if it were image bytes, and Veo would silently reject it.
164
- if (!imgResp.ok) {
165
- throw new errors_1.UserFacingError(`Input image could not be downloaded (HTTP ${imgResp.status}). The image URL may have expired or been deleted.`);
200
+ // Video extension takes precedence over image (mutually exclusive in Veo API).
201
+ if (params.inputVideoUrl) {
202
+ request.video = { uri: params.inputVideoUrl };
203
+ }
204
+ else if (params.inputImageUrl) {
205
+ request.image = await this.withTransientRetry("input-image fetch", () => fetchAsImage(params.inputImageUrl));
206
+ }
207
+ // Last-frame image for first-last-frame interpolation. Mutually exclusive with referenceImages.
208
+ if (params.lastFrameImageUrl) {
209
+ request.config.lastFrame = await this.withTransientRetry("last-frame fetch", () => fetchAsImage(params.lastFrameImageUrl));
210
+ }
211
+ // Reference images (Veo 3.1 only — up to 3 asset images for character/scene consistency).
212
+ // When references are provided the API requires durationSeconds=8 and forbids image/video/lastFrame.
213
+ if (params.referenceImageUrls?.length) {
214
+ if (!isVeo3_1) {
215
+ logger_1.logger.warn(`Google Veo: referenceImages provided but model ${params.modelKey} does not support them — ignoring.`);
166
216
  }
167
- const imgBuffer = Buffer.from(await imgResp.arrayBuffer());
168
- // BUG #2 fix: a 0-byte body slips through fetch().ok if the upstream
169
- // wrote an empty file. Veo treats empty bytes as content-filtered (no
170
- // error, no video). Surface the real cause to the user.
171
- if (imgBuffer.length === 0) {
172
- throw new errors_1.UserFacingError("Input image is empty (0 bytes). Please re-upload the image.");
217
+ else {
218
+ const refs = params.referenceImageUrls.slice(0, 3);
219
+ const fetched = await Promise.all(refs.map((url) => this.withTransientRetry("reference-image fetch", () => fetchAsImage(url))));
220
+ request.config.referenceImages = fetched.map((image) => ({
221
+ image,
222
+ referenceType: genai_1.VideoGenerationReferenceType.ASSET,
223
+ }));
173
224
  }
174
- // BUG #1 fix: previously hardcoded "image/png" regardless of the actual
175
- // upload type. Veo rejects JPEG bytes labeled as PNG, with no error
176
- // detail. Prefer the Content-Type from the response (authoritative —
177
- // Firebase Storage sets it from upload metadata), fall back to URL
178
- // extension, then default to JPEG (modern phone-camera default).
179
- const respContentType = imgResp.headers.get("content-type") ?? "";
180
- const mimeType = pickImageMimeType(respContentType, params.inputImageUrl);
181
- request.image = {
182
- mimeType,
183
- imageBytes: imgBuffer.toString("base64"),
184
- };
185
225
  }
186
226
  const operation = await this.withTransientRetry("generateVideos", () => this.ai.models.generateVideos(request));
187
227
  if (!operation || !operation.name) {
@@ -245,8 +285,11 @@ class GoogleService extends baseAiGenProvider_service_1.BaseAiGenProviderService
245
285
  .then(() => {
246
286
  // console.log("Local file deleted:", localPath);
247
287
  })
248
- .catch(() => {
249
- console.warn("Failed to delete local file:", localPath);
288
+ .catch((err) => {
289
+ logger_1.logger.warn("google: local file cleanup failed", {
290
+ localPath,
291
+ err: err?.stack ?? err?.message ?? String(err),
292
+ });
250
293
  });
251
294
  return {
252
295
  videoUrl: signedUrl,
@@ -255,10 +298,184 @@ class GoogleService extends baseAiGenProvider_service_1.BaseAiGenProviderService
255
298
  }
256
299
  return { status: types_1.EVideoSceneStatus.PENDING };
257
300
  }
258
- getCreditUsed({ modelKey, duration = 8, resolution = "720p", multiClip = false }) {
301
+ async generateImage(params) {
302
+ const modelConfig = aiModels_1.aiModelConfigs[params.modelKey];
303
+ const modelId = modelConfig?.modelId;
304
+ if (!modelId)
305
+ throw new Error(`Unknown image modelKey: ${params.modelKey}`);
306
+ const isImagen = modelId.startsWith("imagen-");
307
+ const isNanoBanana = modelId.startsWith("gemini-") && modelId.includes("image");
308
+ const allBytes = [];
309
+ if (isImagen) {
310
+ const resp = await this.ai.models.generateImages({
311
+ model: modelId,
312
+ prompt: params.prompt,
313
+ config: {
314
+ numberOfImages: params.numImages ?? 1,
315
+ ...(params.aspectRatio ? { aspectRatio: params.aspectRatio } : {}),
316
+ ...(params.personGeneration
317
+ ? { personGeneration: params.personGeneration }
318
+ : {}),
319
+ ...(params.negativePrompt ? { negativePrompt: params.negativePrompt } : {}),
320
+ ...(params.outputFormat ? { outputMimeType: `image/${params.outputFormat}` } : {}),
321
+ },
322
+ });
323
+ for (const gen of resp.generatedImages ?? []) {
324
+ const b64 = gen.image?.imageBytes;
325
+ if (!b64)
326
+ continue;
327
+ allBytes.push({
328
+ bytes: Buffer.from(b64, "base64"),
329
+ mime: gen.image?.mimeType ?? "image/png",
330
+ });
331
+ }
332
+ }
333
+ else if (isNanoBanana) {
334
+ // Nano Banana (Gemini image-gen via generateContent) has no structured
335
+ // aspectRatio knob — Imagen does, this path doesn't. Without the hint
336
+ // in the prompt it defaults to landscape, so a 9:16 project ended up
337
+ // with horizontal images that didn't cover the vertical canvas.
338
+ // Prefix the requested ratio so the model produces an output that at
339
+ // least matches orientation (Gemini still won't honor exact pixel
340
+ // dimensions, but landscape vs portrait is reliable).
341
+ const aspectHint = params.aspectRatio
342
+ ? `Generate the image with a ${params.aspectRatio} aspect ratio (${params.aspectRatio === "9:16" || params.aspectRatio === "3:4" || params.aspectRatio === "4:5"
343
+ ? "vertical portrait"
344
+ : params.aspectRatio === "1:1"
345
+ ? "square"
346
+ : "horizontal landscape"} orientation). `
347
+ : "";
348
+ const parts = [{ text: `${aspectHint}${params.prompt}` }];
349
+ const refs = [
350
+ ...(params.inputImageUrl ? [params.inputImageUrl] : []),
351
+ ...(params.inputImageUrls ?? []),
352
+ ];
353
+ for (const url of refs) {
354
+ const ref = await fetchAsImage(url);
355
+ parts.push({ inlineData: { mimeType: ref.mimeType, data: ref.imageBytes } });
356
+ }
357
+ const resp = await this.ai.models.generateContent({
358
+ model: modelId,
359
+ contents: [{ role: "user", parts }],
360
+ });
361
+ const candidates = resp.candidates ?? [];
362
+ for (const cand of candidates) {
363
+ for (const part of cand.content?.parts ?? []) {
364
+ const inline = part.inlineData;
365
+ if (inline?.data) {
366
+ allBytes.push({
367
+ bytes: Buffer.from(inline.data, "base64"),
368
+ mime: inline.mimeType ?? "image/png",
369
+ });
370
+ }
371
+ }
372
+ }
373
+ }
374
+ else {
375
+ throw new Error(`Unsupported Google image modelId: ${modelId}`);
376
+ }
377
+ if (!allBytes.length) {
378
+ throw new Error("Google image generation returned no image bytes");
379
+ }
380
+ const bucket = (0, firebase_1.getBucket)();
381
+ const ts = Date.now();
382
+ const urls = [];
383
+ for (let i = 0; i < allBytes.length; i++) {
384
+ const item = allBytes[i];
385
+ const { bytes, mime } = item;
386
+ const ext = (mime.split("/")[1] ?? "png").toLowerCase();
387
+ const path = `images/google/${ts}-${Math.random().toString(36).slice(2, 8)}-${i}.${ext}`;
388
+ const file = bucket.file(path);
389
+ await file.save(bytes, { contentType: mime });
390
+ const [signed] = await file.getSignedUrl({ action: "read", expires: "03-09-2491" });
391
+ urls.push(signed);
392
+ }
393
+ return {
394
+ imageUrl: urls[0],
395
+ imageUrls: urls.length > 1 ? urls : undefined,
396
+ };
397
+ }
398
+ /**
399
+ * Lyria 2 (Vertex AI). Sync — POST {region}-aiplatform.googleapis.com/.../lyria-002:predict
400
+ * returns base64-encoded WAV audio inline. Auth via ADC on the function service
401
+ * account (or GOOGLE_APPLICATION_CREDENTIALS locally).
402
+ *
403
+ * Required env: GCP_PROJECT_ID. Optional: GCP_LOCATION (default us-central1).
404
+ */
405
+ async generateMusic(params) {
406
+ const modelConfig = aiModels_1.aiModelConfigs[params.modelKey];
407
+ const modelId = modelConfig?.modelId ?? "lyria-002";
408
+ const projectId = process.env.GCP_PROJECT_ID;
409
+ if (!projectId) {
410
+ throw new Error("Missing GCP_PROJECT_ID env var (required for Vertex Lyria)");
411
+ }
412
+ const location = process.env.GCP_LOCATION ?? "us-central1";
413
+ const auth = new google_auth_library_1.GoogleAuth({
414
+ scopes: ["https://www.googleapis.com/auth/cloud-platform"],
415
+ });
416
+ const client = await auth.getClient();
417
+ const tokenRes = await client.getAccessToken();
418
+ const token = tokenRes?.token;
419
+ if (!token)
420
+ throw new Error("Failed to obtain GCP access token for Vertex Lyria");
421
+ const url = `https://${location}-aiplatform.googleapis.com/v1/projects/${projectId}` +
422
+ `/locations/${location}/publishers/google/models/${modelId}:predict`;
423
+ const instance = { prompt: params.prompt };
424
+ const parameters = {
425
+ sample_count: 1,
426
+ };
427
+ if (params.negativePrompt) {
428
+ instance.negative_prompt = params.negativePrompt;
429
+ }
430
+ if (params.seed !== undefined) {
431
+ parameters.seed = params.seed;
432
+ }
433
+ const resp = await fetch(url, {
434
+ method: "POST",
435
+ headers: {
436
+ Authorization: `Bearer ${token}`,
437
+ "Content-Type": "application/json",
438
+ },
439
+ body: JSON.stringify({ instances: [instance], parameters }),
440
+ });
441
+ if (!resp.ok) {
442
+ const errText = await resp.text();
443
+ throw new Error(`Vertex Lyria failed (${resp.status}): ${errText}`);
444
+ }
445
+ const data = await resp.json();
446
+ const audioB64 = data?.predictions?.[0]?.bytesBase64Encoded;
447
+ if (!audioB64) {
448
+ throw new Error("Vertex Lyria returned no audio data");
449
+ }
450
+ const buffer = Buffer.from(audioB64, "base64");
451
+ const path = `music/lyria/${params.outputFilename}.wav`;
452
+ const file = (0, firebase_1.getBucket)().file(path);
453
+ await file.save(buffer, { contentType: "audio/wav" });
454
+ const [signed] = await file.getSignedUrl({
455
+ action: "read",
456
+ expires: "03-09-2491",
457
+ });
458
+ return {
459
+ audioUrl: signed,
460
+ mimeType: "audio/wav",
461
+ extension: "wav",
462
+ };
463
+ }
464
+ getCreditUsed({ modelKey, duration = 8, resolution = "720p", multiClip = false, numImages = 1, imageSize }) {
259
465
  const modelConfig = aiModels_1.aiModelConfigs[modelKey];
260
466
  const cost = modelConfig.cost;
261
467
  const applyFloor = !multiClip;
468
+ // Image-gen per-image cost keyed by output size (nano-banana-pro). Falls
469
+ // back to `cost.fixed` if `imageSize` isn't supplied by the caller.
470
+ if (cost?.perImageSize) {
471
+ const key = imageSize ?? "2K";
472
+ const perImage = cost.perImageSize[key] ?? cost.fixed ?? 0;
473
+ return (0, helpers_1.getCreditsFromCost)(perImage * Math.max(1, numImages), applyFloor);
474
+ }
475
+ // Image-gen flat per-image cost (Imagen / Nano Banana).
476
+ if (cost?.fixed !== undefined) {
477
+ return (0, helpers_1.getCreditsFromCost)(cost.fixed * Math.max(1, numImages), applyFloor);
478
+ }
262
479
  if (cost?.perResolution) {
263
480
  const ratePerSecond = cost.perResolution[resolution] ?? cost.perResolution["720p"];
264
481
  return (0, helpers_1.getCreditsFromCost)(ratePerSecond * duration, applyFloor);