@juspay/neurolink 9.32.0 → 9.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/auth/anthropicOAuth.js +1 -1
- package/dist/cli/commands/proxy.js +18 -5
- package/dist/client/aiSdkAdapter.js +1 -1
- package/dist/client/index.js +137 -501
- package/dist/core/factory.js +0 -1
- package/dist/core/redisConversationMemoryManager.js +1 -1
- package/dist/features/ppt/slideGenerator.js +0 -1
- package/dist/features/ppt/utils.js +0 -1
- package/dist/lib/neurolink.d.ts +10 -0
- package/dist/lib/neurolink.js +41 -7
- package/dist/lib/server/routes/claudeProxyRoutes.js +45 -9
- package/dist/lib/types/generateTypes.d.ts +16 -0
- package/dist/lib/types/streamTypes.d.ts +15 -0
- package/dist/mcp/elicitationProtocol.js +1 -1
- package/dist/mcp/servers/agent/directToolsServer.js +0 -1
- package/dist/neurolink.d.ts +10 -0
- package/dist/neurolink.js +41 -7
- package/dist/providers/azureOpenai.js +1 -1
- package/dist/providers/huggingFace.js +0 -1
- package/dist/providers/openaiCompatible.js +0 -1
- package/dist/sdk/toolRegistration.js +0 -1
- package/dist/server/openapi/generator.js +1 -1
- package/dist/server/routes/claudeProxyRoutes.js +45 -9
- package/dist/types/configTypes.js +0 -5
- package/dist/types/generateTypes.d.ts +16 -0
- package/dist/types/modelTypes.js +0 -1
- package/dist/types/streamTypes.d.ts +15 -0
- package/dist/types/tools.js +0 -1
- package/dist/types/typeAliases.js +0 -1
- package/dist/types/utilities.js +1 -1
- package/dist/types/workflowTypes.js +0 -1
- package/dist/utils/providerRetry.js +0 -1
- package/dist/utils/providerUtils.js +0 -1
- package/package.json +2 -2
- package/dist/client/adapters/providerImageAdapter.js +0 -588
- package/dist/client/adapters/tts/googleTTSHandler.js +0 -344
- package/dist/client/adapters/video/directorPipeline.js +0 -516
- package/dist/client/adapters/video/ffmpegAdapter.js +0 -206
- package/dist/client/adapters/video/frameExtractor.js +0 -143
- package/dist/client/adapters/video/vertexVideoHandler.js +0 -763
- package/dist/client/adapters/video/videoAnalyzer.js +0 -238
- package/dist/client/adapters/video/videoMerger.js +0 -171
- package/dist/client/agent/directTools.js +0 -840
- package/dist/client/auth/AuthProviderFactory.js +0 -111
- package/dist/client/auth/AuthProviderRegistry.js +0 -190
- package/dist/client/auth/RequestContext.js +0 -78
- package/dist/client/auth/accountPool.js +0 -178
- package/dist/client/auth/anthropicOAuth.js +0 -974
- package/dist/client/auth/authContext.js +0 -314
- package/dist/client/auth/errors.js +0 -39
- package/dist/client/auth/index.js +0 -61
- package/dist/client/auth/middleware/AuthMiddleware.js +0 -519
- package/dist/client/auth/middleware/rateLimitByUser.js +0 -554
- package/dist/client/auth/providers/BaseAuthProvider.js +0 -723
- package/dist/client/auth/providers/CognitoProvider.js +0 -304
- package/dist/client/auth/providers/KeycloakProvider.js +0 -393
- package/dist/client/auth/providers/auth0.js +0 -274
- package/dist/client/auth/providers/betterAuth.js +0 -182
- package/dist/client/auth/providers/clerk.js +0 -317
- package/dist/client/auth/providers/custom.js +0 -112
- package/dist/client/auth/providers/firebase.js +0 -226
- package/dist/client/auth/providers/jwt.js +0 -212
- package/dist/client/auth/providers/oauth2.js +0 -303
- package/dist/client/auth/providers/supabase.js +0 -259
- package/dist/client/auth/providers/workos.js +0 -284
- package/dist/client/auth/serverBridge.js +0 -25
- package/dist/client/auth/sessionManager.js +0 -437
- package/dist/client/auth/tokenStore.js +0 -799
- package/dist/client/client/aiSdkAdapter.js +0 -487
- package/dist/client/client/auth.js +0 -473
- package/dist/client/client/errors.js +0 -552
- package/dist/client/client/httpClient.js +0 -837
- package/dist/client/client/index.js +0 -172
- package/dist/client/client/interceptors.js +0 -601
- package/dist/client/client/sseClient.js +0 -545
- package/dist/client/client/streamingClient.js +0 -917
- package/dist/client/client/wsClient.js +0 -369
- package/dist/client/config/configManager.js +0 -303
- package/dist/client/config/conversationMemory.js +0 -86
- package/dist/client/config/taskClassificationConfig.js +0 -148
- package/dist/client/constants/contextWindows.js +0 -295
- package/dist/client/constants/enums.js +0 -853
- package/dist/client/constants/index.js +0 -207
- package/dist/client/constants/performance.js +0 -389
- package/dist/client/constants/retry.js +0 -266
- package/dist/client/constants/timeouts.js +0 -182
- package/dist/client/constants/tokens.js +0 -380
- package/dist/client/constants/videoErrors.js +0 -46
- package/dist/client/context/budgetChecker.js +0 -98
- package/dist/client/context/contextCompactor.js +0 -205
- package/dist/client/context/emergencyTruncation.js +0 -88
- package/dist/client/context/errorDetection.js +0 -171
- package/dist/client/context/errors.js +0 -21
- package/dist/client/context/fileTokenBudget.js +0 -127
- package/dist/client/context/prompts/summarizationPrompt.js +0 -117
- package/dist/client/context/stages/fileReadDeduplicator.js +0 -66
- package/dist/client/context/stages/slidingWindowTruncator.js +0 -190
- package/dist/client/context/stages/structuredSummarizer.js +0 -99
- package/dist/client/context/stages/toolOutputPruner.js +0 -52
- package/dist/client/context/summarizationEngine.js +0 -136
- package/dist/client/context/toolOutputLimits.js +0 -78
- package/dist/client/context/toolPairRepair.js +0 -66
- package/dist/client/core/analytics.js +0 -88
- package/dist/client/core/baseProvider.js +0 -1385
- package/dist/client/core/constants.js +0 -140
- package/dist/client/core/conversationMemoryFactory.js +0 -141
- package/dist/client/core/conversationMemoryInitializer.js +0 -128
- package/dist/client/core/conversationMemoryManager.js +0 -344
- package/dist/client/core/dynamicModels.js +0 -358
- package/dist/client/core/evaluation.js +0 -309
- package/dist/client/core/evaluationProviders.js +0 -248
- package/dist/client/core/factory.js +0 -412
- package/dist/client/core/infrastructure/baseError.js +0 -22
- package/dist/client/core/infrastructure/baseFactory.js +0 -54
- package/dist/client/core/infrastructure/baseRegistry.js +0 -53
- package/dist/client/core/infrastructure/index.js +0 -5
- package/dist/client/core/infrastructure/retry.js +0 -20
- package/dist/client/core/infrastructure/typedEventEmitter.js +0 -23
- package/dist/client/core/modelConfiguration.js +0 -851
- package/dist/client/core/modules/GenerationHandler.js +0 -588
- package/dist/client/core/modules/MessageBuilder.js +0 -273
- package/dist/client/core/modules/StreamHandler.js +0 -185
- package/dist/client/core/modules/TelemetryHandler.js +0 -203
- package/dist/client/core/modules/ToolsManager.js +0 -499
- package/dist/client/core/modules/Utilities.js +0 -331
- package/dist/client/core/redisConversationMemoryManager.js +0 -1435
- package/dist/client/core/streamAnalytics.js +0 -131
- package/dist/client/evaluation/contextBuilder.js +0 -134
- package/dist/client/evaluation/index.js +0 -61
- package/dist/client/evaluation/prompts.js +0 -73
- package/dist/client/evaluation/ragasEvaluator.js +0 -110
- package/dist/client/evaluation/retryManager.js +0 -78
- package/dist/client/evaluation/scoring.js +0 -61
- package/dist/client/factories/providerFactory.js +0 -166
- package/dist/client/factories/providerRegistry.js +0 -166
- package/dist/client/features/ppt/constants.js +0 -896
- package/dist/client/features/ppt/contentPlanner.js +0 -529
- package/dist/client/features/ppt/presentationOrchestrator.js +0 -236
- package/dist/client/features/ppt/slideGenerator.js +0 -532
- package/dist/client/features/ppt/slideRenderers.js +0 -2383
- package/dist/client/features/ppt/slideTypeInference.js +0 -405
- package/dist/client/features/ppt/types.js +0 -13
- package/dist/client/features/ppt/utils.js +0 -443
- package/dist/client/files/fileReferenceRegistry.js +0 -1543
- package/dist/client/files/fileTools.js +0 -450
- package/dist/client/files/streamingReader.js +0 -321
- package/dist/client/files/types.js +0 -23
- package/dist/client/hitl/hitlErrors.js +0 -54
- package/dist/client/hitl/hitlManager.js +0 -460
- package/dist/client/mcp/agentExposure.js +0 -356
- package/dist/client/mcp/auth/index.js +0 -11
- package/dist/client/mcp/auth/oauthClientProvider.js +0 -325
- package/dist/client/mcp/auth/tokenStorage.js +0 -134
- package/dist/client/mcp/batching/index.js +0 -10
- package/dist/client/mcp/batching/requestBatcher.js +0 -441
- package/dist/client/mcp/caching/index.js +0 -10
- package/dist/client/mcp/caching/toolCache.js +0 -433
- package/dist/client/mcp/elicitation/elicitationManager.js +0 -376
- package/dist/client/mcp/elicitation/index.js +0 -11
- package/dist/client/mcp/elicitation/types.js +0 -10
- package/dist/client/mcp/elicitationProtocol.js +0 -375
- package/dist/client/mcp/enhancedToolDiscovery.js +0 -481
- package/dist/client/mcp/externalServerManager.js +0 -1478
- package/dist/client/mcp/factory.js +0 -161
- package/dist/client/mcp/flexibleToolValidator.js +0 -161
- package/dist/client/mcp/httpRateLimiter.js +0 -391
- package/dist/client/mcp/httpRetryHandler.js +0 -178
- package/dist/client/mcp/index.js +0 -74
- package/dist/client/mcp/mcpCircuitBreaker.js +0 -427
- package/dist/client/mcp/mcpClientFactory.js +0 -708
- package/dist/client/mcp/mcpRegistryClient.js +0 -488
- package/dist/client/mcp/mcpServerBase.js +0 -373
- package/dist/client/mcp/multiServerManager.js +0 -579
- package/dist/client/mcp/registry.js +0 -158
- package/dist/client/mcp/routing/index.js +0 -10
- package/dist/client/mcp/routing/toolRouter.js +0 -416
- package/dist/client/mcp/serverCapabilities.js +0 -502
- package/dist/client/mcp/servers/agent/directToolsServer.js +0 -150
- package/dist/client/mcp/toolAnnotations.js +0 -239
- package/dist/client/mcp/toolConverter.js +0 -258
- package/dist/client/mcp/toolDiscoveryService.js +0 -798
- package/dist/client/mcp/toolIntegration.js +0 -334
- package/dist/client/mcp/toolRegistry.js +0 -729
- package/dist/client/memory/hippocampusInitializer.js +0 -19
- package/dist/client/memory/memoryRetrievalTools.js +0 -166
- package/dist/client/middleware/builtin/analytics.js +0 -132
- package/dist/client/middleware/builtin/autoEvaluation.js +0 -203
- package/dist/client/middleware/builtin/guardrails.js +0 -109
- package/dist/client/middleware/builtin/lifecycle.js +0 -168
- package/dist/client/middleware/factory.js +0 -327
- package/dist/client/middleware/registry.js +0 -295
- package/dist/client/middleware/utils/guardrailsUtils.js +0 -396
- package/dist/client/models/anthropicModels.js +0 -527
- package/dist/client/neurolink.js +0 -8233
- package/dist/client/observability/exporterRegistry.js +0 -413
- package/dist/client/observability/exporters/arizeExporter.js +0 -138
- package/dist/client/observability/exporters/baseExporter.js +0 -190
- package/dist/client/observability/exporters/braintrustExporter.js +0 -154
- package/dist/client/observability/exporters/datadogExporter.js +0 -196
- package/dist/client/observability/exporters/laminarExporter.js +0 -302
- package/dist/client/observability/exporters/langfuseExporter.js +0 -209
- package/dist/client/observability/exporters/langsmithExporter.js +0 -143
- package/dist/client/observability/exporters/otelExporter.js +0 -164
- package/dist/client/observability/exporters/posthogExporter.js +0 -287
- package/dist/client/observability/exporters/sentryExporter.js +0 -165
- package/dist/client/observability/index.js +0 -31
- package/dist/client/observability/metricsAggregator.js +0 -556
- package/dist/client/observability/otelBridge.js +0 -131
- package/dist/client/observability/retryPolicy.js +0 -383
- package/dist/client/observability/sampling/samplers.js +0 -216
- package/dist/client/observability/spanProcessor.js +0 -303
- package/dist/client/observability/tokenTracker.js +0 -413
- package/dist/client/observability/types/exporterTypes.js +0 -5
- package/dist/client/observability/types/index.js +0 -4
- package/dist/client/observability/types/spanTypes.js +0 -92
- package/dist/client/observability/utils/safeMetadata.js +0 -25
- package/dist/client/observability/utils/spanSerializer.js +0 -292
- package/dist/client/processors/archive/ArchiveProcessor.js +0 -1308
- package/dist/client/processors/base/BaseFileProcessor.js +0 -614
- package/dist/client/processors/base/types.js +0 -82
- package/dist/client/processors/config/fileTypes.js +0 -520
- package/dist/client/processors/config/index.js +0 -92
- package/dist/client/processors/config/languageMap.js +0 -410
- package/dist/client/processors/config/mimeTypes.js +0 -363
- package/dist/client/processors/config/sizeLimits.js +0 -258
- package/dist/client/processors/document/ExcelProcessor.js +0 -590
- package/dist/client/processors/document/OpenDocumentProcessor.js +0 -212
- package/dist/client/processors/document/PptxProcessor.js +0 -157
- package/dist/client/processors/document/RtfProcessor.js +0 -361
- package/dist/client/processors/document/WordProcessor.js +0 -353
- package/dist/client/processors/errors/FileErrorCode.js +0 -255
- package/dist/client/processors/errors/errorHelpers.js +0 -386
- package/dist/client/processors/errors/errorSerializer.js +0 -507
- package/dist/client/processors/errors/index.js +0 -49
- package/dist/client/processors/markup/SvgProcessor.js +0 -240
- package/dist/client/processors/media/AudioProcessor.js +0 -707
- package/dist/client/processors/media/VideoProcessor.js +0 -1045
- package/dist/client/providers/amazonBedrock.js +0 -1512
- package/dist/client/providers/amazonSagemaker.js +0 -162
- package/dist/client/providers/anthropic.js +0 -831
- package/dist/client/providers/azureOpenai.js +0 -143
- package/dist/client/providers/googleAiStudio.js +0 -1200
- package/dist/client/providers/googleNativeGemini3.js +0 -543
- package/dist/client/providers/googleVertex.js +0 -2936
- package/dist/client/providers/huggingFace.js +0 -315
- package/dist/client/providers/litellm.js +0 -488
- package/dist/client/providers/mistral.js +0 -157
- package/dist/client/providers/ollama.js +0 -1579
- package/dist/client/providers/openAI.js +0 -627
- package/dist/client/providers/openRouter.js +0 -543
- package/dist/client/providers/openaiCompatible.js +0 -290
- package/dist/client/providers/providerTypeUtils.js +0 -46
- package/dist/client/providers/sagemaker/adaptive-semaphore.js +0 -215
- package/dist/client/providers/sagemaker/client.js +0 -472
- package/dist/client/providers/sagemaker/config.js +0 -317
- package/dist/client/providers/sagemaker/detection.js +0 -606
- package/dist/client/providers/sagemaker/error-constants.js +0 -227
- package/dist/client/providers/sagemaker/errors.js +0 -299
- package/dist/client/providers/sagemaker/language-model.js +0 -775
- package/dist/client/providers/sagemaker/parsers.js +0 -634
- package/dist/client/providers/sagemaker/streaming.js +0 -331
- package/dist/client/providers/sagemaker/structured-parser.js +0 -625
- package/dist/client/proxy/accountQuota.js +0 -162
- package/dist/client/proxy/claudeFormat.js +0 -595
- package/dist/client/proxy/modelRouter.js +0 -29
- package/dist/client/proxy/oauthFetch.js +0 -367
- package/dist/client/proxy/proxyFetch.js +0 -586
- package/dist/client/proxy/requestLogger.js +0 -207
- package/dist/client/proxy/tokenRefresh.js +0 -124
- package/dist/client/proxy/usageStats.js +0 -74
- package/dist/client/proxy/utils/noProxyUtils.js +0 -149
- package/dist/client/rag/ChunkerFactory.js +0 -320
- package/dist/client/rag/ChunkerRegistry.js +0 -421
- package/dist/client/rag/chunkers/BaseChunker.js +0 -143
- package/dist/client/rag/chunkers/CharacterChunker.js +0 -28
- package/dist/client/rag/chunkers/HTMLChunker.js +0 -38
- package/dist/client/rag/chunkers/JSONChunker.js +0 -68
- package/dist/client/rag/chunkers/LaTeXChunker.js +0 -63
- package/dist/client/rag/chunkers/MarkdownChunker.js +0 -306
- package/dist/client/rag/chunkers/RecursiveChunker.js +0 -139
- package/dist/client/rag/chunkers/SemanticMarkdownChunker.js +0 -138
- package/dist/client/rag/chunkers/SentenceChunker.js +0 -66
- package/dist/client/rag/chunkers/TokenChunker.js +0 -61
- package/dist/client/rag/chunkers/index.js +0 -15
- package/dist/client/rag/chunking/characterChunker.js +0 -142
- package/dist/client/rag/chunking/chunkerRegistry.js +0 -194
- package/dist/client/rag/chunking/htmlChunker.js +0 -247
- package/dist/client/rag/chunking/index.js +0 -17
- package/dist/client/rag/chunking/jsonChunker.js +0 -281
- package/dist/client/rag/chunking/latexChunker.js +0 -251
- package/dist/client/rag/chunking/markdownChunker.js +0 -373
- package/dist/client/rag/chunking/recursiveChunker.js +0 -148
- package/dist/client/rag/chunking/semanticChunker.js +0 -306
- package/dist/client/rag/chunking/sentenceChunker.js +0 -230
- package/dist/client/rag/chunking/tokenChunker.js +0 -183
- package/dist/client/rag/document/MDocument.js +0 -392
- package/dist/client/rag/document/index.js +0 -5
- package/dist/client/rag/document/loaders.js +0 -500
- package/dist/client/rag/errors/RAGError.js +0 -274
- package/dist/client/rag/errors/index.js +0 -6
- package/dist/client/rag/graphRag/graphRAG.js +0 -401
- package/dist/client/rag/graphRag/index.js +0 -4
- package/dist/client/rag/index.js +0 -141
- package/dist/client/rag/metadata/MetadataExtractorFactory.js +0 -418
- package/dist/client/rag/metadata/MetadataExtractorRegistry.js +0 -362
- package/dist/client/rag/metadata/index.js +0 -9
- package/dist/client/rag/metadata/metadataExtractor.js +0 -280
- package/dist/client/rag/pipeline/RAGPipeline.js +0 -436
- package/dist/client/rag/pipeline/contextAssembly.js +0 -341
- package/dist/client/rag/pipeline/index.js +0 -5
- package/dist/client/rag/ragIntegration.js +0 -321
- package/dist/client/rag/reranker/RerankerFactory.js +0 -430
- package/dist/client/rag/reranker/RerankerRegistry.js +0 -402
- package/dist/client/rag/reranker/index.js +0 -9
- package/dist/client/rag/reranker/reranker.js +0 -277
- package/dist/client/rag/resilience/CircuitBreaker.js +0 -431
- package/dist/client/rag/resilience/RetryHandler.js +0 -304
- package/dist/client/rag/resilience/index.js +0 -7
- package/dist/client/rag/retrieval/hybridSearch.js +0 -335
- package/dist/client/rag/retrieval/index.js +0 -5
- package/dist/client/rag/retrieval/vectorQueryTool.js +0 -307
- package/dist/client/rag/types.js +0 -8
- package/dist/client/sdk/toolRegistration.js +0 -377
- package/dist/client/server/abstract/baseServerAdapter.js +0 -575
- package/dist/client/server/adapters/expressAdapter.js +0 -486
- package/dist/client/server/adapters/fastifyAdapter.js +0 -472
- package/dist/client/server/adapters/honoAdapter.js +0 -632
- package/dist/client/server/adapters/koaAdapter.js +0 -510
- package/dist/client/server/errors.js +0 -486
- package/dist/client/server/factory/serverAdapterFactory.js +0 -160
- package/dist/client/server/index.js +0 -108
- package/dist/client/server/middleware/abortSignal.js +0 -111
- package/dist/client/server/middleware/auth.js +0 -388
- package/dist/client/server/middleware/cache.js +0 -359
- package/dist/client/server/middleware/common.js +0 -281
- package/dist/client/server/middleware/deprecation.js +0 -190
- package/dist/client/server/middleware/mcpBodyAttachment.js +0 -63
- package/dist/client/server/middleware/rateLimit.js +0 -227
- package/dist/client/server/middleware/validation.js +0 -388
- package/dist/client/server/openapi/generator.js +0 -398
- package/dist/client/server/openapi/index.js +0 -36
- package/dist/client/server/openapi/schemas.js +0 -695
- package/dist/client/server/openapi/templates.js +0 -374
- package/dist/client/server/routes/agentRoutes.js +0 -189
- package/dist/client/server/routes/claudeProxyRoutes.js +0 -1600
- package/dist/client/server/routes/healthRoutes.js +0 -187
- package/dist/client/server/routes/index.js +0 -57
- package/dist/client/server/routes/mcpRoutes.js +0 -342
- package/dist/client/server/routes/memoryRoutes.js +0 -350
- package/dist/client/server/routes/openApiRoutes.js +0 -126
- package/dist/client/server/routes/toolRoutes.js +0 -199
- package/dist/client/server/streaming/dataStream.js +0 -486
- package/dist/client/server/streaming/index.js +0 -11
- package/dist/client/server/types.js +0 -67
- package/dist/client/server/utils/redaction.js +0 -334
- package/dist/client/server/utils/validation.js +0 -243
- package/dist/client/server/websocket/WebSocketHandler.js +0 -383
- package/dist/client/server/websocket/index.js +0 -4
- package/dist/client/services/server/ai/observability/instrumentation.js +0 -808
- package/dist/client/telemetry/attributes.js +0 -100
- package/dist/client/telemetry/index.js +0 -26
- package/dist/client/telemetry/telemetryService.js +0 -308
- package/dist/client/telemetry/tracers.js +0 -17
- package/dist/client/telemetry/withSpan.js +0 -34
- package/dist/client/types/actionTypes.js +0 -6
- package/dist/client/types/analytics.js +0 -5
- package/dist/client/types/authTypes.js +0 -9
- package/dist/client/types/circuitBreakerErrors.js +0 -34
- package/dist/client/types/cli.js +0 -21
- package/dist/client/types/clientTypes.js +0 -10
- package/dist/client/types/common.js +0 -51
- package/dist/client/types/configTypes.js +0 -49
- package/dist/client/types/content.js +0 -19
- package/dist/client/types/contextTypes.js +0 -400
- package/dist/client/types/conversation.js +0 -47
- package/dist/client/types/conversationMemoryInterface.js +0 -6
- package/dist/client/types/domainTypes.js +0 -5
- package/dist/client/types/errors.js +0 -167
- package/dist/client/types/evaluation.js +0 -5
- package/dist/client/types/evaluationProviders.js +0 -5
- package/dist/client/types/evaluationTypes.js +0 -1
- package/dist/client/types/externalMcp.js +0 -6
- package/dist/client/types/fileReferenceTypes.js +0 -8
- package/dist/client/types/fileTypes.js +0 -4
- package/dist/client/types/generateTypes.js +0 -1
- package/dist/client/types/guardrails.js +0 -1
- package/dist/client/types/hitlTypes.js +0 -8
- package/dist/client/types/index.js +0 -57
- package/dist/client/types/mcpTypes.js +0 -5
- package/dist/client/types/middlewareTypes.js +0 -1
- package/dist/client/types/modelTypes.js +0 -30
- package/dist/client/types/multimodal.js +0 -135
- package/dist/client/types/observability.js +0 -6
- package/dist/client/types/pptTypes.js +0 -82
- package/dist/client/types/providers.js +0 -111
- package/dist/client/types/proxyTypes.js +0 -16
- package/dist/client/types/ragTypes.js +0 -7
- package/dist/client/types/sdkTypes.js +0 -8
- package/dist/client/types/serviceTypes.js +0 -5
- package/dist/client/types/streamTypes.js +0 -1
- package/dist/client/types/subscriptionTypes.js +0 -9
- package/dist/client/types/taskClassificationTypes.js +0 -5
- package/dist/client/types/tools.js +0 -24
- package/dist/client/types/ttsTypes.js +0 -57
- package/dist/client/types/typeAliases.js +0 -48
- package/dist/client/types/utilities.js +0 -4
- package/dist/client/types/workflowTypes.js +0 -30
- package/dist/client/utils/async/withTimeout.js +0 -98
- package/dist/client/utils/asyncMutex.js +0 -60
- package/dist/client/utils/conversationMemory.js +0 -431
- package/dist/client/utils/csvProcessor.js +0 -846
- package/dist/client/utils/errorHandling.js +0 -936
- package/dist/client/utils/evaluationUtils.js +0 -131
- package/dist/client/utils/factoryProcessing.js +0 -589
- package/dist/client/utils/fileDetector.js +0 -2161
- package/dist/client/utils/imageCache.js +0 -376
- package/dist/client/utils/imageProcessor.js +0 -704
- package/dist/client/utils/logger.js +0 -491
- package/dist/client/utils/mcpDefaults.js +0 -134
- package/dist/client/utils/messageBuilder.js +0 -1653
- package/dist/client/utils/modelAliasResolver.js +0 -54
- package/dist/client/utils/modelDetection.js +0 -80
- package/dist/client/utils/modelRouter.js +0 -292
- package/dist/client/utils/multimodalOptionsBuilder.js +0 -65
- package/dist/client/utils/observabilityHelpers.js +0 -47
- package/dist/client/utils/parameterValidation.js +0 -966
- package/dist/client/utils/pdfProcessor.js +0 -410
- package/dist/client/utils/performance.js +0 -222
- package/dist/client/utils/pricing.js +0 -340
- package/dist/client/utils/promptRedaction.js +0 -62
- package/dist/client/utils/providerConfig.js +0 -1009
- package/dist/client/utils/providerHealth.js +0 -1237
- package/dist/client/utils/providerRetry.js +0 -112
- package/dist/client/utils/providerUtils.js +0 -434
- package/dist/client/utils/rateLimiter.js +0 -200
- package/dist/client/utils/redis.js +0 -368
- package/dist/client/utils/retryHandler.js +0 -269
- package/dist/client/utils/retryability.js +0 -22
- package/dist/client/utils/sanitizers/svg.js +0 -481
- package/dist/client/utils/schemaConversion.js +0 -255
- package/dist/client/utils/taskClassificationUtils.js +0 -149
- package/dist/client/utils/taskClassifier.js +0 -94
- package/dist/client/utils/thinkingConfig.js +0 -104
- package/dist/client/utils/timeout.js +0 -359
- package/dist/client/utils/tokenEstimation.js +0 -142
- package/dist/client/utils/tokenLimits.js +0 -125
- package/dist/client/utils/tokenUtils.js +0 -239
- package/dist/client/utils/toolUtils.js +0 -75
- package/dist/client/utils/transformationUtils.js +0 -554
- package/dist/client/utils/ttsProcessor.js +0 -286
- package/dist/client/utils/typeUtils.js +0 -97
- package/dist/client/utils/videoAnalysisProcessor.js +0 -67
- package/dist/client/workflow/config.js +0 -398
- package/dist/client/workflow/core/ensembleExecutor.js +0 -407
- package/dist/client/workflow/core/judgeScorer.js +0 -544
- package/dist/client/workflow/core/responseConditioner.js +0 -225
- package/dist/client/workflow/core/types/conditionerTypes.js +0 -7
- package/dist/client/workflow/core/types/ensembleTypes.js +0 -7
- package/dist/client/workflow/core/types/index.js +0 -7
- package/dist/client/workflow/core/types/judgeTypes.js +0 -7
- package/dist/client/workflow/core/types/layerTypes.js +0 -7
- package/dist/client/workflow/core/types/registryTypes.js +0 -7
- package/dist/client/workflow/core/workflowRegistry.js +0 -304
- package/dist/client/workflow/core/workflowRunner.js +0 -586
- package/dist/client/workflow/index.js +0 -50
- package/dist/client/workflow/types.js +0 -9
- package/dist/client/workflow/utils/types/index.js +0 -7
- package/dist/client/workflow/utils/workflowMetrics.js +0 -311
- package/dist/client/workflow/utils/workflowValidation.js +0 -420
- package/dist/client/workflow/workflows/adaptiveWorkflow.js +0 -366
- package/dist/client/workflow/workflows/consensusWorkflow.js +0 -192
- package/dist/client/workflow/workflows/fallbackWorkflow.js +0 -225
- package/dist/client/workflow/workflows/multiJudgeWorkflow.js +0 -351
- /package/dist/client/{client/reactHooks.js → reactHooks.js} +0 -0
|
@@ -1,205 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ContextCompactor
|
|
3
|
-
*
|
|
4
|
-
* Orchestrates multi-stage context reduction:
|
|
5
|
-
*
|
|
6
|
-
* Stage 1: Tool Output Pruning (cheapest -- no LLM call)
|
|
7
|
-
* Stage 2: File Read Deduplication (cheap -- no LLM call)
|
|
8
|
-
* Stage 3: LLM Summarization (expensive -- requires LLM call)
|
|
9
|
-
* Stage 4: Sliding Window Truncation (fallback -- no LLM call)
|
|
10
|
-
*/
|
|
11
|
-
import { estimateMessagesTokens } from "../utils/tokenEstimation.js";
|
|
12
|
-
import { logger } from "../utils/logger.js";
|
|
13
|
-
import { withTimeout } from "../utils/async/withTimeout.js";
|
|
14
|
-
import { SpanSerializer, SpanType, SpanStatus, } from "../observability/index.js";
|
|
15
|
-
import { getMetricsAggregator } from "../observability/index.js";
|
|
16
|
-
import { pruneToolOutputs } from "./stages/toolOutputPruner.js";
|
|
17
|
-
import { deduplicateFileReads } from "./stages/fileReadDeduplicator.js";
|
|
18
|
-
import { truncateWithSlidingWindow } from "./stages/slidingWindowTruncator.js";
|
|
19
|
-
import { summarizeMessages } from "./stages/structuredSummarizer.js";
|
|
20
|
-
const DEFAULT_CONFIG = {
|
|
21
|
-
enablePrune: true,
|
|
22
|
-
enableDeduplicate: true,
|
|
23
|
-
enableSummarize: true,
|
|
24
|
-
enableTruncate: true,
|
|
25
|
-
pruneProtectTokens: 40_000,
|
|
26
|
-
pruneMinimumSavings: 20_000,
|
|
27
|
-
pruneProtectedTools: ["skill"],
|
|
28
|
-
summarizationProvider: "vertex",
|
|
29
|
-
summarizationModel: "gemini-2.5-flash",
|
|
30
|
-
keepRecentRatio: 0.3,
|
|
31
|
-
truncationFraction: 0.5,
|
|
32
|
-
provider: "",
|
|
33
|
-
};
|
|
34
|
-
export class ContextCompactor {
|
|
35
|
-
config;
|
|
36
|
-
constructor(config) {
|
|
37
|
-
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Run the multi-stage compaction pipeline until messages fit within budget.
|
|
41
|
-
*/
|
|
42
|
-
async compact(messages, targetTokens, memoryConfig, requestId) {
|
|
43
|
-
let span = SpanSerializer.createSpan(SpanType.CONTEXT_COMPACTION, "context.compact", {
|
|
44
|
-
"context.operation": "compact",
|
|
45
|
-
"context.targetTokens": targetTokens,
|
|
46
|
-
});
|
|
47
|
-
const spanStartTime = Date.now();
|
|
48
|
-
try {
|
|
49
|
-
const provider = this.config.provider || undefined;
|
|
50
|
-
const tokensBefore = estimateMessagesTokens(messages, provider);
|
|
51
|
-
const stagesUsed = [];
|
|
52
|
-
let currentMessages = [...messages];
|
|
53
|
-
logger.info("[Compaction] Starting", {
|
|
54
|
-
requestId,
|
|
55
|
-
estimatedTokens: tokensBefore,
|
|
56
|
-
budgetTokens: targetTokens,
|
|
57
|
-
});
|
|
58
|
-
// Stage 1: Tool Output Pruning
|
|
59
|
-
if (this.config.enablePrune &&
|
|
60
|
-
estimateMessagesTokens(currentMessages, provider) > targetTokens) {
|
|
61
|
-
const stageTokensBefore = estimateMessagesTokens(currentMessages, provider);
|
|
62
|
-
const pruneResult = pruneToolOutputs(currentMessages, {
|
|
63
|
-
protectTokens: this.config.pruneProtectTokens,
|
|
64
|
-
minimumSavings: this.config.pruneMinimumSavings,
|
|
65
|
-
protectedTools: this.config.pruneProtectedTools,
|
|
66
|
-
provider,
|
|
67
|
-
});
|
|
68
|
-
if (pruneResult.pruned) {
|
|
69
|
-
currentMessages = pruneResult.messages;
|
|
70
|
-
stagesUsed.push("prune");
|
|
71
|
-
}
|
|
72
|
-
const stageTokensAfter = estimateMessagesTokens(currentMessages, provider);
|
|
73
|
-
logger.info("[Compaction] Stage 1 (prune)", {
|
|
74
|
-
requestId,
|
|
75
|
-
ran: pruneResult.pruned,
|
|
76
|
-
tokensBefore: stageTokensBefore,
|
|
77
|
-
tokensAfter: stageTokensAfter,
|
|
78
|
-
saved: stageTokensBefore - stageTokensAfter,
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
// Stage 2: File Read Deduplication
|
|
82
|
-
if (this.config.enableDeduplicate &&
|
|
83
|
-
estimateMessagesTokens(currentMessages, provider) > targetTokens) {
|
|
84
|
-
const stageTokensBefore = estimateMessagesTokens(currentMessages, provider);
|
|
85
|
-
const dedupResult = deduplicateFileReads(currentMessages);
|
|
86
|
-
if (dedupResult.deduplicated) {
|
|
87
|
-
currentMessages = dedupResult.messages;
|
|
88
|
-
stagesUsed.push("deduplicate");
|
|
89
|
-
}
|
|
90
|
-
const stageTokensAfter = estimateMessagesTokens(currentMessages, provider);
|
|
91
|
-
logger.info("[Compaction] Stage 2 (deduplicate)", {
|
|
92
|
-
requestId,
|
|
93
|
-
ran: dedupResult.deduplicated,
|
|
94
|
-
tokensBefore: stageTokensBefore,
|
|
95
|
-
tokensAfter: stageTokensAfter,
|
|
96
|
-
saved: stageTokensBefore - stageTokensAfter,
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
// Stage 3: LLM Summarization
|
|
100
|
-
if (this.config.enableSummarize &&
|
|
101
|
-
estimateMessagesTokens(currentMessages, provider) > targetTokens) {
|
|
102
|
-
const stageTokensBefore = estimateMessagesTokens(currentMessages, provider);
|
|
103
|
-
try {
|
|
104
|
-
const summarizeResult = await withTimeout(summarizeMessages(currentMessages, {
|
|
105
|
-
provider: this.config.summarizationProvider,
|
|
106
|
-
model: this.config.summarizationModel,
|
|
107
|
-
keepRecentRatio: this.config.keepRecentRatio,
|
|
108
|
-
memoryConfig,
|
|
109
|
-
targetTokens,
|
|
110
|
-
}), 120_000, "LLM summarization timed out after 120s");
|
|
111
|
-
if (summarizeResult.summarized) {
|
|
112
|
-
currentMessages = summarizeResult.messages;
|
|
113
|
-
stagesUsed.push("summarize");
|
|
114
|
-
}
|
|
115
|
-
const stageTokensAfter = estimateMessagesTokens(currentMessages, provider);
|
|
116
|
-
logger.info("[Compaction] Stage 3 (summarize)", {
|
|
117
|
-
requestId,
|
|
118
|
-
ran: summarizeResult.summarized,
|
|
119
|
-
tokensBefore: stageTokensBefore,
|
|
120
|
-
tokensAfter: stageTokensAfter,
|
|
121
|
-
saved: stageTokensBefore - stageTokensAfter,
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
catch (error) {
|
|
125
|
-
const err = error instanceof Error ? error : new Error(String(error));
|
|
126
|
-
logger.warn("[Compaction] Stage 3 (summarize) FAILED", {
|
|
127
|
-
requestId,
|
|
128
|
-
error: err.message,
|
|
129
|
-
errorName: err.name,
|
|
130
|
-
tokensBefore: stageTokensBefore,
|
|
131
|
-
tokensAfter: stageTokensBefore,
|
|
132
|
-
saved: 0,
|
|
133
|
-
});
|
|
134
|
-
// Record failure on the compaction span for trace visibility
|
|
135
|
-
span = SpanSerializer.updateAttributes(span, {
|
|
136
|
-
"compaction.stage3.error": err.message,
|
|
137
|
-
"compaction.stage3.errorName": err.name,
|
|
138
|
-
"compaction.stage3.tokensBefore": stageTokensBefore,
|
|
139
|
-
"compaction.stage3_failed": true,
|
|
140
|
-
});
|
|
141
|
-
// Fall through to Stage 4 truncation as before
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
// Stage 4: Sliding Window Truncation (fallback)
|
|
145
|
-
if (this.config.enableTruncate &&
|
|
146
|
-
estimateMessagesTokens(currentMessages, provider) > targetTokens) {
|
|
147
|
-
const stageTokensBefore = estimateMessagesTokens(currentMessages, provider);
|
|
148
|
-
const truncResult = truncateWithSlidingWindow(currentMessages, {
|
|
149
|
-
fraction: this.config.truncationFraction,
|
|
150
|
-
currentTokens: stageTokensBefore,
|
|
151
|
-
targetTokens: targetTokens,
|
|
152
|
-
provider: provider,
|
|
153
|
-
adaptiveBuffer: 0.15,
|
|
154
|
-
maxIterations: 3,
|
|
155
|
-
});
|
|
156
|
-
if (truncResult.truncated) {
|
|
157
|
-
currentMessages = truncResult.messages;
|
|
158
|
-
stagesUsed.push("truncate");
|
|
159
|
-
}
|
|
160
|
-
const stageTokensAfter = estimateMessagesTokens(currentMessages, provider);
|
|
161
|
-
logger.info("[Compaction] Stage 4 (truncate)", {
|
|
162
|
-
requestId,
|
|
163
|
-
ran: truncResult.truncated,
|
|
164
|
-
tokensBefore: stageTokensBefore,
|
|
165
|
-
tokensAfter: stageTokensAfter,
|
|
166
|
-
saved: stageTokensBefore - stageTokensAfter,
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
const tokensAfter = estimateMessagesTokens(currentMessages, provider);
|
|
170
|
-
logger.info("[Compaction] Complete", {
|
|
171
|
-
requestId,
|
|
172
|
-
tokensBefore,
|
|
173
|
-
tokensAfter,
|
|
174
|
-
totalSaved: tokensBefore - tokensAfter,
|
|
175
|
-
stagesUsed,
|
|
176
|
-
durationMs: Date.now() - spanStartTime,
|
|
177
|
-
});
|
|
178
|
-
const result = {
|
|
179
|
-
compacted: stagesUsed.length > 0,
|
|
180
|
-
stagesUsed,
|
|
181
|
-
tokensBefore,
|
|
182
|
-
tokensAfter,
|
|
183
|
-
tokensSaved: tokensBefore - tokensAfter,
|
|
184
|
-
messages: currentMessages,
|
|
185
|
-
};
|
|
186
|
-
span.durationMs = Date.now() - spanStartTime;
|
|
187
|
-
const endedSpan = SpanSerializer.endSpan(SpanSerializer.updateAttributes(span, {
|
|
188
|
-
"context.stage": stagesUsed.join(",") || "none",
|
|
189
|
-
"context.tokensBefore": tokensBefore,
|
|
190
|
-
"context.tokensAfter": tokensAfter,
|
|
191
|
-
"context.tokensSaved": tokensBefore - tokensAfter,
|
|
192
|
-
}), SpanStatus.OK);
|
|
193
|
-
getMetricsAggregator().recordSpan(endedSpan);
|
|
194
|
-
return result;
|
|
195
|
-
}
|
|
196
|
-
catch (error) {
|
|
197
|
-
span.durationMs = Date.now() - spanStartTime;
|
|
198
|
-
const endedSpan = SpanSerializer.endSpan(span, SpanStatus.ERROR);
|
|
199
|
-
endedSpan.statusMessage =
|
|
200
|
-
error instanceof Error ? error.message : String(error);
|
|
201
|
-
getMetricsAggregator().recordSpan(endedSpan);
|
|
202
|
-
throw error;
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
}
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Emergency Content Truncation
|
|
3
|
-
*
|
|
4
|
-
* When message-level removal (sliding window) can't fit context into budget,
|
|
5
|
-
* this truncates the CONTENT of the longest messages as a last resort.
|
|
6
|
-
*/
|
|
7
|
-
import { estimateTokens, estimateMessagesTokens, truncateToTokenBudget, } from "../utils/tokenEstimation.js";
|
|
8
|
-
import { logger } from "../utils/logger.js";
|
|
9
|
-
/**
|
|
10
|
-
* Emergency content truncation: truncate the content of the longest messages
|
|
11
|
-
* to fit within the available token budget.
|
|
12
|
-
*
|
|
13
|
-
* Strategy: Sort messages by content length (descending), truncate each
|
|
14
|
-
* to a proportional share of the available budget until total fits.
|
|
15
|
-
*/
|
|
16
|
-
export function emergencyContentTruncation(messages, availableTokensForHistory, breakdown, provider) {
|
|
17
|
-
// Budget available for conversation history specifically
|
|
18
|
-
const historyBudget = availableTokensForHistory -
|
|
19
|
-
breakdown.systemPrompt -
|
|
20
|
-
breakdown.currentPrompt -
|
|
21
|
-
breakdown.toolDefinitions -
|
|
22
|
-
breakdown.fileAttachments;
|
|
23
|
-
if (historyBudget <= 0) {
|
|
24
|
-
// No room for history: return empty to guarantee budget safety
|
|
25
|
-
return [];
|
|
26
|
-
}
|
|
27
|
-
const currentHistoryTokens = estimateMessagesTokens(messages, provider);
|
|
28
|
-
if (currentHistoryTokens <= historyBudget) {
|
|
29
|
-
return messages; // Already fits
|
|
30
|
-
}
|
|
31
|
-
// Calculate per-message budgets proportional to original size,
|
|
32
|
-
// but cap large messages to free space for others
|
|
33
|
-
const result = [...messages];
|
|
34
|
-
const reductionNeeded = currentHistoryTokens - historyBudget;
|
|
35
|
-
const reductionRatio = reductionNeeded / currentHistoryTokens;
|
|
36
|
-
// Sort indices by content length descending (truncate biggest first)
|
|
37
|
-
const sortedIndices = result
|
|
38
|
-
.map((msg, idx) => ({ idx, len: msg.content.length }))
|
|
39
|
-
.sort((a, b) => b.len - a.len);
|
|
40
|
-
let tokensSaved = 0;
|
|
41
|
-
for (const { idx } of sortedIndices) {
|
|
42
|
-
if (tokensSaved >= reductionNeeded) {
|
|
43
|
-
break;
|
|
44
|
-
}
|
|
45
|
-
const msg = result[idx];
|
|
46
|
-
// Don't truncate system messages or very short messages
|
|
47
|
-
if (msg.role === "system" || msg.content.length < 200) {
|
|
48
|
-
continue;
|
|
49
|
-
}
|
|
50
|
-
const msgTokens = estimateTokens(msg.content, provider);
|
|
51
|
-
const targetTokens = Math.floor(msgTokens * (1 - reductionRatio - 0.05));
|
|
52
|
-
if (targetTokens < msgTokens && targetTokens > 50) {
|
|
53
|
-
const truncated = truncateToTokenBudget(msg.content, targetTokens, provider);
|
|
54
|
-
if (truncated.truncated) {
|
|
55
|
-
const savedThisMsg = msgTokens - estimateTokens(truncated.text, provider);
|
|
56
|
-
tokensSaved += savedThisMsg;
|
|
57
|
-
result[idx] = {
|
|
58
|
-
...msg,
|
|
59
|
-
content: truncated.text,
|
|
60
|
-
metadata: { ...msg.metadata, truncated: true },
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
logger.info("[EmergencyTruncation] Content truncation complete", {
|
|
66
|
-
tokensSaved,
|
|
67
|
-
reductionNeeded,
|
|
68
|
-
messagesModified: result.filter((m, i) => m !== messages[i]).length,
|
|
69
|
-
});
|
|
70
|
-
// Final safety check: guarantee returned history fits budget
|
|
71
|
-
if (estimateMessagesTokens(result, provider) <= historyBudget) {
|
|
72
|
-
return result;
|
|
73
|
-
}
|
|
74
|
-
// Hard fallback: keep newest non-system messages that fit
|
|
75
|
-
const fallback = [];
|
|
76
|
-
for (let i = result.length - 1; i >= 0; i--) {
|
|
77
|
-
const msg = result[i];
|
|
78
|
-
if (msg.role === "system") {
|
|
79
|
-
continue;
|
|
80
|
-
}
|
|
81
|
-
fallback.unshift(msg);
|
|
82
|
-
if (estimateMessagesTokens(fallback, provider) > historyBudget) {
|
|
83
|
-
fallback.shift();
|
|
84
|
-
break;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
return fallback;
|
|
88
|
-
}
|
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Context Overflow Error Detection
|
|
3
|
-
*
|
|
4
|
-
* Cross-provider regex patterns to detect context window overflow errors.
|
|
5
|
-
* Modeled on Cline + pi-mono patterns.
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* Provider-specific error patterns for context overflow.
|
|
9
|
-
*
|
|
10
|
-
* IMPORTANT: Order matters for getContextOverflowProvider - more specific
|
|
11
|
-
* patterns should be checked first. OpenAI patterns are very specific
|
|
12
|
-
* (e.g., "This model's maximum context length is") so they come first.
|
|
13
|
-
*/
|
|
14
|
-
const OVERFLOW_PATTERNS = [
|
|
15
|
-
{
|
|
16
|
-
provider: "openai",
|
|
17
|
-
patterns: [
|
|
18
|
-
/This model's maximum context length is/i,
|
|
19
|
-
/tokens\. However, (?:your messages|you requested)/i,
|
|
20
|
-
/reduce the length of the messages/i,
|
|
21
|
-
/Please reduce the length/i,
|
|
22
|
-
],
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
provider: "azure",
|
|
26
|
-
patterns: [/content_length_exceeded/i],
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
provider: "google",
|
|
30
|
-
patterns: [
|
|
31
|
-
/RESOURCE_EXHAUSTED/i,
|
|
32
|
-
/exceeds the maximum number of tokens/i,
|
|
33
|
-
/content is too long/i,
|
|
34
|
-
/request payload size exceeds/i,
|
|
35
|
-
/input token limit/i,
|
|
36
|
-
],
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
provider: "bedrock",
|
|
40
|
-
patterns: [
|
|
41
|
-
/ValidationException.*token/i,
|
|
42
|
-
/Input is too long/i,
|
|
43
|
-
/exceeds the model's maximum/i,
|
|
44
|
-
],
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
provider: "mistral",
|
|
48
|
-
patterns: [/context length exceeded/i, /maximum number of tokens/i],
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
provider: "openrouter",
|
|
52
|
-
patterns: [/context_length_exceeded/i],
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
provider: "anthropic",
|
|
56
|
-
patterns: [
|
|
57
|
-
/prompt is too long/i,
|
|
58
|
-
/input is too long/i,
|
|
59
|
-
/too many tokens/i,
|
|
60
|
-
/maximum context length/i,
|
|
61
|
-
],
|
|
62
|
-
},
|
|
63
|
-
];
|
|
64
|
-
/**
|
|
65
|
-
* Check if an error is a context overflow error from any provider.
|
|
66
|
-
*/
|
|
67
|
-
export function isContextOverflowError(error) {
|
|
68
|
-
const errorMessage = extractErrorMessage(error);
|
|
69
|
-
if (!errorMessage) {
|
|
70
|
-
return false;
|
|
71
|
-
}
|
|
72
|
-
return OVERFLOW_PATTERNS.some(({ patterns }) => patterns.some((pattern) => pattern.test(errorMessage)));
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Identify which provider produced the context overflow error.
|
|
76
|
-
*/
|
|
77
|
-
export function getContextOverflowProvider(error) {
|
|
78
|
-
const errorMessage = extractErrorMessage(error);
|
|
79
|
-
if (!errorMessage) {
|
|
80
|
-
return null;
|
|
81
|
-
}
|
|
82
|
-
for (const { provider, patterns } of OVERFLOW_PATTERNS) {
|
|
83
|
-
if (patterns.some((pattern) => pattern.test(errorMessage))) {
|
|
84
|
-
return provider;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
return null;
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Extract actual token counts from provider overflow error messages.
|
|
91
|
-
*
|
|
92
|
-
* Many providers include the actual/max token counts in their error messages:
|
|
93
|
-
* - OpenAI: "This model's maximum context length is 128000 tokens. However, your messages resulted in 145000 tokens."
|
|
94
|
-
* - Anthropic: "prompt is too long: 180000 tokens > 200000 token limit"
|
|
95
|
-
* - Google: "exceeds the maximum number of tokens (180000 > 100000)"
|
|
96
|
-
*/
|
|
97
|
-
export function parseProviderOverflowDetails(error) {
|
|
98
|
-
const message = extractErrorMessage(error);
|
|
99
|
-
if (!message) {
|
|
100
|
-
return null;
|
|
101
|
-
}
|
|
102
|
-
// Guard against excessively long inputs that could slow regex matching
|
|
103
|
-
if (message.length > 2000) {
|
|
104
|
-
return null;
|
|
105
|
-
}
|
|
106
|
-
// OpenAI pattern: "resulted in X tokens" + "maximum context length is Y"
|
|
107
|
-
// Use single character-class number groups to prevent ReDoS (CodeQL: js/polynomial-redos)
|
|
108
|
-
const openaiActual = message.match(/resulted\s+in\s+(\d[\d,]{0,19})\s*tokens/i);
|
|
109
|
-
const openaiMax = message.match(/maximum\s+context\s+length\s+is\s+(\d[\d,]{0,19})/i);
|
|
110
|
-
if (openaiActual && openaiMax) {
|
|
111
|
-
return {
|
|
112
|
-
actualTokens: parseInt(openaiActual[1].replace(/,/g, ""), 10),
|
|
113
|
-
budgetTokens: parseInt(openaiMax[1].replace(/,/g, ""), 10),
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
// Anthropic pattern: "X tokens > Y token limit" or "X tokens, limit Y"
|
|
117
|
-
// Use single character-class number groups to prevent ReDoS (CodeQL: js/polynomial-redos)
|
|
118
|
-
const anthropicMatch = message.match(/(\d[\d,]{0,19})\s*tokens?\s*[>:]\s*(\d[\d,]{0,19})/i);
|
|
119
|
-
if (anthropicMatch) {
|
|
120
|
-
return {
|
|
121
|
-
actualTokens: parseInt(anthropicMatch[1].replace(/,/g, ""), 10),
|
|
122
|
-
budgetTokens: parseInt(anthropicMatch[2].replace(/,/g, ""), 10),
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
// Google pattern: "X > Y" or "X exceeds Y"
|
|
126
|
-
// Use single character-class number groups to prevent ReDoS (CodeQL: js/polynomial-redos)
|
|
127
|
-
const googleMatch = message.match(/(\d[\d,]{0,19})\s*(?:>|exceeds)\s*(\d[\d,]{0,19})/i);
|
|
128
|
-
if (googleMatch) {
|
|
129
|
-
return {
|
|
130
|
-
actualTokens: parseInt(googleMatch[1].replace(/,/g, ""), 10),
|
|
131
|
-
budgetTokens: parseInt(googleMatch[2].replace(/,/g, ""), 10),
|
|
132
|
-
};
|
|
133
|
-
}
|
|
134
|
-
return null;
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* Extract error message from various error formats.
|
|
138
|
-
*/
|
|
139
|
-
export function extractErrorMessage(error) {
|
|
140
|
-
if (!error) {
|
|
141
|
-
return null;
|
|
142
|
-
}
|
|
143
|
-
if (typeof error === "string") {
|
|
144
|
-
return error;
|
|
145
|
-
}
|
|
146
|
-
if (error instanceof Error) {
|
|
147
|
-
// Check nested error messages too
|
|
148
|
-
const msg = error.message;
|
|
149
|
-
const cause = error?.cause;
|
|
150
|
-
if (cause instanceof Error) {
|
|
151
|
-
return `${msg} ${cause.message}`;
|
|
152
|
-
}
|
|
153
|
-
return msg;
|
|
154
|
-
}
|
|
155
|
-
if (typeof error === "object") {
|
|
156
|
-
const obj = error;
|
|
157
|
-
if (typeof obj.message === "string") {
|
|
158
|
-
return obj.message;
|
|
159
|
-
}
|
|
160
|
-
if (typeof obj.error === "string") {
|
|
161
|
-
return obj.error;
|
|
162
|
-
}
|
|
163
|
-
if (typeof obj.error === "object" && obj.error !== null) {
|
|
164
|
-
const nested = obj.error;
|
|
165
|
-
if (typeof nested.message === "string") {
|
|
166
|
-
return nested.message;
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
return null;
|
|
171
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Context-specific error classes for budget and overflow scenarios.
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Thrown when context exceeds model budget after all compaction stages,
|
|
6
|
-
* preventing wasteful API calls to providers that will reject the request.
|
|
7
|
-
*/
|
|
8
|
-
export class ContextBudgetExceededError extends Error {
|
|
9
|
-
estimatedTokens;
|
|
10
|
-
availableTokens;
|
|
11
|
-
stagesUsed;
|
|
12
|
-
breakdown;
|
|
13
|
-
constructor(message, details) {
|
|
14
|
-
super(message);
|
|
15
|
-
this.name = "ContextBudgetExceededError";
|
|
16
|
-
this.estimatedTokens = details.estimatedTokens;
|
|
17
|
-
this.availableTokens = details.availableTokens;
|
|
18
|
-
this.stagesUsed = details.stagesUsed;
|
|
19
|
-
this.breakdown = details.breakdown;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* File Token Budget System
|
|
3
|
-
*
|
|
4
|
-
* Calculates how much of the remaining context window budget
|
|
5
|
-
* can be used for file reads. Implements fast-path for small files
|
|
6
|
-
* and preview mode for very large files.
|
|
7
|
-
*/
|
|
8
|
-
/** Percentage of remaining context to allocate for file reads */
|
|
9
|
-
export const FILE_READ_BUDGET_PERCENT = 0.6;
|
|
10
|
-
/** Files below this size skip budget validation (100KB) */
|
|
11
|
-
export const FILE_FAST_PATH_SIZE = 100 * 1024;
|
|
12
|
-
/** Files above this size get preview-only mode (5MB) */
|
|
13
|
-
export const FILE_PREVIEW_MODE_SIZE = 5 * 1024 * 1024;
|
|
14
|
-
/** Default preview size in characters */
|
|
15
|
-
export const FILE_PREVIEW_CHARS = 2000;
|
|
16
|
-
/**
|
|
17
|
-
* Calculate available token budget for file reads.
|
|
18
|
-
*
|
|
19
|
-
* @param contextWindow - Total context window for the model
|
|
20
|
-
* @param currentTokens - Tokens already used (conversation + system prompt)
|
|
21
|
-
* @param maxOutputTokens - Reserved output tokens
|
|
22
|
-
* @returns Available tokens for file content
|
|
23
|
-
*/
|
|
24
|
-
export function calculateFileTokenBudget(contextWindow, currentTokens, maxOutputTokens) {
|
|
25
|
-
const remainingTokens = contextWindow - currentTokens - maxOutputTokens;
|
|
26
|
-
if (remainingTokens <= 0) {
|
|
27
|
-
return 0;
|
|
28
|
-
}
|
|
29
|
-
return Math.floor(remainingTokens * FILE_READ_BUDGET_PERCENT);
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Determine how a file should be handled based on its size and the budget.
|
|
33
|
-
*/
|
|
34
|
-
export function shouldTruncateFile(fileSize, budget) {
|
|
35
|
-
// Very large files: preview mode
|
|
36
|
-
if (fileSize > FILE_PREVIEW_MODE_SIZE) {
|
|
37
|
-
return {
|
|
38
|
-
shouldTruncate: true,
|
|
39
|
-
maxChars: FILE_PREVIEW_CHARS,
|
|
40
|
-
previewMode: true,
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
// Small files: skip validation
|
|
44
|
-
if (fileSize < FILE_FAST_PATH_SIZE) {
|
|
45
|
-
return { shouldTruncate: false };
|
|
46
|
-
}
|
|
47
|
-
// Estimate tokens (4 chars per token, rough)
|
|
48
|
-
const estimatedTokens = Math.ceil(fileSize / 4);
|
|
49
|
-
if (estimatedTokens <= budget) {
|
|
50
|
-
return { shouldTruncate: false };
|
|
51
|
-
}
|
|
52
|
-
// Truncate to fit budget
|
|
53
|
-
const maxChars = budget * 4; // Convert back to chars
|
|
54
|
-
return {
|
|
55
|
-
shouldTruncate: true,
|
|
56
|
-
maxChars: Math.max(FILE_PREVIEW_CHARS, maxChars),
|
|
57
|
-
previewMode: false,
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Estimate post-processing token count based on file type.
|
|
62
|
-
*
|
|
63
|
-
* Different file types produce vastly different amounts of text after
|
|
64
|
-
* processing. A 50 MB video file yields ~200-500 tokens of metadata,
|
|
65
|
-
* while a 50 MB text file yields ~12.5 M tokens. Using the raw byte
|
|
66
|
-
* size for all types causes media files to be wrongly excluded by the
|
|
67
|
-
* aggregate budget check.
|
|
68
|
-
*
|
|
69
|
-
* @param sizeBytes Raw file size in bytes
|
|
70
|
-
* @param fileType Detected file type (e.g. "video", "audio", "image")
|
|
71
|
-
* @returns Estimated token count after processing
|
|
72
|
-
*/
|
|
73
|
-
export function estimatePostProcessingTokens(sizeBytes, fileType) {
|
|
74
|
-
switch (fileType) {
|
|
75
|
-
// Media files produce only metadata text (~100-500 tokens)
|
|
76
|
-
case "video":
|
|
77
|
-
return 500;
|
|
78
|
-
case "audio":
|
|
79
|
-
return 300;
|
|
80
|
-
// Images are sent as base64 — provider counts them as ~1500 tokens each
|
|
81
|
-
case "image":
|
|
82
|
-
return 1500;
|
|
83
|
-
// Archives produce a file listing (~500-2000 tokens)
|
|
84
|
-
case "archive":
|
|
85
|
-
return 1000;
|
|
86
|
-
// Unknown binary files produce metadata + extracted strings (~200-1000 tokens)
|
|
87
|
-
case "unknown":
|
|
88
|
-
return 500;
|
|
89
|
-
// PDFs are sent natively on some providers; estimate ~1 token per 100 bytes, capped
|
|
90
|
-
case "pdf":
|
|
91
|
-
return Math.min(Math.ceil(sizeBytes / 100), 50_000);
|
|
92
|
-
// Structured documents (Excel, Word, PPTX) extract text — roughly 15% of raw size
|
|
93
|
-
case "xlsx":
|
|
94
|
-
case "docx":
|
|
95
|
-
case "pptx":
|
|
96
|
-
return Math.ceil((sizeBytes * 0.15) / 4);
|
|
97
|
-
// SVG is sanitized markup — usually small
|
|
98
|
-
case "svg":
|
|
99
|
-
return Math.ceil(sizeBytes / 4);
|
|
100
|
-
// CSV, text, code — raw text roughly 1 token per 4 bytes
|
|
101
|
-
case "csv":
|
|
102
|
-
case "text":
|
|
103
|
-
default:
|
|
104
|
-
// Original formula: base64-inflate then divide by 4
|
|
105
|
-
return Math.ceil((sizeBytes * 1.33) / 4);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
export function enforceAggregateFileBudget(files, availableTokens) {
|
|
109
|
-
const TOKEN_BUDGET_FOR_FILES = Math.floor(availableTokens * FILE_READ_BUDGET_PERCENT);
|
|
110
|
-
let usedTokens = 0;
|
|
111
|
-
const included = [];
|
|
112
|
-
const excluded = [];
|
|
113
|
-
const notices = [];
|
|
114
|
-
const sorted = [...files].sort((a, b) => a.sizeBytes - b.sizeBytes);
|
|
115
|
-
for (const file of sorted) {
|
|
116
|
-
const estimatedTokens = estimatePostProcessingTokens(file.sizeBytes, file.fileType);
|
|
117
|
-
if (usedTokens + estimatedTokens <= TOKEN_BUDGET_FOR_FILES) {
|
|
118
|
-
usedTokens += estimatedTokens;
|
|
119
|
-
included.push(file);
|
|
120
|
-
}
|
|
121
|
-
else {
|
|
122
|
-
excluded.push(file);
|
|
123
|
-
notices.push(`Skipped "${file.name}" (${(file.sizeBytes / 1024).toFixed(0)} KB) — exceeds context budget`);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
return { included, excluded, notices };
|
|
127
|
-
}
|