@juspay/neurolink 7.29.1 → 7.29.3

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 (234) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/cli/commands/config.d.ts +86 -86
  3. package/dist/cli/commands/mcp.js +64 -9
  4. package/dist/cli/commands/models.js +25 -21
  5. package/dist/cli/commands/ollama.js +2 -2
  6. package/dist/cli/factories/commandFactory.d.ts +9 -0
  7. package/dist/cli/factories/commandFactory.js +177 -83
  8. package/dist/cli/factories/ollamaCommandFactory.js +3 -1
  9. package/dist/cli/factories/sagemakerCommandFactory.js +3 -2
  10. package/dist/cli/index.d.ts +1 -1
  11. package/dist/cli/index.js +19 -11
  12. package/dist/cli/utils/envManager.js +5 -5
  13. package/dist/cli/utils/ollamaUtils.d.ts +12 -0
  14. package/dist/cli/utils/ollamaUtils.js +58 -42
  15. package/dist/config/configManager.js +5 -2
  16. package/dist/core/analytics.d.ts +2 -24
  17. package/dist/core/analytics.js +12 -17
  18. package/dist/core/baseProvider.d.ts +30 -1
  19. package/dist/core/baseProvider.js +180 -198
  20. package/dist/core/dynamicModels.d.ts +4 -4
  21. package/dist/core/dynamicModels.js +7 -7
  22. package/dist/core/evaluation.d.ts +9 -9
  23. package/dist/core/evaluation.js +117 -65
  24. package/dist/core/evaluationProviders.d.ts +18 -2
  25. package/dist/core/evaluationProviders.js +15 -13
  26. package/dist/core/factory.js +77 -4
  27. package/dist/core/modelConfiguration.d.ts +63 -0
  28. package/dist/core/modelConfiguration.js +354 -290
  29. package/dist/core/streamAnalytics.d.ts +10 -5
  30. package/dist/core/streamAnalytics.js +10 -10
  31. package/dist/core/types.d.ts +19 -109
  32. package/dist/core/types.js +13 -0
  33. package/dist/factories/providerFactory.js +4 -1
  34. package/dist/factories/providerRegistry.js +2 -2
  35. package/dist/index.d.ts +2 -1
  36. package/dist/lib/config/configManager.js +5 -2
  37. package/dist/lib/core/analytics.d.ts +2 -24
  38. package/dist/lib/core/analytics.js +12 -17
  39. package/dist/lib/core/baseProvider.d.ts +30 -1
  40. package/dist/lib/core/baseProvider.js +180 -198
  41. package/dist/lib/core/dynamicModels.js +7 -7
  42. package/dist/lib/core/evaluation.d.ts +9 -9
  43. package/dist/lib/core/evaluation.js +117 -65
  44. package/dist/lib/core/evaluationProviders.d.ts +18 -2
  45. package/dist/lib/core/evaluationProviders.js +15 -13
  46. package/dist/lib/core/factory.js +77 -4
  47. package/dist/lib/core/modelConfiguration.d.ts +63 -0
  48. package/dist/lib/core/modelConfiguration.js +354 -290
  49. package/dist/lib/core/streamAnalytics.d.ts +10 -5
  50. package/dist/lib/core/streamAnalytics.js +10 -10
  51. package/dist/lib/core/types.d.ts +19 -109
  52. package/dist/lib/core/types.js +13 -0
  53. package/dist/lib/factories/providerFactory.js +4 -1
  54. package/dist/lib/factories/providerRegistry.js +2 -2
  55. package/dist/lib/index.d.ts +2 -1
  56. package/dist/lib/mcp/externalServerManager.js +14 -6
  57. package/dist/lib/mcp/factory.js +1 -1
  58. package/dist/lib/mcp/flexibleToolValidator.d.ts +50 -0
  59. package/dist/lib/mcp/flexibleToolValidator.js +161 -0
  60. package/dist/lib/mcp/index.d.ts +1 -1
  61. package/dist/lib/mcp/index.js +1 -1
  62. package/dist/lib/mcp/mcpCircuitBreaker.js +5 -1
  63. package/dist/lib/mcp/mcpClientFactory.js +3 -0
  64. package/dist/lib/mcp/registry.d.ts +3 -3
  65. package/dist/lib/mcp/registry.js +3 -3
  66. package/dist/lib/mcp/servers/aiProviders/aiAnalysisTools.js +5 -5
  67. package/dist/lib/mcp/servers/aiProviders/aiWorkflowTools.js +6 -6
  68. package/dist/lib/mcp/servers/utilities/utilityServer.js +1 -1
  69. package/dist/lib/mcp/toolDiscoveryService.js +8 -2
  70. package/dist/lib/mcp/toolRegistry.d.ts +2 -2
  71. package/dist/lib/mcp/toolRegistry.js +29 -54
  72. package/dist/lib/middleware/builtin/analytics.js +4 -4
  73. package/dist/lib/middleware/builtin/guardrails.js +2 -2
  74. package/dist/lib/middleware/registry.js +11 -2
  75. package/dist/lib/models/modelRegistry.d.ts +1 -1
  76. package/dist/lib/models/modelRegistry.js +3 -3
  77. package/dist/lib/models/modelResolver.d.ts +1 -1
  78. package/dist/lib/models/modelResolver.js +2 -2
  79. package/dist/lib/neurolink.d.ts +118 -0
  80. package/dist/lib/neurolink.js +814 -952
  81. package/dist/lib/providers/amazonBedrock.d.ts +47 -6
  82. package/dist/lib/providers/amazonBedrock.js +282 -23
  83. package/dist/lib/providers/amazonSagemaker.d.ts +1 -1
  84. package/dist/lib/providers/amazonSagemaker.js +12 -3
  85. package/dist/lib/providers/anthropic.d.ts +1 -1
  86. package/dist/lib/providers/anthropic.js +7 -6
  87. package/dist/lib/providers/anthropicBaseProvider.d.ts +1 -1
  88. package/dist/lib/providers/anthropicBaseProvider.js +4 -3
  89. package/dist/lib/providers/aws/credentialProvider.d.ts +58 -0
  90. package/dist/lib/providers/aws/credentialProvider.js +267 -0
  91. package/dist/lib/providers/aws/credentialTester.d.ts +49 -0
  92. package/dist/lib/providers/aws/credentialTester.js +394 -0
  93. package/dist/lib/providers/azureOpenai.d.ts +1 -1
  94. package/dist/lib/providers/azureOpenai.js +1 -1
  95. package/dist/lib/providers/googleAiStudio.d.ts +1 -1
  96. package/dist/lib/providers/googleAiStudio.js +2 -2
  97. package/dist/lib/providers/googleVertex.d.ts +40 -0
  98. package/dist/lib/providers/googleVertex.js +330 -274
  99. package/dist/lib/providers/huggingFace.js +1 -1
  100. package/dist/lib/providers/mistral.d.ts +1 -1
  101. package/dist/lib/providers/mistral.js +2 -2
  102. package/dist/lib/providers/ollama.d.ts +4 -0
  103. package/dist/lib/providers/ollama.js +38 -18
  104. package/dist/lib/providers/openAI.d.ts +1 -1
  105. package/dist/lib/providers/openAI.js +2 -2
  106. package/dist/lib/providers/sagemaker/adaptive-semaphore.js +7 -4
  107. package/dist/lib/providers/sagemaker/client.js +13 -3
  108. package/dist/lib/providers/sagemaker/config.js +5 -1
  109. package/dist/lib/providers/sagemaker/detection.js +19 -9
  110. package/dist/lib/providers/sagemaker/errors.d.ts +8 -1
  111. package/dist/lib/providers/sagemaker/errors.js +103 -20
  112. package/dist/lib/providers/sagemaker/language-model.d.ts +3 -3
  113. package/dist/lib/providers/sagemaker/language-model.js +4 -4
  114. package/dist/lib/providers/sagemaker/parsers.js +14 -6
  115. package/dist/lib/providers/sagemaker/streaming.js +14 -3
  116. package/dist/lib/providers/sagemaker/types.d.ts +1 -1
  117. package/dist/lib/proxy/awsProxyIntegration.d.ts +23 -0
  118. package/dist/lib/proxy/awsProxyIntegration.js +285 -0
  119. package/dist/lib/proxy/proxyFetch.d.ts +9 -5
  120. package/dist/lib/proxy/proxyFetch.js +232 -98
  121. package/dist/lib/proxy/utils/noProxyUtils.d.ts +39 -0
  122. package/dist/lib/proxy/utils/noProxyUtils.js +149 -0
  123. package/dist/lib/sdk/toolRegistration.d.ts +1 -1
  124. package/dist/lib/types/cli.d.ts +80 -8
  125. package/dist/lib/types/contextTypes.js +2 -2
  126. package/dist/lib/types/generateTypes.d.ts +4 -6
  127. package/dist/lib/types/providers.d.ts +124 -19
  128. package/dist/lib/types/providers.js +6 -6
  129. package/dist/lib/types/streamTypes.d.ts +4 -6
  130. package/dist/lib/types/typeAliases.d.ts +1 -1
  131. package/dist/lib/utils/analyticsUtils.d.ts +33 -0
  132. package/dist/lib/utils/analyticsUtils.js +76 -0
  133. package/dist/lib/utils/errorHandling.js +4 -1
  134. package/dist/lib/utils/evaluationUtils.d.ts +27 -0
  135. package/dist/lib/utils/evaluationUtils.js +131 -0
  136. package/dist/lib/utils/optionsUtils.js +10 -1
  137. package/dist/lib/utils/performance.d.ts +1 -1
  138. package/dist/lib/utils/performance.js +15 -3
  139. package/dist/lib/utils/providerConfig.d.ts +1 -0
  140. package/dist/lib/utils/providerConfig.js +2 -1
  141. package/dist/lib/utils/providerHealth.d.ts +48 -0
  142. package/dist/lib/utils/providerHealth.js +221 -158
  143. package/dist/lib/utils/providerUtils.js +2 -2
  144. package/dist/lib/utils/timeout.js +8 -3
  145. package/dist/mcp/externalServerManager.js +14 -6
  146. package/dist/mcp/factory.js +1 -1
  147. package/dist/mcp/flexibleToolValidator.d.ts +50 -0
  148. package/dist/mcp/flexibleToolValidator.js +161 -0
  149. package/dist/mcp/index.d.ts +1 -1
  150. package/dist/mcp/index.js +1 -1
  151. package/dist/mcp/mcpCircuitBreaker.js +5 -1
  152. package/dist/mcp/mcpClientFactory.js +3 -0
  153. package/dist/mcp/registry.d.ts +3 -3
  154. package/dist/mcp/registry.js +3 -3
  155. package/dist/mcp/servers/aiProviders/aiAnalysisTools.js +5 -5
  156. package/dist/mcp/servers/aiProviders/aiWorkflowTools.js +6 -6
  157. package/dist/mcp/servers/utilities/utilityServer.js +1 -1
  158. package/dist/mcp/toolDiscoveryService.js +8 -2
  159. package/dist/mcp/toolRegistry.d.ts +2 -2
  160. package/dist/mcp/toolRegistry.js +29 -54
  161. package/dist/middleware/builtin/analytics.js +4 -4
  162. package/dist/middleware/builtin/guardrails.js +2 -2
  163. package/dist/middleware/registry.js +11 -2
  164. package/dist/models/modelRegistry.d.ts +1 -1
  165. package/dist/models/modelRegistry.js +3 -3
  166. package/dist/models/modelResolver.d.ts +1 -1
  167. package/dist/models/modelResolver.js +2 -2
  168. package/dist/neurolink.d.ts +118 -0
  169. package/dist/neurolink.js +814 -952
  170. package/dist/providers/amazonBedrock.d.ts +47 -6
  171. package/dist/providers/amazonBedrock.js +282 -23
  172. package/dist/providers/amazonSagemaker.d.ts +1 -1
  173. package/dist/providers/amazonSagemaker.js +12 -3
  174. package/dist/providers/anthropic.d.ts +1 -1
  175. package/dist/providers/anthropic.js +7 -6
  176. package/dist/providers/anthropicBaseProvider.d.ts +1 -1
  177. package/dist/providers/anthropicBaseProvider.js +4 -3
  178. package/dist/providers/aws/credentialProvider.d.ts +58 -0
  179. package/dist/providers/aws/credentialProvider.js +267 -0
  180. package/dist/providers/aws/credentialTester.d.ts +49 -0
  181. package/dist/providers/aws/credentialTester.js +394 -0
  182. package/dist/providers/azureOpenai.d.ts +1 -1
  183. package/dist/providers/azureOpenai.js +1 -1
  184. package/dist/providers/googleAiStudio.d.ts +1 -1
  185. package/dist/providers/googleAiStudio.js +2 -2
  186. package/dist/providers/googleVertex.d.ts +40 -0
  187. package/dist/providers/googleVertex.js +330 -274
  188. package/dist/providers/huggingFace.js +1 -1
  189. package/dist/providers/mistral.d.ts +1 -1
  190. package/dist/providers/mistral.js +2 -2
  191. package/dist/providers/ollama.d.ts +4 -0
  192. package/dist/providers/ollama.js +38 -18
  193. package/dist/providers/openAI.d.ts +1 -1
  194. package/dist/providers/openAI.js +2 -2
  195. package/dist/providers/sagemaker/adaptive-semaphore.js +7 -4
  196. package/dist/providers/sagemaker/client.js +13 -3
  197. package/dist/providers/sagemaker/config.js +5 -1
  198. package/dist/providers/sagemaker/detection.js +19 -9
  199. package/dist/providers/sagemaker/errors.d.ts +8 -1
  200. package/dist/providers/sagemaker/errors.js +103 -20
  201. package/dist/providers/sagemaker/language-model.d.ts +3 -3
  202. package/dist/providers/sagemaker/language-model.js +4 -4
  203. package/dist/providers/sagemaker/parsers.js +14 -6
  204. package/dist/providers/sagemaker/streaming.js +14 -3
  205. package/dist/providers/sagemaker/types.d.ts +1 -1
  206. package/dist/proxy/awsProxyIntegration.d.ts +23 -0
  207. package/dist/proxy/awsProxyIntegration.js +285 -0
  208. package/dist/proxy/proxyFetch.d.ts +9 -5
  209. package/dist/proxy/proxyFetch.js +232 -98
  210. package/dist/proxy/utils/noProxyUtils.d.ts +39 -0
  211. package/dist/proxy/utils/noProxyUtils.js +149 -0
  212. package/dist/sdk/toolRegistration.d.ts +1 -1
  213. package/dist/types/cli.d.ts +80 -8
  214. package/dist/types/contextTypes.js +2 -2
  215. package/dist/types/generateTypes.d.ts +4 -6
  216. package/dist/types/providers.d.ts +124 -19
  217. package/dist/types/providers.js +6 -6
  218. package/dist/types/streamTypes.d.ts +4 -6
  219. package/dist/types/typeAliases.d.ts +1 -1
  220. package/dist/utils/analyticsUtils.d.ts +33 -0
  221. package/dist/utils/analyticsUtils.js +76 -0
  222. package/dist/utils/errorHandling.js +4 -1
  223. package/dist/utils/evaluationUtils.d.ts +27 -0
  224. package/dist/utils/evaluationUtils.js +131 -0
  225. package/dist/utils/optionsUtils.js +10 -1
  226. package/dist/utils/performance.d.ts +1 -1
  227. package/dist/utils/performance.js +15 -3
  228. package/dist/utils/providerConfig.d.ts +1 -0
  229. package/dist/utils/providerConfig.js +2 -1
  230. package/dist/utils/providerHealth.d.ts +48 -0
  231. package/dist/utils/providerHealth.js +221 -158
  232. package/dist/utils/providerUtils.js +2 -2
  233. package/dist/utils/timeout.js +8 -3
  234. package/package.json +5 -1
@@ -1,4 +1,3 @@
1
- import { z } from "zod";
2
1
  import { MiddlewareFactory } from "../middleware/factory.js";
3
2
  import { logger } from "../utils/logger.js";
4
3
  import { DEFAULT_MAX_STEPS, STEP_LIMITS } from "../core/constants.js";
@@ -320,9 +319,9 @@ export class BaseProvider {
320
319
  const enhancedResult = {
321
320
  content: result.text,
322
321
  usage: {
323
- inputTokens: result.usage?.promptTokens || 0,
324
- outputTokens: result.usage?.completionTokens || 0,
325
- totalTokens: result.usage?.totalTokens || 0,
322
+ input: result.usage?.promptTokens || 0,
323
+ output: result.usage?.completionTokens || 0,
324
+ total: result.usage?.totalTokens || 0,
326
325
  },
327
326
  provider: this.providerName,
328
327
  model: this.modelName,
@@ -389,9 +388,9 @@ export class BaseProvider {
389
388
  provider: result.provider || this.providerName,
390
389
  model: result.model || this.modelName,
391
390
  usage: result.usage || {
392
- promptTokens: 0,
393
- completionTokens: 0,
394
- totalTokens: 0,
391
+ input: 0,
392
+ output: 0,
393
+ total: 0,
395
394
  },
396
395
  responseTime: 0, // BaseProvider doesn't track response time directly
397
396
  toolsUsed: result.toolsUsed || [],
@@ -483,211 +482,152 @@ export class BaseProvider {
483
482
  // TOOL MANAGEMENT
484
483
  // ===================
485
484
  /**
486
- * Get all available tools - direct tools are ALWAYS available
487
- * MCP tools are added when available (without blocking)
485
+ * Check if a schema is a Zod schema
488
486
  */
489
- async getAllTools() {
490
- const tools = {
491
- ...this.directTools, // Always include direct tools
492
- };
493
- logger.debug(`[BaseProvider] getAllTools called for ${this.providerName}`, {
494
- neurolinkAvailable: !!this.neurolink,
495
- neurolinkType: typeof this.neurolink,
496
- directToolsCount: getKeyCount(this.directTools),
497
- });
498
- logger.debug(`[BaseProvider] Direct tools: ${getKeysAsString(this.directTools)}`);
499
- // Add custom tools from setupToolExecutor if available
500
- if (this.customTools && this.customTools.size > 0) {
501
- logger.debug(`[BaseProvider] Loading ${this.customTools.size} custom tools from setupToolExecutor`);
502
- for (const [toolName, toolDef] of this.customTools.entries()) {
503
- logger.debug(`[BaseProvider] Processing custom tool: ${toolName}`, {
504
- toolDef: typeof toolDef,
505
- hasExecute: toolDef && typeof toolDef === "object" && "execute" in toolDef,
506
- hasName: toolDef && typeof toolDef === "object" && "name" in toolDef,
507
- });
508
- if (toolDef &&
509
- typeof toolDef === "object" &&
510
- "execute" in toolDef &&
511
- typeof toolDef.execute === "function") {
512
- try {
513
- const { tool: createAISDKTool } = await import("ai");
514
- const typedToolDef = toolDef;
515
- tools[toolName] = createAISDKTool({
516
- description: typedToolDef.description || `Custom tool ${toolName}`,
517
- parameters: z.object({}), // Use empty schema for custom tools
518
- execute: async (params) => {
519
- logger.debug(`[BaseProvider] Executing custom tool: ${toolName}`, { params });
520
- try {
521
- // Use the tool executor if available (from setupToolExecutor)
522
- let result;
523
- if (this.toolExecutor) {
524
- result = await this.toolExecutor(toolName, params);
525
- }
526
- else {
527
- result = await typedToolDef.execute(params);
528
- }
529
- // Log successful execution
530
- logger.debug(`[BaseProvider] Tool execution successful: ${toolName}`, {
531
- resultType: typeof result,
532
- hasResult: result !== null && result !== undefined,
533
- toolName,
534
- });
535
- return result;
536
- }
537
- catch (error) {
538
- logger.warn(`[BaseProvider] Tool execution failed: ${toolName}`, {
539
- error: error instanceof Error ? error.message : String(error),
540
- params,
541
- toolName,
542
- });
543
- // GENERIC ERROR HANDLING FOR ALL MCP TOOLS:
544
- // Return a generic error object that works with any MCP server
545
- // The AI can interpret this and try different approaches
546
- return {
547
- _neurolinkToolError: true,
548
- toolName: toolName,
549
- error: error instanceof Error ? error.message : String(error),
550
- timestamp: new Date().toISOString(),
551
- params: params,
552
- // Keep it simple - just indicate an error occurred
553
- message: `Error calling ${toolName}: ${error instanceof Error ? error.message : String(error)}`,
554
- };
555
- }
556
- },
557
- });
558
- logger.debug(`[BaseProvider] Successfully added custom tool: ${toolName}`);
559
- }
560
- catch (error) {
561
- logger.error(`[BaseProvider] Failed to add custom tool: ${toolName}`, error);
562
- }
563
- }
564
- else {
565
- logger.warn(`[BaseProvider] Invalid custom tool format: ${toolName}`, {
566
- toolDef: typeof toolDef,
567
- hasExecute: toolDef && typeof toolDef === "object" && "execute" in toolDef,
568
- executeType: toolDef && typeof toolDef === "object" && "execute" in toolDef
569
- ? typeof toolDef.execute
570
- : "N/A",
571
- });
572
- }
487
+ isZodSchema(schema) {
488
+ return (typeof schema === "object" &&
489
+ schema !== null &&
490
+ // Most Zod schemas have an internal _def and a parse method
491
+ typeof schema.parse === "function");
492
+ }
493
+ /**
494
+ * Convert tool execution result from MCP format to standard format
495
+ */
496
+ async convertToolResult(result) {
497
+ // Handle MCP-style results
498
+ if (result && typeof result === "object" && "success" in result) {
499
+ const mcpResult = result;
500
+ if (mcpResult.success) {
501
+ return mcpResult.data;
502
+ }
503
+ else {
504
+ const errorMsg = typeof mcpResult.error === "string"
505
+ ? mcpResult.error
506
+ : "Tool execution failed";
507
+ throw new Error(errorMsg);
573
508
  }
574
509
  }
575
- // Add custom tools from NeuroLink if available
576
- logger.debug(`[BaseProvider] Checking NeuroLink: ${!!this.neurolink}, has getInMemoryServers: ${this.neurolink && typeof this.neurolink.getInMemoryServers}`);
577
- if (this.neurolink &&
578
- typeof this.neurolink.getInMemoryServers === "function") {
579
- logger.debug(`[BaseProvider] NeuroLink check passed, loading custom tools`);
580
- try {
581
- const inMemoryServers = this.neurolink.getInMemoryServers();
582
- logger.debug(`[BaseProvider] Got servers:`, inMemoryServers.size);
583
- logger.debug(`[BaseProvider] Loading custom tools from SDK, found ${inMemoryServers.size} servers`);
584
- if (inMemoryServers && inMemoryServers.size > 0) {
585
- // Convert in-memory server tools to AI SDK format
586
- for (const [_serverId, serverConfig] of inMemoryServers) {
587
- if (serverConfig && serverConfig.tools) {
588
- // Handle tools array from MCPServerInfo
589
- const toolEntries = serverConfig.tools.map((tool) => [
590
- tool.name,
591
- tool,
592
- ]);
593
- for (const [toolName, toolInfo] of toolEntries) {
594
- if (toolInfo && typeof toolInfo.execute === "function") {
595
- logger.debug(`[BaseProvider] Converting custom tool: ${toolName}`);
596
- try {
597
- // Convert to AI SDK tool format
598
- const { tool: createAISDKTool } = await import("ai");
599
- // Validate optional schemas if present (accept Zod or plain JSON schema objects)
600
- const isZodSchema = (s) => typeof s === "object" &&
601
- s !== null &&
602
- // Most Zod schemas have an internal _def and a parse method
603
- typeof s.parse === "function";
604
- tools[toolName] = createAISDKTool({
605
- description: toolInfo.description || `Tool ${toolName}`,
606
- parameters: isZodSchema(toolInfo.parameters)
607
- ? toolInfo.parameters
608
- : z.object({}),
609
- execute: async (params) => {
610
- const result = await toolInfo.execute(params);
611
- // Handle MCP-style results
612
- if (result &&
613
- typeof result === "object" &&
614
- "success" in result) {
615
- if (result.success) {
616
- return result.data;
617
- }
618
- else {
619
- const errorMsg = typeof result.error === "string"
620
- ? result.error
621
- : "Tool execution failed";
622
- throw new Error(errorMsg);
623
- }
624
- }
625
- return result;
626
- },
627
- });
628
- }
629
- catch (toolCreationError) {
630
- logger.error(`Failed to create tool: ${toolName}`, toolCreationError);
631
- }
632
- }
633
- }
634
- }
635
- }
510
+ return result;
511
+ }
512
+ /**
513
+ * Create a custom tool from tool definition
514
+ */
515
+ async createCustomToolFromDefinition(toolName, toolInfo) {
516
+ try {
517
+ logger.debug(`[BaseProvider] Converting custom tool: ${toolName}`);
518
+ // Convert to AI SDK tool format
519
+ const { tool: createAISDKTool } = await import("ai");
520
+ const { z } = await import("zod");
521
+ return createAISDKTool({
522
+ description: toolInfo.description || `Tool ${toolName}`,
523
+ parameters: this.isZodSchema(toolInfo.parameters)
524
+ ? toolInfo.parameters
525
+ : z.object({}),
526
+ execute: async (params) => {
527
+ const result = await toolInfo.execute(params);
528
+ return await this.convertToolResult(result);
529
+ },
530
+ });
531
+ }
532
+ catch (toolCreationError) {
533
+ logger.error(`Failed to create tool: ${toolName}`, toolCreationError);
534
+ return null;
535
+ }
536
+ }
537
+ /**
538
+ * Process custom tools from setupToolExecutor
539
+ */
540
+ async processCustomTools(tools) {
541
+ if (!this.customTools || this.customTools.size === 0) {
542
+ return;
543
+ }
544
+ logger.debug(`[BaseProvider] Loading ${this.customTools.size} custom tools from setupToolExecutor`);
545
+ for (const [toolName, toolDef] of this.customTools.entries()) {
546
+ logger.debug(`[BaseProvider] Processing custom tool: ${toolName}`, {
547
+ toolDef: typeof toolDef,
548
+ hasExecute: toolDef && typeof toolDef === "object" && "execute" in toolDef,
549
+ hasName: toolDef && typeof toolDef === "object" && "name" in toolDef,
550
+ });
551
+ // Validate tool definition has required execute function
552
+ const toolInfo = toolDef ||
553
+ {};
554
+ if (toolInfo && typeof toolInfo.execute === "function") {
555
+ const tool = await this.createCustomToolFromDefinition(toolName, toolInfo);
556
+ if (tool) {
557
+ tools[toolName] = tool;
636
558
  }
637
559
  }
638
- catch (error) {
639
- logger.debug(`Failed to load custom tools for ${this.providerName}:`, error);
640
- // Not an error - custom tools are optional
641
- }
642
560
  }
643
- if (this.neurolink &&
644
- typeof this.neurolink.getExternalMCPTools === "function") {
645
- try {
646
- logger.debug(`[BaseProvider] Loading external MCP tools from NeuroLink via direct tool access`);
647
- const externalTools = this.neurolink.getExternalMCPTools() || [];
648
- logger.debug(`[BaseProvider] Found ${externalTools.length} external MCP tools`);
649
- for (const tool of externalTools) {
650
- logger.debug(`[BaseProvider] Converting external MCP tool: ${tool.name}`);
651
- try {
652
- // Convert to AI SDK tool format
653
- const { tool: createAISDKTool } = await import("ai");
654
- tools[tool.name] = createAISDKTool({
655
- description: tool.description || `External MCP tool ${tool.name}`,
656
- parameters: await this.convertMCPSchemaToZod(tool.inputSchema),
657
- execute: async (params) => {
658
- logger.debug(`[BaseProvider] Executing external MCP tool: ${tool.name}`, { params });
659
- // Execute via NeuroLink's direct tool execution
660
- if (this.neurolink &&
661
- typeof this.neurolink.executeExternalMCPTool === "function") {
662
- return await this.neurolink.executeExternalMCPTool(tool.serverId || "unknown", tool.name, params);
663
- }
664
- else {
665
- throw new Error(`Cannot execute external MCP tool: NeuroLink executeExternalMCPTool not available`);
666
- }
667
- },
668
- });
669
- logger.debug(`[BaseProvider] Successfully added external MCP tool: ${tool.name}`);
561
+ logger.debug(`[BaseProvider] Custom tools processing complete`, {
562
+ customToolsProcessed: this.customTools.size,
563
+ });
564
+ }
565
+ /**
566
+ * Create an external MCP tool
567
+ */
568
+ async createExternalMCPTool(tool) {
569
+ try {
570
+ logger.debug(`[BaseProvider] Converting external MCP tool: ${tool.name}`);
571
+ // Convert to AI SDK tool format
572
+ const { tool: createAISDKTool } = await import("ai");
573
+ return createAISDKTool({
574
+ description: tool.description || `External MCP tool ${tool.name}`,
575
+ parameters: await this.convertMCPSchemaToZod(tool.inputSchema),
576
+ execute: async (params) => {
577
+ logger.debug(`[BaseProvider] Executing external MCP tool: ${tool.name}`, { params });
578
+ // Execute via NeuroLink's direct tool execution
579
+ if (this.neurolink &&
580
+ typeof this.neurolink.executeExternalMCPTool === "function") {
581
+ return await this.neurolink.executeExternalMCPTool(tool.serverId || "unknown", tool.name, params);
670
582
  }
671
- catch (toolCreationError) {
672
- logger.error(`Failed to create external MCP tool: ${tool.name}`, toolCreationError);
583
+ else {
584
+ throw new Error(`Cannot execute external MCP tool: NeuroLink executeExternalMCPTool not available`);
673
585
  }
674
- }
675
- logger.debug(`[BaseProvider] External MCP tools loading complete`, {
676
- totalToolsAdded: externalTools.length,
677
- });
678
- }
679
- catch (error) {
680
- logger.error(`[BaseProvider] Failed to load external MCP tools for ${this.providerName}:`, error);
681
- // Not an error - external tools are optional
682
- }
586
+ },
587
+ });
683
588
  }
684
- else {
589
+ catch (toolCreationError) {
590
+ logger.error(`Failed to create external MCP tool: ${tool.name}`, toolCreationError);
591
+ return null;
592
+ }
593
+ }
594
+ /**
595
+ * Process external MCP tools
596
+ */
597
+ async processExternalMCPTools(tools) {
598
+ if (!this.neurolink ||
599
+ typeof this.neurolink.getExternalMCPTools !== "function") {
685
600
  logger.debug(`[BaseProvider] No external MCP tool interface available`, {
686
601
  hasNeuroLink: !!this.neurolink,
687
602
  hasGetExternalMCPTools: this.neurolink &&
688
603
  typeof this.neurolink.getExternalMCPTools === "function",
689
604
  });
605
+ return;
606
+ }
607
+ try {
608
+ logger.debug(`[BaseProvider] Loading external MCP tools for ${this.providerName}`);
609
+ const externalTools = await this.neurolink.getExternalMCPTools();
610
+ logger.debug(`[BaseProvider] Found ${externalTools.length} external MCP tools`);
611
+ for (const tool of externalTools) {
612
+ const mcpTool = await this.createExternalMCPTool(tool);
613
+ if (mcpTool) {
614
+ tools[tool.name] = mcpTool;
615
+ logger.debug(`[BaseProvider] Successfully added external MCP tool: ${tool.name}`);
616
+ }
617
+ }
618
+ logger.debug(`[BaseProvider] External MCP tools loading complete`, {
619
+ totalToolsAdded: externalTools.length,
620
+ });
690
621
  }
622
+ catch (error) {
623
+ logger.error(`[BaseProvider] Failed to load external MCP tools for ${this.providerName}:`, error);
624
+ // Not an error - external tools are optional
625
+ }
626
+ }
627
+ /**
628
+ * Process MCP tools integration
629
+ */
630
+ async processMCPTools(tools) {
691
631
  // MCP tools loading simplified - removed functionCalling dependency
692
632
  if (!this.mcpTools) {
693
633
  // Set empty tools object - MCP tools are handled at a higher level
@@ -697,6 +637,25 @@ export class BaseProvider {
697
637
  if (this.mcpTools) {
698
638
  Object.assign(tools, this.mcpTools);
699
639
  }
640
+ }
641
+ /**
642
+ * Get all available tools - direct tools are ALWAYS available
643
+ * MCP tools are added when available (without blocking)
644
+ */
645
+ async getAllTools() {
646
+ const tools = {
647
+ ...this.directTools, // Always include direct tools
648
+ };
649
+ logger.debug(`[BaseProvider] getAllTools called for ${this.providerName}`, {
650
+ neurolinkAvailable: !!this.neurolink,
651
+ neurolinkType: typeof this.neurolink,
652
+ directToolsCount: getKeyCount(this.directTools),
653
+ });
654
+ logger.debug(`[BaseProvider] Direct tools: ${getKeysAsString(this.directTools)}`);
655
+ // Process all tool types using dedicated helper methods
656
+ await this.processCustomTools(tools);
657
+ await this.processExternalMCPTools(tools);
658
+ await this.processMCPTools(tools);
700
659
  logger.debug(`[BaseProvider] getAllTools returning tools: ${getKeysAsString(tools)}`);
701
660
  return tools;
702
661
  }
@@ -992,7 +951,30 @@ export class BaseProvider {
992
951
  }
993
952
  async createEvaluation(result, options) {
994
953
  const { evaluateResponse } = await import("../core/evaluation.js");
995
- const evaluation = await evaluateResponse(result.content, options.prompt);
954
+ const context = {
955
+ userQuery: options.prompt || options.input?.text || "Generated response",
956
+ aiResponse: result.content,
957
+ context: options.context,
958
+ primaryDomain: options.evaluationDomain,
959
+ assistantRole: "AI assistant",
960
+ conversationHistory: options.conversationHistory?.map((msg) => ({
961
+ role: msg.role,
962
+ content: msg.content,
963
+ })),
964
+ toolUsage: options.toolUsageContext
965
+ ? [
966
+ {
967
+ toolName: options.toolUsageContext,
968
+ input: {},
969
+ output: {},
970
+ executionTime: 0,
971
+ },
972
+ ]
973
+ : undefined,
974
+ expectedOutcome: options.expectedOutcome,
975
+ evaluationCriteria: options.evaluationCriteria,
976
+ };
977
+ const evaluation = await evaluateResponse(context);
996
978
  return evaluation;
997
979
  }
998
980
  validateOptions(options) {
@@ -100,12 +100,6 @@ export class DynamicModelProvider {
100
100
  // Setup timeout and abort controller
101
101
  const controller = new AbortController();
102
102
  const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
103
- // Load from URL
104
- const response = await fetch(source, {
105
- headers: {
106
- "User-Agent": "NeuroLink/1.0 (+https://github.com/juspay/neurolink)",
107
- },
108
- });
109
103
  try {
110
104
  // Add health check for localhost before attempting full request
111
105
  if (source.includes("localhost") || source.includes("127.0.0.1")) {
@@ -113,7 +107,7 @@ export class DynamicModelProvider {
113
107
  }
114
108
  const response = await fetch(source, {
115
109
  headers: {
116
- "User-Agent": "NeuroLink/1.0 (+https://github.com/sachinsharma92/neurolink)",
110
+ "User-Agent": "NeuroLink/1.0 (+https://github.com/juspay/neurolink)",
117
111
  Accept: "application/json",
118
112
  "Cache-Control": "no-cache",
119
113
  },
@@ -242,6 +236,9 @@ export class DynamicModelProvider {
242
236
  searchByCapability(capability, options = {}) {
243
237
  this.ensureInitialized();
244
238
  const results = [];
239
+ if (!this.modelRegistry) {
240
+ return results;
241
+ }
245
242
  for (const [providerName, models] of Object.entries(this.modelRegistry.models)) {
246
243
  if (options.provider && providerName !== options.provider) {
247
244
  continue;
@@ -301,6 +298,9 @@ export class DynamicModelProvider {
301
298
  getAllModels() {
302
299
  this.ensureInitialized();
303
300
  const results = [];
301
+ if (!this.modelRegistry) {
302
+ return results;
303
+ }
304
304
  for (const [providerName, models] of Object.entries(this.modelRegistry.models)) {
305
305
  for (const [modelName, modelConfig] of Object.entries(models)) {
306
306
  results.push({
@@ -1,8 +1,8 @@
1
1
  /**
2
- * NeuroLink Unified Evaluation System
2
+ * NeuroLink Evaluation System
3
3
  */
4
- import type { EvaluationData } from "./types.js";
5
- export interface UnifiedEvaluationResult extends EvaluationData {
4
+ import type { EvaluationData } from "../index.js";
5
+ export interface EvaluationResult extends EvaluationData {
6
6
  domainAlignment?: number;
7
7
  terminologyAccuracy?: number;
8
8
  toolEffectiveness?: number;
@@ -20,7 +20,7 @@ export interface UnifiedEvaluationResult extends EvaluationData {
20
20
  alertSeverity: "low" | "medium" | "high" | "none";
21
21
  reasoning: string;
22
22
  }
23
- export interface UnifiedEvaluationContext {
23
+ export interface EvaluationContext {
24
24
  userQuery: string;
25
25
  aiResponse: string;
26
26
  context?: Record<string, unknown>;
@@ -43,14 +43,14 @@ export interface UnifiedEvaluationContext {
43
43
  /**
44
44
  * Get default evaluation when evaluation fails
45
45
  */
46
- declare function getDefaultUnifiedEvaluation(reason: string, evaluationTime: number, context: UnifiedEvaluationContext): UnifiedEvaluationResult;
46
+ declare function getDefaultEvaluation(reason: string, evaluationTime: number, context: EvaluationContext): EvaluationResult;
47
47
  /**
48
48
  * Parse unified evaluation result from text response
49
49
  */
50
- declare function parseUnifiedEvaluationResult(response: string, context: UnifiedEvaluationContext): Partial<UnifiedEvaluationResult>;
50
+ declare function parseEvaluationResult(response: string, context: EvaluationContext): Partial<EvaluationResult>;
51
51
  /**
52
52
  * Main unified evaluation function
53
53
  */
54
- export declare function generateUnifiedEvaluation(context: UnifiedEvaluationContext): Promise<UnifiedEvaluationResult>;
55
- export declare function evaluateResponse(responseOrContext: unknown, contextOrUserQuery?: unknown, userQuery?: unknown, providedContexts?: unknown, options?: unknown, additionalArgs?: unknown): Promise<unknown>;
56
- export { getDefaultUnifiedEvaluation, parseUnifiedEvaluationResult };
54
+ export declare function generateEvaluation(context: EvaluationContext): Promise<EvaluationResult>;
55
+ export declare function evaluateResponse(context: EvaluationContext): Promise<EvaluationResult>;
56
+ export { getDefaultEvaluation, parseEvaluationResult };