@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,488 +0,0 @@
|
|
|
1
|
-
import { createOpenAI } from "@ai-sdk/openai";
|
|
2
|
-
import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
|
|
3
|
-
import { NoOutputGeneratedError, Output, streamText, } from "ai";
|
|
4
|
-
import { BaseProvider } from "../core/baseProvider.js";
|
|
5
|
-
import { DEFAULT_MAX_STEPS } from "../core/constants.js";
|
|
6
|
-
import { streamAnalyticsCollector } from "../core/streamAnalytics.js";
|
|
7
|
-
import { createProxyFetch } from "../proxy/proxyFetch.js";
|
|
8
|
-
import { AuthenticationError, InvalidModelError, NetworkError, ProviderError, RateLimitError, } from "../types/errors.js";
|
|
9
|
-
import { isAbortError } from "../utils/errorHandling.js";
|
|
10
|
-
import { logger } from "../utils/logger.js";
|
|
11
|
-
import { calculateCost } from "../utils/pricing.js";
|
|
12
|
-
import { getProviderModel } from "../utils/providerConfig.js";
|
|
13
|
-
import { composeAbortSignals, createTimeoutController, TimeoutError, } from "../utils/timeout.js";
|
|
14
|
-
import { getModelId } from "./providerTypeUtils.js";
|
|
15
|
-
const streamTracer = trace.getTracer("neurolink.provider.litellm");
|
|
16
|
-
// Configuration helpers
|
|
17
|
-
const getLiteLLMConfig = () => {
|
|
18
|
-
return {
|
|
19
|
-
baseURL: process.env.LITELLM_BASE_URL || "http://localhost:4000",
|
|
20
|
-
apiKey: process.env.LITELLM_API_KEY || "sk-anything",
|
|
21
|
-
};
|
|
22
|
-
};
|
|
23
|
-
/**
|
|
24
|
-
* Returns the default model name for LiteLLM.
|
|
25
|
-
*
|
|
26
|
-
* LiteLLM uses a 'provider/model' format for model names.
|
|
27
|
-
* For example:
|
|
28
|
-
* - 'openai/gpt-4o-mini'
|
|
29
|
-
* - 'openai/gpt-3.5-turbo'
|
|
30
|
-
* - 'anthropic/claude-3-sonnet-20240229'
|
|
31
|
-
* - 'google/gemini-pro'
|
|
32
|
-
*
|
|
33
|
-
* You can override the default by setting the LITELLM_MODEL environment variable.
|
|
34
|
-
*/
|
|
35
|
-
const getDefaultLiteLLMModel = () => {
|
|
36
|
-
return getProviderModel("LITELLM_MODEL", "openai/gpt-4o-mini");
|
|
37
|
-
};
|
|
38
|
-
/**
|
|
39
|
-
* LiteLLM Provider - BaseProvider Implementation
|
|
40
|
-
* Provides access to 100+ models via LiteLLM proxy server
|
|
41
|
-
*/
|
|
42
|
-
export class LiteLLMProvider extends BaseProvider {
|
|
43
|
-
model;
|
|
44
|
-
// Cache for available models to avoid repeated API calls
|
|
45
|
-
static modelsCache = [];
|
|
46
|
-
static modelsCacheTime = 0;
|
|
47
|
-
static MODELS_CACHE_DURATION = 10 * 60 * 1000; // 10 minutes
|
|
48
|
-
constructor(modelName, sdk) {
|
|
49
|
-
super(modelName, "litellm", sdk);
|
|
50
|
-
// Initialize LiteLLM using OpenAI SDK with explicit configuration
|
|
51
|
-
const config = getLiteLLMConfig();
|
|
52
|
-
// Create OpenAI SDK instance configured for LiteLLM proxy
|
|
53
|
-
// LiteLLM acts as a proxy server that implements the OpenAI-compatible API.
|
|
54
|
-
// To communicate with LiteLLM instead of the default OpenAI endpoint, we use createOpenAI
|
|
55
|
-
// with a custom baseURL and apiKey. This ensures all requests are routed through the LiteLLM
|
|
56
|
-
// proxy, allowing access to multiple models and custom authentication.
|
|
57
|
-
const customOpenAI = createOpenAI({
|
|
58
|
-
baseURL: config.baseURL,
|
|
59
|
-
apiKey: config.apiKey,
|
|
60
|
-
fetch: createProxyFetch(),
|
|
61
|
-
});
|
|
62
|
-
this.model = customOpenAI(this.modelName || getDefaultLiteLLMModel());
|
|
63
|
-
logger.debug("LiteLLM Provider initialized", {
|
|
64
|
-
modelName: this.modelName,
|
|
65
|
-
provider: this.providerName,
|
|
66
|
-
baseURL: config.baseURL,
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
getProviderName() {
|
|
70
|
-
return "litellm";
|
|
71
|
-
}
|
|
72
|
-
getDefaultModel() {
|
|
73
|
-
return getDefaultLiteLLMModel();
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Returns the Vercel AI SDK model instance for LiteLLM
|
|
77
|
-
*/
|
|
78
|
-
getAISDKModel() {
|
|
79
|
-
return this.model;
|
|
80
|
-
}
|
|
81
|
-
formatProviderError(error) {
|
|
82
|
-
if (error instanceof TimeoutError) {
|
|
83
|
-
return new NetworkError(`Request timed out: ${error.message}`, this.providerName);
|
|
84
|
-
}
|
|
85
|
-
// Check for timeout by error name and message as fallback
|
|
86
|
-
const errorRecord = error;
|
|
87
|
-
if (errorRecord?.name === "TimeoutError" ||
|
|
88
|
-
(typeof errorRecord?.message === "string" &&
|
|
89
|
-
errorRecord.message.toLowerCase().includes("timeout"))) {
|
|
90
|
-
return new NetworkError(`Request timed out: ${errorRecord?.message || "Unknown timeout"}`, this.providerName);
|
|
91
|
-
}
|
|
92
|
-
if (typeof errorRecord?.message === "string") {
|
|
93
|
-
if (errorRecord.message.includes("ECONNREFUSED") ||
|
|
94
|
-
errorRecord.message.includes("Failed to fetch")) {
|
|
95
|
-
return new NetworkError("LiteLLM proxy server not available. Please start the LiteLLM proxy server at " +
|
|
96
|
-
`${process.env.LITELLM_BASE_URL || "http://localhost:4000"}`, this.providerName);
|
|
97
|
-
}
|
|
98
|
-
if (errorRecord.message.includes("API_KEY_INVALID") ||
|
|
99
|
-
errorRecord.message.includes("Invalid API key")) {
|
|
100
|
-
return new AuthenticationError("Invalid LiteLLM configuration. Please check your LITELLM_API_KEY environment variable.", this.providerName);
|
|
101
|
-
}
|
|
102
|
-
if (errorRecord.message.toLowerCase().includes("rate limit")) {
|
|
103
|
-
return new RateLimitError("LiteLLM rate limit exceeded. Please try again later.", this.providerName);
|
|
104
|
-
}
|
|
105
|
-
if (errorRecord.message.toLowerCase().includes("model") &&
|
|
106
|
-
errorRecord.message.toLowerCase().includes("not found")) {
|
|
107
|
-
return new InvalidModelError(`Model '${this.modelName}' not available in LiteLLM proxy. ` +
|
|
108
|
-
"Please check your LiteLLM configuration and ensure the model is configured.", this.providerName);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
return new ProviderError(`LiteLLM error: ${errorRecord?.message || "Unknown error"}`, this.providerName);
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* LiteLLM supports tools for compatible models
|
|
115
|
-
*/
|
|
116
|
-
supportsTools() {
|
|
117
|
-
return true;
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* Provider-specific streaming implementation
|
|
121
|
-
* Note: This is only used when tools are disabled
|
|
122
|
-
*/
|
|
123
|
-
async executeStream(options, analysisSchema) {
|
|
124
|
-
this.validateStreamOptions(options);
|
|
125
|
-
const startTime = Date.now();
|
|
126
|
-
let chunkCount = 0; // Track chunk count for debugging
|
|
127
|
-
const timeout = this.getTimeout(options);
|
|
128
|
-
const timeoutController = createTimeoutController(timeout, this.providerName, "stream");
|
|
129
|
-
try {
|
|
130
|
-
// Build message array from options with multimodal support
|
|
131
|
-
// Using protected helper from BaseProvider to eliminate code duplication
|
|
132
|
-
const messages = await this.buildMessagesForStream(options);
|
|
133
|
-
const model = await this.getAISDKModelWithMiddleware(options); // This is where network connection happens!
|
|
134
|
-
// Get tools - options.tools is pre-merged by BaseProvider.stream()
|
|
135
|
-
const shouldUseTools = !options.disableTools && this.supportsTools();
|
|
136
|
-
const tools = shouldUseTools
|
|
137
|
-
? options.tools || (await this.getAllTools())
|
|
138
|
-
: {};
|
|
139
|
-
logger.debug(`LiteLLM: Tools for streaming`, {
|
|
140
|
-
shouldUseTools,
|
|
141
|
-
toolCount: Object.keys(tools).length,
|
|
142
|
-
toolNames: Object.keys(tools),
|
|
143
|
-
});
|
|
144
|
-
// Model-specific maxTokens handling - Gemini 2.5 models have issues with maxTokens
|
|
145
|
-
const modelName = this.modelName || getDefaultLiteLLMModel();
|
|
146
|
-
const isGemini25Model = modelName.includes("gemini-2.5") || modelName.includes("gemini/2.5");
|
|
147
|
-
const maxTokens = isGemini25Model ? undefined : options.maxTokens;
|
|
148
|
-
if (isGemini25Model && options.maxTokens) {
|
|
149
|
-
logger.debug(`LiteLLM: Skipping maxTokens for Gemini 2.5 model (known compatibility issue)`, {
|
|
150
|
-
modelName,
|
|
151
|
-
requestedMaxTokens: options.maxTokens,
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
// Build complete stream options with proper typing - matching Vertex pattern
|
|
155
|
-
let streamOptions = {
|
|
156
|
-
model: model,
|
|
157
|
-
messages: messages,
|
|
158
|
-
temperature: options.temperature,
|
|
159
|
-
...(maxTokens && { maxTokens }), // Conditionally include maxTokens
|
|
160
|
-
...(shouldUseTools &&
|
|
161
|
-
Object.keys(tools).length > 0 && {
|
|
162
|
-
tools,
|
|
163
|
-
toolChoice: "auto",
|
|
164
|
-
maxSteps: options.maxSteps || DEFAULT_MAX_STEPS,
|
|
165
|
-
}),
|
|
166
|
-
abortSignal: composeAbortSignals(options.abortSignal, timeoutController?.controller.signal),
|
|
167
|
-
experimental_telemetry: this.telemetryHandler.getTelemetryConfig(options),
|
|
168
|
-
onError: (event) => {
|
|
169
|
-
const error = event.error;
|
|
170
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
171
|
-
logger.error(`LiteLLM: Stream error`, {
|
|
172
|
-
provider: this.providerName,
|
|
173
|
-
modelName: this.modelName,
|
|
174
|
-
error: errorMessage,
|
|
175
|
-
chunkCount,
|
|
176
|
-
});
|
|
177
|
-
},
|
|
178
|
-
onFinish: (event) => {
|
|
179
|
-
logger.debug(`LiteLLM: Stream finished`, {
|
|
180
|
-
finishReason: event.finishReason,
|
|
181
|
-
totalChunks: chunkCount,
|
|
182
|
-
});
|
|
183
|
-
},
|
|
184
|
-
onChunk: () => {
|
|
185
|
-
chunkCount++;
|
|
186
|
-
},
|
|
187
|
-
onStepFinish: ({ toolCalls, toolResults }) => {
|
|
188
|
-
logger.info("Tool execution completed", { toolResults, toolCalls });
|
|
189
|
-
this.handleToolExecutionStorage(toolCalls, toolResults, options, new Date()).catch((error) => {
|
|
190
|
-
logger.warn("[LiteLLMProvider] Failed to store tool executions", {
|
|
191
|
-
provider: this.providerName,
|
|
192
|
-
error: error instanceof Error ? error.message : String(error),
|
|
193
|
-
});
|
|
194
|
-
});
|
|
195
|
-
},
|
|
196
|
-
};
|
|
197
|
-
// Add analysisSchema support if provided
|
|
198
|
-
if (analysisSchema) {
|
|
199
|
-
try {
|
|
200
|
-
streamOptions = {
|
|
201
|
-
...streamOptions,
|
|
202
|
-
experimental_output: Output.object({
|
|
203
|
-
schema: analysisSchema,
|
|
204
|
-
}),
|
|
205
|
-
};
|
|
206
|
-
}
|
|
207
|
-
catch (error) {
|
|
208
|
-
logger.warn("Schema application failed, continuing without schema", {
|
|
209
|
-
error: String(error),
|
|
210
|
-
});
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
// Wrap streamText in an OTel span to capture provider-level latency, token usage, and cost
|
|
214
|
-
const streamSpan = streamTracer.startSpan("neurolink.provider.streamText", {
|
|
215
|
-
kind: SpanKind.CLIENT,
|
|
216
|
-
attributes: {
|
|
217
|
-
"gen_ai.system": "litellm",
|
|
218
|
-
"gen_ai.request.model": getModelId(model, this.modelName || "unknown"),
|
|
219
|
-
},
|
|
220
|
-
});
|
|
221
|
-
let result;
|
|
222
|
-
try {
|
|
223
|
-
result = streamText(streamOptions);
|
|
224
|
-
}
|
|
225
|
-
catch (streamError) {
|
|
226
|
-
streamSpan.setStatus({
|
|
227
|
-
code: SpanStatusCode.ERROR,
|
|
228
|
-
message: streamError instanceof Error
|
|
229
|
-
? streamError.message
|
|
230
|
-
: String(streamError),
|
|
231
|
-
});
|
|
232
|
-
streamSpan.end();
|
|
233
|
-
throw streamError;
|
|
234
|
-
}
|
|
235
|
-
// Collect token usage, cost, and finish reason asynchronously when the stream completes,
|
|
236
|
-
// then end the span. This avoids blocking the stream consumer.
|
|
237
|
-
Promise.resolve(result.usage)
|
|
238
|
-
.then((usage) => {
|
|
239
|
-
streamSpan.setAttribute("gen_ai.usage.input_tokens", usage.inputTokens || 0);
|
|
240
|
-
streamSpan.setAttribute("gen_ai.usage.output_tokens", usage.outputTokens || 0);
|
|
241
|
-
const cost = calculateCost(this.providerName, this.modelName, {
|
|
242
|
-
input: usage.inputTokens || 0,
|
|
243
|
-
output: usage.outputTokens || 0,
|
|
244
|
-
total: (usage.inputTokens || 0) + (usage.outputTokens || 0),
|
|
245
|
-
});
|
|
246
|
-
if (cost && cost > 0) {
|
|
247
|
-
streamSpan.setAttribute("neurolink.cost", cost);
|
|
248
|
-
}
|
|
249
|
-
})
|
|
250
|
-
.catch(() => {
|
|
251
|
-
// Usage may not be available if the stream is aborted
|
|
252
|
-
});
|
|
253
|
-
Promise.resolve(result.finishReason)
|
|
254
|
-
.then((reason) => {
|
|
255
|
-
streamSpan.setAttribute("gen_ai.response.finish_reason", reason || "unknown");
|
|
256
|
-
})
|
|
257
|
-
.catch(() => {
|
|
258
|
-
// Finish reason may not be available if the stream is aborted
|
|
259
|
-
});
|
|
260
|
-
Promise.resolve(result.text)
|
|
261
|
-
.then(() => {
|
|
262
|
-
streamSpan.end();
|
|
263
|
-
})
|
|
264
|
-
.catch((err) => {
|
|
265
|
-
streamSpan.setStatus({
|
|
266
|
-
code: SpanStatusCode.ERROR,
|
|
267
|
-
message: err instanceof Error ? err.message : String(err),
|
|
268
|
-
});
|
|
269
|
-
streamSpan.end();
|
|
270
|
-
});
|
|
271
|
-
timeoutController?.cleanup();
|
|
272
|
-
// Transform stream to content object stream using fullStream (handles both text and tool calls)
|
|
273
|
-
// Note: fullStream includes tool results, textStream only has text
|
|
274
|
-
const transformedStream = (async function* () {
|
|
275
|
-
try {
|
|
276
|
-
// Try fullStream first (handles both text and tool calls), fallback to textStream
|
|
277
|
-
const streamToUse = result.fullStream || result.textStream;
|
|
278
|
-
for await (const chunk of streamToUse) {
|
|
279
|
-
// Handle different chunk types from fullStream
|
|
280
|
-
if (chunk && typeof chunk === "object") {
|
|
281
|
-
// Check for error chunks first (critical error handling)
|
|
282
|
-
if ("type" in chunk && chunk.type === "error") {
|
|
283
|
-
const errorChunk = chunk;
|
|
284
|
-
logger.error(`LiteLLM: Error chunk received:`, {
|
|
285
|
-
errorType: errorChunk.type,
|
|
286
|
-
errorDetails: errorChunk.error,
|
|
287
|
-
});
|
|
288
|
-
throw new Error(`LiteLLM streaming error: ${errorChunk.error?.message || "Unknown error"}`);
|
|
289
|
-
}
|
|
290
|
-
if ("textDelta" in chunk) {
|
|
291
|
-
// Text delta from fullStream
|
|
292
|
-
const textDelta = chunk.textDelta;
|
|
293
|
-
if (textDelta) {
|
|
294
|
-
yield { content: textDelta };
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
else if ("type" in chunk &&
|
|
298
|
-
chunk.type === "tool-call" &&
|
|
299
|
-
"toolCallId" in chunk) {
|
|
300
|
-
// Tool call event - log for debugging
|
|
301
|
-
const toolCallId = String(chunk.toolCallId);
|
|
302
|
-
const toolName = "toolName" in chunk ? String(chunk.toolName) : "unknown";
|
|
303
|
-
logger.debug("LiteLLM: Tool call", {
|
|
304
|
-
toolCallId,
|
|
305
|
-
toolName,
|
|
306
|
-
});
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
else if (typeof chunk === "string") {
|
|
310
|
-
// Direct string chunk from textStream fallback
|
|
311
|
-
yield { content: chunk };
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
catch (streamError) {
|
|
316
|
-
// AI SDK v6 throws NoOutputGeneratedError when the stream produced no output.
|
|
317
|
-
if (NoOutputGeneratedError.isInstance(streamError)) {
|
|
318
|
-
logger.warn("LiteLLM: Stream produced no output (NoOutputGeneratedError)");
|
|
319
|
-
return;
|
|
320
|
-
}
|
|
321
|
-
throw streamError;
|
|
322
|
-
}
|
|
323
|
-
})();
|
|
324
|
-
// Create analytics promise that resolves after stream completion
|
|
325
|
-
const analyticsPromise = streamAnalyticsCollector.createAnalytics(this.providerName, this.modelName, result, Date.now() - startTime, {
|
|
326
|
-
requestId: options.requestId ??
|
|
327
|
-
`litellm-stream-${Date.now()}`,
|
|
328
|
-
streamingMode: true,
|
|
329
|
-
});
|
|
330
|
-
return {
|
|
331
|
-
stream: transformedStream,
|
|
332
|
-
provider: this.providerName,
|
|
333
|
-
model: this.modelName,
|
|
334
|
-
analytics: analyticsPromise,
|
|
335
|
-
metadata: {
|
|
336
|
-
startTime,
|
|
337
|
-
streamId: `litellm-${Date.now()}`,
|
|
338
|
-
},
|
|
339
|
-
};
|
|
340
|
-
}
|
|
341
|
-
catch (error) {
|
|
342
|
-
timeoutController?.cleanup();
|
|
343
|
-
throw this.handleProviderError(error);
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
/**
|
|
347
|
-
* Generate an embedding for a single text input
|
|
348
|
-
* Uses the LiteLLM proxy with OpenAI-compatible embedding API
|
|
349
|
-
*/
|
|
350
|
-
async embed(text, modelName) {
|
|
351
|
-
const { embed: aiEmbed } = await import("ai");
|
|
352
|
-
const { createOpenAI } = await import("@ai-sdk/openai");
|
|
353
|
-
const config = getLiteLLMConfig();
|
|
354
|
-
const embeddingModelName = modelName ||
|
|
355
|
-
process.env.LITELLM_EMBEDDING_MODEL ||
|
|
356
|
-
"gemini-embedding-001";
|
|
357
|
-
const customOpenAI = createOpenAI({
|
|
358
|
-
baseURL: config.baseURL,
|
|
359
|
-
apiKey: config.apiKey,
|
|
360
|
-
fetch: createProxyFetch(),
|
|
361
|
-
});
|
|
362
|
-
const embeddingModel = customOpenAI.textEmbeddingModel(embeddingModelName);
|
|
363
|
-
const result = await aiEmbed({ model: embeddingModel, value: text });
|
|
364
|
-
return result.embedding;
|
|
365
|
-
}
|
|
366
|
-
/**
|
|
367
|
-
* Generate embeddings for multiple text inputs
|
|
368
|
-
* Uses the LiteLLM proxy with OpenAI-compatible embedding API
|
|
369
|
-
*/
|
|
370
|
-
async embedMany(texts, modelName) {
|
|
371
|
-
const { embedMany: aiEmbedMany } = await import("ai");
|
|
372
|
-
const { createOpenAI } = await import("@ai-sdk/openai");
|
|
373
|
-
const config = getLiteLLMConfig();
|
|
374
|
-
const embeddingModelName = modelName ||
|
|
375
|
-
process.env.LITELLM_EMBEDDING_MODEL ||
|
|
376
|
-
"gemini-embedding-001";
|
|
377
|
-
const customOpenAI = createOpenAI({
|
|
378
|
-
baseURL: config.baseURL,
|
|
379
|
-
apiKey: config.apiKey,
|
|
380
|
-
fetch: createProxyFetch(),
|
|
381
|
-
});
|
|
382
|
-
const embeddingModel = customOpenAI.textEmbeddingModel(embeddingModelName);
|
|
383
|
-
const result = await aiEmbedMany({ model: embeddingModel, values: texts });
|
|
384
|
-
return result.embeddings;
|
|
385
|
-
}
|
|
386
|
-
/**
|
|
387
|
-
* Get available models from LiteLLM proxy server
|
|
388
|
-
* Dynamically fetches from /v1/models endpoint with caching and fallback
|
|
389
|
-
*/
|
|
390
|
-
async getAvailableModels() {
|
|
391
|
-
const functionTag = "LiteLLMProvider.getAvailableModels";
|
|
392
|
-
const now = Date.now();
|
|
393
|
-
// Check if cached models are still valid
|
|
394
|
-
if (LiteLLMProvider.modelsCache.length > 0 &&
|
|
395
|
-
now - LiteLLMProvider.modelsCacheTime <
|
|
396
|
-
LiteLLMProvider.MODELS_CACHE_DURATION) {
|
|
397
|
-
logger.debug(`[${functionTag}] Using cached models`, {
|
|
398
|
-
cacheAge: Math.round((now - LiteLLMProvider.modelsCacheTime) / 1000),
|
|
399
|
-
modelCount: LiteLLMProvider.modelsCache.length,
|
|
400
|
-
});
|
|
401
|
-
return LiteLLMProvider.modelsCache;
|
|
402
|
-
}
|
|
403
|
-
// Try to fetch models dynamically
|
|
404
|
-
try {
|
|
405
|
-
const dynamicModels = await this.fetchModelsFromAPI();
|
|
406
|
-
if (dynamicModels.length > 0) {
|
|
407
|
-
// Cache successful result
|
|
408
|
-
LiteLLMProvider.modelsCache = dynamicModels;
|
|
409
|
-
LiteLLMProvider.modelsCacheTime = now;
|
|
410
|
-
logger.debug(`[${functionTag}] Successfully fetched models from API`, {
|
|
411
|
-
modelCount: dynamicModels.length,
|
|
412
|
-
});
|
|
413
|
-
return dynamicModels;
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
catch (error) {
|
|
417
|
-
logger.warn(`[${functionTag}] Failed to fetch models from API, using fallback`, {
|
|
418
|
-
error: error instanceof Error ? error.message : String(error),
|
|
419
|
-
});
|
|
420
|
-
}
|
|
421
|
-
// Fallback to hardcoded list if API fetch fails
|
|
422
|
-
const fallbackModels = process.env.LITELLM_FALLBACK_MODELS?.split(",").map((m) => m.trim()) || [
|
|
423
|
-
"openai/gpt-4o", // minimal safe baseline
|
|
424
|
-
"anthropic/claude-3-haiku",
|
|
425
|
-
"meta-llama/llama-3.1-8b-instruct",
|
|
426
|
-
"google/gemini-2.5-flash",
|
|
427
|
-
];
|
|
428
|
-
logger.debug(`[${functionTag}] Using fallback model list`, {
|
|
429
|
-
modelCount: fallbackModels.length,
|
|
430
|
-
});
|
|
431
|
-
return fallbackModels;
|
|
432
|
-
}
|
|
433
|
-
/**
|
|
434
|
-
* Fetch available models from LiteLLM proxy /v1/models endpoint
|
|
435
|
-
* @private
|
|
436
|
-
*/
|
|
437
|
-
async fetchModelsFromAPI() {
|
|
438
|
-
const functionTag = "LiteLLMProvider.fetchModelsFromAPI";
|
|
439
|
-
const config = getLiteLLMConfig();
|
|
440
|
-
const modelsUrl = `${config.baseURL}/v1/models`;
|
|
441
|
-
const controller = new AbortController();
|
|
442
|
-
const timeoutId = setTimeout(() => controller.abort(), 5000); // 5 second timeout
|
|
443
|
-
try {
|
|
444
|
-
logger.debug(`[${functionTag}] Fetching models from ${modelsUrl}`);
|
|
445
|
-
const proxyFetch = createProxyFetch();
|
|
446
|
-
const response = await proxyFetch(modelsUrl, {
|
|
447
|
-
method: "GET",
|
|
448
|
-
headers: {
|
|
449
|
-
Authorization: `Bearer ${config.apiKey}`,
|
|
450
|
-
"Content-Type": "application/json",
|
|
451
|
-
},
|
|
452
|
-
signal: controller.signal,
|
|
453
|
-
});
|
|
454
|
-
clearTimeout(timeoutId);
|
|
455
|
-
if (!response.ok) {
|
|
456
|
-
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
457
|
-
}
|
|
458
|
-
const data = await response.json();
|
|
459
|
-
// Parse OpenAI-compatible models response
|
|
460
|
-
if (data && Array.isArray(data.data)) {
|
|
461
|
-
const models = data.data
|
|
462
|
-
.map((model) => typeof model === "object" &&
|
|
463
|
-
model !== null &&
|
|
464
|
-
"id" in model &&
|
|
465
|
-
typeof model.id === "string"
|
|
466
|
-
? model.id
|
|
467
|
-
: undefined)
|
|
468
|
-
.filter((id) => typeof id === "string" && id.length > 0)
|
|
469
|
-
.sort();
|
|
470
|
-
logger.debug(`[${functionTag}] Successfully parsed models`, {
|
|
471
|
-
totalModels: models.length,
|
|
472
|
-
sampleModels: models.slice(0, 5),
|
|
473
|
-
});
|
|
474
|
-
return models;
|
|
475
|
-
}
|
|
476
|
-
else {
|
|
477
|
-
throw new Error("Invalid response format: expected data.data array");
|
|
478
|
-
}
|
|
479
|
-
}
|
|
480
|
-
catch (error) {
|
|
481
|
-
clearTimeout(timeoutId);
|
|
482
|
-
if (isAbortError(error)) {
|
|
483
|
-
throw new NetworkError("Request timed out after 5 seconds", this.providerName);
|
|
484
|
-
}
|
|
485
|
-
throw error;
|
|
486
|
-
}
|
|
487
|
-
}
|
|
488
|
-
}
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
import { createMistral } from "@ai-sdk/mistral";
|
|
2
|
-
import { stepCountIs, streamText } from "ai";
|
|
3
|
-
import { BaseProvider } from "../core/baseProvider.js";
|
|
4
|
-
import { DEFAULT_MAX_STEPS } from "../core/constants.js";
|
|
5
|
-
import { streamAnalyticsCollector } from "../core/streamAnalytics.js";
|
|
6
|
-
import { createProxyFetch } from "../proxy/proxyFetch.js";
|
|
7
|
-
import { logger } from "../utils/logger.js";
|
|
8
|
-
import { createMistralConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
9
|
-
import { composeAbortSignals, createTimeoutController, TimeoutError, } from "../utils/timeout.js";
|
|
10
|
-
import { toAnalyticsStreamResult } from "./providerTypeUtils.js";
|
|
11
|
-
// Configuration helpers - now using consolidated utility
|
|
12
|
-
const getMistralApiKey = () => {
|
|
13
|
-
return validateApiKey(createMistralConfig());
|
|
14
|
-
};
|
|
15
|
-
const getDefaultMistralModel = () => {
|
|
16
|
-
// Default to vision-capable Mistral Small 2506 (June 2025) with multimodal support
|
|
17
|
-
return getProviderModel("MISTRAL_MODEL", "mistral-small-2506");
|
|
18
|
-
};
|
|
19
|
-
/**
|
|
20
|
-
* Mistral AI Provider v2 - BaseProvider Implementation
|
|
21
|
-
* Supports official AI-SDK integration with all Mistral models
|
|
22
|
-
*/
|
|
23
|
-
export class MistralProvider extends BaseProvider {
|
|
24
|
-
model;
|
|
25
|
-
constructor(modelName, sdk) {
|
|
26
|
-
// Type guard for NeuroLink parameter validation
|
|
27
|
-
const validatedNeurolink = sdk && typeof sdk === "object" && "getInMemoryServers" in sdk
|
|
28
|
-
? sdk
|
|
29
|
-
: undefined;
|
|
30
|
-
super(modelName, "mistral", validatedNeurolink);
|
|
31
|
-
// Initialize Mistral model with API key validation and proxy support
|
|
32
|
-
const apiKey = getMistralApiKey();
|
|
33
|
-
const mistral = createMistral({
|
|
34
|
-
apiKey: apiKey,
|
|
35
|
-
fetch: createProxyFetch(),
|
|
36
|
-
});
|
|
37
|
-
this.model = mistral(this.modelName);
|
|
38
|
-
logger.debug("Mistral Provider v2 initialized", {
|
|
39
|
-
modelName: this.modelName,
|
|
40
|
-
providerName: this.providerName,
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
// generate() method is inherited from BaseProvider; this provider uses the base implementation for generation with tools
|
|
44
|
-
async executeStream(options, _analysisSchema) {
|
|
45
|
-
this.validateStreamOptions(options);
|
|
46
|
-
const startTime = Date.now();
|
|
47
|
-
const timeout = this.getTimeout(options);
|
|
48
|
-
const timeoutController = createTimeoutController(timeout, this.providerName, "stream");
|
|
49
|
-
try {
|
|
50
|
-
// Get tools - options.tools is pre-merged by BaseProvider.stream()
|
|
51
|
-
const shouldUseTools = !options.disableTools && this.supportsTools();
|
|
52
|
-
const tools = shouldUseTools
|
|
53
|
-
? options.tools || (await this.getAllTools())
|
|
54
|
-
: {};
|
|
55
|
-
// Build message array from options with multimodal support
|
|
56
|
-
// Using protected helper from BaseProvider to eliminate code duplication
|
|
57
|
-
const messages = await this.buildMessagesForStream(options);
|
|
58
|
-
const model = await this.getAISDKModelWithMiddleware(options); // This is where network connection happens!
|
|
59
|
-
const result = await streamText({
|
|
60
|
-
model,
|
|
61
|
-
messages: messages,
|
|
62
|
-
temperature: options.temperature,
|
|
63
|
-
maxOutputTokens: options.maxTokens, // No default limit - unlimited unless specified
|
|
64
|
-
tools,
|
|
65
|
-
stopWhen: stepCountIs(options.maxSteps || DEFAULT_MAX_STEPS),
|
|
66
|
-
toolChoice: shouldUseTools ? "auto" : "none",
|
|
67
|
-
abortSignal: composeAbortSignals(options.abortSignal, timeoutController?.controller.signal),
|
|
68
|
-
experimental_telemetry: this.telemetryHandler.getTelemetryConfig(options),
|
|
69
|
-
onStepFinish: ({ toolCalls, toolResults }) => {
|
|
70
|
-
this.handleToolExecutionStorage(toolCalls, toolResults, options, new Date()).catch((error) => {
|
|
71
|
-
logger.warn("[MistralProvider] Failed to store tool executions", {
|
|
72
|
-
provider: this.providerName,
|
|
73
|
-
error: error instanceof Error ? error.message : String(error),
|
|
74
|
-
});
|
|
75
|
-
});
|
|
76
|
-
},
|
|
77
|
-
});
|
|
78
|
-
timeoutController?.cleanup();
|
|
79
|
-
// Transform string stream to content object stream using BaseProvider method
|
|
80
|
-
const transformedStream = this.createTextStream(result);
|
|
81
|
-
// Create analytics promise that resolves after stream completion
|
|
82
|
-
const analyticsPromise = streamAnalyticsCollector.createAnalytics(this.providerName, this.modelName, toAnalyticsStreamResult(result), Date.now() - startTime, {
|
|
83
|
-
requestId: `mistral-stream-${Date.now()}`,
|
|
84
|
-
streamingMode: true,
|
|
85
|
-
});
|
|
86
|
-
return {
|
|
87
|
-
stream: transformedStream,
|
|
88
|
-
provider: this.providerName,
|
|
89
|
-
model: this.modelName,
|
|
90
|
-
analytics: analyticsPromise,
|
|
91
|
-
metadata: {
|
|
92
|
-
startTime,
|
|
93
|
-
streamId: `mistral-${Date.now()}`,
|
|
94
|
-
},
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
catch (error) {
|
|
98
|
-
timeoutController?.cleanup();
|
|
99
|
-
throw this.handleProviderError(error);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
// ===================
|
|
103
|
-
// ABSTRACT METHOD IMPLEMENTATIONS
|
|
104
|
-
// ===================
|
|
105
|
-
getProviderName() {
|
|
106
|
-
return this.providerName;
|
|
107
|
-
}
|
|
108
|
-
getDefaultModel() {
|
|
109
|
-
return getDefaultMistralModel();
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Returns the Vercel AI SDK model instance for Mistral
|
|
113
|
-
*/
|
|
114
|
-
getAISDKModel() {
|
|
115
|
-
return this.model;
|
|
116
|
-
}
|
|
117
|
-
formatProviderError(error) {
|
|
118
|
-
if (error instanceof TimeoutError) {
|
|
119
|
-
return new Error(`Mistral request timed out: ${error.message}`);
|
|
120
|
-
}
|
|
121
|
-
const errorRecord = error;
|
|
122
|
-
const message = typeof errorRecord?.message === "string"
|
|
123
|
-
? errorRecord.message
|
|
124
|
-
: "Unknown error";
|
|
125
|
-
if (message.includes("API_KEY_INVALID") ||
|
|
126
|
-
message.includes("Invalid API key")) {
|
|
127
|
-
return new Error("Invalid Mistral API key. Please check your MISTRAL_API_KEY environment variable.");
|
|
128
|
-
}
|
|
129
|
-
if (message.includes("Rate limit exceeded")) {
|
|
130
|
-
return new Error("Mistral rate limit exceeded");
|
|
131
|
-
}
|
|
132
|
-
return new Error(`Mistral error: ${message}`);
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Validate provider configuration
|
|
136
|
-
*/
|
|
137
|
-
async validateConfiguration() {
|
|
138
|
-
try {
|
|
139
|
-
getMistralApiKey();
|
|
140
|
-
return true;
|
|
141
|
-
}
|
|
142
|
-
catch {
|
|
143
|
-
return false;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Get provider-specific configuration
|
|
148
|
-
*/
|
|
149
|
-
getConfiguration() {
|
|
150
|
-
return {
|
|
151
|
-
provider: this.providerName,
|
|
152
|
-
model: this.modelName,
|
|
153
|
-
defaultModel: getDefaultMistralModel(),
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
export default MistralProvider;
|