@juspay/neurolink 1.3.0 → 1.5.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 +62 -0
- package/README.md +96 -285
- package/dist/cli/commands/config.d.ts +33 -3
- package/dist/cli/commands/config.js +36 -1
- package/dist/cli/index.js +11 -9
- package/dist/core/factory.js +6 -2
- package/dist/core/types.d.ts +12 -2
- package/dist/core/types.js +11 -0
- package/dist/mcp/servers/ai-providers/ai-analysis-tools.d.ts +21 -0
- package/dist/mcp/servers/ai-providers/ai-analysis-tools.js +215 -0
- package/dist/mcp/servers/ai-providers/ai-core-server.d.ts +1 -1
- package/dist/mcp/servers/ai-providers/ai-core-server.js +28 -6
- package/dist/mcp/servers/ai-providers/ai-workflow-tools.d.ts +101 -0
- package/dist/mcp/servers/ai-providers/ai-workflow-tools.js +430 -0
- package/dist/neurolink.d.ts +4 -4
- package/dist/neurolink.js +109 -56
- package/dist/providers/googleAIStudio.d.ts +30 -0
- package/dist/providers/googleAIStudio.js +215 -0
- package/dist/providers/googleVertexAI.js +2 -2
- package/dist/providers/index.d.ts +2 -0
- package/dist/providers/index.js +3 -1
- package/dist/providers/openAI.js +2 -2
- package/dist/utils/providerUtils.js +5 -2
- package/package.json +3 -1
|
@@ -13,7 +13,7 @@ import chalk from 'chalk';
|
|
|
13
13
|
import { z } from 'zod';
|
|
14
14
|
// Configuration schema for validation
|
|
15
15
|
const ConfigSchema = z.object({
|
|
16
|
-
defaultProvider: z.enum(['auto', 'openai', 'bedrock', 'vertex', 'anthropic', 'azure', 'huggingface']).default('auto'),
|
|
16
|
+
defaultProvider: z.enum(['auto', 'openai', 'bedrock', 'vertex', 'anthropic', 'azure', 'google-ai', 'huggingface']).default('auto'),
|
|
17
17
|
providers: z.object({
|
|
18
18
|
openai: z.object({
|
|
19
19
|
apiKey: z.string().optional(),
|
|
@@ -46,6 +46,10 @@ const ConfigSchema = z.object({
|
|
|
46
46
|
deploymentId: z.string().optional(),
|
|
47
47
|
model: z.string().default('gpt-4')
|
|
48
48
|
}).optional(),
|
|
49
|
+
'google-ai': z.object({
|
|
50
|
+
apiKey: z.string().optional(),
|
|
51
|
+
model: z.string().default('gemini-1.5-pro-latest')
|
|
52
|
+
}).optional(),
|
|
49
53
|
huggingface: z.object({
|
|
50
54
|
apiKey: z.string().optional(),
|
|
51
55
|
model: z.string().default('microsoft/DialoGPT-large')
|
|
@@ -123,6 +127,7 @@ export class ConfigManager {
|
|
|
123
127
|
{ name: 'Google Vertex AI - Gemini models', value: 'vertex' },
|
|
124
128
|
{ name: 'Anthropic - Claude models (direct)', value: 'anthropic' },
|
|
125
129
|
{ name: 'Azure OpenAI - Enterprise GPT', value: 'azure' },
|
|
130
|
+
{ name: 'Google AI Studio - Gemini models (direct)', value: 'google-ai' },
|
|
126
131
|
{ name: 'Hugging Face - Open source models', value: 'huggingface' }
|
|
127
132
|
],
|
|
128
133
|
default: this.config.defaultProvider
|
|
@@ -184,6 +189,7 @@ export class ConfigManager {
|
|
|
184
189
|
{ name: 'Google Vertex AI (Gemini)', value: 'vertex' },
|
|
185
190
|
{ name: 'Anthropic Direct (Claude)', value: 'anthropic' },
|
|
186
191
|
{ name: 'Azure OpenAI (Enterprise)', value: 'azure' },
|
|
192
|
+
{ name: 'Google AI Studio (Gemini Direct)', value: 'google-ai' },
|
|
187
193
|
{ name: 'Hugging Face (Open Source)', value: 'huggingface' }
|
|
188
194
|
]
|
|
189
195
|
}
|
|
@@ -213,6 +219,9 @@ export class ConfigManager {
|
|
|
213
219
|
case 'azure':
|
|
214
220
|
await this.setupAzure();
|
|
215
221
|
break;
|
|
222
|
+
case 'google-ai':
|
|
223
|
+
await this.setupGoogleAI();
|
|
224
|
+
break;
|
|
216
225
|
case 'huggingface':
|
|
217
226
|
await this.setupHuggingFace();
|
|
218
227
|
break;
|
|
@@ -442,6 +451,32 @@ export class ConfigManager {
|
|
|
442
451
|
]);
|
|
443
452
|
this.config.providers.azure = answers;
|
|
444
453
|
}
|
|
454
|
+
/**
|
|
455
|
+
* Google AI Studio provider setup
|
|
456
|
+
*/
|
|
457
|
+
async setupGoogleAI() {
|
|
458
|
+
const answers = await inquirer.prompt([
|
|
459
|
+
{
|
|
460
|
+
type: 'password',
|
|
461
|
+
name: 'apiKey',
|
|
462
|
+
message: 'Google AI API Key:',
|
|
463
|
+
validate: (value) => value.length > 0 || 'API key is required'
|
|
464
|
+
},
|
|
465
|
+
{
|
|
466
|
+
type: 'list',
|
|
467
|
+
name: 'model',
|
|
468
|
+
message: 'Default model:',
|
|
469
|
+
choices: [
|
|
470
|
+
'gemini-1.5-pro-latest',
|
|
471
|
+
'gemini-2.0-flash-exp',
|
|
472
|
+
'gemini-1.5-flash-latest',
|
|
473
|
+
'gemini-1.0-pro'
|
|
474
|
+
],
|
|
475
|
+
default: 'gemini-1.5-pro-latest'
|
|
476
|
+
}
|
|
477
|
+
]);
|
|
478
|
+
this.config.providers['google-ai'] = answers;
|
|
479
|
+
}
|
|
445
480
|
/**
|
|
446
481
|
* Hugging Face provider setup
|
|
447
482
|
*/
|
package/dist/cli/index.js
CHANGED
|
@@ -143,9 +143,9 @@ const cli = yargs(args)
|
|
|
143
143
|
.alias('V', 'version')
|
|
144
144
|
.strictOptions()
|
|
145
145
|
.strictCommands()
|
|
146
|
-
.demandCommand(1, '
|
|
146
|
+
.demandCommand(1, '')
|
|
147
147
|
.epilogue('For more info: https://github.com/juspay/neurolink')
|
|
148
|
-
.showHelpOnFail(
|
|
148
|
+
.showHelpOnFail(true, 'Specify --help for available options')
|
|
149
149
|
.middleware((argv) => {
|
|
150
150
|
// Middleware for NEUROLINK_QUIET is fine
|
|
151
151
|
if (process.env.NEUROLINK_QUIET === 'true' && typeof argv.quiet === 'undefined') {
|
|
@@ -212,7 +212,7 @@ const cli = yargs(args)
|
|
|
212
212
|
demandOption: true,
|
|
213
213
|
})
|
|
214
214
|
.option('provider', {
|
|
215
|
-
choices: ['auto', 'openai', 'bedrock', 'vertex', 'anthropic', 'azure'],
|
|
215
|
+
choices: ['auto', 'openai', 'bedrock', 'vertex', 'anthropic', 'azure', 'google-ai'],
|
|
216
216
|
default: 'auto',
|
|
217
217
|
description: 'AI provider to use (auto-selects best available)'
|
|
218
218
|
})
|
|
@@ -266,6 +266,8 @@ const cli = yargs(args)
|
|
|
266
266
|
if (result.usage)
|
|
267
267
|
console.log(chalk.blue(`ℹ️ ${result.usage.totalTokens} tokens used`));
|
|
268
268
|
}
|
|
269
|
+
// Explicitly exit to prevent hanging, especially with Google AI Studio
|
|
270
|
+
process.exit(0);
|
|
269
271
|
}
|
|
270
272
|
catch (error) {
|
|
271
273
|
if (argv.format === 'json' && originalConsole.log) {
|
|
@@ -286,7 +288,7 @@ const cli = yargs(args)
|
|
|
286
288
|
.command('stream <prompt>', 'Stream text generation in real-time', (yargsInstance) => yargsInstance
|
|
287
289
|
.usage('Usage: $0 stream <prompt> [options]')
|
|
288
290
|
.positional('prompt', { type: 'string', description: 'Text prompt for streaming', demandOption: true })
|
|
289
|
-
.option('provider', { choices: ['auto', 'openai', 'bedrock', 'vertex', 'anthropic', 'azure'], default: 'auto', description: 'AI provider to use' })
|
|
291
|
+
.option('provider', { choices: ['auto', 'openai', 'bedrock', 'vertex', 'anthropic', 'azure', 'google-ai'], default: 'auto', description: 'AI provider to use' })
|
|
290
292
|
.option('temperature', { type: 'number', default: 0.7, description: 'Creativity level' })
|
|
291
293
|
.example('$0 stream "Tell me a story"', 'Stream a story in real-time'), async (argv) => {
|
|
292
294
|
if (!argv.quiet)
|
|
@@ -313,7 +315,7 @@ const cli = yargs(args)
|
|
|
313
315
|
.positional('file', { type: 'string', description: 'File with prompts (one per line)', demandOption: true })
|
|
314
316
|
.option('output', { type: 'string', description: 'Output file for results (default: stdout)' })
|
|
315
317
|
.option('delay', { type: 'number', default: 1000, description: 'Delay between requests in milliseconds' })
|
|
316
|
-
.option('provider', { choices: ['auto', 'openai', 'bedrock', 'vertex', 'anthropic', 'azure'], default: 'auto', description: 'AI provider to use' })
|
|
318
|
+
.option('provider', { choices: ['auto', 'openai', 'bedrock', 'vertex', 'anthropic', 'azure', 'google-ai'], default: 'auto', description: 'AI provider to use' })
|
|
317
319
|
.option('timeout', { type: 'number', default: 30000, description: 'Timeout for each request in milliseconds' })
|
|
318
320
|
.option('temperature', { type: 'number', description: 'Global temperature for batch jobs' })
|
|
319
321
|
.option('max-tokens', { type: 'number', description: 'Global max tokens for batch jobs' })
|
|
@@ -393,7 +395,7 @@ const cli = yargs(args)
|
|
|
393
395
|
const spinner = argv.quiet ? null : ora('🔍 Checking AI provider status...\n').start();
|
|
394
396
|
// Middleware sets argv.verbose if NEUROLINK_DEBUG is true and --verbose is not specified
|
|
395
397
|
// Removed the spinner.stopAndPersist logic from here as it's handled before spinner start
|
|
396
|
-
const providers = ['openai', 'bedrock', 'vertex', 'anthropic', 'azure'];
|
|
398
|
+
const providers = ['openai', 'bedrock', 'vertex', 'anthropic', 'azure', 'google-ai'];
|
|
397
399
|
const results = [];
|
|
398
400
|
for (const p of providers) {
|
|
399
401
|
if (spinner)
|
|
@@ -427,13 +429,13 @@ const cli = yargs(args)
|
|
|
427
429
|
}
|
|
428
430
|
})
|
|
429
431
|
.command('list', 'List available AI providers', (y) => y.usage('Usage: $0 provider list'), async () => {
|
|
430
|
-
console.log('Available providers: openai, bedrock, vertex, anthropic, azure');
|
|
432
|
+
console.log('Available providers: openai, bedrock, vertex, anthropic, azure, google-ai');
|
|
431
433
|
})
|
|
432
434
|
.command('configure <providerName>', 'Display configuration guidance for a provider', (y) => y
|
|
433
435
|
.usage('Usage: $0 provider configure <providerName>')
|
|
434
436
|
.positional('providerName', {
|
|
435
437
|
type: 'string',
|
|
436
|
-
choices: ['openai', 'bedrock', 'vertex', 'anthropic', 'azure'],
|
|
438
|
+
choices: ['openai', 'bedrock', 'vertex', 'anthropic', 'azure', 'google-ai'],
|
|
437
439
|
description: 'Name of the provider to configure',
|
|
438
440
|
demandOption: true,
|
|
439
441
|
})
|
|
@@ -465,7 +467,7 @@ const cli = yargs(args)
|
|
|
465
467
|
const spinner = argv.quiet ? null : ora('🔍 Checking AI provider status...\n').start();
|
|
466
468
|
// Middleware sets argv.verbose if NEUROLINK_DEBUG is true and --verbose is not specified
|
|
467
469
|
// Removed the spinner.stopAndPersist logic from here as it's handled before spinner start
|
|
468
|
-
const providers = ['openai', 'bedrock', 'vertex', 'anthropic', 'azure'];
|
|
470
|
+
const providers = ['openai', 'bedrock', 'vertex', 'anthropic', 'azure', 'google-ai'];
|
|
469
471
|
const results = [];
|
|
470
472
|
for (const p of providers) {
|
|
471
473
|
if (spinner)
|
package/dist/core/factory.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { GoogleVertexAI, AmazonBedrock, OpenAI, AnthropicProvider, AzureOpenAIProvider } from '../providers/index.js';
|
|
1
|
+
import { GoogleVertexAI, AmazonBedrock, OpenAI, AnthropicProvider, AzureOpenAIProvider, GoogleAIStudio } from '../providers/index.js';
|
|
2
2
|
import { getBestProvider } from '../utils/providerUtils.js';
|
|
3
3
|
const componentIdentifier = 'aiProviderFactory';
|
|
4
4
|
/**
|
|
@@ -42,8 +42,12 @@ export class AIProviderFactory {
|
|
|
42
42
|
case 'azure-openai':
|
|
43
43
|
provider = new AzureOpenAIProvider();
|
|
44
44
|
break;
|
|
45
|
+
case 'google-ai':
|
|
46
|
+
case 'google-studio':
|
|
47
|
+
provider = new GoogleAIStudio(modelName);
|
|
48
|
+
break;
|
|
45
49
|
default:
|
|
46
|
-
throw new Error(`Unknown provider: ${providerName}. Supported providers: vertex, bedrock, openai, anthropic, azure`);
|
|
50
|
+
throw new Error(`Unknown provider: ${providerName}. Supported providers: vertex, bedrock, openai, anthropic, azure, google-ai`);
|
|
47
51
|
}
|
|
48
52
|
console.log(`[${functionTag}] Provider creation succeeded`, {
|
|
49
53
|
providerName,
|
package/dist/core/types.d.ts
CHANGED
|
@@ -8,7 +8,8 @@ export declare enum AIProviderName {
|
|
|
8
8
|
OPENAI = "openai",
|
|
9
9
|
VERTEX = "vertex",
|
|
10
10
|
ANTHROPIC = "anthropic",
|
|
11
|
-
AZURE = "azure"
|
|
11
|
+
AZURE = "azure",
|
|
12
|
+
GOOGLE_AI = "google-ai"
|
|
12
13
|
}
|
|
13
14
|
/**
|
|
14
15
|
* Supported Models for Amazon Bedrock
|
|
@@ -36,10 +37,19 @@ export declare enum VertexModels {
|
|
|
36
37
|
CLAUDE_4_0_SONNET = "claude-sonnet-4@20250514",
|
|
37
38
|
GEMINI_2_5_FLASH = "gemini-2.5-flash-preview-05-20"
|
|
38
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* Supported Models for Google AI Studio
|
|
42
|
+
*/
|
|
43
|
+
export declare enum GoogleAIModels {
|
|
44
|
+
GEMINI_1_5_PRO_LATEST = "gemini-1.5-pro-latest",
|
|
45
|
+
GEMINI_1_5_FLASH_LATEST = "gemini-1.5-flash-latest",
|
|
46
|
+
GEMINI_2_0_FLASH_EXP = "gemini-2.0-flash-exp",
|
|
47
|
+
GEMINI_1_0_PRO = "gemini-1.0-pro"
|
|
48
|
+
}
|
|
39
49
|
/**
|
|
40
50
|
* Union type of all supported model names
|
|
41
51
|
*/
|
|
42
|
-
export type SupportedModelName = BedrockModels | OpenAIModels | VertexModels;
|
|
52
|
+
export type SupportedModelName = BedrockModels | OpenAIModels | VertexModels | GoogleAIModels;
|
|
43
53
|
/**
|
|
44
54
|
* Provider configuration specifying provider and its available models
|
|
45
55
|
*/
|
package/dist/core/types.js
CHANGED
|
@@ -8,6 +8,7 @@ export var AIProviderName;
|
|
|
8
8
|
AIProviderName["VERTEX"] = "vertex";
|
|
9
9
|
AIProviderName["ANTHROPIC"] = "anthropic";
|
|
10
10
|
AIProviderName["AZURE"] = "azure";
|
|
11
|
+
AIProviderName["GOOGLE_AI"] = "google-ai";
|
|
11
12
|
})(AIProviderName || (AIProviderName = {}));
|
|
12
13
|
/**
|
|
13
14
|
* Supported Models for Amazon Bedrock
|
|
@@ -38,6 +39,16 @@ export var VertexModels;
|
|
|
38
39
|
VertexModels["CLAUDE_4_0_SONNET"] = "claude-sonnet-4@20250514";
|
|
39
40
|
VertexModels["GEMINI_2_5_FLASH"] = "gemini-2.5-flash-preview-05-20";
|
|
40
41
|
})(VertexModels || (VertexModels = {}));
|
|
42
|
+
/**
|
|
43
|
+
* Supported Models for Google AI Studio
|
|
44
|
+
*/
|
|
45
|
+
export var GoogleAIModels;
|
|
46
|
+
(function (GoogleAIModels) {
|
|
47
|
+
GoogleAIModels["GEMINI_1_5_PRO_LATEST"] = "gemini-1.5-pro-latest";
|
|
48
|
+
GoogleAIModels["GEMINI_1_5_FLASH_LATEST"] = "gemini-1.5-flash-latest";
|
|
49
|
+
GoogleAIModels["GEMINI_2_0_FLASH_EXP"] = "gemini-2.0-flash-exp";
|
|
50
|
+
GoogleAIModels["GEMINI_1_0_PRO"] = "gemini-1.0-pro";
|
|
51
|
+
})(GoogleAIModels || (GoogleAIModels = {}));
|
|
41
52
|
/**
|
|
42
53
|
* Default provider configurations
|
|
43
54
|
*/
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NeuroLink AI Analysis Tools
|
|
3
|
+
* AI-focused MCP tools for usage analysis, performance benchmarking, and parameter optimization
|
|
4
|
+
* Tools: analyze-ai-usage, benchmark-provider-performance, optimize-prompt-parameters
|
|
5
|
+
*/
|
|
6
|
+
import type { NeuroLinkMCPTool } from '../../factory.js';
|
|
7
|
+
/**
|
|
8
|
+
* AI Usage Analysis Tool
|
|
9
|
+
* Analyzes AI usage patterns, token consumption, and cost optimization opportunities
|
|
10
|
+
*/
|
|
11
|
+
export declare const analyzeAIUsageTool: NeuroLinkMCPTool;
|
|
12
|
+
/**
|
|
13
|
+
* Provider Performance Benchmarking Tool
|
|
14
|
+
* Benchmarks AI provider performance across latency, quality, and cost metrics
|
|
15
|
+
*/
|
|
16
|
+
export declare const benchmarkProviderPerformanceTool: NeuroLinkMCPTool;
|
|
17
|
+
/**
|
|
18
|
+
* Prompt Parameter Optimization Tool
|
|
19
|
+
* Optimizes prompt parameters (temperature, max tokens) for better AI output quality and efficiency
|
|
20
|
+
*/
|
|
21
|
+
export declare const optimizePromptParametersTool: NeuroLinkMCPTool;
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NeuroLink AI Analysis Tools
|
|
3
|
+
* AI-focused MCP tools for usage analysis, performance benchmarking, and parameter optimization
|
|
4
|
+
* Tools: analyze-ai-usage, benchmark-provider-performance, optimize-prompt-parameters
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { AIProviderFactory } from '../../../core/factory.js';
|
|
8
|
+
import { getBestProvider, getAvailableProviders } from '../../../utils/providerUtils.js';
|
|
9
|
+
/**
|
|
10
|
+
* Input Schemas for AI Analysis Tools
|
|
11
|
+
*/
|
|
12
|
+
const AnalyzeUsageSchema = z.object({
|
|
13
|
+
sessionId: z.string().optional(),
|
|
14
|
+
timeRange: z.enum(['1h', '24h', '7d', '30d']).default('24h'),
|
|
15
|
+
provider: z.enum(['openai', 'bedrock', 'vertex', 'anthropic', 'google-ai']).optional(),
|
|
16
|
+
includeTokenBreakdown: z.boolean().default(true),
|
|
17
|
+
includeCostEstimation: z.boolean().default(true)
|
|
18
|
+
});
|
|
19
|
+
const BenchmarkSchema = z.object({
|
|
20
|
+
providers: z.array(z.enum(['openai', 'bedrock', 'vertex', 'anthropic', 'google-ai'])).optional(),
|
|
21
|
+
testPrompts: z.array(z.string()).optional(),
|
|
22
|
+
iterations: z.number().min(1).max(5).default(2),
|
|
23
|
+
metrics: z.array(z.enum(['latency', 'quality', 'cost', 'tokens'])).default(['latency', 'quality']),
|
|
24
|
+
maxTokens: z.number().positive().default(100)
|
|
25
|
+
});
|
|
26
|
+
const OptimizeParametersSchema = z.object({
|
|
27
|
+
prompt: z.string().min(1, 'Prompt is required for optimization'),
|
|
28
|
+
provider: z.enum(['openai', 'bedrock', 'vertex', 'anthropic', 'google-ai']).optional(),
|
|
29
|
+
targetLength: z.number().positive().optional(),
|
|
30
|
+
style: z.enum(['creative', 'balanced', 'precise', 'factual']).default('balanced'),
|
|
31
|
+
optimizeFor: z.enum(['speed', 'quality', 'cost', 'tokens']).default('quality'),
|
|
32
|
+
iterations: z.number().min(1).max(3).default(2)
|
|
33
|
+
});
|
|
34
|
+
/**
|
|
35
|
+
* AI Usage Analysis Tool
|
|
36
|
+
* Analyzes AI usage patterns, token consumption, and cost optimization opportunities
|
|
37
|
+
*/
|
|
38
|
+
export const analyzeAIUsageTool = {
|
|
39
|
+
name: 'analyze-ai-usage',
|
|
40
|
+
description: 'Analyze AI usage patterns, token consumption, and cost optimization opportunities',
|
|
41
|
+
category: 'ai-analysis',
|
|
42
|
+
inputSchema: AnalyzeUsageSchema,
|
|
43
|
+
isImplemented: true,
|
|
44
|
+
permissions: ['read', 'analytics'],
|
|
45
|
+
version: '1.2.0', // Updated version with real AI
|
|
46
|
+
execute: async (params, context) => {
|
|
47
|
+
const startTime = Date.now();
|
|
48
|
+
try {
|
|
49
|
+
console.log(`[AI-Analysis] Starting real AI-powered usage analysis for timeRange: ${params.timeRange}`);
|
|
50
|
+
const providerName = await getBestProvider();
|
|
51
|
+
const provider = await AIProviderFactory.createProvider(providerName);
|
|
52
|
+
if (!provider) {
|
|
53
|
+
throw new Error(`Failed to create AI provider: ${providerName}`);
|
|
54
|
+
}
|
|
55
|
+
const analysisPrompt = `
|
|
56
|
+
Analyze hypothetical AI usage data for a project based on the following parameters.
|
|
57
|
+
Time Range: ${params.timeRange}
|
|
58
|
+
Provider Focus: ${params.provider || 'all'}
|
|
59
|
+
|
|
60
|
+
Generate a realistic analysis including:
|
|
61
|
+
1. A summary of usage statistics (totalRequests, totalTokens).
|
|
62
|
+
2. A breakdown of usage by provider (OpenAI, Bedrock, Vertex).
|
|
63
|
+
3. Key insights and actionable recommendations for cost and performance optimization.
|
|
64
|
+
|
|
65
|
+
Return the result as a valid JSON object with keys: "analysis", "insights".
|
|
66
|
+
- "analysis" should contain: timeRange, totalRequests, totalTokens, and a "providers" object.
|
|
67
|
+
- "insights" should contain: mostUsedProvider, avgCostPerToken, peakUsageHours, costOptimizationPotential, and an array of "recommendations".
|
|
68
|
+
`;
|
|
69
|
+
const result = await provider.generateText({ prompt: analysisPrompt, maxTokens: 800, temperature: 0.5 });
|
|
70
|
+
if (!result || !result.text) {
|
|
71
|
+
throw new Error('AI provider returned no result for usage analysis.');
|
|
72
|
+
}
|
|
73
|
+
const parsedData = JSON.parse(result.text);
|
|
74
|
+
const executionTime = Date.now() - startTime;
|
|
75
|
+
return {
|
|
76
|
+
success: true,
|
|
77
|
+
data: { ...parsedData, generatedAt: new Date().toISOString(), sessionId: context.sessionId },
|
|
78
|
+
usage: { ...result.usage, executionTime, provider: providerName, model: 'analysis-engine' },
|
|
79
|
+
metadata: { toolName: 'analyze-ai-usage', serverId: 'neurolink-ai-core', sessionId: context.sessionId, timestamp: Date.now(), executionTime }
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
const executionTime = Date.now() - startTime;
|
|
84
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
85
|
+
return { success: false, error: errorMessage, metadata: { toolName: 'analyze-ai-usage', serverId: 'neurolink-ai-core', sessionId: context.sessionId, timestamp: Date.now(), executionTime } };
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* Provider Performance Benchmarking Tool
|
|
91
|
+
* Benchmarks AI provider performance across latency, quality, and cost metrics
|
|
92
|
+
*/
|
|
93
|
+
export const benchmarkProviderPerformanceTool = {
|
|
94
|
+
name: 'benchmark-provider-performance',
|
|
95
|
+
description: 'Benchmark AI provider performance across latency, quality, and cost metrics',
|
|
96
|
+
category: 'ai-analysis',
|
|
97
|
+
inputSchema: BenchmarkSchema,
|
|
98
|
+
isImplemented: true,
|
|
99
|
+
permissions: ['read', 'benchmark'],
|
|
100
|
+
version: '1.1.0', // Updated version with real AI
|
|
101
|
+
execute: async (params, context) => {
|
|
102
|
+
const startTime = Date.now();
|
|
103
|
+
try {
|
|
104
|
+
const providersToTest = params.providers || getAvailableProviders();
|
|
105
|
+
const testPrompts = params.testPrompts || ['Explain quantum computing in simple terms'];
|
|
106
|
+
const benchmarkResults = [];
|
|
107
|
+
for (const providerName of providersToTest) {
|
|
108
|
+
const provider = await AIProviderFactory.createProvider(providerName);
|
|
109
|
+
if (!provider) {
|
|
110
|
+
benchmarkResults.push({ provider: providerName, error: 'Failed to create provider.' });
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
let totalLatency = 0, totalTokens = 0, successfulTests = 0;
|
|
114
|
+
for (const prompt of testPrompts) {
|
|
115
|
+
for (let i = 0; i < params.iterations; i++) {
|
|
116
|
+
const testStartTime = Date.now();
|
|
117
|
+
const result = await provider.generateText({ prompt, maxTokens: params.maxTokens });
|
|
118
|
+
if (result && result.usage) {
|
|
119
|
+
totalLatency += (Date.now() - testStartTime);
|
|
120
|
+
totalTokens += result.usage.totalTokens || 0;
|
|
121
|
+
successfulTests++;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
benchmarkResults.push({
|
|
126
|
+
provider: providerName,
|
|
127
|
+
metrics: {
|
|
128
|
+
avgLatency: successfulTests > 0 ? Math.round(totalLatency / successfulTests) : 0,
|
|
129
|
+
totalTokens: totalTokens,
|
|
130
|
+
successRate: successfulTests / (testPrompts.length * params.iterations) * 100
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
const executionTime = Date.now() - startTime;
|
|
135
|
+
return {
|
|
136
|
+
success: true,
|
|
137
|
+
data: { results: benchmarkResults, benchmarkedAt: new Date().toISOString() },
|
|
138
|
+
usage: { executionTime, provider: 'benchmark-engine', model: 'multi-provider' },
|
|
139
|
+
metadata: { toolName: 'benchmark-provider-performance', serverId: 'neurolink-ai-core', sessionId: context.sessionId, timestamp: Date.now(), executionTime }
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
const executionTime = Date.now() - startTime;
|
|
144
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
145
|
+
return { success: false, error: errorMessage, metadata: { toolName: 'benchmark-provider-performance', serverId: 'neurolink-ai-core', sessionId: context.sessionId, timestamp: Date.now(), executionTime } };
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
/**
|
|
150
|
+
* Prompt Parameter Optimization Tool
|
|
151
|
+
* Optimizes prompt parameters (temperature, max tokens) for better AI output quality and efficiency
|
|
152
|
+
*/
|
|
153
|
+
export const optimizePromptParametersTool = {
|
|
154
|
+
name: 'optimize-prompt-parameters',
|
|
155
|
+
description: 'Optimize prompt parameters (temperature, max tokens) for better AI output quality and efficiency',
|
|
156
|
+
category: 'ai-optimization',
|
|
157
|
+
inputSchema: OptimizeParametersSchema,
|
|
158
|
+
isImplemented: true,
|
|
159
|
+
permissions: ['read', 'optimize'],
|
|
160
|
+
version: '1.1.0', // Updated version with real AI
|
|
161
|
+
execute: async (params, context) => {
|
|
162
|
+
const startTime = Date.now();
|
|
163
|
+
try {
|
|
164
|
+
const providerName = params.provider || await getBestProvider();
|
|
165
|
+
const provider = await AIProviderFactory.createProvider(providerName);
|
|
166
|
+
if (!provider)
|
|
167
|
+
throw new Error(`Failed to create provider: ${providerName}`);
|
|
168
|
+
const optimizationResults = [];
|
|
169
|
+
const temperatures = [0.2, 0.7, 1.0]; // Test a range of temperatures
|
|
170
|
+
for (const temp of temperatures) {
|
|
171
|
+
const result = await provider.generateText({ prompt: params.prompt, temperature: temp, maxTokens: params.targetLength || 250 });
|
|
172
|
+
if (result) {
|
|
173
|
+
optimizationResults.push({
|
|
174
|
+
parameters: { temperature: temp },
|
|
175
|
+
output: result.text,
|
|
176
|
+
usage: result.usage
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
const analysisProvider = await AIProviderFactory.createProvider(await getBestProvider());
|
|
181
|
+
if (!analysisProvider)
|
|
182
|
+
throw new Error('Failed to create analysis provider.');
|
|
183
|
+
const analysisPrompt = `
|
|
184
|
+
Analyze the following AI-generated responses for the prompt "${params.prompt}" based on the optimization goal of "${params.optimizeFor}".
|
|
185
|
+
|
|
186
|
+
Responses:
|
|
187
|
+
${optimizationResults.map((r, i) => `Response ${i + 1} (Temp: ${r.parameters.temperature}):\n${r.output}`).join('\n\n')}
|
|
188
|
+
|
|
189
|
+
Determine which set of parameters is optimal and provide a recommendation.
|
|
190
|
+
Return a valid JSON object with keys: "optimalParameters", "reasoning", "recommendations".
|
|
191
|
+
`;
|
|
192
|
+
const analysisResult = await analysisProvider.generateText({ prompt: analysisPrompt, maxTokens: 500 });
|
|
193
|
+
if (!analysisResult || !analysisResult.text)
|
|
194
|
+
throw new Error('Optimization analysis failed.');
|
|
195
|
+
const parsedAnalysis = JSON.parse(analysisResult.text);
|
|
196
|
+
const executionTime = Date.now() - startTime;
|
|
197
|
+
return {
|
|
198
|
+
success: true,
|
|
199
|
+
data: {
|
|
200
|
+
optimization: { originalPrompt: params.prompt, optimizeFor: params.optimizeFor, provider: providerName },
|
|
201
|
+
results: optimizationResults,
|
|
202
|
+
recommendations: parsedAnalysis,
|
|
203
|
+
optimizedAt: new Date().toISOString()
|
|
204
|
+
},
|
|
205
|
+
usage: { executionTime, provider: 'optimization-engine', model: 'multi-provider' },
|
|
206
|
+
metadata: { toolName: 'optimize-prompt-parameters', serverId: 'neurolink-ai-core', sessionId: context.sessionId, timestamp: Date.now(), executionTime }
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
const executionTime = Date.now() - startTime;
|
|
211
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
212
|
+
return { success: false, error: errorMessage, metadata: { toolName: 'optimize-prompt-parameters', serverId: 'neurolink-ai-core', sessionId: context.sessionId, timestamp: Date.now(), executionTime } };
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
};
|
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
*/
|
|
6
6
|
/**
|
|
7
7
|
* AI Core Server - Central hub for AI provider tools
|
|
8
|
-
* Provides text generation, provider selection, and
|
|
8
|
+
* Provides text generation, provider selection, AI analysis, and development workflow tools
|
|
9
9
|
*/
|
|
10
10
|
export declare const aiCoreServer: import("../../factory.js").NeuroLinkMCPServer;
|
|
@@ -7,22 +7,29 @@ import { z } from 'zod';
|
|
|
7
7
|
import { createMCPServer } from '../../factory.js';
|
|
8
8
|
import { AIProviderFactory } from '../../../core/factory.js';
|
|
9
9
|
import { getBestProvider, getAvailableProviders } from '../../../utils/providerUtils.js';
|
|
10
|
+
import { analyzeAIUsageTool, benchmarkProviderPerformanceTool, optimizePromptParametersTool } from './ai-analysis-tools.js';
|
|
11
|
+
import { generateTestCasesTool, refactorCodeTool, generateDocumentationTool, debugAIOutputTool } from './ai-workflow-tools.js';
|
|
10
12
|
/**
|
|
11
13
|
* AI Core Server - Central hub for AI provider tools
|
|
12
|
-
* Provides text generation, provider selection, and
|
|
14
|
+
* Provides text generation, provider selection, AI analysis, and development workflow tools
|
|
13
15
|
*/
|
|
14
16
|
export const aiCoreServer = createMCPServer({
|
|
15
17
|
id: 'neurolink-ai-core',
|
|
16
18
|
title: 'NeuroLink AI Core',
|
|
17
|
-
description: 'Core AI provider tools with automatic fallback and
|
|
19
|
+
description: 'Core AI provider tools with automatic fallback, analysis capabilities, and development workflow enhancement',
|
|
18
20
|
category: 'ai-providers',
|
|
19
|
-
version: '1.
|
|
21
|
+
version: '1.2.0',
|
|
20
22
|
capabilities: [
|
|
21
23
|
'text-generation',
|
|
22
24
|
'provider-selection',
|
|
23
25
|
'automatic-fallback',
|
|
24
26
|
'usage-tracking',
|
|
25
|
-
'multi-provider-support'
|
|
27
|
+
'multi-provider-support',
|
|
28
|
+
'ai-analysis',
|
|
29
|
+
'test-generation',
|
|
30
|
+
'code-refactoring',
|
|
31
|
+
'documentation-generation',
|
|
32
|
+
'ai-debugging'
|
|
26
33
|
]
|
|
27
34
|
});
|
|
28
35
|
/**
|
|
@@ -30,7 +37,7 @@ export const aiCoreServer = createMCPServer({
|
|
|
30
37
|
*/
|
|
31
38
|
const TextGenerationSchema = z.object({
|
|
32
39
|
prompt: z.string().min(1, 'Prompt is required'),
|
|
33
|
-
provider: z.enum(['openai', 'bedrock', 'vertex', 'anthropic']).optional(),
|
|
40
|
+
provider: z.enum(['openai', 'bedrock', 'vertex', 'anthropic', 'google-ai']).optional(),
|
|
34
41
|
model: z.string().optional(),
|
|
35
42
|
temperature: z.number().min(0).max(2).optional(),
|
|
36
43
|
maxTokens: z.number().positive().optional(),
|
|
@@ -276,5 +283,20 @@ aiCoreServer.registerTool({
|
|
|
276
283
|
}
|
|
277
284
|
}
|
|
278
285
|
});
|
|
286
|
+
/**
|
|
287
|
+
* Register AI Analysis Tools
|
|
288
|
+
* Usage analysis, performance benchmarking, and parameter optimization
|
|
289
|
+
*/
|
|
290
|
+
aiCoreServer.registerTool(analyzeAIUsageTool);
|
|
291
|
+
aiCoreServer.registerTool(benchmarkProviderPerformanceTool);
|
|
292
|
+
aiCoreServer.registerTool(optimizePromptParametersTool);
|
|
293
|
+
/**
|
|
294
|
+
* Register AI Development Workflow Tools
|
|
295
|
+
* Test generation, code refactoring, documentation generation, and AI debugging
|
|
296
|
+
*/
|
|
297
|
+
aiCoreServer.registerTool(generateTestCasesTool);
|
|
298
|
+
aiCoreServer.registerTool(refactorCodeTool);
|
|
299
|
+
aiCoreServer.registerTool(generateDocumentationTool);
|
|
300
|
+
aiCoreServer.registerTool(debugAIOutputTool);
|
|
279
301
|
// Log successful server creation
|
|
280
|
-
console.log('[AI-Core] NeuroLink AI Core Server created with tools:', Object.keys(aiCoreServer.tools));
|
|
302
|
+
console.log('[AI-Core] NeuroLink AI Core Server v1.2.0 created with 10 tools:', Object.keys(aiCoreServer.tools));
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Development Workflow Tools
|
|
3
|
+
* Phase 1.2 Implementation - 4 specialized tools for AI development lifecycle
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import type { NeuroLinkMCPTool } from '../../factory.js';
|
|
7
|
+
/**
|
|
8
|
+
* Generate test cases for code functions
|
|
9
|
+
*/
|
|
10
|
+
export declare const generateTestCasesTool: NeuroLinkMCPTool;
|
|
11
|
+
/**
|
|
12
|
+
* Refactor code for improved quality
|
|
13
|
+
*/
|
|
14
|
+
export declare const refactorCodeTool: NeuroLinkMCPTool;
|
|
15
|
+
/**
|
|
16
|
+
* Generate documentation from code
|
|
17
|
+
*/
|
|
18
|
+
export declare const generateDocumentationTool: NeuroLinkMCPTool;
|
|
19
|
+
/**
|
|
20
|
+
* Debug AI-generated output
|
|
21
|
+
*/
|
|
22
|
+
export declare const debugAIOutputTool: NeuroLinkMCPTool;
|
|
23
|
+
export declare const aiWorkflowTools: NeuroLinkMCPTool[];
|
|
24
|
+
export declare const workflowToolSchemas: {
|
|
25
|
+
'generate-test-cases': z.ZodObject<{
|
|
26
|
+
codeFunction: z.ZodString;
|
|
27
|
+
testTypes: z.ZodDefault<z.ZodArray<z.ZodEnum<["unit", "integration", "edge-cases", "performance", "security"]>, "many">>;
|
|
28
|
+
framework: z.ZodDefault<z.ZodEnum<["jest", "mocha", "vitest", "pytest", "unittest", "rspec"]>>;
|
|
29
|
+
coverageTarget: z.ZodDefault<z.ZodNumber>;
|
|
30
|
+
includeAsyncTests: z.ZodDefault<z.ZodBoolean>;
|
|
31
|
+
}, "strip", z.ZodTypeAny, {
|
|
32
|
+
codeFunction: string;
|
|
33
|
+
testTypes: ("unit" | "integration" | "edge-cases" | "performance" | "security")[];
|
|
34
|
+
framework: "jest" | "mocha" | "vitest" | "pytest" | "unittest" | "rspec";
|
|
35
|
+
coverageTarget: number;
|
|
36
|
+
includeAsyncTests: boolean;
|
|
37
|
+
}, {
|
|
38
|
+
codeFunction: string;
|
|
39
|
+
testTypes?: ("unit" | "integration" | "edge-cases" | "performance" | "security")[] | undefined;
|
|
40
|
+
framework?: "jest" | "mocha" | "vitest" | "pytest" | "unittest" | "rspec" | undefined;
|
|
41
|
+
coverageTarget?: number | undefined;
|
|
42
|
+
includeAsyncTests?: boolean | undefined;
|
|
43
|
+
}>;
|
|
44
|
+
'refactor-code': z.ZodObject<{
|
|
45
|
+
code: z.ZodString;
|
|
46
|
+
language: z.ZodDefault<z.ZodString>;
|
|
47
|
+
objectives: z.ZodDefault<z.ZodArray<z.ZodEnum<["readability", "performance", "maintainability", "testability", "modularity", "dry-principle", "solid-principles"]>, "many">>;
|
|
48
|
+
preserveFunctionality: z.ZodDefault<z.ZodBoolean>;
|
|
49
|
+
styleGuide: z.ZodOptional<z.ZodString>;
|
|
50
|
+
}, "strip", z.ZodTypeAny, {
|
|
51
|
+
code: string;
|
|
52
|
+
language: string;
|
|
53
|
+
objectives: ("performance" | "readability" | "maintainability" | "testability" | "modularity" | "dry-principle" | "solid-principles")[];
|
|
54
|
+
preserveFunctionality: boolean;
|
|
55
|
+
styleGuide?: string | undefined;
|
|
56
|
+
}, {
|
|
57
|
+
code: string;
|
|
58
|
+
language?: string | undefined;
|
|
59
|
+
objectives?: ("performance" | "readability" | "maintainability" | "testability" | "modularity" | "dry-principle" | "solid-principles")[] | undefined;
|
|
60
|
+
preserveFunctionality?: boolean | undefined;
|
|
61
|
+
styleGuide?: string | undefined;
|
|
62
|
+
}>;
|
|
63
|
+
'generate-documentation': z.ZodObject<{
|
|
64
|
+
code: z.ZodString;
|
|
65
|
+
language: z.ZodDefault<z.ZodString>;
|
|
66
|
+
documentationType: z.ZodDefault<z.ZodEnum<["jsdoc", "markdown", "sphinx", "doxygen", "readme"]>>;
|
|
67
|
+
includeExamples: z.ZodDefault<z.ZodBoolean>;
|
|
68
|
+
detailLevel: z.ZodDefault<z.ZodEnum<["minimal", "standard", "comprehensive"]>>;
|
|
69
|
+
}, "strip", z.ZodTypeAny, {
|
|
70
|
+
code: string;
|
|
71
|
+
language: string;
|
|
72
|
+
documentationType: "jsdoc" | "markdown" | "sphinx" | "doxygen" | "readme";
|
|
73
|
+
includeExamples: boolean;
|
|
74
|
+
detailLevel: "minimal" | "standard" | "comprehensive";
|
|
75
|
+
}, {
|
|
76
|
+
code: string;
|
|
77
|
+
language?: string | undefined;
|
|
78
|
+
documentationType?: "jsdoc" | "markdown" | "sphinx" | "doxygen" | "readme" | undefined;
|
|
79
|
+
includeExamples?: boolean | undefined;
|
|
80
|
+
detailLevel?: "minimal" | "standard" | "comprehensive" | undefined;
|
|
81
|
+
}>;
|
|
82
|
+
'debug-ai-output': z.ZodObject<{
|
|
83
|
+
aiOutput: z.ZodString;
|
|
84
|
+
expectedBehavior: z.ZodString;
|
|
85
|
+
context: z.ZodOptional<z.ZodString>;
|
|
86
|
+
outputType: z.ZodDefault<z.ZodEnum<["code", "text", "structured-data", "conversation"]>>;
|
|
87
|
+
includeFixSuggestions: z.ZodDefault<z.ZodBoolean>;
|
|
88
|
+
}, "strip", z.ZodTypeAny, {
|
|
89
|
+
aiOutput: string;
|
|
90
|
+
expectedBehavior: string;
|
|
91
|
+
outputType: "code" | "text" | "conversation" | "structured-data";
|
|
92
|
+
includeFixSuggestions: boolean;
|
|
93
|
+
context?: string | undefined;
|
|
94
|
+
}, {
|
|
95
|
+
aiOutput: string;
|
|
96
|
+
expectedBehavior: string;
|
|
97
|
+
context?: string | undefined;
|
|
98
|
+
outputType?: "code" | "text" | "conversation" | "structured-data" | undefined;
|
|
99
|
+
includeFixSuggestions?: boolean | undefined;
|
|
100
|
+
}>;
|
|
101
|
+
};
|