@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,341 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Context Assembly Utilities
|
|
3
|
-
*
|
|
4
|
-
* Provides utilities for assembling, formatting, and optimizing context
|
|
5
|
-
* from retrieved chunks for LLM consumption.
|
|
6
|
-
*
|
|
7
|
-
* Features:
|
|
8
|
-
* - Context window management (token-aware truncation)
|
|
9
|
-
* - Citation formatting
|
|
10
|
-
* - Context deduplication
|
|
11
|
-
* - Relevance-based ordering
|
|
12
|
-
* - Context summarization
|
|
13
|
-
*/
|
|
14
|
-
import { logger } from "../../utils/logger.js";
|
|
15
|
-
import { estimateTokens } from "../../utils/tokenEstimation.js";
|
|
16
|
-
/**
|
|
17
|
-
* Assemble context from retrieved results
|
|
18
|
-
*
|
|
19
|
-
* Combines multiple chunks into a coherent context string
|
|
20
|
-
* suitable for LLM consumption.
|
|
21
|
-
*
|
|
22
|
-
* @param results - Retrieved chunks or query results
|
|
23
|
-
* @param options - Assembly options
|
|
24
|
-
* @returns Assembled context string
|
|
25
|
-
*
|
|
26
|
-
* @example
|
|
27
|
-
* ```typescript
|
|
28
|
-
* const context = assembleContext(results, {
|
|
29
|
-
* maxTokens: 4000,
|
|
30
|
-
* citationFormat: 'numbered',
|
|
31
|
-
* deduplicate: true
|
|
32
|
-
* });
|
|
33
|
-
* ```
|
|
34
|
-
*/
|
|
35
|
-
export function assembleContext(results, options) {
|
|
36
|
-
const { maxChars, maxTokens = 4000, citationFormat = "none", separator = "\n\n---\n\n", includeMetadata = false, deduplicate = false, dedupeThreshold = 0.8, orderByRelevance = true, includeSectionHeaders = false, headerTemplate = "[{index}] Source: {source}", } = options || {};
|
|
37
|
-
if (results.length === 0) {
|
|
38
|
-
return "";
|
|
39
|
-
}
|
|
40
|
-
// Convert to unified format
|
|
41
|
-
let items = results.map((r, index) => ({
|
|
42
|
-
id: "id" in r ? r.id : `chunk-${index}`,
|
|
43
|
-
text: "text" in r ? r.text || "" : "",
|
|
44
|
-
score: "score" in r ? r.score || 0 : 0,
|
|
45
|
-
metadata: "metadata" in r ? r.metadata : {},
|
|
46
|
-
index,
|
|
47
|
-
}));
|
|
48
|
-
// Get text from metadata if not directly available
|
|
49
|
-
items = items.map((item) => ({
|
|
50
|
-
...item,
|
|
51
|
-
text: item.text ||
|
|
52
|
-
item.metadata?.text ||
|
|
53
|
-
"",
|
|
54
|
-
}));
|
|
55
|
-
// Order by relevance if requested
|
|
56
|
-
if (orderByRelevance) {
|
|
57
|
-
items.sort((a, b) => b.score - a.score);
|
|
58
|
-
}
|
|
59
|
-
// Deduplicate if requested
|
|
60
|
-
if (deduplicate) {
|
|
61
|
-
// Ensure metadata is defined for deduplication
|
|
62
|
-
const itemsWithMetadata = items.map((item) => ({
|
|
63
|
-
...item,
|
|
64
|
-
metadata: item.metadata || {},
|
|
65
|
-
}));
|
|
66
|
-
items = deduplicateChunks(itemsWithMetadata, dedupeThreshold);
|
|
67
|
-
}
|
|
68
|
-
// Calculate max characters
|
|
69
|
-
const effectiveMaxChars = maxChars || maxTokens * 4;
|
|
70
|
-
// Assemble context with token awareness
|
|
71
|
-
const parts = [];
|
|
72
|
-
let totalChars = 0;
|
|
73
|
-
for (const item of items) {
|
|
74
|
-
const header = includeSectionHeaders
|
|
75
|
-
? formatHeader(headerTemplate, {
|
|
76
|
-
index: parts.length + 1,
|
|
77
|
-
source: item.metadata?.source || item.id,
|
|
78
|
-
score: item.score,
|
|
79
|
-
})
|
|
80
|
-
: "";
|
|
81
|
-
const metadata = includeMetadata ? formatMetadata(item.metadata) : "";
|
|
82
|
-
const citation = formatCitation(citationFormat, parts.length + 1, item.metadata);
|
|
83
|
-
const chunkText = [
|
|
84
|
-
header,
|
|
85
|
-
citation ? `${citation}\n` : "",
|
|
86
|
-
item.text,
|
|
87
|
-
metadata,
|
|
88
|
-
]
|
|
89
|
-
.filter(Boolean)
|
|
90
|
-
.join("\n");
|
|
91
|
-
// Check if adding this chunk would exceed limit
|
|
92
|
-
const newTotalChars = totalChars + chunkText.length + separator.length;
|
|
93
|
-
if (newTotalChars > effectiveMaxChars) {
|
|
94
|
-
// Try to include partial chunk
|
|
95
|
-
const remainingChars = effectiveMaxChars - totalChars - separator.length - 50; // Buffer
|
|
96
|
-
if (remainingChars > 200) {
|
|
97
|
-
const truncatedText = truncateText(item.text, remainingChars);
|
|
98
|
-
parts.push([
|
|
99
|
-
header,
|
|
100
|
-
citation ? `${citation}\n` : "",
|
|
101
|
-
truncatedText,
|
|
102
|
-
"[truncated]",
|
|
103
|
-
]
|
|
104
|
-
.filter(Boolean)
|
|
105
|
-
.join("\n"));
|
|
106
|
-
}
|
|
107
|
-
break;
|
|
108
|
-
}
|
|
109
|
-
parts.push(chunkText);
|
|
110
|
-
totalChars = newTotalChars;
|
|
111
|
-
}
|
|
112
|
-
return parts.join(separator);
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Format context with inline citations
|
|
116
|
-
*
|
|
117
|
-
* @param results - Retrieved results
|
|
118
|
-
* @param options - Formatting options
|
|
119
|
-
* @returns Context with citations and citation list
|
|
120
|
-
*/
|
|
121
|
-
export function formatContextWithCitations(results, options) {
|
|
122
|
-
const citations = [];
|
|
123
|
-
const items = results.map((r, index) => {
|
|
124
|
-
const id = "id" in r ? r.id : `chunk-${index}`;
|
|
125
|
-
const metadata = "metadata" in r ? r.metadata : {};
|
|
126
|
-
const source = metadata?.source || id;
|
|
127
|
-
citations.push(`[${index + 1}] ${source}`);
|
|
128
|
-
return {
|
|
129
|
-
...r,
|
|
130
|
-
citationMarker: `[${index + 1}]`,
|
|
131
|
-
};
|
|
132
|
-
});
|
|
133
|
-
const context = assembleContext(items, {
|
|
134
|
-
...options,
|
|
135
|
-
citationFormat: "numbered",
|
|
136
|
-
includeSectionHeaders: true,
|
|
137
|
-
headerTemplate: "[{index}]",
|
|
138
|
-
});
|
|
139
|
-
return { context, citations };
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* Create a context window with detailed tracking
|
|
143
|
-
*
|
|
144
|
-
* @param results - Retrieved results
|
|
145
|
-
* @param options - Assembly options
|
|
146
|
-
* @returns Context window with metadata
|
|
147
|
-
*/
|
|
148
|
-
export function createContextWindow(results, options) {
|
|
149
|
-
const maxTokens = options?.maxTokens || 4000;
|
|
150
|
-
const maxChars = options?.maxChars || maxTokens * 4;
|
|
151
|
-
let text = "";
|
|
152
|
-
let chunkCount = 0;
|
|
153
|
-
let truncatedChunks = 0;
|
|
154
|
-
const citations = new Map();
|
|
155
|
-
const items = results.map((r, index) => ({
|
|
156
|
-
id: "id" in r ? r.id : `chunk-${index}`,
|
|
157
|
-
text: ("text" in r ? r.text : "") ||
|
|
158
|
-
r.metadata?.text ||
|
|
159
|
-
"",
|
|
160
|
-
metadata: "metadata" in r ? r.metadata : {},
|
|
161
|
-
}));
|
|
162
|
-
for (const item of items) {
|
|
163
|
-
const chunkText = item.text;
|
|
164
|
-
const newLength = text.length + chunkText.length + 10; // Buffer for separators
|
|
165
|
-
if (newLength > maxChars) {
|
|
166
|
-
// Try partial inclusion
|
|
167
|
-
const remaining = maxChars - text.length - 20;
|
|
168
|
-
if (remaining > 100) {
|
|
169
|
-
const truncated = truncateText(chunkText, remaining);
|
|
170
|
-
text += (text ? "\n\n" : "") + truncated + "...";
|
|
171
|
-
truncatedChunks++;
|
|
172
|
-
citations.set(item.id, `[${chunkCount + 1}] ${item.metadata?.source || item.id} (truncated)`);
|
|
173
|
-
chunkCount++;
|
|
174
|
-
}
|
|
175
|
-
else {
|
|
176
|
-
truncatedChunks++;
|
|
177
|
-
}
|
|
178
|
-
continue;
|
|
179
|
-
}
|
|
180
|
-
text += (text ? "\n\n" : "") + chunkText;
|
|
181
|
-
citations.set(item.id, `[${chunkCount + 1}] ${item.metadata?.source || item.id}`);
|
|
182
|
-
chunkCount++;
|
|
183
|
-
}
|
|
184
|
-
return {
|
|
185
|
-
text,
|
|
186
|
-
chunkCount,
|
|
187
|
-
charCount: text.length,
|
|
188
|
-
tokenCount: estimateTokens(text),
|
|
189
|
-
truncatedChunks,
|
|
190
|
-
citations,
|
|
191
|
-
};
|
|
192
|
-
}
|
|
193
|
-
/**
|
|
194
|
-
* Summarize context using LLM
|
|
195
|
-
*
|
|
196
|
-
* @param context - Context to summarize
|
|
197
|
-
* @param maxLength - Maximum summary length
|
|
198
|
-
* @param provider - LLM provider instance
|
|
199
|
-
* @returns Summarized context
|
|
200
|
-
*/
|
|
201
|
-
export async function summarizeContext(context, maxLength = 500, provider) {
|
|
202
|
-
if (!provider) {
|
|
203
|
-
// Simple truncation fallback
|
|
204
|
-
return truncateText(context, maxLength * 4);
|
|
205
|
-
}
|
|
206
|
-
try {
|
|
207
|
-
const result = await provider.generate({
|
|
208
|
-
prompt: `Summarize the following context in no more than ${maxLength} words, preserving the key information:\n\n${context}\n\nSummary:`,
|
|
209
|
-
maxTokens: Math.ceil(maxLength * 1.5),
|
|
210
|
-
temperature: 0.3,
|
|
211
|
-
});
|
|
212
|
-
return result?.content?.trim() || truncateText(context, maxLength * 4);
|
|
213
|
-
}
|
|
214
|
-
catch (error) {
|
|
215
|
-
logger.warn("[ContextAssembly] Summarization failed, using truncation", {
|
|
216
|
-
error: error instanceof Error ? error.message : String(error),
|
|
217
|
-
});
|
|
218
|
-
return truncateText(context, maxLength * 4);
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
// ============================================================================
|
|
222
|
-
// Helper Functions
|
|
223
|
-
// ============================================================================
|
|
224
|
-
/**
|
|
225
|
-
* Format section header using template
|
|
226
|
-
*/
|
|
227
|
-
function formatHeader(template, vars) {
|
|
228
|
-
return template
|
|
229
|
-
.replace("{index}", String(vars.index))
|
|
230
|
-
.replace("{source}", vars.source)
|
|
231
|
-
.replace("{score}", vars.score.toFixed(4));
|
|
232
|
-
}
|
|
233
|
-
/**
|
|
234
|
-
* Format citation based on style
|
|
235
|
-
*/
|
|
236
|
-
function formatCitation(format, index, metadata) {
|
|
237
|
-
switch (format) {
|
|
238
|
-
case "inline":
|
|
239
|
-
return `(Source: ${metadata?.source || `#${index}`})`;
|
|
240
|
-
case "footnote":
|
|
241
|
-
return `[^${index}]`;
|
|
242
|
-
case "numbered":
|
|
243
|
-
return `[${index}]`;
|
|
244
|
-
case "none":
|
|
245
|
-
default:
|
|
246
|
-
return "";
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
/**
|
|
250
|
-
* Format metadata for display
|
|
251
|
-
*/
|
|
252
|
-
function formatMetadata(metadata) {
|
|
253
|
-
if (!metadata) {
|
|
254
|
-
return "";
|
|
255
|
-
}
|
|
256
|
-
const relevant = ["source", "title", "author", "date", "page"];
|
|
257
|
-
const parts = [];
|
|
258
|
-
for (const key of relevant) {
|
|
259
|
-
if (metadata[key]) {
|
|
260
|
-
parts.push(`${key}: ${metadata[key]}`);
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
return parts.length > 0 ? `\n[${parts.join(" | ")}]` : "";
|
|
264
|
-
}
|
|
265
|
-
/**
|
|
266
|
-
* Truncate text at word boundary
|
|
267
|
-
*/
|
|
268
|
-
function truncateText(text, maxLength) {
|
|
269
|
-
if (text.length <= maxLength) {
|
|
270
|
-
return text;
|
|
271
|
-
}
|
|
272
|
-
// Find last space before maxLength
|
|
273
|
-
let truncateAt = text.lastIndexOf(" ", maxLength);
|
|
274
|
-
if (truncateAt === -1 || truncateAt < maxLength * 0.7) {
|
|
275
|
-
truncateAt = maxLength;
|
|
276
|
-
}
|
|
277
|
-
return text.slice(0, truncateAt).trim();
|
|
278
|
-
}
|
|
279
|
-
/**
|
|
280
|
-
* Deduplicate chunks based on text similarity
|
|
281
|
-
*/
|
|
282
|
-
function deduplicateChunks(items, threshold) {
|
|
283
|
-
const unique = [];
|
|
284
|
-
for (const item of items) {
|
|
285
|
-
// Check if this item is too similar to any already included
|
|
286
|
-
const isDuplicate = unique.some((existing) => textSimilarity(item.text, existing.text) > threshold);
|
|
287
|
-
if (!isDuplicate) {
|
|
288
|
-
unique.push(item);
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
return unique;
|
|
292
|
-
}
|
|
293
|
-
/**
|
|
294
|
-
* Simple text similarity using Jaccard index
|
|
295
|
-
*/
|
|
296
|
-
function textSimilarity(a, b) {
|
|
297
|
-
const wordsA = new Set(a.toLowerCase().split(/\s+/));
|
|
298
|
-
const wordsB = new Set(b.toLowerCase().split(/\s+/));
|
|
299
|
-
const intersection = new Set([...wordsA].filter((x) => wordsB.has(x)));
|
|
300
|
-
const union = new Set([...wordsA, ...wordsB]);
|
|
301
|
-
return intersection.size / union.size;
|
|
302
|
-
}
|
|
303
|
-
/**
|
|
304
|
-
* Order chunks by document structure (if available)
|
|
305
|
-
*/
|
|
306
|
-
export function orderByDocumentStructure(chunks) {
|
|
307
|
-
// Group by document
|
|
308
|
-
const byDocument = new Map();
|
|
309
|
-
for (const chunk of chunks) {
|
|
310
|
-
const docId = chunk.metadata.documentId;
|
|
311
|
-
const group = byDocument.get(docId);
|
|
312
|
-
if (group) {
|
|
313
|
-
group.push(chunk);
|
|
314
|
-
}
|
|
315
|
-
else {
|
|
316
|
-
byDocument.set(docId, [chunk]);
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
// Sort each document's chunks by position
|
|
320
|
-
for (const docChunks of byDocument.values()) {
|
|
321
|
-
docChunks.sort((a, b) => (a.metadata.chunkIndex || 0) - (b.metadata.chunkIndex || 0));
|
|
322
|
-
}
|
|
323
|
-
// Flatten, keeping documents together
|
|
324
|
-
return [...byDocument.values()].flat();
|
|
325
|
-
}
|
|
326
|
-
/**
|
|
327
|
-
* Extract key sentences from chunks for summary
|
|
328
|
-
*/
|
|
329
|
-
export function extractKeySentences(text, count = 3) {
|
|
330
|
-
const sentences = text
|
|
331
|
-
.split(/[.!?]+/)
|
|
332
|
-
.map((s) => s.trim())
|
|
333
|
-
.filter((s) => s.length > 20);
|
|
334
|
-
// Simple scoring: longer sentences with more unique words
|
|
335
|
-
const scored = sentences.map((s) => ({
|
|
336
|
-
text: s,
|
|
337
|
-
score: s.length * new Set(s.toLowerCase().split(/\s+/)).size,
|
|
338
|
-
}));
|
|
339
|
-
scored.sort((a, b) => b.score - a.score);
|
|
340
|
-
return scored.slice(0, count).map((s) => s.text);
|
|
341
|
-
}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Pipeline Module Exports
|
|
3
|
-
*/
|
|
4
|
-
export { assembleContext, createContextWindow, extractKeySentences, formatContextWithCitations, orderByDocumentStructure, summarizeContext, } from "./contextAssembly.js";
|
|
5
|
-
export { createRAGPipeline, RAGPipeline, } from "./RAGPipeline.js";
|
|
@@ -1,321 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* RAG Integration for generate() and stream()
|
|
3
|
-
*
|
|
4
|
-
* Provides automatic RAG pipeline setup when `rag` config is provided
|
|
5
|
-
* in GenerateOptions or StreamOptions. Handles file loading, chunking,
|
|
6
|
-
* embedding generation, vector storage, and tool creation internally
|
|
7
|
-
* so developers only need to pass `rag: { files: [...] }`.
|
|
8
|
-
*/
|
|
9
|
-
import { existsSync, readFileSync } from "fs";
|
|
10
|
-
import { extname, resolve } from "path";
|
|
11
|
-
import { z } from "zod";
|
|
12
|
-
import { SpanSerializer, SpanType, SpanStatus, getMetricsAggregator, } from "../observability/index.js";
|
|
13
|
-
import { logger } from "../utils/logger.js";
|
|
14
|
-
import { createChunker } from "./ChunkerFactory.js";
|
|
15
|
-
import { createVectorQueryTool, InMemoryVectorStore, } from "./retrieval/vectorQueryTool.js";
|
|
16
|
-
/**
|
|
17
|
-
* Maps file extensions to recommended chunking strategies
|
|
18
|
-
*/
|
|
19
|
-
const EXTENSION_TO_STRATEGY = {
|
|
20
|
-
".md": "markdown",
|
|
21
|
-
".mdx": "markdown",
|
|
22
|
-
".html": "html",
|
|
23
|
-
".htm": "html",
|
|
24
|
-
".json": "json",
|
|
25
|
-
".tex": "latex",
|
|
26
|
-
".latex": "latex",
|
|
27
|
-
".txt": "recursive",
|
|
28
|
-
".csv": "recursive",
|
|
29
|
-
".xml": "recursive",
|
|
30
|
-
".yaml": "recursive",
|
|
31
|
-
".yml": "recursive",
|
|
32
|
-
".ts": "recursive",
|
|
33
|
-
".js": "recursive",
|
|
34
|
-
".py": "recursive",
|
|
35
|
-
".java": "recursive",
|
|
36
|
-
".go": "recursive",
|
|
37
|
-
".rs": "recursive",
|
|
38
|
-
".c": "recursive",
|
|
39
|
-
".cpp": "recursive",
|
|
40
|
-
".rb": "recursive",
|
|
41
|
-
".php": "recursive",
|
|
42
|
-
".swift": "recursive",
|
|
43
|
-
".kt": "recursive",
|
|
44
|
-
};
|
|
45
|
-
/**
|
|
46
|
-
* Detect the best chunking strategy from file extension
|
|
47
|
-
*/
|
|
48
|
-
function detectStrategy(filePath) {
|
|
49
|
-
const ext = extname(filePath).toLowerCase();
|
|
50
|
-
return EXTENSION_TO_STRATEGY[ext] || "recursive";
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Simple hash function for strings (FNV-1a variant).
|
|
54
|
-
* Maps a word to a bucket index deterministically.
|
|
55
|
-
*/
|
|
56
|
-
function hashWord(word, buckets) {
|
|
57
|
-
let hash = 2166136261;
|
|
58
|
-
for (let i = 0; i < word.length; i++) {
|
|
59
|
-
hash ^= word.charCodeAt(i);
|
|
60
|
-
hash = (hash * 16777619) >>> 0;
|
|
61
|
-
}
|
|
62
|
-
return hash % buckets;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Generate deterministic embeddings for chunks.
|
|
66
|
-
* Combines character-frequency (40%) with word-level hash features (60%)
|
|
67
|
-
* for better semantic discrimination than pure character frequency.
|
|
68
|
-
* When a real embedding provider is configured, it will be used instead.
|
|
69
|
-
*/
|
|
70
|
-
function generateSimpleEmbedding(text, dimension) {
|
|
71
|
-
const charEmbedding = new Array(dimension).fill(0);
|
|
72
|
-
const wordEmbedding = new Array(dimension).fill(0);
|
|
73
|
-
// Character-frequency features
|
|
74
|
-
for (let i = 0; i < text.length; i++) {
|
|
75
|
-
const charCode = text.charCodeAt(i);
|
|
76
|
-
const idx = charCode % dimension;
|
|
77
|
-
charEmbedding[idx] += 1;
|
|
78
|
-
}
|
|
79
|
-
// Word-level hash features (TF-IDF-like)
|
|
80
|
-
const words = text
|
|
81
|
-
.toLowerCase()
|
|
82
|
-
.replace(/[^a-z0-9\s]/g, "")
|
|
83
|
-
.split(/\s+/)
|
|
84
|
-
.filter((w) => w.length > 1);
|
|
85
|
-
for (const word of words) {
|
|
86
|
-
const idx = hashWord(word, dimension);
|
|
87
|
-
wordEmbedding[idx] += 1;
|
|
88
|
-
}
|
|
89
|
-
// Combine: 40% character, 60% word
|
|
90
|
-
const combined = new Array(dimension);
|
|
91
|
-
for (let i = 0; i < dimension; i++) {
|
|
92
|
-
combined[i] = 0.4 * charEmbedding[i] + 0.6 * wordEmbedding[i];
|
|
93
|
-
}
|
|
94
|
-
// Normalize to unit vector
|
|
95
|
-
const magnitude = Math.sqrt(combined.reduce((sum, v) => sum + v * v, 0));
|
|
96
|
-
if (magnitude > 0) {
|
|
97
|
-
for (let i = 0; i < dimension; i++) {
|
|
98
|
-
combined[i] /= magnitude;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
return combined;
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Diversify retrieval results via round-robin across source files.
|
|
105
|
-
* Ensures at least one chunk per source file appears in the top-K results,
|
|
106
|
-
* preventing any single file from dominating retrieval.
|
|
107
|
-
*/
|
|
108
|
-
function diversifyResults(results, topK) {
|
|
109
|
-
// Group by source file
|
|
110
|
-
const byFile = new Map();
|
|
111
|
-
for (const r of results) {
|
|
112
|
-
const source = r.metadata?.source || "unknown";
|
|
113
|
-
if (!byFile.has(source)) {
|
|
114
|
-
byFile.set(source, []);
|
|
115
|
-
}
|
|
116
|
-
const sourceGroup = byFile.get(source);
|
|
117
|
-
if (sourceGroup) {
|
|
118
|
-
sourceGroup.push(r);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
// If only one source file, no diversification needed
|
|
122
|
-
if (byFile.size <= 1) {
|
|
123
|
-
return results.slice(0, topK);
|
|
124
|
-
}
|
|
125
|
-
// Round-robin selection from each source file group
|
|
126
|
-
const diversified = [];
|
|
127
|
-
const iterators = [...byFile.values()].map((arr) => ({ arr, idx: 0 }));
|
|
128
|
-
while (diversified.length < topK &&
|
|
129
|
-
iterators.some((it) => it.idx < it.arr.length)) {
|
|
130
|
-
for (const it of iterators) {
|
|
131
|
-
if (it.idx < it.arr.length && diversified.length < topK) {
|
|
132
|
-
diversified.push(it.arr[it.idx++]);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
return diversified;
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Prepare RAG tools from the provided configuration.
|
|
140
|
-
*
|
|
141
|
-
* This function:
|
|
142
|
-
* 1. Loads and reads all specified files
|
|
143
|
-
* 2. Chunks them using the configured (or auto-detected) strategy
|
|
144
|
-
* 3. Generates embeddings for each chunk
|
|
145
|
-
* 4. Stores them in an in-memory vector store
|
|
146
|
-
* 5. Creates a tool the AI model can use to search the documents
|
|
147
|
-
*
|
|
148
|
-
* @param ragConfig - RAG configuration from generate/stream options
|
|
149
|
-
* @param fallbackProvider - Provider to use for embeddings if not specified in ragConfig
|
|
150
|
-
* @returns Prepared RAG tool to inject into the tools record
|
|
151
|
-
*/
|
|
152
|
-
export async function prepareRAGTool(ragConfig, fallbackProvider) {
|
|
153
|
-
const span = SpanSerializer.createSpan(SpanType.RAG, "rag.prepare", {
|
|
154
|
-
"rag.operation": "prepare",
|
|
155
|
-
"rag.files_count": ragConfig.files?.length ?? 0,
|
|
156
|
-
"rag.strategy": ragConfig.strategy ?? "auto",
|
|
157
|
-
"rag.chunk_size": ragConfig.chunkSize ?? 1000,
|
|
158
|
-
});
|
|
159
|
-
const startTime = Date.now();
|
|
160
|
-
try {
|
|
161
|
-
const result = await _prepareRAGToolInner(ragConfig, fallbackProvider);
|
|
162
|
-
span.durationMs = Date.now() - startTime;
|
|
163
|
-
const endedSpan = SpanSerializer.endSpan(span, SpanStatus.OK);
|
|
164
|
-
endedSpan.attributes = {
|
|
165
|
-
...endedSpan.attributes,
|
|
166
|
-
"rag.chunks_indexed": result.chunksIndexed,
|
|
167
|
-
"rag.files_loaded": result.filesLoaded,
|
|
168
|
-
};
|
|
169
|
-
getMetricsAggregator().recordSpan(endedSpan);
|
|
170
|
-
return result;
|
|
171
|
-
}
|
|
172
|
-
catch (error) {
|
|
173
|
-
span.durationMs = Date.now() - startTime;
|
|
174
|
-
const endedSpan = SpanSerializer.endSpan(span, SpanStatus.ERROR);
|
|
175
|
-
endedSpan.statusMessage =
|
|
176
|
-
error instanceof Error ? error.message : String(error);
|
|
177
|
-
getMetricsAggregator().recordSpan(endedSpan);
|
|
178
|
-
throw error;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
async function _prepareRAGToolInner(ragConfig, fallbackProvider) {
|
|
182
|
-
const { files, strategy: userStrategy, chunkSize = 1000, chunkOverlap = 200, topK: userTopK = 5, toolName = "search_knowledge_base", toolDescription = "REQUIRED: Search through pre-loaded local documents to find relevant information. Use this tool FIRST before any web search or other tools. This searches an indexed knowledge base of documents the user has provided.", embeddingProvider, embeddingModel, } = ragConfig;
|
|
183
|
-
if (!files || files.length === 0) {
|
|
184
|
-
throw new Error("RAG config requires at least one file path in 'files'");
|
|
185
|
-
}
|
|
186
|
-
// 1. Load files
|
|
187
|
-
const fileContents = [];
|
|
188
|
-
for (const filePath of files) {
|
|
189
|
-
const resolvedPath = resolve(filePath);
|
|
190
|
-
if (!existsSync(resolvedPath)) {
|
|
191
|
-
logger.warn(`[RAG] File not found, skipping: ${resolvedPath}`);
|
|
192
|
-
continue;
|
|
193
|
-
}
|
|
194
|
-
try {
|
|
195
|
-
const content = readFileSync(resolvedPath, "utf-8");
|
|
196
|
-
const strategy = userStrategy || detectStrategy(resolvedPath);
|
|
197
|
-
fileContents.push({ path: resolvedPath, content, strategy });
|
|
198
|
-
}
|
|
199
|
-
catch (error) {
|
|
200
|
-
logger.warn(`[RAG] Failed to read file: ${resolvedPath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
// Auto-increase topK for multi-file scenarios to ensure coverage
|
|
204
|
-
// (computed after loading so it reflects only files that actually exist)
|
|
205
|
-
const topK = fileContents.length > 1
|
|
206
|
-
? Math.max(userTopK, fileContents.length * 3)
|
|
207
|
-
: userTopK;
|
|
208
|
-
if (fileContents.length === 0) {
|
|
209
|
-
throw new Error("RAG: No files could be loaded. Check that file paths exist and are readable.");
|
|
210
|
-
}
|
|
211
|
-
logger.info(`[RAG] Loaded ${fileContents.length} files for indexing`);
|
|
212
|
-
// 2. Chunk all files
|
|
213
|
-
const allChunks = [];
|
|
214
|
-
for (const { path, content, strategy } of fileContents) {
|
|
215
|
-
try {
|
|
216
|
-
const chunker = await createChunker(strategy, {
|
|
217
|
-
maxSize: chunkSize,
|
|
218
|
-
overlap: Math.min(chunkOverlap, Math.floor(chunkSize * 0.5)),
|
|
219
|
-
});
|
|
220
|
-
const chunks = await chunker.chunk(content, {
|
|
221
|
-
metadata: { source: path },
|
|
222
|
-
});
|
|
223
|
-
for (const chunk of chunks) {
|
|
224
|
-
allChunks.push({
|
|
225
|
-
text: chunk.text,
|
|
226
|
-
metadata: { ...chunk.metadata, source: path },
|
|
227
|
-
});
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
catch (error) {
|
|
231
|
-
logger.warn(`[RAG] Chunking failed for ${path}, using fallback: ${error instanceof Error ? error.message : String(error)}`);
|
|
232
|
-
// Fallback: treat entire file as one chunk
|
|
233
|
-
allChunks.push({
|
|
234
|
-
text: content.slice(0, chunkSize),
|
|
235
|
-
metadata: { source: path, fallback: true },
|
|
236
|
-
});
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
logger.info(`[RAG] Created ${allChunks.length} chunks from ${fileContents.length} files`);
|
|
240
|
-
// 3. Generate embeddings and store in vector store
|
|
241
|
-
const EMBEDDING_DIMENSION = 128;
|
|
242
|
-
const vectorStore = new InMemoryVectorStore();
|
|
243
|
-
const indexName = "rag-index";
|
|
244
|
-
const items = allChunks.map((chunk, i) => ({
|
|
245
|
-
id: `rag-chunk-${i}`,
|
|
246
|
-
vector: generateSimpleEmbedding(chunk.text, EMBEDDING_DIMENSION),
|
|
247
|
-
metadata: {
|
|
248
|
-
text: chunk.text,
|
|
249
|
-
...chunk.metadata,
|
|
250
|
-
},
|
|
251
|
-
}));
|
|
252
|
-
await vectorStore.upsert(indexName, items);
|
|
253
|
-
logger.info(`[RAG] Indexed ${items.length} chunks in vector store`);
|
|
254
|
-
// 4. Create the search tool
|
|
255
|
-
// Determine embedding provider/model for the query tool
|
|
256
|
-
const provider = embeddingProvider || fallbackProvider || "vertex";
|
|
257
|
-
const model = embeddingModel || "gemini-2.5-flash";
|
|
258
|
-
const queryTool = createVectorQueryTool({
|
|
259
|
-
id: toolName,
|
|
260
|
-
description: toolDescription,
|
|
261
|
-
indexName,
|
|
262
|
-
embeddingModel: { provider, modelName: model },
|
|
263
|
-
topK,
|
|
264
|
-
includeSources: true,
|
|
265
|
-
}, vectorStore);
|
|
266
|
-
// Convert to Vercel AI SDK Tool format
|
|
267
|
-
const aiTool = {
|
|
268
|
-
description: queryTool.description,
|
|
269
|
-
inputSchema: z.object({
|
|
270
|
-
query: z
|
|
271
|
-
.string()
|
|
272
|
-
.describe("The search query to find relevant information"),
|
|
273
|
-
}),
|
|
274
|
-
execute: async ({ query }) => {
|
|
275
|
-
// For the in-memory store with simple embeddings,
|
|
276
|
-
// generate a query embedding using the same method
|
|
277
|
-
const queryEmbedding = generateSimpleEmbedding(query, EMBEDDING_DIMENSION);
|
|
278
|
-
// Fetch more candidates than needed so diversity can select across files
|
|
279
|
-
const fetchK = fileContents.length > 1 ? topK * 3 : topK;
|
|
280
|
-
const rawResults = await vectorStore.query({
|
|
281
|
-
indexName,
|
|
282
|
-
queryVector: queryEmbedding,
|
|
283
|
-
topK: fetchK,
|
|
284
|
-
});
|
|
285
|
-
// Apply source-file diversity for multi-file RAG
|
|
286
|
-
const results = fileContents.length > 1
|
|
287
|
-
? diversifyResults(rawResults, topK)
|
|
288
|
-
: rawResults.slice(0, topK);
|
|
289
|
-
if (results.length === 0) {
|
|
290
|
-
return {
|
|
291
|
-
relevantContext: "No relevant documents found for the query.",
|
|
292
|
-
sources: [],
|
|
293
|
-
totalResults: 0,
|
|
294
|
-
};
|
|
295
|
-
}
|
|
296
|
-
const relevantContext = results
|
|
297
|
-
.map((r, i) => `[${i + 1}] ${r.metadata?.text || r.text || ""}`)
|
|
298
|
-
.join("\n\n");
|
|
299
|
-
return {
|
|
300
|
-
relevantContext,
|
|
301
|
-
sources: results.map((r) => ({
|
|
302
|
-
id: r.id,
|
|
303
|
-
score: r.score,
|
|
304
|
-
source: r.metadata?.source,
|
|
305
|
-
text: (r.metadata?.text || r.text || "").slice(0, 200),
|
|
306
|
-
})),
|
|
307
|
-
totalResults: results.length,
|
|
308
|
-
};
|
|
309
|
-
},
|
|
310
|
-
};
|
|
311
|
-
return {
|
|
312
|
-
tool: aiTool,
|
|
313
|
-
toolName,
|
|
314
|
-
chunksIndexed: allChunks.length,
|
|
315
|
-
filesLoaded: fileContents.length,
|
|
316
|
-
};
|
|
317
|
-
}
|
|
318
|
-
/** @internal Exported for testing only */
|
|
319
|
-
export { generateSimpleEmbedding as _generateSimpleEmbedding };
|
|
320
|
-
/** @internal Exported for testing only */
|
|
321
|
-
export { diversifyResults as _diversifyResults };
|