@juspay/neurolink 5.1.0 → 5.3.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 (190) hide show
  1. package/CHANGELOG.md +21 -9
  2. package/README.md +123 -126
  3. package/dist/agent/direct-tools.d.ts +6 -6
  4. package/dist/cli/commands/config.d.ts +3 -3
  5. package/dist/cli/commands/mcp.js +8 -7
  6. package/dist/cli/factories/command-factory.d.ts +4 -0
  7. package/dist/cli/factories/command-factory.js +63 -8
  8. package/dist/cli/index.js +87 -140
  9. package/dist/core/base-provider.d.ts +423 -0
  10. package/dist/core/base-provider.js +376 -0
  11. package/dist/core/constants.d.ts +2 -1
  12. package/dist/core/constants.js +2 -1
  13. package/dist/core/dynamic-models.d.ts +6 -6
  14. package/dist/core/evaluation.d.ts +19 -80
  15. package/dist/core/evaluation.js +185 -484
  16. package/dist/core/factory.d.ts +3 -3
  17. package/dist/core/factory.js +31 -91
  18. package/dist/core/service-registry.d.ts +47 -0
  19. package/dist/core/service-registry.js +112 -0
  20. package/dist/core/types.d.ts +8 -1
  21. package/dist/factories/compatibility-factory.js +1 -1
  22. package/dist/factories/provider-factory.d.ts +72 -0
  23. package/dist/factories/provider-factory.js +144 -0
  24. package/dist/factories/provider-registry.d.ts +38 -0
  25. package/dist/factories/provider-registry.js +107 -0
  26. package/dist/index.d.ts +4 -3
  27. package/dist/index.js +2 -4
  28. package/dist/lib/agent/direct-tools.d.ts +6 -6
  29. package/dist/lib/core/base-provider.d.ts +423 -0
  30. package/dist/lib/core/base-provider.js +376 -0
  31. package/dist/lib/core/constants.d.ts +2 -1
  32. package/dist/lib/core/constants.js +2 -1
  33. package/dist/lib/core/dynamic-models.d.ts +6 -6
  34. package/dist/lib/core/evaluation.d.ts +19 -80
  35. package/dist/lib/core/evaluation.js +185 -484
  36. package/dist/lib/core/factory.d.ts +3 -3
  37. package/dist/lib/core/factory.js +30 -91
  38. package/dist/lib/core/service-registry.d.ts +47 -0
  39. package/dist/lib/core/service-registry.js +112 -0
  40. package/dist/lib/core/types.d.ts +8 -1
  41. package/dist/lib/factories/compatibility-factory.js +1 -1
  42. package/dist/lib/factories/provider-factory.d.ts +72 -0
  43. package/dist/lib/factories/provider-factory.js +144 -0
  44. package/dist/lib/factories/provider-registry.d.ts +38 -0
  45. package/dist/lib/factories/provider-registry.js +107 -0
  46. package/dist/lib/index.d.ts +4 -3
  47. package/dist/lib/index.js +2 -4
  48. package/dist/lib/mcp/client.d.ts +1 -0
  49. package/dist/lib/mcp/client.js +1 -0
  50. package/dist/lib/mcp/config.js +28 -3
  51. package/dist/lib/mcp/context-manager.d.ts +1 -0
  52. package/dist/lib/mcp/context-manager.js +8 -4
  53. package/dist/lib/mcp/function-calling.d.ts +13 -0
  54. package/dist/lib/mcp/function-calling.js +134 -35
  55. package/dist/lib/mcp/initialize-tools.d.ts +1 -1
  56. package/dist/lib/mcp/initialize-tools.js +45 -1
  57. package/dist/lib/mcp/initialize.js +16 -6
  58. package/dist/lib/mcp/neurolink-mcp-client.d.ts +1 -0
  59. package/dist/lib/mcp/neurolink-mcp-client.js +21 -5
  60. package/dist/lib/mcp/servers/agent/direct-tools-server.d.ts +8 -0
  61. package/dist/lib/mcp/servers/agent/direct-tools-server.js +109 -0
  62. package/dist/lib/mcp/servers/ai-providers/ai-core-server.js +3 -1
  63. package/dist/lib/mcp/servers/ai-providers/ai-workflow-tools.d.ts +2 -2
  64. package/dist/lib/mcp/unified-registry.d.ts +4 -0
  65. package/dist/lib/mcp/unified-registry.js +42 -9
  66. package/dist/lib/neurolink.d.ts +156 -117
  67. package/dist/lib/neurolink.js +619 -404
  68. package/dist/lib/providers/amazon-bedrock.d.ts +32 -0
  69. package/dist/lib/providers/amazon-bedrock.js +143 -0
  70. package/dist/lib/providers/analytics-helper.js +7 -4
  71. package/dist/lib/providers/anthropic-baseprovider.d.ts +23 -0
  72. package/dist/lib/providers/anthropic-baseprovider.js +114 -0
  73. package/dist/lib/providers/anthropic.d.ts +19 -43
  74. package/dist/lib/providers/anthropic.js +82 -306
  75. package/dist/lib/providers/azure-openai.d.ts +20 -0
  76. package/dist/lib/providers/azure-openai.js +89 -0
  77. package/dist/lib/providers/function-calling-provider.d.ts +64 -2
  78. package/dist/lib/providers/function-calling-provider.js +208 -9
  79. package/dist/lib/providers/google-ai-studio.d.ts +23 -0
  80. package/dist/lib/providers/google-ai-studio.js +107 -0
  81. package/dist/lib/providers/google-vertex.d.ts +47 -0
  82. package/dist/lib/providers/google-vertex.js +205 -0
  83. package/dist/lib/providers/huggingFace.d.ts +32 -25
  84. package/dist/lib/providers/huggingFace.js +97 -431
  85. package/dist/lib/providers/index.d.ts +9 -9
  86. package/dist/lib/providers/index.js +9 -9
  87. package/dist/lib/providers/mcp-provider.js +24 -5
  88. package/dist/lib/providers/mistral.d.ts +42 -0
  89. package/dist/lib/providers/mistral.js +160 -0
  90. package/dist/lib/providers/ollama.d.ts +52 -36
  91. package/dist/lib/providers/ollama.js +297 -520
  92. package/dist/lib/providers/openAI.d.ts +19 -18
  93. package/dist/lib/providers/openAI.js +76 -275
  94. package/dist/lib/sdk/tool-extension.d.ts +181 -0
  95. package/dist/lib/sdk/tool-extension.js +283 -0
  96. package/dist/lib/sdk/tool-registration.d.ts +95 -0
  97. package/dist/lib/sdk/tool-registration.js +167 -0
  98. package/dist/lib/services/streaming/streaming-manager.js +11 -10
  99. package/dist/lib/services/websocket/websocket-server.js +12 -11
  100. package/dist/lib/telemetry/telemetry-service.js +8 -7
  101. package/dist/lib/types/generate-types.d.ts +1 -0
  102. package/dist/lib/types/mcp-types.d.ts +116 -0
  103. package/dist/lib/types/mcp-types.js +5 -0
  104. package/dist/lib/types/stream-types.d.ts +30 -18
  105. package/dist/lib/types/universal-provider-options.d.ts +87 -0
  106. package/dist/lib/types/universal-provider-options.js +53 -0
  107. package/dist/mcp/client.d.ts +1 -0
  108. package/dist/mcp/client.js +1 -0
  109. package/dist/mcp/config.js +28 -3
  110. package/dist/mcp/context-manager.d.ts +1 -0
  111. package/dist/mcp/context-manager.js +8 -4
  112. package/dist/mcp/function-calling.d.ts +13 -0
  113. package/dist/mcp/function-calling.js +134 -35
  114. package/dist/mcp/initialize-tools.d.ts +1 -1
  115. package/dist/mcp/initialize-tools.js +45 -1
  116. package/dist/mcp/initialize.js +16 -6
  117. package/dist/mcp/neurolink-mcp-client.d.ts +1 -0
  118. package/dist/mcp/neurolink-mcp-client.js +21 -5
  119. package/dist/mcp/servers/agent/direct-tools-server.d.ts +8 -0
  120. package/dist/mcp/servers/agent/direct-tools-server.js +109 -0
  121. package/dist/mcp/servers/ai-providers/ai-core-server.js +3 -1
  122. package/dist/mcp/servers/ai-providers/ai-workflow-tools.d.ts +2 -2
  123. package/dist/mcp/unified-registry.d.ts +4 -0
  124. package/dist/mcp/unified-registry.js +42 -9
  125. package/dist/neurolink.d.ts +156 -117
  126. package/dist/neurolink.js +619 -404
  127. package/dist/providers/amazon-bedrock.d.ts +32 -0
  128. package/dist/providers/amazon-bedrock.js +143 -0
  129. package/dist/providers/analytics-helper.js +7 -4
  130. package/dist/providers/anthropic-baseprovider.d.ts +23 -0
  131. package/dist/providers/anthropic-baseprovider.js +114 -0
  132. package/dist/providers/anthropic.d.ts +19 -43
  133. package/dist/providers/anthropic.js +81 -305
  134. package/dist/providers/azure-openai.d.ts +20 -0
  135. package/dist/providers/azure-openai.js +89 -0
  136. package/dist/providers/function-calling-provider.d.ts +64 -2
  137. package/dist/providers/function-calling-provider.js +208 -9
  138. package/dist/providers/google-ai-studio.d.ts +23 -0
  139. package/dist/providers/google-ai-studio.js +108 -0
  140. package/dist/providers/google-vertex.d.ts +47 -0
  141. package/dist/providers/google-vertex.js +205 -0
  142. package/dist/providers/huggingFace.d.ts +32 -25
  143. package/dist/providers/huggingFace.js +96 -430
  144. package/dist/providers/index.d.ts +9 -9
  145. package/dist/providers/index.js +9 -9
  146. package/dist/providers/mcp-provider.js +24 -5
  147. package/dist/providers/mistral.d.ts +42 -0
  148. package/dist/providers/mistral.js +160 -0
  149. package/dist/providers/ollama.d.ts +52 -36
  150. package/dist/providers/ollama.js +297 -519
  151. package/dist/providers/openAI.d.ts +19 -18
  152. package/dist/providers/openAI.js +76 -276
  153. package/dist/sdk/tool-extension.d.ts +181 -0
  154. package/dist/sdk/tool-extension.js +283 -0
  155. package/dist/sdk/tool-registration.d.ts +95 -0
  156. package/dist/sdk/tool-registration.js +168 -0
  157. package/dist/services/streaming/streaming-manager.js +11 -10
  158. package/dist/services/websocket/websocket-server.js +12 -11
  159. package/dist/telemetry/telemetry-service.js +8 -7
  160. package/dist/types/generate-types.d.ts +1 -0
  161. package/dist/types/mcp-types.d.ts +116 -0
  162. package/dist/types/mcp-types.js +5 -0
  163. package/dist/types/stream-types.d.ts +30 -18
  164. package/dist/types/universal-provider-options.d.ts +87 -0
  165. package/dist/types/universal-provider-options.js +53 -0
  166. package/package.json +12 -5
  167. package/dist/lib/providers/agent-enhanced-provider.d.ts +0 -93
  168. package/dist/lib/providers/agent-enhanced-provider.js +0 -605
  169. package/dist/lib/providers/amazonBedrock.d.ts +0 -28
  170. package/dist/lib/providers/amazonBedrock.js +0 -364
  171. package/dist/lib/providers/azureOpenAI.d.ts +0 -42
  172. package/dist/lib/providers/azureOpenAI.js +0 -347
  173. package/dist/lib/providers/googleAIStudio.d.ts +0 -42
  174. package/dist/lib/providers/googleAIStudio.js +0 -364
  175. package/dist/lib/providers/googleVertexAI.d.ts +0 -34
  176. package/dist/lib/providers/googleVertexAI.js +0 -547
  177. package/dist/lib/providers/mistralAI.d.ts +0 -37
  178. package/dist/lib/providers/mistralAI.js +0 -325
  179. package/dist/providers/agent-enhanced-provider.d.ts +0 -93
  180. package/dist/providers/agent-enhanced-provider.js +0 -606
  181. package/dist/providers/amazonBedrock.d.ts +0 -28
  182. package/dist/providers/amazonBedrock.js +0 -364
  183. package/dist/providers/azureOpenAI.d.ts +0 -42
  184. package/dist/providers/azureOpenAI.js +0 -348
  185. package/dist/providers/googleAIStudio.d.ts +0 -42
  186. package/dist/providers/googleAIStudio.js +0 -364
  187. package/dist/providers/googleVertexAI.d.ts +0 -34
  188. package/dist/providers/googleVertexAI.js +0 -547
  189. package/dist/providers/mistralAI.d.ts +0 -37
  190. package/dist/providers/mistralAI.js +0 -325
@@ -0,0 +1,376 @@
1
+ import { logger } from "../utils/logger.js";
2
+ import { directAgentTools } from "../agent/direct-tools.js";
3
+ // Dynamic imports to break circular dependency
4
+ // import { evaluateResponse } from "../core/evaluation.js";
5
+ // import { getAvailableFunctionTools } from "../mcp/function-calling.js";
6
+ // Analytics helper will be dynamically imported when needed
7
+ /**
8
+ * Validates if a result contains a valid toolsObject structure
9
+ * @param result - The result object to validate
10
+ * @returns true if the result contains a valid toolsObject, false otherwise
11
+ */
12
+ function isValidToolsObject(result) {
13
+ return (result &&
14
+ typeof result === "object" &&
15
+ result.toolsObject &&
16
+ typeof result.toolsObject === "object" &&
17
+ Object.keys(result.toolsObject).length > 0);
18
+ }
19
+ /**
20
+ * Abstract base class for all AI providers
21
+ * Tools are integrated as first-class citizens - always available by default
22
+ */
23
+ export class BaseProvider {
24
+ modelName;
25
+ providerName;
26
+ defaultTimeout = 30000; // 30 seconds
27
+ // Tools are ALWAYS part of the provider - no flags, no conditions
28
+ directTools = directAgentTools;
29
+ mcpTools; // MCP tools loaded dynamically when available
30
+ sessionId;
31
+ userId;
32
+ sdk; // Reference to NeuroLink SDK instance for custom tools
33
+ constructor(modelName, providerName, sdk) {
34
+ this.modelName = modelName || this.getDefaultModel();
35
+ this.providerName = providerName || this.getProviderName();
36
+ this.sdk = sdk;
37
+ }
38
+ /**
39
+ * Check if this provider supports tool/function calling
40
+ * Override in subclasses to disable tools for specific providers or models
41
+ * @returns true by default, providers can override to return false
42
+ */
43
+ supportsTools() {
44
+ return true;
45
+ }
46
+ // ===================
47
+ // PUBLIC API METHODS
48
+ // ===================
49
+ /**
50
+ * Primary streaming method - implements AIProvider interface
51
+ * When tools are involved, falls back to generate() with synthetic streaming
52
+ */
53
+ async stream(optionsOrPrompt, analysisSchema) {
54
+ const options = this.normalizeStreamOptions(optionsOrPrompt);
55
+ // If tools are not disabled AND provider supports tools, use generate() and create synthetic stream
56
+ if (!options.disableTools && this.supportsTools()) {
57
+ try {
58
+ // Convert stream options to text generation options
59
+ const textOptions = {
60
+ prompt: options.input?.text || "",
61
+ systemPrompt: options.systemPrompt,
62
+ temperature: options.temperature,
63
+ maxTokens: options.maxTokens,
64
+ disableTools: false,
65
+ maxSteps: options.maxSteps || 5,
66
+ provider: options.provider,
67
+ model: options.model,
68
+ };
69
+ const result = await this.generate(textOptions, analysisSchema);
70
+ // Create a synthetic stream from the generate result that simulates progressive delivery
71
+ return {
72
+ stream: (async function* () {
73
+ if (result?.content) {
74
+ // Split content into words for more natural streaming
75
+ const words = result.content.split(/(\s+)/); // Keep whitespace
76
+ let buffer = "";
77
+ for (let i = 0; i < words.length; i++) {
78
+ buffer += words[i];
79
+ // Yield chunks of roughly 5-10 words or at punctuation
80
+ const shouldYield = i === words.length - 1 || // Last word
81
+ buffer.length > 50 || // Buffer getting long
82
+ /[.!?;,]\s*$/.test(buffer); // End of sentence/clause
83
+ if (shouldYield && buffer.trim()) {
84
+ yield { content: buffer };
85
+ buffer = "";
86
+ // Small delay to simulate streaming (1-10ms)
87
+ await new Promise((resolve) => setTimeout(resolve, Math.random() * 9 + 1));
88
+ }
89
+ }
90
+ // Yield any remaining content
91
+ if (buffer.trim()) {
92
+ yield { content: buffer };
93
+ }
94
+ }
95
+ })(),
96
+ usage: result?.usage,
97
+ provider: result?.provider,
98
+ model: result?.model,
99
+ toolCalls: result?.toolCalls?.map((call) => ({
100
+ toolName: call.toolName,
101
+ parameters: call.args,
102
+ id: call.toolCallId,
103
+ })),
104
+ toolResults: result?.toolResults,
105
+ };
106
+ }
107
+ catch (error) {
108
+ logger.error(`Stream with tools failed for ${this.providerName}:`, error);
109
+ throw this.handleProviderError(error);
110
+ }
111
+ }
112
+ // Traditional streaming without tools
113
+ try {
114
+ return await this.executeStream(options, analysisSchema);
115
+ }
116
+ catch (error) {
117
+ logger.error(`Stream failed for ${this.providerName}:`, error);
118
+ throw this.handleProviderError(error);
119
+ }
120
+ }
121
+ /**
122
+ * Text generation method - implements AIProvider interface
123
+ * Tools are always available unless explicitly disabled
124
+ */
125
+ async generate(optionsOrPrompt, analysisSchema) {
126
+ const options = this.normalizeTextOptions(optionsOrPrompt);
127
+ const startTime = Date.now();
128
+ try {
129
+ // Import generateText dynamically to avoid circular dependencies
130
+ const { generateText } = await import("ai");
131
+ // Get ALL available tools (direct + MCP when available)
132
+ const shouldUseTools = !options.disableTools && this.supportsTools();
133
+ const tools = shouldUseTools ? await this.getAllTools() : {};
134
+ logger.debug(`[BaseProvider.generate] Tools for ${this.providerName}: ${Object.keys(tools).join(", ")}`);
135
+ // EVERY provider uses Vercel AI SDK - no exceptions
136
+ const model = await this.getAISDKModel(); // This method is now REQUIRED
137
+ const result = await generateText({
138
+ model,
139
+ prompt: options.prompt || options.input?.text || "",
140
+ system: options.systemPrompt,
141
+ tools,
142
+ maxSteps: options.maxSteps || 5,
143
+ toolChoice: shouldUseTools ? "auto" : "none",
144
+ temperature: options.temperature,
145
+ maxTokens: options.maxTokens || 8192,
146
+ });
147
+ // Format the result with tool executions included
148
+ const enhancedResult = {
149
+ content: result.text,
150
+ usage: {
151
+ inputTokens: result.usage?.promptTokens || 0,
152
+ outputTokens: result.usage?.completionTokens || 0,
153
+ totalTokens: result.usage?.totalTokens || 0,
154
+ },
155
+ provider: this.providerName,
156
+ model: this.modelName,
157
+ toolCalls: result.toolCalls,
158
+ toolResults: result.toolResults,
159
+ };
160
+ // Enhanced result with analytics and evaluation
161
+ return await this.enhanceResult(enhancedResult, options, startTime);
162
+ }
163
+ catch (error) {
164
+ logger.error(`Generate failed for ${this.providerName}:`, error);
165
+ throw this.handleProviderError(error);
166
+ }
167
+ }
168
+ /**
169
+ * Alias for generate method - implements AIProvider interface
170
+ */
171
+ async gen(optionsOrPrompt, analysisSchema) {
172
+ return this.generate(optionsOrPrompt, analysisSchema);
173
+ }
174
+ // ===================
175
+ // TOOL MANAGEMENT
176
+ // ===================
177
+ /**
178
+ * Get all available tools - direct tools are ALWAYS available
179
+ * MCP tools are added when available (without blocking)
180
+ */
181
+ async getAllTools() {
182
+ const tools = {
183
+ ...this.directTools, // Always include direct tools
184
+ };
185
+ logger.debug(`[BaseProvider] getAllTools called, SDK available: ${!!this.sdk}, type: ${typeof this.sdk}`);
186
+ logger.debug(`[BaseProvider] Direct tools: ${Object.keys(this.directTools).join(", ")}`);
187
+ // Add custom tools from SDK if available
188
+ logger.debug(`[BaseProvider] Checking SDK: ${!!this.sdk}, has getInMemoryServers: ${this.sdk && typeof this.sdk.getInMemoryServers}`);
189
+ if (this.sdk &&
190
+ typeof this.sdk.getInMemoryServers === "function") {
191
+ logger.debug(`[BaseProvider] SDK check passed, loading custom tools`);
192
+ try {
193
+ const inMemoryServers = this.sdk.getInMemoryServers();
194
+ logger.debug(`[BaseProvider] Got servers:`, inMemoryServers.size);
195
+ logger.debug(`[BaseProvider] Loading custom tools from SDK, found ${inMemoryServers.size} servers`);
196
+ if (inMemoryServers && inMemoryServers.size > 0) {
197
+ // Convert in-memory server tools to AI SDK format
198
+ for (const [serverId, serverConfig] of inMemoryServers) {
199
+ const server = serverConfig.server;
200
+ if (server && server.tools) {
201
+ // Handle both Map and object formats
202
+ const toolEntries = server.tools instanceof Map
203
+ ? Array.from(server.tools.entries())
204
+ : Object.entries(server.tools || {});
205
+ for (const [toolName, toolInfo] of toolEntries) {
206
+ if (toolInfo && typeof toolInfo.execute === "function") {
207
+ logger.debug(`[BaseProvider] Converting custom tool: ${toolName}`);
208
+ // Convert to AI SDK tool format
209
+ const { tool: createAISDKTool } = await import("ai");
210
+ const { z } = await import("zod");
211
+ tools[toolName] = createAISDKTool({
212
+ description: toolInfo.description || `Tool ${toolName}`,
213
+ parameters: toolInfo.inputSchema ||
214
+ toolInfo.parameters ||
215
+ z.object({}),
216
+ execute: async (args) => {
217
+ const result = await toolInfo.execute(args);
218
+ // Handle MCP-style results
219
+ if (result &&
220
+ typeof result === "object" &&
221
+ "success" in result) {
222
+ if (result.success) {
223
+ return result.data;
224
+ }
225
+ else {
226
+ throw new Error(result.error || "Tool execution failed");
227
+ }
228
+ }
229
+ return result;
230
+ },
231
+ });
232
+ }
233
+ }
234
+ }
235
+ }
236
+ }
237
+ }
238
+ catch (error) {
239
+ logger.debug(`Failed to load custom tools for ${this.providerName}:`, error);
240
+ // Not an error - custom tools are optional
241
+ }
242
+ }
243
+ // Try to load MCP tools if not already loaded
244
+ if (!this.mcpTools) {
245
+ try {
246
+ const { getAvailableFunctionTools } = await import("../mcp/function-calling.js");
247
+ const result = await getAvailableFunctionTools();
248
+ if (isValidToolsObject(result)) {
249
+ this.mcpTools = result.toolsObject;
250
+ }
251
+ else {
252
+ logger.debug(`Invalid or empty toolsObject for ${this.providerName}: Expected an object with at least one key, but got ${typeof result.toolsObject} with ${result.toolsObject ? Object.keys(result.toolsObject).length : 0} keys. Full result:`, result);
253
+ }
254
+ }
255
+ catch (error) {
256
+ logger.debug(`MCP tools not available for ${this.providerName}:`, error);
257
+ // Not an error - MCP tools are optional
258
+ }
259
+ }
260
+ // Add MCP tools if available
261
+ if (this.mcpTools) {
262
+ Object.assign(tools, this.mcpTools);
263
+ }
264
+ logger.debug(`[BaseProvider] getAllTools returning tools: ${Object.keys(tools).join(", ")}`);
265
+ return tools;
266
+ }
267
+ /**
268
+ * Set session context for MCP tools
269
+ */
270
+ setSessionContext(sessionId, userId) {
271
+ this.sessionId = sessionId;
272
+ this.userId = userId;
273
+ }
274
+ // ===================
275
+ // TEMPLATE METHODS - COMMON FUNCTIONALITY
276
+ // ===================
277
+ normalizeTextOptions(optionsOrPrompt) {
278
+ if (typeof optionsOrPrompt === "string") {
279
+ return {
280
+ prompt: optionsOrPrompt,
281
+ provider: this.providerName,
282
+ model: this.modelName,
283
+ };
284
+ }
285
+ // Handle both prompt and input.text formats
286
+ const prompt = optionsOrPrompt.prompt || optionsOrPrompt.input?.text || "";
287
+ return {
288
+ ...optionsOrPrompt,
289
+ prompt,
290
+ provider: optionsOrPrompt.provider || this.providerName,
291
+ model: optionsOrPrompt.model || this.modelName,
292
+ };
293
+ }
294
+ normalizeStreamOptions(optionsOrPrompt) {
295
+ if (typeof optionsOrPrompt === "string") {
296
+ return {
297
+ input: { text: optionsOrPrompt },
298
+ provider: this.providerName,
299
+ model: this.modelName,
300
+ };
301
+ }
302
+ return {
303
+ ...optionsOrPrompt,
304
+ provider: optionsOrPrompt.provider || this.providerName,
305
+ model: optionsOrPrompt.model || this.modelName,
306
+ };
307
+ }
308
+ async enhanceResult(result, options, startTime) {
309
+ const responseTime = Date.now() - startTime;
310
+ let enhancedResult = { ...result };
311
+ if (options.enableAnalytics) {
312
+ try {
313
+ logger.debug(`Creating analytics for ${this.providerName}...`);
314
+ const analytics = await this.createAnalytics(result, responseTime, options);
315
+ logger.debug(`Analytics created:`, analytics);
316
+ enhancedResult = { ...enhancedResult, analytics };
317
+ }
318
+ catch (error) {
319
+ logger.warn(`Analytics creation failed for ${this.providerName}:`, error);
320
+ }
321
+ }
322
+ if (options.enableEvaluation) {
323
+ try {
324
+ const evaluation = await this.createEvaluation(result, options);
325
+ enhancedResult = { ...enhancedResult, evaluation };
326
+ }
327
+ catch (error) {
328
+ logger.warn(`Evaluation creation failed for ${this.providerName}:`, error);
329
+ }
330
+ }
331
+ return enhancedResult;
332
+ }
333
+ async createAnalytics(result, responseTime, options) {
334
+ const { createAnalytics } = await import("../providers/analytics-helper.js");
335
+ return createAnalytics(this.providerName, this.modelName, result, responseTime, options.context);
336
+ }
337
+ async createEvaluation(result, options) {
338
+ const { evaluateResponse } = await import("../core/evaluation.js");
339
+ return evaluateResponse(result.content, options.prompt);
340
+ }
341
+ validateOptions(options) {
342
+ if (!options.prompt || options.prompt.trim().length === 0) {
343
+ throw new Error("Prompt is required and cannot be empty");
344
+ }
345
+ }
346
+ getProviderInfo() {
347
+ return {
348
+ provider: this.providerName,
349
+ model: this.modelName,
350
+ };
351
+ }
352
+ /**
353
+ * Get timeout value in milliseconds
354
+ */
355
+ getTimeout(options) {
356
+ if (!options.timeout) {
357
+ return this.defaultTimeout;
358
+ }
359
+ if (typeof options.timeout === "number") {
360
+ return options.timeout;
361
+ }
362
+ // Parse string timeout (e.g., '30s', '2m', '1h')
363
+ const timeoutStr = options.timeout.toLowerCase();
364
+ const value = parseInt(timeoutStr);
365
+ if (timeoutStr.includes("h")) {
366
+ return value * 60 * 60 * 1000;
367
+ }
368
+ else if (timeoutStr.includes("m")) {
369
+ return value * 60 * 1000;
370
+ }
371
+ else if (timeoutStr.includes("s")) {
372
+ return value * 1000;
373
+ }
374
+ return this.defaultTimeout;
375
+ }
376
+ }
@@ -2,9 +2,10 @@
2
2
  * Central configuration constants for NeuroLink
3
3
  * Single source of truth for all default values
4
4
  */
5
- export declare const DEFAULT_MAX_TOKENS = 10000;
5
+ export declare const DEFAULT_MAX_TOKENS = 8192;
6
6
  export declare const DEFAULT_TEMPERATURE = 0.7;
7
7
  export declare const DEFAULT_TIMEOUT = 30000;
8
+ export declare const DEFAULT_MAX_STEPS = 5;
8
9
  export declare const DEFAULT_EVALUATION_MAX_TOKENS = 500;
9
10
  export declare const DEFAULT_ANALYSIS_MAX_TOKENS = 800;
10
11
  export declare const DEFAULT_DOCUMENTATION_MAX_TOKENS = 12000;
@@ -3,9 +3,10 @@
3
3
  * Single source of truth for all default values
4
4
  */
5
5
  // Core AI Generation Defaults
6
- export const DEFAULT_MAX_TOKENS = 10000;
6
+ export const DEFAULT_MAX_TOKENS = 8192; // Changed from 10000 to fix Anthropic error
7
7
  export const DEFAULT_TEMPERATURE = 0.7;
8
8
  export const DEFAULT_TIMEOUT = 30000;
9
+ export const DEFAULT_MAX_STEPS = 5; // Default multi-turn tool execution steps
9
10
  // Specialized Use Case Defaults
10
11
  export const DEFAULT_EVALUATION_MAX_TOKENS = 500; // Keep evaluation fast
11
12
  export const DEFAULT_ANALYSIS_MAX_TOKENS = 800; // For analysis tools
@@ -21,8 +21,8 @@ declare const ModelConfigSchema: z.ZodObject<{
21
21
  releaseDate: z.ZodString;
22
22
  }, "strip", z.ZodTypeAny, {
23
23
  id: string;
24
- displayName: string;
25
24
  capabilities: string[];
25
+ displayName: string;
26
26
  deprecated: boolean;
27
27
  pricing: {
28
28
  input: number;
@@ -32,8 +32,8 @@ declare const ModelConfigSchema: z.ZodObject<{
32
32
  releaseDate: string;
33
33
  }, {
34
34
  id: string;
35
- displayName: string;
36
35
  capabilities: string[];
36
+ displayName: string;
37
37
  deprecated: boolean;
38
38
  pricing: {
39
39
  input: number;
@@ -64,8 +64,8 @@ declare const ModelRegistrySchema: z.ZodObject<{
64
64
  releaseDate: z.ZodString;
65
65
  }, "strip", z.ZodTypeAny, {
66
66
  id: string;
67
- displayName: string;
68
67
  capabilities: string[];
68
+ displayName: string;
69
69
  deprecated: boolean;
70
70
  pricing: {
71
71
  input: number;
@@ -75,8 +75,8 @@ declare const ModelRegistrySchema: z.ZodObject<{
75
75
  releaseDate: string;
76
76
  }, {
77
77
  id: string;
78
- displayName: string;
79
78
  capabilities: string[];
79
+ displayName: string;
80
80
  deprecated: boolean;
81
81
  pricing: {
82
82
  input: number;
@@ -92,8 +92,8 @@ declare const ModelRegistrySchema: z.ZodObject<{
92
92
  lastUpdated: string;
93
93
  models: Record<string, Record<string, {
94
94
  id: string;
95
- displayName: string;
96
95
  capabilities: string[];
96
+ displayName: string;
97
97
  deprecated: boolean;
98
98
  pricing: {
99
99
  input: number;
@@ -109,8 +109,8 @@ declare const ModelRegistrySchema: z.ZodObject<{
109
109
  lastUpdated: string;
110
110
  models: Record<string, Record<string, {
111
111
  id: string;
112
- displayName: string;
113
112
  capabilities: string[];
113
+ displayName: string;
114
114
  deprecated: boolean;
115
115
  pricing: {
116
116
  input: number;
@@ -1,15 +1,7 @@
1
1
  /**
2
2
  * NeuroLink Unified Evaluation System
3
- *
4
- * Combines Universal Evaluation with Lighthouse-Enhanced capabilities
5
- * - Domain-aware evaluation with sophisticated context handling
6
- * - Multi-provider support with fallback strategies
7
- * - Structured output with Zod schema validation
8
- * - Tool usage and conversation history analysis
9
- * - Enterprise-grade reliability and performance
10
3
  */
11
4
  import type { EvaluationData } from "./types.js";
12
- import { z } from "zod";
13
5
  export interface UnifiedEvaluationResult extends EvaluationData {
14
6
  domainAlignment?: number;
15
7
  terminologyAccuracy?: number;
@@ -24,6 +16,9 @@ export interface UnifiedEvaluationResult extends EvaluationData {
24
16
  toolsEvaluated: string[];
25
17
  conversationTurns: number;
26
18
  };
19
+ isOffTopic: boolean;
20
+ alertSeverity: "low" | "medium" | "high" | "none";
21
+ reasoning: string;
27
22
  }
28
23
  export interface UnifiedEvaluationContext {
29
24
  userQuery: string;
@@ -31,87 +26,31 @@ export interface UnifiedEvaluationContext {
31
26
  context?: Record<string, any>;
32
27
  primaryDomain?: string;
33
28
  assistantRole?: string;
34
- toolsUsed?: string[];
35
- toolContext?: string;
36
29
  conversationHistory?: Array<{
37
30
  role: "user" | "assistant";
38
31
  content: string;
39
32
  timestamp?: string;
40
33
  }>;
41
- sessionId?: string;
42
- userId?: string;
43
- requestId?: string;
44
- mode?: "simple" | "enhanced" | "lighthouse";
34
+ toolUsage?: Array<{
35
+ toolName: string;
36
+ input: any;
37
+ output: any;
38
+ executionTime: number;
39
+ }>;
40
+ expectedOutcome?: string;
41
+ evaluationCriteria?: string[];
45
42
  }
46
43
  /**
47
- * Unified Evaluation Schema (Lighthouse-compatible with extensions)
44
+ * Get default evaluation when evaluation fails
48
45
  */
49
- export declare const unifiedEvaluationSchema: z.ZodObject<{
50
- relevance: z.ZodNumber;
51
- accuracy: z.ZodNumber;
52
- completeness: z.ZodNumber;
53
- domainAlignment: z.ZodOptional<z.ZodNumber>;
54
- terminologyAccuracy: z.ZodOptional<z.ZodNumber>;
55
- toolEffectiveness: z.ZodOptional<z.ZodNumber>;
56
- isOffTopic: z.ZodBoolean;
57
- reasoning: z.ZodString;
58
- suggestedImprovements: z.ZodOptional<z.ZodString>;
59
- alertSeverity: z.ZodEnum<["low", "medium", "high", "none"]>;
60
- }, "strip", z.ZodTypeAny, {
61
- relevance: number;
62
- accuracy: number;
63
- completeness: number;
64
- isOffTopic: boolean;
65
- reasoning: string;
66
- alertSeverity: "low" | "medium" | "high" | "none";
67
- domainAlignment?: number | undefined;
68
- terminologyAccuracy?: number | undefined;
69
- toolEffectiveness?: number | undefined;
70
- suggestedImprovements?: string | undefined;
71
- }, {
72
- relevance: number;
73
- accuracy: number;
74
- completeness: number;
75
- isOffTopic: boolean;
76
- reasoning: string;
77
- alertSeverity: "low" | "medium" | "high" | "none";
78
- domainAlignment?: number | undefined;
79
- terminologyAccuracy?: number | undefined;
80
- toolEffectiveness?: number | undefined;
81
- suggestedImprovements?: string | undefined;
82
- }>;
46
+ declare function getDefaultUnifiedEvaluation(reason: string, evaluationTime: number, context: UnifiedEvaluationContext): UnifiedEvaluationResult;
83
47
  /**
84
- * Main unified evaluation function
48
+ * Parse unified evaluation result from text response
85
49
  */
86
- export declare function performUnifiedEvaluation(context: UnifiedEvaluationContext): Promise<UnifiedEvaluationResult>;
50
+ declare function parseUnifiedEvaluationResult(response: string, context: UnifiedEvaluationContext): Partial<UnifiedEvaluationResult>;
87
51
  /**
88
- * Enhanced evaluation model selection
89
- */
90
- export declare function getEvaluationModel(): Promise<{
91
- provider: any;
92
- config: any;
93
- } | null>;
94
- /**
95
- * Create simple evaluation context (backward compatibility)
96
- */
97
- export declare function createSimpleEvaluationContext(prompt: string, response: string, context?: Record<string, any>): UnifiedEvaluationContext;
98
- /**
99
- * Create enhanced evaluation context
52
+ * Main unified evaluation function
100
53
  */
101
- export declare function createEnhancedEvaluationContext(userQuery: string, aiResponse: string, options?: {
102
- domain?: string;
103
- role?: string;
104
- toolsUsed?: string[];
105
- conversationHistory?: Array<{
106
- role: "user" | "assistant";
107
- content: string;
108
- }>;
109
- sessionId?: string;
110
- context?: Record<string, any>;
111
- }): UnifiedEvaluationContext;
112
- export declare function evaluateResponse(prompt: string, response: string, context?: Record<string, any>, evaluationDomain?: string, toolUsageContext?: string, conversationHistory?: Array<{
113
- role: string;
114
- content: string;
115
- timestamp?: string;
116
- }>): Promise<UnifiedEvaluationResult>;
117
- export type EvaluationResult = UnifiedEvaluationResult;
54
+ export declare function generateUnifiedEvaluation(context: UnifiedEvaluationContext): Promise<UnifiedEvaluationResult>;
55
+ export declare function evaluateResponse(responseOrContext: any, contextOrUserQuery?: any, userQuery?: any, providedContexts?: any, options?: any, additionalArgs?: any): Promise<any>;
56
+ export { getDefaultUnifiedEvaluation, parseUnifiedEvaluationResult };