@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,290 +0,0 @@
|
|
|
1
|
-
import { createOpenAI } from "@ai-sdk/openai";
|
|
2
|
-
import { NoOutputGeneratedError, streamText, } from "ai";
|
|
3
|
-
import { BaseProvider } from "../core/baseProvider.js";
|
|
4
|
-
import { logger } from "../utils/logger.js";
|
|
5
|
-
import { composeAbortSignals, createTimeoutController, TimeoutError, } from "../utils/timeout.js";
|
|
6
|
-
import { streamAnalyticsCollector } from "../core/streamAnalytics.js";
|
|
7
|
-
import { createProxyFetch } from "../proxy/proxyFetch.js";
|
|
8
|
-
import { toAnalyticsStreamResult } from "./providerTypeUtils.js";
|
|
9
|
-
// Constants
|
|
10
|
-
const FALLBACK_OPENAI_COMPATIBLE_MODEL = "gpt-3.5-turbo";
|
|
11
|
-
// Configuration helpers
|
|
12
|
-
const getOpenAICompatibleConfig = () => {
|
|
13
|
-
const baseURL = process.env.OPENAI_COMPATIBLE_BASE_URL;
|
|
14
|
-
const apiKey = process.env.OPENAI_COMPATIBLE_API_KEY;
|
|
15
|
-
if (!baseURL) {
|
|
16
|
-
throw new Error("OPENAI_COMPATIBLE_BASE_URL environment variable is required. " +
|
|
17
|
-
"Please set it to your OpenAI-compatible endpoint (e.g., https://api.openrouter.ai/api/v1)");
|
|
18
|
-
}
|
|
19
|
-
if (!apiKey) {
|
|
20
|
-
throw new Error("OPENAI_COMPATIBLE_API_KEY environment variable is required. " +
|
|
21
|
-
"Please set it to your API key for the OpenAI-compatible service.");
|
|
22
|
-
}
|
|
23
|
-
return {
|
|
24
|
-
baseURL,
|
|
25
|
-
apiKey,
|
|
26
|
-
};
|
|
27
|
-
};
|
|
28
|
-
/**
|
|
29
|
-
* Returns the default model name for OpenAI Compatible endpoints.
|
|
30
|
-
*
|
|
31
|
-
* Returns undefined if no model is specified via OPENAI_COMPATIBLE_MODEL environment variable,
|
|
32
|
-
* which triggers auto-discovery from the /v1/models endpoint.
|
|
33
|
-
*/
|
|
34
|
-
const getDefaultOpenAICompatibleModel = () => {
|
|
35
|
-
return process.env.OPENAI_COMPATIBLE_MODEL || undefined;
|
|
36
|
-
};
|
|
37
|
-
// ModelsResponse type now imported from ../types/providerSpecific.js
|
|
38
|
-
/**
|
|
39
|
-
* OpenAI Compatible Provider - BaseProvider Implementation
|
|
40
|
-
* Provides access to one of the OpenAI-compatible endpoint (OpenRouter, vLLM, LiteLLM, etc.)
|
|
41
|
-
*/
|
|
42
|
-
export class OpenAICompatibleProvider extends BaseProvider {
|
|
43
|
-
model;
|
|
44
|
-
config;
|
|
45
|
-
discoveredModel;
|
|
46
|
-
customOpenAI;
|
|
47
|
-
constructor(modelName, sdk) {
|
|
48
|
-
super(modelName, "openai-compatible", sdk);
|
|
49
|
-
// Initialize OpenAI Compatible configuration
|
|
50
|
-
this.config = getOpenAICompatibleConfig();
|
|
51
|
-
// Create OpenAI SDK instance configured for custom endpoint
|
|
52
|
-
// This allows us to use OpenAI-compatible API by simply changing the baseURL
|
|
53
|
-
this.customOpenAI = createOpenAI({
|
|
54
|
-
baseURL: this.config.baseURL,
|
|
55
|
-
apiKey: this.config.apiKey,
|
|
56
|
-
fetch: createProxyFetch(),
|
|
57
|
-
});
|
|
58
|
-
logger.debug("OpenAI Compatible Provider initialized", {
|
|
59
|
-
modelName: this.modelName,
|
|
60
|
-
provider: this.providerName,
|
|
61
|
-
baseURL: this.config.baseURL,
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
getProviderName() {
|
|
65
|
-
return "openai-compatible";
|
|
66
|
-
}
|
|
67
|
-
getDefaultModel() {
|
|
68
|
-
// Return empty string when no model is explicitly configured to enable auto-discovery
|
|
69
|
-
return getDefaultOpenAICompatibleModel() || "";
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Returns the Vercel AI SDK model instance for OpenAI Compatible endpoints
|
|
73
|
-
* Handles auto-discovery if no model was specified
|
|
74
|
-
*/
|
|
75
|
-
async getAISDKModel() {
|
|
76
|
-
// If model instance doesn't exist yet, create it
|
|
77
|
-
if (!this.model) {
|
|
78
|
-
let modelToUse;
|
|
79
|
-
// Check if a model was explicitly specified via constructor or env var
|
|
80
|
-
const explicitModel = this.modelName || getDefaultOpenAICompatibleModel();
|
|
81
|
-
// Treat empty string as no model specified (trigger auto-discovery)
|
|
82
|
-
if (explicitModel && explicitModel.trim() !== "") {
|
|
83
|
-
// Use the explicitly specified model
|
|
84
|
-
modelToUse = explicitModel;
|
|
85
|
-
logger.debug(`Using specified model: ${modelToUse}`);
|
|
86
|
-
}
|
|
87
|
-
else {
|
|
88
|
-
// No model specified, auto-discover from endpoint
|
|
89
|
-
try {
|
|
90
|
-
const availableModels = await this.getAvailableModels();
|
|
91
|
-
if (availableModels.length > 0) {
|
|
92
|
-
this.discoveredModel = availableModels[0];
|
|
93
|
-
modelToUse = this.discoveredModel;
|
|
94
|
-
logger.info(`🔍 Auto-discovered model: ${modelToUse} from ${availableModels.length} available models`);
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
// Fall back to a common default if no models discovered
|
|
98
|
-
modelToUse = FALLBACK_OPENAI_COMPATIBLE_MODEL;
|
|
99
|
-
logger.warn(`No models discovered, using fallback: ${modelToUse}`);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
catch (error) {
|
|
103
|
-
logger.warn("Model auto-discovery failed, using fallback:", error);
|
|
104
|
-
modelToUse = FALLBACK_OPENAI_COMPATIBLE_MODEL;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
// Create the model instance
|
|
108
|
-
this.model = this.customOpenAI(modelToUse);
|
|
109
|
-
}
|
|
110
|
-
return this.model;
|
|
111
|
-
}
|
|
112
|
-
formatProviderError(error) {
|
|
113
|
-
if (error instanceof TimeoutError) {
|
|
114
|
-
return new Error(`OpenAI Compatible request timed out: ${error.message}`);
|
|
115
|
-
}
|
|
116
|
-
// Check for timeout by error name and message as fallback
|
|
117
|
-
const errorRecord = error;
|
|
118
|
-
if (errorRecord?.name === "TimeoutError" ||
|
|
119
|
-
(typeof errorRecord?.message === "string" &&
|
|
120
|
-
errorRecord.message.includes("Timeout"))) {
|
|
121
|
-
return new Error(`OpenAI Compatible request timed out: ${errorRecord?.message || "Unknown timeout"}`);
|
|
122
|
-
}
|
|
123
|
-
if (typeof errorRecord?.message === "string") {
|
|
124
|
-
if (errorRecord.message.includes("ECONNREFUSED") ||
|
|
125
|
-
errorRecord.message.includes("Failed to fetch")) {
|
|
126
|
-
return new Error(`OpenAI Compatible endpoint not available. Please check your OPENAI_COMPATIBLE_BASE_URL: ${this.config.baseURL}`);
|
|
127
|
-
}
|
|
128
|
-
if (errorRecord.message.includes("API_KEY_INVALID") ||
|
|
129
|
-
errorRecord.message.includes("Invalid API key") ||
|
|
130
|
-
errorRecord.message.includes("Unauthorized")) {
|
|
131
|
-
return new Error("Invalid OpenAI Compatible API key. Please check your OPENAI_COMPATIBLE_API_KEY environment variable.");
|
|
132
|
-
}
|
|
133
|
-
if (errorRecord.message.includes("rate limit")) {
|
|
134
|
-
return new Error("OpenAI Compatible rate limit exceeded. Please try again later.");
|
|
135
|
-
}
|
|
136
|
-
if (errorRecord.message.includes("model") &&
|
|
137
|
-
(errorRecord.message.includes("not found") ||
|
|
138
|
-
errorRecord.message.includes("does not exist"))) {
|
|
139
|
-
return new Error(`Model '${this.modelName}' not available on OpenAI Compatible endpoint. ` +
|
|
140
|
-
"Please check available models or use getAvailableModels() to see supported models.");
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
return new Error(`OpenAI Compatible error: ${errorRecord?.message || "Unknown error"}`);
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* OpenAI Compatible endpoints support tools for compatible models
|
|
147
|
-
*/
|
|
148
|
-
supportsTools() {
|
|
149
|
-
return true;
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Provider-specific streaming implementation
|
|
153
|
-
* Note: This is only used when tools are disabled
|
|
154
|
-
*/
|
|
155
|
-
async executeStream(options, _analysisSchema) {
|
|
156
|
-
this.validateStreamOptions(options);
|
|
157
|
-
const startTime = Date.now();
|
|
158
|
-
const timeout = this.getTimeout(options);
|
|
159
|
-
const timeoutController = createTimeoutController(timeout, this.providerName, "stream");
|
|
160
|
-
try {
|
|
161
|
-
// Get tools - options.tools is pre-merged by BaseProvider.stream()
|
|
162
|
-
const shouldUseTools = !options.disableTools && this.supportsTools();
|
|
163
|
-
const tools = shouldUseTools
|
|
164
|
-
? options.tools || (await this.getAllTools())
|
|
165
|
-
: {};
|
|
166
|
-
// Build message array from options with multimodal support
|
|
167
|
-
// Using protected helper from BaseProvider to eliminate code duplication
|
|
168
|
-
const messages = await this.buildMessagesForStream(options);
|
|
169
|
-
const model = await this.getAISDKModelWithMiddleware(options); // This is where network connection happens!
|
|
170
|
-
const result = streamText({
|
|
171
|
-
model,
|
|
172
|
-
messages: messages,
|
|
173
|
-
...(options.maxTokens !== null && options.maxTokens !== undefined
|
|
174
|
-
? { maxOutputTokens: options.maxTokens }
|
|
175
|
-
: {}),
|
|
176
|
-
...(options.temperature !== null && options.temperature !== undefined
|
|
177
|
-
? { temperature: options.temperature }
|
|
178
|
-
: {}),
|
|
179
|
-
tools,
|
|
180
|
-
toolChoice: shouldUseTools ? "auto" : "none",
|
|
181
|
-
abortSignal: composeAbortSignals(options.abortSignal, timeoutController?.controller.signal),
|
|
182
|
-
experimental_telemetry: this.telemetryHandler.getTelemetryConfig(options),
|
|
183
|
-
onStepFinish: (event) => {
|
|
184
|
-
this.handleToolExecutionStorage([...event.toolCalls], [...event.toolResults], options, new Date()).catch((error) => {
|
|
185
|
-
logger.warn("[OpenAiCompatibleProvider] Failed to store tool executions", {
|
|
186
|
-
provider: this.providerName,
|
|
187
|
-
error: error instanceof Error ? error.message : String(error),
|
|
188
|
-
});
|
|
189
|
-
});
|
|
190
|
-
},
|
|
191
|
-
});
|
|
192
|
-
timeoutController?.cleanup();
|
|
193
|
-
// Transform stream to match StreamResult interface
|
|
194
|
-
const transformedStream = async function* () {
|
|
195
|
-
try {
|
|
196
|
-
for await (const chunk of result.textStream) {
|
|
197
|
-
yield { content: chunk };
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
catch (streamError) {
|
|
201
|
-
// AI SDK v6 throws NoOutputGeneratedError when the stream produced no output.
|
|
202
|
-
if (NoOutputGeneratedError.isInstance(streamError)) {
|
|
203
|
-
logger.warn("OpenAI-compatible: Stream produced no output (NoOutputGeneratedError)");
|
|
204
|
-
return;
|
|
205
|
-
}
|
|
206
|
-
throw streamError;
|
|
207
|
-
}
|
|
208
|
-
};
|
|
209
|
-
// Create analytics promise that resolves after stream completion
|
|
210
|
-
const analyticsPromise = streamAnalyticsCollector.createAnalytics(this.providerName, this.modelName, toAnalyticsStreamResult(result), Date.now() - startTime, {
|
|
211
|
-
requestId: `openai-compatible-stream-${Date.now()}`,
|
|
212
|
-
streamingMode: true,
|
|
213
|
-
});
|
|
214
|
-
return {
|
|
215
|
-
stream: transformedStream(),
|
|
216
|
-
provider: this.providerName,
|
|
217
|
-
model: this.modelName,
|
|
218
|
-
analytics: analyticsPromise,
|
|
219
|
-
metadata: {
|
|
220
|
-
startTime,
|
|
221
|
-
streamId: `openai-compatible-${Date.now()}`,
|
|
222
|
-
},
|
|
223
|
-
};
|
|
224
|
-
}
|
|
225
|
-
catch (error) {
|
|
226
|
-
timeoutController?.cleanup();
|
|
227
|
-
throw this.handleProviderError(error);
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
/**
|
|
231
|
-
* Get available models from OpenAI Compatible endpoint
|
|
232
|
-
*
|
|
233
|
-
* Fetches from the /v1/models endpoint to discover available models.
|
|
234
|
-
* This is useful for auto-discovery when no model is specified.
|
|
235
|
-
*/
|
|
236
|
-
async getAvailableModels() {
|
|
237
|
-
try {
|
|
238
|
-
const modelsUrl = new URL("/v1/models", this.config.baseURL).toString();
|
|
239
|
-
logger.debug(`Fetching available models from: ${modelsUrl}`);
|
|
240
|
-
const proxyFetch = createProxyFetch();
|
|
241
|
-
const controller = new AbortController();
|
|
242
|
-
const t = setTimeout(() => controller.abort(), 5000);
|
|
243
|
-
const response = await proxyFetch(modelsUrl, {
|
|
244
|
-
headers: {
|
|
245
|
-
Authorization: `Bearer ${this.config.apiKey}`,
|
|
246
|
-
"Content-Type": "application/json",
|
|
247
|
-
},
|
|
248
|
-
signal: controller.signal,
|
|
249
|
-
});
|
|
250
|
-
clearTimeout(t);
|
|
251
|
-
if (!response.ok) {
|
|
252
|
-
logger.warn(`Models endpoint returned ${response.status}: ${response.statusText}`);
|
|
253
|
-
return this.getFallbackModels();
|
|
254
|
-
}
|
|
255
|
-
const data = await response.json();
|
|
256
|
-
if (!data.data || !Array.isArray(data.data)) {
|
|
257
|
-
logger.warn("Invalid models response format");
|
|
258
|
-
return this.getFallbackModels();
|
|
259
|
-
}
|
|
260
|
-
const models = data.data.map((model) => model.id).filter(Boolean);
|
|
261
|
-
logger.debug(`Discovered ${models.length} models:`, models);
|
|
262
|
-
return models.length > 0 ? models : this.getFallbackModels();
|
|
263
|
-
}
|
|
264
|
-
catch (error) {
|
|
265
|
-
logger.warn(`Failed to fetch models from OpenAI Compatible endpoint:`, error);
|
|
266
|
-
return this.getFallbackModels();
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
/**
|
|
270
|
-
* Get the first available model for auto-selection
|
|
271
|
-
*/
|
|
272
|
-
async getFirstAvailableModel() {
|
|
273
|
-
const models = await this.getAvailableModels();
|
|
274
|
-
return models[0] || FALLBACK_OPENAI_COMPATIBLE_MODEL;
|
|
275
|
-
}
|
|
276
|
-
/**
|
|
277
|
-
* Fallback models when discovery fails
|
|
278
|
-
*/
|
|
279
|
-
getFallbackModels() {
|
|
280
|
-
return [
|
|
281
|
-
"gpt-4o",
|
|
282
|
-
"gpt-4o-mini",
|
|
283
|
-
"gpt-4-turbo",
|
|
284
|
-
FALLBACK_OPENAI_COMPATIBLE_MODEL,
|
|
285
|
-
"claude-3-5-sonnet",
|
|
286
|
-
"claude-3-haiku",
|
|
287
|
-
"gemini-pro",
|
|
288
|
-
];
|
|
289
|
-
}
|
|
290
|
-
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared type utilities for AI SDK provider integration.
|
|
3
|
-
*
|
|
4
|
-
* Provides type-safe helpers to bridge between the AI SDK's generic types
|
|
5
|
-
* and NeuroLink's internal type system without resorting to `as any` casts.
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* Type guard: checks whether a LanguageModel value is an object with `modelId`
|
|
9
|
-
* (i.e. LanguageModelV2 or LanguageModelV3) rather than a bare string ID.
|
|
10
|
-
*/
|
|
11
|
-
function isLanguageModelObject(model) {
|
|
12
|
-
return typeof model === "object" && model !== null && "modelId" in model;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Extract the model identifier from a LanguageModel value.
|
|
16
|
-
*
|
|
17
|
-
* `LanguageModel` in AI SDK v6 is `string | LanguageModelV2 | LanguageModelV3`.
|
|
18
|
-
* When it's a string it IS the model ID; when it's an object, `.modelId` holds it.
|
|
19
|
-
*
|
|
20
|
-
* @param model - The LanguageModel value (string or object).
|
|
21
|
-
* @param fallback - Value returned when the model ID cannot be determined.
|
|
22
|
-
*/
|
|
23
|
-
export function getModelId(model, fallback = "unknown") {
|
|
24
|
-
if (typeof model === "string") {
|
|
25
|
-
return model;
|
|
26
|
-
}
|
|
27
|
-
if (isLanguageModelObject(model)) {
|
|
28
|
-
return model.modelId;
|
|
29
|
-
}
|
|
30
|
-
return fallback;
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Adapt an AI SDK `StreamTextResult` (generic, parameterised by TOOLS & OUTPUT)
|
|
34
|
-
* to the simpler NeuroLink `StreamTextResult` expected by the analytics collector.
|
|
35
|
-
*
|
|
36
|
-
* The AI SDK result is a structural superset of our local type — every field our
|
|
37
|
-
* analytics code reads (`textStream`, `text`, `usage`, `response`, `finishReason`,
|
|
38
|
-
* `toolResults`, `toolCalls`) exists on the SDK result with compatible types.
|
|
39
|
-
* This function performs the structural down-cast without `as any`.
|
|
40
|
-
*/
|
|
41
|
-
export function toAnalyticsStreamResult(result) {
|
|
42
|
-
// The AI SDK v6 result is a structural superset of our StreamTextResult.
|
|
43
|
-
// Both use PromiseLike for async fields and compatible usage shapes
|
|
44
|
-
// (extractTokenUsage handles both v4 and v6 field names).
|
|
45
|
-
return result;
|
|
46
|
-
}
|
|
@@ -1,215 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Adaptive Semaphore Utility
|
|
3
|
-
*
|
|
4
|
-
* Provides a sophisticated semaphore implementation with dynamic concurrency adjustment
|
|
5
|
-
* for optimal resource utilization and performance tuning based on response times and error rates.
|
|
6
|
-
*/
|
|
7
|
-
import { logger } from "../../utils/logger.js";
|
|
8
|
-
/**
|
|
9
|
-
* Adaptive semaphore that automatically adjusts concurrency based on performance metrics
|
|
10
|
-
*/
|
|
11
|
-
export class AdaptiveSemaphore {
|
|
12
|
-
count;
|
|
13
|
-
waiters = [];
|
|
14
|
-
currentConcurrency;
|
|
15
|
-
activeRequests = 0;
|
|
16
|
-
completedCount = 0;
|
|
17
|
-
errorCount = 0;
|
|
18
|
-
responseTimes = [];
|
|
19
|
-
maxConcurrency;
|
|
20
|
-
minConcurrency;
|
|
21
|
-
constructor(config) {
|
|
22
|
-
this.currentConcurrency = config.initialConcurrency;
|
|
23
|
-
this.count = config.initialConcurrency;
|
|
24
|
-
this.maxConcurrency = config.maxConcurrency;
|
|
25
|
-
this.minConcurrency = config.minConcurrency;
|
|
26
|
-
logger.debug("AdaptiveSemaphore initialized", {
|
|
27
|
-
initialConcurrency: config.initialConcurrency,
|
|
28
|
-
maxConcurrency: config.maxConcurrency,
|
|
29
|
-
minConcurrency: config.minConcurrency,
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Acquire a semaphore permit, waiting if necessary
|
|
34
|
-
*/
|
|
35
|
-
async acquire() {
|
|
36
|
-
return new Promise((resolve) => {
|
|
37
|
-
if (this.count > 0) {
|
|
38
|
-
this.count--;
|
|
39
|
-
this.activeRequests++;
|
|
40
|
-
resolve();
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
43
|
-
this.waiters.push(() => {
|
|
44
|
-
this.count--;
|
|
45
|
-
this.activeRequests++;
|
|
46
|
-
resolve();
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Release a semaphore permit and wake up waiting requests
|
|
53
|
-
*/
|
|
54
|
-
release() {
|
|
55
|
-
this.activeRequests--;
|
|
56
|
-
if (this.waiters.length > 0) {
|
|
57
|
-
const waiter = this.waiters.shift();
|
|
58
|
-
if (waiter) {
|
|
59
|
-
this.count++; // Increment count before calling waiter so waiter can decrement it
|
|
60
|
-
waiter();
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
else {
|
|
64
|
-
this.count++;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Record successful completion with response time for adaptive adjustment
|
|
69
|
-
*/
|
|
70
|
-
recordSuccess(responseTimeMs) {
|
|
71
|
-
this.completedCount++;
|
|
72
|
-
this.responseTimes.push(responseTimeMs);
|
|
73
|
-
// Keep only recent response times for calculation (last 10 responses)
|
|
74
|
-
if (this.responseTimes.length > 10) {
|
|
75
|
-
this.responseTimes.shift();
|
|
76
|
-
}
|
|
77
|
-
this.adjustConcurrencyBasedOnPerformance(responseTimeMs, false);
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Record error for adaptive adjustment
|
|
81
|
-
*/
|
|
82
|
-
recordError(responseTimeMs) {
|
|
83
|
-
this.errorCount++;
|
|
84
|
-
if (responseTimeMs) {
|
|
85
|
-
this.responseTimes.push(responseTimeMs);
|
|
86
|
-
if (this.responseTimes.length > 10) {
|
|
87
|
-
this.responseTimes.shift();
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
this.adjustConcurrencyBasedOnPerformance(responseTimeMs || 0, true);
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Manually adjust concurrency level
|
|
94
|
-
*/
|
|
95
|
-
adjustConcurrency(newLimit) {
|
|
96
|
-
const clampedLimit = Math.max(this.minConcurrency, Math.min(this.maxConcurrency, newLimit));
|
|
97
|
-
const diff = clampedLimit - (this.currentConcurrency - this.count);
|
|
98
|
-
this.count += diff;
|
|
99
|
-
this.currentConcurrency = clampedLimit;
|
|
100
|
-
logger.debug("Concurrency adjusted", {
|
|
101
|
-
newConcurrency: clampedLimit,
|
|
102
|
-
previousConcurrency: this.currentConcurrency - diff,
|
|
103
|
-
availableCount: this.count,
|
|
104
|
-
activeRequests: this.activeRequests,
|
|
105
|
-
});
|
|
106
|
-
// Wake up waiting requests if we increased concurrency
|
|
107
|
-
while (this.count > 0 && this.waiters.length > 0) {
|
|
108
|
-
const waiter = this.waiters.shift();
|
|
109
|
-
if (waiter) {
|
|
110
|
-
waiter();
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Get current performance metrics
|
|
116
|
-
*/
|
|
117
|
-
getMetrics() {
|
|
118
|
-
const averageResponseTime = this.responseTimes.length > 0
|
|
119
|
-
? this.responseTimes.reduce((sum, time) => sum + time, 0) /
|
|
120
|
-
this.responseTimes.length
|
|
121
|
-
: 0;
|
|
122
|
-
return {
|
|
123
|
-
activeRequests: this.activeRequests,
|
|
124
|
-
currentConcurrency: this.currentConcurrency,
|
|
125
|
-
completedCount: this.completedCount,
|
|
126
|
-
errorCount: this.errorCount,
|
|
127
|
-
averageResponseTime,
|
|
128
|
-
waitingCount: this.waiters.length,
|
|
129
|
-
};
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* Reset metrics for new batch or session
|
|
133
|
-
*/
|
|
134
|
-
resetMetrics() {
|
|
135
|
-
this.completedCount = 0;
|
|
136
|
-
this.errorCount = 0;
|
|
137
|
-
this.responseTimes = [];
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* Automatically adjust concurrency based on performance indicators
|
|
141
|
-
*/
|
|
142
|
-
adjustConcurrencyBasedOnPerformance(responseTimeMs, isError) {
|
|
143
|
-
const metrics = this.getMetrics();
|
|
144
|
-
if (isError) {
|
|
145
|
-
// On error, reduce concurrency to be more conservative
|
|
146
|
-
if (this.currentConcurrency > this.minConcurrency) {
|
|
147
|
-
this.adjustConcurrency(Math.max(this.minConcurrency, this.currentConcurrency - 1));
|
|
148
|
-
logger.warn("Reduced concurrency due to error", {
|
|
149
|
-
newConcurrency: this.currentConcurrency,
|
|
150
|
-
errorCount: this.errorCount,
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
return;
|
|
154
|
-
}
|
|
155
|
-
// Only adjust after we have some data to work with
|
|
156
|
-
if (this.completedCount < 3) {
|
|
157
|
-
return;
|
|
158
|
-
}
|
|
159
|
-
const fastResponseThreshold = 2000; // 2 seconds
|
|
160
|
-
const slowResponseThreshold = 5000; // 5 seconds
|
|
161
|
-
if (responseTimeMs < fastResponseThreshold &&
|
|
162
|
-
metrics.averageResponseTime < fastResponseThreshold &&
|
|
163
|
-
this.currentConcurrency < this.maxConcurrency) {
|
|
164
|
-
// Fast responses and no bottleneck - increase concurrency
|
|
165
|
-
this.adjustConcurrency(Math.min(this.maxConcurrency, this.currentConcurrency + 1));
|
|
166
|
-
logger.debug("Increased concurrency due to fast responses", {
|
|
167
|
-
newConcurrency: this.currentConcurrency,
|
|
168
|
-
averageResponseTime: metrics.averageResponseTime,
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
else if (responseTimeMs > slowResponseThreshold &&
|
|
172
|
-
this.currentConcurrency > this.minConcurrency) {
|
|
173
|
-
// Slow responses - decrease concurrency
|
|
174
|
-
this.adjustConcurrency(Math.max(this.minConcurrency, this.currentConcurrency - 1));
|
|
175
|
-
logger.debug("Decreased concurrency due to slow responses", {
|
|
176
|
-
newConcurrency: this.currentConcurrency,
|
|
177
|
-
responseTime: responseTimeMs,
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* Check if semaphore is idle (no active or waiting requests)
|
|
183
|
-
*/
|
|
184
|
-
isIdle() {
|
|
185
|
-
return this.activeRequests === 0 && this.waiters.length === 0;
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* Get current concurrency limit
|
|
189
|
-
*/
|
|
190
|
-
getCurrentConcurrency() {
|
|
191
|
-
return this.currentConcurrency;
|
|
192
|
-
}
|
|
193
|
-
/**
|
|
194
|
-
* Get number of active requests
|
|
195
|
-
*/
|
|
196
|
-
getActiveRequestCount() {
|
|
197
|
-
return this.activeRequests;
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* Get number of waiting requests
|
|
201
|
-
*/
|
|
202
|
-
getWaitingRequestCount() {
|
|
203
|
-
return this.waiters.length;
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* Factory function to create an adaptive semaphore with default configuration
|
|
208
|
-
*/
|
|
209
|
-
export function createAdaptiveSemaphore(initialConcurrency, maxConcurrency = 10, minConcurrency = 1) {
|
|
210
|
-
return new AdaptiveSemaphore({
|
|
211
|
-
initialConcurrency,
|
|
212
|
-
maxConcurrency,
|
|
213
|
-
minConcurrency,
|
|
214
|
-
});
|
|
215
|
-
}
|