@juspay/neurolink 9.42.0 → 9.43.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.
Files changed (116) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/auth/anthropicOAuth.js +12 -0
  3. package/dist/browser/neurolink.min.js +335 -334
  4. package/dist/cli/commands/mcp.d.ts +6 -0
  5. package/dist/cli/commands/mcp.js +200 -184
  6. package/dist/cli/commands/proxy.js +560 -518
  7. package/dist/core/baseProvider.d.ts +6 -1
  8. package/dist/core/baseProvider.js +219 -232
  9. package/dist/core/factory.d.ts +3 -0
  10. package/dist/core/factory.js +140 -190
  11. package/dist/core/modules/ToolsManager.d.ts +1 -0
  12. package/dist/core/modules/ToolsManager.js +40 -42
  13. package/dist/core/toolEvents.d.ts +3 -0
  14. package/dist/core/toolEvents.js +7 -0
  15. package/dist/evaluation/pipeline/evaluationPipeline.js +5 -2
  16. package/dist/evaluation/scorers/scorerRegistry.d.ts +3 -0
  17. package/dist/evaluation/scorers/scorerRegistry.js +356 -284
  18. package/dist/lib/auth/anthropicOAuth.js +12 -0
  19. package/dist/lib/core/baseProvider.d.ts +6 -1
  20. package/dist/lib/core/baseProvider.js +219 -232
  21. package/dist/lib/core/factory.d.ts +3 -0
  22. package/dist/lib/core/factory.js +140 -190
  23. package/dist/lib/core/modules/ToolsManager.d.ts +1 -0
  24. package/dist/lib/core/modules/ToolsManager.js +40 -42
  25. package/dist/lib/core/toolEvents.d.ts +3 -0
  26. package/dist/lib/core/toolEvents.js +8 -0
  27. package/dist/lib/evaluation/pipeline/evaluationPipeline.js +5 -2
  28. package/dist/lib/evaluation/scorers/scorerRegistry.d.ts +3 -0
  29. package/dist/lib/evaluation/scorers/scorerRegistry.js +356 -284
  30. package/dist/lib/mcp/toolRegistry.d.ts +2 -0
  31. package/dist/lib/mcp/toolRegistry.js +32 -31
  32. package/dist/lib/neurolink.d.ts +38 -0
  33. package/dist/lib/neurolink.js +1890 -1707
  34. package/dist/lib/providers/googleAiStudio.js +0 -5
  35. package/dist/lib/providers/googleNativeGemini3.d.ts +4 -0
  36. package/dist/lib/providers/googleNativeGemini3.js +39 -1
  37. package/dist/lib/providers/googleVertex.d.ts +10 -0
  38. package/dist/lib/providers/googleVertex.js +445 -445
  39. package/dist/lib/providers/litellm.d.ts +1 -0
  40. package/dist/lib/providers/litellm.js +73 -64
  41. package/dist/lib/providers/ollama.js +17 -4
  42. package/dist/lib/providers/openAI.d.ts +2 -0
  43. package/dist/lib/providers/openAI.js +139 -140
  44. package/dist/lib/proxy/claudeFormat.js +14 -5
  45. package/dist/lib/proxy/oauthFetch.js +298 -318
  46. package/dist/lib/proxy/proxyConfig.js +3 -1
  47. package/dist/lib/proxy/proxyFetch.js +250 -222
  48. package/dist/lib/proxy/proxyHealth.d.ts +17 -0
  49. package/dist/lib/proxy/proxyHealth.js +55 -0
  50. package/dist/lib/proxy/requestLogger.js +140 -48
  51. package/dist/lib/proxy/routingPolicy.d.ts +33 -0
  52. package/dist/lib/proxy/routingPolicy.js +255 -0
  53. package/dist/lib/proxy/snapshotPersistence.d.ts +2 -0
  54. package/dist/lib/proxy/snapshotPersistence.js +41 -0
  55. package/dist/lib/proxy/sseInterceptor.js +36 -11
  56. package/dist/lib/server/routes/claudeProxyRoutes.d.ts +2 -1
  57. package/dist/lib/server/routes/claudeProxyRoutes.js +2916 -2377
  58. package/dist/lib/services/server/ai/observability/instrumentation.js +194 -218
  59. package/dist/lib/tasks/backends/bullmqBackend.js +24 -18
  60. package/dist/lib/tasks/store/redisTaskStore.js +42 -17
  61. package/dist/lib/tasks/taskManager.d.ts +2 -0
  62. package/dist/lib/tasks/taskManager.js +100 -5
  63. package/dist/lib/telemetry/telemetryService.js +9 -5
  64. package/dist/lib/types/cli.d.ts +4 -0
  65. package/dist/lib/types/proxyTypes.d.ts +211 -1
  66. package/dist/lib/types/tools.d.ts +18 -0
  67. package/dist/lib/utils/providerHealth.d.ts +1 -0
  68. package/dist/lib/utils/providerHealth.js +46 -31
  69. package/dist/lib/utils/providerUtils.js +11 -22
  70. package/dist/lib/utils/schemaConversion.d.ts +1 -0
  71. package/dist/lib/utils/schemaConversion.js +3 -0
  72. package/dist/mcp/toolRegistry.d.ts +2 -0
  73. package/dist/mcp/toolRegistry.js +32 -31
  74. package/dist/neurolink.d.ts +38 -0
  75. package/dist/neurolink.js +1890 -1707
  76. package/dist/providers/googleAiStudio.js +0 -5
  77. package/dist/providers/googleNativeGemini3.d.ts +4 -0
  78. package/dist/providers/googleNativeGemini3.js +39 -1
  79. package/dist/providers/googleVertex.d.ts +10 -0
  80. package/dist/providers/googleVertex.js +445 -445
  81. package/dist/providers/litellm.d.ts +1 -0
  82. package/dist/providers/litellm.js +73 -64
  83. package/dist/providers/ollama.js +17 -4
  84. package/dist/providers/openAI.d.ts +2 -0
  85. package/dist/providers/openAI.js +139 -140
  86. package/dist/proxy/claudeFormat.js +14 -5
  87. package/dist/proxy/oauthFetch.js +298 -318
  88. package/dist/proxy/proxyConfig.js +3 -1
  89. package/dist/proxy/proxyFetch.js +250 -222
  90. package/dist/proxy/proxyHealth.d.ts +17 -0
  91. package/dist/proxy/proxyHealth.js +54 -0
  92. package/dist/proxy/requestLogger.js +140 -48
  93. package/dist/proxy/routingPolicy.d.ts +33 -0
  94. package/dist/proxy/routingPolicy.js +254 -0
  95. package/dist/proxy/snapshotPersistence.d.ts +2 -0
  96. package/dist/proxy/snapshotPersistence.js +40 -0
  97. package/dist/proxy/sseInterceptor.js +36 -11
  98. package/dist/server/routes/claudeProxyRoutes.d.ts +2 -1
  99. package/dist/server/routes/claudeProxyRoutes.js +2916 -2377
  100. package/dist/services/server/ai/observability/instrumentation.js +194 -218
  101. package/dist/tasks/backends/bullmqBackend.js +24 -18
  102. package/dist/tasks/store/redisTaskStore.js +42 -17
  103. package/dist/tasks/taskManager.d.ts +2 -0
  104. package/dist/tasks/taskManager.js +100 -5
  105. package/dist/telemetry/telemetryService.js +9 -5
  106. package/dist/types/cli.d.ts +4 -0
  107. package/dist/types/proxyTypes.d.ts +211 -1
  108. package/dist/types/tools.d.ts +18 -0
  109. package/dist/utils/providerHealth.d.ts +1 -0
  110. package/dist/utils/providerHealth.js +46 -31
  111. package/dist/utils/providerUtils.js +12 -22
  112. package/dist/utils/schemaConversion.d.ts +1 -0
  113. package/dist/utils/schemaConversion.js +3 -0
  114. package/package.json +3 -2
  115. package/scripts/observability/check-proxy-telemetry.mjs +1 -1
  116. package/scripts/observability/manage-local-openobserve.sh +36 -5
@@ -7,7 +7,7 @@ import { ProviderRegistry } from "../factories/providerRegistry.js";
7
7
  import { getBestProvider } from "../utils/providerUtils.js";
8
8
  import { logger } from "../utils/logger.js";
9
9
  import { dynamicModelProvider } from "./dynamicModels.js";
10
- import { withTimeout } from "../utils/errorHandling.js";
10
+ import { withTimeout, ErrorFactory } from "../utils/errorHandling.js";
11
11
  import { AIProviderName } from "../constants/enums.js";
12
12
  const componentIdentifier = "aiProviderFactory";
13
13
  const factoryTracer = tracers.factory;
@@ -35,7 +35,7 @@ export class AIProviderFactory {
35
35
  const functionTag = "AIProviderFactory.initializeDynamicProviderWithTimeout";
36
36
  const INIT_TIMEOUT = 10000; // 10 seconds total timeout for initialization
37
37
  try {
38
- await withTimeout(dynamicModelProvider.initialize(), INIT_TIMEOUT, new Error("Dynamic provider initialization timeout"));
38
+ await withTimeout(dynamicModelProvider.initialize(), INIT_TIMEOUT, ErrorFactory.toolTimeout("dynamic-provider-init", INIT_TIMEOUT));
39
39
  logger.debug(`[${functionTag}] Dynamic model provider initialized successfully`);
40
40
  }
41
41
  catch (error) {
@@ -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, ErrorFactory.toolTimeout("provider-registration", 30_000));
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, ErrorFactory.toolTimeout(`provider-creation:${normalizedName}`, 30_000));
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}`);
@@ -35,6 +35,7 @@ export declare class ToolsManager {
35
35
  * Set session context for MCP tools
36
36
  */
37
37
  setSessionContext(sessionId?: string, userId?: string): void;
38
+ private emitToolEvent;
38
39
  /**
39
40
  * Set up tool executor for a provider to enable actual tool execution
40
41
  * @param sdk - The NeuroLinkSDK instance for tool execution
@@ -16,6 +16,7 @@
16
16
  */
17
17
  import { tool as createAISDKTool, jsonSchema } from "ai";
18
18
  import { z } from "zod";
19
+ import { createToolEventPayload } from "../toolEvents.js";
19
20
  import { tracers, ATTR, withSpan } from "../../telemetry/index.js";
20
21
  import { SpanStatusCode } from "@opentelemetry/api";
21
22
  import { logger } from "../../utils/logger.js";
@@ -50,6 +51,13 @@ export class ToolsManager {
50
51
  this.sessionId = sessionId;
51
52
  this.userId = userId;
52
53
  }
54
+ emitToolEvent(eventName, toolName, payload) {
55
+ if (this.neurolink?.getEventEmitter) {
56
+ this.neurolink
57
+ .getEventEmitter()
58
+ .emit(eventName, createToolEventPayload(toolName, payload));
59
+ }
60
+ }
53
61
  /**
54
62
  * Set up tool executor for a provider to enable actual tool execution
55
63
  * @param sdk - The NeuroLinkSDK instance for tool execution
@@ -175,27 +183,24 @@ export class ToolsManager {
175
183
  tools[toolName] = {
176
184
  ...directTool,
177
185
  execute: async (params) => {
178
- // 🔧 EMIT TOOL START EVENT - Bedrock-compatible format
179
- if (this.neurolink?.getEventEmitter) {
180
- const emitter = this.neurolink.getEventEmitter();
181
- emitter.emit("tool:start", { tool: toolName, input: params });
182
- }
186
+ const startTime = Date.now();
187
+ this.emitToolEvent("tool:start", toolName, { input: params });
183
188
  try {
184
189
  const result = await originalExecute(params);
185
- // 🔧 EMIT TOOL END EVENT - Bedrock-compatible format
186
- if (this.neurolink?.getEventEmitter) {
187
- const emitter = this.neurolink.getEventEmitter();
188
- emitter.emit("tool:end", { tool: toolName, result });
189
- }
190
+ this.emitToolEvent("tool:end", toolName, {
191
+ result,
192
+ success: true,
193
+ responseTime: Date.now() - startTime,
194
+ });
190
195
  return result;
191
196
  }
192
197
  catch (error) {
193
- // 🔧 EMIT TOOL END EVENT FOR ERROR - Bedrock-compatible format
194
- if (this.neurolink?.getEventEmitter) {
195
- const emitter = this.neurolink.getEventEmitter();
196
- const errorMsg = error instanceof Error ? error.message : String(error);
197
- emitter.emit("tool:end", { tool: toolName, error: errorMsg });
198
- }
198
+ const errorMsg = error instanceof Error ? error.message : String(error);
199
+ this.emitToolEvent("tool:end", toolName, {
200
+ error: errorMsg,
201
+ success: false,
202
+ responseTime: Date.now() - startTime,
203
+ });
199
204
  throw error;
200
205
  }
201
206
  },
@@ -443,48 +448,41 @@ export class ToolsManager {
443
448
  description: tool.description || `External MCP tool ${tool.name}`,
444
449
  inputSchema: finalSchema, // AI SDK v6 uses inputSchema (not parameters)
445
450
  execute: async (params) => {
446
- // Emit tool start event
447
- if (this.neurolink?.getEventEmitter) {
448
- const emitter = this.neurolink.getEventEmitter();
449
- emitter.emit("tool:start", { tool: tool.name, input: params });
450
- }
451
+ const startTime = Date.now();
452
+ this.emitToolEvent("tool:start", tool.name, { input: params });
451
453
  // Execute via NeuroLink's direct tool execution
452
454
  if (this.neurolink &&
453
455
  typeof this.neurolink.executeExternalMCPTool === "function") {
454
456
  try {
455
457
  const result = await this.neurolink.executeExternalMCPTool(tool.serverId || "unknown", tool.name, params);
456
- // Emit tool end event (success)
457
- if (this.neurolink?.getEventEmitter) {
458
- const emitter = this.neurolink.getEventEmitter();
459
- emitter.emit("tool:end", { tool: tool.name, result });
460
- }
458
+ this.emitToolEvent("tool:end", tool.name, {
459
+ result,
460
+ success: true,
461
+ responseTime: Date.now() - startTime,
462
+ });
461
463
  return result;
462
464
  }
463
465
  catch (mcpError) {
464
- // Emit tool end event (error)
465
- if (this.neurolink?.getEventEmitter) {
466
- const emitter = this.neurolink.getEventEmitter();
467
- const errorMsg = mcpError instanceof Error
468
- ? mcpError.message
469
- : String(mcpError);
470
- emitter.emit("tool:end", { tool: tool.name, error: errorMsg });
471
- }
466
+ const errorMsg = mcpError instanceof Error ? mcpError.message : String(mcpError);
467
+ this.emitToolEvent("tool:end", tool.name, {
468
+ error: errorMsg,
469
+ success: false,
470
+ responseTime: Date.now() - startTime,
471
+ });
472
472
  logger.error(`External MCP tool failed: ${tool.name}`, {
473
473
  serverId: tool.serverId,
474
- error: mcpError instanceof Error
475
- ? mcpError.message
476
- : String(mcpError),
474
+ error: errorMsg,
477
475
  });
478
476
  throw mcpError;
479
477
  }
480
478
  }
481
479
  else {
482
480
  const error = `Cannot execute external MCP tool: NeuroLink executeExternalMCPTool not available`;
483
- // Emit tool end event (error - no executor)
484
- if (this.neurolink?.getEventEmitter) {
485
- const emitter = this.neurolink.getEventEmitter();
486
- emitter.emit("tool:end", { tool: tool.name, error });
487
- }
481
+ this.emitToolEvent("tool:end", tool.name, {
482
+ error,
483
+ success: false,
484
+ responseTime: Date.now() - startTime,
485
+ });
488
486
  logger.error(error);
489
487
  throw new Error(error);
490
488
  }
@@ -0,0 +1,3 @@
1
+ import type { ToolEventPayload } from "../types/index.js";
2
+ export type { ToolEventPayload };
3
+ export declare function createToolEventPayload(toolName: string, payload?: Omit<ToolEventPayload, "tool" | "toolName">): ToolEventPayload;
@@ -0,0 +1,8 @@
1
+ export function createToolEventPayload(toolName, payload = {}) {
2
+ return {
3
+ ...payload,
4
+ tool: toolName,
5
+ toolName,
6
+ };
7
+ }
8
+ //# sourceMappingURL=toolEvents.js.map
@@ -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
  */