@juspay/neurolink 9.42.0 → 9.42.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.
Files changed (84) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/dist/auth/anthropicOAuth.js +12 -0
  3. package/dist/browser/neurolink.min.js +337 -336
  4. package/dist/cli/commands/mcp.d.ts +6 -0
  5. package/dist/cli/commands/mcp.js +188 -184
  6. package/dist/cli/commands/proxy.js +537 -518
  7. package/dist/core/baseProvider.d.ts +6 -1
  8. package/dist/core/baseProvider.js +208 -230
  9. package/dist/core/factory.d.ts +3 -0
  10. package/dist/core/factory.js +138 -188
  11. package/dist/evaluation/pipeline/evaluationPipeline.js +5 -2
  12. package/dist/evaluation/scorers/scorerRegistry.d.ts +3 -0
  13. package/dist/evaluation/scorers/scorerRegistry.js +353 -282
  14. package/dist/lib/auth/anthropicOAuth.js +12 -0
  15. package/dist/lib/core/baseProvider.d.ts +6 -1
  16. package/dist/lib/core/baseProvider.js +208 -230
  17. package/dist/lib/core/factory.d.ts +3 -0
  18. package/dist/lib/core/factory.js +138 -188
  19. package/dist/lib/evaluation/pipeline/evaluationPipeline.js +5 -2
  20. package/dist/lib/evaluation/scorers/scorerRegistry.d.ts +3 -0
  21. package/dist/lib/evaluation/scorers/scorerRegistry.js +353 -282
  22. package/dist/lib/mcp/toolRegistry.d.ts +2 -0
  23. package/dist/lib/mcp/toolRegistry.js +32 -31
  24. package/dist/lib/neurolink.d.ts +38 -0
  25. package/dist/lib/neurolink.js +1858 -1689
  26. package/dist/lib/providers/googleAiStudio.js +0 -5
  27. package/dist/lib/providers/googleVertex.d.ts +10 -0
  28. package/dist/lib/providers/googleVertex.js +436 -444
  29. package/dist/lib/providers/litellm.d.ts +1 -0
  30. package/dist/lib/providers/litellm.js +73 -64
  31. package/dist/lib/providers/ollama.js +17 -4
  32. package/dist/lib/providers/openAI.d.ts +2 -0
  33. package/dist/lib/providers/openAI.js +139 -140
  34. package/dist/lib/proxy/claudeFormat.js +12 -4
  35. package/dist/lib/proxy/oauthFetch.js +298 -318
  36. package/dist/lib/proxy/proxyConfig.js +3 -1
  37. package/dist/lib/proxy/proxyFetch.js +250 -222
  38. package/dist/lib/proxy/requestLogger.js +132 -45
  39. package/dist/lib/proxy/sseInterceptor.js +36 -11
  40. package/dist/lib/server/routes/claudeProxyRoutes.d.ts +10 -1
  41. package/dist/lib/server/routes/claudeProxyRoutes.js +2726 -2272
  42. package/dist/lib/services/server/ai/observability/instrumentation.js +194 -218
  43. package/dist/lib/tasks/backends/bullmqBackend.js +24 -18
  44. package/dist/lib/tasks/store/redisTaskStore.js +23 -16
  45. package/dist/lib/tasks/taskManager.d.ts +2 -0
  46. package/dist/lib/tasks/taskManager.js +100 -5
  47. package/dist/lib/telemetry/telemetryService.js +9 -5
  48. package/dist/lib/types/proxyTypes.d.ts +124 -1
  49. package/dist/lib/utils/providerHealth.d.ts +1 -0
  50. package/dist/lib/utils/providerHealth.js +46 -31
  51. package/dist/lib/utils/providerUtils.js +11 -22
  52. package/dist/mcp/toolRegistry.d.ts +2 -0
  53. package/dist/mcp/toolRegistry.js +32 -31
  54. package/dist/neurolink.d.ts +38 -0
  55. package/dist/neurolink.js +1858 -1689
  56. package/dist/providers/googleAiStudio.js +0 -5
  57. package/dist/providers/googleVertex.d.ts +10 -0
  58. package/dist/providers/googleVertex.js +436 -444
  59. package/dist/providers/litellm.d.ts +1 -0
  60. package/dist/providers/litellm.js +73 -64
  61. package/dist/providers/ollama.js +17 -4
  62. package/dist/providers/openAI.d.ts +2 -0
  63. package/dist/providers/openAI.js +139 -140
  64. package/dist/proxy/claudeFormat.js +12 -4
  65. package/dist/proxy/oauthFetch.js +298 -318
  66. package/dist/proxy/proxyConfig.js +3 -1
  67. package/dist/proxy/proxyFetch.js +250 -222
  68. package/dist/proxy/requestLogger.js +132 -45
  69. package/dist/proxy/sseInterceptor.js +36 -11
  70. package/dist/server/routes/claudeProxyRoutes.d.ts +10 -1
  71. package/dist/server/routes/claudeProxyRoutes.js +2726 -2272
  72. package/dist/services/server/ai/observability/instrumentation.js +194 -218
  73. package/dist/tasks/backends/bullmqBackend.js +24 -18
  74. package/dist/tasks/store/redisTaskStore.js +23 -16
  75. package/dist/tasks/taskManager.d.ts +2 -0
  76. package/dist/tasks/taskManager.js +100 -5
  77. package/dist/telemetry/telemetryService.js +9 -5
  78. package/dist/types/proxyTypes.d.ts +124 -1
  79. package/dist/utils/providerHealth.d.ts +1 -0
  80. package/dist/utils/providerHealth.js +46 -31
  81. package/dist/utils/providerUtils.js +12 -22
  82. package/package.json +3 -2
  83. package/scripts/observability/check-proxy-telemetry.mjs +1 -1
  84. package/scripts/observability/manage-local-openobserve.sh +36 -5
@@ -47,6 +47,141 @@ export class AIProviderFactory {
47
47
  // This ensures the factory continues to work even if dynamic models fail
48
48
  }
49
49
  }
50
+ static resolveModelFromEnvironment(providerName, modelName, functionTag) {
51
+ if (modelName && modelName !== "default") {
52
+ logger.debug(`[${functionTag}] Skipping environment variable check - explicit model provided: ${modelName}`);
53
+ return modelName;
54
+ }
55
+ logger.debug(`[${functionTag}] Checking environment variables for provider: ${providerName}`);
56
+ const normalizedProvider = providerName.toLowerCase();
57
+ const envConfigs = [
58
+ {
59
+ match: ["bedrock"],
60
+ label: "Bedrock",
61
+ vars: ["BEDROCK_MODEL", "BEDROCK_MODEL_ID"],
62
+ },
63
+ {
64
+ match: ["vertex"],
65
+ label: "Vertex",
66
+ vars: ["VERTEX_MODEL"],
67
+ },
68
+ {
69
+ match: ["azure"],
70
+ label: "Azure",
71
+ vars: [
72
+ "AZURE_OPENAI_MODEL",
73
+ "AZURE_OPENAI_DEPLOYMENT",
74
+ "AZURE_OPENAI_DEPLOYMENT_ID",
75
+ ],
76
+ },
77
+ {
78
+ match: ["openai", "gpt", "chatgpt", "openai-compat"],
79
+ label: "OpenAI",
80
+ vars: ["OPENAI_MODEL"],
81
+ },
82
+ {
83
+ match: ["anthropic", "claude", "anthropic-claude"],
84
+ label: "Anthropic",
85
+ vars: ["ANTHROPIC_MODEL"],
86
+ },
87
+ {
88
+ match: ["google", "gemini"],
89
+ label: "Google AI",
90
+ vars: ["GOOGLE_AI_MODEL"],
91
+ },
92
+ {
93
+ match: ["mistral"],
94
+ label: "Mistral",
95
+ vars: ["MISTRAL_MODEL"],
96
+ },
97
+ {
98
+ match: ["ollama"],
99
+ label: "Ollama",
100
+ vars: ["OLLAMA_MODEL"],
101
+ },
102
+ {
103
+ match: ["litellm"],
104
+ label: "LiteLLM",
105
+ vars: ["LITELLM_MODEL"],
106
+ },
107
+ ];
108
+ const envConfig = envConfigs.find((config) => config.match.some((match) => normalizedProvider.includes(match)));
109
+ if (!envConfig) {
110
+ logger.debug(`[${functionTag}] Provider ${providerName} - no environment variable check implemented`);
111
+ return modelName;
112
+ }
113
+ const matchedVar = envConfig.vars.find((name) => process.env[name]);
114
+ const envModel = matchedVar ? process.env[matchedVar] : undefined;
115
+ if (envModel) {
116
+ logger.debug(`[${functionTag}] Environment variable found for ${envConfig.label}`, {
117
+ envVariable: matchedVar,
118
+ resolvedModel: envModel,
119
+ });
120
+ return envModel;
121
+ }
122
+ logger.debug(`[${functionTag}] No ${envConfig.label} environment variables found (${envConfig.vars.join(", ")})`);
123
+ return modelName;
124
+ }
125
+ static async resolveDynamicModelName(providerName, modelName, resolvedModelName, functionTag) {
126
+ if ((resolvedModelName && resolvedModelName !== "default") ||
127
+ (modelName && modelName !== "default")) {
128
+ logger.debug(`[${functionTag}] Skipping dynamic model resolution`, {
129
+ resolvedModelName: resolvedModelName || "none",
130
+ reason: "Model already resolved from environment variables or explicit parameter",
131
+ });
132
+ return resolvedModelName;
133
+ }
134
+ logger.debug(`[${functionTag}] Attempting dynamic model resolution`, {
135
+ currentResolvedModel: resolvedModelName || "none",
136
+ reason: "No environment variable found and no explicit model provided",
137
+ });
138
+ try {
139
+ const normalizedProvider = this.normalizeProviderName(providerName);
140
+ if (dynamicModelProvider.needsRefresh()) {
141
+ logger.debug(`[${functionTag}] Dynamic model provider needs refresh - initializing`);
142
+ await this.initializeDynamicProviderWithTimeout();
143
+ }
144
+ const dynamicModel = dynamicModelProvider.resolveModel(normalizedProvider, modelName || undefined);
145
+ if (!dynamicModel) {
146
+ logger.debug(`[${functionTag}] Dynamic model resolution returned null`, {
147
+ provider: normalizedProvider,
148
+ requestedModel: modelName || "default",
149
+ });
150
+ return resolvedModelName;
151
+ }
152
+ logger.debug(`[${functionTag}] Resolved dynamic model`, {
153
+ provider: normalizedProvider,
154
+ requestedModel: modelName || "default",
155
+ resolvedModel: dynamicModel.id,
156
+ displayName: dynamicModel.displayName,
157
+ pricing: dynamicModel.pricing.input,
158
+ });
159
+ return dynamicModel.id;
160
+ }
161
+ catch (resolveError) {
162
+ logger.debug(`[${functionTag}] Dynamic model resolution failed, using static fallback`, {
163
+ error: resolveError instanceof Error
164
+ ? resolveError.message
165
+ : String(resolveError),
166
+ });
167
+ return resolvedModelName;
168
+ }
169
+ }
170
+ static async createResolvedProvider(providerName, resolvedModelName, sdk, region, functionTag) {
171
+ await withTimeout(ProviderRegistry.registerAllProviders(), 30_000, new Error("Provider registration timed out"));
172
+ const normalizedName = this.normalizeProviderName(providerName);
173
+ const finalModelName = resolvedModelName === "default" || resolvedModelName === null
174
+ ? undefined
175
+ : resolvedModelName;
176
+ logger.debug(`[${functionTag}] Final provider configuration`, {
177
+ originalProviderName: providerName,
178
+ normalizedProviderName: normalizedName,
179
+ resolvedModelName: resolvedModelName || "not resolved",
180
+ finalModelName: finalModelName || "using provider default",
181
+ });
182
+ const provider = await withTimeout(ProviderFactory.createProvider(normalizedName, finalModelName, sdk, region), 30_000, new Error(`Provider creation timed out for ${normalizedName}`));
183
+ return { normalizedName, finalModelName, provider };
184
+ }
50
185
  /**
51
186
  * Create a provider instance for the specified provider type
52
187
  * @param providerName - Name of the provider ('vertex', 'bedrock', 'openai')
@@ -88,194 +223,9 @@ export class AIProviderFactory {
88
223
  // - Enhanced error handling and logging for debugging
89
224
  //
90
225
  // The dynamic model provider now provides reliable functionality without hanging
91
- let resolvedModelName = modelName;
92
- // PRIORITY 1: Check environment variables BEFORE dynamic resolution
93
- if (!modelName || modelName === "default") {
94
- logger.debug(`[${functionTag}] Checking environment variables for provider: ${providerName}`);
95
- // Check for provider-specific environment variables first
96
- if (providerName.toLowerCase().includes("bedrock")) {
97
- const envModel = process.env.BEDROCK_MODEL || process.env.BEDROCK_MODEL_ID;
98
- if (envModel) {
99
- resolvedModelName = envModel;
100
- logger.debug(`[${functionTag}] Environment variable found for Bedrock`, {
101
- envVariable: process.env.BEDROCK_MODEL
102
- ? "BEDROCK_MODEL"
103
- : "BEDROCK_MODEL_ID",
104
- resolvedModel: envModel,
105
- });
106
- }
107
- else {
108
- logger.debug(`[${functionTag}] No Bedrock environment variables found (BEDROCK_MODEL, BEDROCK_MODEL_ID)`);
109
- }
110
- }
111
- else if (providerName.toLowerCase().includes("vertex")) {
112
- const envModel = process.env.VERTEX_MODEL;
113
- if (envModel) {
114
- resolvedModelName = envModel;
115
- logger.debug(`[${functionTag}] Environment variable found for Vertex`, {
116
- envVariable: "VERTEX_MODEL",
117
- resolvedModel: envModel,
118
- });
119
- }
120
- else {
121
- logger.debug(`[${functionTag}] No Vertex environment variables found (VERTEX_MODEL)`);
122
- }
123
- }
124
- else if (providerName.toLowerCase().includes("azure")) {
125
- const envModel = process.env.AZURE_OPENAI_MODEL ||
126
- process.env.AZURE_OPENAI_DEPLOYMENT ||
127
- process.env.AZURE_OPENAI_DEPLOYMENT_ID;
128
- if (envModel) {
129
- resolvedModelName = envModel;
130
- logger.debug(`[${functionTag}] Environment variable found for Azure`, {
131
- envVariable: process.env.AZURE_OPENAI_MODEL
132
- ? "AZURE_OPENAI_MODEL"
133
- : process.env.AZURE_OPENAI_DEPLOYMENT
134
- ? "AZURE_OPENAI_DEPLOYMENT"
135
- : "AZURE_OPENAI_DEPLOYMENT_ID",
136
- resolvedModel: envModel,
137
- });
138
- }
139
- else {
140
- logger.debug(`[${functionTag}] No Azure environment variables found (AZURE_OPENAI_MODEL, AZURE_OPENAI_DEPLOYMENT, AZURE_OPENAI_DEPLOYMENT_ID)`);
141
- }
142
- }
143
- else if (providerName.toLowerCase().includes("openai")) {
144
- const envModel = process.env.OPENAI_MODEL;
145
- if (envModel) {
146
- resolvedModelName = envModel;
147
- logger.debug(`[${functionTag}] Environment variable found for OpenAI`, {
148
- envVariable: "OPENAI_MODEL",
149
- resolvedModel: envModel,
150
- });
151
- }
152
- else {
153
- logger.debug(`[${functionTag}] No OpenAI environment variables found (OPENAI_MODEL)`);
154
- }
155
- }
156
- else if (providerName.toLowerCase().includes("anthropic")) {
157
- const envModel = process.env.ANTHROPIC_MODEL;
158
- if (envModel) {
159
- resolvedModelName = envModel;
160
- logger.debug(`[${functionTag}] Environment variable found for Anthropic`, {
161
- envVariable: "ANTHROPIC_MODEL",
162
- resolvedModel: envModel,
163
- });
164
- }
165
- else {
166
- logger.debug(`[${functionTag}] No Anthropic environment variables found (ANTHROPIC_MODEL)`);
167
- }
168
- }
169
- else if (providerName.toLowerCase().includes("google") ||
170
- providerName.toLowerCase().includes("gemini")) {
171
- const envModel = process.env.GOOGLE_AI_MODEL;
172
- if (envModel) {
173
- resolvedModelName = envModel;
174
- logger.debug(`[${functionTag}] Environment variable found for Google AI`, {
175
- envVariable: "GOOGLE_AI_MODEL",
176
- resolvedModel: envModel,
177
- });
178
- }
179
- else {
180
- logger.debug(`[${functionTag}] No Google AI environment variables found (GOOGLE_AI_MODEL)`);
181
- }
182
- }
183
- else if (providerName.toLowerCase().includes("mistral")) {
184
- const envModel = process.env.MISTRAL_MODEL;
185
- if (envModel) {
186
- resolvedModelName = envModel;
187
- logger.debug(`[${functionTag}] Environment variable found for Mistral`, {
188
- envVariable: "MISTRAL_MODEL",
189
- resolvedModel: envModel,
190
- });
191
- }
192
- else {
193
- logger.debug(`[${functionTag}] No Mistral environment variables found (MISTRAL_MODEL)`);
194
- }
195
- }
196
- else if (providerName.toLowerCase().includes("ollama")) {
197
- const envModel = process.env.OLLAMA_MODEL;
198
- if (envModel) {
199
- resolvedModelName = envModel;
200
- logger.debug(`[${functionTag}] Environment variable found for Ollama`, {
201
- envVariable: "OLLAMA_MODEL",
202
- resolvedModel: envModel,
203
- });
204
- }
205
- else {
206
- logger.debug(`[${functionTag}] No Ollama environment variables found (OLLAMA_MODEL)`);
207
- }
208
- }
209
- else {
210
- logger.debug(`[${functionTag}] Provider ${providerName} - no environment variable check implemented`);
211
- }
212
- }
213
- else {
214
- logger.debug(`[${functionTag}] Skipping environment variable check - explicit model provided: ${modelName}`);
215
- }
216
- // PRIORITY 2: Enable dynamic model resolution only if no env var found
217
- if ((!resolvedModelName || resolvedModelName === "default") &&
218
- (!modelName || modelName === "default")) {
219
- logger.debug(`[${functionTag}] Attempting dynamic model resolution`, {
220
- currentResolvedModel: resolvedModelName || "none",
221
- reason: "No environment variable found and no explicit model provided",
222
- });
223
- try {
224
- const normalizedProvider = this.normalizeProviderName(providerName);
225
- // Initialize with timeout protection - won't hang anymore
226
- if (dynamicModelProvider.needsRefresh()) {
227
- logger.debug(`[${functionTag}] Dynamic model provider needs refresh - initializing`);
228
- await this.initializeDynamicProviderWithTimeout();
229
- }
230
- const dynamicModel = dynamicModelProvider.resolveModel(normalizedProvider, modelName || undefined);
231
- if (dynamicModel) {
232
- resolvedModelName = dynamicModel.id;
233
- logger.debug(`[${functionTag}] Resolved dynamic model`, {
234
- provider: normalizedProvider,
235
- requestedModel: modelName || "default",
236
- resolvedModel: resolvedModelName,
237
- displayName: dynamicModel.displayName,
238
- pricing: dynamicModel.pricing.input,
239
- });
240
- }
241
- else {
242
- logger.debug(`[${functionTag}] Dynamic model resolution returned null`, {
243
- provider: normalizedProvider,
244
- requestedModel: modelName || "default",
245
- });
246
- }
247
- }
248
- catch (resolveError) {
249
- logger.debug(`[${functionTag}] Dynamic model resolution failed, using static fallback`, {
250
- error: resolveError instanceof Error
251
- ? resolveError.message
252
- : String(resolveError),
253
- });
254
- // Continue with static model name - no functionality loss
255
- }
256
- }
257
- else {
258
- logger.debug(`[${functionTag}] Skipping dynamic model resolution`, {
259
- resolvedModelName: resolvedModelName || "none",
260
- reason: "Model already resolved from environment variables or explicit parameter",
261
- });
262
- }
263
- // CRITICAL FIX: Initialize providers before using them
264
- await withTimeout(ProviderRegistry.registerAllProviders(), 30_000, new Error("Provider registration timed out"));
265
- // PURE FACTORY PATTERN: No switch statements - use ProviderFactory exclusively
266
- const normalizedName = this.normalizeProviderName(providerName);
267
- const finalModelName = resolvedModelName === "default" || resolvedModelName === null
268
- ? undefined
269
- : resolvedModelName;
270
- logger.debug(`[${functionTag}] Final provider configuration`, {
271
- originalProviderName: providerName,
272
- normalizedProviderName: normalizedName,
273
- originalModelName: modelName || "not provided",
274
- resolvedModelName: resolvedModelName || "not resolved",
275
- finalModelName: finalModelName || "using provider default",
276
- });
277
- // Create provider with enhanced SDK and region support
278
- const provider = await withTimeout(ProviderFactory.createProvider(normalizedName, finalModelName, sdk, region), 30_000, new Error(`Provider creation timed out for ${normalizedName}`));
226
+ let resolvedModelName = this.resolveModelFromEnvironment(providerName, modelName, functionTag);
227
+ resolvedModelName = await this.resolveDynamicModelName(providerName, modelName, resolvedModelName, functionTag);
228
+ const { normalizedName, finalModelName, provider } = await this.createResolvedProvider(providerName, resolvedModelName, sdk, region, functionTag);
279
229
  // Summary logging in format expected by debugging tools
280
230
  logger.debug(`[AIProviderFactory] Provider creation completed { providerName: '${normalizedName}', modelName: '${finalModelName}' }`);
281
231
  logger.debug(`[AIProviderFactory] Resolved model: ${finalModelName}`);
@@ -3,7 +3,7 @@
3
3
  * Multi-scorer orchestration with configurable execution
4
4
  */
5
5
  import { logger } from "../../utils/logger.js";
6
- import { withTimeout } from "../../utils/errorHandling.js";
6
+ import { ErrorFactory, withTimeout } from "../../utils/errorHandling.js";
7
7
  import { DEFAULT_SCORE_SCALE } from "../scorers/baseScorer.js";
8
8
  import { ScorerRegistry } from "../scorers/scorerRegistry.js";
9
9
  /**
@@ -178,7 +178,10 @@ export class EvaluationPipeline {
178
178
  const hasOnlyScorers = !!options?.onlyScorers && options.onlyScorers.length > 0;
179
179
  const hasSkipScorers = !!options?.skipScorers && options.skipScorers.length > 0;
180
180
  if (hasOnlyScorers && hasSkipScorers) {
181
- throw new Error("Cannot specify both 'onlyScorers' and 'skipScorers' options");
181
+ throw ErrorFactory.invalidConfiguration("evaluation pipeline execution options", "Cannot specify both 'onlyScorers' and 'skipScorers' options", {
182
+ onlyScorers: options?.onlyScorers,
183
+ skipScorers: options?.skipScorers,
184
+ });
182
185
  }
183
186
  }
184
187
  /**
@@ -19,6 +19,9 @@ export declare class ScorerRegistry {
19
19
  * Register a scorer using a simple configuration
20
20
  */
21
21
  static registerScorer(metadata: ScorerMetadata, factory: ScorerFactory, aliases?: string[]): void;
22
+ private static registerScorerDefinitions;
23
+ private static registerBuiltInLLMScorers;
24
+ private static registerBuiltInRuleScorers;
22
25
  /**
23
26
  * Register built-in scorers using dynamic imports
24
27
  */