@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
@@ -48,6 +48,141 @@ export class AIProviderFactory {
48
48
  // This ensures the factory continues to work even if dynamic models fail
49
49
  }
50
50
  }
51
+ static resolveModelFromEnvironment(providerName, modelName, functionTag) {
52
+ if (modelName && modelName !== "default") {
53
+ logger.debug(`[${functionTag}] Skipping environment variable check - explicit model provided: ${modelName}`);
54
+ return modelName;
55
+ }
56
+ logger.debug(`[${functionTag}] Checking environment variables for provider: ${providerName}`);
57
+ const normalizedProvider = providerName.toLowerCase();
58
+ const envConfigs = [
59
+ {
60
+ match: ["bedrock"],
61
+ label: "Bedrock",
62
+ vars: ["BEDROCK_MODEL", "BEDROCK_MODEL_ID"],
63
+ },
64
+ {
65
+ match: ["vertex"],
66
+ label: "Vertex",
67
+ vars: ["VERTEX_MODEL"],
68
+ },
69
+ {
70
+ match: ["azure"],
71
+ label: "Azure",
72
+ vars: [
73
+ "AZURE_OPENAI_MODEL",
74
+ "AZURE_OPENAI_DEPLOYMENT",
75
+ "AZURE_OPENAI_DEPLOYMENT_ID",
76
+ ],
77
+ },
78
+ {
79
+ match: ["openai", "gpt", "chatgpt", "openai-compat"],
80
+ label: "OpenAI",
81
+ vars: ["OPENAI_MODEL"],
82
+ },
83
+ {
84
+ match: ["anthropic", "claude", "anthropic-claude"],
85
+ label: "Anthropic",
86
+ vars: ["ANTHROPIC_MODEL"],
87
+ },
88
+ {
89
+ match: ["google", "gemini"],
90
+ label: "Google AI",
91
+ vars: ["GOOGLE_AI_MODEL"],
92
+ },
93
+ {
94
+ match: ["mistral"],
95
+ label: "Mistral",
96
+ vars: ["MISTRAL_MODEL"],
97
+ },
98
+ {
99
+ match: ["ollama"],
100
+ label: "Ollama",
101
+ vars: ["OLLAMA_MODEL"],
102
+ },
103
+ {
104
+ match: ["litellm"],
105
+ label: "LiteLLM",
106
+ vars: ["LITELLM_MODEL"],
107
+ },
108
+ ];
109
+ const envConfig = envConfigs.find((config) => config.match.some((match) => normalizedProvider.includes(match)));
110
+ if (!envConfig) {
111
+ logger.debug(`[${functionTag}] Provider ${providerName} - no environment variable check implemented`);
112
+ return modelName;
113
+ }
114
+ const matchedVar = envConfig.vars.find((name) => process.env[name]);
115
+ const envModel = matchedVar ? process.env[matchedVar] : undefined;
116
+ if (envModel) {
117
+ logger.debug(`[${functionTag}] Environment variable found for ${envConfig.label}`, {
118
+ envVariable: matchedVar,
119
+ resolvedModel: envModel,
120
+ });
121
+ return envModel;
122
+ }
123
+ logger.debug(`[${functionTag}] No ${envConfig.label} environment variables found (${envConfig.vars.join(", ")})`);
124
+ return modelName;
125
+ }
126
+ static async resolveDynamicModelName(providerName, modelName, resolvedModelName, functionTag) {
127
+ if ((resolvedModelName && resolvedModelName !== "default") ||
128
+ (modelName && modelName !== "default")) {
129
+ logger.debug(`[${functionTag}] Skipping dynamic model resolution`, {
130
+ resolvedModelName: resolvedModelName || "none",
131
+ reason: "Model already resolved from environment variables or explicit parameter",
132
+ });
133
+ return resolvedModelName;
134
+ }
135
+ logger.debug(`[${functionTag}] Attempting dynamic model resolution`, {
136
+ currentResolvedModel: resolvedModelName || "none",
137
+ reason: "No environment variable found and no explicit model provided",
138
+ });
139
+ try {
140
+ const normalizedProvider = this.normalizeProviderName(providerName);
141
+ if (dynamicModelProvider.needsRefresh()) {
142
+ logger.debug(`[${functionTag}] Dynamic model provider needs refresh - initializing`);
143
+ await this.initializeDynamicProviderWithTimeout();
144
+ }
145
+ const dynamicModel = dynamicModelProvider.resolveModel(normalizedProvider, modelName || undefined);
146
+ if (!dynamicModel) {
147
+ logger.debug(`[${functionTag}] Dynamic model resolution returned null`, {
148
+ provider: normalizedProvider,
149
+ requestedModel: modelName || "default",
150
+ });
151
+ return resolvedModelName;
152
+ }
153
+ logger.debug(`[${functionTag}] Resolved dynamic model`, {
154
+ provider: normalizedProvider,
155
+ requestedModel: modelName || "default",
156
+ resolvedModel: dynamicModel.id,
157
+ displayName: dynamicModel.displayName,
158
+ pricing: dynamicModel.pricing.input,
159
+ });
160
+ return dynamicModel.id;
161
+ }
162
+ catch (resolveError) {
163
+ logger.debug(`[${functionTag}] Dynamic model resolution failed, using static fallback`, {
164
+ error: resolveError instanceof Error
165
+ ? resolveError.message
166
+ : String(resolveError),
167
+ });
168
+ return resolvedModelName;
169
+ }
170
+ }
171
+ static async createResolvedProvider(providerName, resolvedModelName, sdk, region, functionTag) {
172
+ await withTimeout(ProviderRegistry.registerAllProviders(), 30_000, new Error("Provider registration timed out"));
173
+ const normalizedName = this.normalizeProviderName(providerName);
174
+ const finalModelName = resolvedModelName === "default" || resolvedModelName === null
175
+ ? undefined
176
+ : resolvedModelName;
177
+ logger.debug(`[${functionTag}] Final provider configuration`, {
178
+ originalProviderName: providerName,
179
+ normalizedProviderName: normalizedName,
180
+ resolvedModelName: resolvedModelName || "not resolved",
181
+ finalModelName: finalModelName || "using provider default",
182
+ });
183
+ const provider = await withTimeout(ProviderFactory.createProvider(normalizedName, finalModelName, sdk, region), 30_000, new Error(`Provider creation timed out for ${normalizedName}`));
184
+ return { normalizedName, finalModelName, provider };
185
+ }
51
186
  /**
52
187
  * Create a provider instance for the specified provider type
53
188
  * @param providerName - Name of the provider ('vertex', 'bedrock', 'openai')
@@ -89,194 +224,9 @@ export class AIProviderFactory {
89
224
  // - Enhanced error handling and logging for debugging
90
225
  //
91
226
  // The dynamic model provider now provides reliable functionality without hanging
92
- let resolvedModelName = modelName;
93
- // PRIORITY 1: Check environment variables BEFORE dynamic resolution
94
- if (!modelName || modelName === "default") {
95
- logger.debug(`[${functionTag}] Checking environment variables for provider: ${providerName}`);
96
- // Check for provider-specific environment variables first
97
- if (providerName.toLowerCase().includes("bedrock")) {
98
- const envModel = process.env.BEDROCK_MODEL || process.env.BEDROCK_MODEL_ID;
99
- if (envModel) {
100
- resolvedModelName = envModel;
101
- logger.debug(`[${functionTag}] Environment variable found for Bedrock`, {
102
- envVariable: process.env.BEDROCK_MODEL
103
- ? "BEDROCK_MODEL"
104
- : "BEDROCK_MODEL_ID",
105
- resolvedModel: envModel,
106
- });
107
- }
108
- else {
109
- logger.debug(`[${functionTag}] No Bedrock environment variables found (BEDROCK_MODEL, BEDROCK_MODEL_ID)`);
110
- }
111
- }
112
- else if (providerName.toLowerCase().includes("vertex")) {
113
- const envModel = process.env.VERTEX_MODEL;
114
- if (envModel) {
115
- resolvedModelName = envModel;
116
- logger.debug(`[${functionTag}] Environment variable found for Vertex`, {
117
- envVariable: "VERTEX_MODEL",
118
- resolvedModel: envModel,
119
- });
120
- }
121
- else {
122
- logger.debug(`[${functionTag}] No Vertex environment variables found (VERTEX_MODEL)`);
123
- }
124
- }
125
- else if (providerName.toLowerCase().includes("azure")) {
126
- const envModel = process.env.AZURE_OPENAI_MODEL ||
127
- process.env.AZURE_OPENAI_DEPLOYMENT ||
128
- process.env.AZURE_OPENAI_DEPLOYMENT_ID;
129
- if (envModel) {
130
- resolvedModelName = envModel;
131
- logger.debug(`[${functionTag}] Environment variable found for Azure`, {
132
- envVariable: process.env.AZURE_OPENAI_MODEL
133
- ? "AZURE_OPENAI_MODEL"
134
- : process.env.AZURE_OPENAI_DEPLOYMENT
135
- ? "AZURE_OPENAI_DEPLOYMENT"
136
- : "AZURE_OPENAI_DEPLOYMENT_ID",
137
- resolvedModel: envModel,
138
- });
139
- }
140
- else {
141
- logger.debug(`[${functionTag}] No Azure environment variables found (AZURE_OPENAI_MODEL, AZURE_OPENAI_DEPLOYMENT, AZURE_OPENAI_DEPLOYMENT_ID)`);
142
- }
143
- }
144
- else if (providerName.toLowerCase().includes("openai")) {
145
- const envModel = process.env.OPENAI_MODEL;
146
- if (envModel) {
147
- resolvedModelName = envModel;
148
- logger.debug(`[${functionTag}] Environment variable found for OpenAI`, {
149
- envVariable: "OPENAI_MODEL",
150
- resolvedModel: envModel,
151
- });
152
- }
153
- else {
154
- logger.debug(`[${functionTag}] No OpenAI environment variables found (OPENAI_MODEL)`);
155
- }
156
- }
157
- else if (providerName.toLowerCase().includes("anthropic")) {
158
- const envModel = process.env.ANTHROPIC_MODEL;
159
- if (envModel) {
160
- resolvedModelName = envModel;
161
- logger.debug(`[${functionTag}] Environment variable found for Anthropic`, {
162
- envVariable: "ANTHROPIC_MODEL",
163
- resolvedModel: envModel,
164
- });
165
- }
166
- else {
167
- logger.debug(`[${functionTag}] No Anthropic environment variables found (ANTHROPIC_MODEL)`);
168
- }
169
- }
170
- else if (providerName.toLowerCase().includes("google") ||
171
- providerName.toLowerCase().includes("gemini")) {
172
- const envModel = process.env.GOOGLE_AI_MODEL;
173
- if (envModel) {
174
- resolvedModelName = envModel;
175
- logger.debug(`[${functionTag}] Environment variable found for Google AI`, {
176
- envVariable: "GOOGLE_AI_MODEL",
177
- resolvedModel: envModel,
178
- });
179
- }
180
- else {
181
- logger.debug(`[${functionTag}] No Google AI environment variables found (GOOGLE_AI_MODEL)`);
182
- }
183
- }
184
- else if (providerName.toLowerCase().includes("mistral")) {
185
- const envModel = process.env.MISTRAL_MODEL;
186
- if (envModel) {
187
- resolvedModelName = envModel;
188
- logger.debug(`[${functionTag}] Environment variable found for Mistral`, {
189
- envVariable: "MISTRAL_MODEL",
190
- resolvedModel: envModel,
191
- });
192
- }
193
- else {
194
- logger.debug(`[${functionTag}] No Mistral environment variables found (MISTRAL_MODEL)`);
195
- }
196
- }
197
- else if (providerName.toLowerCase().includes("ollama")) {
198
- const envModel = process.env.OLLAMA_MODEL;
199
- if (envModel) {
200
- resolvedModelName = envModel;
201
- logger.debug(`[${functionTag}] Environment variable found for Ollama`, {
202
- envVariable: "OLLAMA_MODEL",
203
- resolvedModel: envModel,
204
- });
205
- }
206
- else {
207
- logger.debug(`[${functionTag}] No Ollama environment variables found (OLLAMA_MODEL)`);
208
- }
209
- }
210
- else {
211
- logger.debug(`[${functionTag}] Provider ${providerName} - no environment variable check implemented`);
212
- }
213
- }
214
- else {
215
- logger.debug(`[${functionTag}] Skipping environment variable check - explicit model provided: ${modelName}`);
216
- }
217
- // PRIORITY 2: Enable dynamic model resolution only if no env var found
218
- if ((!resolvedModelName || resolvedModelName === "default") &&
219
- (!modelName || modelName === "default")) {
220
- logger.debug(`[${functionTag}] Attempting dynamic model resolution`, {
221
- currentResolvedModel: resolvedModelName || "none",
222
- reason: "No environment variable found and no explicit model provided",
223
- });
224
- try {
225
- const normalizedProvider = this.normalizeProviderName(providerName);
226
- // Initialize with timeout protection - won't hang anymore
227
- if (dynamicModelProvider.needsRefresh()) {
228
- logger.debug(`[${functionTag}] Dynamic model provider needs refresh - initializing`);
229
- await this.initializeDynamicProviderWithTimeout();
230
- }
231
- const dynamicModel = dynamicModelProvider.resolveModel(normalizedProvider, modelName || undefined);
232
- if (dynamicModel) {
233
- resolvedModelName = dynamicModel.id;
234
- logger.debug(`[${functionTag}] Resolved dynamic model`, {
235
- provider: normalizedProvider,
236
- requestedModel: modelName || "default",
237
- resolvedModel: resolvedModelName,
238
- displayName: dynamicModel.displayName,
239
- pricing: dynamicModel.pricing.input,
240
- });
241
- }
242
- else {
243
- logger.debug(`[${functionTag}] Dynamic model resolution returned null`, {
244
- provider: normalizedProvider,
245
- requestedModel: modelName || "default",
246
- });
247
- }
248
- }
249
- catch (resolveError) {
250
- logger.debug(`[${functionTag}] Dynamic model resolution failed, using static fallback`, {
251
- error: resolveError instanceof Error
252
- ? resolveError.message
253
- : String(resolveError),
254
- });
255
- // Continue with static model name - no functionality loss
256
- }
257
- }
258
- else {
259
- logger.debug(`[${functionTag}] Skipping dynamic model resolution`, {
260
- resolvedModelName: resolvedModelName || "none",
261
- reason: "Model already resolved from environment variables or explicit parameter",
262
- });
263
- }
264
- // CRITICAL FIX: Initialize providers before using them
265
- await withTimeout(ProviderRegistry.registerAllProviders(), 30_000, new Error("Provider registration timed out"));
266
- // PURE FACTORY PATTERN: No switch statements - use ProviderFactory exclusively
267
- const normalizedName = this.normalizeProviderName(providerName);
268
- const finalModelName = resolvedModelName === "default" || resolvedModelName === null
269
- ? undefined
270
- : resolvedModelName;
271
- logger.debug(`[${functionTag}] Final provider configuration`, {
272
- originalProviderName: providerName,
273
- normalizedProviderName: normalizedName,
274
- originalModelName: modelName || "not provided",
275
- resolvedModelName: resolvedModelName || "not resolved",
276
- finalModelName: finalModelName || "using provider default",
277
- });
278
- // Create provider with enhanced SDK and region support
279
- const provider = await withTimeout(ProviderFactory.createProvider(normalizedName, finalModelName, sdk, region), 30_000, new Error(`Provider creation timed out for ${normalizedName}`));
227
+ let resolvedModelName = this.resolveModelFromEnvironment(providerName, modelName, functionTag);
228
+ resolvedModelName = await this.resolveDynamicModelName(providerName, modelName, resolvedModelName, functionTag);
229
+ const { normalizedName, finalModelName, provider } = await this.createResolvedProvider(providerName, resolvedModelName, sdk, region, functionTag);
280
230
  // Summary logging in format expected by debugging tools
281
231
  logger.debug(`[AIProviderFactory] Provider creation completed { providerName: '${normalizedName}', modelName: '${finalModelName}' }`);
282
232
  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
  */