@juspay/neurolink 5.0.0 → 5.2.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 (214) hide show
  1. package/CHANGELOG.md +20 -7
  2. package/README.md +160 -172
  3. package/dist/agent/direct-tools.d.ts +6 -6
  4. package/dist/chat/sse-handler.js +5 -4
  5. package/dist/chat/websocket-chat-handler.js +9 -9
  6. package/dist/cli/commands/config.d.ts +3 -3
  7. package/dist/cli/commands/mcp.js +9 -8
  8. package/dist/cli/commands/ollama.js +3 -3
  9. package/dist/cli/factories/command-factory.d.ts +18 -0
  10. package/dist/cli/factories/command-factory.js +183 -0
  11. package/dist/cli/index.js +105 -157
  12. package/dist/cli/utils/interactive-setup.js +2 -2
  13. package/dist/core/base-provider.d.ts +423 -0
  14. package/dist/core/base-provider.js +365 -0
  15. package/dist/core/constants.d.ts +1 -1
  16. package/dist/core/constants.js +1 -1
  17. package/dist/core/dynamic-models.d.ts +6 -6
  18. package/dist/core/evaluation.d.ts +19 -80
  19. package/dist/core/evaluation.js +185 -484
  20. package/dist/core/factory.d.ts +3 -3
  21. package/dist/core/factory.js +31 -91
  22. package/dist/core/service-registry.d.ts +47 -0
  23. package/dist/core/service-registry.js +112 -0
  24. package/dist/core/types.d.ts +49 -49
  25. package/dist/core/types.js +1 -0
  26. package/dist/factories/compatibility-factory.d.ts +20 -0
  27. package/dist/factories/compatibility-factory.js +69 -0
  28. package/dist/factories/provider-factory.d.ts +72 -0
  29. package/dist/factories/provider-factory.js +144 -0
  30. package/dist/factories/provider-generate-factory.d.ts +20 -0
  31. package/dist/factories/provider-generate-factory.js +87 -0
  32. package/dist/factories/provider-registry.d.ts +38 -0
  33. package/dist/factories/provider-registry.js +107 -0
  34. package/dist/index.d.ts +8 -5
  35. package/dist/index.js +5 -5
  36. package/dist/lib/agent/direct-tools.d.ts +6 -6
  37. package/dist/lib/chat/sse-handler.js +5 -4
  38. package/dist/lib/chat/websocket-chat-handler.js +9 -9
  39. package/dist/lib/core/base-provider.d.ts +423 -0
  40. package/dist/lib/core/base-provider.js +365 -0
  41. package/dist/lib/core/constants.d.ts +1 -1
  42. package/dist/lib/core/constants.js +1 -1
  43. package/dist/lib/core/dynamic-models.d.ts +6 -6
  44. package/dist/lib/core/evaluation.d.ts +19 -80
  45. package/dist/lib/core/evaluation.js +185 -484
  46. package/dist/lib/core/factory.d.ts +3 -3
  47. package/dist/lib/core/factory.js +30 -91
  48. package/dist/lib/core/service-registry.d.ts +47 -0
  49. package/dist/lib/core/service-registry.js +112 -0
  50. package/dist/lib/core/types.d.ts +49 -49
  51. package/dist/lib/core/types.js +1 -0
  52. package/dist/lib/factories/compatibility-factory.d.ts +20 -0
  53. package/dist/lib/factories/compatibility-factory.js +69 -0
  54. package/dist/lib/factories/provider-factory.d.ts +72 -0
  55. package/dist/lib/factories/provider-factory.js +144 -0
  56. package/dist/lib/factories/provider-generate-factory.d.ts +20 -0
  57. package/dist/lib/factories/provider-generate-factory.js +87 -0
  58. package/dist/lib/factories/provider-registry.d.ts +38 -0
  59. package/dist/lib/factories/provider-registry.js +107 -0
  60. package/dist/lib/index.d.ts +8 -5
  61. package/dist/lib/index.js +5 -5
  62. package/dist/lib/mcp/client.js +5 -5
  63. package/dist/lib/mcp/config.js +28 -3
  64. package/dist/lib/mcp/dynamic-orchestrator.js +8 -8
  65. package/dist/lib/mcp/external-client.js +2 -2
  66. package/dist/lib/mcp/factory.d.ts +1 -1
  67. package/dist/lib/mcp/factory.js +1 -1
  68. package/dist/lib/mcp/function-calling.js +1 -1
  69. package/dist/lib/mcp/initialize-tools.d.ts +1 -1
  70. package/dist/lib/mcp/initialize-tools.js +45 -1
  71. package/dist/lib/mcp/initialize.js +16 -6
  72. package/dist/lib/mcp/neurolink-mcp-client.js +10 -10
  73. package/dist/lib/mcp/orchestrator.js +4 -4
  74. package/dist/lib/mcp/servers/agent/direct-tools-server.d.ts +8 -0
  75. package/dist/lib/mcp/servers/agent/direct-tools-server.js +109 -0
  76. package/dist/lib/mcp/servers/ai-providers/ai-analysis-tools.js +10 -10
  77. package/dist/lib/mcp/servers/ai-providers/ai-core-server.js +8 -6
  78. package/dist/lib/mcp/servers/ai-providers/ai-workflow-tools.d.ts +2 -2
  79. package/dist/lib/mcp/servers/ai-providers/ai-workflow-tools.js +16 -16
  80. package/dist/lib/mcp/unified-registry.d.ts +4 -0
  81. package/dist/lib/mcp/unified-registry.js +42 -9
  82. package/dist/lib/neurolink.d.ts +161 -174
  83. package/dist/lib/neurolink.js +723 -397
  84. package/dist/lib/providers/amazon-bedrock.d.ts +32 -0
  85. package/dist/lib/providers/amazon-bedrock.js +143 -0
  86. package/dist/lib/providers/analytics-helper.js +7 -4
  87. package/dist/lib/providers/anthropic-baseprovider.d.ts +23 -0
  88. package/dist/lib/providers/anthropic-baseprovider.js +114 -0
  89. package/dist/lib/providers/anthropic.d.ts +19 -39
  90. package/dist/lib/providers/anthropic.js +84 -378
  91. package/dist/lib/providers/azure-openai.d.ts +20 -0
  92. package/dist/lib/providers/azure-openai.js +89 -0
  93. package/dist/lib/providers/function-calling-provider.d.ts +14 -12
  94. package/dist/lib/providers/function-calling-provider.js +114 -64
  95. package/dist/lib/providers/google-ai-studio.d.ts +23 -0
  96. package/dist/lib/providers/google-ai-studio.js +107 -0
  97. package/dist/lib/providers/google-vertex.d.ts +47 -0
  98. package/dist/lib/providers/google-vertex.js +205 -0
  99. package/dist/lib/providers/huggingFace.d.ts +33 -27
  100. package/dist/lib/providers/huggingFace.js +103 -400
  101. package/dist/lib/providers/index.d.ts +9 -9
  102. package/dist/lib/providers/index.js +9 -9
  103. package/dist/lib/providers/mcp-provider.d.ts +13 -8
  104. package/dist/lib/providers/mcp-provider.js +63 -18
  105. package/dist/lib/providers/mistral.d.ts +42 -0
  106. package/dist/lib/providers/mistral.js +160 -0
  107. package/dist/lib/providers/ollama.d.ts +52 -35
  108. package/dist/lib/providers/ollama.js +297 -477
  109. package/dist/lib/providers/openAI.d.ts +21 -21
  110. package/dist/lib/providers/openAI.js +81 -245
  111. package/dist/lib/sdk/tool-extension.d.ts +181 -0
  112. package/dist/lib/sdk/tool-extension.js +283 -0
  113. package/dist/lib/sdk/tool-registration.d.ts +95 -0
  114. package/dist/lib/sdk/tool-registration.js +167 -0
  115. package/dist/lib/types/generate-types.d.ts +80 -0
  116. package/dist/lib/types/generate-types.js +1 -0
  117. package/dist/lib/types/mcp-types.d.ts +116 -0
  118. package/dist/lib/types/mcp-types.js +5 -0
  119. package/dist/lib/types/stream-types.d.ts +95 -0
  120. package/dist/lib/types/stream-types.js +1 -0
  121. package/dist/lib/types/universal-provider-options.d.ts +87 -0
  122. package/dist/lib/types/universal-provider-options.js +53 -0
  123. package/dist/lib/utils/providerUtils-fixed.js +1 -1
  124. package/dist/lib/utils/streaming-utils.d.ts +14 -2
  125. package/dist/lib/utils/streaming-utils.js +0 -3
  126. package/dist/mcp/client.js +5 -5
  127. package/dist/mcp/config.js +28 -3
  128. package/dist/mcp/dynamic-orchestrator.js +8 -8
  129. package/dist/mcp/external-client.js +2 -2
  130. package/dist/mcp/factory.d.ts +1 -1
  131. package/dist/mcp/factory.js +1 -1
  132. package/dist/mcp/function-calling.js +1 -1
  133. package/dist/mcp/initialize-tools.d.ts +1 -1
  134. package/dist/mcp/initialize-tools.js +45 -1
  135. package/dist/mcp/initialize.js +16 -6
  136. package/dist/mcp/neurolink-mcp-client.js +10 -10
  137. package/dist/mcp/orchestrator.js +4 -4
  138. package/dist/mcp/servers/agent/direct-tools-server.d.ts +8 -0
  139. package/dist/mcp/servers/agent/direct-tools-server.js +109 -0
  140. package/dist/mcp/servers/ai-providers/ai-analysis-tools.js +10 -10
  141. package/dist/mcp/servers/ai-providers/ai-core-server.js +8 -6
  142. package/dist/mcp/servers/ai-providers/ai-workflow-tools.d.ts +2 -2
  143. package/dist/mcp/servers/ai-providers/ai-workflow-tools.js +16 -16
  144. package/dist/mcp/unified-registry.d.ts +4 -0
  145. package/dist/mcp/unified-registry.js +42 -9
  146. package/dist/neurolink.d.ts +161 -174
  147. package/dist/neurolink.js +723 -397
  148. package/dist/providers/amazon-bedrock.d.ts +32 -0
  149. package/dist/providers/amazon-bedrock.js +143 -0
  150. package/dist/providers/analytics-helper.js +7 -4
  151. package/dist/providers/anthropic-baseprovider.d.ts +23 -0
  152. package/dist/providers/anthropic-baseprovider.js +114 -0
  153. package/dist/providers/anthropic.d.ts +19 -39
  154. package/dist/providers/anthropic.js +83 -377
  155. package/dist/providers/azure-openai.d.ts +20 -0
  156. package/dist/providers/azure-openai.js +89 -0
  157. package/dist/providers/function-calling-provider.d.ts +14 -12
  158. package/dist/providers/function-calling-provider.js +114 -64
  159. package/dist/providers/google-ai-studio.d.ts +23 -0
  160. package/dist/providers/google-ai-studio.js +108 -0
  161. package/dist/providers/google-vertex.d.ts +47 -0
  162. package/dist/providers/google-vertex.js +205 -0
  163. package/dist/providers/huggingFace.d.ts +33 -27
  164. package/dist/providers/huggingFace.js +102 -399
  165. package/dist/providers/index.d.ts +9 -9
  166. package/dist/providers/index.js +9 -9
  167. package/dist/providers/mcp-provider.d.ts +13 -8
  168. package/dist/providers/mcp-provider.js +63 -18
  169. package/dist/providers/mistral.d.ts +42 -0
  170. package/dist/providers/mistral.js +160 -0
  171. package/dist/providers/ollama.d.ts +52 -35
  172. package/dist/providers/ollama.js +297 -476
  173. package/dist/providers/openAI.d.ts +21 -21
  174. package/dist/providers/openAI.js +81 -246
  175. package/dist/sdk/tool-extension.d.ts +181 -0
  176. package/dist/sdk/tool-extension.js +283 -0
  177. package/dist/sdk/tool-registration.d.ts +95 -0
  178. package/dist/sdk/tool-registration.js +168 -0
  179. package/dist/types/generate-types.d.ts +80 -0
  180. package/dist/types/generate-types.js +1 -0
  181. package/dist/types/mcp-types.d.ts +116 -0
  182. package/dist/types/mcp-types.js +5 -0
  183. package/dist/types/stream-types.d.ts +95 -0
  184. package/dist/types/stream-types.js +1 -0
  185. package/dist/types/universal-provider-options.d.ts +87 -0
  186. package/dist/types/universal-provider-options.js +53 -0
  187. package/dist/utils/providerUtils-fixed.js +1 -1
  188. package/dist/utils/streaming-utils.d.ts +14 -2
  189. package/dist/utils/streaming-utils.js +0 -3
  190. package/package.json +15 -10
  191. package/dist/lib/providers/agent-enhanced-provider.d.ts +0 -89
  192. package/dist/lib/providers/agent-enhanced-provider.js +0 -614
  193. package/dist/lib/providers/amazonBedrock.d.ts +0 -19
  194. package/dist/lib/providers/amazonBedrock.js +0 -334
  195. package/dist/lib/providers/azureOpenAI.d.ts +0 -39
  196. package/dist/lib/providers/azureOpenAI.js +0 -436
  197. package/dist/lib/providers/googleAIStudio.d.ts +0 -49
  198. package/dist/lib/providers/googleAIStudio.js +0 -333
  199. package/dist/lib/providers/googleVertexAI.d.ts +0 -38
  200. package/dist/lib/providers/googleVertexAI.js +0 -519
  201. package/dist/lib/providers/mistralAI.d.ts +0 -34
  202. package/dist/lib/providers/mistralAI.js +0 -294
  203. package/dist/providers/agent-enhanced-provider.d.ts +0 -89
  204. package/dist/providers/agent-enhanced-provider.js +0 -614
  205. package/dist/providers/amazonBedrock.d.ts +0 -19
  206. package/dist/providers/amazonBedrock.js +0 -334
  207. package/dist/providers/azureOpenAI.d.ts +0 -39
  208. package/dist/providers/azureOpenAI.js +0 -437
  209. package/dist/providers/googleAIStudio.d.ts +0 -49
  210. package/dist/providers/googleAIStudio.js +0 -333
  211. package/dist/providers/googleVertexAI.d.ts +0 -38
  212. package/dist/providers/googleVertexAI.js +0 -519
  213. package/dist/providers/mistralAI.d.ts +0 -34
  214. package/dist/providers/mistralAI.js +0 -294
@@ -1,614 +0,0 @@
1
- /**
2
- * Agent-Enhanced Provider for NeuroLink CLI
3
- * Integrates direct tools with AI providers for true agent functionality
4
- */
5
- import { generateText, streamText, tool, } from "ai";
6
- import { google } from "@ai-sdk/google";
7
- import { openai } from "@ai-sdk/openai";
8
- import { anthropic } from "@ai-sdk/anthropic";
9
- import { directAgentTools, getToolsForCategory, } from "../agent/direct-tools.js";
10
- import { StreamingEnhancer, StreamingMonitor, } from "../utils/streaming-utils.js";
11
- import { UnifiedMCPSystem } from "../mcp/unified-mcp.js";
12
- import { mcpLogger } from "../mcp/logging.js";
13
- import { parseTimeout } from "../utils/timeout.js";
14
- import { evaluateResponse } from "../core/evaluation.js";
15
- import { createAnalytics } from "../core/analytics.js";
16
- import { logger } from "../utils/logger.js";
17
- /**
18
- * Agent-Enhanced Provider Class
19
- * Provides AI generation with tool calling capabilities
20
- * Now includes MCP tool integration alongside direct tools
21
- */
22
- export class AgentEnhancedProvider {
23
- config;
24
- model;
25
- resolvedModelName = "default";
26
- mcpSystem = null;
27
- mcpInitialized = false;
28
- mcpInitializing = false;
29
- mcpInitFailed = false;
30
- constructor(config) {
31
- this.config = {
32
- maxSteps: 5,
33
- toolCategory: "all",
34
- enableTools: true,
35
- enableMCP: true,
36
- mcpDiscoveryOptions: {
37
- autoDiscover: true,
38
- searchPaths: [process.cwd()],
39
- configFiles: [".mcp-config.json", ".mcp-servers.json"],
40
- },
41
- ...config,
42
- };
43
- // Initialize the AI model based on provider and store resolved model name
44
- this.model = this.createModel();
45
- // Initialize MCP registry if enabled
46
- if (this.config.enableMCP) {
47
- this.initializeMCP();
48
- }
49
- }
50
- createModel() {
51
- const { provider, model } = this.config;
52
- switch (provider) {
53
- case "google-ai":
54
- this.resolvedModelName =
55
- model || process.env.GOOGLE_AI_MODEL || "gemini-2.5-flash";
56
- return google(this.resolvedModelName);
57
- case "openai":
58
- this.resolvedModelName = model || process.env.OPENAI_MODEL || "gpt-4o";
59
- return openai(this.resolvedModelName);
60
- case "anthropic":
61
- this.resolvedModelName =
62
- model || process.env.ANTHROPIC_MODEL || "claude-3-5-sonnet-20241022";
63
- return anthropic(this.resolvedModelName);
64
- default:
65
- throw new Error(`Unsupported provider: ${provider}`);
66
- }
67
- }
68
- /**
69
- * Initialize MCP registry with auto-discovery
70
- */
71
- async initializeMCP() {
72
- if (this.mcpInitializing || this.mcpInitFailed) {
73
- return;
74
- }
75
- this.mcpInitializing = true;
76
- try {
77
- mcpLogger.info("[AgentEnhancedProvider] Initializing MCP integration...");
78
- this.mcpSystem = new UnifiedMCPSystem({
79
- configPath: this.config.mcpDiscoveryOptions?.configFiles?.[0] ||
80
- ".mcp-config.json",
81
- enableExternalServers: true,
82
- enableInternalServers: true,
83
- autoInitialize: false,
84
- });
85
- // ADD TIMEOUT to prevent hanging forever
86
- const initPromise = this.mcpSystem.initialize();
87
- const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error("MCP initialization timeout after 15 seconds")), this.config.mcpInitTimeoutMs || 15000));
88
- await Promise.race([initPromise, timeoutPromise]);
89
- this.mcpInitialized = true;
90
- mcpLogger.info("[AgentEnhancedProvider] MCP integration initialized successfully");
91
- }
92
- catch (error) {
93
- mcpLogger.error("[AgentEnhancedProvider] Failed to initialize MCP:", error);
94
- this.mcpSystem = null;
95
- this.mcpInitialized = false;
96
- this.mcpInitFailed = true;
97
- // Don't throw - continue with direct tools only
98
- }
99
- finally {
100
- this.mcpInitializing = false;
101
- }
102
- }
103
- /**
104
- * Get combined tools: direct tools + MCP tools
105
- */
106
- async getCombinedTools() {
107
- const directTools = this.config.enableTools
108
- ? getToolsForCategory(this.config.toolCategory)
109
- : {};
110
- // If MCP is disabled or failed to initialize, return only direct tools
111
- if (!this.config.enableMCP || !this.mcpSystem) {
112
- return directTools;
113
- }
114
- // Get MCP tools if available
115
- const mcpTools = {};
116
- try {
117
- // Skip if MCP failed to initialize or is still initializing
118
- if (this.mcpInitFailed ||
119
- this.mcpInitializing ||
120
- !this.mcpInitialized ||
121
- !this.mcpSystem) {
122
- return directTools;
123
- }
124
- const mcpToolInfos = await this.mcpSystem.listTools();
125
- // Convert MCP tools to AI SDK format
126
- for (const toolInfo of mcpToolInfos) {
127
- const toolKey = `mcp_${toolInfo.name}`;
128
- mcpTools[toolKey] = {
129
- description: toolInfo.description || `MCP tool: ${toolInfo.name}`,
130
- parameters: toolInfo.inputSchema || {},
131
- execute: async (args) => {
132
- let timeoutId;
133
- try {
134
- // Create timeout controller for tool execution if configured
135
- const toolTimeout = this.config.toolExecutionTimeout;
136
- const toolAbortController = toolTimeout
137
- ? new AbortController()
138
- : undefined;
139
- if (toolAbortController && toolTimeout) {
140
- const timeoutMs = typeof toolTimeout === "string"
141
- ? parseTimeout(toolTimeout)
142
- : toolTimeout;
143
- timeoutId = setTimeout(() => {
144
- toolAbortController.abort();
145
- }, timeoutMs);
146
- }
147
- const context = {
148
- sessionId: "cli-session",
149
- userId: "cli-user",
150
- secureFS: {
151
- readFile: async (path, encoding) => {
152
- const fs = await import("fs/promises");
153
- return encoding
154
- ? fs.readFile(path, {
155
- encoding: encoding,
156
- })
157
- : fs.readFile(path);
158
- },
159
- writeFile: async (path, content) => {
160
- const fs = await import("fs/promises");
161
- await fs.writeFile(path, content);
162
- },
163
- readdir: async (path) => {
164
- const fs = await import("fs/promises");
165
- return fs.readdir(path);
166
- },
167
- stat: async (path) => {
168
- const fs = await import("fs/promises");
169
- return fs.stat(path);
170
- },
171
- mkdir: async (path, options) => {
172
- const fs = await import("fs/promises");
173
- await fs.mkdir(path, options);
174
- },
175
- exists: async (path) => {
176
- const fs = await import("fs/promises");
177
- try {
178
- await fs.access(path);
179
- return true;
180
- }
181
- catch {
182
- return false;
183
- }
184
- },
185
- },
186
- path: {
187
- join: (...paths) => {
188
- const path = require("path");
189
- return path.join(...paths);
190
- },
191
- resolve: (...paths) => {
192
- const path = require("path");
193
- return path.resolve(...paths);
194
- },
195
- relative: (from, to) => {
196
- const path = require("path");
197
- return path.relative(from, to);
198
- },
199
- dirname: (path) => {
200
- const pathLib = require("path");
201
- return pathLib.dirname(path);
202
- },
203
- basename: (path, ext) => {
204
- const pathLib = require("path");
205
- return pathLib.basename(path, ext);
206
- },
207
- },
208
- grantedPermissions: ["read", "write", "execute"],
209
- log: (level, message, data) => {
210
- const logFn = mcpLogger[level];
211
- if (typeof logFn === "function") {
212
- if (data) {
213
- logFn(`${message} ${JSON.stringify(data)}`);
214
- }
215
- else {
216
- logFn(message);
217
- }
218
- }
219
- },
220
- };
221
- const toolPromise = this.mcpSystem.executeTool(toolInfo.name, args, context);
222
- let result;
223
- if (toolAbortController) {
224
- // Race between tool execution and timeout
225
- result = await Promise.race([
226
- toolPromise,
227
- new Promise((_, reject) => {
228
- toolAbortController.signal.addEventListener("abort", () => {
229
- reject(new Error(`Tool ${toolInfo.name} timed out after ${this.config.toolExecutionTimeout}`));
230
- });
231
- }),
232
- ]);
233
- }
234
- else {
235
- result = await toolPromise;
236
- }
237
- // Clear timeout if successful
238
- if (timeoutId) {
239
- clearTimeout(timeoutId);
240
- }
241
- return result.data || result;
242
- }
243
- catch (error) {
244
- // Clear timeout on error
245
- if (timeoutId) {
246
- clearTimeout(timeoutId);
247
- }
248
- mcpLogger.error(`MCP tool ${toolInfo.name} execution failed:`, error);
249
- throw error;
250
- }
251
- },
252
- };
253
- }
254
- mcpLogger.info(`[AgentEnhancedProvider] Loaded ${Object.keys(mcpTools).length} MCP tools`);
255
- }
256
- catch (error) {
257
- mcpLogger.error("[AgentEnhancedProvider] Failed to load MCP tools:", error);
258
- }
259
- return { ...directTools, ...mcpTools };
260
- }
261
- async generateText(optionsOrPrompt) {
262
- const startTime = Date.now();
263
- const options = typeof optionsOrPrompt === "string"
264
- ? { prompt: optionsOrPrompt }
265
- : optionsOrPrompt;
266
- const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt, schema, timeout, } = options;
267
- // Get combined tools (direct + MCP) if enabled
268
- const tools = this.config.enableTools ? await this.getCombinedTools() : {};
269
- const log = (msg, data) => {
270
- mcpLogger.info(`[AgentEnhancedProvider] ${msg}`, data ? JSON.stringify(data, null, 2) : "");
271
- };
272
- log("Starting text generation", {
273
- prompt: prompt.substring(0, 100),
274
- toolsCount: Object.keys(tools).length,
275
- maxSteps: this.config.maxSteps,
276
- });
277
- try {
278
- // Parse timeout if provided
279
- let abortSignal;
280
- if (timeout) {
281
- const timeoutMs = typeof timeout === "string" ? parseTimeout(timeout) : timeout;
282
- if (timeoutMs !== undefined) {
283
- abortSignal = AbortSignal.timeout(timeoutMs);
284
- }
285
- }
286
- // The AI SDK with maxSteps automatically handles tool calling and result integration
287
- const result = await generateText({
288
- model: this.model,
289
- prompt: systemPrompt
290
- ? `System: ${systemPrompt}\n\nUser: ${prompt}`
291
- : prompt,
292
- tools,
293
- maxSteps: this.config.maxSteps, // This enables automatic tool calling
294
- temperature,
295
- maxTokens,
296
- toolChoice: this.shouldForceToolUsage(prompt) ? "required" : "auto",
297
- abortSignal, // Pass abort signal for timeout support
298
- });
299
- log("Generation completed", {
300
- text: result.text?.substring(0, 200),
301
- finishReason: result.finishReason,
302
- toolCallsCount: result.toolCalls?.length || 0,
303
- toolResultsCount: result.toolResults?.length || 0,
304
- stepsCount: result.steps?.length || 0,
305
- });
306
- // Check if tools were called but no final text was generated
307
- if (result.finishReason === "tool-calls" &&
308
- !result.text &&
309
- result.toolResults?.length > 0) {
310
- log("Tools called but no final text generated, creating summary response");
311
- try {
312
- // Extract tool results and create a summary prompt
313
- let toolResultsSummary = "";
314
- if (result.toolResults) {
315
- for (const toolResult of result.toolResults) {
316
- const resultData = toolResult.result || toolResult;
317
- // Try to extract meaningful data from the result
318
- if (typeof resultData === "object" && resultData !== null) {
319
- if (resultData.success && resultData.items) {
320
- // This looks like a filesystem listing
321
- toolResultsSummary += `Directory listing for ${resultData.path}:\n`;
322
- for (const item of resultData.items) {
323
- toolResultsSummary += `- ${item.name} (${item.type})\n`;
324
- }
325
- }
326
- else {
327
- toolResultsSummary += JSON.stringify(resultData, null, 2);
328
- }
329
- }
330
- else {
331
- toolResultsSummary += String(resultData);
332
- }
333
- toolResultsSummary += "\n\n";
334
- }
335
- }
336
- log("Tool results extracted", {
337
- summaryLength: toolResultsSummary.length,
338
- preview: toolResultsSummary.substring(0, 200),
339
- });
340
- // Create a simple, direct summary
341
- const finalText = `Based on the user request "${prompt}", here's what I found:\n\n${toolResultsSummary}`;
342
- log("Final text created", {
343
- textLength: finalText.length,
344
- preview: finalText.substring(0, 200),
345
- });
346
- // Return result with the formatted text
347
- return {
348
- ...result,
349
- text: finalText,
350
- finishReason: "stop",
351
- };
352
- }
353
- catch (error) {
354
- log("Error in summary generation", {
355
- error: error instanceof Error ? error.message : String(error),
356
- });
357
- // Fallback: return raw tool results
358
- const fallbackText = `Tool execution completed. Raw results: ${JSON.stringify(result.toolResults, null, 2)}`;
359
- return {
360
- ...result,
361
- text: fallbackText,
362
- finishReason: "stop",
363
- };
364
- }
365
- }
366
- // Add analytics if enabled
367
- if (options.enableAnalytics) {
368
- result.analytics = createAnalytics(this.config.provider, this.resolvedModelName, result, Date.now() - startTime, options.context);
369
- }
370
- // Add evaluation if enabled
371
- if (options.enableEvaluation) {
372
- result.evaluation = await evaluateResponse(prompt, result.text, options.context);
373
- }
374
- // Return the full result - the AI SDK has already handled tool execution and integration
375
- return result;
376
- }
377
- catch (error) {
378
- console.error("[AgentEnhancedProvider] generateText error:", error);
379
- throw error;
380
- }
381
- }
382
- async streamText(optionsOrPrompt) {
383
- const options = typeof optionsOrPrompt === "string"
384
- ? { prompt: optionsOrPrompt }
385
- : optionsOrPrompt;
386
- const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt, timeout,
387
- // Phase 2: Enhanced streaming options
388
- enableProgressTracking, progressCallback, includeStreamingMetadata, streamingBufferSize, enableStreamingHeaders, customStreamingConfig, } = options;
389
- // Phase 2.1: Setup streaming enhancements
390
- const streamId = `agent_stream_${Date.now()}`;
391
- const streamingConfig = StreamingEnhancer.createStreamingConfig(options);
392
- if (enableProgressTracking) {
393
- StreamingMonitor.registerStream(streamId);
394
- }
395
- // Get combined tools (direct + MCP) if enabled
396
- const tools = this.config.enableTools ? await this.getCombinedTools() : {};
397
- try {
398
- // Parse timeout if provided
399
- let abortSignal;
400
- if (timeout) {
401
- const timeoutMs = typeof timeout === "string" ? parseTimeout(timeout) : timeout;
402
- if (timeoutMs !== undefined) {
403
- abortSignal = AbortSignal.timeout(timeoutMs);
404
- }
405
- }
406
- const result = await streamText({
407
- model: this.model,
408
- prompt: systemPrompt
409
- ? `System: ${systemPrompt}\n\nUser: ${prompt}`
410
- : prompt,
411
- tools,
412
- maxSteps: this.config.maxSteps,
413
- temperature,
414
- maxTokens,
415
- toolChoice: this.shouldForceToolUsage(prompt) ? "required" : "auto",
416
- abortSignal, // Pass abort signal for timeout support
417
- });
418
- // Phase 2.1: Apply streaming enhancements if enabled
419
- if (streamingConfig.progressTracking && result.textStream) {
420
- const enhancedCallback = streamingConfig.callback
421
- ? (progress) => {
422
- StreamingMonitor.updateStream(streamId, progress);
423
- streamingConfig.callback(progress);
424
- if (progress.phase === "complete") {
425
- StreamingMonitor.completeStream(streamId);
426
- }
427
- }
428
- : undefined;
429
- // Enhance the stream with progress tracking
430
- const enhancedStream = StreamingEnhancer.addProgressTracking(result.textStream, enhancedCallback, { streamId, bufferSize: streamingConfig.bufferSize });
431
- // Return enhanced result with tracking
432
- return {
433
- ...result,
434
- textStream: enhancedStream,
435
- // Phase 2.1: Add streaming metadata
436
- streamingMetadata: streamingConfig.metadata
437
- ? {
438
- streamId,
439
- provider: this.getProviderName(),
440
- model: this.getModelName(),
441
- enabledFeatures: {
442
- progressTracking: true,
443
- metadata: streamingConfig.metadata,
444
- headers: streamingConfig.headers,
445
- },
446
- }
447
- : undefined,
448
- };
449
- }
450
- return result;
451
- }
452
- catch (error) {
453
- console.error("[AgentEnhancedProvider] streamText error:", error);
454
- throw error;
455
- }
456
- }
457
- /**
458
- * Determine if we should force tool usage based on prompt patterns
459
- */
460
- shouldForceToolUsage(prompt) {
461
- const forceToolPatterns = [
462
- /what time is it/i,
463
- /current time/i,
464
- /list files/i,
465
- /read file/i,
466
- /directory/i,
467
- /calculate/i,
468
- /math/i,
469
- /search for/i,
470
- /find files/i,
471
- ];
472
- return forceToolPatterns.some((pattern) => pattern.test(prompt));
473
- }
474
- getCapabilities() {
475
- return [
476
- "text-generation",
477
- "streaming",
478
- "tool-calling",
479
- "agent-functionality",
480
- ];
481
- }
482
- getProviderName() {
483
- return `agent-${this.config.provider}`;
484
- }
485
- getModelName() {
486
- return this.config.model || `default-${this.config.provider}-model`;
487
- }
488
- /**
489
- * Test agent functionality
490
- */
491
- async testAgentCapabilities() {
492
- const testPrompts = [
493
- "What time is it right now?",
494
- "List files in current directory",
495
- "Calculate 15 * 7",
496
- "What is the square root of 144?",
497
- ];
498
- const results = [];
499
- let successCount = 0;
500
- for (const prompt of testPrompts) {
501
- try {
502
- logger.debug(`Testing: "${prompt}"`);
503
- const result = await this.generateText(prompt);
504
- if (!result) {
505
- results.push({
506
- prompt,
507
- success: false,
508
- error: "No result returned from generateText",
509
- });
510
- logger.warn(`❌ No result returned`);
511
- continue;
512
- }
513
- const toolsCalled = result.toolCalls?.length || 0;
514
- const success = toolsCalled > 0;
515
- if (success) {
516
- successCount++;
517
- }
518
- results.push({
519
- prompt,
520
- success,
521
- toolsCalled,
522
- response: result.text.substring(0, 100) + "...",
523
- });
524
- logger.debug(`✅ Tools called: ${toolsCalled}, Response: ${result.text.substring(0, 50)}...`);
525
- }
526
- catch (error) {
527
- results.push({
528
- prompt,
529
- success: false,
530
- error: error instanceof Error ? error.message : String(error),
531
- });
532
- logger.error(`❌ Error: ${error}`);
533
- }
534
- }
535
- return {
536
- success: successCount > 0,
537
- results,
538
- };
539
- }
540
- /**
541
- * Create agent-enhanced provider factory
542
- */
543
- static createAgent(config) {
544
- return new AgentEnhancedProvider(config);
545
- }
546
- /**
547
- * Create multiple agent providers for comparison
548
- */
549
- static createMultiProviderAgents() {
550
- const providers = {};
551
- // Only create providers that have API keys configured
552
- if (process.env.GOOGLE_AI_API_KEY) {
553
- providers["google-ai"] = new AgentEnhancedProvider({
554
- provider: "google-ai",
555
- });
556
- }
557
- if (process.env.OPENAI_API_KEY) {
558
- providers["openai"] = new AgentEnhancedProvider({ provider: "openai" });
559
- }
560
- if (process.env.ANTHROPIC_API_KEY) {
561
- providers["anthropic"] = new AgentEnhancedProvider({
562
- provider: "anthropic",
563
- });
564
- }
565
- return providers;
566
- }
567
- /**
568
- * Alias for generateText() - CLI-SDK consistency
569
- */
570
- async generate(optionsOrPrompt, analysisSchema) {
571
- return this.generateText(optionsOrPrompt);
572
- }
573
- /**
574
- * Short alias for generateText() - CLI-SDK consistency
575
- */
576
- async gen(optionsOrPrompt, analysisSchema) {
577
- return this.generateText(optionsOrPrompt);
578
- }
579
- }
580
- /**
581
- * Helper function to create agent provider
582
- */
583
- export function createAgentProvider(provider, options) {
584
- return new AgentEnhancedProvider({
585
- provider,
586
- ...options,
587
- });
588
- }
589
- /**
590
- * Test all available agent providers
591
- */
592
- export async function testAllAgentProviders() {
593
- logger.info("🧪 Testing All Agent Providers\n");
594
- const providers = AgentEnhancedProvider.createMultiProviderAgents();
595
- if (Object.keys(providers).length === 0) {
596
- logger.warn("❌ No API keys found. Please configure at least one provider.");
597
- return;
598
- }
599
- for (const [name, provider] of Object.entries(providers)) {
600
- logger.info(`\n🔬 Testing ${name.toUpperCase()} Agent Provider:`);
601
- try {
602
- const testResult = await provider.testAgentCapabilities();
603
- if (testResult.success) {
604
- logger.info(`✅ ${name} agent provider working correctly`);
605
- }
606
- else {
607
- logger.warn(`❌ ${name} agent provider failed tests`);
608
- }
609
- }
610
- catch (error) {
611
- logger.error(`❌ ${name} provider error:`, error);
612
- }
613
- }
614
- }
@@ -1,19 +0,0 @@
1
- import type { ZodType, ZodTypeDef } from "zod";
2
- import { type StreamTextResult, type ToolSet, type Schema, type GenerateTextResult } from "ai";
3
- import type { AIProvider, TextGenerationOptions, StreamTextOptions, EnhancedGenerateTextResult } from "../core/types.js";
4
- export declare class AmazonBedrock implements AIProvider {
5
- private modelName;
6
- private model;
7
- private bedrock;
8
- constructor(modelName?: string | null);
9
- streamText(optionsOrPrompt: StreamTextOptions | string, analysisSchema?: ZodType<unknown, ZodTypeDef, unknown> | Schema<unknown>): Promise<StreamTextResult<ToolSet, unknown> | null>;
10
- generateText(optionsOrPrompt: TextGenerationOptions | string, analysisSchema?: ZodType<unknown, ZodTypeDef, unknown> | Schema<unknown>): Promise<GenerateTextResult<ToolSet, unknown> | null>;
11
- /**
12
- * Alias for generateText() - CLI-SDK consistency
13
- */
14
- generate(optionsOrPrompt: TextGenerationOptions | string, analysisSchema?: ZodType<unknown, ZodTypeDef, unknown> | Schema<unknown>): Promise<EnhancedGenerateTextResult | null>;
15
- /**
16
- * Short alias for generateText() - CLI-SDK consistency
17
- */
18
- gen(optionsOrPrompt: TextGenerationOptions | string, analysisSchema?: ZodType<unknown, ZodTypeDef, unknown> | Schema<unknown>): Promise<EnhancedGenerateTextResult | null>;
19
- }