@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.
- package/CHANGELOG.md +20 -7
- package/README.md +160 -172
- package/dist/agent/direct-tools.d.ts +6 -6
- package/dist/chat/sse-handler.js +5 -4
- package/dist/chat/websocket-chat-handler.js +9 -9
- package/dist/cli/commands/config.d.ts +3 -3
- package/dist/cli/commands/mcp.js +9 -8
- package/dist/cli/commands/ollama.js +3 -3
- package/dist/cli/factories/command-factory.d.ts +18 -0
- package/dist/cli/factories/command-factory.js +183 -0
- package/dist/cli/index.js +105 -157
- package/dist/cli/utils/interactive-setup.js +2 -2
- package/dist/core/base-provider.d.ts +423 -0
- package/dist/core/base-provider.js +365 -0
- package/dist/core/constants.d.ts +1 -1
- package/dist/core/constants.js +1 -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 +49 -49
- package/dist/core/types.js +1 -0
- package/dist/factories/compatibility-factory.d.ts +20 -0
- package/dist/factories/compatibility-factory.js +69 -0
- package/dist/factories/provider-factory.d.ts +72 -0
- package/dist/factories/provider-factory.js +144 -0
- package/dist/factories/provider-generate-factory.d.ts +20 -0
- package/dist/factories/provider-generate-factory.js +87 -0
- package/dist/factories/provider-registry.d.ts +38 -0
- package/dist/factories/provider-registry.js +107 -0
- package/dist/index.d.ts +8 -5
- package/dist/index.js +5 -5
- package/dist/lib/agent/direct-tools.d.ts +6 -6
- package/dist/lib/chat/sse-handler.js +5 -4
- package/dist/lib/chat/websocket-chat-handler.js +9 -9
- package/dist/lib/core/base-provider.d.ts +423 -0
- package/dist/lib/core/base-provider.js +365 -0
- package/dist/lib/core/constants.d.ts +1 -1
- package/dist/lib/core/constants.js +1 -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 +49 -49
- package/dist/lib/core/types.js +1 -0
- package/dist/lib/factories/compatibility-factory.d.ts +20 -0
- package/dist/lib/factories/compatibility-factory.js +69 -0
- package/dist/lib/factories/provider-factory.d.ts +72 -0
- package/dist/lib/factories/provider-factory.js +144 -0
- package/dist/lib/factories/provider-generate-factory.d.ts +20 -0
- package/dist/lib/factories/provider-generate-factory.js +87 -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 +8 -5
- package/dist/lib/index.js +5 -5
- package/dist/lib/mcp/client.js +5 -5
- package/dist/lib/mcp/config.js +28 -3
- package/dist/lib/mcp/dynamic-orchestrator.js +8 -8
- package/dist/lib/mcp/external-client.js +2 -2
- package/dist/lib/mcp/factory.d.ts +1 -1
- package/dist/lib/mcp/factory.js +1 -1
- package/dist/lib/mcp/function-calling.js +1 -1
- 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.js +10 -10
- package/dist/lib/mcp/orchestrator.js +4 -4
- 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-analysis-tools.js +10 -10
- package/dist/lib/mcp/servers/ai-providers/ai-core-server.js +8 -6
- package/dist/lib/mcp/servers/ai-providers/ai-workflow-tools.d.ts +2 -2
- package/dist/lib/mcp/servers/ai-providers/ai-workflow-tools.js +16 -16
- 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 +161 -174
- package/dist/lib/neurolink.js +723 -397
- 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 -39
- package/dist/lib/providers/anthropic.js +84 -378
- 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 +14 -12
- package/dist/lib/providers/function-calling-provider.js +114 -64
- 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 +33 -27
- package/dist/lib/providers/huggingFace.js +103 -400
- package/dist/lib/providers/index.d.ts +9 -9
- package/dist/lib/providers/index.js +9 -9
- package/dist/lib/providers/mcp-provider.d.ts +13 -8
- package/dist/lib/providers/mcp-provider.js +63 -18
- 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 -35
- package/dist/lib/providers/ollama.js +297 -477
- package/dist/lib/providers/openAI.d.ts +21 -21
- package/dist/lib/providers/openAI.js +81 -245
- 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/types/generate-types.d.ts +80 -0
- package/dist/lib/types/generate-types.js +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 +95 -0
- package/dist/lib/types/stream-types.js +1 -0
- package/dist/lib/types/universal-provider-options.d.ts +87 -0
- package/dist/lib/types/universal-provider-options.js +53 -0
- package/dist/lib/utils/providerUtils-fixed.js +1 -1
- package/dist/lib/utils/streaming-utils.d.ts +14 -2
- package/dist/lib/utils/streaming-utils.js +0 -3
- package/dist/mcp/client.js +5 -5
- package/dist/mcp/config.js +28 -3
- package/dist/mcp/dynamic-orchestrator.js +8 -8
- package/dist/mcp/external-client.js +2 -2
- package/dist/mcp/factory.d.ts +1 -1
- package/dist/mcp/factory.js +1 -1
- package/dist/mcp/function-calling.js +1 -1
- 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.js +10 -10
- package/dist/mcp/orchestrator.js +4 -4
- 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-analysis-tools.js +10 -10
- package/dist/mcp/servers/ai-providers/ai-core-server.js +8 -6
- package/dist/mcp/servers/ai-providers/ai-workflow-tools.d.ts +2 -2
- package/dist/mcp/servers/ai-providers/ai-workflow-tools.js +16 -16
- package/dist/mcp/unified-registry.d.ts +4 -0
- package/dist/mcp/unified-registry.js +42 -9
- package/dist/neurolink.d.ts +161 -174
- package/dist/neurolink.js +723 -397
- 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 -39
- package/dist/providers/anthropic.js +83 -377
- 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 +14 -12
- package/dist/providers/function-calling-provider.js +114 -64
- 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 +33 -27
- package/dist/providers/huggingFace.js +102 -399
- package/dist/providers/index.d.ts +9 -9
- package/dist/providers/index.js +9 -9
- package/dist/providers/mcp-provider.d.ts +13 -8
- package/dist/providers/mcp-provider.js +63 -18
- package/dist/providers/mistral.d.ts +42 -0
- package/dist/providers/mistral.js +160 -0
- package/dist/providers/ollama.d.ts +52 -35
- package/dist/providers/ollama.js +297 -476
- package/dist/providers/openAI.d.ts +21 -21
- package/dist/providers/openAI.js +81 -246
- 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/types/generate-types.d.ts +80 -0
- package/dist/types/generate-types.js +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 +95 -0
- package/dist/types/stream-types.js +1 -0
- package/dist/types/universal-provider-options.d.ts +87 -0
- package/dist/types/universal-provider-options.js +53 -0
- package/dist/utils/providerUtils-fixed.js +1 -1
- package/dist/utils/streaming-utils.d.ts +14 -2
- package/dist/utils/streaming-utils.js +0 -3
- package/package.json +15 -10
- package/dist/lib/providers/agent-enhanced-provider.d.ts +0 -89
- package/dist/lib/providers/agent-enhanced-provider.js +0 -614
- package/dist/lib/providers/amazonBedrock.d.ts +0 -19
- package/dist/lib/providers/amazonBedrock.js +0 -334
- package/dist/lib/providers/azureOpenAI.d.ts +0 -39
- package/dist/lib/providers/azureOpenAI.js +0 -436
- package/dist/lib/providers/googleAIStudio.d.ts +0 -49
- package/dist/lib/providers/googleAIStudio.js +0 -333
- package/dist/lib/providers/googleVertexAI.d.ts +0 -38
- package/dist/lib/providers/googleVertexAI.js +0 -519
- package/dist/lib/providers/mistralAI.d.ts +0 -34
- package/dist/lib/providers/mistralAI.js +0 -294
- package/dist/providers/agent-enhanced-provider.d.ts +0 -89
- package/dist/providers/agent-enhanced-provider.js +0 -614
- package/dist/providers/amazonBedrock.d.ts +0 -19
- package/dist/providers/amazonBedrock.js +0 -334
- package/dist/providers/azureOpenAI.d.ts +0 -39
- package/dist/providers/azureOpenAI.js +0 -437
- package/dist/providers/googleAIStudio.d.ts +0 -49
- package/dist/providers/googleAIStudio.js +0 -333
- package/dist/providers/googleVertexAI.d.ts +0 -38
- package/dist/providers/googleVertexAI.js +0 -519
- package/dist/providers/mistralAI.d.ts +0 -34
- 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 {
|
|
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.
|
|
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.
|
|
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.
|
|
46
|
-
|
|
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?.
|
|
52
|
-
|
|
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) {
|