@juspay/neurolink 9.31.2 → 9.32.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.
- package/CHANGELOG.md +12 -0
- package/dist/auth/AuthProviderFactory.d.ts +71 -0
- package/dist/auth/AuthProviderFactory.js +111 -0
- package/dist/auth/AuthProviderRegistry.d.ts +33 -0
- package/dist/auth/AuthProviderRegistry.js +190 -0
- package/dist/auth/RequestContext.d.ts +23 -0
- package/dist/auth/RequestContext.js +78 -0
- package/dist/auth/anthropicOAuth.js +1 -1
- package/dist/auth/authContext.d.ts +198 -0
- package/dist/auth/authContext.js +314 -0
- package/dist/auth/errors.d.ts +63 -0
- package/dist/auth/errors.js +39 -0
- package/dist/auth/index.d.ts +20 -8
- package/dist/auth/index.js +35 -7
- package/dist/auth/middleware/AuthMiddleware.d.ts +181 -0
- package/dist/auth/middleware/AuthMiddleware.js +519 -0
- package/dist/auth/middleware/rateLimitByUser.d.ts +282 -0
- package/dist/auth/middleware/rateLimitByUser.js +554 -0
- package/dist/auth/providers/BaseAuthProvider.d.ts +259 -0
- package/dist/auth/providers/BaseAuthProvider.js +723 -0
- package/dist/auth/providers/CognitoProvider.d.ts +61 -0
- package/dist/auth/providers/CognitoProvider.js +304 -0
- package/dist/auth/providers/KeycloakProvider.d.ts +61 -0
- package/dist/auth/providers/KeycloakProvider.js +393 -0
- package/dist/auth/providers/auth0.d.ts +59 -0
- package/dist/auth/providers/auth0.js +274 -0
- package/dist/auth/providers/betterAuth.d.ts +51 -0
- package/dist/auth/providers/betterAuth.js +182 -0
- package/dist/auth/providers/clerk.d.ts +65 -0
- package/dist/auth/providers/clerk.js +317 -0
- package/dist/auth/providers/custom.d.ts +64 -0
- package/dist/auth/providers/custom.js +112 -0
- package/dist/auth/providers/firebase.d.ts +63 -0
- package/dist/auth/providers/firebase.js +226 -0
- package/dist/auth/providers/jwt.d.ts +68 -0
- package/dist/auth/providers/jwt.js +212 -0
- package/dist/auth/providers/oauth2.d.ts +73 -0
- package/dist/auth/providers/oauth2.js +303 -0
- package/dist/auth/providers/supabase.d.ts +63 -0
- package/dist/auth/providers/supabase.js +259 -0
- package/dist/auth/providers/workos.d.ts +61 -0
- package/dist/auth/providers/workos.js +284 -0
- package/dist/auth/serverBridge.d.ts +14 -0
- package/dist/auth/serverBridge.js +25 -0
- package/dist/auth/sessionManager.d.ts +142 -0
- package/dist/auth/sessionManager.js +437 -0
- package/dist/cli/commands/authProviders.d.ts +43 -0
- package/dist/cli/commands/authProviders.js +399 -0
- package/dist/cli/commands/proxy.js +18 -5
- package/dist/cli/factories/authCommandFactory.d.ts +23 -5
- package/dist/cli/factories/authCommandFactory.js +108 -5
- package/dist/cli/parser.js +1 -1
- package/dist/client/aiSdkAdapter.js +1 -1
- package/dist/client/index.js +138 -477
- package/dist/core/factory.js +0 -1
- package/dist/core/infrastructure/baseRegistry.d.ts +3 -1
- package/dist/core/infrastructure/baseRegistry.js +5 -1
- package/dist/core/redisConversationMemoryManager.js +1 -1
- package/dist/features/ppt/slideGenerator.js +0 -1
- package/dist/features/ppt/utils.js +0 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +25 -0
- package/dist/lib/auth/AuthProviderFactory.d.ts +71 -0
- package/dist/lib/auth/AuthProviderFactory.js +112 -0
- package/dist/lib/auth/AuthProviderRegistry.d.ts +33 -0
- package/dist/lib/auth/AuthProviderRegistry.js +191 -0
- package/dist/lib/auth/RequestContext.d.ts +23 -0
- package/dist/lib/auth/RequestContext.js +79 -0
- package/dist/lib/auth/authContext.d.ts +198 -0
- package/dist/lib/auth/authContext.js +315 -0
- package/dist/lib/auth/errors.d.ts +63 -0
- package/dist/lib/auth/errors.js +40 -0
- package/dist/lib/auth/index.d.ts +20 -8
- package/dist/lib/auth/index.js +35 -7
- package/dist/lib/auth/middleware/AuthMiddleware.d.ts +181 -0
- package/dist/lib/auth/middleware/AuthMiddleware.js +520 -0
- package/dist/lib/auth/middleware/rateLimitByUser.d.ts +282 -0
- package/dist/lib/auth/middleware/rateLimitByUser.js +555 -0
- package/dist/lib/auth/providers/BaseAuthProvider.d.ts +259 -0
- package/dist/lib/auth/providers/BaseAuthProvider.js +724 -0
- package/dist/lib/auth/providers/CognitoProvider.d.ts +61 -0
- package/dist/lib/auth/providers/CognitoProvider.js +305 -0
- package/dist/lib/auth/providers/KeycloakProvider.d.ts +61 -0
- package/dist/lib/auth/providers/KeycloakProvider.js +394 -0
- package/dist/lib/auth/providers/auth0.d.ts +59 -0
- package/dist/lib/auth/providers/auth0.js +275 -0
- package/dist/lib/auth/providers/betterAuth.d.ts +51 -0
- package/dist/lib/auth/providers/betterAuth.js +183 -0
- package/dist/lib/auth/providers/clerk.d.ts +65 -0
- package/dist/lib/auth/providers/clerk.js +318 -0
- package/dist/lib/auth/providers/custom.d.ts +64 -0
- package/dist/lib/auth/providers/custom.js +113 -0
- package/dist/lib/auth/providers/firebase.d.ts +63 -0
- package/dist/lib/auth/providers/firebase.js +227 -0
- package/dist/lib/auth/providers/jwt.d.ts +68 -0
- package/dist/lib/auth/providers/jwt.js +213 -0
- package/dist/lib/auth/providers/oauth2.d.ts +73 -0
- package/dist/lib/auth/providers/oauth2.js +304 -0
- package/dist/lib/auth/providers/supabase.d.ts +63 -0
- package/dist/lib/auth/providers/supabase.js +260 -0
- package/dist/lib/auth/providers/workos.d.ts +61 -0
- package/dist/lib/auth/providers/workos.js +285 -0
- package/dist/lib/auth/serverBridge.d.ts +14 -0
- package/dist/lib/auth/serverBridge.js +26 -0
- package/dist/lib/auth/sessionManager.d.ts +142 -0
- package/dist/lib/auth/sessionManager.js +438 -0
- package/dist/lib/core/infrastructure/baseRegistry.d.ts +3 -1
- package/dist/lib/core/infrastructure/baseRegistry.js +5 -1
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/index.js +25 -0
- package/dist/lib/mcp/toolRegistry.js +11 -1
- package/dist/lib/neurolink.d.ts +42 -1
- package/dist/lib/neurolink.js +218 -0
- package/dist/lib/rag/ChunkerRegistry.js +2 -2
- package/dist/lib/rag/metadata/MetadataExtractorRegistry.js +2 -2
- package/dist/lib/rag/reranker/RerankerRegistry.js +2 -2
- package/dist/lib/server/routes/agentRoutes.js +20 -2
- package/dist/lib/server/routes/claudeProxyRoutes.js +45 -9
- package/dist/lib/types/authTypes.d.ts +937 -1
- package/dist/lib/types/authTypes.js +2 -1
- package/dist/lib/types/configTypes.d.ts +46 -0
- package/dist/lib/types/generateTypes.d.ts +6 -0
- package/dist/lib/types/index.d.ts +1 -0
- package/dist/lib/types/streamTypes.d.ts +6 -0
- package/dist/mcp/elicitationProtocol.js +1 -1
- package/dist/mcp/servers/agent/directToolsServer.js +0 -1
- package/dist/mcp/toolRegistry.js +11 -1
- package/dist/neurolink.d.ts +42 -1
- package/dist/neurolink.js +218 -0
- package/dist/providers/azureOpenai.js +1 -1
- package/dist/providers/huggingFace.js +0 -1
- package/dist/providers/openaiCompatible.js +0 -1
- package/dist/rag/ChunkerRegistry.js +2 -2
- package/dist/rag/metadata/MetadataExtractorRegistry.js +2 -2
- package/dist/rag/reranker/RerankerRegistry.js +2 -2
- package/dist/sdk/toolRegistration.js +0 -1
- package/dist/server/openapi/generator.js +1 -1
- package/dist/server/routes/agentRoutes.js +20 -2
- package/dist/server/routes/claudeProxyRoutes.js +45 -9
- package/dist/types/authTypes.d.ts +937 -1
- package/dist/types/authTypes.js +2 -1
- package/dist/types/configTypes.d.ts +46 -0
- package/dist/types/configTypes.js +0 -5
- package/dist/types/generateTypes.d.ts +6 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/modelTypes.js +0 -1
- package/dist/types/streamTypes.d.ts +6 -0
- package/dist/types/tools.js +0 -1
- package/dist/types/typeAliases.js +0 -1
- package/dist/types/utilities.js +1 -1
- package/dist/types/workflowTypes.js +0 -1
- package/dist/utils/providerRetry.js +0 -1
- package/dist/utils/providerUtils.js +0 -1
- package/package.json +3 -2
- package/dist/client/adapters/providerImageAdapter.js +0 -588
- package/dist/client/adapters/tts/googleTTSHandler.js +0 -344
- package/dist/client/adapters/video/directorPipeline.js +0 -516
- package/dist/client/adapters/video/ffmpegAdapter.js +0 -206
- package/dist/client/adapters/video/frameExtractor.js +0 -143
- package/dist/client/adapters/video/vertexVideoHandler.js +0 -763
- package/dist/client/adapters/video/videoAnalyzer.js +0 -238
- package/dist/client/adapters/video/videoMerger.js +0 -171
- package/dist/client/agent/directTools.js +0 -840
- package/dist/client/auth/anthropicOAuth.js +0 -974
- package/dist/client/auth/tokenStore.js +0 -799
- package/dist/client/client/aiSdkAdapter.js +0 -487
- package/dist/client/client/auth.js +0 -473
- package/dist/client/client/errors.js +0 -552
- package/dist/client/client/httpClient.js +0 -837
- package/dist/client/client/index.js +0 -172
- package/dist/client/client/interceptors.js +0 -601
- package/dist/client/client/sseClient.js +0 -545
- package/dist/client/client/streamingClient.js +0 -917
- package/dist/client/client/wsClient.js +0 -369
- package/dist/client/config/configManager.js +0 -303
- package/dist/client/config/conversationMemory.js +0 -86
- package/dist/client/config/taskClassificationConfig.js +0 -148
- package/dist/client/constants/contextWindows.js +0 -295
- package/dist/client/constants/enums.js +0 -853
- package/dist/client/constants/index.js +0 -207
- package/dist/client/constants/performance.js +0 -389
- package/dist/client/constants/retry.js +0 -266
- package/dist/client/constants/timeouts.js +0 -182
- package/dist/client/constants/tokens.js +0 -380
- package/dist/client/constants/videoErrors.js +0 -46
- package/dist/client/context/budgetChecker.js +0 -98
- package/dist/client/context/contextCompactor.js +0 -205
- package/dist/client/context/emergencyTruncation.js +0 -88
- package/dist/client/context/errorDetection.js +0 -171
- package/dist/client/context/errors.js +0 -21
- package/dist/client/context/fileTokenBudget.js +0 -127
- package/dist/client/context/prompts/summarizationPrompt.js +0 -117
- package/dist/client/context/stages/fileReadDeduplicator.js +0 -66
- package/dist/client/context/stages/slidingWindowTruncator.js +0 -190
- package/dist/client/context/stages/structuredSummarizer.js +0 -99
- package/dist/client/context/stages/toolOutputPruner.js +0 -52
- package/dist/client/context/summarizationEngine.js +0 -136
- package/dist/client/context/toolOutputLimits.js +0 -78
- package/dist/client/context/toolPairRepair.js +0 -66
- package/dist/client/core/analytics.js +0 -88
- package/dist/client/core/baseProvider.js +0 -1385
- package/dist/client/core/constants.js +0 -140
- package/dist/client/core/conversationMemoryFactory.js +0 -141
- package/dist/client/core/conversationMemoryInitializer.js +0 -128
- package/dist/client/core/conversationMemoryManager.js +0 -344
- package/dist/client/core/dynamicModels.js +0 -358
- package/dist/client/core/evaluation.js +0 -309
- package/dist/client/core/evaluationProviders.js +0 -248
- package/dist/client/core/factory.js +0 -412
- package/dist/client/core/infrastructure/baseError.js +0 -22
- package/dist/client/core/infrastructure/baseFactory.js +0 -54
- package/dist/client/core/infrastructure/baseRegistry.js +0 -49
- package/dist/client/core/infrastructure/index.js +0 -5
- package/dist/client/core/infrastructure/retry.js +0 -20
- package/dist/client/core/infrastructure/typedEventEmitter.js +0 -23
- package/dist/client/core/modelConfiguration.js +0 -851
- package/dist/client/core/modules/GenerationHandler.js +0 -588
- package/dist/client/core/modules/MessageBuilder.js +0 -273
- package/dist/client/core/modules/StreamHandler.js +0 -185
- package/dist/client/core/modules/TelemetryHandler.js +0 -203
- package/dist/client/core/modules/ToolsManager.js +0 -499
- package/dist/client/core/modules/Utilities.js +0 -331
- package/dist/client/core/redisConversationMemoryManager.js +0 -1435
- package/dist/client/core/streamAnalytics.js +0 -131
- package/dist/client/evaluation/contextBuilder.js +0 -134
- package/dist/client/evaluation/index.js +0 -61
- package/dist/client/evaluation/prompts.js +0 -73
- package/dist/client/evaluation/ragasEvaluator.js +0 -110
- package/dist/client/evaluation/retryManager.js +0 -78
- package/dist/client/evaluation/scoring.js +0 -61
- package/dist/client/factories/providerFactory.js +0 -166
- package/dist/client/factories/providerRegistry.js +0 -166
- package/dist/client/features/ppt/constants.js +0 -896
- package/dist/client/features/ppt/contentPlanner.js +0 -529
- package/dist/client/features/ppt/presentationOrchestrator.js +0 -236
- package/dist/client/features/ppt/slideGenerator.js +0 -532
- package/dist/client/features/ppt/slideRenderers.js +0 -2383
- package/dist/client/features/ppt/slideTypeInference.js +0 -405
- package/dist/client/features/ppt/types.js +0 -13
- package/dist/client/features/ppt/utils.js +0 -443
- package/dist/client/files/fileReferenceRegistry.js +0 -1543
- package/dist/client/files/fileTools.js +0 -450
- package/dist/client/files/streamingReader.js +0 -321
- package/dist/client/files/types.js +0 -23
- package/dist/client/hitl/hitlErrors.js +0 -54
- package/dist/client/hitl/hitlManager.js +0 -460
- package/dist/client/mcp/agentExposure.js +0 -356
- package/dist/client/mcp/auth/index.js +0 -11
- package/dist/client/mcp/auth/oauthClientProvider.js +0 -325
- package/dist/client/mcp/auth/tokenStorage.js +0 -134
- package/dist/client/mcp/batching/index.js +0 -10
- package/dist/client/mcp/batching/requestBatcher.js +0 -441
- package/dist/client/mcp/caching/index.js +0 -10
- package/dist/client/mcp/caching/toolCache.js +0 -433
- package/dist/client/mcp/elicitation/elicitationManager.js +0 -376
- package/dist/client/mcp/elicitation/index.js +0 -11
- package/dist/client/mcp/elicitation/types.js +0 -10
- package/dist/client/mcp/elicitationProtocol.js +0 -375
- package/dist/client/mcp/enhancedToolDiscovery.js +0 -481
- package/dist/client/mcp/externalServerManager.js +0 -1478
- package/dist/client/mcp/factory.js +0 -161
- package/dist/client/mcp/flexibleToolValidator.js +0 -161
- package/dist/client/mcp/httpRateLimiter.js +0 -391
- package/dist/client/mcp/httpRetryHandler.js +0 -178
- package/dist/client/mcp/index.js +0 -74
- package/dist/client/mcp/mcpCircuitBreaker.js +0 -427
- package/dist/client/mcp/mcpClientFactory.js +0 -708
- package/dist/client/mcp/mcpRegistryClient.js +0 -488
- package/dist/client/mcp/mcpServerBase.js +0 -373
- package/dist/client/mcp/multiServerManager.js +0 -579
- package/dist/client/mcp/registry.js +0 -158
- package/dist/client/mcp/routing/index.js +0 -10
- package/dist/client/mcp/routing/toolRouter.js +0 -416
- package/dist/client/mcp/serverCapabilities.js +0 -502
- package/dist/client/mcp/servers/agent/directToolsServer.js +0 -150
- package/dist/client/mcp/toolAnnotations.js +0 -239
- package/dist/client/mcp/toolConverter.js +0 -258
- package/dist/client/mcp/toolDiscoveryService.js +0 -798
- package/dist/client/mcp/toolIntegration.js +0 -334
- package/dist/client/mcp/toolRegistry.js +0 -719
- package/dist/client/memory/hippocampusInitializer.js +0 -19
- package/dist/client/memory/memoryRetrievalTools.js +0 -166
- package/dist/client/middleware/builtin/analytics.js +0 -132
- package/dist/client/middleware/builtin/autoEvaluation.js +0 -203
- package/dist/client/middleware/builtin/guardrails.js +0 -109
- package/dist/client/middleware/builtin/lifecycle.js +0 -168
- package/dist/client/middleware/factory.js +0 -327
- package/dist/client/middleware/registry.js +0 -295
- package/dist/client/middleware/utils/guardrailsUtils.js +0 -396
- package/dist/client/models/anthropicModels.js +0 -527
- package/dist/client/neurolink.js +0 -8015
- package/dist/client/observability/exporterRegistry.js +0 -413
- package/dist/client/observability/exporters/arizeExporter.js +0 -138
- package/dist/client/observability/exporters/baseExporter.js +0 -190
- package/dist/client/observability/exporters/braintrustExporter.js +0 -154
- package/dist/client/observability/exporters/datadogExporter.js +0 -196
- package/dist/client/observability/exporters/laminarExporter.js +0 -302
- package/dist/client/observability/exporters/langfuseExporter.js +0 -209
- package/dist/client/observability/exporters/langsmithExporter.js +0 -143
- package/dist/client/observability/exporters/otelExporter.js +0 -164
- package/dist/client/observability/exporters/posthogExporter.js +0 -287
- package/dist/client/observability/exporters/sentryExporter.js +0 -165
- package/dist/client/observability/index.js +0 -31
- package/dist/client/observability/metricsAggregator.js +0 -556
- package/dist/client/observability/otelBridge.js +0 -131
- package/dist/client/observability/retryPolicy.js +0 -383
- package/dist/client/observability/sampling/samplers.js +0 -216
- package/dist/client/observability/spanProcessor.js +0 -303
- package/dist/client/observability/tokenTracker.js +0 -413
- package/dist/client/observability/types/exporterTypes.js +0 -5
- package/dist/client/observability/types/index.js +0 -4
- package/dist/client/observability/types/spanTypes.js +0 -92
- package/dist/client/observability/utils/safeMetadata.js +0 -25
- package/dist/client/observability/utils/spanSerializer.js +0 -292
- package/dist/client/processors/archive/ArchiveProcessor.js +0 -1308
- package/dist/client/processors/base/BaseFileProcessor.js +0 -614
- package/dist/client/processors/base/types.js +0 -82
- package/dist/client/processors/config/fileTypes.js +0 -520
- package/dist/client/processors/config/index.js +0 -92
- package/dist/client/processors/config/languageMap.js +0 -410
- package/dist/client/processors/config/mimeTypes.js +0 -363
- package/dist/client/processors/config/sizeLimits.js +0 -258
- package/dist/client/processors/document/ExcelProcessor.js +0 -590
- package/dist/client/processors/document/OpenDocumentProcessor.js +0 -212
- package/dist/client/processors/document/PptxProcessor.js +0 -157
- package/dist/client/processors/document/RtfProcessor.js +0 -361
- package/dist/client/processors/document/WordProcessor.js +0 -353
- package/dist/client/processors/errors/FileErrorCode.js +0 -255
- package/dist/client/processors/errors/errorHelpers.js +0 -386
- package/dist/client/processors/errors/errorSerializer.js +0 -507
- package/dist/client/processors/errors/index.js +0 -49
- package/dist/client/processors/markup/SvgProcessor.js +0 -240
- package/dist/client/processors/media/AudioProcessor.js +0 -707
- package/dist/client/processors/media/VideoProcessor.js +0 -1045
- package/dist/client/providers/amazonBedrock.js +0 -1512
- package/dist/client/providers/amazonSagemaker.js +0 -162
- package/dist/client/providers/anthropic.js +0 -831
- package/dist/client/providers/azureOpenai.js +0 -143
- package/dist/client/providers/googleAiStudio.js +0 -1200
- package/dist/client/providers/googleNativeGemini3.js +0 -543
- package/dist/client/providers/googleVertex.js +0 -2936
- package/dist/client/providers/huggingFace.js +0 -315
- package/dist/client/providers/litellm.js +0 -488
- package/dist/client/providers/mistral.js +0 -157
- package/dist/client/providers/ollama.js +0 -1579
- package/dist/client/providers/openAI.js +0 -627
- package/dist/client/providers/openRouter.js +0 -543
- package/dist/client/providers/openaiCompatible.js +0 -290
- package/dist/client/providers/providerTypeUtils.js +0 -46
- package/dist/client/providers/sagemaker/adaptive-semaphore.js +0 -215
- package/dist/client/providers/sagemaker/client.js +0 -472
- package/dist/client/providers/sagemaker/config.js +0 -317
- package/dist/client/providers/sagemaker/detection.js +0 -606
- package/dist/client/providers/sagemaker/error-constants.js +0 -227
- package/dist/client/providers/sagemaker/errors.js +0 -299
- package/dist/client/providers/sagemaker/language-model.js +0 -775
- package/dist/client/providers/sagemaker/parsers.js +0 -634
- package/dist/client/providers/sagemaker/streaming.js +0 -331
- package/dist/client/providers/sagemaker/structured-parser.js +0 -625
- package/dist/client/proxy/accountQuota.js +0 -162
- package/dist/client/proxy/claudeFormat.js +0 -595
- package/dist/client/proxy/modelRouter.js +0 -29
- package/dist/client/proxy/oauthFetch.js +0 -367
- package/dist/client/proxy/proxyFetch.js +0 -586
- package/dist/client/proxy/requestLogger.js +0 -207
- package/dist/client/proxy/tokenRefresh.js +0 -124
- package/dist/client/proxy/usageStats.js +0 -74
- package/dist/client/proxy/utils/noProxyUtils.js +0 -149
- package/dist/client/rag/ChunkerFactory.js +0 -320
- package/dist/client/rag/ChunkerRegistry.js +0 -421
- package/dist/client/rag/chunkers/BaseChunker.js +0 -143
- package/dist/client/rag/chunkers/CharacterChunker.js +0 -28
- package/dist/client/rag/chunkers/HTMLChunker.js +0 -38
- package/dist/client/rag/chunkers/JSONChunker.js +0 -68
- package/dist/client/rag/chunkers/LaTeXChunker.js +0 -63
- package/dist/client/rag/chunkers/MarkdownChunker.js +0 -306
- package/dist/client/rag/chunkers/RecursiveChunker.js +0 -139
- package/dist/client/rag/chunkers/SemanticMarkdownChunker.js +0 -138
- package/dist/client/rag/chunkers/SentenceChunker.js +0 -66
- package/dist/client/rag/chunkers/TokenChunker.js +0 -61
- package/dist/client/rag/chunkers/index.js +0 -15
- package/dist/client/rag/chunking/characterChunker.js +0 -142
- package/dist/client/rag/chunking/chunkerRegistry.js +0 -194
- package/dist/client/rag/chunking/htmlChunker.js +0 -247
- package/dist/client/rag/chunking/index.js +0 -17
- package/dist/client/rag/chunking/jsonChunker.js +0 -281
- package/dist/client/rag/chunking/latexChunker.js +0 -251
- package/dist/client/rag/chunking/markdownChunker.js +0 -373
- package/dist/client/rag/chunking/recursiveChunker.js +0 -148
- package/dist/client/rag/chunking/semanticChunker.js +0 -306
- package/dist/client/rag/chunking/sentenceChunker.js +0 -230
- package/dist/client/rag/chunking/tokenChunker.js +0 -183
- package/dist/client/rag/document/MDocument.js +0 -392
- package/dist/client/rag/document/index.js +0 -5
- package/dist/client/rag/document/loaders.js +0 -500
- package/dist/client/rag/errors/RAGError.js +0 -274
- package/dist/client/rag/errors/index.js +0 -6
- package/dist/client/rag/graphRag/graphRAG.js +0 -401
- package/dist/client/rag/graphRag/index.js +0 -4
- package/dist/client/rag/index.js +0 -141
- package/dist/client/rag/metadata/MetadataExtractorFactory.js +0 -418
- package/dist/client/rag/metadata/MetadataExtractorRegistry.js +0 -362
- package/dist/client/rag/metadata/index.js +0 -9
- package/dist/client/rag/metadata/metadataExtractor.js +0 -280
- package/dist/client/rag/pipeline/RAGPipeline.js +0 -436
- package/dist/client/rag/pipeline/contextAssembly.js +0 -341
- package/dist/client/rag/pipeline/index.js +0 -5
- package/dist/client/rag/ragIntegration.js +0 -321
- package/dist/client/rag/reranker/RerankerFactory.js +0 -430
- package/dist/client/rag/reranker/RerankerRegistry.js +0 -402
- package/dist/client/rag/reranker/index.js +0 -9
- package/dist/client/rag/reranker/reranker.js +0 -277
- package/dist/client/rag/resilience/CircuitBreaker.js +0 -431
- package/dist/client/rag/resilience/RetryHandler.js +0 -304
- package/dist/client/rag/resilience/index.js +0 -7
- package/dist/client/rag/retrieval/hybridSearch.js +0 -335
- package/dist/client/rag/retrieval/index.js +0 -5
- package/dist/client/rag/retrieval/vectorQueryTool.js +0 -307
- package/dist/client/rag/types.js +0 -8
- package/dist/client/sdk/toolRegistration.js +0 -377
- package/dist/client/server/abstract/baseServerAdapter.js +0 -575
- package/dist/client/server/adapters/expressAdapter.js +0 -486
- package/dist/client/server/adapters/fastifyAdapter.js +0 -472
- package/dist/client/server/adapters/honoAdapter.js +0 -632
- package/dist/client/server/adapters/koaAdapter.js +0 -510
- package/dist/client/server/errors.js +0 -486
- package/dist/client/server/factory/serverAdapterFactory.js +0 -160
- package/dist/client/server/index.js +0 -108
- package/dist/client/server/middleware/abortSignal.js +0 -111
- package/dist/client/server/middleware/auth.js +0 -388
- package/dist/client/server/middleware/cache.js +0 -359
- package/dist/client/server/middleware/common.js +0 -281
- package/dist/client/server/middleware/deprecation.js +0 -190
- package/dist/client/server/middleware/mcpBodyAttachment.js +0 -63
- package/dist/client/server/middleware/rateLimit.js +0 -227
- package/dist/client/server/middleware/validation.js +0 -388
- package/dist/client/server/openapi/generator.js +0 -398
- package/dist/client/server/openapi/index.js +0 -36
- package/dist/client/server/openapi/schemas.js +0 -695
- package/dist/client/server/openapi/templates.js +0 -374
- package/dist/client/server/routes/agentRoutes.js +0 -171
- package/dist/client/server/routes/claudeProxyRoutes.js +0 -1600
- package/dist/client/server/routes/healthRoutes.js +0 -187
- package/dist/client/server/routes/index.js +0 -57
- package/dist/client/server/routes/mcpRoutes.js +0 -342
- package/dist/client/server/routes/memoryRoutes.js +0 -350
- package/dist/client/server/routes/openApiRoutes.js +0 -126
- package/dist/client/server/routes/toolRoutes.js +0 -199
- package/dist/client/server/streaming/dataStream.js +0 -486
- package/dist/client/server/streaming/index.js +0 -11
- package/dist/client/server/types.js +0 -67
- package/dist/client/server/utils/redaction.js +0 -334
- package/dist/client/server/utils/validation.js +0 -243
- package/dist/client/server/websocket/WebSocketHandler.js +0 -383
- package/dist/client/server/websocket/index.js +0 -4
- package/dist/client/services/server/ai/observability/instrumentation.js +0 -808
- package/dist/client/telemetry/attributes.js +0 -100
- package/dist/client/telemetry/index.js +0 -26
- package/dist/client/telemetry/telemetryService.js +0 -308
- package/dist/client/telemetry/tracers.js +0 -17
- package/dist/client/telemetry/withSpan.js +0 -34
- package/dist/client/types/actionTypes.js +0 -6
- package/dist/client/types/analytics.js +0 -5
- package/dist/client/types/authTypes.js +0 -8
- package/dist/client/types/circuitBreakerErrors.js +0 -34
- package/dist/client/types/cli.js +0 -21
- package/dist/client/types/clientTypes.js +0 -10
- package/dist/client/types/common.js +0 -51
- package/dist/client/types/configTypes.js +0 -49
- package/dist/client/types/content.js +0 -19
- package/dist/client/types/contextTypes.js +0 -400
- package/dist/client/types/conversation.js +0 -47
- package/dist/client/types/conversationMemoryInterface.js +0 -6
- package/dist/client/types/domainTypes.js +0 -5
- package/dist/client/types/errors.js +0 -167
- package/dist/client/types/evaluation.js +0 -5
- package/dist/client/types/evaluationProviders.js +0 -5
- package/dist/client/types/evaluationTypes.js +0 -1
- package/dist/client/types/externalMcp.js +0 -6
- package/dist/client/types/fileReferenceTypes.js +0 -8
- package/dist/client/types/fileTypes.js +0 -4
- package/dist/client/types/generateTypes.js +0 -1
- package/dist/client/types/guardrails.js +0 -1
- package/dist/client/types/hitlTypes.js +0 -8
- package/dist/client/types/index.js +0 -57
- package/dist/client/types/mcpTypes.js +0 -5
- package/dist/client/types/middlewareTypes.js +0 -1
- package/dist/client/types/modelTypes.js +0 -30
- package/dist/client/types/multimodal.js +0 -135
- package/dist/client/types/observability.js +0 -6
- package/dist/client/types/pptTypes.js +0 -82
- package/dist/client/types/providers.js +0 -111
- package/dist/client/types/proxyTypes.js +0 -16
- package/dist/client/types/ragTypes.js +0 -7
- package/dist/client/types/sdkTypes.js +0 -8
- package/dist/client/types/serviceTypes.js +0 -5
- package/dist/client/types/streamTypes.js +0 -1
- package/dist/client/types/subscriptionTypes.js +0 -9
- package/dist/client/types/taskClassificationTypes.js +0 -5
- package/dist/client/types/tools.js +0 -24
- package/dist/client/types/ttsTypes.js +0 -57
- package/dist/client/types/typeAliases.js +0 -48
- package/dist/client/types/utilities.js +0 -4
- package/dist/client/types/workflowTypes.js +0 -30
- package/dist/client/utils/async/withTimeout.js +0 -98
- package/dist/client/utils/asyncMutex.js +0 -60
- package/dist/client/utils/conversationMemory.js +0 -431
- package/dist/client/utils/csvProcessor.js +0 -846
- package/dist/client/utils/errorHandling.js +0 -936
- package/dist/client/utils/evaluationUtils.js +0 -131
- package/dist/client/utils/factoryProcessing.js +0 -589
- package/dist/client/utils/fileDetector.js +0 -2161
- package/dist/client/utils/imageCache.js +0 -376
- package/dist/client/utils/imageProcessor.js +0 -704
- package/dist/client/utils/logger.js +0 -491
- package/dist/client/utils/mcpDefaults.js +0 -134
- package/dist/client/utils/messageBuilder.js +0 -1653
- package/dist/client/utils/modelAliasResolver.js +0 -54
- package/dist/client/utils/modelDetection.js +0 -80
- package/dist/client/utils/modelRouter.js +0 -292
- package/dist/client/utils/multimodalOptionsBuilder.js +0 -65
- package/dist/client/utils/observabilityHelpers.js +0 -47
- package/dist/client/utils/parameterValidation.js +0 -966
- package/dist/client/utils/pdfProcessor.js +0 -410
- package/dist/client/utils/performance.js +0 -222
- package/dist/client/utils/pricing.js +0 -340
- package/dist/client/utils/promptRedaction.js +0 -62
- package/dist/client/utils/providerConfig.js +0 -1009
- package/dist/client/utils/providerHealth.js +0 -1237
- package/dist/client/utils/providerRetry.js +0 -112
- package/dist/client/utils/providerUtils.js +0 -434
- package/dist/client/utils/rateLimiter.js +0 -200
- package/dist/client/utils/redis.js +0 -368
- package/dist/client/utils/retryHandler.js +0 -269
- package/dist/client/utils/retryability.js +0 -22
- package/dist/client/utils/sanitizers/svg.js +0 -481
- package/dist/client/utils/schemaConversion.js +0 -255
- package/dist/client/utils/taskClassificationUtils.js +0 -149
- package/dist/client/utils/taskClassifier.js +0 -94
- package/dist/client/utils/thinkingConfig.js +0 -104
- package/dist/client/utils/timeout.js +0 -359
- package/dist/client/utils/tokenEstimation.js +0 -142
- package/dist/client/utils/tokenLimits.js +0 -125
- package/dist/client/utils/tokenUtils.js +0 -239
- package/dist/client/utils/toolUtils.js +0 -75
- package/dist/client/utils/transformationUtils.js +0 -554
- package/dist/client/utils/ttsProcessor.js +0 -286
- package/dist/client/utils/typeUtils.js +0 -97
- package/dist/client/utils/videoAnalysisProcessor.js +0 -67
- package/dist/client/workflow/config.js +0 -398
- package/dist/client/workflow/core/ensembleExecutor.js +0 -407
- package/dist/client/workflow/core/judgeScorer.js +0 -544
- package/dist/client/workflow/core/responseConditioner.js +0 -225
- package/dist/client/workflow/core/types/conditionerTypes.js +0 -7
- package/dist/client/workflow/core/types/ensembleTypes.js +0 -7
- package/dist/client/workflow/core/types/index.js +0 -7
- package/dist/client/workflow/core/types/judgeTypes.js +0 -7
- package/dist/client/workflow/core/types/layerTypes.js +0 -7
- package/dist/client/workflow/core/types/registryTypes.js +0 -7
- package/dist/client/workflow/core/workflowRegistry.js +0 -304
- package/dist/client/workflow/core/workflowRunner.js +0 -586
- package/dist/client/workflow/index.js +0 -50
- package/dist/client/workflow/types.js +0 -9
- package/dist/client/workflow/utils/types/index.js +0 -7
- package/dist/client/workflow/utils/workflowMetrics.js +0 -311
- package/dist/client/workflow/utils/workflowValidation.js +0 -420
- package/dist/client/workflow/workflows/adaptiveWorkflow.js +0 -366
- package/dist/client/workflow/workflows/consensusWorkflow.js +0 -192
- package/dist/client/workflow/workflows/fallbackWorkflow.js +0 -225
- package/dist/client/workflow/workflows/multiJudgeWorkflow.js +0 -351
- /package/dist/client/{client/reactHooks.js → reactHooks.js} +0 -0
|
@@ -1,763 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Vertex AI Video Generation Handler
|
|
3
|
-
*
|
|
4
|
-
* Standalone module for Veo 3.1 video generation via Vertex AI.
|
|
5
|
-
* Generates videos from an input image and text prompt.
|
|
6
|
-
*
|
|
7
|
-
* Based on Vertex AI Veo 3.1 video generation API
|
|
8
|
-
*
|
|
9
|
-
* @module adapters/video/vertexVideoHandler
|
|
10
|
-
* @see https://cloud.google.com/vertex-ai/generative-ai/docs/video/generate-videos
|
|
11
|
-
*/
|
|
12
|
-
import { readFile } from "node:fs/promises";
|
|
13
|
-
import { ErrorCategory, ErrorSeverity } from "../../constants/enums.js";
|
|
14
|
-
import { TIMEOUTS } from "../../constants/timeouts.js";
|
|
15
|
-
import { VIDEO_ERROR_CODES } from "../../constants/videoErrors.js";
|
|
16
|
-
import { isAbortError, NeuroLinkError, withTimeout, } from "../../utils/errorHandling.js";
|
|
17
|
-
import { logger } from "../../utils/logger.js";
|
|
18
|
-
// ============================================================================
|
|
19
|
-
// VIDEO ERROR CODES (Re-exported for backward compatibility)
|
|
20
|
-
// ============================================================================
|
|
21
|
-
/**
|
|
22
|
-
* Video error codes - re-exported from constants module for backward compatibility.
|
|
23
|
-
* @see {@link VIDEO_ERROR_CODES} in constants/videoErrors.ts for definitions
|
|
24
|
-
*/
|
|
25
|
-
export { VIDEO_ERROR_CODES };
|
|
26
|
-
/**
|
|
27
|
-
* Video generation error class
|
|
28
|
-
* Extends NeuroLinkError for consistent error handling across the SDK
|
|
29
|
-
*/
|
|
30
|
-
export class VideoError extends NeuroLinkError {
|
|
31
|
-
constructor(options) {
|
|
32
|
-
super({
|
|
33
|
-
code: options.code,
|
|
34
|
-
message: options.message,
|
|
35
|
-
category: options.category ?? ErrorCategory.EXECUTION,
|
|
36
|
-
severity: options.severity ?? ErrorSeverity.HIGH,
|
|
37
|
-
retriable: options.retriable ?? false,
|
|
38
|
-
context: options.context,
|
|
39
|
-
originalError: options.originalError,
|
|
40
|
-
});
|
|
41
|
-
this.name = "VideoError";
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
// ============================================================================
|
|
45
|
-
// CONSTANTS
|
|
46
|
-
// ============================================================================
|
|
47
|
-
/** Timeout for video generation (3 minutes - video gen typically takes 1-2 min) */
|
|
48
|
-
const VIDEO_GENERATION_TIMEOUT_MS = 180000;
|
|
49
|
-
/** Polling interval for checking operation status (5 seconds) */
|
|
50
|
-
const POLL_INTERVAL_MS = 5000;
|
|
51
|
-
/** Full model name for Veo 3.1 (IMPORTANT: not just "veo-3.1") */
|
|
52
|
-
const VEO_MODEL = "veo-3.1-generate-001";
|
|
53
|
-
/** Full model name for Veo 3.1 Fast (used for transitions) */
|
|
54
|
-
const VEO_FAST_MODEL = "veo-3.1-fast-generate-001";
|
|
55
|
-
/** Default location for Vertex AI */
|
|
56
|
-
const DEFAULT_LOCATION = "us-central1";
|
|
57
|
-
// ============================================================================
|
|
58
|
-
// CONFIGURATION HELPERS
|
|
59
|
-
// ============================================================================
|
|
60
|
-
/**
|
|
61
|
-
* Check if Vertex AI is configured for video generation
|
|
62
|
-
*
|
|
63
|
-
* @returns True if Google Cloud credentials are available
|
|
64
|
-
*
|
|
65
|
-
* @example
|
|
66
|
-
* ```typescript
|
|
67
|
-
* if (!isVertexVideoConfigured()) {
|
|
68
|
-
* console.error("Set GOOGLE_APPLICATION_CREDENTIALS to enable video generation");
|
|
69
|
-
* }
|
|
70
|
-
* ```
|
|
71
|
-
*/
|
|
72
|
-
export function isVertexVideoConfigured() {
|
|
73
|
-
// Same credential detection as googleVertex.ts hasGoogleCredentials().
|
|
74
|
-
// GoogleAuth (used by getAccessToken) also supports ADC from
|
|
75
|
-
// `gcloud auth application-default login` automatically, so we only
|
|
76
|
-
// gate on the explicit env vars here — if none are set, we still
|
|
77
|
-
// allow the call through and let GoogleAuth resolve ADC at runtime.
|
|
78
|
-
// This avoids duplicating GoogleAuth's discovery logic.
|
|
79
|
-
return !!(process.env.GOOGLE_APPLICATION_CREDENTIALS ||
|
|
80
|
-
process.env.GOOGLE_APPLICATION_CREDENTIALS_NEUROLINK ||
|
|
81
|
-
process.env.GOOGLE_SERVICE_ACCOUNT_KEY ||
|
|
82
|
-
(process.env.GOOGLE_AUTH_CLIENT_EMAIL &&
|
|
83
|
-
process.env.GOOGLE_AUTH_PRIVATE_KEY));
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Get Vertex AI project configuration from environment variables or ADC credentials
|
|
87
|
-
*
|
|
88
|
-
* @returns Project ID and location for Vertex AI
|
|
89
|
-
* @throws VideoError if project cannot be determined
|
|
90
|
-
*/
|
|
91
|
-
async function getVertexConfig() {
|
|
92
|
-
const location = process.env.GOOGLE_VERTEX_LOCATION ||
|
|
93
|
-
process.env.GOOGLE_CLOUD_LOCATION ||
|
|
94
|
-
DEFAULT_LOCATION;
|
|
95
|
-
// Try environment variables first
|
|
96
|
-
let project = process.env.GOOGLE_VERTEX_PROJECT ||
|
|
97
|
-
process.env.GOOGLE_CLOUD_PROJECT ||
|
|
98
|
-
process.env.GOOGLE_CLOUD_PROJECT_ID ||
|
|
99
|
-
process.env.VERTEX_PROJECT_ID;
|
|
100
|
-
// Fallback: read from ADC credentials file
|
|
101
|
-
if (!project && process.env.GOOGLE_APPLICATION_CREDENTIALS) {
|
|
102
|
-
try {
|
|
103
|
-
const credData = JSON.parse(await readFile(process.env.GOOGLE_APPLICATION_CREDENTIALS, "utf-8"));
|
|
104
|
-
project = credData.quota_project_id || credData.project_id;
|
|
105
|
-
}
|
|
106
|
-
catch (e) {
|
|
107
|
-
// Ignore read errors, will throw below if project still not found
|
|
108
|
-
logger.debug("Failed to read project from credentials file", {
|
|
109
|
-
error: e instanceof Error ? e.message : String(e),
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
if (!project) {
|
|
114
|
-
throw new VideoError({
|
|
115
|
-
code: VIDEO_ERROR_CODES.PROVIDER_NOT_CONFIGURED,
|
|
116
|
-
message: "Google Cloud project not found. Set GOOGLE_VERTEX_PROJECT or GOOGLE_CLOUD_PROJECT environment variable, or ensure ADC credentials contain project_id",
|
|
117
|
-
category: ErrorCategory.CONFIGURATION,
|
|
118
|
-
severity: ErrorSeverity.HIGH,
|
|
119
|
-
retriable: false,
|
|
120
|
-
context: {
|
|
121
|
-
missingVar: "GOOGLE_VERTEX_PROJECT",
|
|
122
|
-
feature: "video-generation",
|
|
123
|
-
checkedEnvVars: [
|
|
124
|
-
"GOOGLE_VERTEX_PROJECT",
|
|
125
|
-
"GOOGLE_CLOUD_PROJECT",
|
|
126
|
-
"GOOGLE_CLOUD_PROJECT_ID",
|
|
127
|
-
"VERTEX_PROJECT_ID",
|
|
128
|
-
],
|
|
129
|
-
},
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
return { project, location };
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Get access token for Vertex AI authentication
|
|
136
|
-
*
|
|
137
|
-
* Uses google-auth-library (transitive dependency from @google-cloud/vertexai)
|
|
138
|
-
* to obtain access token from configured credentials.
|
|
139
|
-
*
|
|
140
|
-
* @returns Access token string
|
|
141
|
-
* @throws VideoError if authentication fails
|
|
142
|
-
*/
|
|
143
|
-
async function getAccessToken() {
|
|
144
|
-
try {
|
|
145
|
-
// google-auth-library is a transitive dependency from @google-cloud/vertexai
|
|
146
|
-
// Using dynamic import with type assertion for runtime resolution
|
|
147
|
-
const googleAuthLib = (await import("google-auth-library"));
|
|
148
|
-
const auth = new googleAuthLib.GoogleAuth({
|
|
149
|
-
keyFilename: process.env.GOOGLE_APPLICATION_CREDENTIALS,
|
|
150
|
-
scopes: ["https://www.googleapis.com/auth/cloud-platform"],
|
|
151
|
-
});
|
|
152
|
-
const token = await withTimeout(auth.getAccessToken(), TIMEOUTS.PROVIDER.AUTH_MS);
|
|
153
|
-
if (!token) {
|
|
154
|
-
throw new VideoError({
|
|
155
|
-
code: VIDEO_ERROR_CODES.PROVIDER_NOT_CONFIGURED,
|
|
156
|
-
message: "Failed to obtain access token from Google Cloud credentials",
|
|
157
|
-
category: ErrorCategory.CONFIGURATION,
|
|
158
|
-
severity: ErrorSeverity.HIGH,
|
|
159
|
-
retriable: false,
|
|
160
|
-
context: { provider: "vertex", feature: "video-generation" },
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
return token;
|
|
164
|
-
}
|
|
165
|
-
catch (error) {
|
|
166
|
-
if (error instanceof VideoError) {
|
|
167
|
-
throw error;
|
|
168
|
-
}
|
|
169
|
-
throw new VideoError({
|
|
170
|
-
code: VIDEO_ERROR_CODES.PROVIDER_NOT_CONFIGURED,
|
|
171
|
-
message: `Google Cloud authentication failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
172
|
-
category: ErrorCategory.CONFIGURATION,
|
|
173
|
-
severity: ErrorSeverity.HIGH,
|
|
174
|
-
retriable: false,
|
|
175
|
-
context: { provider: "vertex", feature: "video-generation" },
|
|
176
|
-
originalError: error instanceof Error ? error : undefined,
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
// ============================================================================
|
|
181
|
-
// IMAGE UTILITIES
|
|
182
|
-
// ============================================================================
|
|
183
|
-
/**
|
|
184
|
-
* Detect MIME type from image buffer magic bytes
|
|
185
|
-
*
|
|
186
|
-
* @param image - Image buffer to analyze
|
|
187
|
-
* @returns MIME type string (defaults to "image/jpeg" if unknown)
|
|
188
|
-
*/
|
|
189
|
-
function detectMimeType(image) {
|
|
190
|
-
// Validate buffer has minimum length for format detection
|
|
191
|
-
if (image.length < 4) {
|
|
192
|
-
logger.warn("Image buffer too small for format detection", {
|
|
193
|
-
size: image.length,
|
|
194
|
-
});
|
|
195
|
-
return "image/jpeg";
|
|
196
|
-
}
|
|
197
|
-
// JPEG: FF D8 FF
|
|
198
|
-
if (image[0] === 0xff && image[1] === 0xd8 && image[2] === 0xff) {
|
|
199
|
-
return "image/jpeg";
|
|
200
|
-
}
|
|
201
|
-
// PNG: 89 50 4E 47
|
|
202
|
-
if (image[0] === 0x89 &&
|
|
203
|
-
image[1] === 0x50 &&
|
|
204
|
-
image[2] === 0x4e &&
|
|
205
|
-
image[3] === 0x47) {
|
|
206
|
-
return "image/png";
|
|
207
|
-
}
|
|
208
|
-
// WebP: RIFF header (52 49 46 46) + WEBP at offset 8 (57 45 42 50)
|
|
209
|
-
if (image.length >= 12 &&
|
|
210
|
-
image[0] === 0x52 &&
|
|
211
|
-
image[1] === 0x49 &&
|
|
212
|
-
image[2] === 0x46 &&
|
|
213
|
-
image[3] === 0x46 &&
|
|
214
|
-
image[8] === 0x57 &&
|
|
215
|
-
image[9] === 0x45 &&
|
|
216
|
-
image[10] === 0x42 &&
|
|
217
|
-
image[11] === 0x50) {
|
|
218
|
-
return "image/webp";
|
|
219
|
-
}
|
|
220
|
-
// Default fallback
|
|
221
|
-
logger.warn("Unknown image format detected, defaulting to image/jpeg", {
|
|
222
|
-
firstBytes: image.slice(0, 12).toString("hex"),
|
|
223
|
-
size: image.length,
|
|
224
|
-
});
|
|
225
|
-
return "image/jpeg";
|
|
226
|
-
}
|
|
227
|
-
/**
|
|
228
|
-
* Calculate video dimensions based on resolution and aspect ratio
|
|
229
|
-
*
|
|
230
|
-
* @param resolution - Video resolution ("720p" or "1080p")
|
|
231
|
-
* @param aspectRatio - Aspect ratio ("16:9" or "9:16")
|
|
232
|
-
* @returns Width and height dimensions
|
|
233
|
-
*/
|
|
234
|
-
function calculateDimensions(resolution, aspectRatio) {
|
|
235
|
-
if (resolution === "1080p") {
|
|
236
|
-
return aspectRatio === "9:16"
|
|
237
|
-
? { width: 1080, height: 1920 }
|
|
238
|
-
: { width: 1920, height: 1080 };
|
|
239
|
-
}
|
|
240
|
-
// 720p
|
|
241
|
-
return aspectRatio === "9:16"
|
|
242
|
-
? { width: 720, height: 1280 }
|
|
243
|
-
: { width: 1280, height: 720 };
|
|
244
|
-
}
|
|
245
|
-
// ============================================================================
|
|
246
|
-
// VIDEO GENERATION
|
|
247
|
-
// ============================================================================
|
|
248
|
-
/**
|
|
249
|
-
* Generate video using Vertex AI Veo 3.1
|
|
250
|
-
*
|
|
251
|
-
* Creates a video from an input image and text prompt using Google's Veo 3.1 model.
|
|
252
|
-
* The video is generated with optional audio and can be customized for resolution,
|
|
253
|
-
* duration, and aspect ratio.
|
|
254
|
-
*
|
|
255
|
-
* @param image - Input image buffer (JPEG, PNG, or WebP)
|
|
256
|
-
* @param prompt - Text prompt describing desired video motion/content (max 500 chars)
|
|
257
|
-
* @param options - Video output options (resolution, length, aspect ratio, audio)
|
|
258
|
-
* @returns VideoGenerationResult with video buffer and metadata
|
|
259
|
-
*
|
|
260
|
-
* @throws {VideoError} When credentials are not configured (PROVIDER_NOT_CONFIGURED)
|
|
261
|
-
* @throws {VideoError} When API returns an error (GENERATION_FAILED)
|
|
262
|
-
* @throws {VideoError} When polling times out (POLL_TIMEOUT)
|
|
263
|
-
*
|
|
264
|
-
* @example
|
|
265
|
-
* ```typescript
|
|
266
|
-
* import { generateVideoWithVertex } from "@juspay/neurolink/adapters/video/vertexVideoHandler";
|
|
267
|
-
* import { readFileSync, writeFileSync } from "fs";
|
|
268
|
-
*
|
|
269
|
-
* const image = readFileSync("./input.png");
|
|
270
|
-
* const result = await generateVideoWithVertex(
|
|
271
|
-
* image,
|
|
272
|
-
* "Smooth cinematic camera movement with dramatic lighting",
|
|
273
|
-
* { resolution: "720p", length: 6, aspectRatio: "16:9", audio: true }
|
|
274
|
-
* );
|
|
275
|
-
*
|
|
276
|
-
* writeFileSync("output.mp4", result.data);
|
|
277
|
-
* ```
|
|
278
|
-
*/
|
|
279
|
-
export async function generateVideoWithVertex(image, prompt, options = {}, region) {
|
|
280
|
-
// Credential validation is deferred to getAccessToken() which uses
|
|
281
|
-
// GoogleAuth — it handles env vars, service accounts, AND ADC from
|
|
282
|
-
// `gcloud auth application-default login` automatically.
|
|
283
|
-
// Same pattern as googleVertex.ts — no synchronous pre-check needed.
|
|
284
|
-
const config = await getVertexConfig();
|
|
285
|
-
const project = config.project;
|
|
286
|
-
const location = region || config.location;
|
|
287
|
-
const startTime = Date.now();
|
|
288
|
-
// Set defaults (matching reference implementation)
|
|
289
|
-
const resolution = options.resolution || "720p";
|
|
290
|
-
const durationSeconds = options.length || 6; // 4, 6, or 8
|
|
291
|
-
const aspectRatio = options.aspectRatio || "16:9";
|
|
292
|
-
const generateAudio = options.audio ?? true;
|
|
293
|
-
logger.debug("Starting Vertex video generation", {
|
|
294
|
-
project,
|
|
295
|
-
location,
|
|
296
|
-
model: VEO_MODEL,
|
|
297
|
-
resolution,
|
|
298
|
-
durationSeconds,
|
|
299
|
-
aspectRatio,
|
|
300
|
-
generateAudio,
|
|
301
|
-
promptLength: prompt.length,
|
|
302
|
-
imageSize: image.length,
|
|
303
|
-
});
|
|
304
|
-
try {
|
|
305
|
-
// Encode image to base64 and detect MIME type
|
|
306
|
-
const imageBase64 = image.toString("base64");
|
|
307
|
-
const mimeType = detectMimeType(image);
|
|
308
|
-
// Get auth token
|
|
309
|
-
const accessToken = await getAccessToken();
|
|
310
|
-
// Construct API request - predictLongRunning endpoint
|
|
311
|
-
// Global endpoint uses aiplatform.googleapis.com (no region prefix),
|
|
312
|
-
// same pattern as googleVertex.ts createVertexSettings
|
|
313
|
-
const apiHost = location === "global"
|
|
314
|
-
? "aiplatform.googleapis.com"
|
|
315
|
-
: `${location}-aiplatform.googleapis.com`;
|
|
316
|
-
const endpoint = `https://${apiHost}/v1/projects/${project}/locations/${location}/publishers/google/models/${VEO_MODEL}:predictLongRunning`;
|
|
317
|
-
// Request body structure (verified working from video.js reference)
|
|
318
|
-
const requestBody = {
|
|
319
|
-
instances: [
|
|
320
|
-
{
|
|
321
|
-
prompt: prompt,
|
|
322
|
-
image: {
|
|
323
|
-
bytesBase64Encoded: imageBase64,
|
|
324
|
-
mimeType: mimeType,
|
|
325
|
-
},
|
|
326
|
-
},
|
|
327
|
-
],
|
|
328
|
-
parameters: {
|
|
329
|
-
sampleCount: 1,
|
|
330
|
-
durationSeconds: durationSeconds,
|
|
331
|
-
aspectRatio: aspectRatio,
|
|
332
|
-
resolution: resolution,
|
|
333
|
-
generateAudio: generateAudio,
|
|
334
|
-
resizeMode: "pad", // "pad" preserves aspect ratio, "crop" fills frame
|
|
335
|
-
},
|
|
336
|
-
};
|
|
337
|
-
logger.debug("Sending video generation request", { endpoint });
|
|
338
|
-
// Create abort controller for request timeout
|
|
339
|
-
const controller = new AbortController();
|
|
340
|
-
const requestTimeout = setTimeout(() => controller.abort(), 30000); // 30s request timeout
|
|
341
|
-
// Start long-running operation
|
|
342
|
-
let response;
|
|
343
|
-
try {
|
|
344
|
-
response = await fetch(endpoint, {
|
|
345
|
-
method: "POST",
|
|
346
|
-
headers: {
|
|
347
|
-
Authorization: `Bearer ${accessToken}`,
|
|
348
|
-
"Content-Type": "application/json; charset=utf-8",
|
|
349
|
-
},
|
|
350
|
-
body: JSON.stringify(requestBody),
|
|
351
|
-
signal: controller.signal,
|
|
352
|
-
});
|
|
353
|
-
}
|
|
354
|
-
catch (error) {
|
|
355
|
-
clearTimeout(requestTimeout);
|
|
356
|
-
if (isAbortError(error)) {
|
|
357
|
-
throw new VideoError({
|
|
358
|
-
code: VIDEO_ERROR_CODES.GENERATION_FAILED,
|
|
359
|
-
message: "Video generation request timed out after 30 seconds",
|
|
360
|
-
category: ErrorCategory.EXECUTION,
|
|
361
|
-
severity: ErrorSeverity.HIGH,
|
|
362
|
-
retriable: true,
|
|
363
|
-
context: { provider: "vertex", endpoint, timeout: 30000 },
|
|
364
|
-
});
|
|
365
|
-
}
|
|
366
|
-
throw error;
|
|
367
|
-
}
|
|
368
|
-
clearTimeout(requestTimeout);
|
|
369
|
-
if (!response.ok) {
|
|
370
|
-
const errorText = await response.text();
|
|
371
|
-
throw new VideoError({
|
|
372
|
-
code: VIDEO_ERROR_CODES.GENERATION_FAILED,
|
|
373
|
-
message: `Vertex API error: ${response.status} - ${errorText}`,
|
|
374
|
-
category: ErrorCategory.EXECUTION,
|
|
375
|
-
severity: ErrorSeverity.HIGH,
|
|
376
|
-
retriable: response.status >= 500, // 5xx errors are retriable
|
|
377
|
-
context: {
|
|
378
|
-
status: response.status,
|
|
379
|
-
error: errorText,
|
|
380
|
-
provider: "vertex",
|
|
381
|
-
endpoint,
|
|
382
|
-
},
|
|
383
|
-
});
|
|
384
|
-
}
|
|
385
|
-
const operation = await response.json();
|
|
386
|
-
const operationName = operation.name;
|
|
387
|
-
if (!operationName) {
|
|
388
|
-
throw new VideoError({
|
|
389
|
-
code: VIDEO_ERROR_CODES.GENERATION_FAILED,
|
|
390
|
-
message: "Vertex API did not return an operation name",
|
|
391
|
-
category: ErrorCategory.EXECUTION,
|
|
392
|
-
severity: ErrorSeverity.HIGH,
|
|
393
|
-
retriable: false,
|
|
394
|
-
context: { response: operation, provider: "vertex" },
|
|
395
|
-
});
|
|
396
|
-
}
|
|
397
|
-
logger.debug("Video generation operation started", { operationName });
|
|
398
|
-
// Poll for completion using fetchPredictOperation endpoint
|
|
399
|
-
const remainingTime = VIDEO_GENERATION_TIMEOUT_MS - (Date.now() - startTime);
|
|
400
|
-
const videoBuffer = await pollVideoOperation(operationName, accessToken, project, location, Math.max(1000, remainingTime));
|
|
401
|
-
const processingTime = Date.now() - startTime;
|
|
402
|
-
// Calculate dimensions based on resolution and aspect ratio
|
|
403
|
-
const dimensions = calculateDimensions(resolution, aspectRatio);
|
|
404
|
-
logger.info("Video generation complete", {
|
|
405
|
-
processingTime,
|
|
406
|
-
videoSizeKB: Math.round(videoBuffer.length / 1024),
|
|
407
|
-
dimensions,
|
|
408
|
-
});
|
|
409
|
-
return {
|
|
410
|
-
data: videoBuffer,
|
|
411
|
-
mediaType: "video/mp4",
|
|
412
|
-
metadata: {
|
|
413
|
-
duration: durationSeconds,
|
|
414
|
-
dimensions,
|
|
415
|
-
model: VEO_MODEL,
|
|
416
|
-
provider: "vertex",
|
|
417
|
-
aspectRatio,
|
|
418
|
-
audioEnabled: generateAudio,
|
|
419
|
-
processingTime,
|
|
420
|
-
},
|
|
421
|
-
};
|
|
422
|
-
}
|
|
423
|
-
catch (error) {
|
|
424
|
-
// Re-throw VideoError as-is
|
|
425
|
-
if (error instanceof VideoError) {
|
|
426
|
-
throw error;
|
|
427
|
-
}
|
|
428
|
-
// Wrap other errors
|
|
429
|
-
throw new VideoError({
|
|
430
|
-
code: VIDEO_ERROR_CODES.GENERATION_FAILED,
|
|
431
|
-
message: `Video generation failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
432
|
-
category: ErrorCategory.EXECUTION,
|
|
433
|
-
severity: ErrorSeverity.HIGH,
|
|
434
|
-
retriable: true,
|
|
435
|
-
context: { provider: "vertex" },
|
|
436
|
-
originalError: error instanceof Error ? error : undefined,
|
|
437
|
-
});
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
/**
|
|
441
|
-
* Extract video buffer from completed operation result
|
|
442
|
-
*
|
|
443
|
-
* @param result - Completed operation result from Vertex AI
|
|
444
|
-
* @param operationName - Operation name for error context
|
|
445
|
-
* @returns Video buffer
|
|
446
|
-
* @throws VideoError if video data is missing or in unexpected format
|
|
447
|
-
*/
|
|
448
|
-
function extractVideoFromResult(result, operationName) {
|
|
449
|
-
// Check for error in completed operation
|
|
450
|
-
if (result.error) {
|
|
451
|
-
throw new VideoError({
|
|
452
|
-
code: VIDEO_ERROR_CODES.GENERATION_FAILED,
|
|
453
|
-
message: `Video generation failed: ${result.error.message || JSON.stringify(result.error)}`,
|
|
454
|
-
category: ErrorCategory.EXECUTION,
|
|
455
|
-
severity: ErrorSeverity.HIGH,
|
|
456
|
-
retriable: false,
|
|
457
|
-
context: { operationName, error: result.error, provider: "vertex" },
|
|
458
|
-
});
|
|
459
|
-
}
|
|
460
|
-
// Extract video from response - structure is result.response.videos[0]
|
|
461
|
-
const videoData = result.response?.videos?.[0];
|
|
462
|
-
if (!videoData) {
|
|
463
|
-
throw new VideoError({
|
|
464
|
-
code: VIDEO_ERROR_CODES.GENERATION_FAILED,
|
|
465
|
-
message: "No video data in response from Vertex AI",
|
|
466
|
-
category: ErrorCategory.EXECUTION,
|
|
467
|
-
severity: ErrorSeverity.HIGH,
|
|
468
|
-
retriable: false,
|
|
469
|
-
context: { operationName, response: result.response, provider: "vertex" },
|
|
470
|
-
});
|
|
471
|
-
}
|
|
472
|
-
// Video can be returned as base64 or GCS URI
|
|
473
|
-
if (videoData.gcsUri) {
|
|
474
|
-
throw new VideoError({
|
|
475
|
-
code: VIDEO_ERROR_CODES.GENERATION_FAILED,
|
|
476
|
-
message: `Video stored at GCS: ${videoData.gcsUri}. GCS download not yet implemented.`,
|
|
477
|
-
category: ErrorCategory.EXECUTION,
|
|
478
|
-
severity: ErrorSeverity.HIGH,
|
|
479
|
-
retriable: false,
|
|
480
|
-
context: {
|
|
481
|
-
operationName,
|
|
482
|
-
gcsUri: videoData.gcsUri,
|
|
483
|
-
provider: "vertex",
|
|
484
|
-
suggestion: "Do not set storageUri parameter to receive video as base64 inline",
|
|
485
|
-
},
|
|
486
|
-
});
|
|
487
|
-
}
|
|
488
|
-
if (videoData.bytesBase64Encoded) {
|
|
489
|
-
return Buffer.from(videoData.bytesBase64Encoded, "base64");
|
|
490
|
-
}
|
|
491
|
-
throw new VideoError({
|
|
492
|
-
code: VIDEO_ERROR_CODES.GENERATION_FAILED,
|
|
493
|
-
message: "No video bytes in response - unexpected response format",
|
|
494
|
-
category: ErrorCategory.EXECUTION,
|
|
495
|
-
severity: ErrorSeverity.HIGH,
|
|
496
|
-
retriable: false,
|
|
497
|
-
context: { operationName, videoData, provider: "vertex" },
|
|
498
|
-
});
|
|
499
|
-
}
|
|
500
|
-
/**
|
|
501
|
-
* Make a poll request to the Vertex AI fetchPredictOperation endpoint
|
|
502
|
-
*
|
|
503
|
-
* @param pollEndpoint - Full URL for the poll endpoint
|
|
504
|
-
* @param operationName - Operation name to poll
|
|
505
|
-
* @param accessToken - Google Cloud access token
|
|
506
|
-
* @param timeoutMs - Request timeout in milliseconds (default: 30000)
|
|
507
|
-
* @returns Response JSON from the poll request
|
|
508
|
-
* @throws VideoError on request failure
|
|
509
|
-
*/
|
|
510
|
-
async function makePollRequest(pollEndpoint, operationName, accessToken, timeoutMs = 30000) {
|
|
511
|
-
const controller = new AbortController();
|
|
512
|
-
const requestTimeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
513
|
-
let response;
|
|
514
|
-
try {
|
|
515
|
-
response = await fetch(pollEndpoint, {
|
|
516
|
-
method: "POST", // NOTE: POST, not GET!
|
|
517
|
-
headers: {
|
|
518
|
-
Authorization: `Bearer ${accessToken}`,
|
|
519
|
-
"Content-Type": "application/json; charset=utf-8",
|
|
520
|
-
},
|
|
521
|
-
body: JSON.stringify({ operationName }), // Pass operation name in body
|
|
522
|
-
signal: controller.signal,
|
|
523
|
-
});
|
|
524
|
-
}
|
|
525
|
-
catch (error) {
|
|
526
|
-
clearTimeout(requestTimeout);
|
|
527
|
-
if (isAbortError(error)) {
|
|
528
|
-
throw new VideoError({
|
|
529
|
-
code: VIDEO_ERROR_CODES.GENERATION_FAILED,
|
|
530
|
-
message: `Poll request timed out after ${timeoutMs}ms`,
|
|
531
|
-
category: ErrorCategory.EXECUTION,
|
|
532
|
-
severity: ErrorSeverity.HIGH,
|
|
533
|
-
retriable: true,
|
|
534
|
-
context: { provider: "vertex", operationName, timeout: timeoutMs },
|
|
535
|
-
});
|
|
536
|
-
}
|
|
537
|
-
throw error;
|
|
538
|
-
}
|
|
539
|
-
clearTimeout(requestTimeout);
|
|
540
|
-
if (!response.ok) {
|
|
541
|
-
const errorText = await response.text();
|
|
542
|
-
throw new VideoError({
|
|
543
|
-
code: VIDEO_ERROR_CODES.GENERATION_FAILED,
|
|
544
|
-
message: `Failed to poll video operation: ${response.status} - ${errorText}`,
|
|
545
|
-
category: ErrorCategory.EXECUTION,
|
|
546
|
-
severity: ErrorSeverity.HIGH,
|
|
547
|
-
retriable: response.status >= 500,
|
|
548
|
-
context: {
|
|
549
|
-
operationName,
|
|
550
|
-
status: response.status,
|
|
551
|
-
error: errorText,
|
|
552
|
-
provider: "vertex",
|
|
553
|
-
},
|
|
554
|
-
});
|
|
555
|
-
}
|
|
556
|
-
return response.json();
|
|
557
|
-
}
|
|
558
|
-
// ============================================================================
|
|
559
|
-
// POLLING
|
|
560
|
-
// ============================================================================
|
|
561
|
-
/**
|
|
562
|
-
* Poll Vertex AI operation until complete
|
|
563
|
-
*
|
|
564
|
-
* IMPORTANT: Uses fetchPredictOperation endpoint (POST with operationName in body),
|
|
565
|
-
* NOT the generic operations GET endpoint!
|
|
566
|
-
*
|
|
567
|
-
* @param operationName - Full operation name from predictLongRunning response
|
|
568
|
-
* @param accessToken - Google Cloud access token
|
|
569
|
-
* @param project - Google Cloud project ID
|
|
570
|
-
* @param location - Vertex AI location
|
|
571
|
-
* @param timeoutMs - Maximum time to wait for completion
|
|
572
|
-
* @returns Video buffer when complete
|
|
573
|
-
*
|
|
574
|
-
* @throws {VideoError} On API error, timeout, or missing video data
|
|
575
|
-
*/
|
|
576
|
-
async function pollVideoOperation(operationName, accessToken, project, location, timeoutMs) {
|
|
577
|
-
return pollOperation(VEO_MODEL, operationName, accessToken, project, location, timeoutMs);
|
|
578
|
-
}
|
|
579
|
-
// ============================================================================
|
|
580
|
-
// TRANSITION GENERATION (Director Mode)
|
|
581
|
-
// ============================================================================
|
|
582
|
-
/**
|
|
583
|
-
* Generate a transition clip using Veo 3.1 Fast's first-and-last-frame interpolation.
|
|
584
|
-
*
|
|
585
|
-
* This calls the Veo API with both `image` (first frame) and `lastFrame` (last frame),
|
|
586
|
-
* producing a video that smoothly interpolates between the two frames.
|
|
587
|
-
*
|
|
588
|
-
* @param firstFrame - JPEG buffer of the first frame (last frame of clip N)
|
|
589
|
-
* @param lastFrame - JPEG buffer of the last frame (first frame of clip N+1)
|
|
590
|
-
* @param prompt - Transition prompt describing desired visual flow
|
|
591
|
-
* @param options - Video output options (resolution, aspect ratio, audio)
|
|
592
|
-
* @param durationSeconds - Duration of the transition clip (4, 6, or 8)
|
|
593
|
-
* @param region - Vertex AI region override
|
|
594
|
-
* @returns Video buffer of the transition clip
|
|
595
|
-
*
|
|
596
|
-
* @throws {VideoError} When API returns an error or polling times out
|
|
597
|
-
*/
|
|
598
|
-
export async function generateTransitionWithVertex(firstFrame, lastFrame, prompt, options = {}, durationSeconds = 4, region) {
|
|
599
|
-
if (!isVertexVideoConfigured()) {
|
|
600
|
-
throw new VideoError({
|
|
601
|
-
code: VIDEO_ERROR_CODES.PROVIDER_NOT_CONFIGURED,
|
|
602
|
-
message: "Vertex AI credentials not configured for transition generation.",
|
|
603
|
-
category: ErrorCategory.CONFIGURATION,
|
|
604
|
-
severity: ErrorSeverity.HIGH,
|
|
605
|
-
retriable: false,
|
|
606
|
-
});
|
|
607
|
-
}
|
|
608
|
-
const config = await getVertexConfig();
|
|
609
|
-
const project = config.project;
|
|
610
|
-
const location = region || config.location;
|
|
611
|
-
const startTime = Date.now();
|
|
612
|
-
const aspectRatio = options.aspectRatio || "16:9";
|
|
613
|
-
const resolution = options.resolution || "720p";
|
|
614
|
-
const generateAudio = options.audio ?? true;
|
|
615
|
-
logger.debug("Starting transition clip generation", {
|
|
616
|
-
model: VEO_FAST_MODEL,
|
|
617
|
-
durationSeconds,
|
|
618
|
-
firstFrameSize: firstFrame.length,
|
|
619
|
-
lastFrameSize: lastFrame.length,
|
|
620
|
-
promptLength: prompt.length,
|
|
621
|
-
});
|
|
622
|
-
try {
|
|
623
|
-
const firstFrameBase64 = firstFrame.toString("base64");
|
|
624
|
-
const lastFrameBase64 = lastFrame.toString("base64");
|
|
625
|
-
const firstMime = detectMimeType(firstFrame);
|
|
626
|
-
const lastMime = detectMimeType(lastFrame);
|
|
627
|
-
const accessToken = await getAccessToken();
|
|
628
|
-
// Use Veo 3.1 Fast for transitions (faster with minimal quality difference)
|
|
629
|
-
const endpoint = `https://${location}-aiplatform.googleapis.com/v1/projects/${project}/locations/${location}/publishers/google/models/${VEO_FAST_MODEL}:predictLongRunning`;
|
|
630
|
-
const requestBody = {
|
|
631
|
-
instances: [
|
|
632
|
-
{
|
|
633
|
-
prompt: prompt,
|
|
634
|
-
image: {
|
|
635
|
-
bytesBase64Encoded: firstFrameBase64,
|
|
636
|
-
mimeType: firstMime,
|
|
637
|
-
},
|
|
638
|
-
lastFrame: {
|
|
639
|
-
bytesBase64Encoded: lastFrameBase64,
|
|
640
|
-
mimeType: lastMime,
|
|
641
|
-
},
|
|
642
|
-
},
|
|
643
|
-
],
|
|
644
|
-
parameters: {
|
|
645
|
-
sampleCount: 1,
|
|
646
|
-
durationSeconds: durationSeconds,
|
|
647
|
-
aspectRatio: aspectRatio,
|
|
648
|
-
resolution: resolution,
|
|
649
|
-
generateAudio: generateAudio,
|
|
650
|
-
},
|
|
651
|
-
};
|
|
652
|
-
const controller = new AbortController();
|
|
653
|
-
const requestTimeout = setTimeout(() => controller.abort(), 30000);
|
|
654
|
-
let response;
|
|
655
|
-
try {
|
|
656
|
-
response = await fetch(endpoint, {
|
|
657
|
-
method: "POST",
|
|
658
|
-
headers: {
|
|
659
|
-
Authorization: `Bearer ${accessToken}`,
|
|
660
|
-
"Content-Type": "application/json; charset=utf-8",
|
|
661
|
-
},
|
|
662
|
-
body: JSON.stringify(requestBody),
|
|
663
|
-
signal: controller.signal,
|
|
664
|
-
});
|
|
665
|
-
}
|
|
666
|
-
catch (error) {
|
|
667
|
-
clearTimeout(requestTimeout);
|
|
668
|
-
if (isAbortError(error)) {
|
|
669
|
-
throw new VideoError({
|
|
670
|
-
code: VIDEO_ERROR_CODES.DIRECTOR_TRANSITION_FAILED,
|
|
671
|
-
message: "Transition generation request timed out after 30 seconds",
|
|
672
|
-
category: ErrorCategory.EXECUTION,
|
|
673
|
-
severity: ErrorSeverity.MEDIUM,
|
|
674
|
-
retriable: true,
|
|
675
|
-
});
|
|
676
|
-
}
|
|
677
|
-
throw error;
|
|
678
|
-
}
|
|
679
|
-
clearTimeout(requestTimeout);
|
|
680
|
-
if (!response.ok) {
|
|
681
|
-
const errorText = await response.text();
|
|
682
|
-
throw new VideoError({
|
|
683
|
-
code: VIDEO_ERROR_CODES.DIRECTOR_TRANSITION_FAILED,
|
|
684
|
-
message: `Transition API error: ${response.status} - ${errorText}`,
|
|
685
|
-
category: ErrorCategory.EXECUTION,
|
|
686
|
-
severity: ErrorSeverity.MEDIUM,
|
|
687
|
-
retriable: response.status >= 500,
|
|
688
|
-
context: { status: response.status, error: errorText },
|
|
689
|
-
});
|
|
690
|
-
}
|
|
691
|
-
const operation = await response.json();
|
|
692
|
-
const operationName = operation.name;
|
|
693
|
-
if (!operationName) {
|
|
694
|
-
throw new VideoError({
|
|
695
|
-
code: VIDEO_ERROR_CODES.DIRECTOR_TRANSITION_FAILED,
|
|
696
|
-
message: "Transition API did not return an operation name",
|
|
697
|
-
category: ErrorCategory.EXECUTION,
|
|
698
|
-
severity: ErrorSeverity.MEDIUM,
|
|
699
|
-
retriable: false,
|
|
700
|
-
});
|
|
701
|
-
}
|
|
702
|
-
// Poll with Veo Fast model endpoint
|
|
703
|
-
const remainingTime = VIDEO_GENERATION_TIMEOUT_MS - (Date.now() - startTime);
|
|
704
|
-
const videoBuffer = await pollTransitionOperation(operationName, accessToken, project, location, Math.max(1000, remainingTime));
|
|
705
|
-
logger.debug("Transition clip generated", {
|
|
706
|
-
processingTime: Date.now() - startTime,
|
|
707
|
-
videoSize: videoBuffer.length,
|
|
708
|
-
});
|
|
709
|
-
return videoBuffer;
|
|
710
|
-
}
|
|
711
|
-
catch (error) {
|
|
712
|
-
if (error instanceof VideoError) {
|
|
713
|
-
throw error;
|
|
714
|
-
}
|
|
715
|
-
throw new VideoError({
|
|
716
|
-
code: VIDEO_ERROR_CODES.DIRECTOR_TRANSITION_FAILED,
|
|
717
|
-
message: `Transition generation failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
718
|
-
category: ErrorCategory.EXECUTION,
|
|
719
|
-
severity: ErrorSeverity.MEDIUM,
|
|
720
|
-
retriable: true,
|
|
721
|
-
originalError: error instanceof Error ? error : undefined,
|
|
722
|
-
});
|
|
723
|
-
}
|
|
724
|
-
}
|
|
725
|
-
/**
|
|
726
|
-
* Common polling helper that handles both video and transition operations.
|
|
727
|
-
* Accepts a model name to construct the appropriate endpoint.
|
|
728
|
-
*/
|
|
729
|
-
async function pollOperation(modelOrEndpoint, operationName, accessToken, project, location, timeoutMs) {
|
|
730
|
-
const startTime = Date.now();
|
|
731
|
-
// Global endpoint uses aiplatform.googleapis.com (no region prefix),
|
|
732
|
-
// same pattern as the predictLongRunning endpoint at line 374
|
|
733
|
-
const pollHost = location === "global"
|
|
734
|
-
? "aiplatform.googleapis.com"
|
|
735
|
-
: `${location}-aiplatform.googleapis.com`;
|
|
736
|
-
const pollEndpoint = `https://${pollHost}/v1/projects/${project}/locations/${location}/publishers/google/models/${modelOrEndpoint}:fetchPredictOperation`;
|
|
737
|
-
while (Date.now() - startTime < timeoutMs) {
|
|
738
|
-
const result = await makePollRequest(pollEndpoint, operationName, accessToken);
|
|
739
|
-
if (result.done) {
|
|
740
|
-
return extractVideoFromResult(result, operationName);
|
|
741
|
-
}
|
|
742
|
-
logger.debug("Polling operation...", {
|
|
743
|
-
operationName,
|
|
744
|
-
elapsed: Date.now() - startTime,
|
|
745
|
-
});
|
|
746
|
-
await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));
|
|
747
|
-
}
|
|
748
|
-
throw new VideoError({
|
|
749
|
-
code: VIDEO_ERROR_CODES.POLL_TIMEOUT,
|
|
750
|
-
message: `Operation timed out after ${Math.round(timeoutMs / 1000)}s`,
|
|
751
|
-
category: ErrorCategory.TIMEOUT,
|
|
752
|
-
severity: ErrorSeverity.MEDIUM,
|
|
753
|
-
retriable: true,
|
|
754
|
-
context: { operationName, timeoutMs },
|
|
755
|
-
});
|
|
756
|
-
}
|
|
757
|
-
/**
|
|
758
|
-
* Poll Vertex AI operation for transition clip completion.
|
|
759
|
-
* Uses the Veo Fast model fetchPredictOperation endpoint.
|
|
760
|
-
*/
|
|
761
|
-
async function pollTransitionOperation(operationName, accessToken, project, location, timeoutMs) {
|
|
762
|
-
return pollOperation(VEO_FAST_MODEL, operationName, accessToken, project, location, timeoutMs);
|
|
763
|
-
}
|