@juspay/neurolink 1.5.3 → 1.9.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 +241 -1
- package/README.md +113 -20
- package/dist/agent/direct-tools.d.ts +1203 -0
- package/dist/agent/direct-tools.js +387 -0
- package/dist/cli/commands/agent-generate.d.ts +2 -0
- package/dist/cli/commands/agent-generate.js +70 -0
- package/dist/cli/commands/config.d.ts +76 -9
- package/dist/cli/commands/config.js +358 -233
- package/dist/cli/commands/mcp.d.ts +2 -1
- package/dist/cli/commands/mcp.js +874 -146
- package/dist/cli/commands/ollama.d.ts +8 -0
- package/dist/cli/commands/ollama.js +333 -0
- package/dist/cli/index.js +591 -327
- package/dist/cli/utils/complete-setup.d.ts +19 -0
- package/dist/cli/utils/complete-setup.js +81 -0
- package/dist/cli/utils/env-manager.d.ts +44 -0
- package/dist/cli/utils/env-manager.js +226 -0
- package/dist/cli/utils/interactive-setup.d.ts +48 -0
- package/dist/cli/utils/interactive-setup.js +302 -0
- package/dist/core/dynamic-models.d.ts +208 -0
- package/dist/core/dynamic-models.js +250 -0
- package/dist/core/factory.d.ts +13 -6
- package/dist/core/factory.js +180 -50
- package/dist/core/types.d.ts +8 -3
- package/dist/core/types.js +7 -4
- package/dist/index.d.ts +16 -16
- package/dist/index.js +16 -16
- package/dist/lib/agent/direct-tools.d.ts +1203 -0
- package/dist/lib/agent/direct-tools.js +387 -0
- package/dist/lib/core/dynamic-models.d.ts +208 -0
- package/dist/lib/core/dynamic-models.js +250 -0
- package/dist/lib/core/factory.d.ts +13 -6
- package/dist/lib/core/factory.js +180 -50
- package/dist/lib/core/types.d.ts +8 -3
- package/dist/lib/core/types.js +7 -4
- package/dist/lib/index.d.ts +16 -16
- package/dist/lib/index.js +16 -16
- package/dist/lib/mcp/auto-discovery.d.ts +120 -0
- package/dist/lib/mcp/auto-discovery.js +793 -0
- package/dist/lib/mcp/client.d.ts +66 -0
- package/dist/lib/mcp/client.js +245 -0
- package/dist/lib/mcp/config.d.ts +31 -0
- package/dist/lib/mcp/config.js +74 -0
- package/dist/lib/mcp/context-manager.d.ts +4 -4
- package/dist/lib/mcp/context-manager.js +24 -18
- package/dist/lib/mcp/factory.d.ts +28 -11
- package/dist/lib/mcp/factory.js +36 -29
- package/dist/lib/mcp/function-calling.d.ts +51 -0
- package/dist/lib/mcp/function-calling.js +510 -0
- package/dist/lib/mcp/index.d.ts +190 -0
- package/dist/lib/mcp/index.js +156 -0
- package/dist/lib/mcp/initialize-tools.d.ts +28 -0
- package/dist/lib/mcp/initialize-tools.js +209 -0
- package/dist/lib/mcp/initialize.d.ts +17 -0
- package/dist/lib/mcp/initialize.js +51 -0
- package/dist/lib/mcp/logging.d.ts +71 -0
- package/dist/lib/mcp/logging.js +183 -0
- package/dist/lib/mcp/manager.d.ts +67 -0
- package/dist/lib/mcp/manager.js +176 -0
- package/dist/lib/mcp/neurolink-mcp-client.d.ts +96 -0
- package/dist/lib/mcp/neurolink-mcp-client.js +417 -0
- package/dist/lib/mcp/orchestrator.d.ts +3 -3
- package/dist/lib/mcp/orchestrator.js +46 -43
- package/dist/lib/mcp/registry.d.ts +2 -2
- package/dist/lib/mcp/registry.js +42 -33
- package/dist/lib/mcp/servers/ai-providers/ai-analysis-tools.d.ts +1 -1
- package/dist/lib/mcp/servers/ai-providers/ai-analysis-tools.js +205 -66
- package/dist/lib/mcp/servers/ai-providers/ai-core-server.js +143 -99
- package/dist/lib/mcp/servers/ai-providers/ai-workflow-tools.d.ts +6 -6
- package/dist/lib/mcp/servers/ai-providers/ai-workflow-tools.js +404 -251
- package/dist/lib/mcp/servers/utilities/utility-server.d.ts +8 -0
- package/dist/lib/mcp/servers/utilities/utility-server.js +326 -0
- package/dist/lib/mcp/tool-integration.d.ts +67 -0
- package/dist/lib/mcp/tool-integration.js +179 -0
- package/dist/lib/mcp/unified-registry.d.ts +269 -0
- package/dist/lib/mcp/unified-registry.js +1411 -0
- package/dist/lib/neurolink.d.ts +68 -6
- package/dist/lib/neurolink.js +314 -42
- package/dist/lib/providers/agent-enhanced-provider.d.ts +59 -0
- package/dist/lib/providers/agent-enhanced-provider.js +242 -0
- package/dist/lib/providers/amazonBedrock.d.ts +3 -3
- package/dist/lib/providers/amazonBedrock.js +54 -50
- package/dist/lib/providers/anthropic.d.ts +2 -2
- package/dist/lib/providers/anthropic.js +92 -84
- package/dist/lib/providers/azureOpenAI.d.ts +2 -2
- package/dist/lib/providers/azureOpenAI.js +97 -86
- package/dist/lib/providers/function-calling-provider.d.ts +70 -0
- package/dist/lib/providers/function-calling-provider.js +359 -0
- package/dist/lib/providers/googleAIStudio.d.ts +10 -5
- package/dist/lib/providers/googleAIStudio.js +60 -38
- package/dist/lib/providers/googleVertexAI.d.ts +3 -3
- package/dist/lib/providers/googleVertexAI.js +96 -86
- package/dist/lib/providers/huggingFace.d.ts +31 -0
- package/dist/lib/providers/huggingFace.js +362 -0
- package/dist/lib/providers/index.d.ts +14 -8
- package/dist/lib/providers/index.js +18 -12
- package/dist/lib/providers/mcp-provider.d.ts +62 -0
- package/dist/lib/providers/mcp-provider.js +183 -0
- package/dist/lib/providers/mistralAI.d.ts +32 -0
- package/dist/lib/providers/mistralAI.js +223 -0
- package/dist/lib/providers/ollama.d.ts +51 -0
- package/dist/lib/providers/ollama.js +508 -0
- package/dist/lib/providers/openAI.d.ts +7 -3
- package/dist/lib/providers/openAI.js +45 -33
- package/dist/lib/utils/logger.js +2 -2
- package/dist/lib/utils/providerUtils.js +59 -22
- package/dist/mcp/auto-discovery.d.ts +120 -0
- package/dist/mcp/auto-discovery.js +794 -0
- package/dist/mcp/client.d.ts +66 -0
- package/dist/mcp/client.js +245 -0
- package/dist/mcp/config.d.ts +31 -0
- package/dist/mcp/config.js +74 -0
- package/dist/mcp/context-manager.d.ts +4 -4
- package/dist/mcp/context-manager.js +24 -18
- package/dist/mcp/factory.d.ts +28 -11
- package/dist/mcp/factory.js +36 -29
- package/dist/mcp/function-calling.d.ts +51 -0
- package/dist/mcp/function-calling.js +510 -0
- package/dist/mcp/index.d.ts +190 -0
- package/dist/mcp/index.js +156 -0
- package/dist/mcp/initialize-tools.d.ts +28 -0
- package/dist/mcp/initialize-tools.js +210 -0
- package/dist/mcp/initialize.d.ts +17 -0
- package/dist/mcp/initialize.js +51 -0
- package/dist/mcp/logging.d.ts +71 -0
- package/dist/mcp/logging.js +183 -0
- package/dist/mcp/manager.d.ts +67 -0
- package/dist/mcp/manager.js +176 -0
- package/dist/mcp/neurolink-mcp-client.d.ts +96 -0
- package/dist/mcp/neurolink-mcp-client.js +417 -0
- package/dist/mcp/orchestrator.d.ts +3 -3
- package/dist/mcp/orchestrator.js +46 -43
- package/dist/mcp/registry.d.ts +2 -2
- package/dist/mcp/registry.js +42 -33
- package/dist/mcp/servers/ai-providers/ai-analysis-tools.d.ts +1 -1
- package/dist/mcp/servers/ai-providers/ai-analysis-tools.js +205 -66
- package/dist/mcp/servers/ai-providers/ai-core-server.js +143 -99
- package/dist/mcp/servers/ai-providers/ai-workflow-tools.d.ts +6 -6
- package/dist/mcp/servers/ai-providers/ai-workflow-tools.js +404 -253
- package/dist/mcp/servers/utilities/utility-server.d.ts +8 -0
- package/dist/mcp/servers/utilities/utility-server.js +326 -0
- package/dist/mcp/tool-integration.d.ts +67 -0
- package/dist/mcp/tool-integration.js +179 -0
- package/dist/mcp/unified-registry.d.ts +269 -0
- package/dist/mcp/unified-registry.js +1411 -0
- package/dist/neurolink.d.ts +68 -6
- package/dist/neurolink.js +314 -42
- package/dist/providers/agent-enhanced-provider.d.ts +59 -0
- package/dist/providers/agent-enhanced-provider.js +242 -0
- package/dist/providers/amazonBedrock.d.ts +3 -3
- package/dist/providers/amazonBedrock.js +54 -50
- package/dist/providers/anthropic.d.ts +2 -2
- package/dist/providers/anthropic.js +92 -84
- package/dist/providers/azureOpenAI.d.ts +2 -2
- package/dist/providers/azureOpenAI.js +97 -86
- package/dist/providers/function-calling-provider.d.ts +70 -0
- package/dist/providers/function-calling-provider.js +359 -0
- package/dist/providers/googleAIStudio.d.ts +10 -5
- package/dist/providers/googleAIStudio.js +60 -38
- package/dist/providers/googleVertexAI.d.ts +3 -3
- package/dist/providers/googleVertexAI.js +96 -86
- package/dist/providers/huggingFace.d.ts +31 -0
- package/dist/providers/huggingFace.js +362 -0
- package/dist/providers/index.d.ts +14 -8
- package/dist/providers/index.js +18 -12
- package/dist/providers/mcp-provider.d.ts +62 -0
- package/dist/providers/mcp-provider.js +183 -0
- package/dist/providers/mistralAI.d.ts +32 -0
- package/dist/providers/mistralAI.js +223 -0
- package/dist/providers/ollama.d.ts +51 -0
- package/dist/providers/ollama.js +508 -0
- package/dist/providers/openAI.d.ts +7 -3
- package/dist/providers/openAI.js +45 -33
- package/dist/utils/logger.js +2 -2
- package/dist/utils/providerUtils.js +59 -22
- package/package.json +28 -4
package/dist/neurolink.d.ts
CHANGED
|
@@ -1,21 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* NeuroLink - Unified AI Interface
|
|
2
|
+
* NeuroLink - Unified AI Interface with Real MCP Tool Integration
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* for
|
|
4
|
+
* Enhanced AI provider system with natural MCP tool access.
|
|
5
|
+
* Uses real MCP infrastructure for // Initialize MCP with enhanced error handling
|
|
6
|
+
await this.initializeMCP();tool discovery and execution.
|
|
6
7
|
*/
|
|
7
|
-
import type { AIProviderName } from
|
|
8
|
+
import type { AIProviderName } from "./core/types.js";
|
|
8
9
|
export interface TextGenerationOptions {
|
|
9
10
|
prompt: string;
|
|
10
|
-
provider?:
|
|
11
|
+
provider?: "openai" | "bedrock" | "vertex" | "anthropic" | "azure" | "google-ai" | "huggingface" | "ollama" | "mistral" | "auto";
|
|
11
12
|
temperature?: number;
|
|
12
13
|
maxTokens?: number;
|
|
13
14
|
systemPrompt?: string;
|
|
14
15
|
schema?: any;
|
|
16
|
+
disableTools?: boolean;
|
|
15
17
|
}
|
|
16
18
|
export interface StreamTextOptions {
|
|
17
19
|
prompt: string;
|
|
18
|
-
provider?:
|
|
20
|
+
provider?: "openai" | "bedrock" | "vertex" | "anthropic" | "azure" | "google-ai" | "huggingface" | "ollama" | "mistral" | "auto";
|
|
19
21
|
temperature?: number;
|
|
20
22
|
maxTokens?: number;
|
|
21
23
|
systemPrompt?: string;
|
|
@@ -30,12 +32,51 @@ export interface TextGenerationResult {
|
|
|
30
32
|
totalTokens?: number;
|
|
31
33
|
};
|
|
32
34
|
responseTime?: number;
|
|
35
|
+
toolsUsed?: string[];
|
|
36
|
+
toolExecutions?: Array<{
|
|
37
|
+
toolName: string;
|
|
38
|
+
executionTime: number;
|
|
39
|
+
success: boolean;
|
|
40
|
+
serverId?: string;
|
|
41
|
+
}>;
|
|
42
|
+
enhancedWithTools?: boolean;
|
|
43
|
+
availableTools?: Array<{
|
|
44
|
+
name: string;
|
|
45
|
+
description: string;
|
|
46
|
+
server: string;
|
|
47
|
+
category?: string;
|
|
48
|
+
}>;
|
|
33
49
|
}
|
|
34
50
|
export declare class NeuroLink {
|
|
51
|
+
private mcpInitialized;
|
|
52
|
+
private contextManager;
|
|
53
|
+
constructor();
|
|
54
|
+
/**
|
|
55
|
+
* Initialize MCP registry with enhanced error handling and resource cleanup
|
|
56
|
+
* Uses isolated async context to prevent hanging
|
|
57
|
+
*/
|
|
58
|
+
private initializeMCP;
|
|
59
|
+
/**
|
|
60
|
+
* Isolated MCP initialization to prevent context-dependent hanging
|
|
61
|
+
*/
|
|
62
|
+
private doIsolatedMCPInitialization;
|
|
35
63
|
/**
|
|
36
64
|
* Generate text using the best available AI provider with automatic fallback
|
|
65
|
+
* Tools are ENABLED BY DEFAULT for natural AI behavior
|
|
37
66
|
*/
|
|
38
67
|
generateText(options: TextGenerationOptions): Promise<TextGenerationResult>;
|
|
68
|
+
/**
|
|
69
|
+
* Generate text with real MCP tool integration using automatic detection
|
|
70
|
+
*/
|
|
71
|
+
private generateTextWithTools;
|
|
72
|
+
/**
|
|
73
|
+
* Regular text generation (existing logic)
|
|
74
|
+
*/
|
|
75
|
+
private generateTextRegular;
|
|
76
|
+
/**
|
|
77
|
+
* Create tool-aware system prompt that informs AI about available tools
|
|
78
|
+
*/
|
|
79
|
+
private createToolAwareSystemPrompt;
|
|
39
80
|
/**
|
|
40
81
|
* Generate streaming text using the best available AI provider with automatic fallback
|
|
41
82
|
*/
|
|
@@ -50,4 +91,25 @@ export declare class NeuroLink {
|
|
|
50
91
|
* Test a specific provider
|
|
51
92
|
*/
|
|
52
93
|
testProvider(providerName: AIProviderName, testPrompt?: string): Promise<boolean>;
|
|
94
|
+
/**
|
|
95
|
+
* Get access to the unified MCP registry for tool inspection and management
|
|
96
|
+
*/
|
|
97
|
+
getUnifiedRegistry(): import("./mcp/unified-registry.js").UnifiedMCPRegistry;
|
|
98
|
+
/**
|
|
99
|
+
* Initialize MCP and return discovery statistics
|
|
100
|
+
*/
|
|
101
|
+
getMCPStatus(): Promise<{
|
|
102
|
+
mcpInitialized: boolean;
|
|
103
|
+
totalServers: number;
|
|
104
|
+
availableServers: number;
|
|
105
|
+
autoDiscoveredCount: number;
|
|
106
|
+
totalTools: number;
|
|
107
|
+
autoDiscoveredServers: {
|
|
108
|
+
id: string;
|
|
109
|
+
name: string;
|
|
110
|
+
source: import("./mcp/unified-registry.js").ServerSource;
|
|
111
|
+
status: "unknown" | "available" | "unavailable" | "activated";
|
|
112
|
+
hasServer: boolean;
|
|
113
|
+
}[];
|
|
114
|
+
}>;
|
|
53
115
|
}
|
package/dist/neurolink.js
CHANGED
|
@@ -1,56 +1,253 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* NeuroLink - Unified AI Interface
|
|
2
|
+
* NeuroLink - Unified AI Interface with Real MCP Tool Integration
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* for
|
|
4
|
+
* Enhanced AI provider system with natural MCP tool access.
|
|
5
|
+
* Uses real MCP infrastructure for // Initialize MCP with enhanced error handling
|
|
6
|
+
await this.initializeMCP();tool discovery and execution.
|
|
6
7
|
*/
|
|
7
|
-
import { AIProviderFactory
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
8
|
+
import { AIProviderFactory } from "./index.js";
|
|
9
|
+
import { ContextManager } from "./mcp/context-manager.js";
|
|
10
|
+
import { mcpLogger } from "./mcp/logging.js";
|
|
11
|
+
import { defaultToolRegistry } from "./mcp/registry.js";
|
|
12
|
+
import { defaultUnifiedRegistry } from "./mcp/unified-registry.js";
|
|
13
|
+
import { logger } from "./utils/logger.js";
|
|
14
|
+
import { getBestProvider } from "./utils/providerUtils.js";
|
|
10
15
|
export class NeuroLink {
|
|
16
|
+
mcpInitialized = false;
|
|
17
|
+
contextManager;
|
|
18
|
+
constructor() {
|
|
19
|
+
this.contextManager = new ContextManager();
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Initialize MCP registry with enhanced error handling and resource cleanup
|
|
23
|
+
* Uses isolated async context to prevent hanging
|
|
24
|
+
*/
|
|
25
|
+
async initializeMCP() {
|
|
26
|
+
if (this.mcpInitialized) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
mcpLogger.debug("[NeuroLink] Starting isolated MCP initialization...");
|
|
31
|
+
// Use Promise.race with aggressive timeout and isolated context
|
|
32
|
+
const initTimeout = 3000; // 3 seconds max (reduced from 5)
|
|
33
|
+
const mcpInitPromise = Promise.race([
|
|
34
|
+
this.doIsolatedMCPInitialization(),
|
|
35
|
+
new Promise((_, reject) => {
|
|
36
|
+
const timer = setTimeout(() => {
|
|
37
|
+
reject(new Error("MCP initialization timeout after 3s"));
|
|
38
|
+
}, initTimeout);
|
|
39
|
+
timer.unref(); // Don't keep process alive
|
|
40
|
+
}),
|
|
41
|
+
]);
|
|
42
|
+
await mcpInitPromise;
|
|
43
|
+
this.mcpInitialized = true;
|
|
44
|
+
mcpLogger.debug("[NeuroLink] MCP tool integration initialized successfully");
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
mcpLogger.warn("[NeuroLink] MCP initialization failed, continuing without tools:", error);
|
|
48
|
+
// Mark as initialized to prevent infinite retries
|
|
49
|
+
this.mcpInitialized = true;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Isolated MCP initialization to prevent context-dependent hanging
|
|
54
|
+
*/
|
|
55
|
+
async doIsolatedMCPInitialization() {
|
|
56
|
+
try {
|
|
57
|
+
// Initialize only the essential built-in tools without complex registry
|
|
58
|
+
mcpLogger.debug("[NeuroLink] Initializing essential MCP tools...");
|
|
59
|
+
// Use dynamic import in isolated context to avoid circular dependencies
|
|
60
|
+
const { initializeNeuroLinkMCP, isNeuroLinkMCPInitialized } = await import("./mcp/initialize.js");
|
|
61
|
+
// Only initialize if not already done
|
|
62
|
+
if (!isNeuroLinkMCPInitialized()) {
|
|
63
|
+
await initializeNeuroLinkMCP();
|
|
64
|
+
}
|
|
65
|
+
mcpLogger.debug("[NeuroLink] Essential MCP tools initialized successfully");
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
mcpLogger.warn("[NeuroLink] Isolated MCP initialization failed:", error);
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
11
72
|
/**
|
|
12
73
|
* Generate text using the best available AI provider with automatic fallback
|
|
74
|
+
* Tools are ENABLED BY DEFAULT for natural AI behavior
|
|
13
75
|
*/
|
|
14
76
|
async generateText(options) {
|
|
77
|
+
// Tools are DEFAULT behavior unless explicitly disabled
|
|
78
|
+
if (options.disableTools === true) {
|
|
79
|
+
return this.generateTextRegular(options);
|
|
80
|
+
}
|
|
81
|
+
// Default: Generate with tools (natural AI behavior)
|
|
82
|
+
return this.generateTextWithTools(options);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Generate text with real MCP tool integration using automatic detection
|
|
86
|
+
*/
|
|
87
|
+
async generateTextWithTools(options) {
|
|
88
|
+
const startTime = Date.now();
|
|
89
|
+
const functionTag = "NeuroLink.generateTextWithTools";
|
|
90
|
+
// Initialize MCP if needed
|
|
91
|
+
await this.initializeMCP();
|
|
92
|
+
// Create execution context for tool operations
|
|
93
|
+
const context = this.contextManager.createContext({
|
|
94
|
+
sessionId: `neurolink-${Date.now()}`,
|
|
95
|
+
userId: "neurolink-user",
|
|
96
|
+
aiProvider: options.provider || "auto",
|
|
97
|
+
});
|
|
98
|
+
// Determine provider to use
|
|
99
|
+
const providerName = options.provider === "auto" || !options.provider
|
|
100
|
+
? await getBestProvider()
|
|
101
|
+
: options.provider;
|
|
102
|
+
try {
|
|
103
|
+
mcpLogger.debug(`[${functionTag}] Starting MCP-enabled generation`, {
|
|
104
|
+
provider: providerName,
|
|
105
|
+
prompt: options.prompt.substring(0, 100) + "...",
|
|
106
|
+
contextId: context.sessionId,
|
|
107
|
+
});
|
|
108
|
+
// Get available tools from default registry (simplified approach)
|
|
109
|
+
let availableTools = [];
|
|
110
|
+
try {
|
|
111
|
+
// Use defaultToolRegistry directly instead of unified registry to avoid hanging
|
|
112
|
+
const allTools = defaultToolRegistry.listTools();
|
|
113
|
+
availableTools = allTools.map((tool) => ({
|
|
114
|
+
name: tool.name,
|
|
115
|
+
description: tool.description || "No description available",
|
|
116
|
+
server: tool.server,
|
|
117
|
+
category: tool.category,
|
|
118
|
+
}));
|
|
119
|
+
mcpLogger.debug(`[${functionTag}] Found ${availableTools.length} available tools from default registry`, {
|
|
120
|
+
tools: availableTools.map((t) => t.name),
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
mcpLogger.warn(`[${functionTag}] Failed to get available tools`, {
|
|
125
|
+
error,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
// Create tool-aware system prompt
|
|
129
|
+
const enhancedSystemPrompt = this.createToolAwareSystemPrompt(options.systemPrompt, availableTools);
|
|
130
|
+
// Create provider with MCP enabled using best provider function
|
|
131
|
+
const provider = await AIProviderFactory.createBestProvider(providerName, undefined, true);
|
|
132
|
+
// Generate text with automatic tool detection
|
|
133
|
+
const result = await provider.generateText({
|
|
134
|
+
prompt: options.prompt,
|
|
135
|
+
temperature: options.temperature,
|
|
136
|
+
maxTokens: options.maxTokens,
|
|
137
|
+
systemPrompt: enhancedSystemPrompt,
|
|
138
|
+
}, options.schema);
|
|
139
|
+
if (!result) {
|
|
140
|
+
throw new Error("No response received from AI provider");
|
|
141
|
+
}
|
|
142
|
+
const responseTime = Date.now() - startTime;
|
|
143
|
+
// Extract MCP metadata if available
|
|
144
|
+
const metadata = result.metadata || {};
|
|
145
|
+
mcpLogger.debug(`[${functionTag}] MCP-enabled generation completed`, {
|
|
146
|
+
responseTime,
|
|
147
|
+
toolsUsed: metadata.toolsUsed || [],
|
|
148
|
+
enhancedWithTools: metadata.enhancedWithTools || false,
|
|
149
|
+
availableToolsCount: availableTools.length,
|
|
150
|
+
});
|
|
151
|
+
// Check if we actually got content
|
|
152
|
+
if (!result.text || result.text.trim() === "") {
|
|
153
|
+
mcpLogger.warn(`[${functionTag}] Empty response from provider, attempting fallback`, {
|
|
154
|
+
provider: providerName,
|
|
155
|
+
hasText: !!result.text,
|
|
156
|
+
textLength: result.text?.length || 0,
|
|
157
|
+
});
|
|
158
|
+
// Fall back to regular generation if MCP generation returns empty
|
|
159
|
+
return this.generateTextRegular(options);
|
|
160
|
+
}
|
|
161
|
+
return {
|
|
162
|
+
content: result.text,
|
|
163
|
+
provider: providerName,
|
|
164
|
+
usage: result.usage,
|
|
165
|
+
responseTime,
|
|
166
|
+
toolsUsed: metadata.toolsUsed || [],
|
|
167
|
+
enhancedWithTools: metadata.enhancedWithTools || false,
|
|
168
|
+
availableTools: availableTools.length > 0 ? availableTools : undefined,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
// Fall back to regular generation if MCP fails
|
|
173
|
+
mcpLogger.warn(`[${functionTag}] MCP generation failed, falling back to regular`, {
|
|
174
|
+
error: error instanceof Error ? error.message : String(error),
|
|
175
|
+
});
|
|
176
|
+
return this.generateTextRegular(options);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Regular text generation (existing logic)
|
|
181
|
+
*/
|
|
182
|
+
async generateTextRegular(options) {
|
|
15
183
|
const startTime = Date.now();
|
|
16
|
-
const functionTag =
|
|
184
|
+
const functionTag = "NeuroLink.generateTextRegular";
|
|
17
185
|
// Define fallback provider priority order
|
|
18
|
-
const providerPriority = [
|
|
19
|
-
|
|
20
|
-
|
|
186
|
+
const providerPriority = [
|
|
187
|
+
"openai",
|
|
188
|
+
"vertex",
|
|
189
|
+
"bedrock",
|
|
190
|
+
"anthropic",
|
|
191
|
+
"azure",
|
|
192
|
+
"google-ai",
|
|
193
|
+
"huggingface",
|
|
194
|
+
"ollama",
|
|
195
|
+
];
|
|
196
|
+
const requestedProvider = options.provider === "auto" ? undefined : options.provider;
|
|
197
|
+
// Local providers that should not fall back when explicitly requested
|
|
198
|
+
const localProviders = ["ollama"];
|
|
199
|
+
// If specific provider requested, check if we should allow fallback
|
|
21
200
|
const tryProviders = requestedProvider
|
|
22
|
-
?
|
|
201
|
+
? localProviders.includes(requestedProvider)
|
|
202
|
+
? [requestedProvider] // No fallback for local providers
|
|
203
|
+
: [
|
|
204
|
+
requestedProvider,
|
|
205
|
+
...providerPriority.filter((p) => p !== requestedProvider),
|
|
206
|
+
]
|
|
23
207
|
: providerPriority;
|
|
24
|
-
logger.debug(`[${functionTag}] Starting text generation
|
|
25
|
-
requestedProvider: requestedProvider ||
|
|
208
|
+
logger.debug(`[${functionTag}] Starting text generation`, {
|
|
209
|
+
requestedProvider: requestedProvider || "auto",
|
|
26
210
|
tryProviders,
|
|
27
|
-
|
|
211
|
+
allowFallback: !requestedProvider || !localProviders.includes(requestedProvider),
|
|
212
|
+
promptLength: options.prompt.length,
|
|
28
213
|
});
|
|
29
214
|
let lastError = null;
|
|
30
215
|
for (const providerName of tryProviders) {
|
|
31
216
|
try {
|
|
32
|
-
logger.debug(`[${functionTag}] Attempting provider`, {
|
|
33
|
-
|
|
217
|
+
logger.debug(`[${functionTag}] Attempting provider`, {
|
|
218
|
+
provider: providerName,
|
|
219
|
+
});
|
|
220
|
+
const provider = await AIProviderFactory.createProvider(providerName);
|
|
34
221
|
const result = await provider.generateText({
|
|
35
222
|
prompt: options.prompt,
|
|
36
223
|
temperature: options.temperature,
|
|
37
224
|
maxTokens: options.maxTokens,
|
|
38
|
-
systemPrompt: options.systemPrompt
|
|
225
|
+
systemPrompt: options.systemPrompt,
|
|
39
226
|
}, options.schema);
|
|
40
227
|
if (!result) {
|
|
41
|
-
throw new Error(
|
|
228
|
+
throw new Error("No response received from AI provider");
|
|
229
|
+
}
|
|
230
|
+
// Check if we actually got content
|
|
231
|
+
if (!result.text || result.text.trim() === "") {
|
|
232
|
+
logger.warn(`[${functionTag}] Empty response from provider`, {
|
|
233
|
+
provider: providerName,
|
|
234
|
+
hasText: !!result.text,
|
|
235
|
+
textLength: result.text?.length || 0,
|
|
236
|
+
});
|
|
237
|
+
// Continue to next provider if available
|
|
238
|
+
throw new Error(`Empty response from ${providerName}`);
|
|
42
239
|
}
|
|
43
240
|
const responseTime = Date.now() - startTime;
|
|
44
241
|
logger.debug(`[${functionTag}] Provider succeeded`, {
|
|
45
242
|
provider: providerName,
|
|
46
243
|
responseTime,
|
|
47
|
-
usage: result.usage
|
|
244
|
+
usage: result.usage,
|
|
48
245
|
});
|
|
49
246
|
return {
|
|
50
|
-
content: result.text
|
|
247
|
+
content: result.text,
|
|
51
248
|
provider: providerName,
|
|
52
249
|
usage: result.usage,
|
|
53
|
-
responseTime
|
|
250
|
+
responseTime,
|
|
54
251
|
};
|
|
55
252
|
}
|
|
56
253
|
catch (error) {
|
|
@@ -59,7 +256,7 @@ export class NeuroLink {
|
|
|
59
256
|
logger.debug(`[${functionTag}] Provider failed, trying next`, {
|
|
60
257
|
provider: providerName,
|
|
61
258
|
error: errorMessage,
|
|
62
|
-
remainingProviders: tryProviders.slice(tryProviders.indexOf(providerName) + 1)
|
|
259
|
+
remainingProviders: tryProviders.slice(tryProviders.indexOf(providerName) + 1),
|
|
63
260
|
});
|
|
64
261
|
// Continue to next provider
|
|
65
262
|
continue;
|
|
@@ -68,42 +265,87 @@ export class NeuroLink {
|
|
|
68
265
|
// All providers failed
|
|
69
266
|
logger.debug(`[${functionTag}] All providers failed`, {
|
|
70
267
|
triedProviders: tryProviders,
|
|
71
|
-
lastError: lastError?.message
|
|
268
|
+
lastError: lastError?.message,
|
|
72
269
|
});
|
|
73
|
-
throw new Error(`Failed to generate text with all providers. Last error: ${lastError?.message ||
|
|
270
|
+
throw new Error(`Failed to generate text with all providers. Last error: ${lastError?.message || "Unknown error"}`);
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Create tool-aware system prompt that informs AI about available tools
|
|
274
|
+
*/
|
|
275
|
+
createToolAwareSystemPrompt(originalSystemPrompt, availableTools) {
|
|
276
|
+
const basePrompt = originalSystemPrompt || "You are a helpful AI assistant.";
|
|
277
|
+
if (availableTools.length === 0) {
|
|
278
|
+
return basePrompt;
|
|
279
|
+
}
|
|
280
|
+
const toolDescriptions = availableTools
|
|
281
|
+
.map((tool) => `- ${tool.name}: ${tool.description}`)
|
|
282
|
+
.join("\n");
|
|
283
|
+
return `${basePrompt}
|
|
284
|
+
|
|
285
|
+
Available tools that can be used when relevant:
|
|
286
|
+
|
|
287
|
+
${toolDescriptions}
|
|
288
|
+
|
|
289
|
+
You can mention these capabilities when they're relevant to user questions. For example:
|
|
290
|
+
- For time questions: "I can get the current time"
|
|
291
|
+
- For provider questions: "I can check AI provider status"
|
|
292
|
+
- For tool questions: "I can list available tools"
|
|
293
|
+
|
|
294
|
+
Note: Tool integration is currently in development. Please provide helpful responses based on your knowledge while mentioning tool capabilities when relevant.`;
|
|
74
295
|
}
|
|
75
296
|
/**
|
|
76
297
|
* Generate streaming text using the best available AI provider with automatic fallback
|
|
77
298
|
*/
|
|
78
299
|
async generateTextStream(options) {
|
|
79
|
-
const functionTag =
|
|
300
|
+
const functionTag = "NeuroLink.generateTextStream";
|
|
80
301
|
// Define fallback provider priority order
|
|
81
|
-
const providerPriority = [
|
|
82
|
-
|
|
83
|
-
|
|
302
|
+
const providerPriority = [
|
|
303
|
+
"openai",
|
|
304
|
+
"vertex",
|
|
305
|
+
"bedrock",
|
|
306
|
+
"anthropic",
|
|
307
|
+
"azure",
|
|
308
|
+
"google-ai",
|
|
309
|
+
"huggingface",
|
|
310
|
+
"ollama",
|
|
311
|
+
];
|
|
312
|
+
const requestedProvider = options.provider === "auto" ? undefined : options.provider;
|
|
313
|
+
// Local providers that should not fall back when explicitly requested
|
|
314
|
+
const localProviders = ["ollama"];
|
|
315
|
+
// If specific provider requested, check if we should allow fallback
|
|
84
316
|
const tryProviders = requestedProvider
|
|
85
|
-
?
|
|
317
|
+
? localProviders.includes(requestedProvider)
|
|
318
|
+
? [requestedProvider] // No fallback for local providers
|
|
319
|
+
: [
|
|
320
|
+
requestedProvider,
|
|
321
|
+
...providerPriority.filter((p) => p !== requestedProvider),
|
|
322
|
+
]
|
|
86
323
|
: providerPriority;
|
|
87
|
-
logger.debug(`[${functionTag}] Starting stream generation
|
|
88
|
-
requestedProvider: requestedProvider ||
|
|
324
|
+
logger.debug(`[${functionTag}] Starting stream generation`, {
|
|
325
|
+
requestedProvider: requestedProvider || "auto",
|
|
89
326
|
tryProviders,
|
|
90
|
-
|
|
327
|
+
allowFallback: !requestedProvider || !localProviders.includes(requestedProvider),
|
|
328
|
+
promptLength: options.prompt.length,
|
|
91
329
|
});
|
|
92
330
|
let lastError = null;
|
|
93
331
|
for (const providerName of tryProviders) {
|
|
94
332
|
try {
|
|
95
|
-
logger.debug(`[${functionTag}] Attempting provider`, {
|
|
96
|
-
|
|
333
|
+
logger.debug(`[${functionTag}] Attempting provider`, {
|
|
334
|
+
provider: providerName,
|
|
335
|
+
});
|
|
336
|
+
const provider = await AIProviderFactory.createProvider(providerName);
|
|
97
337
|
const result = await provider.streamText({
|
|
98
338
|
prompt: options.prompt,
|
|
99
339
|
temperature: options.temperature,
|
|
100
340
|
maxTokens: options.maxTokens,
|
|
101
|
-
systemPrompt: options.systemPrompt
|
|
341
|
+
systemPrompt: options.systemPrompt,
|
|
102
342
|
});
|
|
103
343
|
if (!result) {
|
|
104
|
-
throw new Error(
|
|
344
|
+
throw new Error("No stream response received from AI provider");
|
|
105
345
|
}
|
|
106
|
-
logger.debug(`[${functionTag}] Provider succeeded`, {
|
|
346
|
+
logger.debug(`[${functionTag}] Provider succeeded`, {
|
|
347
|
+
provider: providerName,
|
|
348
|
+
});
|
|
107
349
|
// Convert the AI SDK stream to our expected format
|
|
108
350
|
async function* convertStream() {
|
|
109
351
|
if (result && result.textStream) {
|
|
@@ -120,7 +362,7 @@ export class NeuroLink {
|
|
|
120
362
|
logger.debug(`[${functionTag}] Provider failed, trying next`, {
|
|
121
363
|
provider: providerName,
|
|
122
364
|
error: errorMessage,
|
|
123
|
-
remainingProviders: tryProviders.slice(tryProviders.indexOf(providerName) + 1)
|
|
365
|
+
remainingProviders: tryProviders.slice(tryProviders.indexOf(providerName) + 1),
|
|
124
366
|
});
|
|
125
367
|
// Continue to next provider
|
|
126
368
|
continue;
|
|
@@ -129,9 +371,9 @@ export class NeuroLink {
|
|
|
129
371
|
// All providers failed
|
|
130
372
|
logger.debug(`[${functionTag}] All providers failed`, {
|
|
131
373
|
triedProviders: tryProviders,
|
|
132
|
-
lastError: lastError?.message
|
|
374
|
+
lastError: lastError?.message,
|
|
133
375
|
});
|
|
134
|
-
throw new Error(`Failed to stream text with all providers. Last error: ${lastError?.message ||
|
|
376
|
+
throw new Error(`Failed to stream text with all providers. Last error: ${lastError?.message || "Unknown error"}`);
|
|
135
377
|
}
|
|
136
378
|
/**
|
|
137
379
|
* Get the best available AI provider
|
|
@@ -142,9 +384,9 @@ export class NeuroLink {
|
|
|
142
384
|
/**
|
|
143
385
|
* Test a specific provider
|
|
144
386
|
*/
|
|
145
|
-
async testProvider(providerName, testPrompt =
|
|
387
|
+
async testProvider(providerName, testPrompt = "test") {
|
|
146
388
|
try {
|
|
147
|
-
const provider = AIProviderFactory.createProvider(providerName);
|
|
389
|
+
const provider = await AIProviderFactory.createProvider(providerName);
|
|
148
390
|
await provider.generateText(testPrompt);
|
|
149
391
|
return true;
|
|
150
392
|
}
|
|
@@ -152,4 +394,34 @@ export class NeuroLink {
|
|
|
152
394
|
return false;
|
|
153
395
|
}
|
|
154
396
|
}
|
|
397
|
+
/**
|
|
398
|
+
* Get access to the unified MCP registry for tool inspection and management
|
|
399
|
+
*/
|
|
400
|
+
getUnifiedRegistry() {
|
|
401
|
+
return defaultUnifiedRegistry;
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Initialize MCP and return discovery statistics
|
|
405
|
+
*/
|
|
406
|
+
async getMCPStatus() {
|
|
407
|
+
await this.initializeMCP();
|
|
408
|
+
const totalServers = defaultUnifiedRegistry.getTotalServerCount();
|
|
409
|
+
const availableServers = defaultUnifiedRegistry.getAvailableServerCount();
|
|
410
|
+
const autoDiscoveredServers = defaultUnifiedRegistry.getAutoDiscoveredServers();
|
|
411
|
+
const allTools = await defaultUnifiedRegistry.listAllTools();
|
|
412
|
+
return {
|
|
413
|
+
mcpInitialized: this.mcpInitialized,
|
|
414
|
+
totalServers,
|
|
415
|
+
availableServers,
|
|
416
|
+
autoDiscoveredCount: autoDiscoveredServers.size,
|
|
417
|
+
totalTools: allTools.length,
|
|
418
|
+
autoDiscoveredServers: Array.from(autoDiscoveredServers.entries()).map(([id, server]) => ({
|
|
419
|
+
id: server.id,
|
|
420
|
+
name: server.config?.name || id,
|
|
421
|
+
source: server.source,
|
|
422
|
+
status: server.status,
|
|
423
|
+
hasServer: !!server.server,
|
|
424
|
+
})),
|
|
425
|
+
};
|
|
426
|
+
}
|
|
155
427
|
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent-Enhanced Provider for NeuroLink CLI
|
|
3
|
+
* Integrates direct tools with AI providers for true agent functionality
|
|
4
|
+
*/
|
|
5
|
+
import { type GenerateTextResult, type StreamTextResult, type ToolSet } from "ai";
|
|
6
|
+
import type { AIProvider, TextGenerationOptions, StreamTextOptions } from "../core/types.js";
|
|
7
|
+
/**
|
|
8
|
+
* Agent configuration options
|
|
9
|
+
*/
|
|
10
|
+
interface AgentConfig {
|
|
11
|
+
provider: "openai" | "google-ai" | "anthropic";
|
|
12
|
+
model?: string;
|
|
13
|
+
toolCategory?: "basic" | "filesystem" | "utility" | "all";
|
|
14
|
+
maxSteps?: number;
|
|
15
|
+
enableTools?: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Agent-Enhanced Provider Class
|
|
19
|
+
* Provides AI generation with tool calling capabilities
|
|
20
|
+
*/
|
|
21
|
+
export declare class AgentEnhancedProvider implements AIProvider {
|
|
22
|
+
private config;
|
|
23
|
+
private model;
|
|
24
|
+
constructor(config: AgentConfig);
|
|
25
|
+
private createModel;
|
|
26
|
+
generateText(optionsOrPrompt: TextGenerationOptions | string): Promise<GenerateTextResult<ToolSet, unknown> | null>;
|
|
27
|
+
streamText(optionsOrPrompt: StreamTextOptions | string): Promise<StreamTextResult<ToolSet, unknown> | null>;
|
|
28
|
+
/**
|
|
29
|
+
* Determine if we should force tool usage based on prompt patterns
|
|
30
|
+
*/
|
|
31
|
+
private shouldForceToolUsage;
|
|
32
|
+
getCapabilities(): string[];
|
|
33
|
+
getProviderName(): string;
|
|
34
|
+
getModelName(): string;
|
|
35
|
+
/**
|
|
36
|
+
* Test agent functionality
|
|
37
|
+
*/
|
|
38
|
+
testAgentCapabilities(): Promise<{
|
|
39
|
+
success: boolean;
|
|
40
|
+
results: any[];
|
|
41
|
+
}>;
|
|
42
|
+
/**
|
|
43
|
+
* Create agent-enhanced provider factory
|
|
44
|
+
*/
|
|
45
|
+
static createAgent(config: AgentConfig): AgentEnhancedProvider;
|
|
46
|
+
/**
|
|
47
|
+
* Create multiple agent providers for comparison
|
|
48
|
+
*/
|
|
49
|
+
static createMultiProviderAgents(): Record<string, AgentEnhancedProvider>;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Helper function to create agent provider
|
|
53
|
+
*/
|
|
54
|
+
export declare function createAgentProvider(provider: "openai" | "google-ai" | "anthropic", options?: Partial<AgentConfig>): AgentEnhancedProvider;
|
|
55
|
+
/**
|
|
56
|
+
* Test all available agent providers
|
|
57
|
+
*/
|
|
58
|
+
export declare function testAllAgentProviders(): Promise<void>;
|
|
59
|
+
export {};
|