@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,588 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generation Handler Module
|
|
3
|
-
*
|
|
4
|
-
* Handles text generation execution, result formatting, and tool information extraction.
|
|
5
|
-
* Extracted from BaseProvider to follow Single Responsibility Principle.
|
|
6
|
-
*
|
|
7
|
-
* Responsibilities:
|
|
8
|
-
* - Generation execution with AI SDK
|
|
9
|
-
* - Tool information extraction
|
|
10
|
-
* - Result formatting and enhancement
|
|
11
|
-
* - Response analysis and logging
|
|
12
|
-
*
|
|
13
|
-
* @module core/modules/GenerationHandler
|
|
14
|
-
*/
|
|
15
|
-
import { SpanKind, SpanStatusCode } from "@opentelemetry/api";
|
|
16
|
-
import { generateText, NoObjectGeneratedError, Output, stepCountIs } from "ai";
|
|
17
|
-
import { getModelId } from "../../providers/providerTypeUtils.js";
|
|
18
|
-
import { tracers } from "../../telemetry/tracers.js";
|
|
19
|
-
import { logger } from "../../utils/logger.js";
|
|
20
|
-
import { calculateCost } from "../../utils/pricing.js";
|
|
21
|
-
import { withProviderRetry } from "../../utils/providerRetry.js";
|
|
22
|
-
import { calculateCacheSavingsPercent, extractCacheCreationTokens, extractCacheReadTokens, extractTokenUsage, } from "../../utils/tokenUtils.js";
|
|
23
|
-
import { DEFAULT_MAX_STEPS } from "../constants.js";
|
|
24
|
-
const genTracer = tracers.generation;
|
|
25
|
-
/**
|
|
26
|
-
* Safely preview-serialize a value for debug logging.
|
|
27
|
-
* Handles undefined, circular references, and non-serializable values.
|
|
28
|
-
*/
|
|
29
|
-
function safePreview(v) {
|
|
30
|
-
if (v === undefined) {
|
|
31
|
-
return "";
|
|
32
|
-
}
|
|
33
|
-
try {
|
|
34
|
-
const text = typeof v === "string" ? v : JSON.stringify(v);
|
|
35
|
-
return (text ?? "").substring(0, 200);
|
|
36
|
-
}
|
|
37
|
-
catch {
|
|
38
|
-
return "[unserializable]";
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* GenerationHandler class - Handles text generation operations for AI providers
|
|
43
|
-
*/
|
|
44
|
-
export class GenerationHandler {
|
|
45
|
-
providerName;
|
|
46
|
-
modelName;
|
|
47
|
-
supportsToolsFn;
|
|
48
|
-
getTelemetryConfigFn;
|
|
49
|
-
handleToolStorageFn;
|
|
50
|
-
constructor(providerName, modelName, supportsToolsFn, getTelemetryConfigFn, handleToolStorageFn) {
|
|
51
|
-
this.providerName = providerName;
|
|
52
|
-
this.modelName = modelName;
|
|
53
|
-
this.supportsToolsFn = supportsToolsFn;
|
|
54
|
-
this.getTelemetryConfigFn = getTelemetryConfigFn;
|
|
55
|
-
this.handleToolStorageFn = handleToolStorageFn;
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Helper method to call generateText with optional structured output
|
|
59
|
-
* @private
|
|
60
|
-
*/
|
|
61
|
-
async callGenerateText(model, messages, tools, options, shouldUseTools, includeStructuredOutput) {
|
|
62
|
-
// Check if this is a Google provider (for provider-specific options)
|
|
63
|
-
const isGoogleProvider = this.providerName === "google-ai" || this.providerName === "vertex";
|
|
64
|
-
// Check if this is an Anthropic provider (includes Vertex+Claude)
|
|
65
|
-
const isAnthropicProvider = this.providerName === "anthropic" ||
|
|
66
|
-
this.providerName === "bedrock" ||
|
|
67
|
-
(this.providerName === "vertex" && this.modelName?.startsWith("claude-"));
|
|
68
|
-
// Gemini 2.5 and earlier cannot use tools + structured JSON output simultaneously.
|
|
69
|
-
// When both are requested on a Google provider, disable structured output (tools take priority).
|
|
70
|
-
const wantsStructuredOutput = includeStructuredOutput &&
|
|
71
|
-
(!!options.schema ||
|
|
72
|
-
options.output?.format === "json" ||
|
|
73
|
-
options.output?.format === "structured");
|
|
74
|
-
const useStructuredOutput = wantsStructuredOutput &&
|
|
75
|
-
!(isGoogleProvider && shouldUseTools && Object.keys(tools).length > 0);
|
|
76
|
-
// Annotate the last tool with cache_control so the full tool-definition
|
|
77
|
-
// block becomes a cache breakpoint for Anthropic-family providers.
|
|
78
|
-
// Non-Anthropic providers harmlessly ignore unknown providerOptions.
|
|
79
|
-
// Note: The AI SDK Tool type doesn't yet include providerOptions, so we
|
|
80
|
-
// use a type assertion. The Anthropic adapter reads this at runtime.
|
|
81
|
-
const toolsWithCache = { ...tools };
|
|
82
|
-
if (isAnthropicProvider &&
|
|
83
|
-
shouldUseTools &&
|
|
84
|
-
Object.keys(toolsWithCache).length > 0) {
|
|
85
|
-
const toolNames = Object.keys(toolsWithCache);
|
|
86
|
-
const lastToolName = toolNames[toolNames.length - 1];
|
|
87
|
-
if (lastToolName && toolsWithCache[lastToolName]) {
|
|
88
|
-
const lastTool = toolsWithCache[lastToolName];
|
|
89
|
-
toolsWithCache[lastToolName] = {
|
|
90
|
-
...lastTool,
|
|
91
|
-
providerOptions: {
|
|
92
|
-
...(lastTool.providerOptions ?? {}),
|
|
93
|
-
anthropic: { cacheControl: { type: "ephemeral" } },
|
|
94
|
-
},
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
return await generateText({
|
|
99
|
-
model,
|
|
100
|
-
messages,
|
|
101
|
-
...(shouldUseTools &&
|
|
102
|
-
Object.keys(toolsWithCache).length > 0 && { tools: toolsWithCache }),
|
|
103
|
-
stopWhen: stepCountIs(options.maxSteps ?? DEFAULT_MAX_STEPS),
|
|
104
|
-
...(shouldUseTools &&
|
|
105
|
-
options.toolChoice && { toolChoice: options.toolChoice }),
|
|
106
|
-
...(options.prepareStep && {
|
|
107
|
-
experimental_prepareStep: ((stepOptions) => options.prepareStep({
|
|
108
|
-
...stepOptions,
|
|
109
|
-
maxSteps: options.maxSteps ?? DEFAULT_MAX_STEPS,
|
|
110
|
-
})),
|
|
111
|
-
}),
|
|
112
|
-
temperature: options.temperature,
|
|
113
|
-
maxOutputTokens: options.maxTokens,
|
|
114
|
-
maxRetries: 0, // NL11: Disable AI SDK's invisible internal retries; we handle retries with OTel instrumentation
|
|
115
|
-
abortSignal: options.abortSignal,
|
|
116
|
-
...(useStructuredOutput &&
|
|
117
|
-
options.schema && {
|
|
118
|
-
experimental_output: Output.object({ schema: options.schema }),
|
|
119
|
-
}),
|
|
120
|
-
// Add thinking configuration for extended reasoning
|
|
121
|
-
// Gemini 3 models use providerOptions.google.thinkingConfig with thinkingLevel
|
|
122
|
-
// Gemini 2.5 models use thinkingBudget
|
|
123
|
-
// Anthropic models use experimental_thinking with budgetTokens
|
|
124
|
-
...(options.thinkingConfig?.enabled && {
|
|
125
|
-
// For Anthropic: experimental_thinking with budgetTokens
|
|
126
|
-
...(isAnthropicProvider &&
|
|
127
|
-
options.thinkingConfig.budgetTokens &&
|
|
128
|
-
!options.thinkingConfig.thinkingLevel && {
|
|
129
|
-
experimental_thinking: {
|
|
130
|
-
type: "enabled",
|
|
131
|
-
budgetTokens: options.thinkingConfig.budgetTokens,
|
|
132
|
-
},
|
|
133
|
-
}),
|
|
134
|
-
// For Google Gemini 3: providerOptions with thinkingLevel
|
|
135
|
-
// For Gemini 2.5: providerOptions with thinkingBudget
|
|
136
|
-
...(isGoogleProvider && {
|
|
137
|
-
providerOptions: {
|
|
138
|
-
google: {
|
|
139
|
-
thinkingConfig: {
|
|
140
|
-
...(options.thinkingConfig.thinkingLevel && {
|
|
141
|
-
thinkingLevel: options.thinkingConfig.thinkingLevel,
|
|
142
|
-
}),
|
|
143
|
-
...(options.thinkingConfig.budgetTokens &&
|
|
144
|
-
!options.thinkingConfig.thinkingLevel && {
|
|
145
|
-
thinkingBudget: options.thinkingConfig.budgetTokens,
|
|
146
|
-
}),
|
|
147
|
-
includeThoughts: true,
|
|
148
|
-
},
|
|
149
|
-
},
|
|
150
|
-
},
|
|
151
|
-
}),
|
|
152
|
-
}),
|
|
153
|
-
experimental_telemetry: this.getTelemetryConfigFn(options, "generate"),
|
|
154
|
-
onStepFinish: ({ toolCalls, toolResults }) => {
|
|
155
|
-
logger.info("Tool execution completed", { toolResults, toolCalls });
|
|
156
|
-
// Handle tool execution storage
|
|
157
|
-
this.handleToolStorageFn(toolCalls, toolResults, options, new Date()).catch((error) => {
|
|
158
|
-
logger.warn("[GenerationHandler] Failed to store tool executions", {
|
|
159
|
-
provider: this.providerName,
|
|
160
|
-
error: error instanceof Error ? error.message : String(error),
|
|
161
|
-
});
|
|
162
|
-
});
|
|
163
|
-
},
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
/**
|
|
167
|
-
* Execute the generation with AI SDK
|
|
168
|
-
*/
|
|
169
|
-
async executeGeneration(model, messages, tools, options) {
|
|
170
|
-
return genTracer.startActiveSpan("neurolink.executeGeneration", { kind: SpanKind.INTERNAL }, async (span) => {
|
|
171
|
-
const shouldUseTools = !options.disableTools && this.supportsToolsFn();
|
|
172
|
-
const toolCount = Object.keys(tools || {}).length;
|
|
173
|
-
const useStructuredOutput = !!options.schema ||
|
|
174
|
-
options.output?.format === "json" ||
|
|
175
|
-
options.output?.format === "structured";
|
|
176
|
-
span.setAttribute("gen_ai.system", this.providerName || "unknown");
|
|
177
|
-
span.setAttribute("neurolink.structured_output", useStructuredOutput);
|
|
178
|
-
span.setAttribute("neurolink.tool_count", toolCount);
|
|
179
|
-
span.setAttribute("neurolink.message_count", messages.length);
|
|
180
|
-
span.setAttribute("gen_ai.request.model", getModelId(model, this.modelName || "unknown"));
|
|
181
|
-
const requestId = options.requestId ||
|
|
182
|
-
options.context?.requestId ||
|
|
183
|
-
"unknown";
|
|
184
|
-
logger.info("[GenerationHandler] Calling generateText", {
|
|
185
|
-
requestId,
|
|
186
|
-
model: getModelId(model),
|
|
187
|
-
messageCount: messages.length,
|
|
188
|
-
toolCount,
|
|
189
|
-
maxSteps: options.maxSteps,
|
|
190
|
-
temperature: options.temperature,
|
|
191
|
-
});
|
|
192
|
-
if (logger.shouldLog("debug")) {
|
|
193
|
-
try {
|
|
194
|
-
logger.debug("[Observability] Full generateText parameters", {
|
|
195
|
-
requestId,
|
|
196
|
-
model: getModelId(model),
|
|
197
|
-
messageCount: messages.length,
|
|
198
|
-
messages: messages.map((msg, i) => ({
|
|
199
|
-
index: i,
|
|
200
|
-
role: msg.role,
|
|
201
|
-
contentLength: typeof msg.content === "string"
|
|
202
|
-
? msg.content.length
|
|
203
|
-
: safePreview(msg.content).length,
|
|
204
|
-
contentPreview: typeof msg.content === "string"
|
|
205
|
-
? msg.content.substring(0, 200)
|
|
206
|
-
: "[multimodal]",
|
|
207
|
-
})),
|
|
208
|
-
toolNames: Object.keys(tools || {}),
|
|
209
|
-
toolCount,
|
|
210
|
-
maxSteps: options.maxSteps,
|
|
211
|
-
temperature: options.temperature,
|
|
212
|
-
maxTokens: options.maxTokens,
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
catch {
|
|
216
|
-
// Ignore serialization errors in debug logging
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
const genStartTime = Date.now();
|
|
220
|
-
try {
|
|
221
|
-
const result = await withProviderRetry(() => this.callGenerateText(model, messages, tools, options, shouldUseTools, true), span, "generateText");
|
|
222
|
-
logger.info("[GenerationHandler] generateText returned", {
|
|
223
|
-
requestId,
|
|
224
|
-
durationMs: Date.now() - genStartTime,
|
|
225
|
-
finishReason: result.finishReason,
|
|
226
|
-
steps: result.steps?.length || 1,
|
|
227
|
-
toolCallsTotal: result.toolCalls?.length || 0,
|
|
228
|
-
responseChars: result.text?.length || 0,
|
|
229
|
-
});
|
|
230
|
-
if (logger.shouldLog("debug")) {
|
|
231
|
-
logger.debug("[Observability] LLM response metadata", {
|
|
232
|
-
requestId,
|
|
233
|
-
responseLength: result.text?.length || 0,
|
|
234
|
-
hasToolCalls: !!(result.toolCalls && result.toolCalls.length > 0),
|
|
235
|
-
toolCallCount: result.toolCalls?.length || 0,
|
|
236
|
-
toolNames: result.toolCalls?.map((tc) => tc.toolName),
|
|
237
|
-
finishReason: result.finishReason,
|
|
238
|
-
stepCount: result.steps?.length || 0,
|
|
239
|
-
steps: result.steps?.map((step, i) => ({
|
|
240
|
-
stepIndex: i,
|
|
241
|
-
stepType: step.stepType,
|
|
242
|
-
textLength: step.text?.length || 0,
|
|
243
|
-
toolCallCount: step.toolCalls?.length || 0,
|
|
244
|
-
toolNames: step.toolCalls?.map((tc) => tc.toolName),
|
|
245
|
-
toolResultCount: step.toolResults?.length || 0,
|
|
246
|
-
finishReason: step.finishReason,
|
|
247
|
-
})),
|
|
248
|
-
usage: result.usage,
|
|
249
|
-
});
|
|
250
|
-
}
|
|
251
|
-
// Set token usage and completion attributes on span
|
|
252
|
-
if (result.usage) {
|
|
253
|
-
span.setAttribute("gen_ai.usage.input_tokens", result.usage.inputTokens || 0);
|
|
254
|
-
span.setAttribute("gen_ai.usage.output_tokens", result.usage.outputTokens || 0);
|
|
255
|
-
// Cost on span so users can query "what did this trace cost?"
|
|
256
|
-
const cost = calculateCost(this.providerName, this.modelName, {
|
|
257
|
-
input: result.usage.inputTokens || 0,
|
|
258
|
-
output: result.usage.outputTokens || 0,
|
|
259
|
-
total: (result.usage.inputTokens || 0) +
|
|
260
|
-
(result.usage.outputTokens || 0),
|
|
261
|
-
});
|
|
262
|
-
span.setAttribute("neurolink.cost", cost ?? 0);
|
|
263
|
-
}
|
|
264
|
-
if (result.finishReason) {
|
|
265
|
-
span.setAttribute("gen_ai.response.finish_reason", result.finishReason);
|
|
266
|
-
}
|
|
267
|
-
span.setStatus({ code: SpanStatusCode.OK });
|
|
268
|
-
return result;
|
|
269
|
-
}
|
|
270
|
-
catch (error) {
|
|
271
|
-
// If NoObjectGeneratedError is thrown when using schema + tools together,
|
|
272
|
-
// fall back to generating without experimental_output and extract JSON manually
|
|
273
|
-
if (error instanceof NoObjectGeneratedError && useStructuredOutput) {
|
|
274
|
-
span.setAttribute("neurolink.has_fallback", true);
|
|
275
|
-
// NLK-GAP-007: Record initial failure event before fallback retry
|
|
276
|
-
span.addEvent("retry.initial_failure", {
|
|
277
|
-
"error.message": error.message,
|
|
278
|
-
"retry.attempt": 1,
|
|
279
|
-
"retry.reason": "NoObjectGeneratedError_structured_output_fallback",
|
|
280
|
-
});
|
|
281
|
-
logger.debug("[GenerationHandler] NoObjectGeneratedError caught - falling back to manual JSON extraction", {
|
|
282
|
-
provider: this.providerName,
|
|
283
|
-
model: this.modelName,
|
|
284
|
-
error: error.message,
|
|
285
|
-
});
|
|
286
|
-
// Retry without experimental_output - the formatEnhancedResult method
|
|
287
|
-
// will extract JSON from the text response
|
|
288
|
-
const result = await withProviderRetry(() => this.callGenerateText(model, messages, tools, options, shouldUseTools, false), span, "generateText(fallback)");
|
|
289
|
-
// NLK-GAP-007: Record recovery event after successful fallback
|
|
290
|
-
span.addEvent("retry.recovered", {
|
|
291
|
-
"retry.attempts": 2,
|
|
292
|
-
"retry.strategy": "structured_output_disabled",
|
|
293
|
-
});
|
|
294
|
-
span.setAttribute("retry.count", 1);
|
|
295
|
-
logger.info("[GenerationHandler] generateText returned (fallback)", {
|
|
296
|
-
requestId,
|
|
297
|
-
durationMs: Date.now() - genStartTime,
|
|
298
|
-
finishReason: result.finishReason,
|
|
299
|
-
steps: result.steps?.length || 1,
|
|
300
|
-
toolCallsTotal: result.toolCalls?.length || 0,
|
|
301
|
-
responseChars: result.text?.length || 0,
|
|
302
|
-
});
|
|
303
|
-
if (result.usage) {
|
|
304
|
-
span.setAttribute("gen_ai.usage.input_tokens", result.usage.inputTokens || 0);
|
|
305
|
-
span.setAttribute("gen_ai.usage.output_tokens", result.usage.outputTokens || 0);
|
|
306
|
-
const fallbackCost = calculateCost(this.providerName, this.modelName, {
|
|
307
|
-
input: result.usage.inputTokens || 0,
|
|
308
|
-
output: result.usage.outputTokens || 0,
|
|
309
|
-
total: (result.usage.inputTokens || 0) +
|
|
310
|
-
(result.usage.outputTokens || 0),
|
|
311
|
-
});
|
|
312
|
-
span.setAttribute("neurolink.cost", fallbackCost ?? 0);
|
|
313
|
-
}
|
|
314
|
-
if (result.finishReason) {
|
|
315
|
-
span.setAttribute("gen_ai.response.finish_reason", result.finishReason);
|
|
316
|
-
}
|
|
317
|
-
span.setStatus({ code: SpanStatusCode.OK });
|
|
318
|
-
return result;
|
|
319
|
-
}
|
|
320
|
-
span.setStatus({
|
|
321
|
-
code: SpanStatusCode.ERROR,
|
|
322
|
-
message: error instanceof Error ? error.message : String(error),
|
|
323
|
-
});
|
|
324
|
-
// Re-throw other errors
|
|
325
|
-
throw error;
|
|
326
|
-
}
|
|
327
|
-
finally {
|
|
328
|
-
span.end();
|
|
329
|
-
}
|
|
330
|
-
});
|
|
331
|
-
}
|
|
332
|
-
/**
|
|
333
|
-
* Extract cache metrics from provider metadata (e.g. Anthropic's providerMetadata.anthropic)
|
|
334
|
-
* The AI SDK's LanguageModelUsage only has inputTokens/outputTokens.
|
|
335
|
-
* Cache metrics are surfaced via providerMetadata by provider-specific SDK adapters.
|
|
336
|
-
*/
|
|
337
|
-
extractCacheMetricsFromProviderMetadata(generateResult) {
|
|
338
|
-
const providerMeta = generateResult.providerMetadata;
|
|
339
|
-
if (!providerMeta) {
|
|
340
|
-
return {};
|
|
341
|
-
}
|
|
342
|
-
// Anthropic surfaces cache metrics under providerMetadata.anthropic
|
|
343
|
-
const anthropicMeta = providerMeta.anthropic;
|
|
344
|
-
if (anthropicMeta) {
|
|
345
|
-
const cacheCreationTokens = extractCacheCreationTokens(anthropicMeta);
|
|
346
|
-
const cacheReadTokens = extractCacheReadTokens(anthropicMeta);
|
|
347
|
-
return {
|
|
348
|
-
...(cacheCreationTokens !== undefined && { cacheCreationTokens }),
|
|
349
|
-
...(cacheReadTokens !== undefined && { cacheReadTokens }),
|
|
350
|
-
};
|
|
351
|
-
}
|
|
352
|
-
return {};
|
|
353
|
-
}
|
|
354
|
-
/**
|
|
355
|
-
* Log generation completion information
|
|
356
|
-
*/
|
|
357
|
-
logGenerationComplete(generateResult) {
|
|
358
|
-
const cacheMetrics = this.extractCacheMetricsFromProviderMetadata(generateResult);
|
|
359
|
-
if (logger.shouldLog("debug")) {
|
|
360
|
-
logger.debug(`generateText completed`, {
|
|
361
|
-
provider: this.providerName,
|
|
362
|
-
model: this.modelName,
|
|
363
|
-
responseLength: generateResult.text?.length || 0,
|
|
364
|
-
toolResultsCount: generateResult.toolResults?.length || 0,
|
|
365
|
-
finishReason: generateResult.finishReason,
|
|
366
|
-
usage: generateResult.usage,
|
|
367
|
-
...(cacheMetrics.cacheCreationTokens !== undefined && {
|
|
368
|
-
cacheCreationTokens: cacheMetrics.cacheCreationTokens,
|
|
369
|
-
}),
|
|
370
|
-
...(cacheMetrics.cacheReadTokens !== undefined && {
|
|
371
|
-
cacheReadTokens: cacheMetrics.cacheReadTokens,
|
|
372
|
-
}),
|
|
373
|
-
timestamp: Date.now(),
|
|
374
|
-
});
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
/**
|
|
378
|
-
* Extract tool information from generation result
|
|
379
|
-
*/
|
|
380
|
-
extractToolInformation(generateResult) {
|
|
381
|
-
const toolsUsed = [];
|
|
382
|
-
const toolExecutions = [];
|
|
383
|
-
// Extract tool names from tool calls
|
|
384
|
-
if (generateResult.toolCalls && generateResult.toolCalls.length > 0) {
|
|
385
|
-
toolsUsed.push(...generateResult.toolCalls.map((tc) => {
|
|
386
|
-
return tc.toolName || tc.name || "unknown";
|
|
387
|
-
}));
|
|
388
|
-
}
|
|
389
|
-
// Extract from steps
|
|
390
|
-
if (generateResult.steps &&
|
|
391
|
-
Array.isArray(generateResult.steps)) {
|
|
392
|
-
const toolCallArgsMap = new Map();
|
|
393
|
-
for (const step of generateResult
|
|
394
|
-
.steps || []) {
|
|
395
|
-
// Collect tool calls and their arguments
|
|
396
|
-
if (step?.toolCalls && Array.isArray(step.toolCalls)) {
|
|
397
|
-
for (const toolCall of step.toolCalls) {
|
|
398
|
-
const tcRecord = toolCall;
|
|
399
|
-
const toolName = tcRecord.toolName ||
|
|
400
|
-
tcRecord.name ||
|
|
401
|
-
"unknown";
|
|
402
|
-
const toolId = tcRecord.toolCallId ||
|
|
403
|
-
tcRecord.id ||
|
|
404
|
-
toolName;
|
|
405
|
-
toolsUsed.push(toolName);
|
|
406
|
-
let callArgs = {};
|
|
407
|
-
if (tcRecord.args) {
|
|
408
|
-
callArgs = tcRecord.args;
|
|
409
|
-
}
|
|
410
|
-
else if (tcRecord.arguments) {
|
|
411
|
-
callArgs = tcRecord.arguments;
|
|
412
|
-
}
|
|
413
|
-
else if (tcRecord.parameters) {
|
|
414
|
-
callArgs = tcRecord.parameters;
|
|
415
|
-
}
|
|
416
|
-
toolCallArgsMap.set(toolId, callArgs);
|
|
417
|
-
toolCallArgsMap.set(toolName, callArgs);
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
// Process tool results
|
|
421
|
-
if (step?.toolResults && Array.isArray(step.toolResults)) {
|
|
422
|
-
for (const toolResult of step.toolResults) {
|
|
423
|
-
const trRecord = toolResult;
|
|
424
|
-
const toolName = trRecord.toolName || "unknown";
|
|
425
|
-
const toolId = trRecord.toolCallId || trRecord.id;
|
|
426
|
-
const toolArgs = trRecord.args ??
|
|
427
|
-
trRecord.arguments ??
|
|
428
|
-
trRecord.parameters ??
|
|
429
|
-
trRecord.input ??
|
|
430
|
-
toolCallArgsMap.get(toolId || toolName) ??
|
|
431
|
-
{};
|
|
432
|
-
toolExecutions.push({
|
|
433
|
-
name: toolName,
|
|
434
|
-
input: toolArgs,
|
|
435
|
-
output: trRecord.result ?? "success",
|
|
436
|
-
});
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
return { toolsUsed: [...new Set(toolsUsed)], toolExecutions };
|
|
442
|
-
}
|
|
443
|
-
/**
|
|
444
|
-
* Format the enhanced result
|
|
445
|
-
*/
|
|
446
|
-
formatEnhancedResult(generateResult, tools, toolsUsed, toolExecutions, options) {
|
|
447
|
-
// Structured output check — schema alone is sufficient to activate
|
|
448
|
-
const useStructuredOutput = !!options.schema ||
|
|
449
|
-
options.output?.format === "json" ||
|
|
450
|
-
options.output?.format === "structured";
|
|
451
|
-
let content;
|
|
452
|
-
if (useStructuredOutput) {
|
|
453
|
-
try {
|
|
454
|
-
const experimentalOutput = generateResult.experimental_output;
|
|
455
|
-
if (experimentalOutput !== undefined) {
|
|
456
|
-
content = JSON.stringify(experimentalOutput);
|
|
457
|
-
}
|
|
458
|
-
else {
|
|
459
|
-
// Fall back to text parsing
|
|
460
|
-
const rawText = generateResult.text || "";
|
|
461
|
-
const strippedText = rawText
|
|
462
|
-
.replace(/^```(?:json)?\s*\n?/i, "")
|
|
463
|
-
.replace(/\n?```\s*$/i, "")
|
|
464
|
-
.trim();
|
|
465
|
-
content = strippedText;
|
|
466
|
-
}
|
|
467
|
-
}
|
|
468
|
-
catch (outputError) {
|
|
469
|
-
// experimental_output is a getter that can throw NoObjectGeneratedError
|
|
470
|
-
// Fall back to text parsing when structured output fails
|
|
471
|
-
logger.debug("[GenerationHandler] experimental_output threw, falling back to text parsing", {
|
|
472
|
-
error: outputError instanceof Error
|
|
473
|
-
? outputError.message
|
|
474
|
-
: String(outputError),
|
|
475
|
-
});
|
|
476
|
-
const rawText = generateResult.text || "";
|
|
477
|
-
const strippedText = rawText
|
|
478
|
-
.replace(/^```(?:json)?\s*\n?/i, "")
|
|
479
|
-
.replace(/\n?```\s*$/i, "")
|
|
480
|
-
.trim();
|
|
481
|
-
content = strippedText;
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
else {
|
|
485
|
-
content = generateResult.text;
|
|
486
|
-
}
|
|
487
|
-
// Extract usage with support for different formats and reasoning tokens
|
|
488
|
-
// Note: The AI SDK bundles thinking tokens into promptTokens for Google models.
|
|
489
|
-
// Separate reasoningTokens tracking will work when/if the AI SDK adds support.
|
|
490
|
-
const usage = extractTokenUsage(generateResult.usage);
|
|
491
|
-
// Merge cache metrics from providerMetadata if not already present in usage
|
|
492
|
-
// The AI SDK's LanguageModelUsage doesn't include cache tokens; they come from
|
|
493
|
-
// provider-specific metadata (e.g. Anthropic's providerMetadata.anthropic)
|
|
494
|
-
if (usage.cacheCreationTokens === undefined ||
|
|
495
|
-
usage.cacheReadTokens === undefined) {
|
|
496
|
-
const cacheMetrics = this.extractCacheMetricsFromProviderMetadata(generateResult);
|
|
497
|
-
if (usage.cacheCreationTokens === undefined &&
|
|
498
|
-
cacheMetrics.cacheCreationTokens !== undefined) {
|
|
499
|
-
usage.cacheCreationTokens = cacheMetrics.cacheCreationTokens;
|
|
500
|
-
}
|
|
501
|
-
if (usage.cacheReadTokens === undefined &&
|
|
502
|
-
cacheMetrics.cacheReadTokens !== undefined) {
|
|
503
|
-
usage.cacheReadTokens = cacheMetrics.cacheReadTokens;
|
|
504
|
-
}
|
|
505
|
-
// Recalculate cache savings if we added cache metrics
|
|
506
|
-
if (usage.cacheReadTokens !== undefined) {
|
|
507
|
-
const savingsPercent = calculateCacheSavingsPercent(usage.cacheReadTokens, usage.input);
|
|
508
|
-
if (savingsPercent !== undefined) {
|
|
509
|
-
usage.cacheSavingsPercent = savingsPercent;
|
|
510
|
-
}
|
|
511
|
-
}
|
|
512
|
-
}
|
|
513
|
-
// Extract reasoning from AI SDK response (Anthropic thinking, Gemini thought, OpenAI o1)
|
|
514
|
-
// Handle both string and array (AI SDK v5 returns string, v6 returns ReasoningOutput[])
|
|
515
|
-
const rawReasoning = generateResult.reasoning;
|
|
516
|
-
const reasoning = rawReasoning
|
|
517
|
-
? typeof rawReasoning === "string"
|
|
518
|
-
? rawReasoning
|
|
519
|
-
: Array.isArray(rawReasoning)
|
|
520
|
-
? rawReasoning
|
|
521
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
522
|
-
.map((r) => typeof r === "string" ? r : (r.text ?? JSON.stringify(r)))
|
|
523
|
-
.join("\n")
|
|
524
|
-
: String(rawReasoning)
|
|
525
|
-
: undefined;
|
|
526
|
-
const reasoningTokens = usage.reasoning ?? undefined;
|
|
527
|
-
return {
|
|
528
|
-
content,
|
|
529
|
-
usage,
|
|
530
|
-
finishReason: generateResult.finishReason,
|
|
531
|
-
provider: this.providerName,
|
|
532
|
-
model: this.modelName,
|
|
533
|
-
reasoning,
|
|
534
|
-
reasoningTokens,
|
|
535
|
-
toolCalls: generateResult.toolCalls
|
|
536
|
-
? generateResult.toolCalls.map((tc) => ({
|
|
537
|
-
toolCallId: tc.toolCallId || "unknown",
|
|
538
|
-
toolName: tc.toolName || "unknown",
|
|
539
|
-
args: tc.args || {},
|
|
540
|
-
}))
|
|
541
|
-
: [],
|
|
542
|
-
toolResults: generateResult.toolResults ?? [],
|
|
543
|
-
toolsUsed,
|
|
544
|
-
toolExecutions,
|
|
545
|
-
availableTools: Object.keys(tools).map((name) => {
|
|
546
|
-
const tool = tools[name];
|
|
547
|
-
return {
|
|
548
|
-
name,
|
|
549
|
-
description: tool.description || "No description available",
|
|
550
|
-
parameters: tool.inputSchema || {},
|
|
551
|
-
server: tool.serverId || "direct",
|
|
552
|
-
};
|
|
553
|
-
}),
|
|
554
|
-
};
|
|
555
|
-
}
|
|
556
|
-
/**
|
|
557
|
-
* Analyze AI response structure and log detailed debugging information
|
|
558
|
-
*/
|
|
559
|
-
analyzeAIResponse(result) {
|
|
560
|
-
logger.debug("NeuroLink Raw AI Response Analysis", {
|
|
561
|
-
provider: this.providerName,
|
|
562
|
-
model: this.modelName,
|
|
563
|
-
responseTextLength: result.text?.length || 0,
|
|
564
|
-
responsePreview: result.text?.substring(0, 500) ?? "",
|
|
565
|
-
finishReason: result.finishReason,
|
|
566
|
-
usage: result.usage,
|
|
567
|
-
});
|
|
568
|
-
// Tool calls analysis
|
|
569
|
-
const toolCallsAnalysis = {
|
|
570
|
-
hasToolCalls: !!result.toolCalls,
|
|
571
|
-
toolCallsLength: result.toolCalls?.length || 0,
|
|
572
|
-
toolCalls: result.toolCalls?.map((toolCall, index) => {
|
|
573
|
-
const tcRecord = toolCall;
|
|
574
|
-
const toolName = tcRecord.toolName || tcRecord.name || "unknown";
|
|
575
|
-
return {
|
|
576
|
-
index: index + 1,
|
|
577
|
-
toolName,
|
|
578
|
-
toolId: tcRecord.toolCallId || tcRecord.id || "none",
|
|
579
|
-
hasArgs: !!tcRecord.args,
|
|
580
|
-
argsKeys: tcRecord.args && typeof tcRecord.args === "object"
|
|
581
|
-
? Object.keys(tcRecord.args)
|
|
582
|
-
: [],
|
|
583
|
-
};
|
|
584
|
-
}) || [],
|
|
585
|
-
};
|
|
586
|
-
logger.debug("Tool Calls Analysis", toolCallsAnalysis);
|
|
587
|
-
}
|
|
588
|
-
}
|