@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.
- package/CHANGELOG.md +21 -9
- package/README.md +123 -126
- package/dist/agent/direct-tools.d.ts +6 -6
- package/dist/cli/commands/config.d.ts +3 -3
- package/dist/cli/commands/mcp.js +8 -7
- package/dist/cli/factories/command-factory.d.ts +4 -0
- package/dist/cli/factories/command-factory.js +63 -8
- package/dist/cli/index.js +87 -140
- package/dist/core/base-provider.d.ts +423 -0
- package/dist/core/base-provider.js +376 -0
- package/dist/core/constants.d.ts +2 -1
- package/dist/core/constants.js +2 -1
- package/dist/core/dynamic-models.d.ts +6 -6
- package/dist/core/evaluation.d.ts +19 -80
- package/dist/core/evaluation.js +185 -484
- package/dist/core/factory.d.ts +3 -3
- package/dist/core/factory.js +31 -91
- package/dist/core/service-registry.d.ts +47 -0
- package/dist/core/service-registry.js +112 -0
- package/dist/core/types.d.ts +8 -1
- package/dist/factories/compatibility-factory.js +1 -1
- package/dist/factories/provider-factory.d.ts +72 -0
- package/dist/factories/provider-factory.js +144 -0
- package/dist/factories/provider-registry.d.ts +38 -0
- package/dist/factories/provider-registry.js +107 -0
- package/dist/index.d.ts +4 -3
- package/dist/index.js +2 -4
- package/dist/lib/agent/direct-tools.d.ts +6 -6
- package/dist/lib/core/base-provider.d.ts +423 -0
- package/dist/lib/core/base-provider.js +376 -0
- package/dist/lib/core/constants.d.ts +2 -1
- package/dist/lib/core/constants.js +2 -1
- package/dist/lib/core/dynamic-models.d.ts +6 -6
- package/dist/lib/core/evaluation.d.ts +19 -80
- package/dist/lib/core/evaluation.js +185 -484
- package/dist/lib/core/factory.d.ts +3 -3
- package/dist/lib/core/factory.js +30 -91
- package/dist/lib/core/service-registry.d.ts +47 -0
- package/dist/lib/core/service-registry.js +112 -0
- package/dist/lib/core/types.d.ts +8 -1
- package/dist/lib/factories/compatibility-factory.js +1 -1
- package/dist/lib/factories/provider-factory.d.ts +72 -0
- package/dist/lib/factories/provider-factory.js +144 -0
- package/dist/lib/factories/provider-registry.d.ts +38 -0
- package/dist/lib/factories/provider-registry.js +107 -0
- package/dist/lib/index.d.ts +4 -3
- package/dist/lib/index.js +2 -4
- package/dist/lib/mcp/client.d.ts +1 -0
- package/dist/lib/mcp/client.js +1 -0
- package/dist/lib/mcp/config.js +28 -3
- package/dist/lib/mcp/context-manager.d.ts +1 -0
- package/dist/lib/mcp/context-manager.js +8 -4
- package/dist/lib/mcp/function-calling.d.ts +13 -0
- package/dist/lib/mcp/function-calling.js +134 -35
- package/dist/lib/mcp/initialize-tools.d.ts +1 -1
- package/dist/lib/mcp/initialize-tools.js +45 -1
- package/dist/lib/mcp/initialize.js +16 -6
- package/dist/lib/mcp/neurolink-mcp-client.d.ts +1 -0
- package/dist/lib/mcp/neurolink-mcp-client.js +21 -5
- package/dist/lib/mcp/servers/agent/direct-tools-server.d.ts +8 -0
- package/dist/lib/mcp/servers/agent/direct-tools-server.js +109 -0
- package/dist/lib/mcp/servers/ai-providers/ai-core-server.js +3 -1
- package/dist/lib/mcp/servers/ai-providers/ai-workflow-tools.d.ts +2 -2
- package/dist/lib/mcp/unified-registry.d.ts +4 -0
- package/dist/lib/mcp/unified-registry.js +42 -9
- package/dist/lib/neurolink.d.ts +156 -117
- package/dist/lib/neurolink.js +619 -404
- package/dist/lib/providers/amazon-bedrock.d.ts +32 -0
- package/dist/lib/providers/amazon-bedrock.js +143 -0
- package/dist/lib/providers/analytics-helper.js +7 -4
- package/dist/lib/providers/anthropic-baseprovider.d.ts +23 -0
- package/dist/lib/providers/anthropic-baseprovider.js +114 -0
- package/dist/lib/providers/anthropic.d.ts +19 -43
- package/dist/lib/providers/anthropic.js +82 -306
- package/dist/lib/providers/azure-openai.d.ts +20 -0
- package/dist/lib/providers/azure-openai.js +89 -0
- package/dist/lib/providers/function-calling-provider.d.ts +64 -2
- package/dist/lib/providers/function-calling-provider.js +208 -9
- package/dist/lib/providers/google-ai-studio.d.ts +23 -0
- package/dist/lib/providers/google-ai-studio.js +107 -0
- package/dist/lib/providers/google-vertex.d.ts +47 -0
- package/dist/lib/providers/google-vertex.js +205 -0
- package/dist/lib/providers/huggingFace.d.ts +32 -25
- package/dist/lib/providers/huggingFace.js +97 -431
- package/dist/lib/providers/index.d.ts +9 -9
- package/dist/lib/providers/index.js +9 -9
- package/dist/lib/providers/mcp-provider.js +24 -5
- package/dist/lib/providers/mistral.d.ts +42 -0
- package/dist/lib/providers/mistral.js +160 -0
- package/dist/lib/providers/ollama.d.ts +52 -36
- package/dist/lib/providers/ollama.js +297 -520
- package/dist/lib/providers/openAI.d.ts +19 -18
- package/dist/lib/providers/openAI.js +76 -275
- package/dist/lib/sdk/tool-extension.d.ts +181 -0
- package/dist/lib/sdk/tool-extension.js +283 -0
- package/dist/lib/sdk/tool-registration.d.ts +95 -0
- package/dist/lib/sdk/tool-registration.js +167 -0
- package/dist/lib/services/streaming/streaming-manager.js +11 -10
- package/dist/lib/services/websocket/websocket-server.js +12 -11
- package/dist/lib/telemetry/telemetry-service.js +8 -7
- package/dist/lib/types/generate-types.d.ts +1 -0
- package/dist/lib/types/mcp-types.d.ts +116 -0
- package/dist/lib/types/mcp-types.js +5 -0
- package/dist/lib/types/stream-types.d.ts +30 -18
- package/dist/lib/types/universal-provider-options.d.ts +87 -0
- package/dist/lib/types/universal-provider-options.js +53 -0
- package/dist/mcp/client.d.ts +1 -0
- package/dist/mcp/client.js +1 -0
- package/dist/mcp/config.js +28 -3
- package/dist/mcp/context-manager.d.ts +1 -0
- package/dist/mcp/context-manager.js +8 -4
- package/dist/mcp/function-calling.d.ts +13 -0
- package/dist/mcp/function-calling.js +134 -35
- package/dist/mcp/initialize-tools.d.ts +1 -1
- package/dist/mcp/initialize-tools.js +45 -1
- package/dist/mcp/initialize.js +16 -6
- package/dist/mcp/neurolink-mcp-client.d.ts +1 -0
- package/dist/mcp/neurolink-mcp-client.js +21 -5
- package/dist/mcp/servers/agent/direct-tools-server.d.ts +8 -0
- package/dist/mcp/servers/agent/direct-tools-server.js +109 -0
- package/dist/mcp/servers/ai-providers/ai-core-server.js +3 -1
- package/dist/mcp/servers/ai-providers/ai-workflow-tools.d.ts +2 -2
- package/dist/mcp/unified-registry.d.ts +4 -0
- package/dist/mcp/unified-registry.js +42 -9
- package/dist/neurolink.d.ts +156 -117
- package/dist/neurolink.js +619 -404
- package/dist/providers/amazon-bedrock.d.ts +32 -0
- package/dist/providers/amazon-bedrock.js +143 -0
- package/dist/providers/analytics-helper.js +7 -4
- package/dist/providers/anthropic-baseprovider.d.ts +23 -0
- package/dist/providers/anthropic-baseprovider.js +114 -0
- package/dist/providers/anthropic.d.ts +19 -43
- package/dist/providers/anthropic.js +81 -305
- package/dist/providers/azure-openai.d.ts +20 -0
- package/dist/providers/azure-openai.js +89 -0
- package/dist/providers/function-calling-provider.d.ts +64 -2
- package/dist/providers/function-calling-provider.js +208 -9
- package/dist/providers/google-ai-studio.d.ts +23 -0
- package/dist/providers/google-ai-studio.js +108 -0
- package/dist/providers/google-vertex.d.ts +47 -0
- package/dist/providers/google-vertex.js +205 -0
- package/dist/providers/huggingFace.d.ts +32 -25
- package/dist/providers/huggingFace.js +96 -430
- package/dist/providers/index.d.ts +9 -9
- package/dist/providers/index.js +9 -9
- package/dist/providers/mcp-provider.js +24 -5
- package/dist/providers/mistral.d.ts +42 -0
- package/dist/providers/mistral.js +160 -0
- package/dist/providers/ollama.d.ts +52 -36
- package/dist/providers/ollama.js +297 -519
- package/dist/providers/openAI.d.ts +19 -18
- package/dist/providers/openAI.js +76 -276
- package/dist/sdk/tool-extension.d.ts +181 -0
- package/dist/sdk/tool-extension.js +283 -0
- package/dist/sdk/tool-registration.d.ts +95 -0
- package/dist/sdk/tool-registration.js +168 -0
- package/dist/services/streaming/streaming-manager.js +11 -10
- package/dist/services/websocket/websocket-server.js +12 -11
- package/dist/telemetry/telemetry-service.js +8 -7
- package/dist/types/generate-types.d.ts +1 -0
- package/dist/types/mcp-types.d.ts +116 -0
- package/dist/types/mcp-types.js +5 -0
- package/dist/types/stream-types.d.ts +30 -18
- package/dist/types/universal-provider-options.d.ts +87 -0
- package/dist/types/universal-provider-options.js +53 -0
- package/package.json +12 -5
- package/dist/lib/providers/agent-enhanced-provider.d.ts +0 -93
- package/dist/lib/providers/agent-enhanced-provider.js +0 -605
- package/dist/lib/providers/amazonBedrock.d.ts +0 -28
- package/dist/lib/providers/amazonBedrock.js +0 -364
- package/dist/lib/providers/azureOpenAI.d.ts +0 -42
- package/dist/lib/providers/azureOpenAI.js +0 -347
- package/dist/lib/providers/googleAIStudio.d.ts +0 -42
- package/dist/lib/providers/googleAIStudio.js +0 -364
- package/dist/lib/providers/googleVertexAI.d.ts +0 -34
- package/dist/lib/providers/googleVertexAI.js +0 -547
- package/dist/lib/providers/mistralAI.d.ts +0 -37
- package/dist/lib/providers/mistralAI.js +0 -325
- package/dist/providers/agent-enhanced-provider.d.ts +0 -93
- package/dist/providers/agent-enhanced-provider.js +0 -606
- package/dist/providers/amazonBedrock.d.ts +0 -28
- package/dist/providers/amazonBedrock.js +0 -364
- package/dist/providers/azureOpenAI.d.ts +0 -42
- package/dist/providers/azureOpenAI.js +0 -348
- package/dist/providers/googleAIStudio.d.ts +0 -42
- package/dist/providers/googleAIStudio.js +0 -364
- package/dist/providers/googleVertexAI.d.ts +0 -34
- package/dist/providers/googleVertexAI.js +0 -547
- package/dist/providers/mistralAI.d.ts +0 -37
- package/dist/providers/mistralAI.js +0 -325
package/dist/core/factory.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ declare const componentIdentifier = "aiProviderFactory";
|
|
|
5
5
|
*/
|
|
6
6
|
export declare class AIProviderFactory {
|
|
7
7
|
/**
|
|
8
|
-
* Normalize provider name
|
|
8
|
+
* Normalize provider name using ProviderFactory
|
|
9
9
|
*/
|
|
10
10
|
private static normalizeProviderName;
|
|
11
11
|
/**
|
|
@@ -15,7 +15,7 @@ export declare class AIProviderFactory {
|
|
|
15
15
|
* @param enableMCP - Optional flag to enable MCP integration (default: true)
|
|
16
16
|
* @returns AIProvider instance
|
|
17
17
|
*/
|
|
18
|
-
static createProvider(providerName: string, modelName?: string | null, enableMCP?: boolean): Promise<AIProvider>;
|
|
18
|
+
static createProvider(providerName: string, modelName?: string | null, enableMCP?: boolean, sdk?: any): Promise<AIProvider>;
|
|
19
19
|
/**
|
|
20
20
|
* Create a provider instance with specific provider enum and model
|
|
21
21
|
* @param provider - Provider enum value
|
|
@@ -30,7 +30,7 @@ export declare class AIProviderFactory {
|
|
|
30
30
|
* @param enableMCP - Optional flag to enable MCP integration (default: true)
|
|
31
31
|
* @returns AIProvider instance
|
|
32
32
|
*/
|
|
33
|
-
static createBestProvider(requestedProvider?: string, modelName?: string | null, enableMCP?: boolean): Promise<AIProvider>;
|
|
33
|
+
static createBestProvider(requestedProvider?: string, modelName?: string | null, enableMCP?: boolean, sdk?: any): Promise<AIProvider>;
|
|
34
34
|
/**
|
|
35
35
|
* Create primary and fallback provider instances
|
|
36
36
|
* @param primaryProvider - Primary provider name
|
package/dist/core/factory.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
// ✅ CIRCULAR DEPENDENCY FIX: Remove barrel export import
|
|
2
|
+
// Providers are now managed via ProviderFactory instead of direct imports
|
|
3
|
+
import { ProviderFactory } from "../factories/provider-factory.js";
|
|
4
|
+
import { ProviderRegistry } from "../factories/provider-registry.js";
|
|
2
5
|
import { getBestProvider } from "../utils/providerUtils.js";
|
|
3
6
|
import { logger } from "../utils/logger.js";
|
|
4
7
|
import { dynamicModelProvider } from "./dynamic-models.js";
|
|
@@ -8,45 +11,16 @@ const componentIdentifier = "aiProviderFactory";
|
|
|
8
11
|
*/
|
|
9
12
|
export class AIProviderFactory {
|
|
10
13
|
/**
|
|
11
|
-
* Normalize provider name
|
|
14
|
+
* Normalize provider name using ProviderFactory
|
|
12
15
|
*/
|
|
13
16
|
static normalizeProviderName(providerName) {
|
|
14
|
-
switch
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
return "google";
|
|
19
|
-
case "bedrock":
|
|
20
|
-
case "amazon":
|
|
21
|
-
case "aws":
|
|
22
|
-
return "bedrock";
|
|
23
|
-
case "openai":
|
|
24
|
-
case "gpt":
|
|
25
|
-
return "openai";
|
|
26
|
-
case "anthropic":
|
|
27
|
-
case "claude":
|
|
28
|
-
return "anthropic";
|
|
29
|
-
case "azure":
|
|
30
|
-
case "azure-openai":
|
|
31
|
-
return "openai"; // Azure uses OpenAI models
|
|
32
|
-
case "google-ai":
|
|
33
|
-
case "google-studio":
|
|
34
|
-
return "google";
|
|
35
|
-
case "huggingface":
|
|
36
|
-
case "hugging-face":
|
|
37
|
-
case "hf":
|
|
38
|
-
return "huggingface";
|
|
39
|
-
case "ollama":
|
|
40
|
-
case "local":
|
|
41
|
-
case "local-ollama":
|
|
42
|
-
return "ollama";
|
|
43
|
-
case "mistral":
|
|
44
|
-
case "mistral-ai":
|
|
45
|
-
case "mistralai":
|
|
46
|
-
return "mistral";
|
|
47
|
-
default:
|
|
48
|
-
return providerName.toLowerCase();
|
|
17
|
+
// Use ProviderFactory registration - no more legacy switch statements
|
|
18
|
+
const normalized = ProviderFactory.normalizeProviderName(providerName);
|
|
19
|
+
if (normalized) {
|
|
20
|
+
return normalized;
|
|
49
21
|
}
|
|
22
|
+
// If not found in factory, return as-is (will be handled by factory error handling)
|
|
23
|
+
return providerName.toLowerCase();
|
|
50
24
|
}
|
|
51
25
|
/**
|
|
52
26
|
* Create a provider instance for the specified provider type
|
|
@@ -55,8 +29,9 @@ export class AIProviderFactory {
|
|
|
55
29
|
* @param enableMCP - Optional flag to enable MCP integration (default: true)
|
|
56
30
|
* @returns AIProvider instance
|
|
57
31
|
*/
|
|
58
|
-
static async createProvider(providerName, modelName, enableMCP = true) {
|
|
59
|
-
const functionTag = "
|
|
32
|
+
static async createProvider(providerName, modelName, enableMCP = true, sdk) {
|
|
33
|
+
const functionTag = "AIawait ProviderFactory.createProvider";
|
|
34
|
+
// Providers are registered via ProviderFactory.initialize() on first use
|
|
60
35
|
logger.debug(`[${functionTag}] Provider creation started`, {
|
|
61
36
|
providerName,
|
|
62
37
|
modelName: modelName || "default",
|
|
@@ -115,53 +90,18 @@ export class AIProviderFactory {
|
|
|
115
90
|
// }
|
|
116
91
|
// }
|
|
117
92
|
let provider;
|
|
118
|
-
switch
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
case "gpt":
|
|
131
|
-
provider = new OpenAI(resolvedModelName === "default" ? null : resolvedModelName);
|
|
132
|
-
break;
|
|
133
|
-
case "anthropic":
|
|
134
|
-
case "claude":
|
|
135
|
-
provider = new AnthropicProvider();
|
|
136
|
-
break;
|
|
137
|
-
case "azure":
|
|
138
|
-
case "azure-openai":
|
|
139
|
-
provider = new AzureOpenAIProvider();
|
|
140
|
-
break;
|
|
141
|
-
case "google-ai":
|
|
142
|
-
case "google-studio":
|
|
143
|
-
provider = new GoogleAIStudio(resolvedModelName === "default" ? null : resolvedModelName);
|
|
144
|
-
break;
|
|
145
|
-
case "huggingface":
|
|
146
|
-
case "hugging-face":
|
|
147
|
-
case "hf":
|
|
148
|
-
provider = new HuggingFace(resolvedModelName === "default" ? null : resolvedModelName);
|
|
149
|
-
break;
|
|
150
|
-
case "ollama":
|
|
151
|
-
case "local":
|
|
152
|
-
case "local-ollama":
|
|
153
|
-
provider = new Ollama(resolvedModelName === "default"
|
|
154
|
-
? undefined
|
|
155
|
-
: resolvedModelName || undefined);
|
|
156
|
-
break;
|
|
157
|
-
case "mistral":
|
|
158
|
-
case "mistral-ai":
|
|
159
|
-
case "mistralai":
|
|
160
|
-
provider = new MistralAI(resolvedModelName === "default" ? null : resolvedModelName);
|
|
161
|
-
break;
|
|
162
|
-
default:
|
|
163
|
-
throw new Error(`Unknown provider: ${providerName}. Supported providers: vertex, bedrock, openai, anthropic, azure, google-ai, huggingface, ollama, mistral`);
|
|
164
|
-
}
|
|
93
|
+
// PURE FACTORY PATTERN: No switch statements - use ProviderFactory exclusively
|
|
94
|
+
const normalizedName = this.normalizeProviderName(providerName);
|
|
95
|
+
const finalModelName = resolvedModelName === "default" || resolvedModelName === null
|
|
96
|
+
? undefined
|
|
97
|
+
: resolvedModelName;
|
|
98
|
+
provider = await ProviderFactory.createProvider(normalizedName, finalModelName, sdk);
|
|
99
|
+
logger.debug(componentIdentifier, "Pure factory pattern provider created", {
|
|
100
|
+
providerName: normalizedName,
|
|
101
|
+
modelName: finalModelName,
|
|
102
|
+
factoryUsed: true,
|
|
103
|
+
});
|
|
104
|
+
// PURE FACTORY PATTERN: All providers handled by ProviderFactory - no switch statements needed
|
|
165
105
|
// Wrap with MCP if enabled
|
|
166
106
|
if (enableMCP) {
|
|
167
107
|
try {
|
|
@@ -183,7 +123,7 @@ export class AIProviderFactory {
|
|
|
183
123
|
}
|
|
184
124
|
logger.debug(`[${functionTag}] Provider creation succeeded`, {
|
|
185
125
|
providerName,
|
|
186
|
-
modelName:
|
|
126
|
+
modelName: finalModelName || "default",
|
|
187
127
|
providerType: provider.constructor.name,
|
|
188
128
|
mcpEnabled: enableMCP,
|
|
189
129
|
});
|
|
@@ -206,7 +146,7 @@ export class AIProviderFactory {
|
|
|
206
146
|
* @returns AIProvider instance
|
|
207
147
|
*/
|
|
208
148
|
static async createProviderWithModel(provider, model) {
|
|
209
|
-
const functionTag = "
|
|
149
|
+
const functionTag = "AIawait ProviderFactory.createProviderWithModel";
|
|
210
150
|
logger.debug(`[${functionTag}] Provider model creation started`, {
|
|
211
151
|
provider,
|
|
212
152
|
model,
|
|
@@ -237,7 +177,7 @@ export class AIProviderFactory {
|
|
|
237
177
|
* @param enableMCP - Optional flag to enable MCP integration (default: true)
|
|
238
178
|
* @returns AIProvider instance
|
|
239
179
|
*/
|
|
240
|
-
static async createBestProvider(requestedProvider, modelName, enableMCP = true) {
|
|
180
|
+
static async createBestProvider(requestedProvider, modelName, enableMCP = true, sdk) {
|
|
241
181
|
const functionTag = "AIProviderFactory.createBestProvider";
|
|
242
182
|
try {
|
|
243
183
|
const bestProvider = await getBestProvider(requestedProvider);
|
|
@@ -247,7 +187,7 @@ export class AIProviderFactory {
|
|
|
247
187
|
modelName: modelName || "default",
|
|
248
188
|
enableMCP,
|
|
249
189
|
});
|
|
250
|
-
return await this.createProvider(bestProvider, modelName, enableMCP);
|
|
190
|
+
return await this.createProvider(bestProvider, modelName, enableMCP, sdk);
|
|
251
191
|
}
|
|
252
192
|
catch (error) {
|
|
253
193
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
@@ -267,7 +207,7 @@ export class AIProviderFactory {
|
|
|
267
207
|
* @returns Object with primary and fallback providers
|
|
268
208
|
*/
|
|
269
209
|
static async createProviderWithFallback(primaryProvider, fallbackProvider, modelName, enableMCP = true) {
|
|
270
|
-
const functionTag = "
|
|
210
|
+
const functionTag = "AIawait ProviderFactory.createProviderWithFallback";
|
|
271
211
|
logger.debug(`[${functionTag}] Fallback provider setup started`, {
|
|
272
212
|
primaryProvider,
|
|
273
213
|
fallbackProvider,
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service Registry for Dependency Injection
|
|
3
|
+
* Breaks circular dependencies by providing lazy loading and centralized service management
|
|
4
|
+
*/
|
|
5
|
+
export interface ServiceFactory<T = any> {
|
|
6
|
+
(): T | Promise<T>;
|
|
7
|
+
}
|
|
8
|
+
export interface ServiceRegistration {
|
|
9
|
+
factory: ServiceFactory;
|
|
10
|
+
singleton: boolean;
|
|
11
|
+
instance?: any;
|
|
12
|
+
}
|
|
13
|
+
export declare class ServiceRegistry {
|
|
14
|
+
private static services;
|
|
15
|
+
private static initializing;
|
|
16
|
+
/**
|
|
17
|
+
* Register a service with optional singleton behavior
|
|
18
|
+
*/
|
|
19
|
+
static register<T>(name: string, factory: ServiceFactory<T>, options?: {
|
|
20
|
+
singleton?: boolean;
|
|
21
|
+
}): void;
|
|
22
|
+
/**
|
|
23
|
+
* Get a service instance with circular dependency detection
|
|
24
|
+
*/
|
|
25
|
+
static get<T>(name: string): Promise<T>;
|
|
26
|
+
/**
|
|
27
|
+
* Get a service synchronously (throws if async initialization required)
|
|
28
|
+
*/
|
|
29
|
+
static getSync<T>(name: string): T;
|
|
30
|
+
/**
|
|
31
|
+
* Check if a service is registered
|
|
32
|
+
*/
|
|
33
|
+
static has(name: string): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Clear all services (useful for testing)
|
|
36
|
+
*/
|
|
37
|
+
static clear(): void;
|
|
38
|
+
/**
|
|
39
|
+
* Get all registered service names
|
|
40
|
+
*/
|
|
41
|
+
static getRegisteredServices(): string[];
|
|
42
|
+
/**
|
|
43
|
+
* Register multiple services at once
|
|
44
|
+
*/
|
|
45
|
+
static registerBatch(services: Record<string, ServiceFactory>): void;
|
|
46
|
+
}
|
|
47
|
+
export declare const serviceRegistry: typeof ServiceRegistry;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service Registry for Dependency Injection
|
|
3
|
+
* Breaks circular dependencies by providing lazy loading and centralized service management
|
|
4
|
+
*/
|
|
5
|
+
import { logger } from "../utils/logger.js";
|
|
6
|
+
export class ServiceRegistry {
|
|
7
|
+
static services = new Map();
|
|
8
|
+
static initializing = new Set();
|
|
9
|
+
/**
|
|
10
|
+
* Register a service with optional singleton behavior
|
|
11
|
+
*/
|
|
12
|
+
static register(name, factory, options = {}) {
|
|
13
|
+
if (this.services.has(name)) {
|
|
14
|
+
logger.warn(`Service ${name} is already registered. Overwriting.`);
|
|
15
|
+
}
|
|
16
|
+
this.services.set(name, {
|
|
17
|
+
factory,
|
|
18
|
+
singleton: options.singleton ?? true,
|
|
19
|
+
instance: undefined,
|
|
20
|
+
});
|
|
21
|
+
logger.debug(`Service registered: ${name} (singleton: ${options.singleton ?? true})`);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get a service instance with circular dependency detection
|
|
25
|
+
*/
|
|
26
|
+
static async get(name) {
|
|
27
|
+
const registration = this.services.get(name);
|
|
28
|
+
if (!registration) {
|
|
29
|
+
throw new Error(`Service ${name} not registered. Available services: ${Array.from(this.services.keys()).join(", ")}`);
|
|
30
|
+
}
|
|
31
|
+
// Check for circular dependency
|
|
32
|
+
if (this.initializing.has(name)) {
|
|
33
|
+
throw new Error(`Circular dependency detected: ${name} is already being initialized. Chain: ${Array.from(this.initializing).join(" -> ")} -> ${name}`);
|
|
34
|
+
}
|
|
35
|
+
// Return existing singleton instance if available
|
|
36
|
+
if (registration.singleton && registration.instance !== undefined) {
|
|
37
|
+
return registration.instance;
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
// Mark as initializing to detect circular dependencies
|
|
41
|
+
this.initializing.add(name);
|
|
42
|
+
logger.debug(`Initializing service: ${name}`);
|
|
43
|
+
// Create new instance
|
|
44
|
+
const instance = await registration.factory();
|
|
45
|
+
// Store singleton instance
|
|
46
|
+
if (registration.singleton) {
|
|
47
|
+
registration.instance = instance;
|
|
48
|
+
}
|
|
49
|
+
logger.debug(`Service initialized: ${name}`);
|
|
50
|
+
return instance;
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
logger.error(`Failed to initialize service ${name}:`, error);
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
// Remove from initializing set
|
|
58
|
+
this.initializing.delete(name);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get a service synchronously (throws if async initialization required)
|
|
63
|
+
*/
|
|
64
|
+
static getSync(name) {
|
|
65
|
+
const registration = this.services.get(name);
|
|
66
|
+
if (!registration) {
|
|
67
|
+
throw new Error(`Service ${name} not registered`);
|
|
68
|
+
}
|
|
69
|
+
if (registration.singleton && registration.instance !== undefined) {
|
|
70
|
+
return registration.instance;
|
|
71
|
+
}
|
|
72
|
+
// Try synchronous initialization
|
|
73
|
+
const result = registration.factory();
|
|
74
|
+
if (result instanceof Promise) {
|
|
75
|
+
throw new Error(`Service ${name} requires asynchronous initialization. Use get() instead.`);
|
|
76
|
+
}
|
|
77
|
+
if (registration.singleton) {
|
|
78
|
+
registration.instance = result;
|
|
79
|
+
}
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Check if a service is registered
|
|
84
|
+
*/
|
|
85
|
+
static has(name) {
|
|
86
|
+
return this.services.has(name);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Clear all services (useful for testing)
|
|
90
|
+
*/
|
|
91
|
+
static clear() {
|
|
92
|
+
this.services.clear();
|
|
93
|
+
this.initializing.clear();
|
|
94
|
+
logger.debug("Service registry cleared");
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Get all registered service names
|
|
98
|
+
*/
|
|
99
|
+
static getRegisteredServices() {
|
|
100
|
+
return Array.from(this.services.keys());
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Register multiple services at once
|
|
104
|
+
*/
|
|
105
|
+
static registerBatch(services) {
|
|
106
|
+
for (const [name, factory] of Object.entries(services)) {
|
|
107
|
+
this.register(name, factory);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Export singleton instance for convenience
|
|
112
|
+
export const serviceRegistry = ServiceRegistry;
|
package/dist/core/types.d.ts
CHANGED
|
@@ -26,6 +26,8 @@ export interface TextGenerationResult {
|
|
|
26
26
|
server: string;
|
|
27
27
|
category?: string;
|
|
28
28
|
}>;
|
|
29
|
+
analytics?: any;
|
|
30
|
+
evaluation?: any;
|
|
29
31
|
}
|
|
30
32
|
/**
|
|
31
33
|
* Supported AI Provider Names
|
|
@@ -100,7 +102,10 @@ export interface StreamingOptions {
|
|
|
100
102
|
* Text generation options interface
|
|
101
103
|
*/
|
|
102
104
|
export interface TextGenerationOptions {
|
|
103
|
-
prompt
|
|
105
|
+
prompt?: string;
|
|
106
|
+
input?: {
|
|
107
|
+
text: string;
|
|
108
|
+
};
|
|
104
109
|
provider?: AIProviderName;
|
|
105
110
|
model?: string;
|
|
106
111
|
temperature?: number;
|
|
@@ -109,6 +114,8 @@ export interface TextGenerationOptions {
|
|
|
109
114
|
schema?: ZodType<unknown, ZodTypeDef, unknown> | Schema<unknown>;
|
|
110
115
|
tools?: Record<string, Tool>;
|
|
111
116
|
timeout?: number | string;
|
|
117
|
+
disableTools?: boolean;
|
|
118
|
+
maxSteps?: number;
|
|
112
119
|
enableEvaluation?: boolean;
|
|
113
120
|
enableAnalytics?: boolean;
|
|
114
121
|
context?: Record<string, any>;
|
|
@@ -9,7 +9,7 @@ export class CompatibilityConversionFactory {
|
|
|
9
9
|
static convertTextToGenerate(options) {
|
|
10
10
|
const { prompt, ...rest } = options;
|
|
11
11
|
return {
|
|
12
|
-
input: { text: prompt },
|
|
12
|
+
input: { text: prompt || "" },
|
|
13
13
|
output: { format: "text" },
|
|
14
14
|
provider: rest.provider,
|
|
15
15
|
model: rest.model,
|
|
@@ -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,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
|
+
}
|