@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,543 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared utilities for Gemini 3 native SDK support.
|
|
3
|
-
*
|
|
4
|
-
* Both GoogleAIStudioProvider and GoogleVertexProvider route Gemini 3 models
|
|
5
|
-
* with tools to the native @google/genai SDK (bypassing the Vercel AI SDK)
|
|
6
|
-
* in order to properly handle thought_signature in multi-turn tool calling.
|
|
7
|
-
*
|
|
8
|
-
* This module extracts the functions that are duplicated between the two
|
|
9
|
-
* providers so they can share a single implementation.
|
|
10
|
-
*/
|
|
11
|
-
import { randomUUID } from "node:crypto";
|
|
12
|
-
import { jsonSchema as aiJsonSchema, tool as createAISDKTool, } from "ai";
|
|
13
|
-
import { DEFAULT_MAX_STEPS, DEFAULT_TOOL_MAX_RETRIES, } from "../core/constants.js";
|
|
14
|
-
import { logger } from "../utils/logger.js";
|
|
15
|
-
import { convertZodToJsonSchema, inlineJsonSchema, isZodSchema, } from "../utils/schemaConversion.js";
|
|
16
|
-
import { createNativeThinkingConfig } from "../utils/thinkingConfig.js";
|
|
17
|
-
// ── Functions ──
|
|
18
|
-
/**
|
|
19
|
-
* Sanitize a JSON Schema for Gemini's proto-based API.
|
|
20
|
-
*
|
|
21
|
-
* Gemini cannot handle `anyOf`/`oneOf` union types in function declarations
|
|
22
|
-
* because its proto format expects a single `type` field, not a list of types.
|
|
23
|
-
* This function recursively converts unions to `string` type (the most
|
|
24
|
-
* permissive primitive that can represent any value as text).
|
|
25
|
-
*
|
|
26
|
-
* Also removes `$schema`, `additionalProperties`, and `default` keys that
|
|
27
|
-
* Gemini's proto format doesn't support.
|
|
28
|
-
*/
|
|
29
|
-
export function sanitizeSchemaForGemini(schema) {
|
|
30
|
-
// If this node has anyOf/oneOf, collapse to string type
|
|
31
|
-
if (Array.isArray(schema.anyOf) || Array.isArray(schema.oneOf)) {
|
|
32
|
-
const unionKey = schema.anyOf ? "anyOf" : "oneOf";
|
|
33
|
-
const variants = schema[unionKey];
|
|
34
|
-
// Check if it's a nullable union (e.g., anyOf: [{type: "string"}, {type: "null"}])
|
|
35
|
-
const nonNullVariants = variants.filter((v) => v.type !== "null" && v.type !== "undefined");
|
|
36
|
-
if (nonNullVariants.length === 1) {
|
|
37
|
-
// Simple nullable — use the non-null type with nullable flag
|
|
38
|
-
const base = sanitizeSchemaForGemini({ ...nonNullVariants[0] });
|
|
39
|
-
base.nullable = true;
|
|
40
|
-
if (schema.description) {
|
|
41
|
-
base.description = schema.description;
|
|
42
|
-
}
|
|
43
|
-
return base;
|
|
44
|
-
}
|
|
45
|
-
// Multi-type union — collapse to string with description noting the original types
|
|
46
|
-
const types = nonNullVariants.map((v) => v.type || "unknown").join(" | ");
|
|
47
|
-
const result = { type: "string" };
|
|
48
|
-
const desc = schema.description
|
|
49
|
-
? `${schema.description} (accepts: ${types})`
|
|
50
|
-
: `Value as string (accepts: ${types})`;
|
|
51
|
-
result.description = desc;
|
|
52
|
-
if (variants.some((v) => v.type === "null")) {
|
|
53
|
-
result.nullable = true;
|
|
54
|
-
}
|
|
55
|
-
return result;
|
|
56
|
-
}
|
|
57
|
-
const result = {};
|
|
58
|
-
for (const [key, value] of Object.entries(schema)) {
|
|
59
|
-
// Skip keys unsupported by Gemini proto format
|
|
60
|
-
if (key === "$schema" ||
|
|
61
|
-
key === "additionalProperties" ||
|
|
62
|
-
key === "default") {
|
|
63
|
-
continue;
|
|
64
|
-
}
|
|
65
|
-
if (key === "properties" && value && typeof value === "object") {
|
|
66
|
-
const properties = {};
|
|
67
|
-
for (const [propName, propSchema] of Object.entries(value)) {
|
|
68
|
-
if (propSchema && typeof propSchema === "object") {
|
|
69
|
-
properties[propName] = sanitizeSchemaForGemini(propSchema);
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
72
|
-
properties[propName] = propSchema;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
result[key] = properties;
|
|
76
|
-
}
|
|
77
|
-
else if (key === "items" && value && typeof value === "object") {
|
|
78
|
-
if (Array.isArray(value)) {
|
|
79
|
-
result[key] = value.map((item) => item && typeof item === "object"
|
|
80
|
-
? sanitizeSchemaForGemini(item)
|
|
81
|
-
: item);
|
|
82
|
-
}
|
|
83
|
-
else {
|
|
84
|
-
result[key] = sanitizeSchemaForGemini(value);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
else {
|
|
88
|
-
result[key] = value;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
// Recurse through composed schema branches
|
|
92
|
-
if (Array.isArray(result.allOf)) {
|
|
93
|
-
result.allOf = result.allOf.map((s) => sanitizeSchemaForGemini(s));
|
|
94
|
-
}
|
|
95
|
-
if (result.not && typeof result.not === "object") {
|
|
96
|
-
result.not = sanitizeSchemaForGemini(result.not);
|
|
97
|
-
}
|
|
98
|
-
for (const branch of ["if", "then", "else"]) {
|
|
99
|
-
if (result[branch] && typeof result[branch] === "object") {
|
|
100
|
-
result[branch] = sanitizeSchemaForGemini(result[branch]);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
return result;
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Sanitize Vercel AI SDK tools for Gemini compatibility.
|
|
107
|
-
*
|
|
108
|
-
* For the Vercel AI SDK path (non-native), tool parameters are Zod schemas that
|
|
109
|
-
* get converted to JSON Schema internally by @ai-sdk/google. This conversion
|
|
110
|
-
* doesn't sanitize union types (anyOf/oneOf), causing Gemini proto errors.
|
|
111
|
-
*
|
|
112
|
-
* This function pre-converts each tool's Zod parameters to sanitized JSON Schema
|
|
113
|
-
* and re-wraps with the Vercel AI SDK's jsonSchema() helper.
|
|
114
|
-
*/
|
|
115
|
-
export function sanitizeToolsForGemini(tools) {
|
|
116
|
-
const sanitized = {};
|
|
117
|
-
const dropped = [];
|
|
118
|
-
for (const [name, tool] of Object.entries(tools)) {
|
|
119
|
-
try {
|
|
120
|
-
// Access the legacy `parameters` field that may exist on older AI SDK tools.
|
|
121
|
-
// AI SDK v6 uses `inputSchema`, but v3/v4 tools and third-party wrappers use `parameters`.
|
|
122
|
-
const legacyTool = tool;
|
|
123
|
-
const params = legacyTool.parameters;
|
|
124
|
-
if (params &&
|
|
125
|
-
typeof params === "object" &&
|
|
126
|
-
"_def" in params &&
|
|
127
|
-
typeof params.parse === "function") {
|
|
128
|
-
const rawJsonSchema = convertZodToJsonSchema(params);
|
|
129
|
-
const inlined = inlineJsonSchema(rawJsonSchema);
|
|
130
|
-
// Gemini sanitization strips Zod-only features not supported by the Gemini API:
|
|
131
|
-
// union types (anyOf/oneOf) are collapsed to string, default values and
|
|
132
|
-
// additionalProperties are removed. The resulting schema is Gemini-compatible
|
|
133
|
-
// but loses some type constraints from the original Zod schema.
|
|
134
|
-
const sanitizedSchema = sanitizeSchemaForGemini(inlined);
|
|
135
|
-
sanitized[name] = createAISDKTool({
|
|
136
|
-
description: tool.description || `Tool: ${name}`,
|
|
137
|
-
inputSchema: aiJsonSchema(sanitizedSchema),
|
|
138
|
-
execute: tool.execute,
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
else if (params &&
|
|
142
|
-
typeof params === "object" &&
|
|
143
|
-
"jsonSchema" in params) {
|
|
144
|
-
// Non-Zod JSON schema (e.g., from ai SDK jsonSchema() helper) — still needs sanitization
|
|
145
|
-
const rawSchema = params
|
|
146
|
-
.jsonSchema;
|
|
147
|
-
const sanitizedSchema = sanitizeSchemaForGemini(inlineJsonSchema(rawSchema));
|
|
148
|
-
sanitized[name] = createAISDKTool({
|
|
149
|
-
description: tool.description || `Tool: ${name}`,
|
|
150
|
-
inputSchema: aiJsonSchema(sanitizedSchema),
|
|
151
|
-
execute: tool.execute,
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
155
|
-
sanitized[name] = tool;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
catch (error) {
|
|
159
|
-
logger.warn(`[Gemini] Failed to sanitize tool "${name}", skipping: ${error instanceof Error ? error.message : String(error)}`);
|
|
160
|
-
// Don't fall back to the original tool — an incompatible schema would fail the Gemini request
|
|
161
|
-
dropped.push(name);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
return { tools: sanitized, dropped };
|
|
165
|
-
}
|
|
166
|
-
/**
|
|
167
|
-
* Convert Vercel AI SDK tools to @google/genai FunctionDeclarations and an execute map.
|
|
168
|
-
*
|
|
169
|
-
* This handles both Zod schemas and plain JSON Schema objects for tool parameters.
|
|
170
|
-
*/
|
|
171
|
-
export function buildNativeToolDeclarations(tools) {
|
|
172
|
-
const functionDeclarations = [];
|
|
173
|
-
const executeMap = new Map();
|
|
174
|
-
const skippedTools = [];
|
|
175
|
-
for (const [name, tool] of Object.entries(tools)) {
|
|
176
|
-
try {
|
|
177
|
-
const decl = {
|
|
178
|
-
name,
|
|
179
|
-
description: tool.description || `Tool: ${name}`,
|
|
180
|
-
};
|
|
181
|
-
// Access legacy `parameters` (AI SDK v3/v4) or current `inputSchema` (v6)
|
|
182
|
-
const legacyTool = tool;
|
|
183
|
-
if (legacyTool.parameters || tool.inputSchema) {
|
|
184
|
-
let rawSchema;
|
|
185
|
-
const toolParams = legacyTool.parameters || tool.inputSchema;
|
|
186
|
-
if (isZodSchema(toolParams)) {
|
|
187
|
-
rawSchema = convertZodToJsonSchema(toolParams);
|
|
188
|
-
}
|
|
189
|
-
else if (typeof toolParams === "object") {
|
|
190
|
-
rawSchema = toolParams;
|
|
191
|
-
}
|
|
192
|
-
else {
|
|
193
|
-
rawSchema = { type: "object", properties: {} };
|
|
194
|
-
}
|
|
195
|
-
// Unwrap Vercel AI SDK's jsonSchema() wrapper: { jsonSchema: { type: "object", ... } }
|
|
196
|
-
if (rawSchema.jsonSchema &&
|
|
197
|
-
typeof rawSchema.jsonSchema === "object" &&
|
|
198
|
-
!rawSchema.type) {
|
|
199
|
-
rawSchema = rawSchema.jsonSchema;
|
|
200
|
-
}
|
|
201
|
-
decl.parametersJsonSchema = sanitizeSchemaForGemini(inlineJsonSchema(rawSchema));
|
|
202
|
-
}
|
|
203
|
-
functionDeclarations.push(decl);
|
|
204
|
-
if (tool.execute) {
|
|
205
|
-
executeMap.set(name, tool.execute);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
catch (err) {
|
|
209
|
-
skippedTools.push(name);
|
|
210
|
-
logger.error(`[buildNativeToolDeclarations] Failed to convert tool "${name}":`, err);
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
if (skippedTools.length > 0) {
|
|
214
|
-
logger.warn(`[buildNativeToolDeclarations] ${skippedTools.length} tool(s) skipped due to schema errors: ${skippedTools.join(", ")}`);
|
|
215
|
-
}
|
|
216
|
-
return { toolsConfig: [{ functionDeclarations }], executeMap };
|
|
217
|
-
}
|
|
218
|
-
/**
|
|
219
|
-
* Build the native @google/genai config object shared by stream and generate.
|
|
220
|
-
*/
|
|
221
|
-
export function buildNativeConfig(options, toolsConfig) {
|
|
222
|
-
const config = {
|
|
223
|
-
temperature: options.temperature ?? 1.0, // Gemini 3 requires 1.0 for tool calling
|
|
224
|
-
maxOutputTokens: options.maxTokens,
|
|
225
|
-
};
|
|
226
|
-
if (toolsConfig) {
|
|
227
|
-
config.tools = toolsConfig;
|
|
228
|
-
}
|
|
229
|
-
if (options.systemPrompt) {
|
|
230
|
-
config.systemInstruction = options.systemPrompt;
|
|
231
|
-
}
|
|
232
|
-
// Add thinking config for Gemini 3
|
|
233
|
-
const nativeThinkingConfig = createNativeThinkingConfig(options.thinkingConfig);
|
|
234
|
-
if (nativeThinkingConfig) {
|
|
235
|
-
config.thinkingConfig = nativeThinkingConfig;
|
|
236
|
-
}
|
|
237
|
-
return config;
|
|
238
|
-
}
|
|
239
|
-
/**
|
|
240
|
-
* Safety cap for native Gemini 3 SDK agentic tool-calling loops.
|
|
241
|
-
* Lower than DEFAULT_MAX_STEPS (200) to prevent runaway iterations
|
|
242
|
-
* in the native SDK path which bypasses Vercel AI SDK step limits.
|
|
243
|
-
*/
|
|
244
|
-
const GEMINI3_NATIVE_MAX_STEPS = 100;
|
|
245
|
-
/**
|
|
246
|
-
* Compute a safe, clamped maxSteps value.
|
|
247
|
-
*/
|
|
248
|
-
export function computeMaxSteps(rawMaxSteps) {
|
|
249
|
-
const value = rawMaxSteps || DEFAULT_MAX_STEPS;
|
|
250
|
-
return Number.isFinite(value) && value > 0
|
|
251
|
-
? Math.min(Math.floor(value), GEMINI3_NATIVE_MAX_STEPS)
|
|
252
|
-
: Math.min(DEFAULT_MAX_STEPS, GEMINI3_NATIVE_MAX_STEPS);
|
|
253
|
-
}
|
|
254
|
-
/**
|
|
255
|
-
* Process stream chunks to extract raw response parts, function calls, and usage metadata.
|
|
256
|
-
*
|
|
257
|
-
* Consumes the full async iterable and returns all collected data.
|
|
258
|
-
*/
|
|
259
|
-
export async function collectStreamChunks(stream) {
|
|
260
|
-
const rawResponseParts = [];
|
|
261
|
-
const stepFunctionCalls = [];
|
|
262
|
-
let inputTokens = 0;
|
|
263
|
-
let outputTokens = 0;
|
|
264
|
-
for await (const chunk of stream) {
|
|
265
|
-
// Extract raw parts from candidates FIRST
|
|
266
|
-
// This avoids using chunk.text which triggers SDK warning when
|
|
267
|
-
// non-text parts (thoughtSignature, functionCall) are present
|
|
268
|
-
const chunkRecord = chunk;
|
|
269
|
-
const candidates = chunkRecord.candidates;
|
|
270
|
-
const firstCandidate = candidates?.[0];
|
|
271
|
-
const chunkContent = firstCandidate?.content;
|
|
272
|
-
if (chunkContent && Array.isArray(chunkContent.parts)) {
|
|
273
|
-
rawResponseParts.push(...chunkContent.parts);
|
|
274
|
-
}
|
|
275
|
-
if (chunk.functionCalls) {
|
|
276
|
-
stepFunctionCalls.push(...chunk.functionCalls);
|
|
277
|
-
}
|
|
278
|
-
// Accumulate usage metadata from chunks
|
|
279
|
-
const usage = chunkRecord.usageMetadata;
|
|
280
|
-
if (usage) {
|
|
281
|
-
inputTokens = Math.max(inputTokens, usage.promptTokenCount || 0);
|
|
282
|
-
outputTokens = Math.max(outputTokens, usage.candidatesTokenCount || 0);
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
return { rawResponseParts, stepFunctionCalls, inputTokens, outputTokens };
|
|
286
|
-
}
|
|
287
|
-
/**
|
|
288
|
-
* Create a push-based text channel that bridges a background producer
|
|
289
|
-
* (the agentic tool-calling loop) with an async-iterable consumer.
|
|
290
|
-
*
|
|
291
|
-
* This enables truly incremental streaming: text parts are yielded to the
|
|
292
|
-
* caller as they arrive from the network, rather than being buffered until
|
|
293
|
-
* the model finishes generating.
|
|
294
|
-
*/
|
|
295
|
-
export function createTextChannel() {
|
|
296
|
-
const queue = [];
|
|
297
|
-
let done = false;
|
|
298
|
-
let fatalError = undefined;
|
|
299
|
-
// Resolve the current "wait for data" promise when new data arrives
|
|
300
|
-
let notify = null;
|
|
301
|
-
function wake() {
|
|
302
|
-
if (notify) {
|
|
303
|
-
const fn = notify;
|
|
304
|
-
notify = null;
|
|
305
|
-
fn();
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
function push(text) {
|
|
309
|
-
if (done) {
|
|
310
|
-
return;
|
|
311
|
-
}
|
|
312
|
-
queue.push({ content: text });
|
|
313
|
-
wake();
|
|
314
|
-
}
|
|
315
|
-
function close() {
|
|
316
|
-
done = true;
|
|
317
|
-
wake();
|
|
318
|
-
}
|
|
319
|
-
function error(err) {
|
|
320
|
-
done = true;
|
|
321
|
-
fatalError = err;
|
|
322
|
-
wake();
|
|
323
|
-
}
|
|
324
|
-
let readIndex = 0;
|
|
325
|
-
async function* iterable() {
|
|
326
|
-
try {
|
|
327
|
-
while (true) {
|
|
328
|
-
if (readIndex < queue.length) {
|
|
329
|
-
yield queue[readIndex++];
|
|
330
|
-
// Periodically compact consumed chunks to avoid unbounded retention
|
|
331
|
-
if (readIndex > 1024 && readIndex * 2 >= queue.length) {
|
|
332
|
-
queue.splice(0, readIndex);
|
|
333
|
-
readIndex = 0;
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
else if (done) {
|
|
337
|
-
if (fatalError !== undefined) {
|
|
338
|
-
throw fatalError instanceof Error
|
|
339
|
-
? fatalError
|
|
340
|
-
: new Error(String(fatalError));
|
|
341
|
-
}
|
|
342
|
-
return;
|
|
343
|
-
}
|
|
344
|
-
else {
|
|
345
|
-
// Wait until the producer pushes data or signals completion
|
|
346
|
-
await new Promise((resolve) => {
|
|
347
|
-
notify = resolve;
|
|
348
|
-
});
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
finally {
|
|
353
|
-
// Consumer stopped reading (e.g. disconnect/cancel): stop buffering.
|
|
354
|
-
done = true;
|
|
355
|
-
queue.length = 0;
|
|
356
|
-
notify?.();
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
return { push, close, error, iterable: iterable() };
|
|
360
|
-
}
|
|
361
|
-
/**
|
|
362
|
-
* Iterate a single stream step incrementally, pushing text parts to `channel`
|
|
363
|
-
* as they arrive from the network while simultaneously accumulating the full
|
|
364
|
-
* `CollectedChunkResult` needed for history and token accounting.
|
|
365
|
-
*
|
|
366
|
-
* Used for all steps (both intermediate tool-calling steps and the final
|
|
367
|
-
* text-only step). Text parts are pushed to the channel as they arrive,
|
|
368
|
-
* enabling truly incremental streaming. The complete `rawResponseParts`
|
|
369
|
-
* (including thoughtSignature) are still returned at the end for use by
|
|
370
|
-
* `pushModelResponseToHistory`.
|
|
371
|
-
*/
|
|
372
|
-
export async function collectStreamChunksIncremental(stream, channel) {
|
|
373
|
-
const rawResponseParts = [];
|
|
374
|
-
const stepFunctionCalls = [];
|
|
375
|
-
let inputTokens = 0;
|
|
376
|
-
let outputTokens = 0;
|
|
377
|
-
for await (const chunk of stream) {
|
|
378
|
-
const chunkRecord = chunk;
|
|
379
|
-
const candidates = chunkRecord.candidates;
|
|
380
|
-
const firstCandidate = candidates?.[0];
|
|
381
|
-
const chunkContent = firstCandidate?.content;
|
|
382
|
-
if (chunkContent && Array.isArray(chunkContent.parts)) {
|
|
383
|
-
for (const part of chunkContent.parts) {
|
|
384
|
-
rawResponseParts.push(part);
|
|
385
|
-
// Forward text parts to the consumer immediately
|
|
386
|
-
if (typeof part.text === "string" && part.text.length > 0) {
|
|
387
|
-
channel.push(part.text);
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
if (chunk.functionCalls) {
|
|
392
|
-
stepFunctionCalls.push(...chunk.functionCalls);
|
|
393
|
-
}
|
|
394
|
-
const usage = chunkRecord.usageMetadata;
|
|
395
|
-
if (usage) {
|
|
396
|
-
inputTokens = Math.max(inputTokens, usage.promptTokenCount || 0);
|
|
397
|
-
outputTokens = Math.max(outputTokens, usage.candidatesTokenCount || 0);
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
return { rawResponseParts, stepFunctionCalls, inputTokens, outputTokens };
|
|
401
|
-
}
|
|
402
|
-
/**
|
|
403
|
-
* Extract text from raw response parts, filtering out non-text parts
|
|
404
|
-
* (thoughtSignature, functionCall) to avoid SDK warnings.
|
|
405
|
-
*/
|
|
406
|
-
export function extractTextFromParts(rawResponseParts) {
|
|
407
|
-
return rawResponseParts
|
|
408
|
-
.filter((part) => typeof part.text === "string")
|
|
409
|
-
.map((part) => part.text)
|
|
410
|
-
.join("");
|
|
411
|
-
}
|
|
412
|
-
/**
|
|
413
|
-
* Execute a batch of native function calls with retry tracking and permanent failure detection.
|
|
414
|
-
*
|
|
415
|
-
* @param logLabel - Label for log messages (e.g. "[GoogleAIStudio]" or "[GoogleVertex]")
|
|
416
|
-
* @param stepFunctionCalls - The function calls from the model
|
|
417
|
-
* @param executeMap - Map of tool name to execute function
|
|
418
|
-
* @param failedTools - Mutable map tracking per-tool failure counts
|
|
419
|
-
* @param allToolCalls - Mutable array accumulating all tool call records
|
|
420
|
-
* @param options - Optional settings for execution tracking and cancellation
|
|
421
|
-
* @returns Array of function responses for conversation history
|
|
422
|
-
*/
|
|
423
|
-
export async function executeNativeToolCalls(logLabel, stepFunctionCalls, executeMap, failedTools, allToolCalls, options) {
|
|
424
|
-
const functionResponses = [];
|
|
425
|
-
for (const call of stepFunctionCalls) {
|
|
426
|
-
allToolCalls.push({ toolName: call.name, args: call.args });
|
|
427
|
-
// Check if this tool has already exceeded retry limit
|
|
428
|
-
const failedInfo = failedTools.get(call.name);
|
|
429
|
-
if (failedInfo && failedInfo.count >= DEFAULT_TOOL_MAX_RETRIES) {
|
|
430
|
-
logger.warn(`${logLabel} Tool "${call.name}" has exceeded retry limit (${DEFAULT_TOOL_MAX_RETRIES}), skipping execution`);
|
|
431
|
-
const errorOutput = {
|
|
432
|
-
error: `TOOL_PERMANENTLY_FAILED: The tool "${call.name}" has failed ${failedInfo.count} times and will not be retried. Last error: ${failedInfo.lastError}. Please proceed without using this tool or inform the user that this functionality is unavailable.`,
|
|
433
|
-
status: "permanently_failed",
|
|
434
|
-
do_not_retry: true,
|
|
435
|
-
};
|
|
436
|
-
functionResponses.push({
|
|
437
|
-
functionResponse: { name: call.name, response: errorOutput },
|
|
438
|
-
});
|
|
439
|
-
options?.toolExecutions?.push({
|
|
440
|
-
name: call.name,
|
|
441
|
-
input: call.args,
|
|
442
|
-
output: errorOutput,
|
|
443
|
-
});
|
|
444
|
-
continue;
|
|
445
|
-
}
|
|
446
|
-
const execute = executeMap.get(call.name);
|
|
447
|
-
if (execute) {
|
|
448
|
-
try {
|
|
449
|
-
// AI SDK Tool execute requires (args, options) - provide minimal options
|
|
450
|
-
// Use randomUUID to avoid toolCallId collisions across concurrent calls
|
|
451
|
-
const toolOptions = {
|
|
452
|
-
toolCallId: `${call.name}-${randomUUID()}`,
|
|
453
|
-
messages: [],
|
|
454
|
-
abortSignal: options?.abortSignal,
|
|
455
|
-
};
|
|
456
|
-
const result = await execute(call.args, toolOptions);
|
|
457
|
-
functionResponses.push({
|
|
458
|
-
functionResponse: { name: call.name, response: { result } },
|
|
459
|
-
});
|
|
460
|
-
options?.toolExecutions?.push({
|
|
461
|
-
name: call.name,
|
|
462
|
-
input: call.args,
|
|
463
|
-
output: result,
|
|
464
|
-
});
|
|
465
|
-
}
|
|
466
|
-
catch (error) {
|
|
467
|
-
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
468
|
-
// Track this failure
|
|
469
|
-
const currentFailInfo = failedTools.get(call.name) || {
|
|
470
|
-
count: 0,
|
|
471
|
-
lastError: "",
|
|
472
|
-
};
|
|
473
|
-
currentFailInfo.count++;
|
|
474
|
-
currentFailInfo.lastError = errorMessage;
|
|
475
|
-
failedTools.set(call.name, currentFailInfo);
|
|
476
|
-
logger.warn(`${logLabel} Tool "${call.name}" failed (attempt ${currentFailInfo.count}/${DEFAULT_TOOL_MAX_RETRIES}): ${errorMessage}`);
|
|
477
|
-
// Determine if this is a permanent failure
|
|
478
|
-
const isPermanentFailure = currentFailInfo.count >= DEFAULT_TOOL_MAX_RETRIES;
|
|
479
|
-
const errorOutput = {
|
|
480
|
-
error: isPermanentFailure
|
|
481
|
-
? `TOOL_PERMANENTLY_FAILED: The tool "${call.name}" has failed ${currentFailInfo.count} times with error: ${errorMessage}. This tool will not be retried. Please proceed without using this tool or inform the user that this functionality is unavailable.`
|
|
482
|
-
: `TOOL_EXECUTION_ERROR: ${errorMessage}. Retry attempt ${currentFailInfo.count}/${DEFAULT_TOOL_MAX_RETRIES}.`,
|
|
483
|
-
status: isPermanentFailure ? "permanently_failed" : "failed",
|
|
484
|
-
do_not_retry: isPermanentFailure,
|
|
485
|
-
retry_count: currentFailInfo.count,
|
|
486
|
-
max_retries: DEFAULT_TOOL_MAX_RETRIES,
|
|
487
|
-
};
|
|
488
|
-
functionResponses.push({
|
|
489
|
-
functionResponse: { name: call.name, response: errorOutput },
|
|
490
|
-
});
|
|
491
|
-
options?.toolExecutions?.push({
|
|
492
|
-
name: call.name,
|
|
493
|
-
input: call.args,
|
|
494
|
-
output: errorOutput,
|
|
495
|
-
});
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
else {
|
|
499
|
-
// Tool not found is a permanent error
|
|
500
|
-
const errorOutput = {
|
|
501
|
-
error: `TOOL_NOT_FOUND: The tool "${call.name}" does not exist. Do not attempt to call this tool again.`,
|
|
502
|
-
status: "permanently_failed",
|
|
503
|
-
do_not_retry: true,
|
|
504
|
-
};
|
|
505
|
-
functionResponses.push({
|
|
506
|
-
functionResponse: { name: call.name, response: errorOutput },
|
|
507
|
-
});
|
|
508
|
-
options?.toolExecutions?.push({
|
|
509
|
-
name: call.name,
|
|
510
|
-
input: call.args,
|
|
511
|
-
output: errorOutput,
|
|
512
|
-
});
|
|
513
|
-
}
|
|
514
|
-
}
|
|
515
|
-
return functionResponses;
|
|
516
|
-
}
|
|
517
|
-
/**
|
|
518
|
-
* Handle maxSteps termination by producing a final text when the model
|
|
519
|
-
* was still calling tools when the step limit was reached.
|
|
520
|
-
*
|
|
521
|
-
* @param logLabel - Label for log messages (e.g. "[GoogleAIStudio]" or "[GoogleVertex]")
|
|
522
|
-
*/
|
|
523
|
-
export function handleMaxStepsTermination(logLabel, step, maxSteps, finalText, lastStepText) {
|
|
524
|
-
if (step >= maxSteps && !finalText) {
|
|
525
|
-
logger.warn(`${logLabel} Tool call loop terminated after reaching maxSteps (${maxSteps}). ` +
|
|
526
|
-
`Model was still calling tools. Using accumulated text from last step.`);
|
|
527
|
-
return (lastStepText ||
|
|
528
|
-
`[Tool execution limit reached after ${maxSteps} steps. The model continued requesting tool calls beyond the limit.]`);
|
|
529
|
-
}
|
|
530
|
-
return finalText;
|
|
531
|
-
}
|
|
532
|
-
/**
|
|
533
|
-
* Push model response parts to conversation history, preserving thoughtSignature
|
|
534
|
-
* for Gemini 3 multi-turn tool calling.
|
|
535
|
-
*/
|
|
536
|
-
export function pushModelResponseToHistory(currentContents, rawResponseParts, stepFunctionCalls) {
|
|
537
|
-
currentContents.push({
|
|
538
|
-
role: "model",
|
|
539
|
-
parts: rawResponseParts.length > 0
|
|
540
|
-
? rawResponseParts
|
|
541
|
-
: stepFunctionCalls.map((fc) => ({ functionCall: fc })),
|
|
542
|
-
});
|
|
543
|
-
}
|