@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,627 +0,0 @@
|
|
|
1
|
-
import { createOpenAI } from "@ai-sdk/openai";
|
|
2
|
-
import { embed, embedMany, NoOutputGeneratedError, stepCountIs, streamText, } from "ai";
|
|
3
|
-
import { trace, SpanKind, SpanStatusCode } from "@opentelemetry/api";
|
|
4
|
-
import { AIProviderName } from "../constants/enums.js";
|
|
5
|
-
import { BaseProvider } from "../core/baseProvider.js";
|
|
6
|
-
import { DEFAULT_MAX_STEPS } from "../core/constants.js";
|
|
7
|
-
import { streamAnalyticsCollector } from "../core/streamAnalytics.js";
|
|
8
|
-
import { createProxyFetch } from "../proxy/proxyFetch.js";
|
|
9
|
-
import { AuthenticationError, InvalidModelError, NetworkError, ProviderError, RateLimitError, } from "../types/errors.js";
|
|
10
|
-
import { logger } from "../utils/logger.js";
|
|
11
|
-
import { calculateCost } from "../utils/pricing.js";
|
|
12
|
-
import { createOpenAIConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
13
|
-
import { isZodSchema } from "../utils/schemaConversion.js";
|
|
14
|
-
import { composeAbortSignals, createTimeoutController, TimeoutError, } from "../utils/timeout.js";
|
|
15
|
-
import { getModelId } from "./providerTypeUtils.js";
|
|
16
|
-
/**
|
|
17
|
-
* Retrieve a tool's schema, handling both AI SDK v6 (`inputSchema`) and
|
|
18
|
-
* legacy v4 (`parameters`) field names.
|
|
19
|
-
*/
|
|
20
|
-
function getToolSchema(tool) {
|
|
21
|
-
const t = tool;
|
|
22
|
-
return t.inputSchema ?? t.parameters;
|
|
23
|
-
}
|
|
24
|
-
// Configuration helpers - now using consolidated utility
|
|
25
|
-
const getOpenAIApiKey = () => {
|
|
26
|
-
return validateApiKey(createOpenAIConfig());
|
|
27
|
-
};
|
|
28
|
-
const getOpenAIModel = () => {
|
|
29
|
-
return getProviderModel("OPENAI_MODEL", "gpt-4o");
|
|
30
|
-
};
|
|
31
|
-
const streamTracer = trace.getTracer("neurolink.provider.openai");
|
|
32
|
-
/**
|
|
33
|
-
* OpenAI Provider v2 - BaseProvider Implementation
|
|
34
|
-
* Migrated to use factory pattern with exact Google AI provider pattern
|
|
35
|
-
*/
|
|
36
|
-
export class OpenAIProvider extends BaseProvider {
|
|
37
|
-
model;
|
|
38
|
-
constructor(modelName, neurolink) {
|
|
39
|
-
super(modelName || getOpenAIModel(), AIProviderName.OPENAI, neurolink);
|
|
40
|
-
// Initialize OpenAI provider with proxy support
|
|
41
|
-
const openai = createOpenAI({
|
|
42
|
-
apiKey: getOpenAIApiKey(),
|
|
43
|
-
fetch: createProxyFetch(),
|
|
44
|
-
});
|
|
45
|
-
// Initialize model
|
|
46
|
-
this.model = openai(this.modelName);
|
|
47
|
-
logger.debug("OpenAIProvider constructor called", {
|
|
48
|
-
model: this.modelName,
|
|
49
|
-
provider: this.providerName,
|
|
50
|
-
supportsTools: this.supportsTools(),
|
|
51
|
-
className: this.constructor.name,
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
// ===================
|
|
55
|
-
// ABSTRACT METHOD IMPLEMENTATIONS
|
|
56
|
-
// ===================
|
|
57
|
-
/**
|
|
58
|
-
* Check if this provider supports tool/function calling
|
|
59
|
-
*/
|
|
60
|
-
supportsTools() {
|
|
61
|
-
return true; // Re-enable tools now that we understand the issue
|
|
62
|
-
}
|
|
63
|
-
getProviderName() {
|
|
64
|
-
return AIProviderName.OPENAI;
|
|
65
|
-
}
|
|
66
|
-
getDefaultModel() {
|
|
67
|
-
return getOpenAIModel();
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Get the default embedding model for OpenAI
|
|
71
|
-
* @returns The default OpenAI embedding model name
|
|
72
|
-
*/
|
|
73
|
-
getDefaultEmbeddingModel() {
|
|
74
|
-
return process.env.OPENAI_EMBEDDING_MODEL || "text-embedding-3-small";
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Returns the Vercel AI SDK model instance for OpenAI
|
|
78
|
-
*/
|
|
79
|
-
getAISDKModel() {
|
|
80
|
-
return this.model;
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* OpenAI-specific tool validation and filtering
|
|
84
|
-
* Filters out tools that might cause streaming issues
|
|
85
|
-
*/
|
|
86
|
-
validateAndFilterToolsForOpenAI(tools) {
|
|
87
|
-
const validTools = {};
|
|
88
|
-
for (const [name, tool] of Object.entries(tools)) {
|
|
89
|
-
try {
|
|
90
|
-
// Basic validation - ensure tool has required structure
|
|
91
|
-
if (tool && typeof tool === "object") {
|
|
92
|
-
// Check if tool has description (required by OpenAI)
|
|
93
|
-
if (tool.description && typeof tool.description === "string") {
|
|
94
|
-
// Keep the original tool structure - AI SDK will handle Zod schema conversion internally
|
|
95
|
-
const processedTool = { ...tool };
|
|
96
|
-
// Validate that Zod schemas are properly structured for AI SDK processing
|
|
97
|
-
const toolSchema = getToolSchema(tool);
|
|
98
|
-
if (toolSchema && isZodSchema(toolSchema)) {
|
|
99
|
-
logger.debug(`OpenAI: Tool ${name} has Zod schema - AI SDK will handle conversion`);
|
|
100
|
-
// Basic validation that the Zod schema has the required structure
|
|
101
|
-
this.validateZodSchema(name, toolSchema);
|
|
102
|
-
}
|
|
103
|
-
// Include the tool with original Zod schema for AI SDK processing
|
|
104
|
-
if (this.isValidToolStructure(processedTool)) {
|
|
105
|
-
validTools[name] = processedTool;
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
108
|
-
logger.warn(`OpenAI: Filtering out tool with invalid structure: ${name}`, {
|
|
109
|
-
parametersType: typeof getToolSchema(processedTool),
|
|
110
|
-
hasDescription: !!processedTool.description,
|
|
111
|
-
hasExecute: !!processedTool.execute,
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
else {
|
|
116
|
-
logger.warn(`OpenAI: Filtering out tool without description: ${name}`);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
else {
|
|
120
|
-
logger.warn(`OpenAI: Filtering out invalid tool: ${name}`);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
catch (error) {
|
|
124
|
-
logger.warn(`OpenAI: Error validating tool ${name}:`, error);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
return validTools;
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Validate Zod schema structure
|
|
131
|
-
*/
|
|
132
|
-
validateZodSchema(toolName, schema) {
|
|
133
|
-
try {
|
|
134
|
-
const zodSchema = schema;
|
|
135
|
-
if (zodSchema._def && zodSchema._def.typeName) {
|
|
136
|
-
logger.debug(`OpenAI: Zod schema for ${toolName} appears valid`, {
|
|
137
|
-
typeName: zodSchema._def.typeName,
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
else {
|
|
141
|
-
logger.warn(`OpenAI: Zod schema for ${toolName} missing typeName - may cause issues`);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
catch (zodValidationError) {
|
|
145
|
-
logger.warn(`OpenAI: Zod schema validation failed for ${toolName}:`, zodValidationError);
|
|
146
|
-
// Continue anyway - let AI SDK handle it
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Validate tool structure for OpenAI compatibility
|
|
151
|
-
* More lenient validation to avoid filtering out valid tools
|
|
152
|
-
*/
|
|
153
|
-
isValidToolStructure(tool) {
|
|
154
|
-
if (!tool || typeof tool !== "object") {
|
|
155
|
-
return false;
|
|
156
|
-
}
|
|
157
|
-
const toolObj = tool;
|
|
158
|
-
// Ensure tool has description and execute function
|
|
159
|
-
if (!toolObj.description || typeof toolObj.description !== "string") {
|
|
160
|
-
return false;
|
|
161
|
-
}
|
|
162
|
-
if (!toolObj.execute || typeof toolObj.execute !== "function") {
|
|
163
|
-
return false;
|
|
164
|
-
}
|
|
165
|
-
// AI SDK v6 uses inputSchema; v4 used parameters — check both
|
|
166
|
-
const schema = "inputSchema" in toolObj
|
|
167
|
-
? toolObj.inputSchema
|
|
168
|
-
: "parameters" in toolObj
|
|
169
|
-
? toolObj.parameters
|
|
170
|
-
: undefined;
|
|
171
|
-
return this.isValidToolParameters(schema);
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* Validate tool parameters for OpenAI compatibility
|
|
175
|
-
* Ensures the tool has either valid Zod schema or valid JSON schema
|
|
176
|
-
*/
|
|
177
|
-
isValidToolParameters(parameters) {
|
|
178
|
-
if (!parameters) {
|
|
179
|
-
// For OpenAI, tools without parameters need an empty object schema
|
|
180
|
-
return true;
|
|
181
|
-
}
|
|
182
|
-
// Check if it's a Zod schema - these are valid
|
|
183
|
-
if (isZodSchema(parameters)) {
|
|
184
|
-
return true;
|
|
185
|
-
}
|
|
186
|
-
// Check if it's a JSON schema
|
|
187
|
-
if (typeof parameters !== "object" || parameters === null) {
|
|
188
|
-
return false;
|
|
189
|
-
}
|
|
190
|
-
const params = parameters;
|
|
191
|
-
// If it's a JSON schema, it should have type "object" for OpenAI
|
|
192
|
-
if (params.type && params.type !== "object") {
|
|
193
|
-
return false;
|
|
194
|
-
}
|
|
195
|
-
// OpenAI requires schemas to have properties field, even if empty
|
|
196
|
-
// If there's no properties field, the schema is incomplete
|
|
197
|
-
if (params.type === "object" && !params.properties) {
|
|
198
|
-
logger.warn(`Tool parameter schema missing properties field:`, params);
|
|
199
|
-
return false;
|
|
200
|
-
}
|
|
201
|
-
// If properties exist, they should be an object
|
|
202
|
-
if (params.properties && typeof params.properties !== "object") {
|
|
203
|
-
return false;
|
|
204
|
-
}
|
|
205
|
-
// If required exists, it should be an array
|
|
206
|
-
if (params.required && !Array.isArray(params.required)) {
|
|
207
|
-
return false;
|
|
208
|
-
}
|
|
209
|
-
return true;
|
|
210
|
-
}
|
|
211
|
-
formatProviderError(error) {
|
|
212
|
-
if (error instanceof TimeoutError) {
|
|
213
|
-
return new NetworkError(error.message, this.providerName);
|
|
214
|
-
}
|
|
215
|
-
const errorObj = error;
|
|
216
|
-
const message = errorObj?.message && typeof errorObj.message === "string"
|
|
217
|
-
? errorObj.message
|
|
218
|
-
: "Unknown error";
|
|
219
|
-
const errorType = errorObj?.type && typeof errorObj.type === "string"
|
|
220
|
-
? errorObj.type
|
|
221
|
-
: undefined;
|
|
222
|
-
if (message.includes("API_KEY_INVALID") ||
|
|
223
|
-
message.includes("Invalid API key") ||
|
|
224
|
-
errorType === "invalid_api_key") {
|
|
225
|
-
return new AuthenticationError("Invalid OpenAI API key. Please check your OPENAI_API_KEY environment variable.", this.providerName);
|
|
226
|
-
}
|
|
227
|
-
if (message.includes("rate limit") || errorType === "rate_limit_error") {
|
|
228
|
-
return new RateLimitError("OpenAI rate limit exceeded. Please try again later.", this.providerName);
|
|
229
|
-
}
|
|
230
|
-
if (message.includes("model_not_found")) {
|
|
231
|
-
return new InvalidModelError(`Model not found: ${this.modelName}`, this.providerName);
|
|
232
|
-
}
|
|
233
|
-
// Generic provider error
|
|
234
|
-
return new ProviderError(`OpenAI error: ${message}`, this.providerName);
|
|
235
|
-
}
|
|
236
|
-
/**
|
|
237
|
-
* executeGenerate method removed - generation is now handled by BaseProvider.
|
|
238
|
-
* For details on the changes and migration steps, refer to the BaseProvider documentation
|
|
239
|
-
* and the migration guide in the project repository.
|
|
240
|
-
*/
|
|
241
|
-
async executeStream(options, _analysisSchema) {
|
|
242
|
-
this.validateStreamOptions(options);
|
|
243
|
-
const startTime = Date.now();
|
|
244
|
-
const timeout = this.getTimeout(options);
|
|
245
|
-
const timeoutController = createTimeoutController(timeout, this.providerName, "stream");
|
|
246
|
-
try {
|
|
247
|
-
// Get tools - options.tools is pre-merged by BaseProvider.stream() with
|
|
248
|
-
// base tools (MCP/built-in) + user-provided tools (RAG, etc.)
|
|
249
|
-
const shouldUseTools = !options.disableTools && this.supportsTools();
|
|
250
|
-
const allTools = shouldUseTools
|
|
251
|
-
? options.tools || (await this.getAllTools())
|
|
252
|
-
: {};
|
|
253
|
-
// OpenAI-specific fix: Validate tools format and filter out problematic ones
|
|
254
|
-
let tools = this.validateAndFilterToolsForOpenAI(allTools);
|
|
255
|
-
// OpenAI max tools limit - configurable via environment variable
|
|
256
|
-
const MAX_TOOLS = parseInt(process.env.OPENAI_MAX_TOOLS || "150", 10);
|
|
257
|
-
if (Object.keys(tools).length > MAX_TOOLS) {
|
|
258
|
-
logger.warn(`OpenAI: Too many tools (${Object.keys(tools).length}), limiting to ${MAX_TOOLS} tools`);
|
|
259
|
-
const toolEntries = Object.entries(tools);
|
|
260
|
-
tools = Object.fromEntries(toolEntries.slice(0, MAX_TOOLS));
|
|
261
|
-
}
|
|
262
|
-
// Count tools with Zod schemas for debugging
|
|
263
|
-
const zodToolsCount = Object.values(allTools).filter((tool) => {
|
|
264
|
-
if (!tool || typeof tool !== "object") {
|
|
265
|
-
return false;
|
|
266
|
-
}
|
|
267
|
-
const schema = getToolSchema(tool);
|
|
268
|
-
return schema !== null && schema !== undefined && isZodSchema(schema);
|
|
269
|
-
}).length;
|
|
270
|
-
logger.info("OpenAI streaming tools", {
|
|
271
|
-
shouldUseTools,
|
|
272
|
-
allToolsCount: Object.keys(allTools).length,
|
|
273
|
-
filteredToolsCount: Object.keys(tools).length,
|
|
274
|
-
zodToolsCount,
|
|
275
|
-
toolNames: Object.keys(tools),
|
|
276
|
-
filteredOutTools: Object.keys(allTools).filter((name) => !tools[name]),
|
|
277
|
-
});
|
|
278
|
-
// Build message array from options with multimodal support
|
|
279
|
-
// Using protected helper from BaseProvider to eliminate code duplication
|
|
280
|
-
const messages = await this.buildMessagesForStream(options);
|
|
281
|
-
// Debug the actual request being sent to OpenAI
|
|
282
|
-
logger.debug(`OpenAI: streamText request parameters:`, {
|
|
283
|
-
modelName: this.modelName,
|
|
284
|
-
messagesCount: messages.length,
|
|
285
|
-
temperature: options.temperature,
|
|
286
|
-
maxTokens: options.maxTokens,
|
|
287
|
-
toolsCount: Object.keys(tools).length,
|
|
288
|
-
toolChoice: shouldUseTools && Object.keys(tools).length > 0 ? "auto" : "none",
|
|
289
|
-
maxSteps: options.maxSteps || DEFAULT_MAX_STEPS,
|
|
290
|
-
firstToolExample: Object.keys(tools).length > 0
|
|
291
|
-
? {
|
|
292
|
-
name: Object.keys(tools)[0],
|
|
293
|
-
description: tools[Object.keys(tools)[0]]?.description,
|
|
294
|
-
parametersType: typeof getToolSchema(tools[Object.keys(tools)[0]]),
|
|
295
|
-
}
|
|
296
|
-
: "no-tools",
|
|
297
|
-
});
|
|
298
|
-
const model = await this.getAISDKModelWithMiddleware(options); // This is where network connection happens!
|
|
299
|
-
// Wrap streamText in an OTel span to capture provider-level latency and token usage
|
|
300
|
-
const streamSpan = streamTracer.startSpan("neurolink.provider.streamText", {
|
|
301
|
-
kind: SpanKind.CLIENT,
|
|
302
|
-
attributes: {
|
|
303
|
-
"gen_ai.system": "openai",
|
|
304
|
-
"gen_ai.request.model": getModelId(model) || this.modelName || "unknown",
|
|
305
|
-
},
|
|
306
|
-
});
|
|
307
|
-
let result;
|
|
308
|
-
try {
|
|
309
|
-
result = streamText({
|
|
310
|
-
model,
|
|
311
|
-
messages: messages,
|
|
312
|
-
temperature: options.temperature,
|
|
313
|
-
maxOutputTokens: options.maxTokens, // No default limit - unlimited unless specified
|
|
314
|
-
maxRetries: 0, // NL11: Disable AI SDK's invisible internal retries; we handle retries with OTel instrumentation
|
|
315
|
-
tools,
|
|
316
|
-
stopWhen: stepCountIs(options.maxSteps || DEFAULT_MAX_STEPS),
|
|
317
|
-
toolChoice: shouldUseTools && Object.keys(tools).length > 0 ? "auto" : "none",
|
|
318
|
-
abortSignal: composeAbortSignals(options.abortSignal, timeoutController?.controller.signal),
|
|
319
|
-
experimental_telemetry: this.telemetryHandler.getTelemetryConfig(options),
|
|
320
|
-
onStepFinish: ({ toolCalls, toolResults }) => {
|
|
321
|
-
logger.info("Tool execution completed", {
|
|
322
|
-
toolResults,
|
|
323
|
-
toolCalls,
|
|
324
|
-
});
|
|
325
|
-
// Handle tool execution storage
|
|
326
|
-
this.handleToolExecutionStorage(toolCalls, toolResults, options, new Date()).catch((error) => {
|
|
327
|
-
logger.warn("[OpenAIProvider] Failed to store tool executions", {
|
|
328
|
-
provider: this.providerName,
|
|
329
|
-
error: error instanceof Error ? error.message : String(error),
|
|
330
|
-
});
|
|
331
|
-
});
|
|
332
|
-
},
|
|
333
|
-
});
|
|
334
|
-
}
|
|
335
|
-
catch (streamError) {
|
|
336
|
-
streamSpan.end();
|
|
337
|
-
throw streamError;
|
|
338
|
-
}
|
|
339
|
-
// Collect token usage and finish reason asynchronously when the stream completes,
|
|
340
|
-
// then end the span. This avoids blocking the stream consumer.
|
|
341
|
-
Promise.resolve(result.usage)
|
|
342
|
-
.then((usage) => {
|
|
343
|
-
streamSpan.setAttribute("gen_ai.usage.input_tokens", usage.inputTokens || 0);
|
|
344
|
-
streamSpan.setAttribute("gen_ai.usage.output_tokens", usage.outputTokens || 0);
|
|
345
|
-
const cost = calculateCost(this.providerName, this.modelName, {
|
|
346
|
-
input: usage.inputTokens || 0,
|
|
347
|
-
output: usage.outputTokens || 0,
|
|
348
|
-
total: (usage.inputTokens || 0) + (usage.outputTokens || 0),
|
|
349
|
-
});
|
|
350
|
-
if (cost && cost > 0) {
|
|
351
|
-
streamSpan.setAttribute("neurolink.cost", cost);
|
|
352
|
-
}
|
|
353
|
-
})
|
|
354
|
-
.catch(() => {
|
|
355
|
-
// Usage may not be available if the stream is aborted
|
|
356
|
-
});
|
|
357
|
-
Promise.resolve(result.finishReason)
|
|
358
|
-
.then((reason) => {
|
|
359
|
-
streamSpan.setAttribute("gen_ai.response.finish_reason", reason || "unknown");
|
|
360
|
-
})
|
|
361
|
-
.catch(() => {
|
|
362
|
-
// Finish reason may not be available if the stream is aborted
|
|
363
|
-
});
|
|
364
|
-
Promise.resolve(result.text)
|
|
365
|
-
.then(() => {
|
|
366
|
-
streamSpan.end();
|
|
367
|
-
})
|
|
368
|
-
.catch((err) => {
|
|
369
|
-
streamSpan.setStatus({
|
|
370
|
-
code: SpanStatusCode.ERROR,
|
|
371
|
-
message: err instanceof Error ? err.message : String(err),
|
|
372
|
-
});
|
|
373
|
-
streamSpan.end();
|
|
374
|
-
});
|
|
375
|
-
timeoutController?.cleanup();
|
|
376
|
-
// Debug the actual result structure
|
|
377
|
-
logger.debug(`OpenAI: streamText result structure:`, {
|
|
378
|
-
resultKeys: Object.keys(result),
|
|
379
|
-
hasTextStream: !!result.textStream,
|
|
380
|
-
hasToolCalls: !!result.toolCalls,
|
|
381
|
-
hasToolResults: !!result.toolResults,
|
|
382
|
-
resultType: typeof result,
|
|
383
|
-
});
|
|
384
|
-
// Transform string stream to content object stream using fullStream
|
|
385
|
-
const transformedStream = async function* () {
|
|
386
|
-
try {
|
|
387
|
-
logger.debug(`OpenAI: Starting stream transformation`, {
|
|
388
|
-
hasTextStream: !!result.textStream,
|
|
389
|
-
hasFullStream: !!result.fullStream,
|
|
390
|
-
resultKeys: Object.keys(result),
|
|
391
|
-
toolsEnabled: shouldUseTools,
|
|
392
|
-
toolsCount: Object.keys(tools).length,
|
|
393
|
-
});
|
|
394
|
-
let chunkCount = 0;
|
|
395
|
-
let contentYielded = 0;
|
|
396
|
-
// Try fullStream first (handles both text and tool calls), fallback to textStream
|
|
397
|
-
const streamToUse = result.fullStream || result.textStream;
|
|
398
|
-
if (!streamToUse) {
|
|
399
|
-
logger.error("OpenAI: No stream available in result", {
|
|
400
|
-
resultKeys: Object.keys(result),
|
|
401
|
-
});
|
|
402
|
-
return;
|
|
403
|
-
}
|
|
404
|
-
logger.debug(`OpenAI: Stream source selected:`, {
|
|
405
|
-
usingFullStream: !!result.fullStream,
|
|
406
|
-
usingTextStream: !!result.textStream && !result.fullStream,
|
|
407
|
-
streamSourceType: result.fullStream ? "fullStream" : "textStream",
|
|
408
|
-
});
|
|
409
|
-
for await (const chunk of streamToUse) {
|
|
410
|
-
chunkCount++;
|
|
411
|
-
logger.debug(`OpenAI: Processing chunk ${chunkCount}:`, {
|
|
412
|
-
chunkType: typeof chunk,
|
|
413
|
-
chunkValue: typeof chunk === "string"
|
|
414
|
-
? chunk.substring(0, 50)
|
|
415
|
-
: "not-string",
|
|
416
|
-
chunkKeys: chunk && typeof chunk === "object"
|
|
417
|
-
? Object.keys(chunk)
|
|
418
|
-
: "not-object",
|
|
419
|
-
hasText: chunk && typeof chunk === "object" && "text" in chunk,
|
|
420
|
-
hasTextDelta: chunk && typeof chunk === "object" && "textDelta" in chunk,
|
|
421
|
-
hasType: chunk && typeof chunk === "object" && "type" in chunk,
|
|
422
|
-
chunkTypeValue: chunk && typeof chunk === "object" && "type" in chunk
|
|
423
|
-
? chunk.type
|
|
424
|
-
: "no-type",
|
|
425
|
-
});
|
|
426
|
-
let contentToYield = null;
|
|
427
|
-
// Handle different chunk types from fullStream
|
|
428
|
-
if (chunk && typeof chunk === "object") {
|
|
429
|
-
// Log the full chunk structure for debugging (debug mode only)
|
|
430
|
-
if (process.env.NEUROLINK_DEBUG === "true") {
|
|
431
|
-
logger.debug(`OpenAI: Full chunk structure:`, {
|
|
432
|
-
chunkKeys: Object.keys(chunk),
|
|
433
|
-
fullChunk: JSON.stringify(chunk).substring(0, 500),
|
|
434
|
-
});
|
|
435
|
-
}
|
|
436
|
-
if ("type" in chunk && chunk.type === "error") {
|
|
437
|
-
// Handle error chunks when tools are enabled
|
|
438
|
-
const errorChunk = chunk;
|
|
439
|
-
logger.error(`OpenAI: Error chunk received:`, {
|
|
440
|
-
errorType: errorChunk.type,
|
|
441
|
-
errorDetails: errorChunk.error,
|
|
442
|
-
fullChunk: JSON.stringify(chunk),
|
|
443
|
-
});
|
|
444
|
-
// Throw a more descriptive error for tool-related issues
|
|
445
|
-
const errorMessage = errorChunk.error &&
|
|
446
|
-
typeof errorChunk.error === "object" &&
|
|
447
|
-
"message" in errorChunk.error
|
|
448
|
-
? String(errorChunk.error.message)
|
|
449
|
-
: "OpenAI API error when tools are enabled";
|
|
450
|
-
throw new Error(`OpenAI streaming error with tools: ${errorMessage}. Try disabling tools with --disableTools`);
|
|
451
|
-
}
|
|
452
|
-
else if ("type" in chunk &&
|
|
453
|
-
chunk.type === "text-delta" &&
|
|
454
|
-
"textDelta" in chunk) {
|
|
455
|
-
// Text delta from fullStream
|
|
456
|
-
contentToYield = chunk.textDelta;
|
|
457
|
-
logger.debug(`OpenAI: Found text-delta:`, {
|
|
458
|
-
textDelta: contentToYield,
|
|
459
|
-
});
|
|
460
|
-
}
|
|
461
|
-
else if ("text" in chunk) {
|
|
462
|
-
// Direct text chunk
|
|
463
|
-
contentToYield = chunk.text;
|
|
464
|
-
logger.debug(`OpenAI: Found direct text:`, {
|
|
465
|
-
text: contentToYield,
|
|
466
|
-
});
|
|
467
|
-
}
|
|
468
|
-
else {
|
|
469
|
-
// Log unhandled chunks in debug mode only
|
|
470
|
-
if (process.env.NEUROLINK_DEBUG === "true") {
|
|
471
|
-
logger.debug(`OpenAI: Unhandled object chunk:`, {
|
|
472
|
-
chunkKeys: Object.keys(chunk),
|
|
473
|
-
chunkType: chunk.type || "no-type",
|
|
474
|
-
fullChunk: JSON.stringify(chunk).substring(0, 500),
|
|
475
|
-
});
|
|
476
|
-
}
|
|
477
|
-
}
|
|
478
|
-
}
|
|
479
|
-
else if (typeof chunk === "string") {
|
|
480
|
-
// Direct string chunk from textStream
|
|
481
|
-
contentToYield = chunk;
|
|
482
|
-
logger.debug(`OpenAI: Found string chunk:`, {
|
|
483
|
-
content: contentToYield,
|
|
484
|
-
});
|
|
485
|
-
}
|
|
486
|
-
else {
|
|
487
|
-
logger.warn(`OpenAI: Unhandled chunk type:`, {
|
|
488
|
-
type: typeof chunk,
|
|
489
|
-
value: String(chunk).substring(0, 100),
|
|
490
|
-
});
|
|
491
|
-
}
|
|
492
|
-
if (contentToYield) {
|
|
493
|
-
contentYielded++;
|
|
494
|
-
logger.debug(`OpenAI: Yielding content ${contentYielded}:`, {
|
|
495
|
-
content: contentToYield.substring(0, 50),
|
|
496
|
-
length: contentToYield.length,
|
|
497
|
-
});
|
|
498
|
-
yield { content: contentToYield };
|
|
499
|
-
}
|
|
500
|
-
}
|
|
501
|
-
logger.debug(`OpenAI: Stream transformation completed`, {
|
|
502
|
-
totalChunks: chunkCount,
|
|
503
|
-
contentYielded,
|
|
504
|
-
success: contentYielded > 0,
|
|
505
|
-
});
|
|
506
|
-
if (contentYielded === 0) {
|
|
507
|
-
logger.warn(`OpenAI: No content was yielded from stream despite processing ${chunkCount} chunks`);
|
|
508
|
-
}
|
|
509
|
-
}
|
|
510
|
-
catch (streamError) {
|
|
511
|
-
// AI SDK v6 throws NoOutputGeneratedError when the stream produced no output.
|
|
512
|
-
// Treat as an empty stream rather than crashing with an unhandled rejection.
|
|
513
|
-
if (NoOutputGeneratedError.isInstance(streamError)) {
|
|
514
|
-
logger.warn("OpenAI: Stream produced no output (NoOutputGeneratedError)");
|
|
515
|
-
return;
|
|
516
|
-
}
|
|
517
|
-
logger.error(`OpenAI: Stream transformation error:`, streamError);
|
|
518
|
-
throw streamError;
|
|
519
|
-
}
|
|
520
|
-
};
|
|
521
|
-
// Create analytics promise that resolves after stream completion
|
|
522
|
-
const analyticsPromise = streamAnalyticsCollector.createAnalytics(this.providerName, this.modelName, result, Date.now() - startTime, {
|
|
523
|
-
requestId: `openai-stream-${Date.now()}`,
|
|
524
|
-
streamingMode: true,
|
|
525
|
-
});
|
|
526
|
-
return {
|
|
527
|
-
stream: transformedStream(),
|
|
528
|
-
provider: this.providerName,
|
|
529
|
-
model: this.modelName,
|
|
530
|
-
analytics: analyticsPromise,
|
|
531
|
-
metadata: {
|
|
532
|
-
startTime,
|
|
533
|
-
streamId: `openai-${Date.now()}`,
|
|
534
|
-
},
|
|
535
|
-
};
|
|
536
|
-
}
|
|
537
|
-
catch (error) {
|
|
538
|
-
timeoutController?.cleanup();
|
|
539
|
-
throw this.handleProviderError(error);
|
|
540
|
-
}
|
|
541
|
-
}
|
|
542
|
-
/**
|
|
543
|
-
* Generate embeddings for text using OpenAI text-embedding models
|
|
544
|
-
* @param text - The text to embed
|
|
545
|
-
* @param modelName - The embedding model to use (default: text-embedding-3-small)
|
|
546
|
-
* @returns Promise resolving to the embedding vector
|
|
547
|
-
*/
|
|
548
|
-
async embed(text, modelName) {
|
|
549
|
-
const embeddingModelName = modelName || "text-embedding-3-small";
|
|
550
|
-
logger.debug("Generating embedding", {
|
|
551
|
-
provider: this.providerName,
|
|
552
|
-
model: embeddingModelName,
|
|
553
|
-
textLength: text.length,
|
|
554
|
-
});
|
|
555
|
-
try {
|
|
556
|
-
// Create embedding model using the AI SDK
|
|
557
|
-
// Create the OpenAI provider
|
|
558
|
-
const openai = createOpenAI({
|
|
559
|
-
apiKey: getOpenAIApiKey(),
|
|
560
|
-
fetch: createProxyFetch(),
|
|
561
|
-
});
|
|
562
|
-
// Get the text embedding model
|
|
563
|
-
const embeddingModel = openai.textEmbeddingModel(embeddingModelName);
|
|
564
|
-
// Generate the embedding
|
|
565
|
-
const result = await embed({
|
|
566
|
-
model: embeddingModel,
|
|
567
|
-
value: text,
|
|
568
|
-
});
|
|
569
|
-
logger.debug("Embedding generated successfully", {
|
|
570
|
-
provider: this.providerName,
|
|
571
|
-
model: embeddingModelName,
|
|
572
|
-
embeddingDimension: result.embedding.length,
|
|
573
|
-
});
|
|
574
|
-
return result.embedding;
|
|
575
|
-
}
|
|
576
|
-
catch (error) {
|
|
577
|
-
logger.error("Embedding generation failed", {
|
|
578
|
-
error: error instanceof Error ? error.message : String(error),
|
|
579
|
-
model: embeddingModelName,
|
|
580
|
-
textLength: text.length,
|
|
581
|
-
});
|
|
582
|
-
throw this.handleProviderError(error);
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
/**
|
|
586
|
-
* Generate embeddings for multiple texts in a single batch
|
|
587
|
-
* @param texts - The texts to embed
|
|
588
|
-
* @param modelName - The embedding model to use (default: text-embedding-3-small)
|
|
589
|
-
* @returns Promise resolving to an array of embedding vectors
|
|
590
|
-
*/
|
|
591
|
-
async embedMany(texts, modelName) {
|
|
592
|
-
const embeddingModelName = modelName || "text-embedding-3-small";
|
|
593
|
-
logger.debug("Generating batch embeddings", {
|
|
594
|
-
provider: this.providerName,
|
|
595
|
-
model: embeddingModelName,
|
|
596
|
-
count: texts.length,
|
|
597
|
-
});
|
|
598
|
-
try {
|
|
599
|
-
const openai = createOpenAI({
|
|
600
|
-
apiKey: getOpenAIApiKey(),
|
|
601
|
-
fetch: createProxyFetch(),
|
|
602
|
-
});
|
|
603
|
-
const embeddingModel = openai.textEmbeddingModel(embeddingModelName);
|
|
604
|
-
const result = await embedMany({
|
|
605
|
-
model: embeddingModel,
|
|
606
|
-
values: texts,
|
|
607
|
-
});
|
|
608
|
-
logger.debug("Batch embeddings generated successfully", {
|
|
609
|
-
provider: this.providerName,
|
|
610
|
-
model: embeddingModelName,
|
|
611
|
-
count: result.embeddings.length,
|
|
612
|
-
embeddingDimension: result.embeddings[0]?.length,
|
|
613
|
-
});
|
|
614
|
-
return result.embeddings;
|
|
615
|
-
}
|
|
616
|
-
catch (error) {
|
|
617
|
-
logger.error("Batch embedding generation failed", {
|
|
618
|
-
error: error instanceof Error ? error.message : String(error),
|
|
619
|
-
model: embeddingModelName,
|
|
620
|
-
count: texts.length,
|
|
621
|
-
});
|
|
622
|
-
throw this.handleProviderError(error);
|
|
623
|
-
}
|
|
624
|
-
}
|
|
625
|
-
}
|
|
626
|
-
// Export for factory registration
|
|
627
|
-
export default OpenAIProvider;
|