@juspay/neurolink 9.32.0 → 9.33.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/CHANGELOG.md +12 -0
- package/dist/auth/anthropicOAuth.js +1 -1
- package/dist/cli/commands/proxy.js +18 -5
- package/dist/client/aiSdkAdapter.js +1 -1
- package/dist/client/index.js +137 -501
- package/dist/core/factory.js +0 -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/lib/neurolink.d.ts +10 -0
- package/dist/lib/neurolink.js +41 -7
- package/dist/lib/server/routes/claudeProxyRoutes.js +45 -9
- package/dist/lib/types/generateTypes.d.ts +16 -0
- package/dist/lib/types/streamTypes.d.ts +15 -0
- package/dist/mcp/elicitationProtocol.js +1 -1
- package/dist/mcp/servers/agent/directToolsServer.js +0 -1
- package/dist/neurolink.d.ts +10 -0
- package/dist/neurolink.js +41 -7
- package/dist/providers/azureOpenai.js +1 -1
- package/dist/providers/huggingFace.js +0 -1
- package/dist/providers/openaiCompatible.js +0 -1
- package/dist/sdk/toolRegistration.js +0 -1
- package/dist/server/openapi/generator.js +1 -1
- package/dist/server/routes/claudeProxyRoutes.js +45 -9
- package/dist/types/configTypes.js +0 -5
- package/dist/types/generateTypes.d.ts +16 -0
- package/dist/types/modelTypes.js +0 -1
- package/dist/types/streamTypes.d.ts +15 -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 +2 -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/AuthProviderFactory.js +0 -111
- package/dist/client/auth/AuthProviderRegistry.js +0 -190
- package/dist/client/auth/RequestContext.js +0 -78
- package/dist/client/auth/accountPool.js +0 -178
- package/dist/client/auth/anthropicOAuth.js +0 -974
- package/dist/client/auth/authContext.js +0 -314
- package/dist/client/auth/errors.js +0 -39
- package/dist/client/auth/index.js +0 -61
- package/dist/client/auth/middleware/AuthMiddleware.js +0 -519
- package/dist/client/auth/middleware/rateLimitByUser.js +0 -554
- package/dist/client/auth/providers/BaseAuthProvider.js +0 -723
- package/dist/client/auth/providers/CognitoProvider.js +0 -304
- package/dist/client/auth/providers/KeycloakProvider.js +0 -393
- package/dist/client/auth/providers/auth0.js +0 -274
- package/dist/client/auth/providers/betterAuth.js +0 -182
- package/dist/client/auth/providers/clerk.js +0 -317
- package/dist/client/auth/providers/custom.js +0 -112
- package/dist/client/auth/providers/firebase.js +0 -226
- package/dist/client/auth/providers/jwt.js +0 -212
- package/dist/client/auth/providers/oauth2.js +0 -303
- package/dist/client/auth/providers/supabase.js +0 -259
- package/dist/client/auth/providers/workos.js +0 -284
- package/dist/client/auth/serverBridge.js +0 -25
- package/dist/client/auth/sessionManager.js +0 -437
- 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 -53
- 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 -729
- 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 -8233
- 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 -189
- 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 -9
- 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,273 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Message Builder Module
|
|
3
|
-
*
|
|
4
|
-
* Handles all message construction logic for AI providers.
|
|
5
|
-
* Extracted from BaseProvider to follow Single Responsibility Principle.
|
|
6
|
-
*
|
|
7
|
-
* Responsibilities:
|
|
8
|
-
* - Building messages from text generation options
|
|
9
|
-
* - Building messages from stream options
|
|
10
|
-
* - Multimodal input detection
|
|
11
|
-
* - Message format conversion (to ModelMessage[])
|
|
12
|
-
*
|
|
13
|
-
* @module core/modules/MessageBuilder
|
|
14
|
-
*/
|
|
15
|
-
import { tracers, ATTR, withSpan } from "../../telemetry/index.js";
|
|
16
|
-
import { logger } from "../../utils/logger.js";
|
|
17
|
-
import { buildMessagesArray, buildMultimodalMessagesArray, } from "../../utils/messageBuilder.js";
|
|
18
|
-
/**
|
|
19
|
-
* Compute total content length across all messages for span attributes.
|
|
20
|
-
*/
|
|
21
|
-
function computeTotalContentLength(messages) {
|
|
22
|
-
let total = 0;
|
|
23
|
-
for (const msg of messages) {
|
|
24
|
-
if (typeof msg.content === "string") {
|
|
25
|
-
total += msg.content.length;
|
|
26
|
-
}
|
|
27
|
-
else if (Array.isArray(msg.content)) {
|
|
28
|
-
for (const part of msg.content) {
|
|
29
|
-
if ("text" in part &&
|
|
30
|
-
typeof part.text === "string") {
|
|
31
|
-
total += part.text.length;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
return total;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Check whether input contains multimodal content (images, files, PDFs, CSVs).
|
|
40
|
-
*/
|
|
41
|
-
function detectMultimodal(opts) {
|
|
42
|
-
const input = opts.input;
|
|
43
|
-
const hasImages = !!input?.images?.length;
|
|
44
|
-
const hasContent = !!input?.content?.length;
|
|
45
|
-
const hasCSVFiles = !!input?.csvFiles?.length;
|
|
46
|
-
const hasPdfFiles = !!input?.pdfFiles?.length;
|
|
47
|
-
const hasFiles = !!input?.files?.length;
|
|
48
|
-
return {
|
|
49
|
-
isMultimodal: hasImages || hasContent || hasCSVFiles || hasPdfFiles || hasFiles,
|
|
50
|
-
hasImages,
|
|
51
|
-
hasFiles: hasCSVFiles || hasPdfFiles || hasFiles,
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* MessageBuilder class - Handles message construction for AI providers
|
|
56
|
-
*/
|
|
57
|
-
export class MessageBuilder {
|
|
58
|
-
providerName;
|
|
59
|
-
modelName;
|
|
60
|
-
constructor(providerName, modelName) {
|
|
61
|
-
this.providerName = providerName;
|
|
62
|
-
this.modelName = modelName;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Build messages array for generation
|
|
66
|
-
* Detects multimodal input and routes to appropriate message builder
|
|
67
|
-
*/
|
|
68
|
-
async buildMessages(options) {
|
|
69
|
-
return withSpan({
|
|
70
|
-
name: "neurolink.message.build",
|
|
71
|
-
tracer: tracers.sdk,
|
|
72
|
-
attributes: {
|
|
73
|
-
[ATTR.NL_PROVIDER]: this.providerName,
|
|
74
|
-
[ATTR.NL_MODEL]: this.modelName,
|
|
75
|
-
},
|
|
76
|
-
}, async (span) => {
|
|
77
|
-
const { isMultimodal, hasImages, hasFiles } = detectMultimodal(options);
|
|
78
|
-
span.setAttribute(ATTR.MSG_IS_MULTIMODAL, isMultimodal);
|
|
79
|
-
let messages;
|
|
80
|
-
if (isMultimodal) {
|
|
81
|
-
if (process.env.NEUROLINK_DEBUG === "true") {
|
|
82
|
-
logger.debug("Detected multimodal input, using multimodal message builder");
|
|
83
|
-
}
|
|
84
|
-
const input = options.input;
|
|
85
|
-
const multimodalOptions = {
|
|
86
|
-
input: {
|
|
87
|
-
text: options.prompt || options.input?.text || "",
|
|
88
|
-
images: input?.images,
|
|
89
|
-
content: input?.content,
|
|
90
|
-
csvFiles: input?.csvFiles,
|
|
91
|
-
pdfFiles: input?.pdfFiles,
|
|
92
|
-
files: input?.files,
|
|
93
|
-
},
|
|
94
|
-
csvOptions: options.csvOptions,
|
|
95
|
-
provider: options.provider,
|
|
96
|
-
model: options.model,
|
|
97
|
-
temperature: options.temperature,
|
|
98
|
-
maxTokens: options.maxTokens,
|
|
99
|
-
systemPrompt: options.systemPrompt,
|
|
100
|
-
enableAnalytics: options.enableAnalytics,
|
|
101
|
-
enableEvaluation: options.enableEvaluation,
|
|
102
|
-
context: options.context,
|
|
103
|
-
conversationHistory: options.conversationMessages,
|
|
104
|
-
schema: options.schema,
|
|
105
|
-
output: options.output,
|
|
106
|
-
fileRegistry: options.fileRegistry,
|
|
107
|
-
};
|
|
108
|
-
messages = await buildMultimodalMessagesArray(multimodalOptions, this.providerName, this.modelName);
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
if (process.env.NEUROLINK_DEBUG === "true") {
|
|
112
|
-
logger.debug("No multimodal input detected, using standard message builder");
|
|
113
|
-
}
|
|
114
|
-
messages = await buildMessagesArray(options);
|
|
115
|
-
}
|
|
116
|
-
// Convert messages to Vercel AI SDK format
|
|
117
|
-
// Preserve providerOptions (e.g. Anthropic cache_control) through conversion
|
|
118
|
-
const coreMessages = messages.map((msg) => {
|
|
119
|
-
const providerOptions = msg
|
|
120
|
-
.providerOptions;
|
|
121
|
-
if (typeof msg.content === "string") {
|
|
122
|
-
return {
|
|
123
|
-
role: msg.role,
|
|
124
|
-
content: msg.content,
|
|
125
|
-
...(providerOptions && { providerOptions }),
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
else {
|
|
129
|
-
return {
|
|
130
|
-
role: msg.role,
|
|
131
|
-
content: msg.content.map((item) => {
|
|
132
|
-
const itemProviderOptions = item.providerOptions;
|
|
133
|
-
if (item.type === "text") {
|
|
134
|
-
return {
|
|
135
|
-
type: "text",
|
|
136
|
-
text: item.text || "",
|
|
137
|
-
...(itemProviderOptions && {
|
|
138
|
-
providerOptions: itemProviderOptions,
|
|
139
|
-
}),
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
|
-
else if (item.type === "image") {
|
|
143
|
-
return {
|
|
144
|
-
type: "image",
|
|
145
|
-
image: item.image || "",
|
|
146
|
-
...(itemProviderOptions && {
|
|
147
|
-
providerOptions: itemProviderOptions,
|
|
148
|
-
}),
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
return item;
|
|
152
|
-
}),
|
|
153
|
-
...(providerOptions && { providerOptions }),
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
});
|
|
157
|
-
span.setAttribute(ATTR.MSG_COUNT, coreMessages.length);
|
|
158
|
-
span.setAttribute(ATTR.MSG_HAS_IMAGES, hasImages);
|
|
159
|
-
span.setAttribute(ATTR.MSG_HAS_FILES, hasFiles);
|
|
160
|
-
span.setAttribute(ATTR.MSG_HAS_SYSTEM_PROMPT, !!options.systemPrompt);
|
|
161
|
-
span.setAttribute(ATTR.MSG_TOTAL_CONTENT_LENGTH, computeTotalContentLength(coreMessages));
|
|
162
|
-
return coreMessages;
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* Build messages array for streaming operations
|
|
167
|
-
* This is a protected helper method that providers can use to build messages
|
|
168
|
-
* with automatic multimodal detection, eliminating code duplication
|
|
169
|
-
*
|
|
170
|
-
* @param options - Stream options or text generation options
|
|
171
|
-
* @returns Promise resolving to ModelMessage array ready for AI SDK
|
|
172
|
-
*/
|
|
173
|
-
async buildMessagesForStream(options) {
|
|
174
|
-
return withSpan({
|
|
175
|
-
name: "neurolink.message.build_for_stream",
|
|
176
|
-
tracer: tracers.sdk,
|
|
177
|
-
attributes: {
|
|
178
|
-
[ATTR.NL_PROVIDER]: this.providerName,
|
|
179
|
-
[ATTR.NL_MODEL]: this.modelName,
|
|
180
|
-
},
|
|
181
|
-
}, async (span) => {
|
|
182
|
-
const { isMultimodal, hasImages, hasFiles } = detectMultimodal(options);
|
|
183
|
-
span.setAttribute(ATTR.MSG_IS_MULTIMODAL, isMultimodal);
|
|
184
|
-
let messages;
|
|
185
|
-
if (isMultimodal) {
|
|
186
|
-
if (process.env.NEUROLINK_DEBUG === "true") {
|
|
187
|
-
logger.debug(`${this.providerName}: Detected multimodal input, using multimodal message builder`);
|
|
188
|
-
}
|
|
189
|
-
const input = options.input;
|
|
190
|
-
const multimodalOptions = {
|
|
191
|
-
input: {
|
|
192
|
-
text: options.prompt ||
|
|
193
|
-
options.input?.text ||
|
|
194
|
-
"",
|
|
195
|
-
images: input?.images,
|
|
196
|
-
content: input?.content,
|
|
197
|
-
csvFiles: input?.csvFiles,
|
|
198
|
-
pdfFiles: input?.pdfFiles,
|
|
199
|
-
files: input?.files,
|
|
200
|
-
},
|
|
201
|
-
csvOptions: options.csvOptions,
|
|
202
|
-
provider: options.provider,
|
|
203
|
-
model: options.model,
|
|
204
|
-
temperature: options.temperature,
|
|
205
|
-
maxTokens: options.maxTokens,
|
|
206
|
-
systemPrompt: options.systemPrompt,
|
|
207
|
-
enableAnalytics: options.enableAnalytics,
|
|
208
|
-
enableEvaluation: options.enableEvaluation,
|
|
209
|
-
context: options.context,
|
|
210
|
-
conversationHistory: options
|
|
211
|
-
.conversationMessages,
|
|
212
|
-
schema: options.schema,
|
|
213
|
-
output: options.output,
|
|
214
|
-
fileRegistry: options.fileRegistry,
|
|
215
|
-
};
|
|
216
|
-
messages = await buildMultimodalMessagesArray(multimodalOptions, this.providerName, this.modelName);
|
|
217
|
-
}
|
|
218
|
-
else {
|
|
219
|
-
if (process.env.NEUROLINK_DEBUG === "true") {
|
|
220
|
-
logger.debug(`${this.providerName}: No multimodal input detected, using standard message builder`);
|
|
221
|
-
}
|
|
222
|
-
messages = await buildMessagesArray(options);
|
|
223
|
-
}
|
|
224
|
-
// Convert messages to Vercel AI SDK format
|
|
225
|
-
// Preserve providerOptions (e.g. Anthropic cache_control) through conversion
|
|
226
|
-
const coreMessages = messages.map((msg) => {
|
|
227
|
-
const providerOptions = msg
|
|
228
|
-
.providerOptions;
|
|
229
|
-
if (typeof msg.content === "string") {
|
|
230
|
-
return {
|
|
231
|
-
role: msg.role,
|
|
232
|
-
content: msg.content,
|
|
233
|
-
...(providerOptions && { providerOptions }),
|
|
234
|
-
};
|
|
235
|
-
}
|
|
236
|
-
else {
|
|
237
|
-
return {
|
|
238
|
-
role: msg.role,
|
|
239
|
-
content: msg.content.map((item) => {
|
|
240
|
-
const itemProviderOptions = item.providerOptions;
|
|
241
|
-
if (item.type === "text") {
|
|
242
|
-
return {
|
|
243
|
-
type: "text",
|
|
244
|
-
text: item.text || "",
|
|
245
|
-
...(itemProviderOptions && {
|
|
246
|
-
providerOptions: itemProviderOptions,
|
|
247
|
-
}),
|
|
248
|
-
};
|
|
249
|
-
}
|
|
250
|
-
else if (item.type === "image") {
|
|
251
|
-
return {
|
|
252
|
-
type: "image",
|
|
253
|
-
image: item.image || "",
|
|
254
|
-
...(itemProviderOptions && {
|
|
255
|
-
providerOptions: itemProviderOptions,
|
|
256
|
-
}),
|
|
257
|
-
};
|
|
258
|
-
}
|
|
259
|
-
return item;
|
|
260
|
-
}),
|
|
261
|
-
...(providerOptions && { providerOptions }),
|
|
262
|
-
};
|
|
263
|
-
}
|
|
264
|
-
});
|
|
265
|
-
span.setAttribute(ATTR.MSG_COUNT, coreMessages.length);
|
|
266
|
-
span.setAttribute(ATTR.MSG_HAS_IMAGES, hasImages);
|
|
267
|
-
span.setAttribute(ATTR.MSG_HAS_FILES, hasFiles);
|
|
268
|
-
span.setAttribute(ATTR.MSG_HAS_SYSTEM_PROMPT, !!options.systemPrompt);
|
|
269
|
-
span.setAttribute(ATTR.MSG_TOTAL_CONTENT_LENGTH, computeTotalContentLength(coreMessages));
|
|
270
|
-
return coreMessages;
|
|
271
|
-
});
|
|
272
|
-
}
|
|
273
|
-
}
|
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Stream Handler Module
|
|
3
|
-
*
|
|
4
|
-
* Handles streaming-related validation, result creation, and analytics.
|
|
5
|
-
* Extracted from BaseProvider to follow Single Responsibility Principle.
|
|
6
|
-
*
|
|
7
|
-
* Responsibilities:
|
|
8
|
-
* - Stream options validation
|
|
9
|
-
* - Text stream creation
|
|
10
|
-
* - Stream result formatting
|
|
11
|
-
* - Stream analytics creation
|
|
12
|
-
*
|
|
13
|
-
* @module core/modules/StreamHandler
|
|
14
|
-
*/
|
|
15
|
-
import { trace, context as otelContext, SpanStatusCode, } from "@opentelemetry/api";
|
|
16
|
-
import { tracers, ATTR, withSpan } from "../../telemetry/index.js";
|
|
17
|
-
import { logger } from "../../utils/logger.js";
|
|
18
|
-
import { validateStreamOptions as validateStreamOpts, ValidationError, createValidationSummary, } from "../../utils/parameterValidation.js";
|
|
19
|
-
import { STEP_LIMITS } from "../constants.js";
|
|
20
|
-
import { createAnalytics } from "../analytics.js";
|
|
21
|
-
import { nanoid } from "nanoid";
|
|
22
|
-
import { NoOutputGeneratedError } from "ai";
|
|
23
|
-
/**
|
|
24
|
-
* StreamHandler class - Handles streaming operations for AI providers
|
|
25
|
-
*/
|
|
26
|
-
export class StreamHandler {
|
|
27
|
-
providerName;
|
|
28
|
-
modelName;
|
|
29
|
-
constructor(providerName, modelName) {
|
|
30
|
-
this.providerName = providerName;
|
|
31
|
-
this.modelName = modelName;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Validate stream options - consolidates validation from 7/10 providers
|
|
35
|
-
*/
|
|
36
|
-
validateStreamOptions(options) {
|
|
37
|
-
const span = tracers.stream.startSpan("neurolink.stream.validate", {
|
|
38
|
-
attributes: {
|
|
39
|
-
[ATTR.NL_PROVIDER]: this.providerName,
|
|
40
|
-
[ATTR.NL_MODEL]: this.modelName,
|
|
41
|
-
"stream.has_max_steps": options.maxSteps !== undefined,
|
|
42
|
-
},
|
|
43
|
-
});
|
|
44
|
-
try {
|
|
45
|
-
const validation = validateStreamOpts(options);
|
|
46
|
-
if (!validation.isValid) {
|
|
47
|
-
const summary = createValidationSummary(validation);
|
|
48
|
-
span.setAttribute("stream.validation_errors", validation.errors?.length ?? 0);
|
|
49
|
-
throw new ValidationError(`Stream options validation failed: ${summary}`, "options", "VALIDATION_FAILED", validation.suggestions);
|
|
50
|
-
}
|
|
51
|
-
// Log warnings if any
|
|
52
|
-
if (validation.warnings.length > 0) {
|
|
53
|
-
logger.warn("Stream options validation warnings:", validation.warnings);
|
|
54
|
-
span.addEvent("stream.validation.warnings", {
|
|
55
|
-
"warning.count": validation.warnings.length,
|
|
56
|
-
warnings: validation.warnings.join("; ").substring(0, 500),
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
// Additional BaseProvider-specific validation
|
|
60
|
-
if (options.maxSteps !== undefined) {
|
|
61
|
-
if (options.maxSteps < STEP_LIMITS.min ||
|
|
62
|
-
options.maxSteps > STEP_LIMITS.max) {
|
|
63
|
-
throw new ValidationError(`maxSteps must be between ${STEP_LIMITS.min} and ${STEP_LIMITS.max}`, "maxSteps", "OUT_OF_RANGE", [
|
|
64
|
-
`Use a value between ${STEP_LIMITS.min} and ${STEP_LIMITS.max} for optimal performance`,
|
|
65
|
-
]);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
catch (error) {
|
|
70
|
-
span.recordException(error instanceof Error ? error : new Error(String(error)));
|
|
71
|
-
// NLK-GAP-006 fix: set error status alongside recordException
|
|
72
|
-
span.setStatus({
|
|
73
|
-
code: SpanStatusCode.ERROR,
|
|
74
|
-
message: error instanceof Error ? error.message : String(error),
|
|
75
|
-
});
|
|
76
|
-
throw error;
|
|
77
|
-
}
|
|
78
|
-
finally {
|
|
79
|
-
span.end();
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Create text stream transformation - consolidates identical logic from 7/10 providers
|
|
84
|
-
* Tracks TTFC (Time To First Chunk), chunk count, and total bytes streamed.
|
|
85
|
-
*/
|
|
86
|
-
createTextStream(result) {
|
|
87
|
-
const providerName = this.providerName;
|
|
88
|
-
return (async function* () {
|
|
89
|
-
let chunkCount = 0;
|
|
90
|
-
let totalBytes = 0;
|
|
91
|
-
const streamStart = Date.now();
|
|
92
|
-
let firstChunkTime;
|
|
93
|
-
try {
|
|
94
|
-
for await (const chunk of result.textStream) {
|
|
95
|
-
chunkCount++;
|
|
96
|
-
totalBytes += chunk.length;
|
|
97
|
-
if (!firstChunkTime) {
|
|
98
|
-
firstChunkTime = Date.now();
|
|
99
|
-
const activeSpan = trace.getSpan(otelContext.active());
|
|
100
|
-
if (activeSpan) {
|
|
101
|
-
activeSpan.addEvent("stream.first_chunk", {
|
|
102
|
-
"stream.ttfc_ms": firstChunkTime - streamStart,
|
|
103
|
-
"stream.provider": providerName,
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
yield { content: chunk };
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
catch (error) {
|
|
111
|
-
// AI SDK v6 throws NoOutputGeneratedError when the stream produces no output
|
|
112
|
-
// (e.g. empty response, model refusal with no text). Treat as an empty stream
|
|
113
|
-
// rather than crashing the process with an unhandled rejection.
|
|
114
|
-
if (NoOutputGeneratedError.isInstance(error)) {
|
|
115
|
-
logger.warn(`${providerName}: Stream produced no output (NoOutputGeneratedError), returning empty stream`);
|
|
116
|
-
}
|
|
117
|
-
else {
|
|
118
|
-
throw error;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
// Record completion metrics on the active span
|
|
122
|
-
const activeSpan = trace.getSpan(otelContext.active());
|
|
123
|
-
if (activeSpan) {
|
|
124
|
-
activeSpan.addEvent("stream.complete", {
|
|
125
|
-
"stream.chunk_count": chunkCount,
|
|
126
|
-
"stream.total_bytes": totalBytes,
|
|
127
|
-
"stream.duration_ms": Date.now() - streamStart,
|
|
128
|
-
"stream.ttfc_ms": firstChunkTime ? firstChunkTime - streamStart : -1,
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
})();
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* Create standardized stream result - consolidates result structure
|
|
135
|
-
*/
|
|
136
|
-
createStreamResult(stream, additionalProps = {}) {
|
|
137
|
-
return {
|
|
138
|
-
stream,
|
|
139
|
-
provider: this.providerName,
|
|
140
|
-
model: this.modelName,
|
|
141
|
-
...additionalProps,
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Create stream analytics - consolidates analytics from 4/10 providers
|
|
146
|
-
*/
|
|
147
|
-
async createStreamAnalytics(result, startTime, options) {
|
|
148
|
-
return withSpan({
|
|
149
|
-
name: "neurolink.stream.analytics",
|
|
150
|
-
tracer: tracers.stream,
|
|
151
|
-
attributes: {
|
|
152
|
-
[ATTR.NL_PROVIDER]: this.providerName,
|
|
153
|
-
[ATTR.NL_MODEL]: this.modelName,
|
|
154
|
-
[ATTR.NL_STREAM_MODE]: true,
|
|
155
|
-
},
|
|
156
|
-
}, async (span) => {
|
|
157
|
-
try {
|
|
158
|
-
const durationMs = Date.now() - startTime;
|
|
159
|
-
span.setAttribute("stream.duration_ms", durationMs);
|
|
160
|
-
const analytics = createAnalytics(this.providerName, this.modelName, result, durationMs, {
|
|
161
|
-
requestId: `${this.providerName}-stream-${nanoid()}`,
|
|
162
|
-
streamingMode: true,
|
|
163
|
-
...options.context,
|
|
164
|
-
});
|
|
165
|
-
return analytics;
|
|
166
|
-
}
|
|
167
|
-
catch (error) {
|
|
168
|
-
logger.warn(`Analytics creation failed for ${this.providerName}:`, error);
|
|
169
|
-
return undefined;
|
|
170
|
-
}
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* Validate streaming-only options (called before executeStream)
|
|
175
|
-
* Simpler validation for options object structure
|
|
176
|
-
*/
|
|
177
|
-
validateStreamOptionsOnly(options) {
|
|
178
|
-
if (!options.input) {
|
|
179
|
-
throw new ValidationError("Stream options must include input", "input", "MISSING_REQUIRED", ["Provide options.input with text content"]);
|
|
180
|
-
}
|
|
181
|
-
if (!options.input.text && !options.input.images?.length) {
|
|
182
|
-
throw new ValidationError("Stream input must include either text or images", "input", "MISSING_REQUIRED", ["Provide options.input.text or options.input.images"]);
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
}
|
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Telemetry Handler Module
|
|
3
|
-
*
|
|
4
|
-
* Handles analytics, evaluation, performance metrics, and telemetry configuration.
|
|
5
|
-
* Extracted from BaseProvider to follow Single Responsibility Principle.
|
|
6
|
-
*
|
|
7
|
-
* Responsibilities:
|
|
8
|
-
* - Analytics creation and tracking
|
|
9
|
-
* - Evaluation generation
|
|
10
|
-
* - Performance metrics recording
|
|
11
|
-
* - Cost calculation
|
|
12
|
-
* - Telemetry configuration
|
|
13
|
-
*
|
|
14
|
-
* @module core/modules/TelemetryHandler
|
|
15
|
-
*/
|
|
16
|
-
import { nanoid } from "nanoid";
|
|
17
|
-
import { logger } from "../../utils/logger.js";
|
|
18
|
-
import { recordProviderPerformanceFromMetrics } from "../evaluationProviders.js";
|
|
19
|
-
import { modelConfig } from "../modelConfiguration.js";
|
|
20
|
-
import { TelemetryService } from "../../telemetry/telemetryService.js";
|
|
21
|
-
import { calculateCost, hasPricing } from "../../utils/pricing.js";
|
|
22
|
-
import { getLangfuseContext } from "../../services/server/ai/observability/instrumentation.js";
|
|
23
|
-
/**
|
|
24
|
-
* TelemetryHandler class - Handles analytics and telemetry for AI providers
|
|
25
|
-
*/
|
|
26
|
-
export class TelemetryHandler {
|
|
27
|
-
providerName;
|
|
28
|
-
modelName;
|
|
29
|
-
neurolink;
|
|
30
|
-
constructor(providerName, modelName, neurolink) {
|
|
31
|
-
this.providerName = providerName;
|
|
32
|
-
this.modelName = modelName;
|
|
33
|
-
this.neurolink = neurolink;
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Create analytics for a generation result
|
|
37
|
-
*/
|
|
38
|
-
async createAnalytics(result, responseTime, context) {
|
|
39
|
-
const { createAnalytics } = await import("../analytics.js");
|
|
40
|
-
return createAnalytics(this.providerName, this.modelName, result, responseTime, context);
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Create evaluation for a generation result
|
|
44
|
-
*/
|
|
45
|
-
async createEvaluation(result, options) {
|
|
46
|
-
const { evaluateResponse } = await import("../evaluation.js");
|
|
47
|
-
const context = {
|
|
48
|
-
userQuery: options.prompt || options.input?.text || "Generated response",
|
|
49
|
-
aiResponse: result.content,
|
|
50
|
-
context: options.context,
|
|
51
|
-
primaryDomain: options.evaluationDomain,
|
|
52
|
-
assistantRole: "AI assistant",
|
|
53
|
-
conversationHistory: options.conversationHistory?.map((msg) => ({
|
|
54
|
-
role: msg.role,
|
|
55
|
-
content: msg.content,
|
|
56
|
-
})),
|
|
57
|
-
toolUsage: options.toolUsageContext
|
|
58
|
-
? [
|
|
59
|
-
{
|
|
60
|
-
toolName: options.toolUsageContext,
|
|
61
|
-
input: {},
|
|
62
|
-
output: {},
|
|
63
|
-
executionTime: 0,
|
|
64
|
-
},
|
|
65
|
-
]
|
|
66
|
-
: undefined,
|
|
67
|
-
expectedOutcome: options.expectedOutcome,
|
|
68
|
-
evaluationCriteria: options.evaluationCriteria,
|
|
69
|
-
};
|
|
70
|
-
const evaluation = await evaluateResponse(context);
|
|
71
|
-
return evaluation;
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Record performance metrics for a generation
|
|
75
|
-
*/
|
|
76
|
-
async recordPerformanceMetrics(usage, responseTime) {
|
|
77
|
-
try {
|
|
78
|
-
const totalTokens = (usage?.inputTokens || 0) + (usage?.outputTokens || 0);
|
|
79
|
-
const actualCost = await this.calculateActualCost(usage || { inputTokens: 0, outputTokens: 0 });
|
|
80
|
-
recordProviderPerformanceFromMetrics(this.providerName, {
|
|
81
|
-
responseTime,
|
|
82
|
-
tokensGenerated: totalTokens,
|
|
83
|
-
cost: actualCost,
|
|
84
|
-
success: true,
|
|
85
|
-
});
|
|
86
|
-
// Wire TelemetryService metrics so OTEL counters/histograms are populated
|
|
87
|
-
TelemetryService.getInstance().recordAIRequest(this.providerName, this.modelName, totalTokens, responseTime, actualCost > 0 ? actualCost : undefined);
|
|
88
|
-
logger.debug(`Performance recorded for ${this.providerName}`, {
|
|
89
|
-
responseTime: `${responseTime}ms`,
|
|
90
|
-
tokens: totalTokens,
|
|
91
|
-
estimatedCost: `$${actualCost.toFixed(6)}`,
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
catch (perfError) {
|
|
95
|
-
logger.warn("⚠️ Performance recording failed:", perfError);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Calculate actual cost based on token usage and provider configuration.
|
|
100
|
-
*
|
|
101
|
-
* Uses the per-model pricing table first (which has accurate rates for
|
|
102
|
-
* specific models like Claude on Vertex AI), then falls back to the
|
|
103
|
-
* provider-level default cost from modelConfiguration.
|
|
104
|
-
*
|
|
105
|
-
* Previously this only used modelConfig.getCostInfo() which returns
|
|
106
|
-
* provider-level defaults (e.g. Gemini rates for the "vertex" provider),
|
|
107
|
-
* causing a ~1,780x under-estimate when the actual model was Claude Sonnet
|
|
108
|
-
* on Vertex AI ($0.000060 vs $0.106895 for the same request).
|
|
109
|
-
*/
|
|
110
|
-
async calculateActualCost(usage) {
|
|
111
|
-
try {
|
|
112
|
-
const promptTokens = usage?.inputTokens || 0;
|
|
113
|
-
const completionTokens = usage?.outputTokens || 0;
|
|
114
|
-
// Try the per-model pricing table first (includes correct rates for
|
|
115
|
-
// Claude on Vertex, cache token rates, etc.)
|
|
116
|
-
if (hasPricing(this.providerName, this.modelName)) {
|
|
117
|
-
return calculateCost(this.providerName, this.modelName, {
|
|
118
|
-
input: promptTokens,
|
|
119
|
-
output: completionTokens,
|
|
120
|
-
total: promptTokens + completionTokens,
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
// Fall back to provider-level default cost from configuration system
|
|
124
|
-
const costInfo = modelConfig.getCostInfo(this.providerName, this.modelName);
|
|
125
|
-
if (!costInfo) {
|
|
126
|
-
return 0; // No cost info available
|
|
127
|
-
}
|
|
128
|
-
// Calculate cost per 1K tokens
|
|
129
|
-
const inputCost = (promptTokens / 1000) * costInfo.input;
|
|
130
|
-
const outputCost = (completionTokens / 1000) * costInfo.output;
|
|
131
|
-
return inputCost + outputCost;
|
|
132
|
-
}
|
|
133
|
-
catch (error) {
|
|
134
|
-
logger.debug(`Cost calculation failed for ${this.providerName}:`, error);
|
|
135
|
-
return 0; // Fallback to 0 on any error
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Create telemetry configuration for Vercel AI SDK experimental_telemetry
|
|
140
|
-
* This enables automatic OpenTelemetry tracing when telemetry is enabled
|
|
141
|
-
*/
|
|
142
|
-
getTelemetryConfig(options, operationType = "stream") {
|
|
143
|
-
// Check if telemetry is enabled via NeuroLink observability config
|
|
144
|
-
if (!this.neurolink?.isTelemetryEnabled()) {
|
|
145
|
-
return undefined;
|
|
146
|
-
}
|
|
147
|
-
const context = options.context;
|
|
148
|
-
const langfuseContext = getLangfuseContext();
|
|
149
|
-
const traceName = context?.traceName ?? langfuseContext?.traceName;
|
|
150
|
-
const userId = context?.userId ?? langfuseContext?.userId;
|
|
151
|
-
const functionId = traceName ? traceName : userId ? userId : "guest";
|
|
152
|
-
const metadata = {
|
|
153
|
-
...(context?.metadata || {}),
|
|
154
|
-
provider: this.providerName,
|
|
155
|
-
model: this.modelName,
|
|
156
|
-
toolsEnabled: !options.disableTools,
|
|
157
|
-
neurolink: true,
|
|
158
|
-
operationType,
|
|
159
|
-
originalProvider: this.providerName,
|
|
160
|
-
};
|
|
161
|
-
// Add sessionId if available
|
|
162
|
-
if ("sessionId" in options && options.sessionId) {
|
|
163
|
-
const sessionId = options.sessionId;
|
|
164
|
-
if (typeof sessionId === "string" ||
|
|
165
|
-
typeof sessionId === "number" ||
|
|
166
|
-
typeof sessionId === "boolean") {
|
|
167
|
-
metadata.sessionId = sessionId;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
return {
|
|
171
|
-
isEnabled: true,
|
|
172
|
-
functionId,
|
|
173
|
-
metadata,
|
|
174
|
-
recordInputs: process.env.NEUROLINK_RECORD_INPUTS?.toLowerCase() !== "false",
|
|
175
|
-
recordOutputs: true,
|
|
176
|
-
};
|
|
177
|
-
}
|
|
178
|
-
/**
|
|
179
|
-
* Handle tool execution storage if available
|
|
180
|
-
*/
|
|
181
|
-
async handleToolExecutionStorage(toolCalls, toolResults, options, currentTime) {
|
|
182
|
-
// Check if tools are not empty
|
|
183
|
-
const hasToolData = (toolCalls && toolCalls.length > 0) ||
|
|
184
|
-
(toolResults && toolResults.length > 0);
|
|
185
|
-
// Check if NeuroLink instance is available and has tool execution storage
|
|
186
|
-
const hasStorageAvailable = this.neurolink?.isToolExecutionStorageAvailable();
|
|
187
|
-
// Early return if storage is not available or no tool data
|
|
188
|
-
if (!hasStorageAvailable || !hasToolData || !this.neurolink) {
|
|
189
|
-
return;
|
|
190
|
-
}
|
|
191
|
-
const sessionId = options.context?.sessionId ||
|
|
192
|
-
options.sessionId ||
|
|
193
|
-
`session-${nanoid()}`;
|
|
194
|
-
const userId = options.context?.userId ||
|
|
195
|
-
options.userId;
|
|
196
|
-
try {
|
|
197
|
-
await this.neurolink.storeToolExecutions(sessionId, userId, toolCalls, toolResults, currentTime);
|
|
198
|
-
}
|
|
199
|
-
catch (error) {
|
|
200
|
-
logger.warn("Failed to store tool executions:", error);
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
}
|