@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
@@ -0,0 +1,72 @@
1
+ import type { AIProvider, AIProviderName } from "../core/types.js";
2
+ /**
3
+ * Provider constructor interface - supports both sync constructors and async factory functions
4
+ */
5
+ type ProviderConstructor = {
6
+ new (modelName?: string, providerName?: any, sdk?: any): AIProvider;
7
+ } | ((modelName?: string, providerName?: any, sdk?: any) => Promise<AIProvider>);
8
+ /**
9
+ * Provider registration entry
10
+ */
11
+ interface ProviderRegistration {
12
+ constructor: ProviderConstructor;
13
+ defaultModel?: string;
14
+ aliases?: string[];
15
+ }
16
+ /**
17
+ * True Factory Pattern implementation for AI Providers
18
+ * Uses registration-based approach to eliminate switch statements
19
+ * and enable dynamic provider registration
20
+ */
21
+ export declare class ProviderFactory {
22
+ private static readonly providers;
23
+ private static initialized;
24
+ /**
25
+ * Register a provider with the factory
26
+ */
27
+ static registerProvider(name: AIProviderName | string, constructor: ProviderConstructor, defaultModel?: string, // Optional - provider can read from env
28
+ aliases?: string[]): void;
29
+ /**
30
+ * Create a provider instance
31
+ */
32
+ static createProvider(providerName: AIProviderName | string, modelName?: string, sdk?: any): Promise<AIProvider>;
33
+ /**
34
+ * Check if a provider is registered
35
+ */
36
+ static hasProvider(providerName: string): boolean;
37
+ /**
38
+ * Get list of available providers
39
+ */
40
+ static getAvailableProviders(): string[];
41
+ /**
42
+ * Get provider registration info
43
+ */
44
+ static getProviderInfo(providerName: string): ProviderRegistration | undefined;
45
+ /**
46
+ * Normalize provider names using aliases (PHASE 1: Factory Pattern)
47
+ */
48
+ static normalizeProviderName(providerName: string): string | null;
49
+ /**
50
+ * Clear all registrations (mainly for testing)
51
+ */
52
+ static clearRegistrations(): void;
53
+ /**
54
+ * Ensure providers are initialized
55
+ */
56
+ private static ensureInitialized;
57
+ /**
58
+ * Initialize default providers
59
+ * NOTE: Providers are now registered by ProviderRegistry to avoid circular dependencies
60
+ */
61
+ private static initializeDefaultProviders;
62
+ /**
63
+ * Create the best available provider for the given name
64
+ * Used by NeuroLink SDK for streaming and generation
65
+ */
66
+ static createBestProvider(providerName: AIProviderName | string, modelName?: string, enableMCP?: boolean, sdk?: any): Promise<AIProvider>;
67
+ }
68
+ /**
69
+ * Helper function to create providers with backward compatibility
70
+ */
71
+ export declare function createAIProvider(providerName: AIProviderName | string, modelName?: string): Promise<AIProvider>;
72
+ export {};
@@ -0,0 +1,144 @@
1
+ import { logger } from "../utils/logger.js";
2
+ /**
3
+ * True Factory Pattern implementation for AI Providers
4
+ * Uses registration-based approach to eliminate switch statements
5
+ * and enable dynamic provider registration
6
+ */
7
+ export class ProviderFactory {
8
+ static providers = new Map();
9
+ static initialized = false;
10
+ /**
11
+ * Register a provider with the factory
12
+ */
13
+ static registerProvider(name, constructor, defaultModel, // Optional - provider can read from env
14
+ aliases = []) {
15
+ const registration = {
16
+ constructor,
17
+ defaultModel,
18
+ aliases,
19
+ };
20
+ // Register main name
21
+ this.providers.set(name.toLowerCase(), registration);
22
+ // Register aliases
23
+ aliases.forEach((alias) => {
24
+ this.providers.set(alias.toLowerCase(), registration);
25
+ });
26
+ logger.debug(`Registered provider: ${name} with model ${defaultModel || "from-env"}`);
27
+ }
28
+ /**
29
+ * Create a provider instance
30
+ */
31
+ static async createProvider(providerName, modelName, sdk) {
32
+ // Note: Providers are registered explicitly by ProviderRegistry to avoid circular dependencies
33
+ const normalizedName = providerName.toLowerCase();
34
+ const registration = this.providers.get(normalizedName);
35
+ if (!registration) {
36
+ throw new Error(`Unknown provider: ${providerName}. Available providers: ${this.getAvailableProviders().join(", ")}`);
37
+ }
38
+ const model = modelName || registration.defaultModel;
39
+ try {
40
+ // Check if constructor is an async factory function or a class constructor
41
+ if (typeof registration.constructor === "function") {
42
+ // Check if it has a prototype (class constructor) or not (factory function)
43
+ if (registration.constructor.prototype &&
44
+ registration.constructor.prototype.constructor ===
45
+ registration.constructor) {
46
+ // It's a class constructor
47
+ return new registration.constructor(model, providerName, sdk);
48
+ }
49
+ else {
50
+ // It's a factory function - call it and await if it returns a promise
51
+ const result = registration.constructor(model, providerName, sdk);
52
+ if (result && typeof result.then === "function") {
53
+ // It's a Promise (async factory)
54
+ return await result;
55
+ }
56
+ else {
57
+ // It's a sync result, return it
58
+ return result;
59
+ }
60
+ }
61
+ }
62
+ else {
63
+ // Fallback - use as class constructor
64
+ return new registration.constructor(model, sdk);
65
+ }
66
+ }
67
+ catch (error) {
68
+ logger.error(`Failed to create provider ${providerName}:`, error);
69
+ throw new Error(`Failed to create provider ${providerName}: ${error}`);
70
+ }
71
+ }
72
+ /**
73
+ * Check if a provider is registered
74
+ */
75
+ static hasProvider(providerName) {
76
+ return this.providers.has(providerName.toLowerCase());
77
+ }
78
+ /**
79
+ * Get list of available providers
80
+ */
81
+ static getAvailableProviders() {
82
+ return Array.from(this.providers.keys()).filter((name, index, arr) => arr.indexOf(name) === index);
83
+ }
84
+ /**
85
+ * Get provider registration info
86
+ */
87
+ static getProviderInfo(providerName) {
88
+ return this.providers.get(providerName.toLowerCase());
89
+ }
90
+ /**
91
+ * Normalize provider names using aliases (PHASE 1: Factory Pattern)
92
+ */
93
+ static normalizeProviderName(providerName) {
94
+ const normalized = providerName.toLowerCase();
95
+ // Check direct registration
96
+ if (this.providers.has(normalized)) {
97
+ return normalized;
98
+ }
99
+ // Check aliases from all registrations
100
+ for (const [name, registration] of this.providers.entries()) {
101
+ if (registration.aliases?.includes(normalized)) {
102
+ return name;
103
+ }
104
+ }
105
+ return null;
106
+ }
107
+ /**
108
+ * Clear all registrations (mainly for testing)
109
+ */
110
+ static clearRegistrations() {
111
+ this.providers.clear();
112
+ this.initialized = false;
113
+ }
114
+ /**
115
+ * Ensure providers are initialized
116
+ */
117
+ static ensureInitialized() {
118
+ if (!this.initialized) {
119
+ this.initializeDefaultProviders();
120
+ this.initialized = true;
121
+ }
122
+ }
123
+ /**
124
+ * Initialize default providers
125
+ * NOTE: Providers are now registered by ProviderRegistry to avoid circular dependencies
126
+ */
127
+ static initializeDefaultProviders() {
128
+ logger.debug("BaseProvider factory pattern ready - providers registered by ProviderRegistry");
129
+ // No hardcoded registrations - all done dynamically by ProviderRegistry
130
+ }
131
+ /**
132
+ * Create the best available provider for the given name
133
+ * Used by NeuroLink SDK for streaming and generation
134
+ */
135
+ static async createBestProvider(providerName, modelName, enableMCP, sdk) {
136
+ return await this.createProvider(providerName, modelName, sdk);
137
+ }
138
+ }
139
+ /**
140
+ * Helper function to create providers with backward compatibility
141
+ */
142
+ export async function createAIProvider(providerName, modelName) {
143
+ return await ProviderFactory.createProvider(providerName, modelName);
144
+ }
@@ -0,0 +1,20 @@
1
+ import type { EnhancedProvider } from "../types/generate-types.js";
2
+ import type { AIProvider } from "../core/types.js";
3
+ /**
4
+ * Factory for enhancing providers with generate() capability using Proxy pattern
5
+ * Maintains 100% backward compatibility while adding new generate method
6
+ */
7
+ export declare class ProviderGenerateFactory {
8
+ /**
9
+ * Enhance any provider with generate() method using TypeScript Proxy
10
+ */
11
+ static enhanceProvider<T extends AIProvider>(provider: T): T & EnhancedProvider;
12
+ /**
13
+ * Create the generate() method that internally uses generateText for performance parity
14
+ */
15
+ private static createGenerateMethod;
16
+ /**
17
+ * Enhance all providers from a registry
18
+ */
19
+ static enhanceAllProviders(providers: Map<string, AIProvider>): Map<string, AIProvider & EnhancedProvider>;
20
+ }
@@ -0,0 +1,87 @@
1
+ import { CompatibilityConversionFactory } from "./compatibility-factory.js";
2
+ /**
3
+ * Factory for enhancing providers with generate() capability using Proxy pattern
4
+ * Maintains 100% backward compatibility while adding new generate method
5
+ */
6
+ export class ProviderGenerateFactory {
7
+ /**
8
+ * Enhance any provider with generate() method using TypeScript Proxy
9
+ */
10
+ static enhanceProvider(provider) {
11
+ return new Proxy(provider, {
12
+ get(target, prop, receiver) {
13
+ if (prop === "generate") {
14
+ return ProviderGenerateFactory.createGenerateMethod(target);
15
+ }
16
+ return Reflect.get(target, prop, receiver);
17
+ },
18
+ has(target, prop) {
19
+ if (prop === "generate") {
20
+ return true;
21
+ }
22
+ return Reflect.has(target, prop);
23
+ },
24
+ });
25
+ }
26
+ /**
27
+ * Create the generate() method that internally uses generateText for performance parity
28
+ */
29
+ static createGenerateMethod(provider) {
30
+ return async (options) => {
31
+ // Validate input
32
+ if (!options.input?.text) {
33
+ throw new Error("Generate options must include input.text");
34
+ }
35
+ // Convert GenerateOptions to TextGenerationOptions
36
+ const textOptions = CompatibilityConversionFactory.convertGenerateToText_Options(options);
37
+ try {
38
+ // Use existing generate method for identical performance
39
+ const textResult = await provider.generate(textOptions);
40
+ // Convert back to GenerateResult format with type safety
41
+ const generateResult = {
42
+ content: textResult?.content || "",
43
+ outputs: { text: textResult?.content || "" },
44
+ provider: textResult?.provider,
45
+ model: textResult?.model,
46
+ usage: textResult?.usage
47
+ ? {
48
+ inputTokens: textResult.usage?.promptTokens || 0,
49
+ outputTokens: textResult.usage?.completionTokens || 0,
50
+ totalTokens: textResult.usage?.totalTokens || 0,
51
+ }
52
+ : undefined,
53
+ responseTime: textResult?.responseTime,
54
+ toolsUsed: textResult?.toolsUsed,
55
+ toolExecutions: textResult?.toolExecutions?.map((te) => ({
56
+ name: te.toolName || te.name || "",
57
+ input: te.input || {},
58
+ output: te.output || te.result,
59
+ duration: te.executionTime || te.duration || 0,
60
+ })),
61
+ enhancedWithTools: textResult?.enhancedWithTools,
62
+ availableTools: textResult?.availableTools?.map((at) => ({
63
+ name: at.name || "",
64
+ description: at.description || "",
65
+ parameters: at.parameters || {},
66
+ })),
67
+ analytics: textResult?.analytics,
68
+ evaluation: textResult?.evaluation,
69
+ };
70
+ return generateResult;
71
+ }
72
+ catch (error) {
73
+ throw new Error(`Generate method failed: ${error}`);
74
+ }
75
+ };
76
+ }
77
+ /**
78
+ * Enhance all providers from a registry
79
+ */
80
+ static enhanceAllProviders(providers) {
81
+ const enhancedProviders = new Map();
82
+ for (const [name, provider] of providers) {
83
+ enhancedProviders.set(name, this.enhanceProvider(provider));
84
+ }
85
+ return enhancedProviders;
86
+ }
87
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Configuration options for the provider registry
3
+ */
4
+ export interface ProviderRegistryOptions {
5
+ /**
6
+ * Enable loading of manual MCP configurations from .mcp-config.json
7
+ * Should only be true for CLI mode, false for SDK mode
8
+ */
9
+ enableManualMCP?: boolean;
10
+ }
11
+ /**
12
+ * Provider Registry - registers all providers with the factory
13
+ * This is where we migrate providers one by one to the new pattern
14
+ */
15
+ export declare class ProviderRegistry {
16
+ private static registered;
17
+ private static options;
18
+ /**
19
+ * Register all providers with the factory
20
+ */
21
+ static registerAllProviders(): Promise<void>;
22
+ /**
23
+ * Check if providers are registered
24
+ */
25
+ static isRegistered(): boolean;
26
+ /**
27
+ * Clear registrations (for testing)
28
+ */
29
+ static clearRegistrations(): void;
30
+ /**
31
+ * Set registry options (should be called before initialization)
32
+ */
33
+ static setOptions(options: ProviderRegistryOptions): void;
34
+ /**
35
+ * Get current registry options
36
+ */
37
+ static getOptions(): ProviderRegistryOptions;
38
+ }
@@ -0,0 +1,107 @@
1
+ import { ProviderFactory } from "./provider-factory.js";
2
+ // ✅ FINAL CIRCULAR DEPENDENCY FIX: Lazy loading all providers
3
+ // Removed all static imports - providers loaded dynamically when needed
4
+ // This breaks the circular dependency chain completely
5
+ import { AIProviderName, GoogleAIModels, OpenAIModels } from "../core/types.js";
6
+ import { logger } from "../utils/logger.js";
7
+ /**
8
+ * Provider Registry - registers all providers with the factory
9
+ * This is where we migrate providers one by one to the new pattern
10
+ */
11
+ export class ProviderRegistry {
12
+ static registered = false;
13
+ static options = {
14
+ enableManualMCP: false, // Default to disabled for safety
15
+ };
16
+ /**
17
+ * Register all providers with the factory
18
+ */
19
+ static async registerAllProviders() {
20
+ if (this.registered) {
21
+ return;
22
+ }
23
+ try {
24
+ // ✅ LAZY LOADING: Register providers with dynamic import factory functions
25
+ const { ProviderFactory } = await import("./provider-factory.js");
26
+ // Register Google AI Studio Provider (our validated baseline)
27
+ ProviderFactory.registerProvider(AIProviderName.GOOGLE_AI, async (modelName, providerName, sdk) => {
28
+ const { GoogleAIStudioProvider } = await import("../providers/google-ai-studio.js");
29
+ return new GoogleAIStudioProvider(modelName, sdk);
30
+ }, GoogleAIModels.GEMINI_2_5_FLASH, ["google-ai-studio", "google", "gemini", "google-ai"]);
31
+ // Register OpenAI provider
32
+ ProviderFactory.registerProvider(AIProviderName.OPENAI, async (modelName, providerName, sdk) => {
33
+ const { OpenAIProvider } = await import("../providers/openAI.js");
34
+ return new OpenAIProvider(modelName);
35
+ }, OpenAIModels.GPT_4O_MINI, ["gpt", "chatgpt"]);
36
+ // Register Anthropic provider
37
+ ProviderFactory.registerProvider(AIProviderName.ANTHROPIC, async (modelName, providerName, sdk) => {
38
+ const { AnthropicProvider } = await import("../providers/anthropic.js");
39
+ return new AnthropicProvider(modelName, sdk);
40
+ }, "claude-3-5-sonnet-20241022", ["claude", "anthropic"]);
41
+ // Register Amazon Bedrock provider
42
+ ProviderFactory.registerProvider(AIProviderName.BEDROCK, async (modelName) => {
43
+ const { AmazonBedrockProvider } = await import("../providers/amazon-bedrock.js");
44
+ return new AmazonBedrockProvider(modelName);
45
+ }, undefined, // Let provider read BEDROCK_MODEL from .env
46
+ ["bedrock", "aws"]);
47
+ // Register Azure OpenAI provider
48
+ ProviderFactory.registerProvider(AIProviderName.AZURE, async (modelName) => {
49
+ const { AzureOpenAIProvider } = await import("../providers/azure-openai.js");
50
+ return new AzureOpenAIProvider(modelName);
51
+ }, "gpt-4o-mini", ["azure", "azure-openai"]);
52
+ // Register Google Vertex AI provider
53
+ ProviderFactory.registerProvider(AIProviderName.VERTEX, async (modelName) => {
54
+ const { GoogleVertexProvider } = await import("../providers/google-vertex.js");
55
+ return new GoogleVertexProvider(modelName);
56
+ }, "gemini-2.5-pro", ["vertex", "google-vertex"]);
57
+ // Register Hugging Face provider (Unified Router implementation)
58
+ ProviderFactory.registerProvider(AIProviderName.HUGGINGFACE, async (modelName) => {
59
+ const { HuggingFaceProvider } = await import("../providers/huggingFace.js");
60
+ return new HuggingFaceProvider(modelName);
61
+ }, process.env.HUGGINGFACE_MODEL || "microsoft/DialoGPT-medium", ["huggingface", "hf"]);
62
+ // Register Mistral AI provider
63
+ ProviderFactory.registerProvider(AIProviderName.MISTRAL, async (modelName, providerName, sdk) => {
64
+ const { MistralProvider } = await import("../providers/mistral.js");
65
+ return new MistralProvider(modelName, sdk);
66
+ }, "mistral-large-latest", ["mistral"]);
67
+ // Register Ollama provider
68
+ ProviderFactory.registerProvider(AIProviderName.OLLAMA, async (modelName) => {
69
+ const { OllamaProvider } = await import("../providers/ollama.js");
70
+ return new OllamaProvider(modelName);
71
+ }, process.env.OLLAMA_MODEL || "llama3.1:8b", ["ollama", "local"]);
72
+ logger.debug("All providers registered successfully");
73
+ this.registered = true;
74
+ }
75
+ catch (error) {
76
+ logger.error("Failed to register providers:", error);
77
+ throw error;
78
+ }
79
+ }
80
+ /**
81
+ * Check if providers are registered
82
+ */
83
+ static isRegistered() {
84
+ return this.registered;
85
+ }
86
+ /**
87
+ * Clear registrations (for testing)
88
+ */
89
+ static clearRegistrations() {
90
+ ProviderFactory.clearRegistrations();
91
+ this.registered = false;
92
+ }
93
+ /**
94
+ * Set registry options (should be called before initialization)
95
+ */
96
+ static setOptions(options) {
97
+ this.options = { ...this.options, ...options };
98
+ logger.debug("Provider registry options updated:", this.options);
99
+ }
100
+ /**
101
+ * Get current registry options
102
+ */
103
+ static getOptions() {
104
+ return { ...this.options };
105
+ }
106
+ }
107
+ // Note: Providers are registered explicitly when needed to avoid circular dependencies
package/dist/index.d.ts CHANGED
@@ -9,13 +9,16 @@
9
9
  import { AIProviderFactory } from "./core/factory.js";
10
10
  export { AIProviderFactory };
11
11
  export type { AIProvider, AIProviderName, ProviderConfig, StreamingOptions, ProviderAttempt, SupportedModelName, } from "./core/types.js";
12
+ export type { GenerateOptions, GenerateResult, EnhancedProvider, } from "./types/generate-types.js";
13
+ export { CompatibilityConversionFactory } from "./factories/compatibility-factory.js";
14
+ export { ProviderGenerateFactory } from "./factories/provider-generate-factory.js";
15
+ export type { SimpleTool, ToolContext } from "./sdk/tool-registration.js";
16
+ export { createTool, createTypedTool, validateTool, } from "./sdk/tool-registration.js";
17
+ export type { InMemoryMCPServerConfig, InMemoryToolInfo, InMemoryToolResult, } from "./types/mcp-types.js";
12
18
  export { BedrockModels, OpenAIModels, VertexModels, DEFAULT_PROVIDER_CONFIGS, } from "./core/types.js";
13
- export { GoogleVertexAI, AmazonBedrock, OpenAI, AnthropicProvider, AzureOpenAIProvider, } from "./providers/index.js";
14
- export type { ProviderName } from "./providers/index.js";
15
- export { PROVIDERS, AVAILABLE_PROVIDERS } from "./providers/index.js";
16
19
  export { getBestProvider, getAvailableProviders, isValidProvider, } from "./utils/providerUtils.js";
17
20
  export { NeuroLink } from "./neurolink.js";
18
- export type { TextGenerationOptions, StreamTextOptions, TextGenerationResult, } from "./neurolink.js";
21
+ export type { ProviderStatus, MCPStatus, MCPServerInfo } from "./neurolink.js";
19
22
  export declare const VERSION = "1.0.0";
20
23
  /**
21
24
  * Quick start factory function
@@ -25,7 +28,7 @@ export declare const VERSION = "1.0.0";
25
28
  * import { createAIProvider } from '@juspay/neurolink';
26
29
  *
27
30
  * const provider = await createAIProvider('bedrock');
28
- * const result = await provider.streamText('Hello, AI!');
31
+ * const result = await provider.stream({ input: { text: 'Hello, AI!' } });
29
32
  * ```
30
33
  */
31
34
  export declare function createAIProvider(providerName?: string, modelName?: string): Promise<import("./core/types.js").AIProvider>;
package/dist/index.js CHANGED
@@ -9,14 +9,14 @@
9
9
  // Core exports
10
10
  import { AIProviderFactory } from "./core/factory.js";
11
11
  export { AIProviderFactory };
12
+ export { CompatibilityConversionFactory } from "./factories/compatibility-factory.js";
13
+ export { ProviderGenerateFactory } from "./factories/provider-generate-factory.js";
14
+ export { createTool, createTypedTool, validateTool, } from "./sdk/tool-registration.js";
12
15
  // Model enums
13
16
  export { BedrockModels, OpenAIModels, VertexModels, DEFAULT_PROVIDER_CONFIGS, } from "./core/types.js";
14
- // Provider exports
15
- export { GoogleVertexAI, AmazonBedrock, OpenAI, AnthropicProvider, AzureOpenAIProvider, } from "./providers/index.js";
16
- export { PROVIDERS, AVAILABLE_PROVIDERS } from "./providers/index.js";
17
17
  // Utility exports
18
18
  export { getBestProvider, getAvailableProviders, isValidProvider, } from "./utils/providerUtils.js";
19
- // Main NeuroLink wrapper class
19
+ // Main NeuroLink wrapper class and diagnostic types
20
20
  export { NeuroLink } from "./neurolink.js";
21
21
  // Version
22
22
  export const VERSION = "1.0.0";
@@ -28,7 +28,7 @@ export const VERSION = "1.0.0";
28
28
  * import { createAIProvider } from '@juspay/neurolink';
29
29
  *
30
30
  * const provider = await createAIProvider('bedrock');
31
- * const result = await provider.streamText('Hello, AI!');
31
+ * const result = await provider.stream({ input: { text: 'Hello, AI!' } });
32
32
  * ```
33
33
  */
34
34
  export async function createAIProvider(providerName, modelName) {
@@ -220,8 +220,8 @@ export declare const directAgentTools: {
220
220
  mode: z.ZodDefault<z.ZodEnum<["create", "overwrite", "append"]>>;
221
221
  }, "strip", z.ZodTypeAny, {
222
222
  path: string;
223
- mode: "create" | "overwrite" | "append";
224
223
  content: string;
224
+ mode: "create" | "overwrite" | "append";
225
225
  }, {
226
226
  path: string;
227
227
  content: string;
@@ -250,8 +250,8 @@ export declare const directAgentTools: {
250
250
  }> & {
251
251
  execute: (args: {
252
252
  path: string;
253
- mode: "create" | "overwrite" | "append";
254
253
  content: string;
254
+ mode: "create" | "overwrite" | "append";
255
255
  }, options: import("ai").ToolExecutionOptions) => PromiseLike<{
256
256
  success: boolean;
257
257
  error: string;
@@ -563,8 +563,8 @@ export declare function getToolsForCategory(category?: "basic" | "filesystem" |
563
563
  mode: z.ZodDefault<z.ZodEnum<["create", "overwrite", "append"]>>;
564
564
  }, "strip", z.ZodTypeAny, {
565
565
  path: string;
566
- mode: "create" | "overwrite" | "append";
567
566
  content: string;
567
+ mode: "create" | "overwrite" | "append";
568
568
  }, {
569
569
  path: string;
570
570
  content: string;
@@ -593,8 +593,8 @@ export declare function getToolsForCategory(category?: "basic" | "filesystem" |
593
593
  }> & {
594
594
  execute: (args: {
595
595
  path: string;
596
- mode: "create" | "overwrite" | "append";
597
596
  content: string;
597
+ mode: "create" | "overwrite" | "append";
598
598
  }, options: import("ai").ToolExecutionOptions) => PromiseLike<{
599
599
  success: boolean;
600
600
  error: string;
@@ -907,8 +907,8 @@ export declare function getToolsForCategory(category?: "basic" | "filesystem" |
907
907
  mode: z.ZodDefault<z.ZodEnum<["create", "overwrite", "append"]>>;
908
908
  }, "strip", z.ZodTypeAny, {
909
909
  path: string;
910
- mode: "create" | "overwrite" | "append";
911
910
  content: string;
911
+ mode: "create" | "overwrite" | "append";
912
912
  }, {
913
913
  path: string;
914
914
  content: string;
@@ -937,8 +937,8 @@ export declare function getToolsForCategory(category?: "basic" | "filesystem" |
937
937
  }> & {
938
938
  execute: (args: {
939
939
  path: string;
940
- mode: "create" | "overwrite" | "append";
941
940
  content: string;
941
+ mode: "create" | "overwrite" | "append";
942
942
  }, options: import("ai").ToolExecutionOptions) => PromiseLike<{
943
943
  success: boolean;
944
944
  error: string;
@@ -42,14 +42,15 @@ export class SSEChatHandler {
42
42
  data: { type: "start", sessionId, messageId: userMessage.id },
43
43
  });
44
44
  // Generate AI response with streaming
45
- const aiResponse = await this.provider.streamText({
46
- prompt: message,
45
+ const aiResponse = await this.provider.stream({
46
+ input: { text: message },
47
47
  temperature: options.temperature,
48
48
  maxTokens: options.maxTokens,
49
49
  systemPrompt: options.systemPrompt,
50
50
  });
51
- if (aiResponse?.textStream) {
52
- const reader = aiResponse.textStream.getReader();
51
+ if (aiResponse?.stream) {
52
+ // Convert async iterable to readable stream
53
+ const reader = aiResponse.stream;
53
54
  let fullResponse = "";
54
55
  try {
55
56
  while (true) {