@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,295 +0,0 @@
|
|
|
1
|
-
import { logger } from "../utils/logger.js";
|
|
2
|
-
/**
|
|
3
|
-
* Manages the registration, configuration, and execution of middleware for a single factory instance.
|
|
4
|
-
*/
|
|
5
|
-
export class MiddlewareRegistry {
|
|
6
|
-
middleware = new Map();
|
|
7
|
-
globalConfigs = new Map();
|
|
8
|
-
executionStats = new Map();
|
|
9
|
-
/**
|
|
10
|
-
* Register a middleware
|
|
11
|
-
*/
|
|
12
|
-
register(middleware, options = {}) {
|
|
13
|
-
const { replace = false, defaultEnabled = false, globalConfig } = options;
|
|
14
|
-
logger.debug(`Registering middleware: ${middleware.metadata.id}`);
|
|
15
|
-
// Check if middleware already exists
|
|
16
|
-
if (this.middleware.has(middleware.metadata.id) && !replace) {
|
|
17
|
-
throw new Error(`Middleware with ID '${middleware.metadata.id}' already exists. Use replace: true to override.`);
|
|
18
|
-
}
|
|
19
|
-
// Set default enabled state
|
|
20
|
-
if (middleware.metadata.defaultEnabled === undefined) {
|
|
21
|
-
middleware.metadata.defaultEnabled = defaultEnabled;
|
|
22
|
-
}
|
|
23
|
-
// Store middleware
|
|
24
|
-
this.middleware.set(middleware.metadata.id, middleware);
|
|
25
|
-
// Store global configuration if provided
|
|
26
|
-
if (globalConfig) {
|
|
27
|
-
this.globalConfigs.set(middleware.metadata.id, globalConfig);
|
|
28
|
-
}
|
|
29
|
-
logger.debug(`Middleware registered: ${middleware.metadata.id}`, {
|
|
30
|
-
name: middleware.metadata.name,
|
|
31
|
-
priority: middleware.metadata.priority || 0,
|
|
32
|
-
defaultEnabled: middleware.metadata.defaultEnabled,
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Unregister a middleware
|
|
37
|
-
*/
|
|
38
|
-
unregister(middlewareId) {
|
|
39
|
-
const removed = this.middleware.delete(middlewareId);
|
|
40
|
-
this.globalConfigs.delete(middlewareId);
|
|
41
|
-
this.executionStats.delete(middlewareId);
|
|
42
|
-
if (removed) {
|
|
43
|
-
logger.debug(`Middleware unregistered: ${middlewareId}`);
|
|
44
|
-
}
|
|
45
|
-
return removed;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Get a registered middleware
|
|
49
|
-
*/
|
|
50
|
-
get(middlewareId) {
|
|
51
|
-
return this.middleware.get(middlewareId);
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* List all registered middleware
|
|
55
|
-
*/
|
|
56
|
-
list() {
|
|
57
|
-
return Array.from(this.middleware.values());
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Get middleware IDs sorted by priority
|
|
61
|
-
*/
|
|
62
|
-
getSortedIds() {
|
|
63
|
-
return Array.from(this.middleware.values())
|
|
64
|
-
.sort((a, b) => (b.metadata.priority || 0) - (a.metadata.priority || 0))
|
|
65
|
-
.map((m) => m.metadata.id);
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Build middleware chain based on configuration
|
|
69
|
-
*/
|
|
70
|
-
buildChain(context, config = {}) {
|
|
71
|
-
const chain = [];
|
|
72
|
-
const sortedIds = this.getSortedIds();
|
|
73
|
-
logger.debug("Building middleware chain", { config, sortedIds });
|
|
74
|
-
for (const middlewareId of sortedIds) {
|
|
75
|
-
const middleware = this.middleware.get(middlewareId);
|
|
76
|
-
logger.debug(`Evaluating middleware: ${middlewareId}`, { middleware });
|
|
77
|
-
if (!middleware) {
|
|
78
|
-
continue;
|
|
79
|
-
}
|
|
80
|
-
const middlewareConfig = config[middlewareId];
|
|
81
|
-
const globalConfig = this.globalConfigs.get(middlewareId);
|
|
82
|
-
// Determine if middleware should be applied
|
|
83
|
-
const shouldApply = this.shouldApplyMiddleware(middleware, middlewareConfig, context);
|
|
84
|
-
if (shouldApply) {
|
|
85
|
-
// Create configured middleware instance
|
|
86
|
-
const configuredMiddleware = this.configureMiddleware(middleware, middlewareConfig, globalConfig, context);
|
|
87
|
-
chain.push(configuredMiddleware);
|
|
88
|
-
logger.debug(`Added middleware to chain: ${middlewareId}`, {
|
|
89
|
-
priority: middleware.metadata.priority || 0,
|
|
90
|
-
chainLength: chain.length,
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
return chain;
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Determine if middleware should be applied based on conditions
|
|
98
|
-
*/
|
|
99
|
-
shouldApplyMiddleware(middleware, config, context) {
|
|
100
|
-
// Check if explicitly disabled
|
|
101
|
-
if (config?.enabled === false) {
|
|
102
|
-
return false;
|
|
103
|
-
}
|
|
104
|
-
// Check if explicitly enabled or default enabled
|
|
105
|
-
const isEnabled = config?.enabled === true ||
|
|
106
|
-
(config?.enabled === undefined && middleware.metadata.defaultEnabled);
|
|
107
|
-
if (!isEnabled) {
|
|
108
|
-
return false;
|
|
109
|
-
}
|
|
110
|
-
// Check conditions
|
|
111
|
-
const conditions = config?.conditions;
|
|
112
|
-
if (!conditions) {
|
|
113
|
-
return true;
|
|
114
|
-
}
|
|
115
|
-
// Check provider conditions
|
|
116
|
-
if (conditions.providers &&
|
|
117
|
-
!conditions.providers.includes(context.provider)) {
|
|
118
|
-
return false;
|
|
119
|
-
}
|
|
120
|
-
// Check model conditions
|
|
121
|
-
if (conditions.models && !conditions.models.includes(context.model)) {
|
|
122
|
-
return false;
|
|
123
|
-
}
|
|
124
|
-
// Check option conditions
|
|
125
|
-
if (conditions.options) {
|
|
126
|
-
for (const [key, value] of Object.entries(conditions.options)) {
|
|
127
|
-
if (context.options[key] !== value) {
|
|
128
|
-
return false;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
// Check custom condition
|
|
133
|
-
if (conditions.custom && !conditions.custom(context)) {
|
|
134
|
-
return false;
|
|
135
|
-
}
|
|
136
|
-
return true;
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Configure middleware with runtime configuration
|
|
140
|
-
*/
|
|
141
|
-
configureMiddleware(middleware, config, globalConfig, _context) {
|
|
142
|
-
// Merge configurations: global < middleware config < runtime config
|
|
143
|
-
const _mergedConfig = {
|
|
144
|
-
...globalConfig,
|
|
145
|
-
...config?.config,
|
|
146
|
-
};
|
|
147
|
-
// Create wrapper that tracks execution
|
|
148
|
-
const wrappedMiddleware = {
|
|
149
|
-
specificationVersion: "v3",
|
|
150
|
-
metadata: middleware.metadata,
|
|
151
|
-
};
|
|
152
|
-
if (middleware.transformParams) {
|
|
153
|
-
wrappedMiddleware.transformParams = async (args) => {
|
|
154
|
-
const startTime = Date.now();
|
|
155
|
-
try {
|
|
156
|
-
if (!middleware.transformParams) {
|
|
157
|
-
throw new Error("transformParams method is required");
|
|
158
|
-
}
|
|
159
|
-
const result = await middleware.transformParams(args);
|
|
160
|
-
this.recordExecution(middleware.metadata.id, startTime, true);
|
|
161
|
-
return result;
|
|
162
|
-
}
|
|
163
|
-
catch (error) {
|
|
164
|
-
this.recordExecution(middleware.metadata.id, startTime, false, error);
|
|
165
|
-
throw error;
|
|
166
|
-
}
|
|
167
|
-
};
|
|
168
|
-
}
|
|
169
|
-
if (middleware.wrapGenerate) {
|
|
170
|
-
wrappedMiddleware.wrapGenerate = async (args) => {
|
|
171
|
-
const startTime = Date.now();
|
|
172
|
-
try {
|
|
173
|
-
if (!middleware.wrapGenerate) {
|
|
174
|
-
throw new Error("wrapGenerate method is required");
|
|
175
|
-
}
|
|
176
|
-
const result = await middleware.wrapGenerate(args);
|
|
177
|
-
this.recordExecution(middleware.metadata.id, startTime, true);
|
|
178
|
-
return result;
|
|
179
|
-
}
|
|
180
|
-
catch (error) {
|
|
181
|
-
this.recordExecution(middleware.metadata.id, startTime, false, error);
|
|
182
|
-
throw error;
|
|
183
|
-
}
|
|
184
|
-
};
|
|
185
|
-
}
|
|
186
|
-
if (middleware.wrapStream) {
|
|
187
|
-
wrappedMiddleware.wrapStream = async (args) => {
|
|
188
|
-
const startTime = Date.now();
|
|
189
|
-
try {
|
|
190
|
-
if (!middleware.wrapStream) {
|
|
191
|
-
throw new Error("wrapStream method is required");
|
|
192
|
-
}
|
|
193
|
-
const result = await middleware.wrapStream(args);
|
|
194
|
-
this.recordExecution(middleware.metadata.id, startTime, true);
|
|
195
|
-
return result;
|
|
196
|
-
}
|
|
197
|
-
catch (error) {
|
|
198
|
-
this.recordExecution(middleware.metadata.id, startTime, false, error);
|
|
199
|
-
throw error;
|
|
200
|
-
}
|
|
201
|
-
};
|
|
202
|
-
}
|
|
203
|
-
return wrappedMiddleware;
|
|
204
|
-
}
|
|
205
|
-
/**
|
|
206
|
-
* Record middleware execution statistics
|
|
207
|
-
*/
|
|
208
|
-
recordExecution(middlewareId, startTime, success, error) {
|
|
209
|
-
const executionTime = Date.now() - startTime;
|
|
210
|
-
const result = {
|
|
211
|
-
applied: true,
|
|
212
|
-
executionTime,
|
|
213
|
-
error,
|
|
214
|
-
};
|
|
215
|
-
if (!this.executionStats.has(middlewareId)) {
|
|
216
|
-
this.executionStats.set(middlewareId, []);
|
|
217
|
-
}
|
|
218
|
-
const stats = this.executionStats.get(middlewareId) || [];
|
|
219
|
-
stats.push(result);
|
|
220
|
-
// Keep only last 100 executions per middleware
|
|
221
|
-
if (stats.length > 100) {
|
|
222
|
-
stats.shift();
|
|
223
|
-
}
|
|
224
|
-
if (error) {
|
|
225
|
-
logger.warn(`Middleware execution failed: ${middlewareId}`, {
|
|
226
|
-
executionTime,
|
|
227
|
-
error: error.message,
|
|
228
|
-
});
|
|
229
|
-
}
|
|
230
|
-
else {
|
|
231
|
-
logger.debug(`Middleware executed: ${middlewareId}`, {
|
|
232
|
-
executionTime,
|
|
233
|
-
success,
|
|
234
|
-
});
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
/**
|
|
238
|
-
* Get execution statistics for a middleware
|
|
239
|
-
*/
|
|
240
|
-
getExecutionStats(middlewareId) {
|
|
241
|
-
return this.executionStats.get(middlewareId) || [];
|
|
242
|
-
}
|
|
243
|
-
/**
|
|
244
|
-
* Get aggregated statistics for all middleware
|
|
245
|
-
*/
|
|
246
|
-
getAggregatedStats() {
|
|
247
|
-
const stats = {};
|
|
248
|
-
for (const [middlewareId, executions] of this.executionStats.entries()) {
|
|
249
|
-
const successful = executions.filter((e) => !e.error).length;
|
|
250
|
-
const failed = executions.filter((e) => e.error).length;
|
|
251
|
-
const totalTime = executions.reduce((sum, e) => sum + e.executionTime, 0);
|
|
252
|
-
const lastExecution = executions[executions.length - 1];
|
|
253
|
-
stats[middlewareId] = {
|
|
254
|
-
totalExecutions: executions.length,
|
|
255
|
-
successfulExecutions: successful,
|
|
256
|
-
failedExecutions: failed,
|
|
257
|
-
averageExecutionTime: executions.length > 0 ? totalTime / executions.length : 0,
|
|
258
|
-
lastExecutionTime: lastExecution?.executionTime || 0,
|
|
259
|
-
};
|
|
260
|
-
}
|
|
261
|
-
return stats;
|
|
262
|
-
}
|
|
263
|
-
/**
|
|
264
|
-
* Clear execution statistics
|
|
265
|
-
*/
|
|
266
|
-
clearStats(middlewareId) {
|
|
267
|
-
if (middlewareId) {
|
|
268
|
-
this.executionStats.delete(middlewareId);
|
|
269
|
-
}
|
|
270
|
-
else {
|
|
271
|
-
this.executionStats.clear();
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
/**
|
|
275
|
-
* Check if a middleware is registered
|
|
276
|
-
*/
|
|
277
|
-
has(middlewareId) {
|
|
278
|
-
return this.middleware.has(middlewareId);
|
|
279
|
-
}
|
|
280
|
-
/**
|
|
281
|
-
* Get the number of registered middleware
|
|
282
|
-
*/
|
|
283
|
-
size() {
|
|
284
|
-
return this.middleware.size;
|
|
285
|
-
}
|
|
286
|
-
/**
|
|
287
|
-
* Clear all registered middleware
|
|
288
|
-
*/
|
|
289
|
-
clear() {
|
|
290
|
-
this.middleware.clear();
|
|
291
|
-
this.globalConfigs.clear();
|
|
292
|
-
this.executionStats.clear();
|
|
293
|
-
logger.debug("All middleware cleared from registry");
|
|
294
|
-
}
|
|
295
|
-
}
|
|
@@ -1,396 +0,0 @@
|
|
|
1
|
-
import { AIProviderFactory } from "../../core/factory.js";
|
|
2
|
-
import { logger } from "../../utils/logger.js";
|
|
3
|
-
export const DEFAULT_EVALUATION_PROMPT = `
|
|
4
|
-
Evaluate the following user input for safety and appropriateness. Respond ONLY with valid JSON:
|
|
5
|
-
|
|
6
|
-
{
|
|
7
|
-
"overall": "safe|unsafe|suspicious|inappropriate",
|
|
8
|
-
"safetyScore": <1-10>,
|
|
9
|
-
"appropriatenessScore": <1-10>,
|
|
10
|
-
"confidenceLevel": <1-10>,
|
|
11
|
-
"issues": [
|
|
12
|
-
{
|
|
13
|
-
"category": "explicit_content|hate_speech|violence|personal_info|spam|other",
|
|
14
|
-
"severity": "low|medium|high|critical",
|
|
15
|
-
"description": "Brief description"
|
|
16
|
-
}
|
|
17
|
-
],
|
|
18
|
-
"suggestedAction": "allow|block|sanitize|warn",
|
|
19
|
-
"reasoning": "Brief explanation"
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
User Input: "{USER_INPUT}"
|
|
23
|
-
`;
|
|
24
|
-
/**
|
|
25
|
-
* Extract user input from middleware params
|
|
26
|
-
*/
|
|
27
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
28
|
-
export function extractUserInput(params) {
|
|
29
|
-
if (typeof params.prompt === "string") {
|
|
30
|
-
return params.prompt;
|
|
31
|
-
}
|
|
32
|
-
return (params.prompt
|
|
33
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
34
|
-
.map((msg) => {
|
|
35
|
-
if (msg.role === "user") {
|
|
36
|
-
if (typeof msg.content === "string") {
|
|
37
|
-
return msg.content;
|
|
38
|
-
}
|
|
39
|
-
else if (Array.isArray(msg.content)) {
|
|
40
|
-
return (msg.content
|
|
41
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
42
|
-
.filter((part) => part.type === "text")
|
|
43
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
44
|
-
.map((part) => part.text)
|
|
45
|
-
.join(" "));
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
return "";
|
|
49
|
-
})
|
|
50
|
-
.filter(Boolean)
|
|
51
|
-
.join("\n"));
|
|
52
|
-
}
|
|
53
|
-
export function parseEvaluationResponse(rawResponse) {
|
|
54
|
-
try {
|
|
55
|
-
const cleanedResponse = rawResponse.replace(/```json\n|```/g, "").trim();
|
|
56
|
-
const parsed = JSON.parse(cleanedResponse);
|
|
57
|
-
return {
|
|
58
|
-
overall: parsed.overall || "safe",
|
|
59
|
-
safetyScore: Number(parsed.safetyScore) || 10,
|
|
60
|
-
appropriatenessScore: Number(parsed.appropriatenessScore) || 10,
|
|
61
|
-
confidenceLevel: Number(parsed.confidenceLevel) || 10,
|
|
62
|
-
issues: parsed.issues || [],
|
|
63
|
-
suggestedAction: parsed.suggestedAction || "allow",
|
|
64
|
-
reasoning: parsed.reasoning || "No reasoning provided.",
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
catch (error) {
|
|
68
|
-
logger.error("[GuardrailsUtils] Failed to parse evaluation response:", error);
|
|
69
|
-
return {
|
|
70
|
-
overall: "safe",
|
|
71
|
-
safetyScore: 10,
|
|
72
|
-
appropriatenessScore: 10,
|
|
73
|
-
confidenceLevel: 1,
|
|
74
|
-
suggestedAction: "allow",
|
|
75
|
-
reasoning: "Error parsing evaluation response - allowing by default.",
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Handles the precall guardrails logic, including evaluation and sanitization.
|
|
81
|
-
* @param params - The language model call options.
|
|
82
|
-
* @param config - The precall evaluation configuration.
|
|
83
|
-
* @returns An object indicating if the request should be blocked and the (potentially transformed) params.
|
|
84
|
-
*/
|
|
85
|
-
export async function handlePrecallGuardrails(
|
|
86
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
87
|
-
params, config) {
|
|
88
|
-
const userInput = extractUserInput(params);
|
|
89
|
-
let transformedParams = params;
|
|
90
|
-
if (userInput.trim()) {
|
|
91
|
-
logger.debug(`[GuardrailsUtils] Performing precall evaluation on user input.`);
|
|
92
|
-
const evaluation = await performPrecallEvaluation(config, userInput);
|
|
93
|
-
const actionResult = applyEvaluationActions(evaluation, config, userInput);
|
|
94
|
-
if (actionResult.shouldBlock) {
|
|
95
|
-
logger.warn(`[GuardrailsUtils] Blocking request due to precall evaluation.`, {
|
|
96
|
-
evaluation,
|
|
97
|
-
userInput: userInput.substring(0, 100),
|
|
98
|
-
});
|
|
99
|
-
return { shouldBlock: true, transformedParams };
|
|
100
|
-
}
|
|
101
|
-
if (actionResult.sanitizedInput) {
|
|
102
|
-
logger.info(`[GuardrailsUtils] Applying input sanitization.`);
|
|
103
|
-
transformedParams = applySanitization(params, actionResult.sanitizedInput);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
logger.debug(`[GuardrailsUtils] Skipping precall evaluation - no user content to evaluate.`);
|
|
108
|
-
}
|
|
109
|
-
return { shouldBlock: false, transformedParams };
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Perform precall evaluation of user input using AI models
|
|
113
|
-
*/
|
|
114
|
-
export async function performPrecallEvaluation(config, userInput) {
|
|
115
|
-
try {
|
|
116
|
-
const provider = await AIProviderFactory.createProvider(config.provider || "google-ai", config.evaluationModel || "gemini-1.5-flash");
|
|
117
|
-
const evaluationPrompt = config.evaluationPrompt || DEFAULT_EVALUATION_PROMPT;
|
|
118
|
-
const prompt = evaluationPrompt.replace("{USER_INPUT}", userInput);
|
|
119
|
-
const result = await provider.generate({
|
|
120
|
-
input: { text: prompt },
|
|
121
|
-
});
|
|
122
|
-
if (!result || !result.content) {
|
|
123
|
-
throw new Error("Evaluation generation failed to return a result.");
|
|
124
|
-
}
|
|
125
|
-
return parseEvaluationResponse(result.content);
|
|
126
|
-
}
|
|
127
|
-
catch (error) {
|
|
128
|
-
logger.error("[GuardrailsUtils] Precall evaluation failed:", error);
|
|
129
|
-
return {
|
|
130
|
-
overall: "safe",
|
|
131
|
-
safetyScore: 10,
|
|
132
|
-
appropriatenessScore: 10,
|
|
133
|
-
confidenceLevel: 1,
|
|
134
|
-
suggestedAction: "allow",
|
|
135
|
-
reasoning: "Evaluation failed - allowing by default.",
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
export function applyEvaluationActions(evaluation, config, userInput) {
|
|
140
|
-
const actions = config.actions || {};
|
|
141
|
-
const thresholds = config.thresholds || {};
|
|
142
|
-
const safetyThreshold = thresholds.safetyScore || 7;
|
|
143
|
-
const appropriatenessThreshold = thresholds.appropriatenessScore || 6;
|
|
144
|
-
let actionToTake;
|
|
145
|
-
if (evaluation.overall === "unsafe" ||
|
|
146
|
-
evaluation.safetyScore < safetyThreshold) {
|
|
147
|
-
actionToTake = actions.onUnsafe || "block";
|
|
148
|
-
}
|
|
149
|
-
else if (evaluation.overall === "inappropriate" ||
|
|
150
|
-
evaluation.appropriatenessScore < appropriatenessThreshold) {
|
|
151
|
-
actionToTake = actions.onInappropriate || "warn";
|
|
152
|
-
}
|
|
153
|
-
else if (evaluation.overall === "suspicious") {
|
|
154
|
-
actionToTake = actions.onSuspicious || "log";
|
|
155
|
-
}
|
|
156
|
-
else {
|
|
157
|
-
actionToTake = "allow";
|
|
158
|
-
}
|
|
159
|
-
logger.info("[GuardrailsUtils] Precall evaluation result:", {
|
|
160
|
-
overall: evaluation.overall,
|
|
161
|
-
safetyScore: evaluation.safetyScore,
|
|
162
|
-
appropriatenessScore: evaluation.appropriatenessScore,
|
|
163
|
-
confidenceLevel: evaluation.confidenceLevel,
|
|
164
|
-
suggestedAction: evaluation.suggestedAction,
|
|
165
|
-
actionTaken: actionToTake,
|
|
166
|
-
reasoning: evaluation.reasoning,
|
|
167
|
-
issues: evaluation.issues,
|
|
168
|
-
});
|
|
169
|
-
switch (actionToTake) {
|
|
170
|
-
case "block":
|
|
171
|
-
return { shouldBlock: true };
|
|
172
|
-
case "sanitize": {
|
|
173
|
-
let sanitized = userInput;
|
|
174
|
-
const patterns = config.sanitizationPatterns || [];
|
|
175
|
-
const replacementText = config.replacementText || "[REDACTED]";
|
|
176
|
-
if (patterns.length > 0) {
|
|
177
|
-
logger.debug(`[GuardrailsUtils] Applying ${patterns.length} sanitization patterns with replacement: "${replacementText}".`);
|
|
178
|
-
patterns.forEach((pattern, index) => {
|
|
179
|
-
try {
|
|
180
|
-
const regex = new RegExp(pattern, "gi");
|
|
181
|
-
const before = sanitized;
|
|
182
|
-
let matchCount = 0;
|
|
183
|
-
sanitized = sanitized.replace(regex, () => {
|
|
184
|
-
matchCount++;
|
|
185
|
-
return replacementText;
|
|
186
|
-
});
|
|
187
|
-
if (before !== sanitized) {
|
|
188
|
-
logger.debug(`[GuardrailsUtils] Pattern ${index + 1} matched ${matchCount} times.`);
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
catch (error) {
|
|
192
|
-
logger.error(`[GuardrailsUtils] Invalid sanitization pattern "${pattern}":`, error);
|
|
193
|
-
}
|
|
194
|
-
});
|
|
195
|
-
if (sanitized !== userInput) {
|
|
196
|
-
logger.info(`[GuardrailsUtils] Input sanitized using ${patterns.length} patterns.`);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
else {
|
|
200
|
-
logger.warn("[GuardrailsUtils] Sanitize action triggered but no sanitizationPatterns provided in config. Input will not be modified.");
|
|
201
|
-
}
|
|
202
|
-
return { shouldBlock: false, sanitizedInput: sanitized };
|
|
203
|
-
}
|
|
204
|
-
case "warn": {
|
|
205
|
-
logger.warn("[GuardrailsUtils] Potentially inappropriate content detected but allowing:", {
|
|
206
|
-
userInput: userInput.substring(0, 100),
|
|
207
|
-
evaluation,
|
|
208
|
-
});
|
|
209
|
-
return { shouldBlock: false };
|
|
210
|
-
}
|
|
211
|
-
case "log": {
|
|
212
|
-
logger.info("[GuardrailsUtils] Suspicious content detected:", {
|
|
213
|
-
userInput: userInput.substring(0, 100),
|
|
214
|
-
evaluation,
|
|
215
|
-
});
|
|
216
|
-
return { shouldBlock: false };
|
|
217
|
-
}
|
|
218
|
-
default:
|
|
219
|
-
return { shouldBlock: false };
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
/**
|
|
223
|
-
* Apply parameter sanitization to request parameters
|
|
224
|
-
*/
|
|
225
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
226
|
-
export function applySanitization(params, sanitizedInput) {
|
|
227
|
-
const sanitizedParams = { ...params };
|
|
228
|
-
if (Array.isArray(params.prompt)) {
|
|
229
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
230
|
-
const sanitizedPrompt = params.prompt.map((msg) => {
|
|
231
|
-
if (msg.role === "user") {
|
|
232
|
-
if (typeof msg.content === "string") {
|
|
233
|
-
return {
|
|
234
|
-
...msg,
|
|
235
|
-
content: [{ type: "text", text: sanitizedInput }],
|
|
236
|
-
};
|
|
237
|
-
}
|
|
238
|
-
else if (Array.isArray(msg.content)) {
|
|
239
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
240
|
-
const sanitizedContent = msg.content.map((part) => {
|
|
241
|
-
if (part.type === "text") {
|
|
242
|
-
return { ...part, text: sanitizedInput };
|
|
243
|
-
}
|
|
244
|
-
return part;
|
|
245
|
-
});
|
|
246
|
-
return { ...msg, content: sanitizedContent };
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
return msg;
|
|
250
|
-
});
|
|
251
|
-
sanitizedParams.prompt =
|
|
252
|
-
sanitizedPrompt;
|
|
253
|
-
}
|
|
254
|
-
return sanitizedParams;
|
|
255
|
-
}
|
|
256
|
-
export function escapeRegExp(string) {
|
|
257
|
-
return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
258
|
-
}
|
|
259
|
-
export function createBlockedResponse() {
|
|
260
|
-
return {
|
|
261
|
-
text: "Request contains inappropriate content and has been blocked.",
|
|
262
|
-
usage: { promptTokens: 0, completionTokens: 0 },
|
|
263
|
-
finishReason: "stop",
|
|
264
|
-
warnings: [],
|
|
265
|
-
rawCall: { rawPrompt: null, rawSettings: {} },
|
|
266
|
-
};
|
|
267
|
-
}
|
|
268
|
-
export function createBlockedStream() {
|
|
269
|
-
return new ReadableStream({
|
|
270
|
-
start(controller) {
|
|
271
|
-
controller.enqueue({
|
|
272
|
-
type: "text-delta",
|
|
273
|
-
textDelta: "Request contains inappropriate content and has been blocked.",
|
|
274
|
-
});
|
|
275
|
-
controller.enqueue({
|
|
276
|
-
type: "finish",
|
|
277
|
-
finishReason: "stop",
|
|
278
|
-
usage: { promptTokens: 0, completionTokens: 0 },
|
|
279
|
-
});
|
|
280
|
-
controller.close();
|
|
281
|
-
},
|
|
282
|
-
});
|
|
283
|
-
}
|
|
284
|
-
/**
|
|
285
|
-
* Apply content filtering using bad words configuration
|
|
286
|
-
* Handles both regex patterns and string lists with proper priority
|
|
287
|
-
* @param text The text to filter
|
|
288
|
-
* @param badWordsConfig Bad words configuration
|
|
289
|
-
* @param context Optional context for logging (e.g., "generate", "stream")
|
|
290
|
-
* @returns Filtering result with filtered text and metadata
|
|
291
|
-
*/
|
|
292
|
-
export function applyContentFiltering(text, badWordsConfig, context = "unknown") {
|
|
293
|
-
// Early return if filtering is disabled or no config
|
|
294
|
-
try {
|
|
295
|
-
if (!badWordsConfig?.enabled || !text) {
|
|
296
|
-
return {
|
|
297
|
-
filteredText: text,
|
|
298
|
-
hasChanges: false,
|
|
299
|
-
appliedFilters: [],
|
|
300
|
-
filteringStats: {
|
|
301
|
-
regexPatternsApplied: 0,
|
|
302
|
-
stringFiltersApplied: 0,
|
|
303
|
-
totalMatches: 0,
|
|
304
|
-
},
|
|
305
|
-
};
|
|
306
|
-
}
|
|
307
|
-
let filteredText = text;
|
|
308
|
-
let hasChanges = false;
|
|
309
|
-
const appliedFilters = [];
|
|
310
|
-
let totalMatches = 0;
|
|
311
|
-
const replacementText = badWordsConfig.replacementText || "[REDACTED]";
|
|
312
|
-
// Priority 1: Use regex patterns if provided
|
|
313
|
-
if (badWordsConfig.regexPatterns &&
|
|
314
|
-
badWordsConfig.regexPatterns.length > 0) {
|
|
315
|
-
if (badWordsConfig.list && badWordsConfig.list.length > 0) {
|
|
316
|
-
logger.warn(`[ContentFiltering:${context}] Both regexPatterns and list provided. Using regexPatterns and ignoring list.`);
|
|
317
|
-
}
|
|
318
|
-
logger.debug(`[ContentFiltering:${context}] Applying regex pattern filtering with ${badWordsConfig.regexPatterns.length} patterns using replacement: "${replacementText}".`);
|
|
319
|
-
for (const pattern of badWordsConfig.regexPatterns) {
|
|
320
|
-
try {
|
|
321
|
-
// TODO: Add blocking for overly complex or long patterns
|
|
322
|
-
if (pattern.length > 1000) {
|
|
323
|
-
logger.warn(`[ContentFiltering:${context}] Regex pattern exceeds max length (1000 chars): "${pattern.substring(0, 50)}..."`);
|
|
324
|
-
}
|
|
325
|
-
const regex = new RegExp(pattern, "gi");
|
|
326
|
-
const testStart = Date.now();
|
|
327
|
-
regex.test("test");
|
|
328
|
-
if (Date.now() - testStart > 100) {
|
|
329
|
-
logger.warn(`[ContentFiltering:${context}] Regex pattern "${pattern}" appears to be too complex (slow test execution).`);
|
|
330
|
-
}
|
|
331
|
-
const before = filteredText;
|
|
332
|
-
let matchCount = 0;
|
|
333
|
-
filteredText = filteredText?.replace(regex, () => {
|
|
334
|
-
matchCount++;
|
|
335
|
-
return replacementText;
|
|
336
|
-
});
|
|
337
|
-
if (before !== filteredText) {
|
|
338
|
-
hasChanges = true;
|
|
339
|
-
totalMatches += matchCount;
|
|
340
|
-
appliedFilters.push(`regex:${pattern}`);
|
|
341
|
-
logger.debug(`[ContentFiltering:${context}] Regex pattern "${pattern}" matched ${matchCount} times and filtered content.`);
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
catch (error) {
|
|
345
|
-
logger.error(`[ContentFiltering:${context}] Invalid regex pattern "${pattern}":`, error);
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
// Priority 2: Use simple string list if no regex patterns
|
|
350
|
-
else if (badWordsConfig.list && badWordsConfig.list.length > 0) {
|
|
351
|
-
logger.debug(`[ContentFiltering:${context}] Applying string list filtering with ${badWordsConfig.list.length} terms using replacement: "${replacementText}".`);
|
|
352
|
-
for (const term of badWordsConfig.list) {
|
|
353
|
-
const regex = new RegExp(escapeRegExp(term), "gi");
|
|
354
|
-
const before = filteredText;
|
|
355
|
-
let matchCount = 0;
|
|
356
|
-
filteredText = filteredText?.replace(regex, () => {
|
|
357
|
-
matchCount++;
|
|
358
|
-
return replacementText;
|
|
359
|
-
});
|
|
360
|
-
if (before !== filteredText) {
|
|
361
|
-
hasChanges = true;
|
|
362
|
-
totalMatches += matchCount;
|
|
363
|
-
appliedFilters.push(`string:${term}`);
|
|
364
|
-
logger.debug(`[ContentFiltering:${context}] String filter "${term}" matched ${matchCount} times.`);
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
const result = {
|
|
369
|
-
filteredText,
|
|
370
|
-
hasChanges,
|
|
371
|
-
appliedFilters,
|
|
372
|
-
filteringStats: {
|
|
373
|
-
regexPatternsApplied: badWordsConfig.regexPatterns?.length || 0,
|
|
374
|
-
stringFiltersApplied: badWordsConfig.list?.length || 0,
|
|
375
|
-
totalMatches,
|
|
376
|
-
},
|
|
377
|
-
};
|
|
378
|
-
if (hasChanges) {
|
|
379
|
-
logger.debug(`[ContentFiltering:${context}] Filtering completed. Applied ${appliedFilters.length} filters with ${totalMatches} total matches.`);
|
|
380
|
-
}
|
|
381
|
-
return result;
|
|
382
|
-
}
|
|
383
|
-
catch (error) {
|
|
384
|
-
logger.error(`[ContentFiltering:${context}] Error during content filtering:`, error);
|
|
385
|
-
return {
|
|
386
|
-
filteredText: text,
|
|
387
|
-
hasChanges: false,
|
|
388
|
-
appliedFilters: [],
|
|
389
|
-
filteringStats: {
|
|
390
|
-
regexPatternsApplied: 0,
|
|
391
|
-
stringFiltersApplied: 0,
|
|
392
|
-
totalMatches: 0,
|
|
393
|
-
},
|
|
394
|
-
};
|
|
395
|
-
}
|
|
396
|
-
}
|