@juspay/neurolink 9.32.0 → 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 +6 -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/server/routes/claudeProxyRoutes.js +45 -9
- package/dist/mcp/elicitationProtocol.js +1 -1
- package/dist/mcp/servers/agent/directToolsServer.js +0 -1
- 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/modelTypes.js +0 -1
- 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,808 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OpenTelemetry Instrumentation for Langfuse v4
|
|
3
|
-
*
|
|
4
|
-
* Configures OpenTelemetry TracerProvider with LangfuseSpanProcessor to capture
|
|
5
|
-
* traces from Vercel AI SDK's experimental_telemetry feature.
|
|
6
|
-
*
|
|
7
|
-
* Flow: Vercel AI SDK → OpenTelemetry Spans → LangfuseSpanProcessor → Langfuse Platform
|
|
8
|
-
*/
|
|
9
|
-
import { LangfuseSpanProcessor } from "@langfuse/otel";
|
|
10
|
-
import { trace } from "@opentelemetry/api";
|
|
11
|
-
import { resourceFromAttributes } from "@opentelemetry/resources";
|
|
12
|
-
import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
|
|
13
|
-
import { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION, } from "@opentelemetry/semantic-conventions";
|
|
14
|
-
import { AsyncLocalStorage } from "async_hooks";
|
|
15
|
-
import { logger } from "../../../../utils/logger.js";
|
|
16
|
-
const LOG_PREFIX = "[OpenTelemetry]";
|
|
17
|
-
const contextStorage = new AsyncLocalStorage();
|
|
18
|
-
let tracerProvider = null;
|
|
19
|
-
let langfuseProcessor = null;
|
|
20
|
-
let isInitialized = false;
|
|
21
|
-
let isCredentialsValid = false;
|
|
22
|
-
let currentConfig = null;
|
|
23
|
-
let usingExternalProvider = false;
|
|
24
|
-
let cachedContextEnricher = null;
|
|
25
|
-
/**
|
|
26
|
-
* Check if a real TracerProvider (not ProxyTracerProvider) is already registered
|
|
27
|
-
*
|
|
28
|
-
* IMPORTANT: This function checks the @opentelemetry/api global state as seen by THIS
|
|
29
|
-
* module's bundled copy of @opentelemetry/api. If Neurolink is bundled with its own
|
|
30
|
-
* copy of @opentelemetry/api (which is common in bundled libraries), this function
|
|
31
|
-
* will NOT detect TracerProviders registered by the host application on their
|
|
32
|
-
* @opentelemetry/api instance. Use `useExternalTracerProvider: true` or
|
|
33
|
-
* `autoDetectExternalProvider: true` to explicitly signal external provider usage.
|
|
34
|
-
*
|
|
35
|
-
* @returns true if an external TracerProvider is detected in this module's OTEL instance
|
|
36
|
-
*/
|
|
37
|
-
function _hasExternalTracerProvider() {
|
|
38
|
-
try {
|
|
39
|
-
const provider = trace.getTracerProvider();
|
|
40
|
-
if (!provider) {
|
|
41
|
-
return false;
|
|
42
|
-
}
|
|
43
|
-
// ProxyTracerProvider is the default "no-op" provider
|
|
44
|
-
// Any other provider means someone else registered one
|
|
45
|
-
const providerName = provider.constructor?.name || "";
|
|
46
|
-
const isProxy = providerName === "ProxyTracerProvider" ||
|
|
47
|
-
providerName === "NoopTracerProvider";
|
|
48
|
-
if (!isProxy) {
|
|
49
|
-
logger.debug(`${LOG_PREFIX} Detected external TracerProvider: ${providerName}`);
|
|
50
|
-
}
|
|
51
|
-
return !isProxy;
|
|
52
|
-
}
|
|
53
|
-
catch (error) {
|
|
54
|
-
logger.warn(`${LOG_PREFIX} Error checking for external TracerProvider`, {
|
|
55
|
-
error: error instanceof Error ? error.message : String(error),
|
|
56
|
-
});
|
|
57
|
-
return false;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Span processor that enriches spans with user and session context from AsyncLocalStorage
|
|
62
|
-
* Also extracts GenAI semantic convention attributes for Langfuse integration
|
|
63
|
-
*
|
|
64
|
-
* Key features:
|
|
65
|
-
* - Enriches spans with userId, sessionId, conversationId, requestId
|
|
66
|
-
* - Auto-detects operation names from Vercel AI SDK span names
|
|
67
|
-
* - Builds formatted trace names for Langfuse (e.g., "user@email.com:ai.streamText")
|
|
68
|
-
* - Supports custom trace name formats via configuration
|
|
69
|
-
* - Handles wrapper spans by detecting operations from child spans and updating trace name in onEnd()
|
|
70
|
-
*/
|
|
71
|
-
class ContextEnricher {
|
|
72
|
-
/**
|
|
73
|
-
* Maximum number of detected operations to track to prevent memory leaks.
|
|
74
|
-
* Once this limit is reached, oldest entries are evicted (FIFO).
|
|
75
|
-
*/
|
|
76
|
-
static MAX_DETECTED_OPERATIONS = 10000;
|
|
77
|
-
/**
|
|
78
|
-
* Track detected operations per trace for wrapper span support.
|
|
79
|
-
* When a host app creates a wrapper span before AI operations, the wrapper's
|
|
80
|
-
* onStart() runs before the AI SDK child span exists. We store detected
|
|
81
|
-
* operations here so we can update the trace name in onEnd().
|
|
82
|
-
*/
|
|
83
|
-
detectedOperations = new Map();
|
|
84
|
-
onStart(span, parentContext) {
|
|
85
|
-
const context = contextStorage.getStore();
|
|
86
|
-
const userId = context?.userId ?? currentConfig?.userId ?? "guest";
|
|
87
|
-
const sessionId = context?.sessionId ?? currentConfig?.sessionId;
|
|
88
|
-
// Get span name for operation auto-detection
|
|
89
|
-
const spanName = span.name;
|
|
90
|
-
// Determine if auto-detection is enabled for this context
|
|
91
|
-
const autoDetect = this.shouldAutoDetectOperationName(context);
|
|
92
|
-
// Resolve operation name: explicit > auto-detected > undefined
|
|
93
|
-
const operationName = this.resolveOperationName(context?.operationName, spanName, autoDetect);
|
|
94
|
-
// Store detected AI operations for wrapper span support (optional, defensive).
|
|
95
|
-
// When a host app creates a wrapper span before calling AI operations,
|
|
96
|
-
// this allows us to update the trace name in onEnd() with the operation.
|
|
97
|
-
// Only store the first detected operation for each trace (subsequent operations are ignored).
|
|
98
|
-
try {
|
|
99
|
-
if (operationName && spanName?.startsWith("ai.")) {
|
|
100
|
-
const traceId = span.spanContext?.()?.traceId;
|
|
101
|
-
if (traceId && !this.detectedOperations.has(traceId)) {
|
|
102
|
-
// Evict oldest entry if at capacity to prevent memory leak
|
|
103
|
-
if (this.detectedOperations.size >=
|
|
104
|
-
ContextEnricher.MAX_DETECTED_OPERATIONS) {
|
|
105
|
-
const firstKey = this.detectedOperations.keys().next().value;
|
|
106
|
-
if (firstKey) {
|
|
107
|
-
this.detectedOperations.delete(firstKey);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
this.detectedOperations.set(traceId, operationName);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
catch {
|
|
115
|
-
// Wrapper span support is optional - don't fail if spanContext isn't available
|
|
116
|
-
}
|
|
117
|
-
// Build trace name based on priority:
|
|
118
|
-
// 1. Explicit traceName (100% backward compatible)
|
|
119
|
-
// 2. Formatted name with userId + operationName
|
|
120
|
-
// 3. userId only (legacy fallback)
|
|
121
|
-
const traceName = this.buildTraceName(context?.traceName, userId, operationName);
|
|
122
|
-
// Apply custom attributes FIRST so internal attributes always take precedence
|
|
123
|
-
// and cannot be accidentally overwritten by user-provided values
|
|
124
|
-
if (context?.customAttributes) {
|
|
125
|
-
for (const [key, value] of Object.entries(context.customAttributes)) {
|
|
126
|
-
span.setAttribute(key, value);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
// Set user and session attributes (internal - always override custom)
|
|
130
|
-
if (userId && userId !== "guest") {
|
|
131
|
-
span.setAttribute("user.id", userId);
|
|
132
|
-
}
|
|
133
|
-
if (sessionId) {
|
|
134
|
-
span.setAttribute("session.id", sessionId);
|
|
135
|
-
}
|
|
136
|
-
// Add extended context fields
|
|
137
|
-
if (context?.conversationId) {
|
|
138
|
-
span.setAttribute("conversation.id", context.conversationId);
|
|
139
|
-
}
|
|
140
|
-
if (context?.requestId) {
|
|
141
|
-
span.setAttribute("request.id", context.requestId);
|
|
142
|
-
}
|
|
143
|
-
const isRootSpan = !trace.getSpan(parentContext);
|
|
144
|
-
if (traceName && isRootSpan) {
|
|
145
|
-
span.setAttribute("langfuse.trace.name", traceName);
|
|
146
|
-
span.setAttribute("trace.name", traceName);
|
|
147
|
-
}
|
|
148
|
-
// Set operation name as separate attribute for filtering/analytics
|
|
149
|
-
if (operationName) {
|
|
150
|
-
span.setAttribute("gen_ai.operation.name", operationName);
|
|
151
|
-
}
|
|
152
|
-
// Add custom metadata as span attributes
|
|
153
|
-
const metadata = context?.metadata;
|
|
154
|
-
if (metadata && typeof metadata === "object") {
|
|
155
|
-
for (const [key, value] of Object.entries(metadata)) {
|
|
156
|
-
if (value !== undefined && value !== null) {
|
|
157
|
-
// Preserve primitive types that OTEL supports natively
|
|
158
|
-
if (typeof value === "string" ||
|
|
159
|
-
typeof value === "number" ||
|
|
160
|
-
typeof value === "boolean") {
|
|
161
|
-
if (metadata && isRootSpan) {
|
|
162
|
-
span.setAttribute("langfuse.trace.metadata", JSON.stringify(metadata));
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
else if (Array.isArray(value) &&
|
|
166
|
-
value.every((v) => typeof v === "string" ||
|
|
167
|
-
typeof v === "number" ||
|
|
168
|
-
typeof v === "boolean")) {
|
|
169
|
-
// OTEL supports homogeneous arrays of primitives
|
|
170
|
-
span.setAttribute(`metadata.${key}`, JSON.stringify(value));
|
|
171
|
-
}
|
|
172
|
-
else {
|
|
173
|
-
// Fall back to JSON string for complex types
|
|
174
|
-
span.setAttribute(`metadata.${key}`, JSON.stringify(value));
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
/**
|
|
181
|
-
* Determine if auto-detection should be used for operation names
|
|
182
|
-
*/
|
|
183
|
-
shouldAutoDetectOperationName(context) {
|
|
184
|
-
// Context-level override takes precedence
|
|
185
|
-
if (context?.autoDetectOperationName !== undefined) {
|
|
186
|
-
return context.autoDetectOperationName;
|
|
187
|
-
}
|
|
188
|
-
// Fall back to global config (default: true)
|
|
189
|
-
return currentConfig?.autoDetectOperationName !== false;
|
|
190
|
-
}
|
|
191
|
-
/**
|
|
192
|
-
* Resolve operation name from explicit setting, auto-detection, or undefined
|
|
193
|
-
*/
|
|
194
|
-
resolveOperationName(explicit, spanName, autoDetect) {
|
|
195
|
-
// Explicit operation name takes precedence
|
|
196
|
-
if (explicit) {
|
|
197
|
-
return explicit;
|
|
198
|
-
}
|
|
199
|
-
// Auto-detect from span name if enabled
|
|
200
|
-
if (autoDetect && spanName) {
|
|
201
|
-
// Detect Vercel AI SDK operation spans (ai.streamText, ai.generateText, etc.)
|
|
202
|
-
if (spanName.startsWith("ai.")) {
|
|
203
|
-
return spanName;
|
|
204
|
-
}
|
|
205
|
-
// Detect OpenTelemetry GenAI convention spans (chat, embeddings, text_completion)
|
|
206
|
-
if (spanName === "chat" ||
|
|
207
|
-
spanName === "embeddings" ||
|
|
208
|
-
spanName === "text_completion") {
|
|
209
|
-
return spanName;
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
return undefined;
|
|
213
|
-
}
|
|
214
|
-
/**
|
|
215
|
-
* Build trace name based on format configuration and available data
|
|
216
|
-
*/
|
|
217
|
-
buildTraceName(explicitTraceName, userId, operationName) {
|
|
218
|
-
// 1. Explicit traceName always wins (100% backward compatibility)
|
|
219
|
-
if (explicitTraceName) {
|
|
220
|
-
return explicitTraceName;
|
|
221
|
-
}
|
|
222
|
-
// 2. Build formatted trace name based on config
|
|
223
|
-
const format = currentConfig?.traceNameFormat ?? "userId:operationName";
|
|
224
|
-
// Handle custom function format
|
|
225
|
-
if (typeof format === "function") {
|
|
226
|
-
return format({ userId, operationName });
|
|
227
|
-
}
|
|
228
|
-
// Handle predefined string formats
|
|
229
|
-
switch (format) {
|
|
230
|
-
case "userId:operationName":
|
|
231
|
-
return operationName ? `${userId}:${operationName}` : userId;
|
|
232
|
-
case "operationName:userId":
|
|
233
|
-
return operationName ? `${operationName}:${userId}` : userId;
|
|
234
|
-
case "operationName":
|
|
235
|
-
return operationName || userId;
|
|
236
|
-
case "userId":
|
|
237
|
-
default:
|
|
238
|
-
return userId;
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* Called when span ends - extracts GenAI semantic convention attributes
|
|
243
|
-
* from Vercel AI SDK spans and enriches them for Langfuse.
|
|
244
|
-
*
|
|
245
|
-
* Also handles wrapper span support: when a host app creates a wrapper/trace-root
|
|
246
|
-
* span before AI operations, we update the trace name here with the detected operation.
|
|
247
|
-
*/
|
|
248
|
-
onEnd(span) {
|
|
249
|
-
try {
|
|
250
|
-
// Get span attributes (ReadableSpan interface)
|
|
251
|
-
const readableSpan = span;
|
|
252
|
-
const attributes = readableSpan.attributes || {};
|
|
253
|
-
// Handle wrapper/trace-root spans: update trace name with detected operation
|
|
254
|
-
// This supports host apps (like Curator) that create wrapper spans before AI calls
|
|
255
|
-
// This is optional - if spanContext fails, we skip wrapper span support
|
|
256
|
-
try {
|
|
257
|
-
const traceId = span.spanContext?.()?.traceId;
|
|
258
|
-
if (traceId) {
|
|
259
|
-
const isTraceRoot = attributes["langfuse.span.type"] === "trace-root";
|
|
260
|
-
const detectedOp = this.detectedOperations.get(traceId);
|
|
261
|
-
if (isTraceRoot && detectedOp) {
|
|
262
|
-
const context = contextStorage.getStore();
|
|
263
|
-
const userId = attributes["user.id"] ||
|
|
264
|
-
context?.userId ||
|
|
265
|
-
currentConfig?.userId ||
|
|
266
|
-
"guest";
|
|
267
|
-
// Only update if there's no explicit traceName set
|
|
268
|
-
const existingTraceName = attributes["langfuse.trace.name"];
|
|
269
|
-
const hasExplicitTraceName = context?.traceName ||
|
|
270
|
-
(existingTraceName && existingTraceName !== userId);
|
|
271
|
-
if (!hasExplicitTraceName) {
|
|
272
|
-
const newTraceName = this.buildTraceName(null, userId, detectedOp);
|
|
273
|
-
// Update the trace name attribute
|
|
274
|
-
span.setAttribute("langfuse.trace.name", newTraceName);
|
|
275
|
-
span.setAttribute("trace.name", newTraceName);
|
|
276
|
-
span.setAttribute("gen_ai.operation.name", detectedOp);
|
|
277
|
-
logger.debug(`${LOG_PREFIX} Updated trace-root span with detected operation`, {
|
|
278
|
-
traceId,
|
|
279
|
-
operation: detectedOp,
|
|
280
|
-
newTraceName,
|
|
281
|
-
});
|
|
282
|
-
}
|
|
283
|
-
// Cleanup the detected operation
|
|
284
|
-
this.detectedOperations.delete(traceId);
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
catch {
|
|
289
|
-
// Wrapper span support is optional - don't fail if spanContext isn't available
|
|
290
|
-
}
|
|
291
|
-
// Check if this is a GenAI span (from Vercel AI SDK)
|
|
292
|
-
const isGenAISpan = attributes["gen_ai.system"] ||
|
|
293
|
-
attributes["ai.model.id"] ||
|
|
294
|
-
attributes["gen_ai.request.model"];
|
|
295
|
-
if (isGenAISpan) {
|
|
296
|
-
logger.debug(`${LOG_PREFIX} GenAI span detected`, {
|
|
297
|
-
spanName: readableSpan.name,
|
|
298
|
-
model: attributes["gen_ai.request.model"] || attributes["ai.model.id"],
|
|
299
|
-
provider: attributes["gen_ai.system"] || attributes["ai.model.provider"],
|
|
300
|
-
});
|
|
301
|
-
// Log token usage for observability
|
|
302
|
-
const inputTokens = attributes["gen_ai.usage.input_tokens"] ||
|
|
303
|
-
attributes["ai.usage.promptTokens"];
|
|
304
|
-
const outputTokens = attributes["gen_ai.usage.output_tokens"] ||
|
|
305
|
-
attributes["ai.usage.completionTokens"];
|
|
306
|
-
if (inputTokens !== undefined || outputTokens !== undefined) {
|
|
307
|
-
logger.debug(`${LOG_PREFIX} Token usage captured`, {
|
|
308
|
-
inputTokens,
|
|
309
|
-
outputTokens,
|
|
310
|
-
totalTokens: attributes["gen_ai.usage.total_tokens"],
|
|
311
|
-
});
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
catch (error) {
|
|
316
|
-
// Don't fail span processing on errors
|
|
317
|
-
logger.debug(`${LOG_PREFIX} Error reading span attributes`, {
|
|
318
|
-
error: error instanceof Error ? error.message : String(error),
|
|
319
|
-
});
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
shutdown() {
|
|
323
|
-
// Clean up tracked operations to prevent memory leaks
|
|
324
|
-
this.detectedOperations.clear();
|
|
325
|
-
return Promise.resolve();
|
|
326
|
-
}
|
|
327
|
-
forceFlush() {
|
|
328
|
-
return Promise.resolve();
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
/**
|
|
332
|
-
* Initialize OpenTelemetry with Langfuse span processor
|
|
333
|
-
*
|
|
334
|
-
* This connects Vercel AI SDK's experimental_telemetry to Langfuse by:
|
|
335
|
-
* 1. Creating LangfuseSpanProcessor with Langfuse credentials
|
|
336
|
-
* 2. Creating a NodeTracerProvider with service metadata and span processor
|
|
337
|
-
* 3. Registering the provider globally for AI SDK to use
|
|
338
|
-
*
|
|
339
|
-
* NEW: If useExternalTracerProvider is true or autoDetectExternalProvider detects
|
|
340
|
-
* an existing provider, steps 2 and 3 are skipped. The span processors are still
|
|
341
|
-
* created and can be retrieved via getSpanProcessors().
|
|
342
|
-
*
|
|
343
|
-
* @param config - Langfuse configuration passed from parent application
|
|
344
|
-
*/
|
|
345
|
-
export function initializeOpenTelemetry(config) {
|
|
346
|
-
// Guard against multiple initializations — but always update config
|
|
347
|
-
// so that later NeuroLink instances can change traceNameFormat,
|
|
348
|
-
// autoDetectOperationName, and other configuration preferences
|
|
349
|
-
// without re-initializing the OTEL infrastructure.
|
|
350
|
-
if (isInitialized) {
|
|
351
|
-
currentConfig = config;
|
|
352
|
-
logger.debug(`${LOG_PREFIX} Already initialized, config updated`, {
|
|
353
|
-
usingExternalProvider,
|
|
354
|
-
hasLangfuseProcessor: !!langfuseProcessor,
|
|
355
|
-
hasTraceNameFormat: typeof config.traceNameFormat === "function",
|
|
356
|
-
});
|
|
357
|
-
return;
|
|
358
|
-
}
|
|
359
|
-
// FIRST: Check for external provider mode - bypasses enabled check
|
|
360
|
-
// NOTE: When autoDetectExternalProvider is true, we trust the flag directly rather than
|
|
361
|
-
// calling hasExternalTracerProvider(). This is because Neurolink may bundle its own copy
|
|
362
|
-
// of @opentelemetry/api, which has a separate global state from the host application.
|
|
363
|
-
// The hasExternalTracerProvider() check would query Neurolink's bundled @opentelemetry/api
|
|
364
|
-
// global state (which has no provider registered), not the host's global state.
|
|
365
|
-
// By trusting autoDetectExternalProvider=true, we let the host application signal that
|
|
366
|
-
// it has already registered a TracerProvider.
|
|
367
|
-
const shouldUseExternal = config?.useExternalTracerProvider === true ||
|
|
368
|
-
config?.autoDetectExternalProvider === true;
|
|
369
|
-
if (shouldUseExternal) {
|
|
370
|
-
// Validate credentials even in external mode
|
|
371
|
-
if (!config?.publicKey || !config?.secretKey) {
|
|
372
|
-
logger.warn(`${LOG_PREFIX} External provider mode but missing credentials, skipping initialization`, {
|
|
373
|
-
hasPublicKey: !!config?.publicKey,
|
|
374
|
-
hasSecretKey: !!config?.secretKey,
|
|
375
|
-
});
|
|
376
|
-
isInitialized = true;
|
|
377
|
-
isCredentialsValid = false;
|
|
378
|
-
return;
|
|
379
|
-
}
|
|
380
|
-
try {
|
|
381
|
-
currentConfig = config;
|
|
382
|
-
isCredentialsValid = true;
|
|
383
|
-
// Create span processor for external provider mode
|
|
384
|
-
// shouldExportSpan: export all spans (v5 default filters to gen_ai spans only)
|
|
385
|
-
langfuseProcessor = new LangfuseSpanProcessor({
|
|
386
|
-
publicKey: config.publicKey,
|
|
387
|
-
secretKey: config.secretKey,
|
|
388
|
-
baseUrl: config.baseUrl || "https://cloud.langfuse.com",
|
|
389
|
-
environment: config.environment || "dev",
|
|
390
|
-
release: config.release || "v1.0.0",
|
|
391
|
-
shouldExportSpan: () => true,
|
|
392
|
-
});
|
|
393
|
-
usingExternalProvider = true;
|
|
394
|
-
isInitialized = true;
|
|
395
|
-
// Auto-register ContextEnricher with the global TracerProvider
|
|
396
|
-
// This ensures trace names are set even when host doesn't call getSpanProcessors()
|
|
397
|
-
try {
|
|
398
|
-
const globalProvider = trace.getTracerProvider();
|
|
399
|
-
// Check if it's a real provider with addSpanProcessor method (not the no-op default)
|
|
400
|
-
if (globalProvider &&
|
|
401
|
-
typeof globalProvider
|
|
402
|
-
.addSpanProcessor === "function") {
|
|
403
|
-
const provider = globalProvider;
|
|
404
|
-
// Add ContextEnricher for trace name enrichment
|
|
405
|
-
provider.addSpanProcessor(new ContextEnricher());
|
|
406
|
-
// Only add LangfuseSpanProcessor if the host has not already registered one.
|
|
407
|
-
// When skipLangfuseSpanProcessor is true, the host (e.g. Curator) already
|
|
408
|
-
// registers its own LangfuseSpanProcessor via a DeferredSpanProcessor, so
|
|
409
|
-
// adding another one here would cause duplicate trace exports to Langfuse.
|
|
410
|
-
const skipLangfuse = config.skipLangfuseSpanProcessor === true;
|
|
411
|
-
if (!skipLangfuse) {
|
|
412
|
-
provider.addSpanProcessor(langfuseProcessor);
|
|
413
|
-
}
|
|
414
|
-
logger.info(`${LOG_PREFIX} Auto-registered processors with global TracerProvider`, {
|
|
415
|
-
processors: skipLangfuse
|
|
416
|
-
? ["ContextEnricher"]
|
|
417
|
-
: ["ContextEnricher", "LangfuseSpanProcessor"],
|
|
418
|
-
reason: "External provider mode with auto-registration",
|
|
419
|
-
skippedLangfuseSpanProcessor: skipLangfuse,
|
|
420
|
-
});
|
|
421
|
-
}
|
|
422
|
-
else {
|
|
423
|
-
// No real provider found - host will need to add processors manually
|
|
424
|
-
logger.info(`${LOG_PREFIX} Using external TracerProvider mode`, {
|
|
425
|
-
reason: config.useExternalTracerProvider
|
|
426
|
-
? "useExternalTracerProvider=true"
|
|
427
|
-
: "autoDetectExternalProvider=true (trusting host signal)",
|
|
428
|
-
instructions: "Add span processors to your TracerProvider using getSpanProcessors()",
|
|
429
|
-
});
|
|
430
|
-
logger.info(`${LOG_PREFIX} Span processors ready for external use`, {
|
|
431
|
-
processors: ["ContextEnricher", "LangfuseSpanProcessor"],
|
|
432
|
-
usage: "import { getSpanProcessors } from '@juspay/neurolink'",
|
|
433
|
-
});
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
catch (autoRegisterError) {
|
|
437
|
-
// Auto-registration failed - fall back to manual registration
|
|
438
|
-
logger.warn(`${LOG_PREFIX} Auto-registration failed, manual registration required`, {
|
|
439
|
-
error: autoRegisterError instanceof Error
|
|
440
|
-
? autoRegisterError.message
|
|
441
|
-
: String(autoRegisterError),
|
|
442
|
-
instructions: "Add span processors to your TracerProvider using getSpanProcessors()",
|
|
443
|
-
});
|
|
444
|
-
}
|
|
445
|
-
return;
|
|
446
|
-
}
|
|
447
|
-
catch (error) {
|
|
448
|
-
logger.error(`${LOG_PREFIX} Failed to create span processor for external mode`, {
|
|
449
|
-
error: error instanceof Error ? error.message : String(error),
|
|
450
|
-
stack: error instanceof Error ? error.stack : undefined,
|
|
451
|
-
});
|
|
452
|
-
isInitialized = true;
|
|
453
|
-
return;
|
|
454
|
-
}
|
|
455
|
-
}
|
|
456
|
-
// THEN: Check enabled for standalone mode
|
|
457
|
-
if (!config?.enabled) {
|
|
458
|
-
logger.debug(`${LOG_PREFIX} Langfuse disabled and no external provider, skipping initialization`);
|
|
459
|
-
isInitialized = true;
|
|
460
|
-
return;
|
|
461
|
-
}
|
|
462
|
-
// Validate credentials for standalone mode
|
|
463
|
-
if (!config.publicKey || !config.secretKey) {
|
|
464
|
-
logger.warn(`${LOG_PREFIX} Langfuse enabled but missing credentials, skipping initialization`, {
|
|
465
|
-
hasPublicKey: !!config.publicKey,
|
|
466
|
-
hasSecretKey: !!config.secretKey,
|
|
467
|
-
});
|
|
468
|
-
isInitialized = true;
|
|
469
|
-
isCredentialsValid = false;
|
|
470
|
-
return;
|
|
471
|
-
}
|
|
472
|
-
try {
|
|
473
|
-
currentConfig = config;
|
|
474
|
-
isCredentialsValid = true;
|
|
475
|
-
// Step 1: Create LangfuseSpanProcessor for standalone mode
|
|
476
|
-
// shouldExportSpan: export all spans (v5 default filters to gen_ai spans only)
|
|
477
|
-
langfuseProcessor = new LangfuseSpanProcessor({
|
|
478
|
-
publicKey: config.publicKey,
|
|
479
|
-
secretKey: config.secretKey,
|
|
480
|
-
baseUrl: config.baseUrl || "https://cloud.langfuse.com",
|
|
481
|
-
environment: config.environment || "dev",
|
|
482
|
-
release: config.release || "v1.0.0",
|
|
483
|
-
shouldExportSpan: () => true,
|
|
484
|
-
});
|
|
485
|
-
logger.debug(`${LOG_PREFIX} Created LangfuseSpanProcessor`, {
|
|
486
|
-
baseUrl: config.baseUrl || "https://cloud.langfuse.com",
|
|
487
|
-
environment: config.environment || "dev",
|
|
488
|
-
});
|
|
489
|
-
// Step 2: Create our own TracerProvider (standalone behavior)
|
|
490
|
-
const resource = resourceFromAttributes({
|
|
491
|
-
[ATTR_SERVICE_NAME]: "neurolink",
|
|
492
|
-
[ATTR_SERVICE_VERSION]: config.release || "v1.0.0",
|
|
493
|
-
"deployment.environment": config.environment || "dev",
|
|
494
|
-
});
|
|
495
|
-
tracerProvider = new NodeTracerProvider({
|
|
496
|
-
resource,
|
|
497
|
-
spanProcessors: [new ContextEnricher(), langfuseProcessor],
|
|
498
|
-
});
|
|
499
|
-
// Step 4: Register globally
|
|
500
|
-
tracerProvider.register();
|
|
501
|
-
usingExternalProvider = false;
|
|
502
|
-
isInitialized = true;
|
|
503
|
-
logger.info(`${LOG_PREFIX} Initialized with Langfuse span processor`, {
|
|
504
|
-
baseUrl: config.baseUrl || "https://cloud.langfuse.com",
|
|
505
|
-
environment: config.environment || "dev",
|
|
506
|
-
release: config.release || "v1.0.0",
|
|
507
|
-
mode: "standalone",
|
|
508
|
-
});
|
|
509
|
-
}
|
|
510
|
-
catch (error) {
|
|
511
|
-
// Check if this is a duplicate registration error
|
|
512
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
513
|
-
const isDuplicateError = errorMessage.includes("duplicate registration") ||
|
|
514
|
-
errorMessage.includes("already registered") ||
|
|
515
|
-
errorMessage.includes("already set");
|
|
516
|
-
if (isDuplicateError) {
|
|
517
|
-
// Graceful handling: switch to external mode
|
|
518
|
-
logger.warn(`${LOG_PREFIX} TracerProvider already registered, switching to external mode`, {
|
|
519
|
-
error: errorMessage,
|
|
520
|
-
recommendation: "Set useExternalTracerProvider=true or autoDetectExternalProvider=true in config",
|
|
521
|
-
});
|
|
522
|
-
usingExternalProvider = true;
|
|
523
|
-
isInitialized = true;
|
|
524
|
-
// Don't throw - processors are still usable
|
|
525
|
-
return;
|
|
526
|
-
}
|
|
527
|
-
// Other errors: log and re-throw
|
|
528
|
-
logger.error(`${LOG_PREFIX} Initialization failed`, {
|
|
529
|
-
error: errorMessage,
|
|
530
|
-
stack: error instanceof Error ? error.stack : undefined,
|
|
531
|
-
});
|
|
532
|
-
throw error;
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
/**
|
|
536
|
-
* Flush all pending spans to Langfuse
|
|
537
|
-
*/
|
|
538
|
-
export async function flushOpenTelemetry() {
|
|
539
|
-
if (!isInitialized) {
|
|
540
|
-
logger.debug(`${LOG_PREFIX} Not initialized, skipping flush`);
|
|
541
|
-
return;
|
|
542
|
-
}
|
|
543
|
-
if (!langfuseProcessor) {
|
|
544
|
-
logger.debug(`${LOG_PREFIX} No processor to flush (Langfuse disabled)`);
|
|
545
|
-
return;
|
|
546
|
-
}
|
|
547
|
-
try {
|
|
548
|
-
logger.info(`${LOG_PREFIX} Flushing pending spans to Langfuse...`);
|
|
549
|
-
await langfuseProcessor.forceFlush();
|
|
550
|
-
logger.info(`${LOG_PREFIX} Successfully flushed spans to Langfuse`);
|
|
551
|
-
}
|
|
552
|
-
catch (error) {
|
|
553
|
-
logger.error(`${LOG_PREFIX} Flush failed`, {
|
|
554
|
-
error: error instanceof Error ? error.message : String(error),
|
|
555
|
-
stack: error instanceof Error ? error.stack : undefined,
|
|
556
|
-
});
|
|
557
|
-
throw error;
|
|
558
|
-
}
|
|
559
|
-
}
|
|
560
|
-
/**
|
|
561
|
-
* Shutdown OpenTelemetry and Langfuse span processor
|
|
562
|
-
*/
|
|
563
|
-
export async function shutdownOpenTelemetry() {
|
|
564
|
-
if (!isInitialized) {
|
|
565
|
-
return;
|
|
566
|
-
}
|
|
567
|
-
try {
|
|
568
|
-
// Only shutdown tracerProvider if we created it
|
|
569
|
-
if (tracerProvider && !usingExternalProvider) {
|
|
570
|
-
await tracerProvider.shutdown();
|
|
571
|
-
}
|
|
572
|
-
// Always shutdown the Langfuse processor
|
|
573
|
-
if (langfuseProcessor) {
|
|
574
|
-
await langfuseProcessor.shutdown();
|
|
575
|
-
}
|
|
576
|
-
// Shutdown cached ContextEnricher
|
|
577
|
-
if (cachedContextEnricher) {
|
|
578
|
-
await cachedContextEnricher.shutdown();
|
|
579
|
-
}
|
|
580
|
-
tracerProvider = null;
|
|
581
|
-
langfuseProcessor = null;
|
|
582
|
-
cachedContextEnricher = null;
|
|
583
|
-
isInitialized = false;
|
|
584
|
-
isCredentialsValid = false;
|
|
585
|
-
usingExternalProvider = false;
|
|
586
|
-
logger.debug(`${LOG_PREFIX} Shutdown complete`);
|
|
587
|
-
}
|
|
588
|
-
catch (error) {
|
|
589
|
-
logger.error(`${LOG_PREFIX} Shutdown failed`, {
|
|
590
|
-
error: error instanceof Error ? error.message : String(error),
|
|
591
|
-
});
|
|
592
|
-
}
|
|
593
|
-
}
|
|
594
|
-
/**
|
|
595
|
-
* Get the Langfuse span processor
|
|
596
|
-
*/
|
|
597
|
-
export function getLangfuseSpanProcessor() {
|
|
598
|
-
return langfuseProcessor;
|
|
599
|
-
}
|
|
600
|
-
/**
|
|
601
|
-
* Get the tracer provider
|
|
602
|
-
*/
|
|
603
|
-
export function getTracerProvider() {
|
|
604
|
-
return tracerProvider;
|
|
605
|
-
}
|
|
606
|
-
/**
|
|
607
|
-
* Check if OpenTelemetry is initialized
|
|
608
|
-
*/
|
|
609
|
-
export function isOpenTelemetryInitialized() {
|
|
610
|
-
return isInitialized;
|
|
611
|
-
}
|
|
612
|
-
/**
|
|
613
|
-
* Get health status for Langfuse observability
|
|
614
|
-
*
|
|
615
|
-
* @returns Health status object with initialization and configuration details
|
|
616
|
-
*/
|
|
617
|
-
export function getLangfuseHealthStatus() {
|
|
618
|
-
return {
|
|
619
|
-
isHealthy: !!(currentConfig?.enabled &&
|
|
620
|
-
isInitialized &&
|
|
621
|
-
isCredentialsValid &&
|
|
622
|
-
langfuseProcessor !== null),
|
|
623
|
-
initialized: isInitialized,
|
|
624
|
-
credentialsValid: isCredentialsValid,
|
|
625
|
-
enabled: currentConfig?.enabled || false,
|
|
626
|
-
hasProcessor: langfuseProcessor !== null,
|
|
627
|
-
usingExternalProvider,
|
|
628
|
-
config: currentConfig
|
|
629
|
-
? {
|
|
630
|
-
baseUrl: currentConfig.baseUrl || "https://cloud.langfuse.com",
|
|
631
|
-
environment: currentConfig.environment || "dev",
|
|
632
|
-
release: currentConfig.release || "v1.0.0",
|
|
633
|
-
}
|
|
634
|
-
: undefined,
|
|
635
|
-
};
|
|
636
|
-
}
|
|
637
|
-
/**
|
|
638
|
-
* Set user and session context for Langfuse spans in the current async context
|
|
639
|
-
*
|
|
640
|
-
* Merges the provided context with existing AsyncLocalStorage context. If a callback is provided,
|
|
641
|
-
* the context is scoped to that callback execution and returns the callback's result.
|
|
642
|
-
* Without a callback, the context applies to the current execution context and its children.
|
|
643
|
-
*
|
|
644
|
-
* Uses AsyncLocalStorage to properly scope context per request, avoiding race conditions
|
|
645
|
-
* in concurrent scenarios.
|
|
646
|
-
*
|
|
647
|
-
* @param context - Object containing context fields to merge with existing context
|
|
648
|
-
* @param callback - Optional callback to run within the context scope. If omitted, context applies to current execution
|
|
649
|
-
* @returns The callback's return value if provided, otherwise void
|
|
650
|
-
*
|
|
651
|
-
* @example
|
|
652
|
-
* // With callback - returns the result
|
|
653
|
-
* const result = await setLangfuseContext({ userId: "user123" }, async () => {
|
|
654
|
-
* return await generateText({ model: "gpt-4", prompt: "Hello" });
|
|
655
|
-
* });
|
|
656
|
-
*
|
|
657
|
-
* @example
|
|
658
|
-
* // Without callback - sets context for current execution
|
|
659
|
-
* await setLangfuseContext({ sessionId: "session456", traceName: "chat-completion" });
|
|
660
|
-
*/
|
|
661
|
-
export async function setLangfuseContext(context, callback) {
|
|
662
|
-
const currentContext = contextStorage.getStore() || {};
|
|
663
|
-
const newContext = {
|
|
664
|
-
userId: context.userId !== undefined ? context.userId : currentContext.userId,
|
|
665
|
-
sessionId: context.sessionId !== undefined
|
|
666
|
-
? context.sessionId
|
|
667
|
-
: currentContext.sessionId,
|
|
668
|
-
conversationId: context.conversationId !== undefined
|
|
669
|
-
? context.conversationId
|
|
670
|
-
: currentContext.conversationId,
|
|
671
|
-
requestId: context.requestId !== undefined
|
|
672
|
-
? context.requestId
|
|
673
|
-
: currentContext.requestId,
|
|
674
|
-
traceName: context.traceName !== undefined
|
|
675
|
-
? context.traceName
|
|
676
|
-
: currentContext.traceName,
|
|
677
|
-
metadata: context.metadata !== undefined
|
|
678
|
-
? context.metadata
|
|
679
|
-
: currentContext.metadata,
|
|
680
|
-
// Operation name support
|
|
681
|
-
operationName: context.operationName !== undefined
|
|
682
|
-
? context.operationName
|
|
683
|
-
: currentContext.operationName,
|
|
684
|
-
autoDetectOperationName: context.autoDetectOperationName !== undefined
|
|
685
|
-
? context.autoDetectOperationName
|
|
686
|
-
: currentContext.autoDetectOperationName,
|
|
687
|
-
// Custom attributes support
|
|
688
|
-
customAttributes: context.customAttributes !== undefined
|
|
689
|
-
? context.customAttributes
|
|
690
|
-
: currentContext.customAttributes,
|
|
691
|
-
};
|
|
692
|
-
if (callback) {
|
|
693
|
-
return await contextStorage.run(newContext, callback);
|
|
694
|
-
}
|
|
695
|
-
else {
|
|
696
|
-
contextStorage.enterWith(newContext);
|
|
697
|
-
}
|
|
698
|
-
}
|
|
699
|
-
/**
|
|
700
|
-
* Get the current Langfuse context from AsyncLocalStorage
|
|
701
|
-
*
|
|
702
|
-
* Returns the current context including userId, sessionId, conversationId,
|
|
703
|
-
* requestId, traceName, and metadata. Returns undefined if no context is set.
|
|
704
|
-
*
|
|
705
|
-
* @returns The current LangfuseContext or undefined
|
|
706
|
-
*
|
|
707
|
-
* @example
|
|
708
|
-
* const context = getLangfuseContext();
|
|
709
|
-
* console.log(context?.userId, context?.sessionId);
|
|
710
|
-
*/
|
|
711
|
-
export function getLangfuseContext() {
|
|
712
|
-
return contextStorage.getStore();
|
|
713
|
-
}
|
|
714
|
-
/**
|
|
715
|
-
* Capture the current Langfuse AsyncLocalStorage context and return a wrapper
|
|
716
|
-
* that re-enters that context when executing the provided callback.
|
|
717
|
-
*
|
|
718
|
-
* This is essential for preserving trace context across async boundaries that
|
|
719
|
-
* break the automatic ALS propagation chain, such as `setImmediate()`,
|
|
720
|
-
* `setTimeout()`, or event-emitter callbacks. Without this, spans created
|
|
721
|
-
* inside those callbacks become orphaned traces in Langfuse.
|
|
722
|
-
*
|
|
723
|
-
* **How it works:**
|
|
724
|
-
* 1. Captures the current ALS store at call time (synchronously).
|
|
725
|
-
* 2. Returns an async function that, when invoked, re-enters the captured
|
|
726
|
-
* context via `contextStorage.run()` before executing the callback.
|
|
727
|
-
* 3. If no context exists at capture time, the callback runs without
|
|
728
|
-
* ALS wrapping (no-op passthrough).
|
|
729
|
-
*
|
|
730
|
-
* @param fn - The async function to execute within the captured context
|
|
731
|
-
* @returns A new async function that preserves the Langfuse ALS context
|
|
732
|
-
*
|
|
733
|
-
* @example
|
|
734
|
-
* // Before (broken — setImmediate loses ALS context):
|
|
735
|
-
* setImmediate(async () => {
|
|
736
|
-
* await this.checkAndSummarize(session, threshold);
|
|
737
|
-
* });
|
|
738
|
-
*
|
|
739
|
-
* // After (fixed — context is captured and re-entered):
|
|
740
|
-
* const wrappedFn = runWithCurrentLangfuseContext(async () => {
|
|
741
|
-
* await this.checkAndSummarize(session, threshold);
|
|
742
|
-
* });
|
|
743
|
-
* setImmediate(wrappedFn);
|
|
744
|
-
*/
|
|
745
|
-
export function runWithCurrentLangfuseContext(fn) {
|
|
746
|
-
const capturedContext = contextStorage.getStore();
|
|
747
|
-
if (capturedContext) {
|
|
748
|
-
return () => contextStorage.run(capturedContext, fn);
|
|
749
|
-
}
|
|
750
|
-
// No context to preserve — return the function as-is
|
|
751
|
-
return fn;
|
|
752
|
-
}
|
|
753
|
-
/**
|
|
754
|
-
* Get an OpenTelemetry Tracer for creating custom spans
|
|
755
|
-
*
|
|
756
|
-
* This allows applications to create their own spans that will be
|
|
757
|
-
* processed by the same span processors (ContextEnricher + LangfuseSpanProcessor).
|
|
758
|
-
*
|
|
759
|
-
* @param name - Tracer name, defaults to "neurolink"
|
|
760
|
-
* @param version - Tracer version, optional
|
|
761
|
-
* @returns OpenTelemetry Tracer instance
|
|
762
|
-
*
|
|
763
|
-
* @example
|
|
764
|
-
* const tracer = getTracer("my-app");
|
|
765
|
-
* const span = tracer.startSpan("custom-operation");
|
|
766
|
-
* try {
|
|
767
|
-
* // ... do work
|
|
768
|
-
* } finally {
|
|
769
|
-
* span.end();
|
|
770
|
-
* }
|
|
771
|
-
*/
|
|
772
|
-
export function getTracer(name = "neurolink", version) {
|
|
773
|
-
return trace.getTracer(name, version);
|
|
774
|
-
}
|
|
775
|
-
/**
|
|
776
|
-
* Create a new ContextEnricher span processor
|
|
777
|
-
* Use this when useExternalTracerProvider is true to add to your own TracerProvider
|
|
778
|
-
*
|
|
779
|
-
* @returns A new ContextEnricher instance
|
|
780
|
-
*/
|
|
781
|
-
export function createContextEnricher() {
|
|
782
|
-
return new ContextEnricher();
|
|
783
|
-
}
|
|
784
|
-
/**
|
|
785
|
-
* Get all span processors that NeuroLink would use
|
|
786
|
-
* Convenience function that returns [ContextEnricher, LangfuseSpanProcessor]
|
|
787
|
-
*
|
|
788
|
-
* @returns Array of span processors, or empty array if not initialized
|
|
789
|
-
*/
|
|
790
|
-
export function getSpanProcessors() {
|
|
791
|
-
if (!isInitialized || !langfuseProcessor) {
|
|
792
|
-
logger.warn(`${LOG_PREFIX} getSpanProcessors called but not initialized`);
|
|
793
|
-
return [];
|
|
794
|
-
}
|
|
795
|
-
// Reuse cached ContextEnricher to avoid creating multiple instances
|
|
796
|
-
if (!cachedContextEnricher) {
|
|
797
|
-
cachedContextEnricher = new ContextEnricher();
|
|
798
|
-
}
|
|
799
|
-
return [cachedContextEnricher, langfuseProcessor];
|
|
800
|
-
}
|
|
801
|
-
/**
|
|
802
|
-
* Check if using external TracerProvider mode
|
|
803
|
-
*
|
|
804
|
-
* @returns true if operating in external TracerProvider mode
|
|
805
|
-
*/
|
|
806
|
-
export function isUsingExternalTracerProvider() {
|
|
807
|
-
return usingExternalProvider;
|
|
808
|
-
}
|