@juspay/neurolink 9.14.0 → 9.16.0
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 +12 -0
- package/README.md +15 -15
- package/dist/adapters/video/videoAnalyzer.d.ts +1 -1
- package/dist/adapters/video/videoAnalyzer.js +10 -8
- package/dist/auth/anthropicOAuth.d.ts +377 -0
- package/dist/auth/anthropicOAuth.js +914 -0
- package/dist/auth/index.d.ts +20 -0
- package/dist/auth/index.js +29 -0
- package/dist/auth/tokenStore.d.ts +225 -0
- package/dist/auth/tokenStore.js +521 -0
- package/dist/cli/commands/auth.d.ts +50 -0
- package/dist/cli/commands/auth.js +1115 -0
- package/dist/cli/commands/setup-anthropic.js +1 -14
- package/dist/cli/commands/setup-azure.js +1 -12
- package/dist/cli/commands/setup-bedrock.js +1 -9
- package/dist/cli/commands/setup-google-ai.js +1 -12
- package/dist/cli/commands/setup-openai.js +1 -14
- package/dist/cli/commands/workflow.d.ts +27 -0
- package/dist/cli/commands/workflow.js +216 -0
- package/dist/cli/factories/authCommandFactory.d.ts +52 -0
- package/dist/cli/factories/authCommandFactory.js +146 -0
- package/dist/cli/factories/commandFactory.d.ts +6 -0
- package/dist/cli/factories/commandFactory.js +171 -22
- package/dist/cli/index.js +0 -1
- package/dist/cli/parser.js +14 -2
- package/dist/cli/utils/maskCredential.d.ts +11 -0
- package/dist/cli/utils/maskCredential.js +23 -0
- package/dist/constants/contextWindows.js +107 -16
- package/dist/constants/enums.d.ts +119 -15
- package/dist/constants/enums.js +182 -22
- package/dist/constants/index.d.ts +3 -1
- package/dist/constants/index.js +11 -1
- package/dist/context/budgetChecker.js +1 -1
- package/dist/context/contextCompactor.js +31 -4
- package/dist/context/emergencyTruncation.d.ts +21 -0
- package/dist/context/emergencyTruncation.js +88 -0
- package/dist/context/errorDetection.d.ts +16 -0
- package/dist/context/errorDetection.js +48 -1
- package/dist/context/errors.d.ts +19 -0
- package/dist/context/errors.js +21 -0
- package/dist/context/stages/slidingWindowTruncator.d.ts +6 -0
- package/dist/context/stages/slidingWindowTruncator.js +159 -24
- package/dist/core/baseProvider.js +306 -200
- package/dist/core/conversationMemoryManager.js +104 -61
- package/dist/core/evaluationProviders.js +16 -33
- package/dist/core/factory.js +237 -164
- package/dist/core/modules/GenerationHandler.js +175 -116
- package/dist/core/modules/MessageBuilder.js +222 -170
- package/dist/core/modules/StreamHandler.d.ts +1 -0
- package/dist/core/modules/StreamHandler.js +95 -27
- package/dist/core/modules/TelemetryHandler.d.ts +10 -1
- package/dist/core/modules/TelemetryHandler.js +25 -7
- package/dist/core/modules/ToolsManager.js +115 -191
- package/dist/core/redisConversationMemoryManager.js +418 -282
- package/dist/factories/providerRegistry.d.ts +5 -0
- package/dist/factories/providerRegistry.js +20 -2
- package/dist/index.d.ts +3 -3
- package/dist/index.js +4 -2
- package/dist/lib/adapters/video/videoAnalyzer.d.ts +1 -1
- package/dist/lib/adapters/video/videoAnalyzer.js +10 -8
- package/dist/lib/auth/anthropicOAuth.d.ts +377 -0
- package/dist/lib/auth/anthropicOAuth.js +915 -0
- package/dist/lib/auth/index.d.ts +20 -0
- package/dist/lib/auth/index.js +30 -0
- package/dist/lib/auth/tokenStore.d.ts +225 -0
- package/dist/lib/auth/tokenStore.js +522 -0
- package/dist/lib/constants/contextWindows.js +107 -16
- package/dist/lib/constants/enums.d.ts +119 -15
- package/dist/lib/constants/enums.js +182 -22
- package/dist/lib/constants/index.d.ts +3 -1
- package/dist/lib/constants/index.js +11 -1
- package/dist/lib/context/budgetChecker.js +1 -1
- package/dist/lib/context/contextCompactor.js +31 -4
- package/dist/lib/context/emergencyTruncation.d.ts +21 -0
- package/dist/lib/context/emergencyTruncation.js +89 -0
- package/dist/lib/context/errorDetection.d.ts +16 -0
- package/dist/lib/context/errorDetection.js +48 -1
- package/dist/lib/context/errors.d.ts +19 -0
- package/dist/lib/context/errors.js +22 -0
- package/dist/lib/context/stages/slidingWindowTruncator.d.ts +6 -0
- package/dist/lib/context/stages/slidingWindowTruncator.js +159 -24
- package/dist/lib/core/baseProvider.js +306 -200
- package/dist/lib/core/conversationMemoryManager.js +104 -61
- package/dist/lib/core/evaluationProviders.js +16 -33
- package/dist/lib/core/factory.js +237 -164
- package/dist/lib/core/modules/GenerationHandler.js +175 -116
- package/dist/lib/core/modules/MessageBuilder.js +222 -170
- package/dist/lib/core/modules/StreamHandler.d.ts +1 -0
- package/dist/lib/core/modules/StreamHandler.js +95 -27
- package/dist/lib/core/modules/TelemetryHandler.d.ts +10 -1
- package/dist/lib/core/modules/TelemetryHandler.js +25 -7
- package/dist/lib/core/modules/ToolsManager.js +115 -191
- package/dist/lib/core/redisConversationMemoryManager.js +418 -282
- package/dist/lib/factories/providerRegistry.d.ts +5 -0
- package/dist/lib/factories/providerRegistry.js +20 -2
- package/dist/lib/index.d.ts +3 -3
- package/dist/lib/index.js +4 -2
- package/dist/lib/mcp/externalServerManager.js +66 -0
- package/dist/lib/mcp/mcpCircuitBreaker.js +24 -0
- package/dist/lib/mcp/mcpClientFactory.js +16 -0
- package/dist/lib/mcp/toolDiscoveryService.js +32 -6
- package/dist/lib/mcp/toolRegistry.js +193 -123
- package/dist/lib/models/anthropicModels.d.ts +267 -0
- package/dist/lib/models/anthropicModels.js +528 -0
- package/dist/lib/neurolink.d.ts +6 -0
- package/dist/lib/neurolink.js +1162 -646
- package/dist/lib/providers/amazonBedrock.d.ts +1 -1
- package/dist/lib/providers/amazonBedrock.js +521 -319
- package/dist/lib/providers/anthropic.d.ts +123 -2
- package/dist/lib/providers/anthropic.js +873 -27
- package/dist/lib/providers/anthropicBaseProvider.js +77 -17
- package/dist/lib/providers/googleAiStudio.d.ts +1 -1
- package/dist/lib/providers/googleAiStudio.js +292 -227
- package/dist/lib/providers/googleVertex.d.ts +36 -1
- package/dist/lib/providers/googleVertex.js +553 -260
- package/dist/lib/providers/ollama.js +329 -278
- package/dist/lib/providers/openAI.js +77 -19
- package/dist/lib/providers/sagemaker/parsers.js +3 -3
- package/dist/lib/providers/sagemaker/streaming.js +3 -3
- package/dist/lib/proxy/proxyFetch.js +81 -48
- package/dist/lib/rag/ChunkerFactory.js +1 -1
- package/dist/lib/rag/chunkers/MarkdownChunker.d.ts +22 -0
- package/dist/lib/rag/chunkers/MarkdownChunker.js +213 -9
- package/dist/lib/rag/chunking/markdownChunker.d.ts +16 -0
- package/dist/lib/rag/chunking/markdownChunker.js +174 -2
- package/dist/lib/rag/pipeline/contextAssembly.js +2 -1
- package/dist/lib/rag/ragIntegration.d.ts +18 -1
- package/dist/lib/rag/ragIntegration.js +94 -14
- package/dist/lib/rag/retrieval/vectorQueryTool.js +21 -4
- package/dist/lib/server/abstract/baseServerAdapter.js +4 -1
- package/dist/lib/server/adapters/fastifyAdapter.js +35 -30
- package/dist/lib/services/server/ai/observability/instrumentation.d.ts +32 -0
- package/dist/lib/services/server/ai/observability/instrumentation.js +39 -0
- package/dist/lib/telemetry/attributes.d.ts +52 -0
- package/dist/lib/telemetry/attributes.js +61 -0
- package/dist/lib/telemetry/index.d.ts +3 -0
- package/dist/lib/telemetry/index.js +3 -0
- package/dist/lib/telemetry/telemetryService.d.ts +6 -0
- package/dist/lib/telemetry/telemetryService.js +6 -0
- package/dist/lib/telemetry/tracers.d.ts +15 -0
- package/dist/lib/telemetry/tracers.js +17 -0
- package/dist/lib/telemetry/withSpan.d.ts +9 -0
- package/dist/lib/telemetry/withSpan.js +35 -0
- package/dist/lib/types/contextTypes.d.ts +10 -0
- package/dist/lib/types/errors.d.ts +62 -0
- package/dist/lib/types/errors.js +107 -0
- package/dist/lib/types/index.d.ts +2 -1
- package/dist/lib/types/index.js +2 -0
- package/dist/lib/types/providers.d.ts +107 -0
- package/dist/lib/types/providers.js +69 -0
- package/dist/lib/types/streamTypes.d.ts +14 -0
- package/dist/lib/types/subscriptionTypes.d.ts +893 -0
- package/dist/lib/types/subscriptionTypes.js +8 -0
- package/dist/lib/utils/conversationMemory.js +121 -82
- package/dist/lib/utils/logger.d.ts +5 -0
- package/dist/lib/utils/logger.js +50 -2
- package/dist/lib/utils/messageBuilder.js +22 -42
- package/dist/lib/utils/modelDetection.js +3 -3
- package/dist/lib/utils/providerConfig.d.ts +167 -0
- package/dist/lib/utils/providerConfig.js +619 -9
- package/dist/lib/utils/providerRetry.d.ts +41 -0
- package/dist/lib/utils/providerRetry.js +114 -0
- package/dist/lib/utils/retryability.d.ts +14 -0
- package/dist/lib/utils/retryability.js +23 -0
- package/dist/lib/utils/sanitizers/svg.js +4 -5
- package/dist/lib/utils/tokenEstimation.d.ts +11 -1
- package/dist/lib/utils/tokenEstimation.js +19 -4
- package/dist/lib/utils/videoAnalysisProcessor.js +7 -3
- package/dist/mcp/externalServerManager.js +66 -0
- package/dist/mcp/mcpCircuitBreaker.js +24 -0
- package/dist/mcp/mcpClientFactory.js +16 -0
- package/dist/mcp/toolDiscoveryService.js +32 -6
- package/dist/mcp/toolRegistry.js +193 -123
- package/dist/models/anthropicModels.d.ts +267 -0
- package/dist/models/anthropicModels.js +527 -0
- package/dist/neurolink.d.ts +6 -0
- package/dist/neurolink.js +1162 -646
- package/dist/providers/amazonBedrock.d.ts +1 -1
- package/dist/providers/amazonBedrock.js +521 -319
- package/dist/providers/anthropic.d.ts +123 -2
- package/dist/providers/anthropic.js +873 -27
- package/dist/providers/anthropicBaseProvider.js +77 -17
- package/dist/providers/googleAiStudio.d.ts +1 -1
- package/dist/providers/googleAiStudio.js +292 -227
- package/dist/providers/googleVertex.d.ts +36 -1
- package/dist/providers/googleVertex.js +553 -260
- package/dist/providers/ollama.js +329 -278
- package/dist/providers/openAI.js +77 -19
- package/dist/providers/sagemaker/parsers.js +3 -3
- package/dist/providers/sagemaker/streaming.js +3 -3
- package/dist/proxy/proxyFetch.js +81 -48
- package/dist/rag/ChunkerFactory.js +1 -1
- package/dist/rag/chunkers/MarkdownChunker.d.ts +22 -0
- package/dist/rag/chunkers/MarkdownChunker.js +213 -9
- package/dist/rag/chunking/markdownChunker.d.ts +16 -0
- package/dist/rag/chunking/markdownChunker.js +174 -2
- package/dist/rag/pipeline/contextAssembly.js +2 -1
- package/dist/rag/ragIntegration.d.ts +18 -1
- package/dist/rag/ragIntegration.js +94 -14
- package/dist/rag/retrieval/vectorQueryTool.js +21 -4
- package/dist/server/abstract/baseServerAdapter.js +4 -1
- package/dist/server/adapters/fastifyAdapter.js +35 -30
- package/dist/services/server/ai/observability/instrumentation.d.ts +32 -0
- package/dist/services/server/ai/observability/instrumentation.js +39 -0
- package/dist/telemetry/attributes.d.ts +52 -0
- package/dist/telemetry/attributes.js +60 -0
- package/dist/telemetry/index.d.ts +3 -0
- package/dist/telemetry/index.js +3 -0
- package/dist/telemetry/telemetryService.d.ts +6 -0
- package/dist/telemetry/telemetryService.js +6 -0
- package/dist/telemetry/tracers.d.ts +15 -0
- package/dist/telemetry/tracers.js +16 -0
- package/dist/telemetry/withSpan.d.ts +9 -0
- package/dist/telemetry/withSpan.js +34 -0
- package/dist/types/contextTypes.d.ts +10 -0
- package/dist/types/errors.d.ts +62 -0
- package/dist/types/errors.js +107 -0
- package/dist/types/index.d.ts +2 -1
- package/dist/types/index.js +2 -0
- package/dist/types/providers.d.ts +107 -0
- package/dist/types/providers.js +69 -0
- package/dist/types/streamTypes.d.ts +14 -0
- package/dist/types/subscriptionTypes.d.ts +893 -0
- package/dist/types/subscriptionTypes.js +7 -0
- package/dist/utils/conversationMemory.js +121 -82
- package/dist/utils/logger.d.ts +5 -0
- package/dist/utils/logger.js +50 -2
- package/dist/utils/messageBuilder.js +22 -42
- package/dist/utils/modelDetection.js +3 -3
- package/dist/utils/providerConfig.d.ts +167 -0
- package/dist/utils/providerConfig.js +619 -9
- package/dist/utils/providerRetry.d.ts +41 -0
- package/dist/utils/providerRetry.js +113 -0
- package/dist/utils/retryability.d.ts +14 -0
- package/dist/utils/retryability.js +22 -0
- package/dist/utils/sanitizers/svg.js +4 -5
- package/dist/utils/tokenEstimation.d.ts +11 -1
- package/dist/utils/tokenEstimation.js +19 -4
- package/dist/utils/videoAnalysisProcessor.js +7 -3
- package/dist/workflow/config.d.ts +26 -26
- package/package.json +2 -1
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider-level retry utility for AI SDK calls (NL11)
|
|
3
|
+
*
|
|
4
|
+
* The Vercel AI SDK's `generateText()` and `streamText()` have built-in retry
|
|
5
|
+
* logic (`_retryWithExponentialBackoff()` with default `maxRetries: 2`) that
|
|
6
|
+
* retries on HTTP 429/500/503. These retries are completely invisible to OTel
|
|
7
|
+
* because they happen inside the AI SDK.
|
|
8
|
+
*
|
|
9
|
+
* This module provides an instrumented retry wrapper that:
|
|
10
|
+
* 1. Disables the AI SDK's internal retries (via `maxRetries: 0`)
|
|
11
|
+
* 2. Implements our own retry loop with full OTel span events
|
|
12
|
+
* 3. Records retry attempts, delays, status codes, and total attempt count
|
|
13
|
+
*
|
|
14
|
+
* @module utils/providerRetry
|
|
15
|
+
*/
|
|
16
|
+
import {} from "@opentelemetry/api";
|
|
17
|
+
import { APICallError } from "@ai-sdk/provider";
|
|
18
|
+
import { logger } from "./logger.js";
|
|
19
|
+
/** Maximum number of retry attempts after the initial call (total = 1 + MAX_PROVIDER_RETRIES). */
|
|
20
|
+
export const MAX_PROVIDER_RETRIES = 2;
|
|
21
|
+
/** Base delay in ms for exponential backoff between retries. */
|
|
22
|
+
export const BASE_RETRY_DELAY_MS = 1000;
|
|
23
|
+
/**
|
|
24
|
+
* Check whether an error thrown by the AI SDK is retryable.
|
|
25
|
+
*
|
|
26
|
+
* Uses `APICallError.isInstance()` for proper type-safe detection (the class
|
|
27
|
+
* uses a branded symbol marker, so `instanceof` doesn't work across package
|
|
28
|
+
* boundaries). Falls back to duck-typing for non-APICallError cases.
|
|
29
|
+
*/
|
|
30
|
+
export function isRetryableProviderError(error) {
|
|
31
|
+
// Preferred path: use the AI SDK's own branded type check + isRetryable flag
|
|
32
|
+
if (APICallError.isInstance(error)) {
|
|
33
|
+
return error.isRetryable;
|
|
34
|
+
}
|
|
35
|
+
// Fallback: duck-type for status codes on errors that aren't APICallError
|
|
36
|
+
if (error && typeof error === "object" && "statusCode" in error) {
|
|
37
|
+
const statusCode = error.statusCode;
|
|
38
|
+
return statusCode === 429 || statusCode >= 500;
|
|
39
|
+
}
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Extract the HTTP status code from an AI SDK error, if available.
|
|
44
|
+
*/
|
|
45
|
+
export function getErrorStatusCode(error) {
|
|
46
|
+
if (APICallError.isInstance(error)) {
|
|
47
|
+
return error.statusCode;
|
|
48
|
+
}
|
|
49
|
+
if (error && typeof error === "object" && "statusCode" in error) {
|
|
50
|
+
return error.statusCode;
|
|
51
|
+
}
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Execute a provider call with instrumented retry logic.
|
|
56
|
+
*
|
|
57
|
+
* @param operation - The async operation to execute (should already use `maxRetries: 0`)
|
|
58
|
+
* @param span - The OTel span to annotate with retry events and attributes
|
|
59
|
+
* @param label - A human-readable label for log messages (e.g. "generateText", "streamText")
|
|
60
|
+
* @returns The result of the operation
|
|
61
|
+
*/
|
|
62
|
+
export async function withProviderRetry(operation, span, label) {
|
|
63
|
+
for (let attempt = 0; attempt <= MAX_PROVIDER_RETRIES; attempt++) {
|
|
64
|
+
try {
|
|
65
|
+
const result = await operation();
|
|
66
|
+
// Record how many attempts it took on the span
|
|
67
|
+
span.setAttribute("gen_ai.provider.total_attempts", attempt + 1);
|
|
68
|
+
if (attempt > 0) {
|
|
69
|
+
logger.info(`[providerRetry] ${label} succeeded after ${attempt + 1} attempts`);
|
|
70
|
+
}
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
const retryable = isRetryableProviderError(error);
|
|
75
|
+
const statusCode = getErrorStatusCode(error);
|
|
76
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
77
|
+
if (!retryable || attempt === MAX_PROVIDER_RETRIES) {
|
|
78
|
+
// Record failure details before re-throwing
|
|
79
|
+
span.setAttribute("gen_ai.provider.total_attempts", attempt + 1);
|
|
80
|
+
if (attempt > 0) {
|
|
81
|
+
span.setAttribute("gen_ai.provider.retries_exhausted", true);
|
|
82
|
+
}
|
|
83
|
+
logger.warn(`[providerRetry] ${label} failed (non-retryable or retries exhausted)`, {
|
|
84
|
+
attempt: attempt + 1,
|
|
85
|
+
retryable,
|
|
86
|
+
statusCode,
|
|
87
|
+
error: errorMessage,
|
|
88
|
+
});
|
|
89
|
+
throw error;
|
|
90
|
+
}
|
|
91
|
+
// Calculate exponential backoff delay
|
|
92
|
+
const delay = BASE_RETRY_DELAY_MS * Math.pow(2, attempt);
|
|
93
|
+
// Record retry event on the OTel span
|
|
94
|
+
span.addEvent("gen_ai.provider.retry", {
|
|
95
|
+
"retry.attempt": attempt + 1,
|
|
96
|
+
"retry.delay_ms": delay,
|
|
97
|
+
...(statusCode !== undefined && { "retry.status_code": statusCode }),
|
|
98
|
+
"retry.error": errorMessage.slice(0, 256),
|
|
99
|
+
});
|
|
100
|
+
logger.warn(`[providerRetry] ${label} retrying after ${statusCode || "unknown"} error`, {
|
|
101
|
+
attempt: attempt + 1,
|
|
102
|
+
maxRetries: MAX_PROVIDER_RETRIES,
|
|
103
|
+
delayMs: delay,
|
|
104
|
+
statusCode,
|
|
105
|
+
error: errorMessage,
|
|
106
|
+
});
|
|
107
|
+
await new Promise((r) => setTimeout(r, delay));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// This should never be reached due to the throw inside the loop,
|
|
111
|
+
// but TypeScript requires it for exhaustiveness.
|
|
112
|
+
throw new Error(`[providerRetry] ${label} exhausted all retries`);
|
|
113
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared HTTP retryability constants.
|
|
3
|
+
*
|
|
4
|
+
* Centralises the status-code lists that were duplicated across
|
|
5
|
+
* httpRetryHandler, neurolink.ts, fileDetector.ts, and errorHelpers.
|
|
6
|
+
*/
|
|
7
|
+
/** Server-side and rate-limiting codes worth retrying. */
|
|
8
|
+
export declare const RETRYABLE_HTTP_STATUS_CODES: readonly number[];
|
|
9
|
+
/** Client-error codes where retrying is pointless. */
|
|
10
|
+
export declare const NON_RETRYABLE_HTTP_STATUS_CODES: readonly number[];
|
|
11
|
+
/** Check whether an HTTP status code is retryable. */
|
|
12
|
+
export declare function isRetryableStatusCode(code: number): boolean;
|
|
13
|
+
/** Check whether an HTTP status code is non-retryable. */
|
|
14
|
+
export declare function isNonRetryableStatusCode(code: number): boolean;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared HTTP retryability constants.
|
|
3
|
+
*
|
|
4
|
+
* Centralises the status-code lists that were duplicated across
|
|
5
|
+
* httpRetryHandler, neurolink.ts, fileDetector.ts, and errorHelpers.
|
|
6
|
+
*/
|
|
7
|
+
/** Server-side and rate-limiting codes worth retrying. */
|
|
8
|
+
export const RETRYABLE_HTTP_STATUS_CODES = [
|
|
9
|
+
408, 429, 500, 502, 503, 504,
|
|
10
|
+
];
|
|
11
|
+
/** Client-error codes where retrying is pointless. */
|
|
12
|
+
export const NON_RETRYABLE_HTTP_STATUS_CODES = [
|
|
13
|
+
400, 401, 403, 404, 405, 409, 422,
|
|
14
|
+
];
|
|
15
|
+
/** Check whether an HTTP status code is retryable. */
|
|
16
|
+
export function isRetryableStatusCode(code) {
|
|
17
|
+
return RETRYABLE_HTTP_STATUS_CODES.includes(code);
|
|
18
|
+
}
|
|
19
|
+
/** Check whether an HTTP status code is non-retryable. */
|
|
20
|
+
export function isNonRetryableStatusCode(code) {
|
|
21
|
+
return NON_RETRYABLE_HTTP_STATUS_CODES.includes(code);
|
|
22
|
+
}
|
|
@@ -339,8 +339,7 @@ function removeDangerousAttributes(content, removedItems) {
|
|
|
339
339
|
// Parse attributes
|
|
340
340
|
const attrRegex = /([a-zA-Z][a-zA-Z0-9:_-]*)\s*=\s*(?:"([^"]*)"|'([^']*)')/g;
|
|
341
341
|
const safeAttrs = [];
|
|
342
|
-
let attrMatch = attrRegex.exec(attrs);
|
|
343
|
-
while (attrMatch !== null) {
|
|
342
|
+
for (let attrMatch = attrRegex.exec(attrs); attrMatch !== null; attrMatch = attrRegex.exec(attrs)) {
|
|
344
343
|
const attrName = attrMatch[1];
|
|
345
344
|
const attrValue = attrMatch[2] ?? attrMatch[3] ?? "";
|
|
346
345
|
const lowerAttrName = attrName.toLowerCase();
|
|
@@ -390,13 +389,13 @@ function removeDangerousAttributes(content, removedItems) {
|
|
|
390
389
|
}
|
|
391
390
|
// Attribute is safe, keep it
|
|
392
391
|
safeAttrs.push(`${attrName}="${escapeAttributeValue(attrValue)}"`);
|
|
393
|
-
// Get next match
|
|
394
|
-
attrMatch = attrRegex.exec(attrs);
|
|
395
392
|
}
|
|
396
393
|
// Also keep standalone attributes (like xmlns without value in some cases)
|
|
397
394
|
const standaloneAttrRegex = /\s([a-zA-Z][a-zA-Z0-9:_-]*)(?=\s|>|$|\/)/g;
|
|
398
395
|
let standaloneMatch = standaloneAttrRegex.exec(attrs);
|
|
399
|
-
|
|
396
|
+
let iterations = 0;
|
|
397
|
+
const MAX_ITERATIONS = 1000;
|
|
398
|
+
while (standaloneMatch !== null && iterations++ < MAX_ITERATIONS) {
|
|
400
399
|
const attrName = standaloneMatch[1];
|
|
401
400
|
// Only keep if it looks like a valid attribute and is safe
|
|
402
401
|
if (SAFE_SVG_ATTRIBUTES.has(attrName) ||
|
|
@@ -16,7 +16,17 @@ import type { ChatMessage } from "../types/conversation.js";
|
|
|
16
16
|
export declare const CHARS_PER_TOKEN = 4;
|
|
17
17
|
/** Characters per token for code */
|
|
18
18
|
export declare const CODE_CHARS_PER_TOKEN = 3;
|
|
19
|
-
/**
|
|
19
|
+
/**
|
|
20
|
+
* Safety margin: additive fraction of baseTokens added to the provider-adjusted estimate.
|
|
21
|
+
* Using additive margin prevents compounding with provider multipliers.
|
|
22
|
+
*
|
|
23
|
+
* Old behavior: baseTokens * providerMultiplier * 1.15 (compounding)
|
|
24
|
+
* e.g. Anthropic: baseTokens * 1.23 * 1.15 = baseTokens * 1.4145
|
|
25
|
+
* New behavior: baseTokens * providerMultiplier + baseTokens * 0.05 (additive)
|
|
26
|
+
* e.g. Anthropic: baseTokens * 1.23 + baseTokens * 0.05 = baseTokens * 1.28
|
|
27
|
+
*/
|
|
28
|
+
export declare const TOKEN_SAFETY_MARGIN_ADDITIVE = 0.05;
|
|
29
|
+
/** @deprecated Use TOKEN_SAFETY_MARGIN_ADDITIVE instead. Kept for backward compatibility. */
|
|
20
30
|
export declare const TOKEN_SAFETY_MARGIN = 1.15;
|
|
21
31
|
/** Message framing overhead in tokens (role + delimiters) */
|
|
22
32
|
export declare const TOKENS_PER_MESSAGE = 4;
|
|
@@ -15,7 +15,17 @@
|
|
|
15
15
|
export const CHARS_PER_TOKEN = 4;
|
|
16
16
|
/** Characters per token for code */
|
|
17
17
|
export const CODE_CHARS_PER_TOKEN = 3;
|
|
18
|
-
/**
|
|
18
|
+
/**
|
|
19
|
+
* Safety margin: additive fraction of baseTokens added to the provider-adjusted estimate.
|
|
20
|
+
* Using additive margin prevents compounding with provider multipliers.
|
|
21
|
+
*
|
|
22
|
+
* Old behavior: baseTokens * providerMultiplier * 1.15 (compounding)
|
|
23
|
+
* e.g. Anthropic: baseTokens * 1.23 * 1.15 = baseTokens * 1.4145
|
|
24
|
+
* New behavior: baseTokens * providerMultiplier + baseTokens * 0.05 (additive)
|
|
25
|
+
* e.g. Anthropic: baseTokens * 1.23 + baseTokens * 0.05 = baseTokens * 1.28
|
|
26
|
+
*/
|
|
27
|
+
export const TOKEN_SAFETY_MARGIN_ADDITIVE = 0.05;
|
|
28
|
+
/** @deprecated Use TOKEN_SAFETY_MARGIN_ADDITIVE instead. Kept for backward compatibility. */
|
|
19
29
|
export const TOKEN_SAFETY_MARGIN = 1.15;
|
|
20
30
|
/** Message framing overhead in tokens (role + delimiters) */
|
|
21
31
|
export const TOKENS_PER_MESSAGE = 4;
|
|
@@ -64,7 +74,11 @@ export function estimateTokens(text, provider, isCode) {
|
|
|
64
74
|
const charsPerToken = isCode ? CODE_CHARS_PER_TOKEN : CHARS_PER_TOKEN;
|
|
65
75
|
const baseTokens = Math.ceil(text.length / charsPerToken);
|
|
66
76
|
const multiplier = getProviderMultiplier(provider);
|
|
67
|
-
|
|
77
|
+
// Apply provider multiplier and additive safety margin separately
|
|
78
|
+
// This prevents compounding (e.g. Anthropic: 1.23 * 1.15 = 1.41x was too aggressive)
|
|
79
|
+
const providerAdjusted = baseTokens * multiplier;
|
|
80
|
+
const safetyBuffer = baseTokens * TOKEN_SAFETY_MARGIN_ADDITIVE;
|
|
81
|
+
return Math.ceil(providerAdjusted + safetyBuffer);
|
|
68
82
|
}
|
|
69
83
|
/**
|
|
70
84
|
* Estimate token count for a single ChatMessage.
|
|
@@ -114,8 +128,9 @@ export function truncateToTokenBudget(text, maxTokens, provider) {
|
|
|
114
128
|
return { text, truncated: false };
|
|
115
129
|
}
|
|
116
130
|
const multiplier = getProviderMultiplier(provider);
|
|
117
|
-
|
|
118
|
-
const
|
|
131
|
+
// Use additive safety margin: effective multiplier = multiplier + additive margin
|
|
132
|
+
const effectiveMultiplier = multiplier + TOKEN_SAFETY_MARGIN_ADDITIVE;
|
|
133
|
+
const maxChars = Math.floor((maxTokens / effectiveMultiplier) * CHARS_PER_TOKEN);
|
|
119
134
|
if (maxChars <= 0) {
|
|
120
135
|
return { text: "", truncated: true };
|
|
121
136
|
}
|
|
@@ -21,10 +21,14 @@ export function hasVideoFrames(messages) {
|
|
|
21
21
|
return false;
|
|
22
22
|
}
|
|
23
23
|
if (Array.isArray(msg.content)) {
|
|
24
|
-
|
|
24
|
+
// Count image parts — only route to video analysis pipeline when there are
|
|
25
|
+
// multiple frames (3+), indicating actual video frame extraction.
|
|
26
|
+
// Single images or pairs should use the model's native vision capability.
|
|
27
|
+
const imageCount = msg.content.filter((part) => typeof part === "object" &&
|
|
25
28
|
part !== null &&
|
|
26
29
|
"type" in part &&
|
|
27
|
-
part.type === "image");
|
|
30
|
+
part.type === "image").length;
|
|
31
|
+
return imageCount >= 3;
|
|
28
32
|
}
|
|
29
33
|
return false;
|
|
30
34
|
});
|
|
@@ -53,7 +57,7 @@ export async function executeVideoAnalysis(messages, options) {
|
|
|
53
57
|
? undefined
|
|
54
58
|
: process.env.GOOGLE_VERTEX_PROJECT || process.env.GOOGLE_CLOUD_PROJECT,
|
|
55
59
|
location: options.region || process.env.GOOGLE_VERTEX_LOCATION,
|
|
56
|
-
model: options.model || "gemini-2.
|
|
60
|
+
model: options.model || "gemini-2.5-flash",
|
|
57
61
|
});
|
|
58
62
|
logger.debug("[VideoAnalysisProcessor] Video analysis completed", {
|
|
59
63
|
hasResult: !!videoAnalysisText,
|
|
@@ -256,9 +256,9 @@ export declare const ModelGroupSchema: z.ZodObject<{
|
|
|
256
256
|
continueOnFailure: boolean;
|
|
257
257
|
minSuccessful: number;
|
|
258
258
|
timeout?: number | undefined;
|
|
259
|
-
metadata?: Record<string, JsonValue> | undefined;
|
|
260
|
-
name?: string | undefined;
|
|
261
259
|
description?: string | undefined;
|
|
260
|
+
name?: string | undefined;
|
|
261
|
+
metadata?: Record<string, JsonValue> | undefined;
|
|
262
262
|
parallelism?: number | undefined;
|
|
263
263
|
}, {
|
|
264
264
|
id: string;
|
|
@@ -279,9 +279,9 @@ export declare const ModelGroupSchema: z.ZodObject<{
|
|
|
279
279
|
}[];
|
|
280
280
|
executionStrategy: "parallel" | "sequential";
|
|
281
281
|
timeout?: number | undefined;
|
|
282
|
-
metadata?: Record<string, JsonValue> | undefined;
|
|
283
|
-
name?: string | undefined;
|
|
284
282
|
description?: string | undefined;
|
|
283
|
+
name?: string | undefined;
|
|
284
|
+
metadata?: Record<string, JsonValue> | undefined;
|
|
285
285
|
continueOnFailure?: boolean | undefined;
|
|
286
286
|
minSuccessful?: number | undefined;
|
|
287
287
|
parallelism?: number | undefined;
|
|
@@ -458,9 +458,9 @@ export declare const WorkflowConfigSchema: z.ZodEffects<z.ZodEffects<z.ZodObject
|
|
|
458
458
|
continueOnFailure: boolean;
|
|
459
459
|
minSuccessful: number;
|
|
460
460
|
timeout?: number | undefined;
|
|
461
|
-
metadata?: Record<string, JsonValue> | undefined;
|
|
462
|
-
name?: string | undefined;
|
|
463
461
|
description?: string | undefined;
|
|
462
|
+
name?: string | undefined;
|
|
463
|
+
metadata?: Record<string, JsonValue> | undefined;
|
|
464
464
|
parallelism?: number | undefined;
|
|
465
465
|
}, {
|
|
466
466
|
id: string;
|
|
@@ -481,9 +481,9 @@ export declare const WorkflowConfigSchema: z.ZodEffects<z.ZodEffects<z.ZodObject
|
|
|
481
481
|
}[];
|
|
482
482
|
executionStrategy: "parallel" | "sequential";
|
|
483
483
|
timeout?: number | undefined;
|
|
484
|
-
metadata?: Record<string, JsonValue> | undefined;
|
|
485
|
-
name?: string | undefined;
|
|
486
484
|
description?: string | undefined;
|
|
485
|
+
name?: string | undefined;
|
|
486
|
+
metadata?: Record<string, JsonValue> | undefined;
|
|
487
487
|
continueOnFailure?: boolean | undefined;
|
|
488
488
|
minSuccessful?: number | undefined;
|
|
489
489
|
parallelism?: number | undefined;
|
|
@@ -749,6 +749,7 @@ export declare const WorkflowConfigSchema: z.ZodEffects<z.ZodEffects<z.ZodObject
|
|
|
749
749
|
enableTracing?: boolean | undefined;
|
|
750
750
|
} | undefined;
|
|
751
751
|
version?: string | undefined;
|
|
752
|
+
description?: string | undefined;
|
|
752
753
|
metadata?: Record<string, JsonValue> | undefined;
|
|
753
754
|
createdAt?: string | undefined;
|
|
754
755
|
updatedAt?: string | undefined;
|
|
@@ -787,7 +788,6 @@ export declare const WorkflowConfigSchema: z.ZodEffects<z.ZodEffects<z.ZodObject
|
|
|
787
788
|
addModelAttribution?: boolean | undefined;
|
|
788
789
|
addExecutionTime?: boolean | undefined;
|
|
789
790
|
} | undefined;
|
|
790
|
-
description?: string | undefined;
|
|
791
791
|
modelGroups?: {
|
|
792
792
|
id: string;
|
|
793
793
|
models: {
|
|
@@ -809,9 +809,9 @@ export declare const WorkflowConfigSchema: z.ZodEffects<z.ZodEffects<z.ZodObject
|
|
|
809
809
|
continueOnFailure: boolean;
|
|
810
810
|
minSuccessful: number;
|
|
811
811
|
timeout?: number | undefined;
|
|
812
|
-
metadata?: Record<string, JsonValue> | undefined;
|
|
813
|
-
name?: string | undefined;
|
|
814
812
|
description?: string | undefined;
|
|
813
|
+
name?: string | undefined;
|
|
814
|
+
metadata?: Record<string, JsonValue> | undefined;
|
|
815
815
|
parallelism?: number | undefined;
|
|
816
816
|
}[] | undefined;
|
|
817
817
|
defaultSystemPrompt?: string | undefined;
|
|
@@ -871,6 +871,7 @@ export declare const WorkflowConfigSchema: z.ZodEffects<z.ZodEffects<z.ZodObject
|
|
|
871
871
|
enableTracing?: boolean | undefined;
|
|
872
872
|
} | undefined;
|
|
873
873
|
version?: string | undefined;
|
|
874
|
+
description?: string | undefined;
|
|
874
875
|
metadata?: Record<string, JsonValue> | undefined;
|
|
875
876
|
createdAt?: string | undefined;
|
|
876
877
|
updatedAt?: string | undefined;
|
|
@@ -909,7 +910,6 @@ export declare const WorkflowConfigSchema: z.ZodEffects<z.ZodEffects<z.ZodObject
|
|
|
909
910
|
addModelAttribution?: boolean | undefined;
|
|
910
911
|
addExecutionTime?: boolean | undefined;
|
|
911
912
|
} | undefined;
|
|
912
|
-
description?: string | undefined;
|
|
913
913
|
modelGroups?: {
|
|
914
914
|
id: string;
|
|
915
915
|
models: {
|
|
@@ -929,9 +929,9 @@ export declare const WorkflowConfigSchema: z.ZodEffects<z.ZodEffects<z.ZodObject
|
|
|
929
929
|
}[];
|
|
930
930
|
executionStrategy: "parallel" | "sequential";
|
|
931
931
|
timeout?: number | undefined;
|
|
932
|
-
metadata?: Record<string, JsonValue> | undefined;
|
|
933
|
-
name?: string | undefined;
|
|
934
932
|
description?: string | undefined;
|
|
933
|
+
name?: string | undefined;
|
|
934
|
+
metadata?: Record<string, JsonValue> | undefined;
|
|
935
935
|
continueOnFailure?: boolean | undefined;
|
|
936
936
|
minSuccessful?: number | undefined;
|
|
937
937
|
parallelism?: number | undefined;
|
|
@@ -993,6 +993,7 @@ export declare const WorkflowConfigSchema: z.ZodEffects<z.ZodEffects<z.ZodObject
|
|
|
993
993
|
enableTracing?: boolean | undefined;
|
|
994
994
|
} | undefined;
|
|
995
995
|
version?: string | undefined;
|
|
996
|
+
description?: string | undefined;
|
|
996
997
|
metadata?: Record<string, JsonValue> | undefined;
|
|
997
998
|
createdAt?: string | undefined;
|
|
998
999
|
updatedAt?: string | undefined;
|
|
@@ -1031,7 +1032,6 @@ export declare const WorkflowConfigSchema: z.ZodEffects<z.ZodEffects<z.ZodObject
|
|
|
1031
1032
|
addModelAttribution?: boolean | undefined;
|
|
1032
1033
|
addExecutionTime?: boolean | undefined;
|
|
1033
1034
|
} | undefined;
|
|
1034
|
-
description?: string | undefined;
|
|
1035
1035
|
modelGroups?: {
|
|
1036
1036
|
id: string;
|
|
1037
1037
|
models: {
|
|
@@ -1053,9 +1053,9 @@ export declare const WorkflowConfigSchema: z.ZodEffects<z.ZodEffects<z.ZodObject
|
|
|
1053
1053
|
continueOnFailure: boolean;
|
|
1054
1054
|
minSuccessful: number;
|
|
1055
1055
|
timeout?: number | undefined;
|
|
1056
|
-
metadata?: Record<string, JsonValue> | undefined;
|
|
1057
|
-
name?: string | undefined;
|
|
1058
1056
|
description?: string | undefined;
|
|
1057
|
+
name?: string | undefined;
|
|
1058
|
+
metadata?: Record<string, JsonValue> | undefined;
|
|
1059
1059
|
parallelism?: number | undefined;
|
|
1060
1060
|
}[] | undefined;
|
|
1061
1061
|
defaultSystemPrompt?: string | undefined;
|
|
@@ -1115,6 +1115,7 @@ export declare const WorkflowConfigSchema: z.ZodEffects<z.ZodEffects<z.ZodObject
|
|
|
1115
1115
|
enableTracing?: boolean | undefined;
|
|
1116
1116
|
} | undefined;
|
|
1117
1117
|
version?: string | undefined;
|
|
1118
|
+
description?: string | undefined;
|
|
1118
1119
|
metadata?: Record<string, JsonValue> | undefined;
|
|
1119
1120
|
createdAt?: string | undefined;
|
|
1120
1121
|
updatedAt?: string | undefined;
|
|
@@ -1153,7 +1154,6 @@ export declare const WorkflowConfigSchema: z.ZodEffects<z.ZodEffects<z.ZodObject
|
|
|
1153
1154
|
addModelAttribution?: boolean | undefined;
|
|
1154
1155
|
addExecutionTime?: boolean | undefined;
|
|
1155
1156
|
} | undefined;
|
|
1156
|
-
description?: string | undefined;
|
|
1157
1157
|
modelGroups?: {
|
|
1158
1158
|
id: string;
|
|
1159
1159
|
models: {
|
|
@@ -1173,9 +1173,9 @@ export declare const WorkflowConfigSchema: z.ZodEffects<z.ZodEffects<z.ZodObject
|
|
|
1173
1173
|
}[];
|
|
1174
1174
|
executionStrategy: "parallel" | "sequential";
|
|
1175
1175
|
timeout?: number | undefined;
|
|
1176
|
-
metadata?: Record<string, JsonValue> | undefined;
|
|
1177
|
-
name?: string | undefined;
|
|
1178
1176
|
description?: string | undefined;
|
|
1177
|
+
name?: string | undefined;
|
|
1178
|
+
metadata?: Record<string, JsonValue> | undefined;
|
|
1179
1179
|
continueOnFailure?: boolean | undefined;
|
|
1180
1180
|
minSuccessful?: number | undefined;
|
|
1181
1181
|
parallelism?: number | undefined;
|
|
@@ -1237,6 +1237,7 @@ export declare const WorkflowConfigSchema: z.ZodEffects<z.ZodEffects<z.ZodObject
|
|
|
1237
1237
|
enableTracing?: boolean | undefined;
|
|
1238
1238
|
} | undefined;
|
|
1239
1239
|
version?: string | undefined;
|
|
1240
|
+
description?: string | undefined;
|
|
1240
1241
|
metadata?: Record<string, JsonValue> | undefined;
|
|
1241
1242
|
createdAt?: string | undefined;
|
|
1242
1243
|
updatedAt?: string | undefined;
|
|
@@ -1275,7 +1276,6 @@ export declare const WorkflowConfigSchema: z.ZodEffects<z.ZodEffects<z.ZodObject
|
|
|
1275
1276
|
addModelAttribution?: boolean | undefined;
|
|
1276
1277
|
addExecutionTime?: boolean | undefined;
|
|
1277
1278
|
} | undefined;
|
|
1278
|
-
description?: string | undefined;
|
|
1279
1279
|
modelGroups?: {
|
|
1280
1280
|
id: string;
|
|
1281
1281
|
models: {
|
|
@@ -1297,9 +1297,9 @@ export declare const WorkflowConfigSchema: z.ZodEffects<z.ZodEffects<z.ZodObject
|
|
|
1297
1297
|
continueOnFailure: boolean;
|
|
1298
1298
|
minSuccessful: number;
|
|
1299
1299
|
timeout?: number | undefined;
|
|
1300
|
-
metadata?: Record<string, JsonValue> | undefined;
|
|
1301
|
-
name?: string | undefined;
|
|
1302
1300
|
description?: string | undefined;
|
|
1301
|
+
name?: string | undefined;
|
|
1302
|
+
metadata?: Record<string, JsonValue> | undefined;
|
|
1303
1303
|
parallelism?: number | undefined;
|
|
1304
1304
|
}[] | undefined;
|
|
1305
1305
|
defaultSystemPrompt?: string | undefined;
|
|
@@ -1359,6 +1359,7 @@ export declare const WorkflowConfigSchema: z.ZodEffects<z.ZodEffects<z.ZodObject
|
|
|
1359
1359
|
enableTracing?: boolean | undefined;
|
|
1360
1360
|
} | undefined;
|
|
1361
1361
|
version?: string | undefined;
|
|
1362
|
+
description?: string | undefined;
|
|
1362
1363
|
metadata?: Record<string, JsonValue> | undefined;
|
|
1363
1364
|
createdAt?: string | undefined;
|
|
1364
1365
|
updatedAt?: string | undefined;
|
|
@@ -1397,7 +1398,6 @@ export declare const WorkflowConfigSchema: z.ZodEffects<z.ZodEffects<z.ZodObject
|
|
|
1397
1398
|
addModelAttribution?: boolean | undefined;
|
|
1398
1399
|
addExecutionTime?: boolean | undefined;
|
|
1399
1400
|
} | undefined;
|
|
1400
|
-
description?: string | undefined;
|
|
1401
1401
|
modelGroups?: {
|
|
1402
1402
|
id: string;
|
|
1403
1403
|
models: {
|
|
@@ -1417,9 +1417,9 @@ export declare const WorkflowConfigSchema: z.ZodEffects<z.ZodEffects<z.ZodObject
|
|
|
1417
1417
|
}[];
|
|
1418
1418
|
executionStrategy: "parallel" | "sequential";
|
|
1419
1419
|
timeout?: number | undefined;
|
|
1420
|
-
metadata?: Record<string, JsonValue> | undefined;
|
|
1421
|
-
name?: string | undefined;
|
|
1422
1420
|
description?: string | undefined;
|
|
1421
|
+
name?: string | undefined;
|
|
1422
|
+
metadata?: Record<string, JsonValue> | undefined;
|
|
1423
1423
|
continueOnFailure?: boolean | undefined;
|
|
1424
1424
|
minSuccessful?: number | undefined;
|
|
1425
1425
|
parallelism?: number | undefined;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@juspay/neurolink",
|
|
3
|
-
"version": "9.
|
|
3
|
+
"version": "9.16.0",
|
|
4
4
|
"description": "Universal AI Development Platform with working MCP integration, multi-provider support, and professional CLI. Built-in tools operational, 58+ external MCP servers discoverable. Connect to filesystem, GitHub, database operations, and more. Build, test, and deploy AI applications with 13 providers: OpenAI, Anthropic, Google AI, AWS Bedrock, Azure, Hugging Face, Ollama, and Mistral AI.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Juspay Technologies",
|
|
@@ -214,6 +214,7 @@
|
|
|
214
214
|
"music-metadata": "^11.11.2",
|
|
215
215
|
"nanoid": "^5.1.5",
|
|
216
216
|
"ollama-ai-provider": "^1.2.0",
|
|
217
|
+
"open": "^11.0.0",
|
|
217
218
|
"ora": "^7.0.1",
|
|
218
219
|
"p-limit": "^6.2.0",
|
|
219
220
|
"pdf-parse": "^2.4.5",
|