vidspotai-shared 1.0.67 → 1.0.69-dev.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.
- package/lib/globals/aiModels/enums.d.ts +63 -6
- package/lib/globals/aiModels/enums.d.ts.map +1 -1
- package/lib/globals/aiModels/enums.js +78 -9
- package/lib/globals/aiModels/index.d.ts +2 -0
- package/lib/globals/aiModels/index.d.ts.map +1 -1
- package/lib/globals/aiModels/index.js +6 -0
- package/lib/globals/aiModels/providers/alibaba.d.ts +4 -0
- package/lib/globals/aiModels/providers/alibaba.d.ts.map +1 -0
- package/lib/globals/aiModels/providers/alibaba.js +194 -0
- package/lib/globals/aiModels/providers/bytedance.d.ts.map +1 -1
- package/lib/globals/aiModels/providers/bytedance.js +19 -0
- package/lib/globals/aiModels/providers/elevenlabs.d.ts +14 -0
- package/lib/globals/aiModels/providers/elevenlabs.d.ts.map +1 -0
- package/lib/globals/aiModels/providers/elevenlabs.js +29 -0
- package/lib/globals/aiModels/providers/google.d.ts.map +1 -1
- package/lib/globals/aiModels/providers/google.js +150 -2
- package/lib/globals/aiModels/providers/kling.d.ts.map +1 -1
- package/lib/globals/aiModels/providers/kling.js +280 -37
- package/lib/globals/aiModels/providers/minimax.d.ts.map +1 -1
- package/lib/globals/aiModels/providers/minimax.js +73 -2
- package/lib/globals/aiModels/providers/openai.d.ts.map +1 -1
- package/lib/globals/aiModels/providers/openai.js +90 -6
- package/lib/globals/aiModels/providers/pixverse.d.ts.map +1 -1
- package/lib/globals/aiModels/providers/pixverse.js +111 -29
- package/lib/globals/aiModels/providers/pixverseTemplates.d.ts +36 -0
- package/lib/globals/aiModels/providers/pixverseTemplates.d.ts.map +1 -0
- package/lib/globals/aiModels/providers/pixverseTemplates.js +42 -0
- package/lib/globals/aiModels/providers/runway.d.ts.map +1 -1
- package/lib/globals/aiModels/providers/runway.js +64 -2
- package/lib/globals/aiModels/tierHelpers.d.ts +33 -0
- package/lib/globals/aiModels/tierHelpers.d.ts.map +1 -0
- package/lib/globals/aiModels/tierHelpers.js +109 -0
- package/lib/globals/aiModels/types.d.ts +20 -1
- package/lib/globals/aiModels/types.d.ts.map +1 -1
- package/lib/globals/ttsModels/index.d.ts +2 -0
- package/lib/globals/ttsModels/index.d.ts.map +1 -1
- package/lib/globals/ttsModels/index.js +9 -1
- package/lib/globals/ttsModels/providers/minimax.d.ts +8 -0
- package/lib/globals/ttsModels/providers/minimax.d.ts.map +1 -0
- package/lib/globals/ttsModels/providers/minimax.js +18 -0
- package/lib/globals/ttsModels/providers/openai.d.ts +12 -0
- package/lib/globals/ttsModels/providers/openai.d.ts.map +1 -0
- package/lib/globals/ttsModels/providers/openai.js +22 -0
- package/lib/globals/ttsModels/types.d.ts +1 -1
- package/lib/globals/ttsModels/types.d.ts.map +1 -1
- package/lib/globals/ttsModels/voices.d.ts +39 -4
- package/lib/globals/ttsModels/voices.d.ts.map +1 -1
- package/lib/globals/ttsModels/voices.js +273 -26
- package/lib/globals/types.d.ts +59 -1
- package/lib/globals/types.d.ts.map +1 -1
- package/lib/globals/types.js +81 -2
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -0
- package/lib/models/agent.model.d.ts +357 -0
- package/lib/models/agent.model.d.ts.map +1 -0
- package/lib/models/agent.model.js +21 -0
- package/lib/models/cachedAsset.model.d.ts +18 -0
- package/lib/models/cachedAsset.model.d.ts.map +1 -0
- package/lib/models/cachedAsset.model.js +2 -0
- package/lib/models/cachedRawAsset.model.d.ts +20 -0
- package/lib/models/cachedRawAsset.model.d.ts.map +1 -0
- package/lib/models/cachedRawAsset.model.js +2 -0
- package/lib/models/image.model.d.ts +47 -0
- package/lib/models/image.model.d.ts.map +1 -0
- package/lib/models/image.model.js +2 -0
- package/lib/models/index.d.ts +6 -0
- package/lib/models/index.d.ts.map +1 -1
- package/lib/models/index.js +6 -0
- package/lib/models/notification.model.d.ts +25 -0
- package/lib/models/notification.model.d.ts.map +1 -0
- package/lib/models/notification.model.js +2 -0
- package/lib/models/ref.model.d.ts +80 -0
- package/lib/models/ref.model.d.ts.map +1 -0
- package/lib/models/ref.model.js +13 -0
- package/lib/models/share.model.d.ts +29 -0
- package/lib/models/share.model.d.ts.map +1 -0
- package/lib/models/share.model.js +2 -0
- package/lib/models/user.model.d.ts +12 -1
- package/lib/models/user.model.d.ts.map +1 -1
- package/lib/models/video.model.d.ts +120 -0
- package/lib/models/video.model.d.ts.map +1 -1
- package/lib/models/video.model.js +10 -0
- package/lib/schemas/agentPersona.schema.d.ts +10 -0
- package/lib/schemas/agentPersona.schema.d.ts.map +1 -0
- package/lib/schemas/agentPersona.schema.js +11 -0
- package/lib/schemas/agentRunJob.schema.d.ts +105 -0
- package/lib/schemas/agentRunJob.schema.d.ts.map +1 -0
- package/lib/schemas/agentRunJob.schema.js +88 -0
- package/lib/schemas/brandKit.schema.d.ts +113 -0
- package/lib/schemas/brandKit.schema.d.ts.map +1 -0
- package/lib/schemas/brandKit.schema.js +46 -0
- package/lib/schemas/brief.schema.d.ts +263 -0
- package/lib/schemas/brief.schema.d.ts.map +1 -0
- package/lib/schemas/brief.schema.js +157 -0
- package/lib/schemas/index.d.ts +7 -0
- package/lib/schemas/index.d.ts.map +1 -0
- package/lib/schemas/index.js +22 -0
- package/lib/schemas/project.schema.d.ts +1025 -0
- package/lib/schemas/project.schema.d.ts.map +1 -0
- package/lib/schemas/project.schema.js +256 -0
- package/lib/schemas/videoPlan.schema.d.ts +590 -0
- package/lib/schemas/videoPlan.schema.d.ts.map +1 -0
- package/lib/schemas/videoPlan.schema.js +412 -0
- package/lib/services/agent/beatSnap.d.ts +10 -0
- package/lib/services/agent/beatSnap.d.ts.map +1 -0
- package/lib/services/agent/beatSnap.js +128 -0
- package/lib/services/agent/bibleBuilder.d.ts +43 -0
- package/lib/services/agent/bibleBuilder.d.ts.map +1 -0
- package/lib/services/agent/bibleBuilder.js +102 -0
- package/lib/services/agent/bibleImageVision.d.ts +45 -0
- package/lib/services/agent/bibleImageVision.d.ts.map +1 -0
- package/lib/services/agent/bibleImageVision.js +169 -0
- package/lib/services/agent/chatAgent.d.ts +79 -0
- package/lib/services/agent/chatAgent.d.ts.map +1 -0
- package/lib/services/agent/chatAgent.js +136 -0
- package/lib/services/agent/costPreflight.d.ts +61 -0
- package/lib/services/agent/costPreflight.d.ts.map +1 -0
- package/lib/services/agent/costPreflight.js +143 -0
- package/lib/services/agent/critic.d.ts +103 -0
- package/lib/services/agent/critic.d.ts.map +1 -0
- package/lib/services/agent/critic.js +139 -0
- package/lib/services/agent/editClassifier.d.ts +262 -0
- package/lib/services/agent/editClassifier.d.ts.map +1 -0
- package/lib/services/agent/editClassifier.js +186 -0
- package/lib/services/agent/eval/index.d.ts +5 -0
- package/lib/services/agent/eval/index.d.ts.map +1 -0
- package/lib/services/agent/eval/index.js +20 -0
- package/lib/services/agent/eval/judge.d.ts +14 -0
- package/lib/services/agent/eval/judge.d.ts.map +1 -0
- package/lib/services/agent/eval/judge.js +96 -0
- package/lib/services/agent/eval/recorder.d.ts +28 -0
- package/lib/services/agent/eval/recorder.d.ts.map +1 -0
- package/lib/services/agent/eval/recorder.js +100 -0
- package/lib/services/agent/eval/seedBriefs.d.ts +16 -0
- package/lib/services/agent/eval/seedBriefs.d.ts.map +1 -0
- package/lib/services/agent/eval/seedBriefs.js +1188 -0
- package/lib/services/agent/eval/types.d.ts +230 -0
- package/lib/services/agent/eval/types.d.ts.map +1 -0
- package/lib/services/agent/eval/types.js +73 -0
- package/lib/services/agent/executor.d.ts +141 -0
- package/lib/services/agent/executor.d.ts.map +1 -0
- package/lib/services/agent/executor.js +561 -0
- package/lib/services/agent/globalActions.d.ts +49 -0
- package/lib/services/agent/globalActions.d.ts.map +1 -0
- package/lib/services/agent/globalActions.js +328 -0
- package/lib/services/agent/index.d.ts +38 -0
- package/lib/services/agent/index.d.ts.map +1 -0
- package/lib/services/agent/index.js +53 -0
- package/lib/services/agent/llmCaller.d.ts +144 -0
- package/lib/services/agent/llmCaller.d.ts.map +1 -0
- package/lib/services/agent/llmCaller.js +16 -0
- package/lib/services/agent/llmCallerAnthropic.d.ts +90 -0
- package/lib/services/agent/llmCallerAnthropic.d.ts.map +1 -0
- package/lib/services/agent/llmCallerAnthropic.js +255 -0
- package/lib/services/agent/llmCallerGateway.d.ts +61 -0
- package/lib/services/agent/llmCallerGateway.d.ts.map +1 -0
- package/lib/services/agent/llmCallerGateway.js +360 -0
- package/lib/services/agent/llmCallerRegistry.d.ts +6 -0
- package/lib/services/agent/llmCallerRegistry.d.ts.map +1 -0
- package/lib/services/agent/llmCallerRegistry.js +39 -0
- package/lib/services/agent/modelQualityNotes.d.ts +100 -0
- package/lib/services/agent/modelQualityNotes.d.ts.map +1 -0
- package/lib/services/agent/modelQualityNotes.js +248 -0
- package/lib/services/agent/modelRouter.d.ts +41 -0
- package/lib/services/agent/modelRouter.d.ts.map +1 -0
- package/lib/services/agent/modelRouter.js +65 -0
- package/lib/services/agent/musicSelect.d.ts +23 -0
- package/lib/services/agent/musicSelect.d.ts.map +1 -0
- package/lib/services/agent/musicSelect.js +109 -0
- package/lib/services/agent/overlayRenderer.d.ts +67 -0
- package/lib/services/agent/overlayRenderer.d.ts.map +1 -0
- package/lib/services/agent/overlayRenderer.js +253 -0
- package/lib/services/agent/perSceneCritic.d.ts +90 -0
- package/lib/services/agent/perSceneCritic.d.ts.map +1 -0
- package/lib/services/agent/perSceneCritic.js +125 -0
- package/lib/services/agent/personas.d.ts +78 -0
- package/lib/services/agent/personas.d.ts.map +1 -0
- package/lib/services/agent/personas.js +177 -0
- package/lib/services/agent/planDiff.d.ts +76 -0
- package/lib/services/agent/planDiff.d.ts.map +1 -0
- package/lib/services/agent/planDiff.js +182 -0
- package/lib/services/agent/planMutations.d.ts +46 -0
- package/lib/services/agent/planMutations.d.ts.map +1 -0
- package/lib/services/agent/planMutations.js +120 -0
- package/lib/services/agent/planner/Planner.d.ts +107 -0
- package/lib/services/agent/planner/Planner.d.ts.map +1 -0
- package/lib/services/agent/planner/Planner.js +591 -0
- package/lib/services/agent/planner/overlaySanity.d.ts +7 -0
- package/lib/services/agent/planner/overlaySanity.d.ts.map +1 -0
- package/lib/services/agent/planner/overlaySanity.js +86 -0
- package/lib/services/agent/planner/promptSections.d.ts +25 -0
- package/lib/services/agent/planner/promptSections.d.ts.map +1 -0
- package/lib/services/agent/planner/promptSections.js +174 -0
- package/lib/services/agent/planner/repair.d.ts +16 -0
- package/lib/services/agent/planner/repair.d.ts.map +1 -0
- package/lib/services/agent/planner/repair.js +51 -0
- package/lib/services/agent/planner/structuralRules.d.ts +10 -0
- package/lib/services/agent/planner/structuralRules.d.ts.map +1 -0
- package/lib/services/agent/planner/structuralRules.js +111 -0
- package/lib/services/agent/planner/validators.d.ts +65 -0
- package/lib/services/agent/planner/validators.d.ts.map +1 -0
- package/lib/services/agent/planner/validators.js +284 -0
- package/lib/services/agent/planner.d.ts +3 -0
- package/lib/services/agent/planner.d.ts.map +1 -0
- package/lib/services/agent/planner.js +14 -0
- package/lib/services/agent/providerFallback/chains.d.ts +100 -0
- package/lib/services/agent/providerFallback/chains.d.ts.map +1 -0
- package/lib/services/agent/providerFallback/chains.js +198 -0
- package/lib/services/agent/providerFallback/classifier.d.ts +36 -0
- package/lib/services/agent/providerFallback/classifier.d.ts.map +1 -0
- package/lib/services/agent/providerFallback/classifier.js +103 -0
- package/lib/services/agent/providerFallback/index.d.ts +4 -0
- package/lib/services/agent/providerFallback/index.d.ts.map +1 -0
- package/lib/services/agent/providerFallback/index.js +19 -0
- package/lib/services/agent/providerFallback/withFallback.d.ts +60 -0
- package/lib/services/agent/providerFallback/withFallback.d.ts.map +1 -0
- package/lib/services/agent/providerFallback/withFallback.js +93 -0
- package/lib/services/agent/providerTaskCache.d.ts +50 -0
- package/lib/services/agent/providerTaskCache.d.ts.map +1 -0
- package/lib/services/agent/providerTaskCache.js +98 -0
- package/lib/services/agent/qualityGate.d.ts +82 -0
- package/lib/services/agent/qualityGate.d.ts.map +1 -0
- package/lib/services/agent/qualityGate.js +232 -0
- package/lib/services/agent/referenceImageRenderer.d.ts +37 -0
- package/lib/services/agent/referenceImageRenderer.d.ts.map +1 -0
- package/lib/services/agent/referenceImageRenderer.js +92 -0
- package/lib/services/agent/regenCore.d.ts +60 -0
- package/lib/services/agent/regenCore.d.ts.map +1 -0
- package/lib/services/agent/regenCore.js +487 -0
- package/lib/services/agent/runHelpers.d.ts +44 -0
- package/lib/services/agent/runHelpers.d.ts.map +1 -0
- package/lib/services/agent/runHelpers.js +196 -0
- package/lib/services/agent/sceneLayoutVision.d.ts +90 -0
- package/lib/services/agent/sceneLayoutVision.d.ts.map +1 -0
- package/lib/services/agent/sceneLayoutVision.js +212 -0
- package/lib/services/agent/stitchedVideoCritic.d.ts +136 -0
- package/lib/services/agent/stitchedVideoCritic.d.ts.map +1 -0
- package/lib/services/agent/stitchedVideoCritic.gemini.d.ts +26 -0
- package/lib/services/agent/stitchedVideoCritic.gemini.d.ts.map +1 -0
- package/lib/services/agent/stitchedVideoCritic.gemini.js +198 -0
- package/lib/services/agent/stitchedVideoCritic.js +162 -0
- package/lib/services/agent/taskPoller.d.ts +65 -0
- package/lib/services/agent/taskPoller.d.ts.map +1 -0
- package/lib/services/agent/taskPoller.js +176 -0
- package/lib/services/agent/textOverlayStyles.d.ts +60 -0
- package/lib/services/agent/textOverlayStyles.d.ts.map +1 -0
- package/lib/services/agent/textOverlayStyles.js +174 -0
- package/lib/services/agent/toolRegistry.d.ts +73 -0
- package/lib/services/agent/toolRegistry.d.ts.map +1 -0
- package/lib/services/agent/toolRegistry.js +95 -0
- package/lib/services/agent/tools/analyzeReference.tool.d.ts +36 -0
- package/lib/services/agent/tools/analyzeReference.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/analyzeReference.tool.js +44 -0
- package/lib/services/agent/tools/animateImage.tool.d.ts +24 -0
- package/lib/services/agent/tools/animateImage.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/animateImage.tool.js +115 -0
- package/lib/services/agent/tools/animateImageWithMotionBrush.tool.d.ts +32 -0
- package/lib/services/agent/tools/animateImageWithMotionBrush.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/animateImageWithMotionBrush.tool.js +135 -0
- package/lib/services/agent/tools/composeScene.tool.d.ts +978 -0
- package/lib/services/agent/tools/composeScene.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/composeScene.tool.js +90 -0
- package/lib/services/agent/tools/estimateCost.tool.d.ts +352 -0
- package/lib/services/agent/tools/estimateCost.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/estimateCost.tool.js +62 -0
- package/lib/services/agent/tools/generateAvatarVideo.tool.d.ts +32 -0
- package/lib/services/agent/tools/generateAvatarVideo.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/generateAvatarVideo.tool.js +143 -0
- package/lib/services/agent/tools/generateCaptions.tool.d.ts +42 -0
- package/lib/services/agent/tools/generateCaptions.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/generateCaptions.tool.js +196 -0
- package/lib/services/agent/tools/generateImage.tool.d.ts +74 -0
- package/lib/services/agent/tools/generateImage.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/generateImage.tool.js +206 -0
- package/lib/services/agent/tools/generateVideo.tool.d.ts +31 -0
- package/lib/services/agent/tools/generateVideo.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/generateVideo.tool.js +153 -0
- package/lib/services/agent/tools/generateVoiceover.tool.d.ts +44 -0
- package/lib/services/agent/tools/generateVoiceover.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/generateVoiceover.tool.js +206 -0
- package/lib/services/agent/tools/index.d.ts +20 -0
- package/lib/services/agent/tools/index.d.ts.map +1 -0
- package/lib/services/agent/tools/index.js +35 -0
- package/lib/services/agent/tools/planVideo.tool.d.ts +343 -0
- package/lib/services/agent/tools/planVideo.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/planVideo.tool.js +46 -0
- package/lib/services/agent/tools/render.tool.d.ts +367 -0
- package/lib/services/agent/tools/render.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/render.tool.js +48 -0
- package/lib/services/agent/tools/searchMusic.tool.d.ts +49 -0
- package/lib/services/agent/tools/searchMusic.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/searchMusic.tool.js +74 -0
- package/lib/services/agent/tools/searchStock.tool.d.ts +41 -0
- package/lib/services/agent/tools/searchStock.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/searchStock.tool.js +314 -0
- package/lib/services/agent/tools/searchUserLibrary.tool.d.ts +59 -0
- package/lib/services/agent/tools/searchUserLibrary.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/searchUserLibrary.tool.js +58 -0
- package/lib/services/agent/ttsDuration.d.ts +29 -0
- package/lib/services/agent/ttsDuration.d.ts.map +1 -0
- package/lib/services/agent/ttsDuration.js +60 -0
- package/lib/services/aiGen/aiGenFactory.service.d.ts +21 -1
- package/lib/services/aiGen/aiGenFactory.service.d.ts.map +1 -1
- package/lib/services/aiGen/aiGenFactory.service.js +84 -21
- package/lib/services/aiGen/canonicalAdapters/cameraControl.types.d.ts +31 -0
- package/lib/services/aiGen/canonicalAdapters/cameraControl.types.d.ts.map +1 -0
- package/lib/services/aiGen/canonicalAdapters/cameraControl.types.js +2 -0
- package/lib/services/aiGen/canonicalAdapters/index.d.ts +3 -0
- package/lib/services/aiGen/canonicalAdapters/index.d.ts.map +1 -0
- package/lib/services/aiGen/canonicalAdapters/index.js +18 -0
- package/lib/services/aiGen/canonicalAdapters/multiShot.types.d.ts +23 -0
- package/lib/services/aiGen/canonicalAdapters/multiShot.types.d.ts.map +1 -0
- package/lib/services/aiGen/canonicalAdapters/multiShot.types.js +12 -0
- package/lib/services/aiGen/helpers.d.ts.map +1 -1
- package/lib/services/aiGen/helpers.js +10 -0
- package/lib/services/aiGen/providers/alibaba/alibaba.d.ts +14 -3
- package/lib/services/aiGen/providers/alibaba/alibaba.d.ts.map +1 -1
- package/lib/services/aiGen/providers/alibaba/alibaba.js +155 -22
- package/lib/services/aiGen/providers/baseAiGenProvider.service.d.ts +22 -4
- package/lib/services/aiGen/providers/baseAiGenProvider.service.d.ts.map +1 -1
- package/lib/services/aiGen/providers/baseAiGenProvider.service.js +32 -0
- package/lib/services/aiGen/providers/bytedance/bytedance.service.d.ts.map +1 -1
- package/lib/services/aiGen/providers/bytedance/bytedance.service.js +13 -13
- package/lib/services/aiGen/providers/elevenlabs/elevenlabs.service.d.ts +18 -0
- package/lib/services/aiGen/providers/elevenlabs/elevenlabs.service.d.ts.map +1 -0
- package/lib/services/aiGen/providers/elevenlabs/elevenlabs.service.js +102 -0
- package/lib/services/aiGen/providers/fal/falImage.service.d.ts +15 -0
- package/lib/services/aiGen/providers/fal/falImage.service.d.ts.map +1 -0
- package/lib/services/aiGen/providers/fal/falImage.service.js +141 -0
- package/lib/services/aiGen/providers/fal/index.d.ts +2 -0
- package/lib/services/aiGen/providers/fal/index.d.ts.map +1 -0
- package/lib/services/aiGen/providers/fal/index.js +17 -0
- package/lib/services/aiGen/providers/google/google.service.d.ts +11 -2
- package/lib/services/aiGen/providers/google/google.service.d.ts.map +1 -1
- package/lib/services/aiGen/providers/google/google.service.js +245 -28
- package/lib/services/aiGen/providers/index.d.ts +3 -0
- package/lib/services/aiGen/providers/index.d.ts.map +1 -1
- package/lib/services/aiGen/providers/index.js +3 -0
- package/lib/services/aiGen/providers/kling/cameraAdapter.d.ts +4 -0
- package/lib/services/aiGen/providers/kling/cameraAdapter.d.ts.map +1 -0
- package/lib/services/aiGen/providers/kling/cameraAdapter.js +53 -0
- package/lib/services/aiGen/providers/kling/index.d.ts +1 -0
- package/lib/services/aiGen/providers/kling/index.d.ts.map +1 -1
- package/lib/services/aiGen/providers/kling/index.js +1 -0
- package/lib/services/aiGen/providers/kling/kling.service.d.ts +12 -1
- package/lib/services/aiGen/providers/kling/kling.service.d.ts.map +1 -1
- package/lib/services/aiGen/providers/kling/kling.service.js +357 -26
- package/lib/services/aiGen/providers/kling/klingImage.service.d.ts +21 -0
- package/lib/services/aiGen/providers/kling/klingImage.service.d.ts.map +1 -0
- package/lib/services/aiGen/providers/kling/klingImage.service.js +208 -0
- package/lib/services/aiGen/providers/kling/types.d.ts +105 -0
- package/lib/services/aiGen/providers/kling/types.d.ts.map +1 -1
- package/lib/services/aiGen/providers/minimax/minimax.service.d.ts +15 -2
- package/lib/services/aiGen/providers/minimax/minimax.service.d.ts.map +1 -1
- package/lib/services/aiGen/providers/minimax/minimax.service.js +127 -1
- package/lib/services/aiGen/providers/minimax/types.d.ts +10 -1
- package/lib/services/aiGen/providers/minimax/types.d.ts.map +1 -1
- package/lib/services/aiGen/providers/openai/openai.service.d.ts +8 -2
- package/lib/services/aiGen/providers/openai/openai.service.d.ts.map +1 -1
- package/lib/services/aiGen/providers/openai/openai.service.js +184 -7
- package/lib/services/aiGen/providers/pexels/index.d.ts +2 -0
- package/lib/services/aiGen/providers/pexels/index.d.ts.map +1 -0
- package/lib/services/aiGen/providers/{azure → pexels}/index.js +1 -1
- package/lib/services/aiGen/providers/pexels/pexels.service.d.ts +11 -0
- package/lib/services/aiGen/providers/pexels/pexels.service.d.ts.map +1 -0
- package/lib/services/aiGen/providers/pexels/pexels.service.js +150 -0
- package/lib/services/aiGen/providers/pixabay/index.d.ts +2 -0
- package/lib/services/aiGen/providers/pixabay/index.d.ts.map +1 -0
- package/lib/services/aiGen/providers/pixabay/index.js +17 -0
- package/lib/services/aiGen/providers/pixabay/pixabay.service.d.ts +12 -0
- package/lib/services/aiGen/providers/pixabay/pixabay.service.d.ts.map +1 -0
- package/lib/services/aiGen/providers/pixabay/pixabay.service.js +156 -0
- package/lib/services/aiGen/providers/pixverse/pixverse.service.d.ts.map +1 -1
- package/lib/services/aiGen/providers/pixverse/pixverse.service.js +125 -2
- package/lib/services/aiGen/providers/runway/cameraAdapter.d.ts +3 -0
- package/lib/services/aiGen/providers/runway/cameraAdapter.d.ts.map +1 -0
- package/lib/services/aiGen/providers/runway/cameraAdapter.js +46 -0
- package/lib/services/aiGen/providers/runway/runway.service.d.ts +12 -2
- package/lib/services/aiGen/providers/runway/runway.service.d.ts.map +1 -1
- package/lib/services/aiGen/providers/runway/runway.service.js +224 -21
- package/lib/services/aiGen/providers/types.d.ts +263 -6
- package/lib/services/aiGen/providers/types.d.ts.map +1 -1
- package/lib/services/aiGen/providers/unsplash/index.d.ts +2 -0
- package/lib/services/aiGen/providers/unsplash/index.d.ts.map +1 -0
- package/lib/services/aiGen/providers/unsplash/index.js +17 -0
- package/lib/services/aiGen/providers/unsplash/unsplash.service.d.ts +16 -0
- package/lib/services/aiGen/providers/unsplash/unsplash.service.d.ts.map +1 -0
- package/lib/services/aiGen/providers/unsplash/unsplash.service.js +131 -0
- package/lib/services/analytics.service.js +2 -4
- package/lib/services/apiUsageCounter.service.d.ts +20 -0
- package/lib/services/apiUsageCounter.service.d.ts.map +1 -0
- package/lib/services/apiUsageCounter.service.js +84 -0
- package/lib/services/asr/assemblyai.service.d.ts +72 -0
- package/lib/services/asr/assemblyai.service.d.ts.map +1 -0
- package/lib/services/asr/assemblyai.service.js +89 -0
- package/lib/services/asr/index.d.ts +3 -0
- package/lib/services/asr/index.d.ts.map +1 -0
- package/lib/services/asr/index.js +18 -0
- package/lib/services/asr/whisper.service.d.ts +18 -0
- package/lib/services/asr/whisper.service.d.ts.map +1 -0
- package/lib/services/asr/whisper.service.js +151 -0
- package/lib/services/assetCache.service.d.ts +54 -0
- package/lib/services/assetCache.service.d.ts.map +1 -0
- package/lib/services/assetCache.service.js +109 -0
- package/lib/services/audioAnalysis/index.d.ts +2 -0
- package/lib/services/audioAnalysis/index.d.ts.map +1 -0
- package/lib/services/audioAnalysis/index.js +17 -0
- package/lib/services/audioAnalysis/onsetDetection.service.d.ts +50 -0
- package/lib/services/audioAnalysis/onsetDetection.service.d.ts.map +1 -0
- package/lib/services/audioAnalysis/onsetDetection.service.js +140 -0
- package/lib/services/bullmq.service.d.ts +6 -1
- package/lib/services/bullmq.service.d.ts.map +1 -1
- package/lib/services/bullmq.service.js +62 -14
- package/lib/services/credit.service.d.ts.map +1 -1
- package/lib/services/credit.service.js +45 -7
- package/lib/services/credits/pricing.d.ts +58 -0
- package/lib/services/credits/pricing.d.ts.map +1 -0
- package/lib/services/credits/pricing.js +111 -0
- package/lib/services/editor/designToProject.d.ts +75 -0
- package/lib/services/editor/designToProject.d.ts.map +1 -0
- package/lib/services/editor/designToProject.js +295 -0
- package/lib/services/editor/planToProject.d.ts +84 -0
- package/lib/services/editor/planToProject.d.ts.map +1 -0
- package/lib/services/editor/planToProject.js +395 -0
- package/lib/services/editor/projectToDesign.d.ts +4 -0
- package/lib/services/editor/projectToDesign.d.ts.map +1 -0
- package/lib/services/editor/projectToDesign.js +186 -0
- package/lib/services/firestore.service.d.ts +17 -0
- package/lib/services/firestore.service.d.ts.map +1 -1
- package/lib/services/firestore.service.js +30 -0
- package/lib/services/gcp/index.d.ts +1 -0
- package/lib/services/gcp/index.d.ts.map +1 -1
- package/lib/services/gcp/index.js +1 -0
- package/lib/services/gcp/uploadAudioBuffer.d.ts +13 -0
- package/lib/services/gcp/uploadAudioBuffer.d.ts.map +1 -0
- package/lib/services/gcp/uploadAudioBuffer.js +28 -0
- package/lib/services/index.d.ts +13 -0
- package/lib/services/index.d.ts.map +1 -1
- package/lib/services/index.js +13 -0
- package/lib/services/musicGen/index.d.ts +6 -0
- package/lib/services/musicGen/index.d.ts.map +1 -0
- package/lib/services/musicGen/index.js +26 -0
- package/lib/services/musicGen/musicSearchFactory.service.d.ts +14 -0
- package/lib/services/musicGen/musicSearchFactory.service.d.ts.map +1 -0
- package/lib/services/musicGen/musicSearchFactory.service.js +59 -0
- package/lib/services/musicGen/providers/curated.service.d.ts +24 -0
- package/lib/services/musicGen/providers/curated.service.d.ts.map +1 -0
- package/lib/services/musicGen/providers/curated.service.js +173 -0
- package/lib/services/musicGen/providers/jamendo.service.d.ts +8 -0
- package/lib/services/musicGen/providers/jamendo.service.d.ts.map +1 -0
- package/lib/services/musicGen/providers/jamendo.service.js +113 -0
- package/lib/services/musicGen/providers/mubert.service.d.ts +10 -0
- package/lib/services/musicGen/providers/mubert.service.d.ts.map +1 -0
- package/lib/services/musicGen/providers/mubert.service.js +128 -0
- package/lib/services/musicGen/types.d.ts +46 -0
- package/lib/services/musicGen/types.d.ts.map +1 -0
- package/lib/services/musicGen/types.js +10 -0
- package/lib/services/notification.service.d.ts +22 -0
- package/lib/services/notification.service.d.ts.map +1 -0
- package/lib/services/notification.service.js +76 -0
- package/lib/services/rateLimiter/distributedRateLimiter.service.d.ts +78 -0
- package/lib/services/rateLimiter/distributedRateLimiter.service.d.ts.map +1 -0
- package/lib/services/rateLimiter/distributedRateLimiter.service.js +269 -0
- package/lib/services/rateLimiter/index.d.ts +2 -0
- package/lib/services/rateLimiter/index.d.ts.map +1 -0
- package/lib/services/rateLimiter/index.js +17 -0
- package/lib/services/redis.service.d.ts +9 -0
- package/lib/services/redis.service.d.ts.map +1 -1
- package/lib/services/redis.service.js +20 -11
- package/lib/services/redisOptions.d.ts +22 -0
- package/lib/services/redisOptions.d.ts.map +1 -0
- package/lib/services/redisOptions.js +51 -0
- package/lib/services/tts/index.d.ts +2 -0
- package/lib/services/tts/index.d.ts.map +1 -1
- package/lib/services/tts/index.js +2 -0
- package/lib/services/tts/providers/elevenlabs.service.d.ts.map +1 -1
- package/lib/services/tts/providers/elevenlabs.service.js +91 -24
- package/lib/services/tts/providers/minimax.service.d.ts +14 -0
- package/lib/services/tts/providers/minimax.service.d.ts.map +1 -0
- package/lib/services/tts/providers/minimax.service.js +78 -0
- package/lib/services/tts/providers/openai.service.d.ts +14 -0
- package/lib/services/tts/providers/openai.service.d.ts.map +1 -0
- package/lib/services/tts/providers/openai.service.js +73 -0
- package/lib/services/tts/ttsFactory.service.d.ts.map +1 -1
- package/lib/services/tts/ttsFactory.service.js +6 -0
- package/lib/services/tts/types.d.ts +33 -0
- package/lib/services/tts/types.d.ts.map +1 -1
- package/lib/utils/errors.d.ts +8 -0
- package/lib/utils/errors.d.ts.map +1 -1
- package/lib/utils/errors.js +8 -0
- package/lib/utils/helpers.d.ts +13 -0
- package/lib/utils/helpers.d.ts.map +1 -1
- package/lib/utils/helpers.js +48 -11
- package/lib/utils/logger.d.ts.map +1 -1
- package/lib/utils/logger.js +37 -1
- package/package.json +5 -1
- package/lib/services/aiGen/providers/azure/azure.service.d.ts +0 -14
- package/lib/services/aiGen/providers/azure/azure.service.d.ts.map +0 -1
- package/lib/services/aiGen/providers/azure/azure.service.js +0 -108
- package/lib/services/aiGen/providers/azure/index.d.ts +0 -2
- package/lib/services/aiGen/providers/azure/index.d.ts.map +0 -1
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateAvatarVideoTool = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const aiModels_1 = require("../../../globals/aiModels");
|
|
6
|
+
const firebase_1 = require("../../../libs/firebase");
|
|
7
|
+
const aiGenFactory_service_1 = require("../../aiGen/aiGenFactory.service");
|
|
8
|
+
const types_1 = require("../../aiGen/types");
|
|
9
|
+
const rateLimiter_1 = require("../../rateLimiter");
|
|
10
|
+
const ttsFactory_service_1 = require("../../tts/ttsFactory.service");
|
|
11
|
+
const toolRegistry_1 = require("../toolRegistry");
|
|
12
|
+
/**
|
|
13
|
+
* generate_avatar_video — wraps the existing kling-avatar pipeline so the
|
|
14
|
+
* planner's `talking-head-avatar` scene strategy is executable. Accepts a
|
|
15
|
+
* presenter face image URL plus either a pre-uploaded audio URL or raw TTS
|
|
16
|
+
* text (in which case the tool synthesizes via ElevenLabs and uploads to GCS
|
|
17
|
+
* before handing off, since Kling avatar requires a public sound_file URL).
|
|
18
|
+
*
|
|
19
|
+
* Returns a provider task id; the executor / monitor layer polls completion
|
|
20
|
+
* exactly as it does for generate_video.
|
|
21
|
+
*/
|
|
22
|
+
const InputSchema = zod_1.z
|
|
23
|
+
.object({
|
|
24
|
+
inputImageUrl: zod_1.z
|
|
25
|
+
.string()
|
|
26
|
+
.url()
|
|
27
|
+
.describe("Presenter face still — Kling animates this image to lipsync the audio."),
|
|
28
|
+
ttsText: zod_1.z
|
|
29
|
+
.string()
|
|
30
|
+
.min(1)
|
|
31
|
+
.optional()
|
|
32
|
+
.describe("VO line to synthesize. Either ttsText or inputAudioUrl must be set; if both are set, inputAudioUrl wins."),
|
|
33
|
+
inputAudioUrl: zod_1.z
|
|
34
|
+
.string()
|
|
35
|
+
.url()
|
|
36
|
+
.optional()
|
|
37
|
+
.describe("Pre-uploaded audio URL (mp3/wav). Skips internal TTS+upload."),
|
|
38
|
+
voiceId: zod_1.z.string().optional(),
|
|
39
|
+
languageCode: zod_1.z.string().optional(),
|
|
40
|
+
mode: zod_1.z.enum(["std", "pro"]).default("std"),
|
|
41
|
+
prompt: zod_1.z
|
|
42
|
+
.string()
|
|
43
|
+
.optional()
|
|
44
|
+
.describe("Optional motion/emotion hint passed through to Kling."),
|
|
45
|
+
})
|
|
46
|
+
.superRefine((v, ctx) => {
|
|
47
|
+
if (!v.ttsText && !v.inputAudioUrl) {
|
|
48
|
+
ctx.addIssue({
|
|
49
|
+
code: zod_1.z.ZodIssueCode.custom,
|
|
50
|
+
message: "Either ttsText or inputAudioUrl is required.",
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
const OutputSchema = zod_1.z.object({
|
|
55
|
+
status: zod_1.z.literal("triggered"),
|
|
56
|
+
taskId: zod_1.z.string(),
|
|
57
|
+
audioUrl: zod_1.z.string().url().describe("Audio URL fed to Kling — host can reuse for caption sync."),
|
|
58
|
+
});
|
|
59
|
+
exports.generateAvatarVideoTool = {
|
|
60
|
+
name: "generate_avatar_video",
|
|
61
|
+
description: [
|
|
62
|
+
"Generate a talking-head avatar video by animating a presenter face still",
|
|
63
|
+
"to lipsync a voiceover. Wraps the kling-avatar provider.",
|
|
64
|
+
"Use this for the `talking-head-avatar` scene strategy. Do NOT use it for",
|
|
65
|
+
"general motion shots — generate_video is cheaper and more flexible there.",
|
|
66
|
+
"Examples:",
|
|
67
|
+
' { inputImageUrl: "https://.../face.png", ttsText: "Hi, today we\'re testing the new serum." }',
|
|
68
|
+
' { inputImageUrl: "https://.../face.png", inputAudioUrl: "https://.../vo.mp3", mode: "pro" }',
|
|
69
|
+
].join(" "),
|
|
70
|
+
inputSchema: InputSchema,
|
|
71
|
+
outputSchema: OutputSchema,
|
|
72
|
+
idempotent: false,
|
|
73
|
+
estimateCost: async (input) => {
|
|
74
|
+
// Kling avatar bills per audio second. Without a length we assume 6s (typical scene).
|
|
75
|
+
const approxSec = input.ttsText ? Math.max(2, Math.ceil(input.ttsText.length / 15)) : 6;
|
|
76
|
+
const perSec = input.mode === "pro" ? 0.028 : 0.014;
|
|
77
|
+
return Math.ceil(approxSec * perSec * 100); // rough credit conversion
|
|
78
|
+
},
|
|
79
|
+
handler: async (input, ctx) => {
|
|
80
|
+
let audioUrl = input.inputAudioUrl;
|
|
81
|
+
if (!audioUrl) {
|
|
82
|
+
const ttsLimiter = (0, rateLimiter_1.getTtsProviderRateLimiter)("elevenlabs");
|
|
83
|
+
await ttsLimiter.waitUntilAvailable();
|
|
84
|
+
let ttsResult;
|
|
85
|
+
try {
|
|
86
|
+
const tts = (0, ttsFactory_service_1.getTtsProviderService)("elevenlabs");
|
|
87
|
+
ttsResult = await tts.generate({
|
|
88
|
+
text: input.ttsText,
|
|
89
|
+
voiceId: input.voiceId,
|
|
90
|
+
languageCode: input.languageCode,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
finally {
|
|
94
|
+
// Sync call — slot freed immediately on return (success or throw).
|
|
95
|
+
ttsLimiter.releaseSlot();
|
|
96
|
+
}
|
|
97
|
+
const filePath = `agent-avatar-audio/${ctx.userId}/${ctx.agentRunId}-${Date.now()}.${ttsResult.extension}`;
|
|
98
|
+
const file = (0, firebase_1.getBucket)().file(filePath);
|
|
99
|
+
await file.save(ttsResult.audioBuffer, { contentType: ttsResult.mimeType });
|
|
100
|
+
const [signedUrl] = await file.getSignedUrl({ action: "read", expires: "03-09-2491" });
|
|
101
|
+
audioUrl = signedUrl;
|
|
102
|
+
}
|
|
103
|
+
// Hold the Kling-avatar slot through return — host's TaskPoller releases
|
|
104
|
+
// when the task settles. Release here on submit error.
|
|
105
|
+
const limiter = (0, rateLimiter_1.getAiGenModelRateLimiter)(aiModels_1.EVideoGenModels.KLING_AVATAR);
|
|
106
|
+
await limiter.waitUntilAvailable();
|
|
107
|
+
let heldSlot = true;
|
|
108
|
+
try {
|
|
109
|
+
const provider = (0, aiGenFactory_service_1.getAiGenProviderService)(aiModels_1.EVideoGenModels.KLING_AVATAR);
|
|
110
|
+
// No `type` — kling-avatar's modelConfig.type is ["avatar-video"], which is
|
|
111
|
+
// outside the VideoGenerationParams.type union. Setting type:"image-to-video"
|
|
112
|
+
// here trips validateParams (image-to-video branch requires the model's
|
|
113
|
+
// config.type to include "image-to-video", which avatar's doesn't). The
|
|
114
|
+
// kling provider routes by modelKey === "kling-avatar" before any
|
|
115
|
+
// type-based dispatch, so omitting type is correct.
|
|
116
|
+
const result = await provider.generateVideo({
|
|
117
|
+
modelKey: aiModels_1.EVideoGenModels.KLING_AVATAR,
|
|
118
|
+
prompt: input.prompt,
|
|
119
|
+
inputImageUrl: input.inputImageUrl,
|
|
120
|
+
inputAudioUrl: audioUrl,
|
|
121
|
+
mode: input.mode === "pro" ? types_1.EVideoMode.PROFESSIONAL : types_1.EVideoMode.STANDARD,
|
|
122
|
+
});
|
|
123
|
+
const taskId = result.task?.taskId ??
|
|
124
|
+
result.task?.id ??
|
|
125
|
+
(typeof result.task === "string" ? result.task : "unknown");
|
|
126
|
+
if (taskId === "unknown") {
|
|
127
|
+
limiter.releaseSlot();
|
|
128
|
+
heldSlot = false;
|
|
129
|
+
}
|
|
130
|
+
return {
|
|
131
|
+
status: "triggered",
|
|
132
|
+
taskId,
|
|
133
|
+
audioUrl: audioUrl,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
if (heldSlot)
|
|
138
|
+
limiter.releaseSlot();
|
|
139
|
+
throw err;
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
(0, toolRegistry_1.registerTool)(exports.generateAvatarVideoTool);
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { ToolDefinition } from "../toolRegistry";
|
|
3
|
+
declare const InputSchema: z.ZodObject<{
|
|
4
|
+
audioUrl: z.ZodString;
|
|
5
|
+
provider: z.ZodDefault<z.ZodEnum<{
|
|
6
|
+
auto: "auto";
|
|
7
|
+
whisper: "whisper";
|
|
8
|
+
assemblyai: "assemblyai";
|
|
9
|
+
}>>;
|
|
10
|
+
languageCode: z.ZodOptional<z.ZodString>;
|
|
11
|
+
wordTimestamps: z.ZodDefault<z.ZodBoolean>;
|
|
12
|
+
speakerLabels: z.ZodDefault<z.ZodBoolean>;
|
|
13
|
+
redactPii: z.ZodDefault<z.ZodBoolean>;
|
|
14
|
+
maxInlinePollMs: z.ZodDefault<z.ZodNumber>;
|
|
15
|
+
}, z.core.$strip>;
|
|
16
|
+
declare const OutputSchema: z.ZodObject<{
|
|
17
|
+
text: z.ZodString;
|
|
18
|
+
audioDurationSec: z.ZodOptional<z.ZodNumber>;
|
|
19
|
+
words: z.ZodArray<z.ZodObject<{
|
|
20
|
+
text: z.ZodString;
|
|
21
|
+
start: z.ZodNumber;
|
|
22
|
+
end: z.ZodNumber;
|
|
23
|
+
confidence: z.ZodOptional<z.ZodNumber>;
|
|
24
|
+
speaker: z.ZodOptional<z.ZodString>;
|
|
25
|
+
}, z.core.$strip>>;
|
|
26
|
+
utterances: z.ZodArray<z.ZodObject<{
|
|
27
|
+
text: z.ZodString;
|
|
28
|
+
start: z.ZodNumber;
|
|
29
|
+
end: z.ZodNumber;
|
|
30
|
+
speaker: z.ZodString;
|
|
31
|
+
confidence: z.ZodOptional<z.ZodNumber>;
|
|
32
|
+
}, z.core.$strip>>;
|
|
33
|
+
providerUsed: z.ZodEnum<{
|
|
34
|
+
whisper: "whisper";
|
|
35
|
+
assemblyai: "assemblyai";
|
|
36
|
+
}>;
|
|
37
|
+
pending: z.ZodOptional<z.ZodBoolean>;
|
|
38
|
+
pendingId: z.ZodOptional<z.ZodString>;
|
|
39
|
+
}, z.core.$strip>;
|
|
40
|
+
export declare const generateCaptionsTool: ToolDefinition<typeof InputSchema, typeof OutputSchema>;
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=generateCaptions.tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateCaptions.tool.d.ts","sourceRoot":"","sources":["../../../../src/services/agent/tools/generateCaptions.tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,EAAgB,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAS/D,QAAA,MAAM,WAAW;;;;;;;;;;;;iBAuCf,CAAC;AAkBH,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;iBAShB,CAAC;AAIH,eAAO,MAAM,oBAAoB,EAAE,cAAc,CAC/C,OAAO,WAAW,EAClB,OAAO,YAAY,CAsEpB,CAAC"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateCaptionsTool = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const assemblyai_service_1 = require("../../asr/assemblyai.service");
|
|
6
|
+
const whisper_service_1 = require("../../asr/whisper.service");
|
|
7
|
+
const assetCache_service_1 = require("../../assetCache.service");
|
|
8
|
+
const logger_1 = require("../../../utils/logger");
|
|
9
|
+
const toolRegistry_1 = require("../toolRegistry");
|
|
10
|
+
/**
|
|
11
|
+
* Caption transcripts are deterministic per (audio bytes, params), so we
|
|
12
|
+
* cache by the input URL. Long enough to outlive a multi-scene render
|
|
13
|
+
* (~30 min) without keeping stale transcripts forever.
|
|
14
|
+
*/
|
|
15
|
+
const CAPTIONS_CACHE_TTL_MS = 60 * 60 * 1000;
|
|
16
|
+
const InputSchema = zod_1.z.object({
|
|
17
|
+
audioUrl: zod_1.z.string().url().describe("HTTPS URL of the audio (or audio-track-on-video) to transcribe."),
|
|
18
|
+
provider: zod_1.z
|
|
19
|
+
.enum(["assemblyai", "whisper", "auto"])
|
|
20
|
+
.default("auto")
|
|
21
|
+
.describe("Primary ASR provider. 'auto' tries assemblyai first then falls back to whisper on failure (recommended). " +
|
|
22
|
+
"'assemblyai' = highest quality, diarization, ~$0.15/hr, async. " +
|
|
23
|
+
"'whisper' = OpenAI fallback, no diarization, ~$0.36/hr, sync, 25 MB cap."),
|
|
24
|
+
languageCode: zod_1.z
|
|
25
|
+
.string()
|
|
26
|
+
.optional()
|
|
27
|
+
.describe('Locale hint, e.g. "en", "fr". Omit to let the provider auto-detect.'),
|
|
28
|
+
wordTimestamps: zod_1.z
|
|
29
|
+
.boolean()
|
|
30
|
+
.default(true)
|
|
31
|
+
.describe("Return per-word start/end timestamps. Required for karaoke-style caption tracks."),
|
|
32
|
+
speakerLabels: zod_1.z
|
|
33
|
+
.boolean()
|
|
34
|
+
.default(false)
|
|
35
|
+
.describe("Diarization (speaker labels). AssemblyAI-only — Whisper fallback ignores this and logs a warning."),
|
|
36
|
+
redactPii: zod_1.z
|
|
37
|
+
.boolean()
|
|
38
|
+
.default(false)
|
|
39
|
+
.describe("Redact PII (SSN, credit cards, email, phone). AssemblyAI-only — Whisper fallback returns unredacted text."),
|
|
40
|
+
maxInlinePollMs: zod_1.z
|
|
41
|
+
.number()
|
|
42
|
+
.int()
|
|
43
|
+
.min(10000)
|
|
44
|
+
.max(180000)
|
|
45
|
+
.default(120000)
|
|
46
|
+
.describe("Inline-poll budget for AssemblyAI submit→complete (ms). Longer media should be routed through the BullMQ async path by the caller."),
|
|
47
|
+
});
|
|
48
|
+
const WordSchema = zod_1.z.object({
|
|
49
|
+
text: zod_1.z.string(),
|
|
50
|
+
start: zod_1.z.number().describe("Word start in milliseconds."),
|
|
51
|
+
end: zod_1.z.number().describe("Word end in milliseconds."),
|
|
52
|
+
confidence: zod_1.z.number().optional(),
|
|
53
|
+
speaker: zod_1.z.string().optional(),
|
|
54
|
+
});
|
|
55
|
+
const UtteranceSchema = zod_1.z.object({
|
|
56
|
+
text: zod_1.z.string(),
|
|
57
|
+
start: zod_1.z.number(),
|
|
58
|
+
end: zod_1.z.number(),
|
|
59
|
+
speaker: zod_1.z.string(),
|
|
60
|
+
confidence: zod_1.z.number().optional(),
|
|
61
|
+
});
|
|
62
|
+
const OutputSchema = zod_1.z.object({
|
|
63
|
+
text: zod_1.z.string().describe("Plain-text transcript."),
|
|
64
|
+
audioDurationSec: zod_1.z.number().optional(),
|
|
65
|
+
words: zod_1.z.array(WordSchema).describe("Word-level timing for karaoke / caption rendering."),
|
|
66
|
+
utterances: zod_1.z.array(UtteranceSchema).describe("Per-utterance segments when diarization was requested."),
|
|
67
|
+
providerUsed: zod_1.z.enum(["assemblyai", "whisper"]).describe("Which provider actually fulfilled the request."),
|
|
68
|
+
/** True when the call ran past the inline-poll budget and the caller must re-fetch by id later. */
|
|
69
|
+
pending: zod_1.z.boolean().optional(),
|
|
70
|
+
pendingId: zod_1.z.string().optional(),
|
|
71
|
+
});
|
|
72
|
+
exports.generateCaptionsTool = {
|
|
73
|
+
name: "generate_captions",
|
|
74
|
+
description: [
|
|
75
|
+
"Transcribe an audio (or audio-from-video) URL into word-timed captions for overlay on a render.",
|
|
76
|
+
"Default provider is AssemblyAI (best quality + diarization + PII redaction); on transient failure",
|
|
77
|
+
"or unavailability the tool auto-falls-back to OpenAI Whisper. Use this whenever the brief calls",
|
|
78
|
+
"for on-screen captions, subtitle tracks, or per-word karaoke effects — NOT for in-scene voiceover",
|
|
79
|
+
"(use generate_voiceover for that).",
|
|
80
|
+
"Examples:",
|
|
81
|
+
' { audioUrl: "https://storage/.../vo.mp3" }',
|
|
82
|
+
' { audioUrl: "https://storage/.../interview.mp3", speakerLabels: true, languageCode: "en" }',
|
|
83
|
+
].join(" "),
|
|
84
|
+
inputSchema: InputSchema,
|
|
85
|
+
outputSchema: OutputSchema,
|
|
86
|
+
idempotent: true,
|
|
87
|
+
estimateCost: async () => 1,
|
|
88
|
+
handler: async (input, ctx) => {
|
|
89
|
+
// Cache key intentionally excludes maxInlinePollMs — it changes polling
|
|
90
|
+
// behaviour but not the transcript.
|
|
91
|
+
const cacheParts = {
|
|
92
|
+
provider: `asr:${input.provider}`,
|
|
93
|
+
kind: "captions",
|
|
94
|
+
input: {
|
|
95
|
+
audioUrl: input.audioUrl,
|
|
96
|
+
languageCode: input.languageCode,
|
|
97
|
+
wordTimestamps: input.wordTimestamps,
|
|
98
|
+
speakerLabels: input.speakerLabels,
|
|
99
|
+
redactPii: input.redactPii,
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
const hit = await assetCache_service_1.RawAssetCacheService.lookup(cacheParts);
|
|
103
|
+
if (hit)
|
|
104
|
+
return hit;
|
|
105
|
+
const wantPrimary = input.provider === "assemblyai" || input.provider === "auto";
|
|
106
|
+
const wantFallback = input.provider === "whisper" || input.provider === "auto";
|
|
107
|
+
let primaryErr;
|
|
108
|
+
if (wantPrimary) {
|
|
109
|
+
try {
|
|
110
|
+
const out = await runAssemblyAI(input);
|
|
111
|
+
await cacheIfComplete(cacheParts, out);
|
|
112
|
+
return out;
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
primaryErr = err;
|
|
116
|
+
logger_1.logger.warn("generate_captions: AssemblyAI failed, evaluating fallback", {
|
|
117
|
+
agentRunId: ctx?.agentRunId,
|
|
118
|
+
audioUrl: input.audioUrl,
|
|
119
|
+
err: err instanceof Error ? err.stack ?? err.message : String(err),
|
|
120
|
+
});
|
|
121
|
+
if (!wantFallback)
|
|
122
|
+
throw err;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
try {
|
|
126
|
+
const out = await runWhisper(input);
|
|
127
|
+
await cacheIfComplete(cacheParts, out);
|
|
128
|
+
return out;
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
logger_1.logger.error("generate_captions: both providers failed", {
|
|
132
|
+
agentRunId: ctx?.agentRunId,
|
|
133
|
+
audioUrl: input.audioUrl,
|
|
134
|
+
primary: primaryErr?.message,
|
|
135
|
+
fallback: err instanceof Error ? err.stack ?? err.message : String(err),
|
|
136
|
+
});
|
|
137
|
+
throw new Error(`generate_captions failed on all providers. primary=${primaryErr?.message ?? "n/a"} fallback=${err?.message ?? "n/a"}`);
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
};
|
|
141
|
+
async function runAssemblyAI(input) {
|
|
142
|
+
const asr = new assemblyai_service_1.AssemblyAIService();
|
|
143
|
+
const result = await asr.transcribe({
|
|
144
|
+
audioUrl: input.audioUrl,
|
|
145
|
+
languageCode: input.languageCode,
|
|
146
|
+
speakerLabels: input.speakerLabels,
|
|
147
|
+
redactPii: input.redactPii,
|
|
148
|
+
wordTimestamps: input.wordTimestamps,
|
|
149
|
+
}, { timeoutMs: input.maxInlinePollMs });
|
|
150
|
+
return toCaptionsOutput(result, "assemblyai");
|
|
151
|
+
}
|
|
152
|
+
async function runWhisper(input) {
|
|
153
|
+
const asr = new whisper_service_1.WhisperAsrService();
|
|
154
|
+
const result = await asr.transcribe({
|
|
155
|
+
audioUrl: input.audioUrl,
|
|
156
|
+
languageCode: input.languageCode,
|
|
157
|
+
speakerLabels: input.speakerLabels,
|
|
158
|
+
redactPii: input.redactPii,
|
|
159
|
+
wordTimestamps: input.wordTimestamps,
|
|
160
|
+
});
|
|
161
|
+
return toCaptionsOutput(result, "whisper");
|
|
162
|
+
}
|
|
163
|
+
function toCaptionsOutput(result, providerUsed) {
|
|
164
|
+
if (result.status === "error") {
|
|
165
|
+
throw new Error(`ASR provider returned error: ${result.errorMessage ?? "unknown"}`);
|
|
166
|
+
}
|
|
167
|
+
const pending = result.status !== "completed";
|
|
168
|
+
return {
|
|
169
|
+
text: result.text ?? "",
|
|
170
|
+
audioDurationSec: result.audioDuration,
|
|
171
|
+
words: (result.words ?? []).map((w) => ({
|
|
172
|
+
text: w.text,
|
|
173
|
+
start: w.start,
|
|
174
|
+
end: w.end,
|
|
175
|
+
confidence: w.confidence,
|
|
176
|
+
speaker: w.speaker,
|
|
177
|
+
})),
|
|
178
|
+
utterances: (result.utterances ?? []).map((u) => ({
|
|
179
|
+
text: u.text,
|
|
180
|
+
start: u.start,
|
|
181
|
+
end: u.end,
|
|
182
|
+
speaker: u.speaker,
|
|
183
|
+
confidence: u.confidence,
|
|
184
|
+
})),
|
|
185
|
+
providerUsed,
|
|
186
|
+
...(pending ? { pending: true, pendingId: result.id } : {}),
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
async function cacheIfComplete(cacheParts, out) {
|
|
190
|
+
if (out.pending)
|
|
191
|
+
return; // never cache a partial result
|
|
192
|
+
void assetCache_service_1.RawAssetCacheService.store(cacheParts, out, {
|
|
193
|
+
ttlMs: CAPTIONS_CACHE_TTL_MS,
|
|
194
|
+
}).catch(() => undefined);
|
|
195
|
+
}
|
|
196
|
+
(0, toolRegistry_1.registerTool)(exports.generateCaptionsTool);
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* generate_image agent tool.
|
|
3
|
+
*
|
|
4
|
+
* Re-enabled 2026-05-17 (was previously fenced when only the disabled FAL
|
|
5
|
+
* provider existed). Now dispatches via getAiGenProviderService() so it works
|
|
6
|
+
* against every image model registered in imageServicesMap (Google Imagen +
|
|
7
|
+
* Nano Banana, OpenAI gpt-image, ByteDance Seedream, Kling Kolors, Alibaba
|
|
8
|
+
* Qwen, MiniMax image-01, Runway Gen-4 Image).
|
|
9
|
+
*
|
|
10
|
+
* Defaults to google-nano-banana — cheapest image-gen we have that ALSO
|
|
11
|
+
* supports multi-image reference inputs (key requirement for AG-13 / C2
|
|
12
|
+
* reference-image anchoring). Switch via modelKey when a higher tier is
|
|
13
|
+
* worth it (gpt-image-1 for hero shots, runwayml-gen4-image for cinematic).
|
|
14
|
+
*
|
|
15
|
+
* Supports image-to-image / instruction edits via `inputImageUrl` (single
|
|
16
|
+
* ref, legacy) or `inputImageUrls` (multi-ref — used by AG-13 to thread the
|
|
17
|
+
* character + product reference images into every scene's image gen).
|
|
18
|
+
*/
|
|
19
|
+
import { z } from "zod";
|
|
20
|
+
import { ToolDefinition } from "../toolRegistry";
|
|
21
|
+
declare const InputSchema: z.ZodObject<{
|
|
22
|
+
prompt: z.ZodString;
|
|
23
|
+
modelKey: z.ZodDefault<z.ZodEnum<{
|
|
24
|
+
"google-imagen-4-ultra": "google-imagen-4-ultra";
|
|
25
|
+
"google-imagen-4": "google-imagen-4";
|
|
26
|
+
"google-imagen-4-fast": "google-imagen-4-fast";
|
|
27
|
+
"google-nano-banana-pro": "google-nano-banana-pro";
|
|
28
|
+
"google-nano-banana": "google-nano-banana";
|
|
29
|
+
"openai-gpt-image-2": "openai-gpt-image-2";
|
|
30
|
+
"openai-gpt-image-1.5": "openai-gpt-image-1.5";
|
|
31
|
+
"openai-gpt-image-1": "openai-gpt-image-1";
|
|
32
|
+
"openai-gpt-image-1-mini": "openai-gpt-image-1-mini";
|
|
33
|
+
"bytedance-seedream-5-lite": "bytedance-seedream-5-lite";
|
|
34
|
+
"kling-kolors": "kling-kolors";
|
|
35
|
+
"alibaba-qwen-image-2.0-pro": "alibaba-qwen-image-2.0-pro";
|
|
36
|
+
"alibaba-qwen-image-2.0": "alibaba-qwen-image-2.0";
|
|
37
|
+
"alibaba-qwen-image-edit-max": "alibaba-qwen-image-edit-max";
|
|
38
|
+
"alibaba-qwen-image-edit-plus": "alibaba-qwen-image-edit-plus";
|
|
39
|
+
"alibaba-qwen-image-edit": "alibaba-qwen-image-edit";
|
|
40
|
+
"minimax-image-01": "minimax-image-01";
|
|
41
|
+
"runwayml-gen4-image": "runwayml-gen4-image";
|
|
42
|
+
"runwayml-gen4-image-turbo": "runwayml-gen4-image-turbo";
|
|
43
|
+
}>>;
|
|
44
|
+
aspectRatio: z.ZodDefault<z.ZodEnum<{
|
|
45
|
+
"9:16": "9:16";
|
|
46
|
+
"1:1": "1:1";
|
|
47
|
+
"4:5": "4:5";
|
|
48
|
+
"16:9": "16:9";
|
|
49
|
+
"4:3": "4:3";
|
|
50
|
+
"3:4": "3:4";
|
|
51
|
+
}>>;
|
|
52
|
+
dimensions: z.ZodOptional<z.ZodString>;
|
|
53
|
+
inputImageUrl: z.ZodOptional<z.ZodString>;
|
|
54
|
+
inputImageUrls: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
55
|
+
negativePrompt: z.ZodOptional<z.ZodString>;
|
|
56
|
+
seed: z.ZodOptional<z.ZodNumber>;
|
|
57
|
+
numImages: z.ZodDefault<z.ZodNumber>;
|
|
58
|
+
outputFormat: z.ZodOptional<z.ZodEnum<{
|
|
59
|
+
png: "png";
|
|
60
|
+
jpeg: "jpeg";
|
|
61
|
+
webp: "webp";
|
|
62
|
+
}>>;
|
|
63
|
+
}, z.core.$strip>;
|
|
64
|
+
declare const OutputSchema: z.ZodObject<{
|
|
65
|
+
imageUrl: z.ZodString;
|
|
66
|
+
imageUrls: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
67
|
+
width: z.ZodOptional<z.ZodNumber>;
|
|
68
|
+
height: z.ZodOptional<z.ZodNumber>;
|
|
69
|
+
modelKeyUsed: z.ZodString;
|
|
70
|
+
seed: z.ZodOptional<z.ZodNumber>;
|
|
71
|
+
}, z.core.$strip>;
|
|
72
|
+
export declare const generateImageTool: ToolDefinition<typeof InputSchema, typeof OutputSchema>;
|
|
73
|
+
export {};
|
|
74
|
+
//# sourceMappingURL=generateImage.tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateImage.tool.d.ts","sourceRoot":"","sources":["../../../../src/services/agent/tools/generateImage.tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,EAAgB,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAwB/D,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAkCf,CAAC;AAEH,QAAA,MAAM,YAAY;;;;;;;iBAOhB,CAAC;AA2BH,eAAO,MAAM,iBAAiB,EAAE,cAAc,CAC5C,OAAO,WAAW,EAClB,OAAO,YAAY,CAuGpB,CAAC"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateImageTool = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* generate_image agent tool.
|
|
6
|
+
*
|
|
7
|
+
* Re-enabled 2026-05-17 (was previously fenced when only the disabled FAL
|
|
8
|
+
* provider existed). Now dispatches via getAiGenProviderService() so it works
|
|
9
|
+
* against every image model registered in imageServicesMap (Google Imagen +
|
|
10
|
+
* Nano Banana, OpenAI gpt-image, ByteDance Seedream, Kling Kolors, Alibaba
|
|
11
|
+
* Qwen, MiniMax image-01, Runway Gen-4 Image).
|
|
12
|
+
*
|
|
13
|
+
* Defaults to google-nano-banana — cheapest image-gen we have that ALSO
|
|
14
|
+
* supports multi-image reference inputs (key requirement for AG-13 / C2
|
|
15
|
+
* reference-image anchoring). Switch via modelKey when a higher tier is
|
|
16
|
+
* worth it (gpt-image-1 for hero shots, runwayml-gen4-image for cinematic).
|
|
17
|
+
*
|
|
18
|
+
* Supports image-to-image / instruction edits via `inputImageUrl` (single
|
|
19
|
+
* ref, legacy) or `inputImageUrls` (multi-ref — used by AG-13 to thread the
|
|
20
|
+
* character + product reference images into every scene's image gen).
|
|
21
|
+
*/
|
|
22
|
+
const zod_1 = require("zod");
|
|
23
|
+
const enums_1 = require("../../../globals/aiModels/enums");
|
|
24
|
+
const assetCache_service_1 = require("../../assetCache.service");
|
|
25
|
+
const aiGenFactory_service_1 = require("../../aiGen/aiGenFactory.service");
|
|
26
|
+
const rateLimiter_1 = require("../../rateLimiter");
|
|
27
|
+
const toolRegistry_1 = require("../toolRegistry");
|
|
28
|
+
const ModelKeyEnum = zod_1.z.enum([
|
|
29
|
+
enums_1.EImageGenModels.GOOGLE_NANO_BANANA,
|
|
30
|
+
enums_1.EImageGenModels.GOOGLE_NANO_BANANA_PRO,
|
|
31
|
+
enums_1.EImageGenModels.GOOGLE_IMAGEN_4_FAST,
|
|
32
|
+
enums_1.EImageGenModels.GOOGLE_IMAGEN_4,
|
|
33
|
+
enums_1.EImageGenModels.GOOGLE_IMAGEN_4_ULTRA,
|
|
34
|
+
enums_1.EImageGenModels.OPENAI_GPT_IMAGE_1_MINI,
|
|
35
|
+
enums_1.EImageGenModels.OPENAI_GPT_IMAGE_1,
|
|
36
|
+
enums_1.EImageGenModels.OPENAI_GPT_IMAGE_1_5,
|
|
37
|
+
enums_1.EImageGenModels.OPENAI_GPT_IMAGE_2,
|
|
38
|
+
enums_1.EImageGenModels.BYTEDANCE_SEEDREAM_5_LITE,
|
|
39
|
+
enums_1.EImageGenModels.KLING_KOLORS,
|
|
40
|
+
enums_1.EImageGenModels.ALIBABA_QWEN_IMAGE_2,
|
|
41
|
+
enums_1.EImageGenModels.ALIBABA_QWEN_IMAGE_2_PRO,
|
|
42
|
+
enums_1.EImageGenModels.ALIBABA_QWEN_IMAGE_EDIT,
|
|
43
|
+
enums_1.EImageGenModels.ALIBABA_QWEN_IMAGE_EDIT_PLUS,
|
|
44
|
+
enums_1.EImageGenModels.ALIBABA_QWEN_IMAGE_EDIT_MAX,
|
|
45
|
+
enums_1.EImageGenModels.MINIMAX_IMAGE_01,
|
|
46
|
+
enums_1.EImageGenModels.RUNWAYML_GEN4_IMAGE_TURBO,
|
|
47
|
+
enums_1.EImageGenModels.RUNWAYML_GEN4_IMAGE,
|
|
48
|
+
]);
|
|
49
|
+
const InputSchema = zod_1.z.object({
|
|
50
|
+
prompt: zod_1.z
|
|
51
|
+
.string()
|
|
52
|
+
.min(1)
|
|
53
|
+
.describe("Detailed visual prompt. Lighting, lens, camera angle, mood, subject identity — more specific = more on-brief."),
|
|
54
|
+
modelKey: ModelKeyEnum.default(enums_1.EImageGenModels.GOOGLE_NANO_BANANA).describe("Image model. Default google-nano-banana — cheap, fast, supports multi-image refs (used for character/object anchoring). Use gpt-image-1 or runwayml-gen4-image for premium hero shots."),
|
|
55
|
+
aspectRatio: zod_1.z.enum(["9:16", "1:1", "4:5", "16:9", "3:4", "4:3"]).default("9:16"),
|
|
56
|
+
dimensions: zod_1.z
|
|
57
|
+
.string()
|
|
58
|
+
.regex(/^\d+x\d+$/)
|
|
59
|
+
.optional()
|
|
60
|
+
.describe('Explicit "WxH" override. Overrides aspectRatio.'),
|
|
61
|
+
inputImageUrl: zod_1.z
|
|
62
|
+
.string()
|
|
63
|
+
.url()
|
|
64
|
+
.optional()
|
|
65
|
+
.describe("Optional source image for image-to-image edits. Single-ref (legacy) — prefer inputImageUrls for multi-ref."),
|
|
66
|
+
inputImageUrls: zod_1.z
|
|
67
|
+
.array(zod_1.z.string().url())
|
|
68
|
+
.max(16)
|
|
69
|
+
.optional()
|
|
70
|
+
.describe("Multi-image references for identity transfer / composition. Used by AG-13 to thread character + product reference images into scene-level image gens. Per-provider caps: OpenAI ≤16, Nano Banana ≤14, Seedream ≤10, Qwen 1–3, MiniMax 1."),
|
|
71
|
+
negativePrompt: zod_1.z.string().optional(),
|
|
72
|
+
seed: zod_1.z.number().int().optional(),
|
|
73
|
+
numImages: zod_1.z.number().int().min(1).max(4).default(1),
|
|
74
|
+
outputFormat: zod_1.z.enum(["png", "jpeg", "webp"]).optional(),
|
|
75
|
+
});
|
|
76
|
+
const OutputSchema = zod_1.z.object({
|
|
77
|
+
imageUrl: zod_1.z.string().url(),
|
|
78
|
+
imageUrls: zod_1.z.array(zod_1.z.string().url()).optional(),
|
|
79
|
+
width: zod_1.z.number().optional(),
|
|
80
|
+
height: zod_1.z.number().optional(),
|
|
81
|
+
modelKeyUsed: zod_1.z.string(),
|
|
82
|
+
seed: zod_1.z.number().optional(),
|
|
83
|
+
});
|
|
84
|
+
// Indicative credit estimates (per single image, 1024x1024-ish output). Real
|
|
85
|
+
// cost comes from provider response when available; this is for pre-spend
|
|
86
|
+
// budgeting in estimate_cost. Order roughly cheapest → most expensive.
|
|
87
|
+
const COST_BY_MODEL = {
|
|
88
|
+
[enums_1.EImageGenModels.GOOGLE_NANO_BANANA]: 1,
|
|
89
|
+
[enums_1.EImageGenModels.GOOGLE_IMAGEN_4_FAST]: 1,
|
|
90
|
+
[enums_1.EImageGenModels.OPENAI_GPT_IMAGE_1_MINI]: 1,
|
|
91
|
+
[enums_1.EImageGenModels.GOOGLE_NANO_BANANA_PRO]: 2,
|
|
92
|
+
[enums_1.EImageGenModels.GOOGLE_IMAGEN_4]: 2,
|
|
93
|
+
[enums_1.EImageGenModels.BYTEDANCE_SEEDREAM_5_LITE]: 2,
|
|
94
|
+
[enums_1.EImageGenModels.KLING_KOLORS]: 2,
|
|
95
|
+
[enums_1.EImageGenModels.ALIBABA_QWEN_IMAGE_2]: 2,
|
|
96
|
+
[enums_1.EImageGenModels.MINIMAX_IMAGE_01]: 2,
|
|
97
|
+
[enums_1.EImageGenModels.GOOGLE_IMAGEN_4_ULTRA]: 4,
|
|
98
|
+
[enums_1.EImageGenModels.ALIBABA_QWEN_IMAGE_2_PRO]: 4,
|
|
99
|
+
[enums_1.EImageGenModels.ALIBABA_QWEN_IMAGE_EDIT]: 4,
|
|
100
|
+
[enums_1.EImageGenModels.ALIBABA_QWEN_IMAGE_EDIT_PLUS]: 4,
|
|
101
|
+
[enums_1.EImageGenModels.ALIBABA_QWEN_IMAGE_EDIT_MAX]: 5,
|
|
102
|
+
[enums_1.EImageGenModels.RUNWAYML_GEN4_IMAGE_TURBO]: 3,
|
|
103
|
+
[enums_1.EImageGenModels.RUNWAYML_GEN4_IMAGE]: 5,
|
|
104
|
+
[enums_1.EImageGenModels.OPENAI_GPT_IMAGE_1]: 4,
|
|
105
|
+
[enums_1.EImageGenModels.OPENAI_GPT_IMAGE_1_5]: 5,
|
|
106
|
+
[enums_1.EImageGenModels.OPENAI_GPT_IMAGE_2]: 6,
|
|
107
|
+
};
|
|
108
|
+
exports.generateImageTool = {
|
|
109
|
+
name: "generate_image",
|
|
110
|
+
description: [
|
|
111
|
+
"Generate a still image from a text prompt (T1 tier — costs credits but much",
|
|
112
|
+
"cheaper than video generation). Use for scene b-roll, product shots, or as",
|
|
113
|
+
"the source frame for animate_image / animate-to-video (T2 indirect path).",
|
|
114
|
+
"Supports image-to-image edits and multi-image identity transfer via",
|
|
115
|
+
"inputImageUrl / inputImageUrls — pass the character or product reference",
|
|
116
|
+
"image(s) to keep visual identity locked across scenes.",
|
|
117
|
+
"Do NOT use for: stock-grade generic visuals (use search_stock — free) or",
|
|
118
|
+
"scenes that fundamentally need motion (use generate_video / animate_image).",
|
|
119
|
+
"Examples:",
|
|
120
|
+
' { prompt: "cinematic golden-hour ocean cliff", aspectRatio: "9:16" }',
|
|
121
|
+
' { prompt: "the same woman, holding the product, kitchen", inputImageUrls: ["https://char-ref.png", "https://product-ref.png"], modelKey: "google-nano-banana" }',
|
|
122
|
+
].join(" "),
|
|
123
|
+
inputSchema: InputSchema,
|
|
124
|
+
outputSchema: OutputSchema,
|
|
125
|
+
idempotent: true,
|
|
126
|
+
estimateCost: async (input) => (COST_BY_MODEL[input.modelKey] ?? 2) * input.numImages,
|
|
127
|
+
handler: async (input, ctx) => {
|
|
128
|
+
// AG-29: brand text degraded across reference-anchored scenes (Test 1 had
|
|
129
|
+
// "HydraPure" rendered as "Hydropure" / "HydrraPure" / mirrored text). The
|
|
130
|
+
// image-gen models accept negativePrompt; default a text-fidelity clause
|
|
131
|
+
// when the caller didn't provide one. Cheap insurance against the most
|
|
132
|
+
// common product-ad failure mode.
|
|
133
|
+
const TEXT_FIDELITY_NEGATIVE = "distorted text, misspelled words, illegible letters, garbled typography, mangled brand names, mirrored letters, jumbled lettering, deformed logo, extra letters, missing letters, blurry text, watermark";
|
|
134
|
+
const effectiveNegativePrompt = input.negativePrompt
|
|
135
|
+
? `${input.negativePrompt}, ${TEXT_FIDELITY_NEGATIVE}`
|
|
136
|
+
: TEXT_FIDELITY_NEGATIVE;
|
|
137
|
+
const cacheParts = {
|
|
138
|
+
provider: `image:${input.modelKey}`,
|
|
139
|
+
input: {
|
|
140
|
+
prompt: input.prompt,
|
|
141
|
+
aspectRatio: input.aspectRatio,
|
|
142
|
+
dimensions: input.dimensions,
|
|
143
|
+
inputImageUrl: input.inputImageUrl,
|
|
144
|
+
inputImageUrls: input.inputImageUrls,
|
|
145
|
+
negativePrompt: effectiveNegativePrompt,
|
|
146
|
+
seed: input.seed,
|
|
147
|
+
numImages: input.numImages,
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
const hit = await assetCache_service_1.AssetCacheService.lookup(cacheParts);
|
|
151
|
+
if (hit) {
|
|
152
|
+
return {
|
|
153
|
+
imageUrl: hit.url,
|
|
154
|
+
width: hit.width,
|
|
155
|
+
height: hit.height,
|
|
156
|
+
modelKeyUsed: input.modelKey,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
const provider = (0, aiGenFactory_service_1.getAiGenProviderService)(input.modelKey);
|
|
160
|
+
if (!provider.generateImage) {
|
|
161
|
+
throw new Error(`Provider for ${input.modelKey} does not implement generateImage().`);
|
|
162
|
+
}
|
|
163
|
+
// Synchronous provider call — slot released on return (try/finally).
|
|
164
|
+
// Per-min + per-day are consumed atomically inside waitUntilAvailable
|
|
165
|
+
// and auto-expire in Redis; only the in-process concurrent counter
|
|
166
|
+
// needs an explicit release.
|
|
167
|
+
const limiter = (0, rateLimiter_1.getAiGenModelRateLimiter)(input.modelKey);
|
|
168
|
+
await limiter.waitUntilAvailable();
|
|
169
|
+
let result;
|
|
170
|
+
try {
|
|
171
|
+
result = await provider.generateImage({
|
|
172
|
+
prompt: input.prompt,
|
|
173
|
+
modelKey: input.modelKey,
|
|
174
|
+
aspectRatio: input.aspectRatio,
|
|
175
|
+
dimensions: input.dimensions,
|
|
176
|
+
inputImageUrl: input.inputImageUrl,
|
|
177
|
+
inputImageUrls: input.inputImageUrls,
|
|
178
|
+
negativePrompt: effectiveNegativePrompt,
|
|
179
|
+
seed: input.seed,
|
|
180
|
+
numImages: input.numImages,
|
|
181
|
+
outputFormat: input.outputFormat,
|
|
182
|
+
idempotencyKey: ctx.idempotencyKey,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
finally {
|
|
186
|
+
limiter.releaseSlot();
|
|
187
|
+
}
|
|
188
|
+
await assetCache_service_1.AssetCacheService.store(cacheParts, {
|
|
189
|
+
provider: `image:${input.modelKey}`,
|
|
190
|
+
kind: "image",
|
|
191
|
+
url: result.imageUrl,
|
|
192
|
+
width: result.width,
|
|
193
|
+
height: result.height,
|
|
194
|
+
originalCreditsSpent: (COST_BY_MODEL[input.modelKey] ?? 2) * input.numImages,
|
|
195
|
+
});
|
|
196
|
+
return {
|
|
197
|
+
imageUrl: result.imageUrl,
|
|
198
|
+
imageUrls: result.imageUrls,
|
|
199
|
+
width: result.width,
|
|
200
|
+
height: result.height,
|
|
201
|
+
modelKeyUsed: input.modelKey,
|
|
202
|
+
seed: result.seed,
|
|
203
|
+
};
|
|
204
|
+
},
|
|
205
|
+
};
|
|
206
|
+
(0, toolRegistry_1.registerTool)(exports.generateImageTool);
|