@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,595 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Claude Messages API format conversion layer.
|
|
3
|
-
*
|
|
4
|
-
* Provides a request parser (Claude -> NeuroLink), a response serializer
|
|
5
|
-
* (NeuroLink -> Claude), a streaming SSE state machine, and an error
|
|
6
|
-
* envelope helper. Together they allow NeuroLink to act as a
|
|
7
|
-
* drop-in Claude API proxy.
|
|
8
|
-
*
|
|
9
|
-
* Reference: https://docs.anthropic.com/en/api/messages
|
|
10
|
-
*/
|
|
11
|
-
import { randomBytes } from "crypto";
|
|
12
|
-
import { jsonSchema } from "ai";
|
|
13
|
-
// ---------------------------------------------------------------------------
|
|
14
|
-
// Helpers
|
|
15
|
-
// ---------------------------------------------------------------------------
|
|
16
|
-
let _idCounter = 0;
|
|
17
|
-
/** Generate a unique message id in the Claude format. */
|
|
18
|
-
export function generateMessageId() {
|
|
19
|
-
_idCounter += 1;
|
|
20
|
-
const rand = Math.random().toString(36).slice(2, 10);
|
|
21
|
-
return `msg_${Date.now().toString(36)}${rand}${_idCounter}`;
|
|
22
|
-
}
|
|
23
|
-
/** Generate a Claude-format tool use ID (`toolu_` + 24 random chars). */
|
|
24
|
-
export function generateToolUseId() {
|
|
25
|
-
return `toolu_${randomBytes(18).toString("base64url").slice(0, 24)}`;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Reset the internal id counter (useful in tests).
|
|
29
|
-
* @internal
|
|
30
|
-
*/
|
|
31
|
-
export function _resetIdCounter() {
|
|
32
|
-
_idCounter = 0;
|
|
33
|
-
}
|
|
34
|
-
// ---------------------------------------------------------------------------
|
|
35
|
-
// Request parser: Claude -> NeuroLink internal format
|
|
36
|
-
// ---------------------------------------------------------------------------
|
|
37
|
-
/**
|
|
38
|
-
* Parse an incoming Claude Messages API request into an intermediate
|
|
39
|
-
* representation consumable by NeuroLink's generate/stream pipeline.
|
|
40
|
-
*
|
|
41
|
-
* Handles:
|
|
42
|
-
* - System prompt extraction (string or content-block array)
|
|
43
|
-
* - Message flattening (text + image blocks)
|
|
44
|
-
* - Tool definition conversion
|
|
45
|
-
* - tool_choice mapping
|
|
46
|
-
* - top_p pass-through
|
|
47
|
-
* - thinking configuration
|
|
48
|
-
*/
|
|
49
|
-
export function parseClaudeRequest(body) {
|
|
50
|
-
// --- system prompt ---
|
|
51
|
-
let systemPrompt;
|
|
52
|
-
if (typeof body.system === "string") {
|
|
53
|
-
systemPrompt = body.system;
|
|
54
|
-
}
|
|
55
|
-
else if (Array.isArray(body.system)) {
|
|
56
|
-
systemPrompt = body.system.map((b) => b.text).join("\n\n");
|
|
57
|
-
}
|
|
58
|
-
// --- messages ---
|
|
59
|
-
// Find the index of the last user message so we can distinguish the
|
|
60
|
-
// current turn from history. Images from historical messages are kept
|
|
61
|
-
// inline as text references in their conversation message; only images
|
|
62
|
-
// from the latest user message are extracted into the top-level `images`
|
|
63
|
-
// array (which feeds NeuroLink's multimodal pipeline).
|
|
64
|
-
const conversationMessages = [];
|
|
65
|
-
const images = [];
|
|
66
|
-
let lastUserPrompt = "";
|
|
67
|
-
let lastUserMsgIdx = -1;
|
|
68
|
-
for (let i = body.messages.length - 1; i >= 0; i--) {
|
|
69
|
-
if (body.messages[i].role === "user") {
|
|
70
|
-
lastUserMsgIdx = i;
|
|
71
|
-
break;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
// NOTE: This loop intentionally does NOT use MessageBuilder because the proxy
|
|
75
|
-
// layer translates between Claude's wire format and NeuroLink's internal
|
|
76
|
-
// representation. MessageBuilder is for SDK-side message construction from
|
|
77
|
-
// user inputs (files, images, etc.). Claude's API content blocks (text,
|
|
78
|
-
// image, tool_use, tool_result, thinking) are fully handled here. Document/
|
|
79
|
-
// PDF/CSV blocks do not exist in the Claude API format.
|
|
80
|
-
for (let msgIdx = 0; msgIdx < body.messages.length; msgIdx++) {
|
|
81
|
-
const msg = body.messages[msgIdx];
|
|
82
|
-
const isLatestUserMsg = msgIdx === lastUserMsgIdx;
|
|
83
|
-
if (typeof msg.content === "string") {
|
|
84
|
-
conversationMessages.push({ role: msg.role, content: msg.content });
|
|
85
|
-
if (msg.role === "user") {
|
|
86
|
-
lastUserPrompt = msg.content;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
else if (Array.isArray(msg.content)) {
|
|
90
|
-
const textParts = [];
|
|
91
|
-
for (const block of msg.content) {
|
|
92
|
-
if (block.type === "text") {
|
|
93
|
-
textParts.push(block.text);
|
|
94
|
-
}
|
|
95
|
-
else if (block.type === "image") {
|
|
96
|
-
if (isLatestUserMsg) {
|
|
97
|
-
// Current turn: extract full URI to top-level images for the pipeline
|
|
98
|
-
let imageUri = "";
|
|
99
|
-
if (block.source.type === "base64" && block.source.data) {
|
|
100
|
-
const mediaType = block.source.media_type || "image/png";
|
|
101
|
-
imageUri = `data:${mediaType};base64,${block.source.data}`;
|
|
102
|
-
}
|
|
103
|
-
else if (block.source.type === "url" && block.source.url) {
|
|
104
|
-
imageUri = block.source.url;
|
|
105
|
-
}
|
|
106
|
-
if (imageUri) {
|
|
107
|
-
images.push(imageUri);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
// Historical turn: compact placeholder to avoid bloating the prompt
|
|
112
|
-
textParts.push(`[image: ${block.source.type}]`);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
else if (block.type === "tool_use") {
|
|
116
|
-
// Preserve assistant tool_use blocks so multi-turn tool
|
|
117
|
-
// conversations retain the full call/result chain.
|
|
118
|
-
const inputStr = block.input !== undefined ? JSON.stringify(block.input) : "{}";
|
|
119
|
-
textParts.push(`[tool_use:${block.id}:${block.name}] ${inputStr}`);
|
|
120
|
-
}
|
|
121
|
-
else if (block.type === "tool_result") {
|
|
122
|
-
const resultContent = typeof block.content === "string"
|
|
123
|
-
? block.content
|
|
124
|
-
: Array.isArray(block.content)
|
|
125
|
-
? block.content
|
|
126
|
-
.map((b) => (b.type === "text" ? b.text : `[${b.type}]`))
|
|
127
|
-
.join("\n")
|
|
128
|
-
: "";
|
|
129
|
-
textParts.push(`[tool_result:${block.tool_use_id}] ${resultContent}`);
|
|
130
|
-
}
|
|
131
|
-
else if (block.type) {
|
|
132
|
-
// Preserve unknown block types (thinking, document, etc.)
|
|
133
|
-
// so they are visible in translated history instead of silently dropped.
|
|
134
|
-
const { type, ...rest } = block;
|
|
135
|
-
const preview = JSON.stringify(rest);
|
|
136
|
-
const truncated = preview.length > 200 ? preview.slice(0, 200) + "…" : preview;
|
|
137
|
-
textParts.push(`[${type}: ${truncated}]`);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
const combined = textParts.join("\n");
|
|
141
|
-
conversationMessages.push({ role: msg.role, content: combined });
|
|
142
|
-
if (msg.role === "user") {
|
|
143
|
-
lastUserPrompt = combined;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
// --- tools ---
|
|
148
|
-
const tools = {};
|
|
149
|
-
if (body.tools) {
|
|
150
|
-
for (const t of body.tools) {
|
|
151
|
-
tools[t.name] = {
|
|
152
|
-
description: t.description ?? "",
|
|
153
|
-
// Wrap raw JSON schema with AI SDK's jsonSchema() so the SDK
|
|
154
|
-
// recognizes it (it checks for Symbol.for("vercel.ai.schema")).
|
|
155
|
-
// Without this, the SDK tries zodSchema() on raw JSON and crashes.
|
|
156
|
-
parameters: jsonSchema(t.input_schema ?? { type: "object" }),
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
// --- tool_choice ---
|
|
161
|
-
let toolChoice;
|
|
162
|
-
let toolChoiceName;
|
|
163
|
-
if (body.tool_choice) {
|
|
164
|
-
switch (body.tool_choice.type) {
|
|
165
|
-
case "auto":
|
|
166
|
-
toolChoice = "auto";
|
|
167
|
-
break;
|
|
168
|
-
case "any":
|
|
169
|
-
toolChoice = "required";
|
|
170
|
-
break;
|
|
171
|
-
case "tool":
|
|
172
|
-
toolChoice = "required";
|
|
173
|
-
toolChoiceName = body.tool_choice.name;
|
|
174
|
-
break;
|
|
175
|
-
case "none":
|
|
176
|
-
toolChoice = "none";
|
|
177
|
-
break;
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
// --- thinking ---
|
|
181
|
-
let thinkingConfig;
|
|
182
|
-
if (body.thinking) {
|
|
183
|
-
// Claude thinking types: "enabled" (fixed budget), "adaptive" (auto budget), "disabled"
|
|
184
|
-
const isEnabled = body.thinking.type === "enabled" || body.thinking.type === "adaptive";
|
|
185
|
-
thinkingConfig = {
|
|
186
|
-
enabled: isEnabled,
|
|
187
|
-
budgetTokens: body.thinking.budget_tokens,
|
|
188
|
-
// Pass the raw type so providers can map "adaptive" appropriately
|
|
189
|
-
...(body.thinking.type === "adaptive"
|
|
190
|
-
? { thinkingLevel: "medium" }
|
|
191
|
-
: {}),
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
return {
|
|
195
|
-
model: body.model,
|
|
196
|
-
maxTokens: body.max_tokens,
|
|
197
|
-
temperature: body.temperature,
|
|
198
|
-
topP: body.top_p,
|
|
199
|
-
topK: body.top_k,
|
|
200
|
-
systemPrompt,
|
|
201
|
-
stream: body.stream === true,
|
|
202
|
-
prompt: lastUserPrompt,
|
|
203
|
-
images,
|
|
204
|
-
conversationMessages,
|
|
205
|
-
tools,
|
|
206
|
-
toolChoice,
|
|
207
|
-
toolChoiceName,
|
|
208
|
-
thinkingConfig,
|
|
209
|
-
metadata: body.metadata,
|
|
210
|
-
stopSequences: body.stop_sequences,
|
|
211
|
-
};
|
|
212
|
-
}
|
|
213
|
-
// ---------------------------------------------------------------------------
|
|
214
|
-
// Response serializer: NeuroLink result -> Claude response
|
|
215
|
-
// ---------------------------------------------------------------------------
|
|
216
|
-
/**
|
|
217
|
-
* Map NeuroLink finish-reason strings to Claude stop_reason values.
|
|
218
|
-
*/
|
|
219
|
-
function mapStopReason(finishReason) {
|
|
220
|
-
switch (finishReason) {
|
|
221
|
-
case "stop":
|
|
222
|
-
case "end_turn":
|
|
223
|
-
return "end_turn";
|
|
224
|
-
case "length":
|
|
225
|
-
case "max_tokens":
|
|
226
|
-
return "max_tokens";
|
|
227
|
-
case "tool-calls":
|
|
228
|
-
case "tool_use":
|
|
229
|
-
return "tool_use";
|
|
230
|
-
case "content_filter":
|
|
231
|
-
case "safety":
|
|
232
|
-
return "stop_sequence"; // closest match
|
|
233
|
-
default:
|
|
234
|
-
return finishReason ?? "end_turn";
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
/**
|
|
238
|
-
* Serialize a NeuroLink GenerateResult into a Claude Messages API response.
|
|
239
|
-
*/
|
|
240
|
-
export function serializeClaudeResponse(result, requestModel) {
|
|
241
|
-
const content = [];
|
|
242
|
-
// Thinking/reasoning content block (if present)
|
|
243
|
-
if (result.reasoning) {
|
|
244
|
-
content.push({ type: "thinking", thinking: result.reasoning });
|
|
245
|
-
}
|
|
246
|
-
// Text content
|
|
247
|
-
if (result.content) {
|
|
248
|
-
content.push({ type: "text", text: result.content });
|
|
249
|
-
}
|
|
250
|
-
// Tool use blocks — normalize IDs to Claude `toolu_` format
|
|
251
|
-
if (result.toolCalls && result.toolCalls.length > 0) {
|
|
252
|
-
for (const tc of result.toolCalls) {
|
|
253
|
-
content.push({
|
|
254
|
-
type: "tool_use",
|
|
255
|
-
id: generateToolUseId(),
|
|
256
|
-
name: tc.toolName,
|
|
257
|
-
input: tc.args,
|
|
258
|
-
});
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
// If no content at all, push an empty text block
|
|
262
|
-
if (content.length === 0) {
|
|
263
|
-
content.push({ type: "text", text: "" });
|
|
264
|
-
}
|
|
265
|
-
return {
|
|
266
|
-
id: generateMessageId(),
|
|
267
|
-
type: "message",
|
|
268
|
-
role: "assistant",
|
|
269
|
-
content,
|
|
270
|
-
model: result.model ?? requestModel,
|
|
271
|
-
stop_reason: mapStopReason(result.finishReason),
|
|
272
|
-
stop_sequence: null,
|
|
273
|
-
usage: {
|
|
274
|
-
input_tokens: result.usage?.input ?? 0,
|
|
275
|
-
output_tokens: result.usage?.output ?? 0,
|
|
276
|
-
...(result.usage?.cacheCreationTokens !== undefined && {
|
|
277
|
-
cache_creation_input_tokens: result.usage.cacheCreationTokens,
|
|
278
|
-
}),
|
|
279
|
-
...(result.usage?.cacheReadTokens !== undefined && {
|
|
280
|
-
cache_read_input_tokens: result.usage.cacheReadTokens,
|
|
281
|
-
}),
|
|
282
|
-
},
|
|
283
|
-
};
|
|
284
|
-
}
|
|
285
|
-
// ---------------------------------------------------------------------------
|
|
286
|
-
// Error envelope
|
|
287
|
-
// ---------------------------------------------------------------------------
|
|
288
|
-
/** Map HTTP status codes to Claude error types. */
|
|
289
|
-
function errorTypeFromStatus(status) {
|
|
290
|
-
switch (status) {
|
|
291
|
-
case 400:
|
|
292
|
-
return "invalid_request_error";
|
|
293
|
-
case 401:
|
|
294
|
-
return "authentication_error";
|
|
295
|
-
case 403:
|
|
296
|
-
return "permission_error";
|
|
297
|
-
case 404:
|
|
298
|
-
return "not_found_error";
|
|
299
|
-
case 413:
|
|
300
|
-
return "request_too_large";
|
|
301
|
-
case 429:
|
|
302
|
-
return "rate_limit_error";
|
|
303
|
-
case 500:
|
|
304
|
-
case 502:
|
|
305
|
-
case 503:
|
|
306
|
-
return "api_error";
|
|
307
|
-
case 529:
|
|
308
|
-
return "overloaded_error";
|
|
309
|
-
default:
|
|
310
|
-
return "api_error";
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
/**
|
|
314
|
-
* Build a Claude-compatible error envelope.
|
|
315
|
-
*/
|
|
316
|
-
export function buildClaudeError(status, message, errorType) {
|
|
317
|
-
return {
|
|
318
|
-
type: "error",
|
|
319
|
-
error: {
|
|
320
|
-
type: errorType ?? errorTypeFromStatus(status),
|
|
321
|
-
message,
|
|
322
|
-
},
|
|
323
|
-
};
|
|
324
|
-
}
|
|
325
|
-
// ---------------------------------------------------------------------------
|
|
326
|
-
// Streaming SSE state machine
|
|
327
|
-
// ---------------------------------------------------------------------------
|
|
328
|
-
/**
|
|
329
|
-
* Format a single SSE frame (one `event:` + `data:` pair).
|
|
330
|
-
*/
|
|
331
|
-
export function formatSSE(eventType, data) {
|
|
332
|
-
const json = JSON.stringify(data);
|
|
333
|
-
return `event: ${eventType}\ndata: ${json}\n\n`;
|
|
334
|
-
}
|
|
335
|
-
/**
|
|
336
|
-
* Stateful SSE serializer that emits a well-formed Claude SSE stream.
|
|
337
|
-
*
|
|
338
|
-
* Tracks both lifecycle state (`idle` -> `streaming` -> `done`) and the
|
|
339
|
-
* current content block type (`text`, `thinking`, `tool_use`). Each
|
|
340
|
-
* content block gets a unique, monotonically increasing `blockIndex`.
|
|
341
|
-
*
|
|
342
|
-
* Usage:
|
|
343
|
-
* ```ts
|
|
344
|
-
* const sse = new ClaudeStreamSerializer(requestModel, inputTokens);
|
|
345
|
-
*
|
|
346
|
-
* // Thinking deltas
|
|
347
|
-
* for await (const thought of thinkingStream) {
|
|
348
|
-
* yield* sse.pushThinkingDelta(thought);
|
|
349
|
-
* }
|
|
350
|
-
*
|
|
351
|
-
* // Text deltas
|
|
352
|
-
* for await (const chunk of textStream) {
|
|
353
|
-
* yield* sse.pushDelta(chunk);
|
|
354
|
-
* }
|
|
355
|
-
*
|
|
356
|
-
* // Tool use
|
|
357
|
-
* yield* sse.pushToolUse(toolId, toolName, toolInput);
|
|
358
|
-
*
|
|
359
|
-
* // Finalize
|
|
360
|
-
* yield* sse.finish(outputTokens, finishReason);
|
|
361
|
-
* ```
|
|
362
|
-
*/
|
|
363
|
-
export class ClaudeStreamSerializer {
|
|
364
|
-
state = "idle";
|
|
365
|
-
currentBlockType = null;
|
|
366
|
-
blockIndex = 0;
|
|
367
|
-
hasOpenedBlock = false;
|
|
368
|
-
outputTokens = 0;
|
|
369
|
-
messageStarted = false;
|
|
370
|
-
messageId;
|
|
371
|
-
model;
|
|
372
|
-
inputTokens;
|
|
373
|
-
constructor(model, inputTokens = 0) {
|
|
374
|
-
this.messageId = generateMessageId();
|
|
375
|
-
this.model = model;
|
|
376
|
-
this.inputTokens = inputTokens;
|
|
377
|
-
}
|
|
378
|
-
/** Current lifecycle state (exposed for testing). */
|
|
379
|
-
getState() {
|
|
380
|
-
return this.state;
|
|
381
|
-
}
|
|
382
|
-
/** Current content block type (exposed for testing). */
|
|
383
|
-
getCurrentBlockType() {
|
|
384
|
-
return this.currentBlockType;
|
|
385
|
-
}
|
|
386
|
-
/** Current block index (exposed for testing). */
|
|
387
|
-
getBlockIndex() {
|
|
388
|
-
return this.blockIndex;
|
|
389
|
-
}
|
|
390
|
-
/**
|
|
391
|
-
* Emit a ping event frame. The actual periodic timer is wired in
|
|
392
|
-
* the route handler; this method just formats the SSE frame.
|
|
393
|
-
*/
|
|
394
|
-
static pingEvent() {
|
|
395
|
-
return formatSSE("ping", { type: "ping" });
|
|
396
|
-
}
|
|
397
|
-
// -----------------------------------------------------------------------
|
|
398
|
-
// Internal helpers
|
|
399
|
-
// -----------------------------------------------------------------------
|
|
400
|
-
/**
|
|
401
|
-
* Emit `message_start` and initial ping if not already done.
|
|
402
|
-
*/
|
|
403
|
-
*ensureMessageStarted() {
|
|
404
|
-
if (this.messageStarted) {
|
|
405
|
-
return;
|
|
406
|
-
}
|
|
407
|
-
const messageStart = {
|
|
408
|
-
type: "message_start",
|
|
409
|
-
message: {
|
|
410
|
-
id: this.messageId,
|
|
411
|
-
type: "message",
|
|
412
|
-
role: "assistant",
|
|
413
|
-
content: [],
|
|
414
|
-
model: this.model,
|
|
415
|
-
stop_reason: null,
|
|
416
|
-
stop_sequence: null,
|
|
417
|
-
usage: {
|
|
418
|
-
input_tokens: this.inputTokens,
|
|
419
|
-
output_tokens: 0,
|
|
420
|
-
},
|
|
421
|
-
},
|
|
422
|
-
};
|
|
423
|
-
yield formatSSE("message_start", messageStart);
|
|
424
|
-
yield formatSSE("ping", { type: "ping" });
|
|
425
|
-
this.messageStarted = true;
|
|
426
|
-
this.state = "streaming";
|
|
427
|
-
}
|
|
428
|
-
/**
|
|
429
|
-
* Close the current content block if one is open.
|
|
430
|
-
*/
|
|
431
|
-
*closeCurrentBlock() {
|
|
432
|
-
if (this.currentBlockType === null) {
|
|
433
|
-
return;
|
|
434
|
-
}
|
|
435
|
-
yield formatSSE("content_block_stop", {
|
|
436
|
-
type: "content_block_stop",
|
|
437
|
-
index: this.blockIndex,
|
|
438
|
-
});
|
|
439
|
-
this.currentBlockType = null;
|
|
440
|
-
}
|
|
441
|
-
/**
|
|
442
|
-
* Open a new content block of the given type.
|
|
443
|
-
* Increments blockIndex for each new block.
|
|
444
|
-
*/
|
|
445
|
-
*openBlock(descriptor) {
|
|
446
|
-
// Close any existing block first
|
|
447
|
-
yield* this.closeCurrentBlock();
|
|
448
|
-
// Increment index for every block after the first.
|
|
449
|
-
// Use a persistent flag instead of checking currentBlockType,
|
|
450
|
-
// because closeCurrentBlock() (and pushToolUse which calls it)
|
|
451
|
-
// resets currentBlockType to null before we get here.
|
|
452
|
-
if (this.hasOpenedBlock) {
|
|
453
|
-
this.blockIndex += 1;
|
|
454
|
-
}
|
|
455
|
-
this.hasOpenedBlock = true;
|
|
456
|
-
const blockStart = {
|
|
457
|
-
type: "content_block_start",
|
|
458
|
-
index: this.blockIndex,
|
|
459
|
-
content_block: descriptor,
|
|
460
|
-
};
|
|
461
|
-
yield formatSSE("content_block_start", blockStart);
|
|
462
|
-
this.currentBlockType = descriptor.type;
|
|
463
|
-
}
|
|
464
|
-
// -----------------------------------------------------------------------
|
|
465
|
-
// Public API
|
|
466
|
-
// -----------------------------------------------------------------------
|
|
467
|
-
/**
|
|
468
|
-
* Emit the opening frames: message_start, ping, content_block_start (text).
|
|
469
|
-
* Automatically called on the first pushDelta if not called manually.
|
|
470
|
-
*/
|
|
471
|
-
*start() {
|
|
472
|
-
if (this.state !== "idle") {
|
|
473
|
-
return;
|
|
474
|
-
}
|
|
475
|
-
yield* this.ensureMessageStarted();
|
|
476
|
-
yield* this.openBlock({ type: "text", text: "" });
|
|
477
|
-
}
|
|
478
|
-
/**
|
|
479
|
-
* Push a text delta. Returns zero or more SSE frames.
|
|
480
|
-
* If currently in a thinking block, the thinking block is closed first.
|
|
481
|
-
*/
|
|
482
|
-
*pushDelta(text) {
|
|
483
|
-
if (this.state === "done" || this.state === "error") {
|
|
484
|
-
return;
|
|
485
|
-
}
|
|
486
|
-
yield* this.ensureMessageStarted();
|
|
487
|
-
// Transition from thinking/tool_use to text, or start first text block
|
|
488
|
-
if (this.currentBlockType !== "text") {
|
|
489
|
-
yield* this.openBlock({ type: "text", text: "" });
|
|
490
|
-
}
|
|
491
|
-
const delta = {
|
|
492
|
-
type: "content_block_delta",
|
|
493
|
-
index: this.blockIndex,
|
|
494
|
-
delta: { type: "text_delta", text },
|
|
495
|
-
};
|
|
496
|
-
yield formatSSE("content_block_delta", delta);
|
|
497
|
-
}
|
|
498
|
-
/**
|
|
499
|
-
* Push a thinking delta. Returns zero or more SSE frames.
|
|
500
|
-
* If currently in a text or tool_use block, that block is closed first
|
|
501
|
-
* and a new thinking block is opened.
|
|
502
|
-
*/
|
|
503
|
-
*pushThinkingDelta(text) {
|
|
504
|
-
if (this.state === "done" || this.state === "error") {
|
|
505
|
-
return;
|
|
506
|
-
}
|
|
507
|
-
yield* this.ensureMessageStarted();
|
|
508
|
-
// Open a thinking block if not already in one
|
|
509
|
-
if (this.currentBlockType !== "thinking") {
|
|
510
|
-
yield* this.openBlock({ type: "thinking", thinking: "" });
|
|
511
|
-
}
|
|
512
|
-
const delta = {
|
|
513
|
-
type: "content_block_delta",
|
|
514
|
-
index: this.blockIndex,
|
|
515
|
-
delta: { type: "thinking_delta", thinking: text },
|
|
516
|
-
};
|
|
517
|
-
yield formatSSE("content_block_delta", delta);
|
|
518
|
-
}
|
|
519
|
-
/**
|
|
520
|
-
* Push a complete tool use block.
|
|
521
|
-
*
|
|
522
|
-
* 1. Closes any open content block
|
|
523
|
-
* 2. Emits `content_block_start` with `{type: "tool_use", id, name}`
|
|
524
|
-
* 3. JSON-stringifies the input, chunks it into ~100 char segments
|
|
525
|
-
* 4. Emits `content_block_delta` with `{type: "input_json_delta", partial_json}` per chunk
|
|
526
|
-
* 5. Emits `content_block_stop`
|
|
527
|
-
*/
|
|
528
|
-
*pushToolUse(id, name, input) {
|
|
529
|
-
if (this.state === "done" || this.state === "error") {
|
|
530
|
-
return;
|
|
531
|
-
}
|
|
532
|
-
yield* this.ensureMessageStarted();
|
|
533
|
-
// Open a tool_use block (closes any current block)
|
|
534
|
-
yield* this.openBlock({ type: "tool_use", id, name, input: "" });
|
|
535
|
-
// Serialize and chunk the input JSON
|
|
536
|
-
const jsonStr = JSON.stringify(input ?? {});
|
|
537
|
-
const CHUNK_SIZE = 100;
|
|
538
|
-
for (let i = 0; i < jsonStr.length; i += CHUNK_SIZE) {
|
|
539
|
-
const chunk = jsonStr.slice(i, i + CHUNK_SIZE);
|
|
540
|
-
const delta = {
|
|
541
|
-
type: "content_block_delta",
|
|
542
|
-
index: this.blockIndex,
|
|
543
|
-
delta: { type: "input_json_delta", partial_json: chunk },
|
|
544
|
-
};
|
|
545
|
-
yield formatSSE("content_block_delta", delta);
|
|
546
|
-
}
|
|
547
|
-
// If the input was empty object, still emit at least one delta
|
|
548
|
-
if (jsonStr.length === 0) {
|
|
549
|
-
const delta = {
|
|
550
|
-
type: "content_block_delta",
|
|
551
|
-
index: this.blockIndex,
|
|
552
|
-
delta: { type: "input_json_delta", partial_json: "{}" },
|
|
553
|
-
};
|
|
554
|
-
yield formatSSE("content_block_delta", delta);
|
|
555
|
-
}
|
|
556
|
-
// Close the tool_use block
|
|
557
|
-
yield* this.closeCurrentBlock();
|
|
558
|
-
}
|
|
559
|
-
/**
|
|
560
|
-
* Finalize the stream: content_block_stop, message_delta, message_stop.
|
|
561
|
-
*/
|
|
562
|
-
*finish(outputTokens, finishReason) {
|
|
563
|
-
// If we never started (empty response), start first
|
|
564
|
-
if (this.state === "idle") {
|
|
565
|
-
yield* this.start();
|
|
566
|
-
}
|
|
567
|
-
if (this.state === "done" || this.state === "error") {
|
|
568
|
-
return;
|
|
569
|
-
}
|
|
570
|
-
this.outputTokens = outputTokens ?? this.outputTokens;
|
|
571
|
-
// Close any open content block
|
|
572
|
-
yield* this.closeCurrentBlock();
|
|
573
|
-
// message_delta
|
|
574
|
-
const messageDelta = {
|
|
575
|
-
type: "message_delta",
|
|
576
|
-
delta: {
|
|
577
|
-
stop_reason: mapStopReason(finishReason),
|
|
578
|
-
stop_sequence: null,
|
|
579
|
-
},
|
|
580
|
-
usage: { output_tokens: this.outputTokens },
|
|
581
|
-
};
|
|
582
|
-
yield formatSSE("message_delta", messageDelta);
|
|
583
|
-
// message_stop
|
|
584
|
-
yield formatSSE("message_stop", { type: "message_stop" });
|
|
585
|
-
this.state = "done";
|
|
586
|
-
}
|
|
587
|
-
/**
|
|
588
|
-
* Emit an error event. Transitions to terminal ERROR state.
|
|
589
|
-
*/
|
|
590
|
-
*emitError(status, message) {
|
|
591
|
-
this.state = "error";
|
|
592
|
-
const errorPayload = buildClaudeError(status, message);
|
|
593
|
-
yield formatSSE("error", errorPayload);
|
|
594
|
-
}
|
|
595
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
export class ModelRouter {
|
|
2
|
-
mappings;
|
|
3
|
-
passthrough;
|
|
4
|
-
fallback;
|
|
5
|
-
constructor(config) {
|
|
6
|
-
this.mappings = new Map(config.modelMappings.map((m) => [m.from, m]));
|
|
7
|
-
this.passthrough = new Set(config.passthroughModels ?? []);
|
|
8
|
-
this.fallback = config.fallbackChain;
|
|
9
|
-
}
|
|
10
|
-
resolve(requestedModel) {
|
|
11
|
-
const mapping = this.mappings.get(requestedModel);
|
|
12
|
-
if (mapping) {
|
|
13
|
-
return { provider: mapping.provider, model: mapping.to };
|
|
14
|
-
}
|
|
15
|
-
if (this.passthrough.has(requestedModel)) {
|
|
16
|
-
return { provider: "anthropic", model: requestedModel };
|
|
17
|
-
}
|
|
18
|
-
if (requestedModel.startsWith("claude-")) {
|
|
19
|
-
return { provider: "anthropic", model: requestedModel };
|
|
20
|
-
}
|
|
21
|
-
return { provider: null, model: requestedModel };
|
|
22
|
-
}
|
|
23
|
-
isClaudeTarget(requestedModel) {
|
|
24
|
-
return this.resolve(requestedModel).provider === "anthropic";
|
|
25
|
-
}
|
|
26
|
-
getFallbackChain() {
|
|
27
|
-
return this.fallback;
|
|
28
|
-
}
|
|
29
|
-
}
|