@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,19 +0,0 @@
|
|
|
1
|
-
import { Hippocampus, } from "@juspay/hippocampus";
|
|
2
|
-
import { logger } from "../utils/logger.js";
|
|
3
|
-
export function initializeHippocampus(config) {
|
|
4
|
-
try {
|
|
5
|
-
const instance = new Hippocampus(config);
|
|
6
|
-
logger.info("[memoryInitializer] Memory initialized successfully", {
|
|
7
|
-
storageType: config.storage?.type || "sqlite",
|
|
8
|
-
maxWords: config.maxWords || 50,
|
|
9
|
-
hasCustomPrompt: !!config.prompt,
|
|
10
|
-
});
|
|
11
|
-
return instance;
|
|
12
|
-
}
|
|
13
|
-
catch (error) {
|
|
14
|
-
logger.warn("[memoryInitializer] Failed to initialize memory; disabling", {
|
|
15
|
-
error: error instanceof Error ? error.message : String(error),
|
|
16
|
-
});
|
|
17
|
-
return null;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Memory retrieval tools for LLM access to conversation history.
|
|
3
|
-
* Enables the AI to retrieve full tool outputs, review previous messages,
|
|
4
|
-
* and search conversation memory.
|
|
5
|
-
*
|
|
6
|
-
* Follows the createFileTools() factory pattern from files/fileTools.ts.
|
|
7
|
-
* @module
|
|
8
|
-
*/
|
|
9
|
-
import { tool } from "ai";
|
|
10
|
-
import { z } from "zod";
|
|
11
|
-
import { logger } from "../utils/logger.js";
|
|
12
|
-
import { SpanSerializer, SpanType, SpanStatus, } from "../observability/index.js";
|
|
13
|
-
import { getMetricsAggregator } from "../observability/index.js";
|
|
14
|
-
/** Maximum characters returned per retrieval request */
|
|
15
|
-
const DEFAULT_RETRIEVAL_LIMIT = 50_000;
|
|
16
|
-
/** Hard maximum for user/LLM-supplied limit to prevent massive tool outputs */
|
|
17
|
-
const MAX_RETRIEVAL_LIMIT = 200_000;
|
|
18
|
-
/** Maximum number of search matches returned */
|
|
19
|
-
const MAX_SEARCH_MATCHES = 50;
|
|
20
|
-
/**
|
|
21
|
-
* Factory function that creates memory retrieval tools bound to a memory manager.
|
|
22
|
-
* @param memoryManager - The Redis conversation memory manager instance
|
|
23
|
-
* @returns Record of tool name to Vercel AI SDK tool definition
|
|
24
|
-
*/
|
|
25
|
-
export function createMemoryRetrievalTools(memoryManager) {
|
|
26
|
-
return {
|
|
27
|
-
retrieve_context: tool({
|
|
28
|
-
description: "Retrieve messages from conversation memory. Use this to access full tool " +
|
|
29
|
-
"outputs when a result was truncated, review previous assistant responses, " +
|
|
30
|
-
"or search through conversation history. Supports filtering by role, " +
|
|
31
|
-
"pagination for large content, and regex search within messages.",
|
|
32
|
-
inputSchema: z.object({
|
|
33
|
-
sessionId: z.string().describe("Session ID for the conversation"),
|
|
34
|
-
messageId: z
|
|
35
|
-
.string()
|
|
36
|
-
.optional()
|
|
37
|
-
.describe("Specific message ID to retrieve"),
|
|
38
|
-
role: z
|
|
39
|
-
.enum(["user", "assistant", "system", "tool_call", "tool_result"])
|
|
40
|
-
.optional()
|
|
41
|
-
.describe("Filter messages by role"),
|
|
42
|
-
lastN: z
|
|
43
|
-
.number()
|
|
44
|
-
.int()
|
|
45
|
-
.positive()
|
|
46
|
-
.optional()
|
|
47
|
-
.describe("Retrieve the last N messages matching the filter"),
|
|
48
|
-
offset: z
|
|
49
|
-
.number()
|
|
50
|
-
.int()
|
|
51
|
-
.nonnegative()
|
|
52
|
-
.optional()
|
|
53
|
-
.describe("Character offset for paginated reading of large content (default: 0)"),
|
|
54
|
-
limit: z
|
|
55
|
-
.number()
|
|
56
|
-
.int()
|
|
57
|
-
.positive()
|
|
58
|
-
.optional()
|
|
59
|
-
.describe("Max characters to return per message (default: 50000)"),
|
|
60
|
-
search: z
|
|
61
|
-
.string()
|
|
62
|
-
.optional()
|
|
63
|
-
.describe("Regex pattern to search within message content. " +
|
|
64
|
-
"Returns matching lines with line numbers."),
|
|
65
|
-
}),
|
|
66
|
-
execute: async (args) => {
|
|
67
|
-
const span = SpanSerializer.createSpan(SpanType.MEMORY, "memory.retrieve", {
|
|
68
|
-
"memory.operation": "retrieve",
|
|
69
|
-
"memory.store": "redis",
|
|
70
|
-
"memory.query": args.search || args.messageId || `lastN:${args.lastN ?? "all"}`,
|
|
71
|
-
});
|
|
72
|
-
const startTime = Date.now();
|
|
73
|
-
try {
|
|
74
|
-
const conversation = await memoryManager.getSessionRaw(args.sessionId);
|
|
75
|
-
if (!conversation) {
|
|
76
|
-
span.durationMs = Date.now() - startTime;
|
|
77
|
-
const endedSpan = SpanSerializer.endSpan(span, SpanStatus.OK);
|
|
78
|
-
getMetricsAggregator().recordSpan(endedSpan);
|
|
79
|
-
return { error: "Session not found", sessionId: args.sessionId };
|
|
80
|
-
}
|
|
81
|
-
let messages = conversation.messages;
|
|
82
|
-
// Filter by specific messageId
|
|
83
|
-
if (args.messageId) {
|
|
84
|
-
const msg = messages.find((m) => m.id === args.messageId);
|
|
85
|
-
if (!msg) {
|
|
86
|
-
span.durationMs = Date.now() - startTime;
|
|
87
|
-
const endedSpan = SpanSerializer.endSpan(span, SpanStatus.OK);
|
|
88
|
-
getMetricsAggregator().recordSpan(endedSpan);
|
|
89
|
-
return { error: "Message not found", messageId: args.messageId };
|
|
90
|
-
}
|
|
91
|
-
messages = [msg];
|
|
92
|
-
}
|
|
93
|
-
// Filter by role
|
|
94
|
-
if (args.role) {
|
|
95
|
-
messages = messages.filter((m) => m.role === args.role);
|
|
96
|
-
}
|
|
97
|
-
// Take last N
|
|
98
|
-
if (args.lastN) {
|
|
99
|
-
messages = messages.slice(-args.lastN);
|
|
100
|
-
}
|
|
101
|
-
const charLimit = Math.min(args.limit ?? DEFAULT_RETRIEVAL_LIMIT, MAX_RETRIEVAL_LIMIT);
|
|
102
|
-
const results = messages.map((msg) => {
|
|
103
|
-
const content = msg.content ?? "";
|
|
104
|
-
// Search mode: return matching lines with line numbers
|
|
105
|
-
if (args.search) {
|
|
106
|
-
try {
|
|
107
|
-
const pattern = args.search;
|
|
108
|
-
// Validate regex length to mitigate ReDoS from LLM-provided input
|
|
109
|
-
if (pattern.length > 200) {
|
|
110
|
-
return {
|
|
111
|
-
id: msg.id,
|
|
112
|
-
error: "Search pattern too long (max 200 chars)",
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
const regex = new RegExp(pattern, "i"); // no 'g' flag — avoids stateful .test() bug
|
|
116
|
-
const lines = content.split("\n");
|
|
117
|
-
const matches = lines
|
|
118
|
-
.map((line, i) => ({ line: i + 1, text: line }))
|
|
119
|
-
.filter((l) => regex.test(l.text))
|
|
120
|
-
.slice(0, MAX_SEARCH_MATCHES);
|
|
121
|
-
return {
|
|
122
|
-
id: msg.id,
|
|
123
|
-
role: msg.role,
|
|
124
|
-
tool: msg.tool,
|
|
125
|
-
matchCount: matches.length,
|
|
126
|
-
matches,
|
|
127
|
-
totalSize: content.length,
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
catch {
|
|
131
|
-
return { id: msg.id, error: "Invalid regex pattern" };
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
// Paginated read mode
|
|
135
|
-
const start = args.offset ?? 0;
|
|
136
|
-
const end = start + charLimit;
|
|
137
|
-
const slice = content.slice(start, end);
|
|
138
|
-
return {
|
|
139
|
-
id: msg.id,
|
|
140
|
-
role: msg.role,
|
|
141
|
-
tool: msg.tool,
|
|
142
|
-
content: slice,
|
|
143
|
-
totalSize: content.length,
|
|
144
|
-
hasMore: end < content.length,
|
|
145
|
-
};
|
|
146
|
-
});
|
|
147
|
-
span.durationMs = Date.now() - startTime;
|
|
148
|
-
const endedSpan = SpanSerializer.endSpan(span, SpanStatus.OK);
|
|
149
|
-
getMetricsAggregator().recordSpan(endedSpan);
|
|
150
|
-
return { messages: results, totalMessages: results.length };
|
|
151
|
-
}
|
|
152
|
-
catch (error) {
|
|
153
|
-
span.durationMs = Date.now() - startTime;
|
|
154
|
-
const endedSpan = SpanSerializer.endSpan(span, SpanStatus.ERROR);
|
|
155
|
-
endedSpan.statusMessage =
|
|
156
|
-
error instanceof Error ? error.message : String(error);
|
|
157
|
-
getMetricsAggregator().recordSpan(endedSpan);
|
|
158
|
-
logger.error("[MemoryRetrievalTools] Error retrieving context", {
|
|
159
|
-
error: error instanceof Error ? error.message : String(error),
|
|
160
|
-
});
|
|
161
|
-
return { error: "Failed to retrieve context" };
|
|
162
|
-
}
|
|
163
|
-
},
|
|
164
|
-
}),
|
|
165
|
-
};
|
|
166
|
-
}
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import { logger } from "../../utils/logger.js";
|
|
2
|
-
/**
|
|
3
|
-
* Create analytics middleware for tracking AI model usage
|
|
4
|
-
* Collects metrics on token usage, response times, and model performance
|
|
5
|
-
*/
|
|
6
|
-
export function createAnalyticsMiddleware() {
|
|
7
|
-
const requestMetrics = new Map();
|
|
8
|
-
const metadata = {
|
|
9
|
-
id: "analytics",
|
|
10
|
-
name: "Analytics Tracking",
|
|
11
|
-
description: "Tracks token usage, response times, and model performance metrics",
|
|
12
|
-
priority: 100, // High priority to ensure analytics are captured
|
|
13
|
-
defaultEnabled: true,
|
|
14
|
-
};
|
|
15
|
-
const middleware = {
|
|
16
|
-
specificationVersion: "v3",
|
|
17
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
18
|
-
wrapGenerate: async ({ doGenerate, params }) => {
|
|
19
|
-
const requestId = `analytics-${Date.now()}`;
|
|
20
|
-
const startTime = Date.now();
|
|
21
|
-
logger.debug(`[AnalyticsMiddleware] Starting request tracking`, {
|
|
22
|
-
requestId,
|
|
23
|
-
hasPrompt: !!params.prompt,
|
|
24
|
-
});
|
|
25
|
-
try {
|
|
26
|
-
// Execute the generation
|
|
27
|
-
const result = await doGenerate();
|
|
28
|
-
// Calculate metrics
|
|
29
|
-
const responseTime = Date.now() - startTime;
|
|
30
|
-
const analytics = {
|
|
31
|
-
requestId,
|
|
32
|
-
responseTime,
|
|
33
|
-
timestamp: new Date().toISOString(),
|
|
34
|
-
usage: {
|
|
35
|
-
input: result.usage?.promptTokens ?? 0,
|
|
36
|
-
output: result.usage?.completionTokens ?? 0,
|
|
37
|
-
total: (result.usage?.promptTokens ?? 0) +
|
|
38
|
-
(result.usage?.completionTokens ?? 0),
|
|
39
|
-
},
|
|
40
|
-
};
|
|
41
|
-
// Store metrics for potential retrieval
|
|
42
|
-
requestMetrics.set(requestId, analytics);
|
|
43
|
-
logger.debug(`[AnalyticsMiddleware] Request completed`, analytics);
|
|
44
|
-
// Add analytics to the result
|
|
45
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
46
|
-
const updatedResult = { ...result };
|
|
47
|
-
if (!updatedResult.experimental_providerMetadata) {
|
|
48
|
-
updatedResult.experimental_providerMetadata = {};
|
|
49
|
-
}
|
|
50
|
-
if (!updatedResult.experimental_providerMetadata.neurolink) {
|
|
51
|
-
updatedResult.experimental_providerMetadata.neurolink = {};
|
|
52
|
-
}
|
|
53
|
-
updatedResult.experimental_providerMetadata.neurolink.analytics =
|
|
54
|
-
analytics;
|
|
55
|
-
return updatedResult;
|
|
56
|
-
}
|
|
57
|
-
catch (error) {
|
|
58
|
-
const responseTime = Date.now() - startTime;
|
|
59
|
-
logger.error(`[AnalyticsMiddleware] Request failed`, {
|
|
60
|
-
requestId,
|
|
61
|
-
responseTime,
|
|
62
|
-
error: error instanceof Error ? error.message : String(error),
|
|
63
|
-
});
|
|
64
|
-
throw error;
|
|
65
|
-
}
|
|
66
|
-
},
|
|
67
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
68
|
-
wrapStream: async ({ doStream, params }) => {
|
|
69
|
-
const requestId = `analytics-stream-${Date.now()}`;
|
|
70
|
-
const startTime = Date.now();
|
|
71
|
-
logger.debug(`[AnalyticsMiddleware] Starting stream tracking`, {
|
|
72
|
-
requestId,
|
|
73
|
-
hasPrompt: !!params.prompt,
|
|
74
|
-
});
|
|
75
|
-
try {
|
|
76
|
-
const result = await doStream();
|
|
77
|
-
const streamAnalytics = {
|
|
78
|
-
requestId,
|
|
79
|
-
startTime,
|
|
80
|
-
timestamp: new Date().toISOString(),
|
|
81
|
-
streamingMode: true,
|
|
82
|
-
};
|
|
83
|
-
requestMetrics.set(requestId, streamAnalytics);
|
|
84
|
-
// Ensure the result includes all required properties
|
|
85
|
-
const updatedResult = {
|
|
86
|
-
...result,
|
|
87
|
-
stream: result.stream || new ReadableStream(),
|
|
88
|
-
rawCall: result.rawCall || { rawPrompt: null, rawSettings: {} },
|
|
89
|
-
rawResponse: {
|
|
90
|
-
...(result.rawResponse || {}),
|
|
91
|
-
neurolink: {
|
|
92
|
-
...(result.rawResponse?.neurolink ?? {}),
|
|
93
|
-
analytics: streamAnalytics,
|
|
94
|
-
},
|
|
95
|
-
},
|
|
96
|
-
};
|
|
97
|
-
return updatedResult;
|
|
98
|
-
}
|
|
99
|
-
catch (error) {
|
|
100
|
-
const responseTime = Date.now() - startTime;
|
|
101
|
-
logger.error(`[AnalyticsMiddleware] Stream failed`, {
|
|
102
|
-
requestId,
|
|
103
|
-
responseTime,
|
|
104
|
-
error: error instanceof Error ? error.message : String(error),
|
|
105
|
-
});
|
|
106
|
-
throw error;
|
|
107
|
-
}
|
|
108
|
-
},
|
|
109
|
-
};
|
|
110
|
-
// Return the NeuroLinkMiddleware with metadata
|
|
111
|
-
return {
|
|
112
|
-
...middleware,
|
|
113
|
-
metadata,
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Get collected metrics from analytics middleware
|
|
118
|
-
* Note: This is a utility function for accessing metrics
|
|
119
|
-
*/
|
|
120
|
-
export function getAnalyticsMetrics() {
|
|
121
|
-
// This would need to be implemented with a global registry
|
|
122
|
-
// For now, return empty map
|
|
123
|
-
return new Map();
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Clear collected metrics from analytics middleware
|
|
127
|
-
* Note: This is a utility function for clearing metrics
|
|
128
|
-
*/
|
|
129
|
-
export function clearAnalyticsMetrics() {
|
|
130
|
-
// This would need to be implemented with a global registry
|
|
131
|
-
// For now, do nothing
|
|
132
|
-
}
|
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file Implements the Auto-Evaluation Middleware for ensuring response quality.
|
|
3
|
-
*/
|
|
4
|
-
import { Evaluator } from "../../evaluation/index.js";
|
|
5
|
-
import { logger } from "../../utils/logger.js";
|
|
6
|
-
/**
|
|
7
|
-
* Creates the Auto-Evaluation middleware, which intercepts generation requests
|
|
8
|
-
* to evaluate the quality of the response. If the response quality is below a
|
|
9
|
-
* configured threshold, it can trigger retries with feedback.
|
|
10
|
-
*
|
|
11
|
-
* @param config - Configuration for the auto-evaluation middleware.
|
|
12
|
-
* @returns A `NeuroLinkMiddleware` object.
|
|
13
|
-
*/
|
|
14
|
-
export function createAutoEvaluationMiddleware(config = {}) {
|
|
15
|
-
const metadata = {
|
|
16
|
-
id: "autoEvaluation",
|
|
17
|
-
name: "Auto Evaluation",
|
|
18
|
-
description: "Automatically evaluates response quality and retries if needed.",
|
|
19
|
-
priority: 90,
|
|
20
|
-
defaultEnabled: false, // Should be explicitly enabled
|
|
21
|
-
};
|
|
22
|
-
logger.debug("Auto-Evaluation Middleware Config:", config);
|
|
23
|
-
const middleware = {
|
|
24
|
-
specificationVersion: "v3",
|
|
25
|
-
wrapGenerate: async ({ doGenerate, params }) => {
|
|
26
|
-
const options = params;
|
|
27
|
-
const rawResult = await doGenerate();
|
|
28
|
-
const rawReasoning = rawResult.reasoning;
|
|
29
|
-
const textParts = rawResult.content
|
|
30
|
-
.filter((c) => c.type === "text")
|
|
31
|
-
.map((c) => c.text);
|
|
32
|
-
const toolCallParts = rawResult.content.filter((c) => c.type === "tool-call");
|
|
33
|
-
const inputTokens = rawResult.usage.inputTokens.total ?? 0;
|
|
34
|
-
const outputTokens = rawResult.usage.outputTokens.total ?? 0;
|
|
35
|
-
const result = {
|
|
36
|
-
content: textParts.join(""),
|
|
37
|
-
finishReason: rawResult.finishReason.unified,
|
|
38
|
-
reasoning: typeof rawReasoning === "string"
|
|
39
|
-
? rawReasoning
|
|
40
|
-
: Array.isArray(rawReasoning)
|
|
41
|
-
? rawReasoning
|
|
42
|
-
.map((r) => typeof r === "string"
|
|
43
|
-
? r
|
|
44
|
-
: (r?.text ?? JSON.stringify(r)))
|
|
45
|
-
.join("\n")
|
|
46
|
-
: undefined,
|
|
47
|
-
usage: {
|
|
48
|
-
input: inputTokens,
|
|
49
|
-
output: outputTokens,
|
|
50
|
-
total: inputTokens + outputTokens,
|
|
51
|
-
},
|
|
52
|
-
toolCalls: toolCallParts.length > 0
|
|
53
|
-
? toolCallParts.map((tc) => {
|
|
54
|
-
let parsedArgs;
|
|
55
|
-
try {
|
|
56
|
-
parsedArgs = JSON.parse(tc.input);
|
|
57
|
-
}
|
|
58
|
-
catch (e) {
|
|
59
|
-
logger.warn(`Failed to parse tool call args for tool ${tc.toolName}:`, e);
|
|
60
|
-
parsedArgs = { raw: tc.input };
|
|
61
|
-
}
|
|
62
|
-
return {
|
|
63
|
-
toolCallId: tc.toolCallId,
|
|
64
|
-
toolName: tc.toolName,
|
|
65
|
-
args: parsedArgs,
|
|
66
|
-
};
|
|
67
|
-
})
|
|
68
|
-
: undefined,
|
|
69
|
-
};
|
|
70
|
-
const isBlocking = config.blocking !== false;
|
|
71
|
-
if (isBlocking) {
|
|
72
|
-
const evaluationResult = await performEvaluation(config, options, result);
|
|
73
|
-
return {
|
|
74
|
-
...rawResult,
|
|
75
|
-
evaluationResult,
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
performEvaluation(config, options, result).catch((err) => {
|
|
80
|
-
logger.error("Non-blocking auto-evaluation error:", err);
|
|
81
|
-
});
|
|
82
|
-
return rawResult;
|
|
83
|
-
}
|
|
84
|
-
},
|
|
85
|
-
wrapStream: async ({ doStream, params }) => {
|
|
86
|
-
const options = params;
|
|
87
|
-
const rawResult = await doStream();
|
|
88
|
-
const [streamForUser, streamForEvaluation] = rawResult.stream.tee();
|
|
89
|
-
// Non-blocking evaluation for streams
|
|
90
|
-
consumeAndEvaluateStream(config, options, streamForEvaluation).catch((err) => {
|
|
91
|
-
logger.error("Non-blocking stream auto-evaluation error:", err);
|
|
92
|
-
});
|
|
93
|
-
return {
|
|
94
|
-
...rawResult,
|
|
95
|
-
stream: streamForUser,
|
|
96
|
-
};
|
|
97
|
-
},
|
|
98
|
-
};
|
|
99
|
-
return {
|
|
100
|
-
...middleware,
|
|
101
|
-
metadata,
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* A common function to perform the evaluation logic.
|
|
106
|
-
* @param config The middleware configuration.
|
|
107
|
-
* @param options The text generation options.
|
|
108
|
-
* @param result The generation result.
|
|
109
|
-
*/
|
|
110
|
-
async function performEvaluation(config, options, result) {
|
|
111
|
-
const isBlocking = config.blocking !== false;
|
|
112
|
-
const threshold = config.threshold ??
|
|
113
|
-
(Number(process.env.NEUROLINK_EVALUATION_THRESHOLD) || 7);
|
|
114
|
-
try {
|
|
115
|
-
const evaluator = new Evaluator({
|
|
116
|
-
threshold,
|
|
117
|
-
provider: config.provider,
|
|
118
|
-
promptGenerator: config.promptGenerator,
|
|
119
|
-
evaluationModel: config.evaluationModel,
|
|
120
|
-
});
|
|
121
|
-
const evaluationResult = await evaluator.evaluate(options, result, threshold, config);
|
|
122
|
-
if (config.onEvaluationComplete) {
|
|
123
|
-
await config.onEvaluationComplete(evaluationResult);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
catch (error) {
|
|
127
|
-
logger.error("Error during auto-evaluation:", error);
|
|
128
|
-
if (isBlocking) {
|
|
129
|
-
throw error;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* Consumes a stream to build the full response and then evaluates it.
|
|
135
|
-
* @param config The middleware configuration.
|
|
136
|
-
* @param options The generation options.
|
|
137
|
-
* @param stream The stream to consume.
|
|
138
|
-
*/
|
|
139
|
-
async function consumeAndEvaluateStream(config, options, stream) {
|
|
140
|
-
let fullText = "";
|
|
141
|
-
let usage;
|
|
142
|
-
const toolCalls = [];
|
|
143
|
-
const reader = stream.getReader();
|
|
144
|
-
try {
|
|
145
|
-
while (true) {
|
|
146
|
-
const { done, value } = await reader.read();
|
|
147
|
-
if (done) {
|
|
148
|
-
break;
|
|
149
|
-
}
|
|
150
|
-
switch (value.type) {
|
|
151
|
-
case "text-delta":
|
|
152
|
-
fullText += value.delta;
|
|
153
|
-
break;
|
|
154
|
-
case "tool-call":
|
|
155
|
-
{
|
|
156
|
-
let parsedArgs;
|
|
157
|
-
try {
|
|
158
|
-
parsedArgs = JSON.parse(value.input);
|
|
159
|
-
}
|
|
160
|
-
catch (e) {
|
|
161
|
-
logger.warn(`Failed to parse tool call args for tool ${value.toolName}:`, e);
|
|
162
|
-
// In case of parsing failure, we can't assign a string.
|
|
163
|
-
// Let's use an object with the raw string to maintain type safety.
|
|
164
|
-
parsedArgs = { raw: value.input };
|
|
165
|
-
}
|
|
166
|
-
toolCalls.push({
|
|
167
|
-
toolCallId: value.toolCallId,
|
|
168
|
-
toolName: value.toolName,
|
|
169
|
-
args: parsedArgs,
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
break;
|
|
173
|
-
case "finish":
|
|
174
|
-
{
|
|
175
|
-
const finishInputTokens = value.usage.inputTokens.total ?? 0;
|
|
176
|
-
const finishOutputTokens = value.usage.outputTokens.total ?? 0;
|
|
177
|
-
usage = {
|
|
178
|
-
input: finishInputTokens,
|
|
179
|
-
output: finishOutputTokens,
|
|
180
|
-
total: finishInputTokens + finishOutputTokens,
|
|
181
|
-
};
|
|
182
|
-
}
|
|
183
|
-
break;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
finally {
|
|
188
|
-
reader.releaseLock();
|
|
189
|
-
}
|
|
190
|
-
const result = {
|
|
191
|
-
content: fullText,
|
|
192
|
-
usage,
|
|
193
|
-
toolCalls: toolCalls.length > 0 ? toolCalls : undefined,
|
|
194
|
-
};
|
|
195
|
-
// For streams, evaluation is always non-blocking from the user's perspective.
|
|
196
|
-
if (config.blocking) {
|
|
197
|
-
logger.warn("Auto-evaluation 'blocking' mode is not supported for streaming responses. Evaluation will proceed non-blockingly.");
|
|
198
|
-
}
|
|
199
|
-
// Create a new config object to force non-blocking behavior for the evaluation function
|
|
200
|
-
const nonBlockingConfig = { ...config, blocking: false };
|
|
201
|
-
await performEvaluation(nonBlockingConfig, options, result);
|
|
202
|
-
}
|
|
203
|
-
export default createAutoEvaluationMiddleware;
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
import { generateText } from "ai";
|
|
2
|
-
import { createBlockedResponse, createBlockedStream, applyContentFiltering, handlePrecallGuardrails, } from "../utils/guardrailsUtils.js";
|
|
3
|
-
import { logger } from "../../utils/logger.js";
|
|
4
|
-
/**
|
|
5
|
-
* Create Guardrails AI middleware for content filtering and policy enforcement
|
|
6
|
-
* @param config Configuration for the guardrails middleware
|
|
7
|
-
* @returns NeuroLink middleware instance
|
|
8
|
-
*/
|
|
9
|
-
export function createGuardrailsMiddleware(config = {}) {
|
|
10
|
-
const metadata = {
|
|
11
|
-
id: "guardrails",
|
|
12
|
-
name: "Guardrails AI",
|
|
13
|
-
description: "Provides comprehensive content filtering and policy enforcement using custom rules, AI models, and precall evaluation to filter inappropriate content before it reaches the LLM.",
|
|
14
|
-
priority: 90,
|
|
15
|
-
defaultEnabled: true,
|
|
16
|
-
};
|
|
17
|
-
// WeakMap to store blocking state from transformParams to wrap methods
|
|
18
|
-
const blockingState = new WeakMap();
|
|
19
|
-
const middleware = {
|
|
20
|
-
specificationVersion: "v3",
|
|
21
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
22
|
-
transformParams: async ({ params }) => {
|
|
23
|
-
if (config.precallEvaluation?.enabled) {
|
|
24
|
-
const { shouldBlock, transformedParams } = await handlePrecallGuardrails(params, config.precallEvaluation);
|
|
25
|
-
// Store the blocking state for use in wrap methods
|
|
26
|
-
blockingState.set(transformedParams, shouldBlock);
|
|
27
|
-
return transformedParams;
|
|
28
|
-
}
|
|
29
|
-
return params;
|
|
30
|
-
},
|
|
31
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
32
|
-
wrapGenerate: async ({ doGenerate, params }) => {
|
|
33
|
-
logger.debug(`[GuardrailsMiddleware] Applying to generate call.`);
|
|
34
|
-
// Check if this request should be blocked (set by transformParams)
|
|
35
|
-
if (config.precallEvaluation?.enabled && blockingState.get(params)) {
|
|
36
|
-
return createBlockedResponse();
|
|
37
|
-
}
|
|
38
|
-
let result = await doGenerate();
|
|
39
|
-
const filterResult = applyContentFiltering(result.text || "", config.badWords, "generate");
|
|
40
|
-
if (filterResult.hasChanges) {
|
|
41
|
-
result = { ...result, text: filterResult.filteredText };
|
|
42
|
-
}
|
|
43
|
-
if (config.modelFilter?.enabled && config.modelFilter.filterModel) {
|
|
44
|
-
logger.debug(`[GuardrailsMiddleware] Invoking model-based filter.`);
|
|
45
|
-
try {
|
|
46
|
-
const filterPrompt = `Is the following text safe? Respond with only "safe" or "unsafe".\n\nText: "${result.text}"`;
|
|
47
|
-
const { text: filterResponse } = await generateText({
|
|
48
|
-
model: config.modelFilter.filterModel,
|
|
49
|
-
prompt: filterPrompt,
|
|
50
|
-
});
|
|
51
|
-
if (filterResponse.toLowerCase().trim() === "unsafe") {
|
|
52
|
-
logger.warn(`[GuardrailsMiddleware] Model-based filter flagged content as unsafe.`);
|
|
53
|
-
result = { ...result, text: "<REDACTED BY AI GUARDRAIL>" };
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
catch (error) {
|
|
57
|
-
logger.error(`[GuardrailsMiddleware] Model-based filter failed.`, {
|
|
58
|
-
error,
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
return result;
|
|
63
|
-
},
|
|
64
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
65
|
-
wrapStream: async ({ doStream, params }) => {
|
|
66
|
-
logger.debug(`[GuardrailsMiddleware] Applying to stream call.`);
|
|
67
|
-
// Check if this request should be blocked (set by transformParams)
|
|
68
|
-
if (config.precallEvaluation?.enabled && blockingState.get(params)) {
|
|
69
|
-
return {
|
|
70
|
-
stream: createBlockedStream(),
|
|
71
|
-
rawCall: { rawPrompt: null, rawSettings: {} },
|
|
72
|
-
warnings: [],
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
const { stream, ...rest } = await doStream();
|
|
76
|
-
let hasYieldedChunks = false;
|
|
77
|
-
const transformStream = new TransformStream({
|
|
78
|
-
transform(chunk, controller) {
|
|
79
|
-
hasYieldedChunks = true;
|
|
80
|
-
let filteredChunk = chunk;
|
|
81
|
-
if (typeof filteredChunk === "object" &&
|
|
82
|
-
"textDelta" in filteredChunk) {
|
|
83
|
-
const filterResult = applyContentFiltering(filteredChunk.textDelta, config.badWords, "stream");
|
|
84
|
-
if (filterResult.hasChanges) {
|
|
85
|
-
filteredChunk = {
|
|
86
|
-
...filteredChunk,
|
|
87
|
-
textDelta: filterResult.filteredText,
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
controller.enqueue(filteredChunk);
|
|
92
|
-
},
|
|
93
|
-
flush() {
|
|
94
|
-
if (!hasYieldedChunks) {
|
|
95
|
-
logger.warn(`[GuardrailsMiddleware] Stream ended without yielding any chunks`);
|
|
96
|
-
}
|
|
97
|
-
},
|
|
98
|
-
});
|
|
99
|
-
return {
|
|
100
|
-
stream: stream.pipeThrough(transformStream),
|
|
101
|
-
...rest,
|
|
102
|
-
};
|
|
103
|
-
},
|
|
104
|
-
};
|
|
105
|
-
return {
|
|
106
|
-
...middleware,
|
|
107
|
-
metadata,
|
|
108
|
-
};
|
|
109
|
-
}
|