@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,359 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Timeout utilities for NeuroLink
|
|
3
|
-
*
|
|
4
|
-
* Provides flexible timeout parsing and error handling for AI operations.
|
|
5
|
-
* Supports multiple time formats: milliseconds, seconds, minutes, hours.
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* Custom error class for timeout operations
|
|
9
|
-
*/
|
|
10
|
-
export class TimeoutError extends Error {
|
|
11
|
-
timeout;
|
|
12
|
-
provider;
|
|
13
|
-
operation;
|
|
14
|
-
constructor(message, timeout, provider, operation) {
|
|
15
|
-
super(message);
|
|
16
|
-
this.timeout = timeout;
|
|
17
|
-
this.provider = provider;
|
|
18
|
-
this.operation = operation;
|
|
19
|
-
this.name = "TimeoutError";
|
|
20
|
-
// Maintains proper stack trace for where error was thrown
|
|
21
|
-
if (typeof Error.captureStackTrace === "function") {
|
|
22
|
-
Error.captureStackTrace(this, TimeoutError);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Parse timeout value from various formats
|
|
28
|
-
* @param timeout - Can be number (ms), string with unit, or undefined
|
|
29
|
-
* @returns Parsed timeout in milliseconds or undefined
|
|
30
|
-
* @throws Error if format is invalid
|
|
31
|
-
*
|
|
32
|
-
* Examples:
|
|
33
|
-
* - parseTimeout(5000) => 5000
|
|
34
|
-
* - parseTimeout('30s') => 30000
|
|
35
|
-
* - parseTimeout('2m') => 120000
|
|
36
|
-
* - parseTimeout('1.5h') => 5400000
|
|
37
|
-
* - parseTimeout(undefined) => undefined
|
|
38
|
-
*/
|
|
39
|
-
export function parseTimeout(timeout) {
|
|
40
|
-
if (timeout === undefined) {
|
|
41
|
-
return undefined;
|
|
42
|
-
}
|
|
43
|
-
if (typeof timeout === "number") {
|
|
44
|
-
if (timeout <= 0) {
|
|
45
|
-
throw new Error(`Timeout must be positive, got: ${timeout}`);
|
|
46
|
-
}
|
|
47
|
-
return timeout; // Assume milliseconds
|
|
48
|
-
}
|
|
49
|
-
if (typeof timeout === "string") {
|
|
50
|
-
// Match number (including decimals) followed by optional unit
|
|
51
|
-
const match = timeout.match(/^(\d+(?:\.\d+)?)(ms|s|m|h)?$/);
|
|
52
|
-
if (!match) {
|
|
53
|
-
throw new Error(`Invalid timeout format: ${timeout}. Use formats like '30s', '2m', '500ms', or '1.5h'`);
|
|
54
|
-
}
|
|
55
|
-
const value = parseFloat(match[1]);
|
|
56
|
-
if (value <= 0) {
|
|
57
|
-
throw new Error(`Timeout must be positive, got: ${value}`);
|
|
58
|
-
}
|
|
59
|
-
const unit = match[2] || "ms";
|
|
60
|
-
switch (unit) {
|
|
61
|
-
case "ms":
|
|
62
|
-
return value;
|
|
63
|
-
case "s":
|
|
64
|
-
return value * 1000;
|
|
65
|
-
case "m":
|
|
66
|
-
return value * 60 * 1000;
|
|
67
|
-
case "h":
|
|
68
|
-
return value * 60 * 60 * 1000;
|
|
69
|
-
default:
|
|
70
|
-
return value; // Should never reach here due to regex
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
throw new Error(`Invalid timeout type: ${typeof timeout}`);
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Default timeout configurations for different providers and operations
|
|
77
|
-
*/
|
|
78
|
-
export const DEFAULT_TIMEOUTS = {
|
|
79
|
-
global: "30s", // Default for all providers
|
|
80
|
-
streaming: "2m", // Longer timeout for streaming operations
|
|
81
|
-
providers: {
|
|
82
|
-
openai: "30s", // OpenAI typically responds quickly
|
|
83
|
-
bedrock: "45s", // AWS can be slower, especially for cold starts
|
|
84
|
-
vertex: "60s", // Google Cloud can be slower
|
|
85
|
-
anthropic: "60s", // Increased timeout for Anthropic API stability
|
|
86
|
-
azure: "30s", // Azure OpenAI similar to OpenAI
|
|
87
|
-
"google-ai": "30s", // Google AI Studio is fast
|
|
88
|
-
huggingface: "2m", // Open source models vary significantly
|
|
89
|
-
ollama: "5m", // Local models need more time, especially large ones
|
|
90
|
-
mistral: "45s", // Mistral AI moderate speed
|
|
91
|
-
},
|
|
92
|
-
tools: {
|
|
93
|
-
default: "10s", // Default timeout for MCP tool execution
|
|
94
|
-
filesystem: "5s", // File operations should be quick
|
|
95
|
-
network: "30s", // Network requests might take longer
|
|
96
|
-
computation: "2m", // Heavy computation tools need more time
|
|
97
|
-
},
|
|
98
|
-
};
|
|
99
|
-
/**
|
|
100
|
-
* Get default timeout for a specific provider
|
|
101
|
-
* @param provider - Provider name
|
|
102
|
-
* @param operation - Operation type (generate or stream)
|
|
103
|
-
* @returns Default timeout string
|
|
104
|
-
*/
|
|
105
|
-
export function getDefaultTimeout(provider, operation = "generate") {
|
|
106
|
-
if (operation === "stream") {
|
|
107
|
-
return DEFAULT_TIMEOUTS.streaming;
|
|
108
|
-
}
|
|
109
|
-
const providerKey = provider.toLowerCase().replace("_", "-");
|
|
110
|
-
return (DEFAULT_TIMEOUTS.providers[providerKey] || DEFAULT_TIMEOUTS.global);
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Create a timeout promise that rejects after specified duration
|
|
114
|
-
* @param timeout - Timeout duration
|
|
115
|
-
* @param provider - Provider name for error message
|
|
116
|
-
* @param operation - Operation type for error message
|
|
117
|
-
* @returns Promise that rejects with TimeoutError
|
|
118
|
-
*/
|
|
119
|
-
export function createTimeoutPromise(timeout, provider, operation) {
|
|
120
|
-
const timeoutMs = parseTimeout(timeout);
|
|
121
|
-
if (!timeoutMs) {
|
|
122
|
-
return null; // No timeout
|
|
123
|
-
}
|
|
124
|
-
return new Promise((_, reject) => {
|
|
125
|
-
const timer = setTimeout(() => {
|
|
126
|
-
reject(new TimeoutError(`${provider} ${operation} operation timed out after ${timeout}`, timeoutMs, provider, operation));
|
|
127
|
-
}, timeoutMs);
|
|
128
|
-
// Unref the timer so it doesn't keep the process alive (Node.js only)
|
|
129
|
-
if (typeof timer === "object" &&
|
|
130
|
-
timer &&
|
|
131
|
-
"unref" in timer &&
|
|
132
|
-
typeof timer.unref === "function") {
|
|
133
|
-
timer.unref();
|
|
134
|
-
}
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Enhanced timeout manager with proper cleanup and abort controller integration
|
|
139
|
-
* Consolidated from timeout-manager.ts
|
|
140
|
-
*/
|
|
141
|
-
export class TimeoutManager {
|
|
142
|
-
activeTimeouts = new Map();
|
|
143
|
-
/**
|
|
144
|
-
* Execute operation with timeout and proper cleanup
|
|
145
|
-
*/
|
|
146
|
-
async executeWithTimeout(operation, config) {
|
|
147
|
-
const startTime = Date.now();
|
|
148
|
-
const operationId = this.generateOperationId(config.operation);
|
|
149
|
-
let retriesUsed = 0;
|
|
150
|
-
const maxRetries = config.retryOnTimeout ? (config.maxRetries ?? 1) : 0;
|
|
151
|
-
while (retriesUsed <= maxRetries) {
|
|
152
|
-
try {
|
|
153
|
-
const result = await this.performSingleOperation(operation, config, operationId);
|
|
154
|
-
return {
|
|
155
|
-
success: true,
|
|
156
|
-
data: result,
|
|
157
|
-
timedOut: false,
|
|
158
|
-
executionTime: Date.now() - startTime,
|
|
159
|
-
retriesUsed,
|
|
160
|
-
};
|
|
161
|
-
}
|
|
162
|
-
catch (error) {
|
|
163
|
-
this.cleanup(operationId);
|
|
164
|
-
if (error instanceof TimeoutError && retriesUsed < maxRetries) {
|
|
165
|
-
retriesUsed++;
|
|
166
|
-
continue;
|
|
167
|
-
}
|
|
168
|
-
return {
|
|
169
|
-
success: false,
|
|
170
|
-
error: error instanceof Error ? error : new Error(String(error)),
|
|
171
|
-
timedOut: error instanceof TimeoutError,
|
|
172
|
-
executionTime: Date.now() - startTime,
|
|
173
|
-
retriesUsed,
|
|
174
|
-
};
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
return {
|
|
178
|
-
success: false,
|
|
179
|
-
error: new Error("Maximum retries exceeded"),
|
|
180
|
-
timedOut: true,
|
|
181
|
-
executionTime: Date.now() - startTime,
|
|
182
|
-
retriesUsed,
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
|
-
async performSingleOperation(operation, config, operationId) {
|
|
186
|
-
const timeoutMs = this.getTimeoutMs(config);
|
|
187
|
-
if (!timeoutMs) {
|
|
188
|
-
return await operation();
|
|
189
|
-
}
|
|
190
|
-
const controller = new AbortController();
|
|
191
|
-
const existingSignal = config.abortSignal;
|
|
192
|
-
if (existingSignal) {
|
|
193
|
-
existingSignal.addEventListener("abort", () => {
|
|
194
|
-
controller.abort(existingSignal.reason);
|
|
195
|
-
});
|
|
196
|
-
if (existingSignal.aborted) {
|
|
197
|
-
throw new Error("Operation aborted before execution");
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
const timeoutPromise = this.createTimeoutPromise(timeoutMs, operationId);
|
|
201
|
-
this.registerTimeout(operationId, timeoutPromise.timer, controller, () => {
|
|
202
|
-
clearTimeout(timeoutPromise.timer);
|
|
203
|
-
});
|
|
204
|
-
try {
|
|
205
|
-
return await Promise.race([operation(), timeoutPromise.promise]);
|
|
206
|
-
}
|
|
207
|
-
finally {
|
|
208
|
-
this.cleanup(operationId);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
getTimeoutMs(config) {
|
|
212
|
-
return parseTimeout(config.timeout);
|
|
213
|
-
}
|
|
214
|
-
generateOperationId(operation) {
|
|
215
|
-
return `${operation}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
216
|
-
}
|
|
217
|
-
createTimeoutPromise(timeoutMs, _operationId) {
|
|
218
|
-
let timer;
|
|
219
|
-
const promise = new Promise((_, reject) => {
|
|
220
|
-
timer = setTimeout(() => {
|
|
221
|
-
reject(new TimeoutError(`Operation timeout after ${timeoutMs}ms`, timeoutMs));
|
|
222
|
-
}, timeoutMs);
|
|
223
|
-
});
|
|
224
|
-
if (!timer) {
|
|
225
|
-
throw new Error("Failed to create timeout timer");
|
|
226
|
-
}
|
|
227
|
-
return { promise, timer };
|
|
228
|
-
}
|
|
229
|
-
registerTimeout(operationId, timer, controller, cleanup) {
|
|
230
|
-
this.activeTimeouts.set(operationId, { timer, controller, cleanup });
|
|
231
|
-
}
|
|
232
|
-
cleanup(operationId) {
|
|
233
|
-
const timeoutInfo = this.activeTimeouts.get(operationId);
|
|
234
|
-
if (timeoutInfo) {
|
|
235
|
-
timeoutInfo.cleanup();
|
|
236
|
-
this.activeTimeouts.delete(operationId);
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
gracefulShutdown() {
|
|
240
|
-
for (const [operationId] of this.activeTimeouts) {
|
|
241
|
-
this.cleanup(operationId);
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
/**
|
|
246
|
-
* Wrapper functions consolidated from timeout-wrapper.ts
|
|
247
|
-
*/
|
|
248
|
-
/**
|
|
249
|
-
* Wrap a promise with timeout
|
|
250
|
-
* @param promise - The promise to wrap
|
|
251
|
-
* @param timeout - Timeout duration (number in ms or string with unit)
|
|
252
|
-
* @param provider - Provider name for error messages
|
|
253
|
-
* @param operation - Operation type (generate or stream)
|
|
254
|
-
* @returns The result of the promise or throws TimeoutError
|
|
255
|
-
*/
|
|
256
|
-
export async function withTimeout(promise, timeout, provider, operation) {
|
|
257
|
-
const timeoutMs = parseTimeout(timeout);
|
|
258
|
-
if (!timeoutMs) {
|
|
259
|
-
return promise;
|
|
260
|
-
}
|
|
261
|
-
const timeoutPromise = new Promise((_, reject) => {
|
|
262
|
-
setTimeout(() => {
|
|
263
|
-
reject(new TimeoutError(`${provider} ${operation} operation timed out after ${timeoutMs}ms`, timeoutMs, provider, operation));
|
|
264
|
-
}, timeoutMs);
|
|
265
|
-
});
|
|
266
|
-
return Promise.race([promise, timeoutPromise]);
|
|
267
|
-
}
|
|
268
|
-
/**
|
|
269
|
-
* Wrap a streaming async generator with timeout
|
|
270
|
-
* @param generator - The async generator to wrap
|
|
271
|
-
* @param timeout - Timeout duration for the entire stream
|
|
272
|
-
* @param provider - Provider name for error messages
|
|
273
|
-
* @returns Wrapped async generator that respects timeout
|
|
274
|
-
*/
|
|
275
|
-
export async function* withStreamingTimeout(generator, timeout, provider) {
|
|
276
|
-
const timeoutMs = parseTimeout(timeout);
|
|
277
|
-
if (!timeoutMs) {
|
|
278
|
-
yield* generator;
|
|
279
|
-
return;
|
|
280
|
-
}
|
|
281
|
-
let timeoutId;
|
|
282
|
-
const timeoutPromise = new Promise((_, reject) => {
|
|
283
|
-
timeoutId = setTimeout(() => {
|
|
284
|
-
reject(new TimeoutError(`${provider} streaming operation timed out after ${timeoutMs}ms`, timeoutMs, provider, "stream"));
|
|
285
|
-
}, timeoutMs);
|
|
286
|
-
});
|
|
287
|
-
try {
|
|
288
|
-
for await (const item of generator) {
|
|
289
|
-
const raceResult = await Promise.race([
|
|
290
|
-
Promise.resolve(item),
|
|
291
|
-
timeoutPromise,
|
|
292
|
-
]);
|
|
293
|
-
yield raceResult;
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
finally {
|
|
297
|
-
if (timeoutId) {
|
|
298
|
-
clearTimeout(timeoutId);
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
/**
|
|
303
|
-
* Create an abort controller with timeout
|
|
304
|
-
* @param timeout - Timeout duration
|
|
305
|
-
* @param provider - Provider name for error messages
|
|
306
|
-
* @param operation - Operation type
|
|
307
|
-
* @returns AbortController and cleanup function
|
|
308
|
-
*/
|
|
309
|
-
export function createTimeoutController(timeout, provider, operation) {
|
|
310
|
-
const timeoutMs = parseTimeout(timeout);
|
|
311
|
-
if (!timeoutMs) {
|
|
312
|
-
return null;
|
|
313
|
-
}
|
|
314
|
-
const controller = new AbortController();
|
|
315
|
-
const timer = setTimeout(() => {
|
|
316
|
-
controller.abort(new TimeoutError(`${provider} ${operation} operation timed out after ${timeout}`, timeoutMs, provider, operation));
|
|
317
|
-
}, timeoutMs);
|
|
318
|
-
const cleanup = () => {
|
|
319
|
-
clearTimeout(timer);
|
|
320
|
-
};
|
|
321
|
-
return { controller, cleanup, timeoutMs };
|
|
322
|
-
}
|
|
323
|
-
/**
|
|
324
|
-
* Compose an external abort signal with a timeout controller's signal.
|
|
325
|
-
* Returns a single AbortSignal that fires when either signal aborts.
|
|
326
|
-
* If only one signal is present, returns it directly without wrapping.
|
|
327
|
-
*
|
|
328
|
-
* @param externalSignal - User-provided AbortSignal (e.g., from options.abortSignal)
|
|
329
|
-
* @param timeoutSignal - Timeout controller's signal
|
|
330
|
-
* @returns Combined AbortSignal, or undefined if neither is present
|
|
331
|
-
*/
|
|
332
|
-
export function composeAbortSignals(externalSignal, timeoutSignal) {
|
|
333
|
-
if (externalSignal && timeoutSignal) {
|
|
334
|
-
return AbortSignal.any([externalSignal, timeoutSignal]);
|
|
335
|
-
}
|
|
336
|
-
return externalSignal ?? timeoutSignal;
|
|
337
|
-
}
|
|
338
|
-
/**
|
|
339
|
-
* Merge abort signals (for combining user abort with timeout)
|
|
340
|
-
* @param signals - Array of abort signals to merge
|
|
341
|
-
* @returns Combined abort controller
|
|
342
|
-
*/
|
|
343
|
-
export function mergeAbortSignals(signals) {
|
|
344
|
-
const controller = new AbortController();
|
|
345
|
-
for (const signal of signals) {
|
|
346
|
-
if (signal && !signal.aborted) {
|
|
347
|
-
signal.addEventListener("abort", () => {
|
|
348
|
-
if (!controller.signal.aborted) {
|
|
349
|
-
controller.abort(signal.reason);
|
|
350
|
-
}
|
|
351
|
-
});
|
|
352
|
-
}
|
|
353
|
-
if (signal?.aborted) {
|
|
354
|
-
controller.abort(signal.reason);
|
|
355
|
-
break;
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
return controller;
|
|
359
|
-
}
|
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Token Estimation Utilities
|
|
3
|
-
*
|
|
4
|
-
* Provides character-based token estimation with per-provider adjustment
|
|
5
|
-
* multipliers. Uses the same approach as Continue (gpt-tokenizer baseline
|
|
6
|
-
* + provider multipliers) but without requiring a tokenizer dependency.
|
|
7
|
-
*
|
|
8
|
-
* Multiplier sources: Continue project's getAdjustedTokenCount.ts
|
|
9
|
-
* - Anthropic: 1.23x (Anthropic tokenizer produces ~23% more tokens)
|
|
10
|
-
* - Google (AI Studio / Vertex): 1.18x
|
|
11
|
-
* - Mistral/Codestral: 1.26x
|
|
12
|
-
* - OpenAI/GPT: 1.0x (baseline)
|
|
13
|
-
*/
|
|
14
|
-
/** Characters per token for English text */
|
|
15
|
-
export const CHARS_PER_TOKEN = 4;
|
|
16
|
-
/** Characters per token for code */
|
|
17
|
-
export const CODE_CHARS_PER_TOKEN = 3;
|
|
18
|
-
/**
|
|
19
|
-
* Safety margin: additive fraction of baseTokens added to the provider-adjusted estimate.
|
|
20
|
-
* Using additive margin prevents compounding with provider multipliers.
|
|
21
|
-
*
|
|
22
|
-
* Old behavior: baseTokens * providerMultiplier * 1.15 (compounding)
|
|
23
|
-
* e.g. Anthropic: baseTokens * 1.23 * 1.15 = baseTokens * 1.4145
|
|
24
|
-
* New behavior: baseTokens * providerMultiplier + baseTokens * 0.05 (additive)
|
|
25
|
-
* e.g. Anthropic: baseTokens * 1.23 + baseTokens * 0.05 = baseTokens * 1.28
|
|
26
|
-
*/
|
|
27
|
-
export const TOKEN_SAFETY_MARGIN_ADDITIVE = 0.05;
|
|
28
|
-
/** @deprecated Use TOKEN_SAFETY_MARGIN_ADDITIVE instead. Kept for backward compatibility. */
|
|
29
|
-
export const TOKEN_SAFETY_MARGIN = 1.15;
|
|
30
|
-
/** Message framing overhead in tokens (role + delimiters) */
|
|
31
|
-
export const TOKENS_PER_MESSAGE = 4;
|
|
32
|
-
/** Conversation-level overhead in tokens */
|
|
33
|
-
export const TOKENS_PER_CONVERSATION = 24;
|
|
34
|
-
/** Image token estimate (flat) */
|
|
35
|
-
export const IMAGE_TOKEN_ESTIMATE = 1_024;
|
|
36
|
-
/**
|
|
37
|
-
* Per-provider token multipliers.
|
|
38
|
-
* Applied on top of the base GPT-style character estimate.
|
|
39
|
-
*/
|
|
40
|
-
const PROVIDER_MULTIPLIERS = {
|
|
41
|
-
anthropic: 1.23,
|
|
42
|
-
"google-ai": 1.18,
|
|
43
|
-
vertex: 1.18,
|
|
44
|
-
mistral: 1.26,
|
|
45
|
-
openai: 1.0,
|
|
46
|
-
azure: 1.0,
|
|
47
|
-
bedrock: 1.23, // Bedrock is mostly Anthropic models
|
|
48
|
-
ollama: 1.0,
|
|
49
|
-
litellm: 1.0,
|
|
50
|
-
huggingface: 1.0,
|
|
51
|
-
sagemaker: 1.0,
|
|
52
|
-
};
|
|
53
|
-
/**
|
|
54
|
-
* Get the token multiplier for a given provider.
|
|
55
|
-
*/
|
|
56
|
-
export function getProviderMultiplier(provider) {
|
|
57
|
-
if (!provider) {
|
|
58
|
-
return 1.0;
|
|
59
|
-
}
|
|
60
|
-
return PROVIDER_MULTIPLIERS[provider] ?? 1.0;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Estimate token count for a string.
|
|
64
|
-
*
|
|
65
|
-
* @param text - Input text
|
|
66
|
-
* @param provider - Optional provider for multiplier adjustment
|
|
67
|
-
* @param isCode - Whether the text is code (uses CODE_CHARS_PER_TOKEN)
|
|
68
|
-
* @returns Estimated token count
|
|
69
|
-
*/
|
|
70
|
-
export function estimateTokens(text, provider, isCode) {
|
|
71
|
-
if (!text || text.length === 0) {
|
|
72
|
-
return 0;
|
|
73
|
-
}
|
|
74
|
-
const charsPerToken = isCode ? CODE_CHARS_PER_TOKEN : CHARS_PER_TOKEN;
|
|
75
|
-
const baseTokens = Math.ceil(text.length / charsPerToken);
|
|
76
|
-
const multiplier = getProviderMultiplier(provider);
|
|
77
|
-
// Apply provider multiplier and additive safety margin separately
|
|
78
|
-
// This prevents compounding (e.g. Anthropic: 1.23 * 1.15 = 1.41x was too aggressive)
|
|
79
|
-
const providerAdjusted = baseTokens * multiplier;
|
|
80
|
-
const safetyBuffer = baseTokens * TOKEN_SAFETY_MARGIN_ADDITIVE;
|
|
81
|
-
return Math.ceil(providerAdjusted + safetyBuffer);
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Estimate token count for a single ChatMessage.
|
|
85
|
-
* Includes message framing overhead.
|
|
86
|
-
*/
|
|
87
|
-
export function estimateMessageTokens(message, provider) {
|
|
88
|
-
let contentStr = "";
|
|
89
|
-
if (message.content) {
|
|
90
|
-
if (typeof message.content === "string") {
|
|
91
|
-
contentStr = message.content;
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
try {
|
|
95
|
-
contentStr = JSON.stringify(message.content);
|
|
96
|
-
}
|
|
97
|
-
catch {
|
|
98
|
-
// Fallback for circular references or non-serializable content
|
|
99
|
-
contentStr = String(message.content);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
const contentTokens = estimateTokens(contentStr, provider);
|
|
104
|
-
return contentTokens + TOKENS_PER_MESSAGE;
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* Estimate total token count for an array of messages.
|
|
108
|
-
* Includes conversation-level overhead.
|
|
109
|
-
*/
|
|
110
|
-
export function estimateMessagesTokens(messages, provider) {
|
|
111
|
-
if (!messages || messages.length === 0) {
|
|
112
|
-
return 0;
|
|
113
|
-
}
|
|
114
|
-
const messageTokens = messages.reduce((sum, msg) => sum + estimateMessageTokens(msg, provider), 0);
|
|
115
|
-
return messageTokens + TOKENS_PER_CONVERSATION;
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* Truncate text to fit within a token budget.
|
|
119
|
-
* Tries to cut at sentence or word boundaries.
|
|
120
|
-
*
|
|
121
|
-
* @param text - Input text
|
|
122
|
-
* @param maxTokens - Maximum tokens allowed
|
|
123
|
-
* @param provider - Optional provider for multiplier
|
|
124
|
-
* @returns Truncated text with "..." suffix if truncated
|
|
125
|
-
*/
|
|
126
|
-
export function truncateToTokenBudget(text, maxTokens, provider) {
|
|
127
|
-
if (estimateTokens(text, provider) <= maxTokens) {
|
|
128
|
-
return { text, truncated: false };
|
|
129
|
-
}
|
|
130
|
-
const multiplier = getProviderMultiplier(provider);
|
|
131
|
-
// Use additive safety margin: effective multiplier = multiplier + additive margin
|
|
132
|
-
const effectiveMultiplier = multiplier + TOKEN_SAFETY_MARGIN_ADDITIVE;
|
|
133
|
-
const maxChars = Math.floor((maxTokens / effectiveMultiplier) * CHARS_PER_TOKEN);
|
|
134
|
-
if (maxChars <= 0) {
|
|
135
|
-
return { text: "", truncated: true };
|
|
136
|
-
}
|
|
137
|
-
// Try to cut at sentence boundary
|
|
138
|
-
const candidate = text.slice(0, maxChars);
|
|
139
|
-
const lastSentence = Math.max(candidate.lastIndexOf(". "), candidate.lastIndexOf("! "), candidate.lastIndexOf("? "), candidate.lastIndexOf("\n"));
|
|
140
|
-
const cutPoint = lastSentence > maxChars * 0.5 ? lastSentence + 1 : maxChars;
|
|
141
|
-
return { text: text.slice(0, cutPoint) + "...", truncated: true };
|
|
142
|
-
}
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Provider-specific token limit utilities
|
|
3
|
-
* Provides safe maxTokens values based on provider and model capabilities
|
|
4
|
-
*/
|
|
5
|
-
import { PROVIDER_MAX_TOKENS } from "../core/constants.js";
|
|
6
|
-
import { logger } from "./logger.js";
|
|
7
|
-
/**
|
|
8
|
-
* Get the safe maximum tokens for a provider and model
|
|
9
|
-
*/
|
|
10
|
-
export function getSafeMaxTokens(provider, model, requestedMaxTokens) {
|
|
11
|
-
// Get provider-specific limits
|
|
12
|
-
const providerLimits = PROVIDER_MAX_TOKENS[provider];
|
|
13
|
-
if (!providerLimits) {
|
|
14
|
-
logger.warn(`Unknown provider ${provider}, no token limits enforced`);
|
|
15
|
-
return requestedMaxTokens || undefined; // No default limit for unknown providers
|
|
16
|
-
}
|
|
17
|
-
// Get model-specific limit or provider default
|
|
18
|
-
let maxLimit;
|
|
19
|
-
if (model &&
|
|
20
|
-
typeof providerLimits === "object" &&
|
|
21
|
-
providerLimits[model]) {
|
|
22
|
-
maxLimit = providerLimits[model];
|
|
23
|
-
}
|
|
24
|
-
else if (typeof providerLimits === "object" &&
|
|
25
|
-
providerLimits.default) {
|
|
26
|
-
maxLimit = providerLimits.default;
|
|
27
|
-
}
|
|
28
|
-
else if (typeof providerLimits === "number") {
|
|
29
|
-
maxLimit = providerLimits;
|
|
30
|
-
}
|
|
31
|
-
else {
|
|
32
|
-
maxLimit = PROVIDER_MAX_TOKENS.default;
|
|
33
|
-
}
|
|
34
|
-
// If no specific maxTokens requested, return the provider limit
|
|
35
|
-
if (!requestedMaxTokens) {
|
|
36
|
-
return maxLimit;
|
|
37
|
-
}
|
|
38
|
-
// If requested maxTokens exceeds the limit, use the limit and warn
|
|
39
|
-
if (requestedMaxTokens > maxLimit) {
|
|
40
|
-
logger.warn(`Requested maxTokens ${requestedMaxTokens} exceeds ${provider}/${model} limit of ${maxLimit}. Using ${maxLimit} instead.`);
|
|
41
|
-
return maxLimit;
|
|
42
|
-
}
|
|
43
|
-
// Use the requested value if it's within limits
|
|
44
|
-
return requestedMaxTokens;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Validate if maxTokens is safe for a provider/model combination
|
|
48
|
-
*/
|
|
49
|
-
export function validateMaxTokens(provider, model, maxTokens) {
|
|
50
|
-
const safeMaxTokens = getSafeMaxTokens(provider, model, maxTokens);
|
|
51
|
-
if (!maxTokens) {
|
|
52
|
-
return {
|
|
53
|
-
isValid: true,
|
|
54
|
-
recommendedMaxTokens: safeMaxTokens,
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
// If no limits are defined, validation always passes
|
|
58
|
-
if (safeMaxTokens === undefined) {
|
|
59
|
-
return {
|
|
60
|
-
isValid: true,
|
|
61
|
-
recommendedMaxTokens: maxTokens,
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
const isValid = maxTokens <= safeMaxTokens;
|
|
65
|
-
return {
|
|
66
|
-
isValid,
|
|
67
|
-
recommendedMaxTokens: safeMaxTokens,
|
|
68
|
-
warning: !isValid
|
|
69
|
-
? `maxTokens ${maxTokens} exceeds ${provider}/${model} limit of ${safeMaxTokens}`
|
|
70
|
-
: undefined,
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Get provider-specific token limit recommendations
|
|
75
|
-
*/
|
|
76
|
-
export function getTokenLimitRecommendations(provider) {
|
|
77
|
-
const providerLimits = PROVIDER_MAX_TOKENS[provider];
|
|
78
|
-
if (!providerLimits || typeof providerLimits === "number") {
|
|
79
|
-
const limit = typeof providerLimits === "number"
|
|
80
|
-
? providerLimits
|
|
81
|
-
: PROVIDER_MAX_TOKENS.default;
|
|
82
|
-
return {
|
|
83
|
-
conservative: Math.floor(limit * 0.5),
|
|
84
|
-
balanced: Math.floor(limit * 0.75),
|
|
85
|
-
maximum: limit,
|
|
86
|
-
models: {},
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
const modelLimits = Object.entries(providerLimits)
|
|
90
|
-
.filter(([key]) => key !== "default")
|
|
91
|
-
.map(([_, limit]) => limit);
|
|
92
|
-
const maxLimit = Math.max(...modelLimits, providerLimits.default || 0);
|
|
93
|
-
const minLimit = Math.min(...modelLimits, providerLimits.default || maxLimit);
|
|
94
|
-
return {
|
|
95
|
-
conservative: Math.floor(minLimit * 0.5),
|
|
96
|
-
balanced: Math.floor(((minLimit + maxLimit) / 2) * 0.75),
|
|
97
|
-
maximum: maxLimit,
|
|
98
|
-
models: Object.fromEntries(Object.entries(providerLimits).filter(([key]) => key !== "default")),
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* Get all provider limits summary
|
|
103
|
-
*/
|
|
104
|
-
export function getAllProviderLimits() {
|
|
105
|
-
const result = {};
|
|
106
|
-
for (const [provider, limits] of Object.entries(PROVIDER_MAX_TOKENS)) {
|
|
107
|
-
if (provider === "default") {
|
|
108
|
-
continue;
|
|
109
|
-
}
|
|
110
|
-
if (typeof limits === "number") {
|
|
111
|
-
result[provider] = {
|
|
112
|
-
default: limits,
|
|
113
|
-
models: {},
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
else {
|
|
117
|
-
const { default: defaultLimit, ...models } = limits;
|
|
118
|
-
result[provider] = {
|
|
119
|
-
default: defaultLimit || PROVIDER_MAX_TOKENS.default,
|
|
120
|
-
models: models,
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
return result;
|
|
125
|
-
}
|