@merabylabs/promptarchitect-mcp 0.1.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/README.md +230 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +13 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/index.d.ts +2 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +2 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/templates.d.ts +36 -0
- package/dist/resources/templates.d.ts.map +1 -0
- package/dist/resources/templates.js +260 -0
- package/dist/resources/templates.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +355 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/analyzePrompt.d.ts +38 -0
- package/dist/tools/analyzePrompt.d.ts.map +1 -0
- package/dist/tools/analyzePrompt.js +196 -0
- package/dist/tools/analyzePrompt.js.map +1 -0
- package/dist/tools/generatePrompt.d.ts +33 -0
- package/dist/tools/generatePrompt.d.ts.map +1 -0
- package/dist/tools/generatePrompt.js +125 -0
- package/dist/tools/generatePrompt.js.map +1 -0
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +8 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/refinePrompt.d.ts +33 -0
- package/dist/tools/refinePrompt.d.ts.map +1 -0
- package/dist/tools/refinePrompt.js +107 -0
- package/dist/tools/refinePrompt.js.map +1 -0
- package/dist/utils/gemini.d.ts +57 -0
- package/dist/utils/gemini.d.ts.map +1 -0
- package/dist/utils/gemini.js +254 -0
- package/dist/utils/gemini.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +46 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate Prompt Tool
|
|
3
|
+
* Transforms user ideas into well-structured prompts
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { generateContent, isGeminiAvailable, logger } from '../utils/index.js';
|
|
7
|
+
export const generatePromptSchema = z.object({
|
|
8
|
+
idea: z.string().min(1).describe('The user\'s raw prompt idea or concept'),
|
|
9
|
+
template: z.enum(['coding', 'writing', 'research', 'analysis', 'factcheck', 'general'])
|
|
10
|
+
.optional()
|
|
11
|
+
.default('general')
|
|
12
|
+
.describe('Template type to use for generation'),
|
|
13
|
+
context: z.string().optional().describe('Additional context or constraints'),
|
|
14
|
+
targetModel: z.enum(['gpt-4', 'claude', 'gemini', 'general'])
|
|
15
|
+
.optional()
|
|
16
|
+
.default('general')
|
|
17
|
+
.describe('Target AI model to optimize for'),
|
|
18
|
+
});
|
|
19
|
+
const TEMPLATE_PREFIXES = {
|
|
20
|
+
coding: `Generate a detailed coding/development prompt for the following task. Include:
|
|
21
|
+
- Clear problem statement
|
|
22
|
+
- Technical requirements and constraints
|
|
23
|
+
- Expected input/output specifications
|
|
24
|
+
- Edge cases to consider
|
|
25
|
+
- Code quality expectations
|
|
26
|
+
|
|
27
|
+
Task: `,
|
|
28
|
+
writing: `Generate a comprehensive writing prompt for the following. Include:
|
|
29
|
+
- Clear writing objective
|
|
30
|
+
- Target audience and tone
|
|
31
|
+
- Structure/format requirements
|
|
32
|
+
- Key points to cover
|
|
33
|
+
- Style guidelines
|
|
34
|
+
|
|
35
|
+
Topic: `,
|
|
36
|
+
research: `Generate a thorough research prompt for the following topic. Include:
|
|
37
|
+
- Research questions to answer
|
|
38
|
+
- Scope and depth expectations
|
|
39
|
+
- Source requirements
|
|
40
|
+
- Output format (report, summary, etc.)
|
|
41
|
+
- Key areas to investigate
|
|
42
|
+
|
|
43
|
+
Topic: `,
|
|
44
|
+
analysis: `Generate an analytical prompt for the following. Include:
|
|
45
|
+
- What to analyze and why
|
|
46
|
+
- Analytical framework or approach
|
|
47
|
+
- Data/evidence expectations
|
|
48
|
+
- Output format and structure
|
|
49
|
+
- Key insights to uncover
|
|
50
|
+
|
|
51
|
+
Subject: `,
|
|
52
|
+
factcheck: `Generate a fact-checking prompt for the following claim. Include:
|
|
53
|
+
- The claim to verify
|
|
54
|
+
- Evidence standards required
|
|
55
|
+
- Source credibility criteria
|
|
56
|
+
- Output format (verdict, confidence, sources)
|
|
57
|
+
- Edge cases and nuances
|
|
58
|
+
|
|
59
|
+
Claim: `,
|
|
60
|
+
general: `Generate a well-structured prompt for the following request. Include:
|
|
61
|
+
- Clear objective
|
|
62
|
+
- Context and constraints
|
|
63
|
+
- Expected output format
|
|
64
|
+
- Quality criteria
|
|
65
|
+
|
|
66
|
+
Request: `,
|
|
67
|
+
};
|
|
68
|
+
export async function generatePrompt(input) {
|
|
69
|
+
const { idea, template = 'general', context, targetModel } = input;
|
|
70
|
+
logger.info('Generating prompt', { template, targetModel, ideaLength: idea.length });
|
|
71
|
+
// Build the generation request
|
|
72
|
+
const templatePrefix = TEMPLATE_PREFIXES[template] || TEMPLATE_PREFIXES.general;
|
|
73
|
+
let fullRequest = templatePrefix + idea;
|
|
74
|
+
if (context) {
|
|
75
|
+
fullRequest += `\n\nAdditional context: ${context}`;
|
|
76
|
+
}
|
|
77
|
+
if (targetModel && targetModel !== 'general') {
|
|
78
|
+
fullRequest += `\n\nOptimize this prompt specifically for ${targetModel}.`;
|
|
79
|
+
}
|
|
80
|
+
let generatedPrompt;
|
|
81
|
+
if (isGeminiAvailable()) {
|
|
82
|
+
generatedPrompt = await generateContent(fullRequest);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
// Fallback: Return a structured template without AI
|
|
86
|
+
generatedPrompt = createFallbackPrompt(idea, template, context);
|
|
87
|
+
logger.warn('Using fallback prompt generation (Gemini unavailable)');
|
|
88
|
+
}
|
|
89
|
+
// Calculate metadata
|
|
90
|
+
const wordCount = generatedPrompt.split(/\s+/).length;
|
|
91
|
+
const estimatedTokens = Math.ceil(wordCount * 1.3); // Rough estimate
|
|
92
|
+
const hasStructure = /^#+\s|^\d+\.|^-\s|^\*\s/m.test(generatedPrompt);
|
|
93
|
+
return {
|
|
94
|
+
prompt: generatedPrompt,
|
|
95
|
+
template,
|
|
96
|
+
metadata: {
|
|
97
|
+
estimatedTokens,
|
|
98
|
+
wordCount,
|
|
99
|
+
hasStructure,
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
function createFallbackPrompt(idea, template, context) {
|
|
104
|
+
const sections = [
|
|
105
|
+
'## Objective',
|
|
106
|
+
idea,
|
|
107
|
+
'',
|
|
108
|
+
'## Context',
|
|
109
|
+
context || 'No additional context provided.',
|
|
110
|
+
'',
|
|
111
|
+
'## Requirements',
|
|
112
|
+
'- Provide a clear, detailed response',
|
|
113
|
+
'- Use structured formatting where appropriate',
|
|
114
|
+
'- Include relevant examples if helpful',
|
|
115
|
+
'',
|
|
116
|
+
'## Output Format',
|
|
117
|
+
'Respond with a well-organized answer that directly addresses the objective.',
|
|
118
|
+
];
|
|
119
|
+
if (template === 'coding') {
|
|
120
|
+
sections.push('', '## Technical Notes', '- Include code examples where applicable', '- Consider edge cases', '- Follow best practices');
|
|
121
|
+
}
|
|
122
|
+
return sections.join('\n');
|
|
123
|
+
}
|
|
124
|
+
export default generatePrompt;
|
|
125
|
+
//# sourceMappingURL=generatePrompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generatePrompt.js","sourceRoot":"","sources":["../../src/tools/generatePrompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tools Index
|
|
3
|
+
* Exports all MCP tools with their schemas and handlers
|
|
4
|
+
*/
|
|
5
|
+
export { generatePrompt, generatePromptSchema, type GeneratePromptInput, } from './generatePrompt.js';
|
|
6
|
+
export { refinePrompt, refinePromptSchema, type RefinePromptInput, } from './refinePrompt.js';
|
|
7
|
+
export { analyzePrompt, analyzePromptSchema, type AnalyzePromptInput, type AnalysisResult, } from './analyzePrompt.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,KAAK,mBAAmB,GACzB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,KAAK,iBAAiB,GACvB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,KAAK,kBAAkB,EACvB,KAAK,cAAc,GACpB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tools Index
|
|
3
|
+
* Exports all MCP tools with their schemas and handlers
|
|
4
|
+
*/
|
|
5
|
+
export { generatePrompt, generatePromptSchema, } from './generatePrompt.js';
|
|
6
|
+
export { refinePrompt, refinePromptSchema, } from './refinePrompt.js';
|
|
7
|
+
export { analyzePrompt, analyzePromptSchema, } from './analyzePrompt.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,cAAc,EACd,oBAAoB,GAErB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,YAAY,EACZ,kBAAkB,GAEnB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,aAAa,EACb,mBAAmB,GAGpB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Refine Prompt Tool
|
|
3
|
+
* Iteratively improves existing prompts based on feedback
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
export declare const refinePromptSchema: z.ZodObject<{
|
|
7
|
+
prompt: z.ZodString;
|
|
8
|
+
feedback: z.ZodString;
|
|
9
|
+
preserveStructure: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
10
|
+
targetModel: z.ZodDefault<z.ZodOptional<z.ZodEnum<["gpt-4", "claude", "gemini", "general"]>>>;
|
|
11
|
+
}, "strip", z.ZodTypeAny, {
|
|
12
|
+
targetModel: "general" | "gpt-4" | "claude" | "gemini";
|
|
13
|
+
prompt: string;
|
|
14
|
+
feedback: string;
|
|
15
|
+
preserveStructure: boolean;
|
|
16
|
+
}, {
|
|
17
|
+
prompt: string;
|
|
18
|
+
feedback: string;
|
|
19
|
+
targetModel?: "general" | "gpt-4" | "claude" | "gemini" | undefined;
|
|
20
|
+
preserveStructure?: boolean | undefined;
|
|
21
|
+
}>;
|
|
22
|
+
export type RefinePromptInput = z.infer<typeof refinePromptSchema>;
|
|
23
|
+
export declare function refinePrompt(input: RefinePromptInput): Promise<{
|
|
24
|
+
refinedPrompt: string;
|
|
25
|
+
changes: string[];
|
|
26
|
+
metadata: {
|
|
27
|
+
originalWordCount: number;
|
|
28
|
+
refinedWordCount: number;
|
|
29
|
+
structurePreserved: boolean;
|
|
30
|
+
};
|
|
31
|
+
}>;
|
|
32
|
+
export default refinePrompt;
|
|
33
|
+
//# sourceMappingURL=refinePrompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refinePrompt.d.ts","sourceRoot":"","sources":["../../src/tools/refinePrompt.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;EAQ7B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEnE,wBAAsB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC;IACpE,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE;QACR,iBAAiB,EAAE,MAAM,CAAC;QAC1B,gBAAgB,EAAE,MAAM,CAAC;QACzB,kBAAkB,EAAE,OAAO,CAAC;KAC7B,CAAC;CACH,CAAC,CAyED;AA6BD,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Refine Prompt Tool
|
|
3
|
+
* Iteratively improves existing prompts based on feedback
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { generateContent, isGeminiAvailable, logger } from '../utils/index.js';
|
|
7
|
+
export const refinePromptSchema = z.object({
|
|
8
|
+
prompt: z.string().min(1).describe('The current prompt to refine'),
|
|
9
|
+
feedback: z.string().min(1).describe('What should be improved or changed'),
|
|
10
|
+
preserveStructure: z.boolean().optional().default(true).describe('Whether to preserve the original structure'),
|
|
11
|
+
targetModel: z.enum(['gpt-4', 'claude', 'gemini', 'general'])
|
|
12
|
+
.optional()
|
|
13
|
+
.default('general')
|
|
14
|
+
.describe('Target AI model to optimize for'),
|
|
15
|
+
});
|
|
16
|
+
export async function refinePrompt(input) {
|
|
17
|
+
const { prompt, feedback, preserveStructure = true, targetModel } = input;
|
|
18
|
+
logger.info('Refining prompt', {
|
|
19
|
+
promptLength: prompt.length,
|
|
20
|
+
feedbackLength: feedback.length,
|
|
21
|
+
preserveStructure,
|
|
22
|
+
targetModel
|
|
23
|
+
});
|
|
24
|
+
const refinementRequest = `You are a prompt engineering expert. Refine the following prompt based on the given feedback.
|
|
25
|
+
|
|
26
|
+
## Original Prompt
|
|
27
|
+
${prompt}
|
|
28
|
+
|
|
29
|
+
## Feedback / Improvement Request
|
|
30
|
+
${feedback}
|
|
31
|
+
|
|
32
|
+
## Instructions
|
|
33
|
+
${preserveStructure ? '- Preserve the overall structure and format of the original prompt' : '- Feel free to restructure the prompt if it improves clarity'}
|
|
34
|
+
- Apply the feedback to improve the prompt
|
|
35
|
+
- Maintain clarity and actionability
|
|
36
|
+
- Keep the core intent intact
|
|
37
|
+
${targetModel !== 'general' ? `- Optimize for ${targetModel}` : ''}
|
|
38
|
+
|
|
39
|
+
## Output Format
|
|
40
|
+
First, provide the refined prompt.
|
|
41
|
+
Then, list 2-4 specific changes you made in a "Changes:" section.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
REFINED PROMPT:`;
|
|
45
|
+
let refinedPrompt;
|
|
46
|
+
let changes = [];
|
|
47
|
+
if (isGeminiAvailable()) {
|
|
48
|
+
const response = await generateContent(refinementRequest);
|
|
49
|
+
// Parse response to extract prompt and changes
|
|
50
|
+
const changesMatch = response.match(/Changes?:?\s*([\s\S]*?)$/i);
|
|
51
|
+
if (changesMatch) {
|
|
52
|
+
refinedPrompt = response.slice(0, changesMatch.index).trim();
|
|
53
|
+
changes = changesMatch[1]
|
|
54
|
+
.split(/\n/)
|
|
55
|
+
.map(line => line.replace(/^[-*•]\s*/, '').trim())
|
|
56
|
+
.filter(line => line.length > 0);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
refinedPrompt = response.trim();
|
|
60
|
+
changes = ['Prompt refined based on feedback'];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
// Fallback: Apply basic transformations
|
|
65
|
+
refinedPrompt = applyBasicRefinements(prompt, feedback);
|
|
66
|
+
changes = ['Applied basic refinements (AI unavailable)'];
|
|
67
|
+
logger.warn('Using fallback refinement (Gemini unavailable)');
|
|
68
|
+
}
|
|
69
|
+
// Calculate metadata
|
|
70
|
+
const originalWordCount = prompt.split(/\s+/).length;
|
|
71
|
+
const refinedWordCount = refinedPrompt.split(/\s+/).length;
|
|
72
|
+
const originalHasStructure = /^#+\s|^\d+\.|^-\s|^\*\s/m.test(prompt);
|
|
73
|
+
const refinedHasStructure = /^#+\s|^\d+\.|^-\s|^\*\s/m.test(refinedPrompt);
|
|
74
|
+
const structurePreserved = !originalHasStructure || refinedHasStructure;
|
|
75
|
+
return {
|
|
76
|
+
refinedPrompt,
|
|
77
|
+
changes,
|
|
78
|
+
metadata: {
|
|
79
|
+
originalWordCount,
|
|
80
|
+
refinedWordCount,
|
|
81
|
+
structurePreserved,
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function applyBasicRefinements(prompt, feedback) {
|
|
86
|
+
let refined = prompt;
|
|
87
|
+
const feedbackLower = feedback.toLowerCase();
|
|
88
|
+
// Basic transformations based on common feedback
|
|
89
|
+
if (feedbackLower.includes('more specific') || feedbackLower.includes('more detail')) {
|
|
90
|
+
refined += '\n\n## Additional Requirements\n- Provide specific, detailed information\n- Include concrete examples where applicable';
|
|
91
|
+
}
|
|
92
|
+
if (feedbackLower.includes('shorter') || feedbackLower.includes('concise')) {
|
|
93
|
+
// Try to simplify
|
|
94
|
+
refined = refined.replace(/\n\n+/g, '\n\n');
|
|
95
|
+
}
|
|
96
|
+
if (feedbackLower.includes('structure') || feedbackLower.includes('organize')) {
|
|
97
|
+
if (!/^#+\s/m.test(refined)) {
|
|
98
|
+
refined = '## Task\n' + refined + '\n\n## Output\nProvide a well-structured response.';
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (feedbackLower.includes('example')) {
|
|
102
|
+
refined += '\n\n## Example\nProvide a relevant example in your response.';
|
|
103
|
+
}
|
|
104
|
+
return refined;
|
|
105
|
+
}
|
|
106
|
+
export default refinePrompt;
|
|
107
|
+
//# sourceMappingURL=refinePrompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refinePrompt.js","sourceRoot":"","sources":["../../src/tools/refinePrompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gemini API client for prompt generation
|
|
3
|
+
*
|
|
4
|
+
* Optimized for:
|
|
5
|
+
* - Low latency with request caching
|
|
6
|
+
* - Graceful degradation with fallbacks
|
|
7
|
+
* - Contextual awareness for prompt refinement
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Initialize the Gemini client
|
|
11
|
+
*/
|
|
12
|
+
export declare function initializeGemini(apiKey?: string): void;
|
|
13
|
+
/**
|
|
14
|
+
* Check if Gemini is available
|
|
15
|
+
*/
|
|
16
|
+
export declare function isGeminiAvailable(): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Get performance statistics
|
|
19
|
+
*/
|
|
20
|
+
export declare function getStats(): {
|
|
21
|
+
totalRequests: number;
|
|
22
|
+
cacheHits: number;
|
|
23
|
+
avgLatencyMs: number;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Generate content using Gemini
|
|
27
|
+
*
|
|
28
|
+
* Features:
|
|
29
|
+
* - Request caching for repeated similar prompts
|
|
30
|
+
* - Performance tracking
|
|
31
|
+
* - Detailed error context
|
|
32
|
+
*/
|
|
33
|
+
export declare function generateContent(userPrompt: string, systemInstruction?: string, options?: {
|
|
34
|
+
skipCache?: boolean;
|
|
35
|
+
temperature?: number;
|
|
36
|
+
}): Promise<string>;
|
|
37
|
+
/**
|
|
38
|
+
* Analyze a prompt for quality metrics
|
|
39
|
+
*/
|
|
40
|
+
export declare function analyzePromptQuality(prompt: string): Promise<{
|
|
41
|
+
scores: {
|
|
42
|
+
clarity: number;
|
|
43
|
+
specificity: number;
|
|
44
|
+
actionability: number;
|
|
45
|
+
completeness: number;
|
|
46
|
+
};
|
|
47
|
+
suggestions: string[];
|
|
48
|
+
warnings: string[];
|
|
49
|
+
}>;
|
|
50
|
+
declare const _default: {
|
|
51
|
+
initializeGemini: typeof initializeGemini;
|
|
52
|
+
isGeminiAvailable: typeof isGeminiAvailable;
|
|
53
|
+
generateContent: typeof generateContent;
|
|
54
|
+
analyzePromptQuality: typeof analyzePromptQuality;
|
|
55
|
+
};
|
|
56
|
+
export default _default;
|
|
57
|
+
//# sourceMappingURL=gemini.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/utils/gemini.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAoBH;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAgBtD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAqCD;;GAEG;AACH,wBAAgB,QAAQ,IAAI;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAM7F;AA0BD;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,iBAAiB,CAAC,EAAE,MAAM,EAC1B,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACtD,OAAO,CAAC,MAAM,CAAC,CA6DjB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAClE,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC,CA0CD;;;;;;;AA0CD,wBAKE"}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gemini API client for prompt generation
|
|
3
|
+
*
|
|
4
|
+
* Optimized for:
|
|
5
|
+
* - Low latency with request caching
|
|
6
|
+
* - Graceful degradation with fallbacks
|
|
7
|
+
* - Contextual awareness for prompt refinement
|
|
8
|
+
*/
|
|
9
|
+
import { GoogleGenerativeAI } from '@google/generative-ai';
|
|
10
|
+
import { logger } from './logger.js';
|
|
11
|
+
let genAI = null;
|
|
12
|
+
let model = null;
|
|
13
|
+
const DEFAULT_MODEL = 'gemini-3-pro-preview';
|
|
14
|
+
// Simple LRU cache for repeated requests (improves latency for similar prompts)
|
|
15
|
+
const responseCache = new Map();
|
|
16
|
+
const CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes
|
|
17
|
+
const MAX_CACHE_SIZE = 50;
|
|
18
|
+
// Performance metrics
|
|
19
|
+
let totalRequests = 0;
|
|
20
|
+
let cacheHits = 0;
|
|
21
|
+
let totalLatencyMs = 0;
|
|
22
|
+
/**
|
|
23
|
+
* Initialize the Gemini client
|
|
24
|
+
*/
|
|
25
|
+
export function initializeGemini(apiKey) {
|
|
26
|
+
const key = apiKey || process.env.GEMINI_API_KEY;
|
|
27
|
+
if (!key) {
|
|
28
|
+
logger.warn('GEMINI_API_KEY not set - AI features will be unavailable');
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
genAI = new GoogleGenerativeAI(key);
|
|
32
|
+
model = genAI.getGenerativeModel({
|
|
33
|
+
model: DEFAULT_MODEL,
|
|
34
|
+
generationConfig: {
|
|
35
|
+
temperature: 1.0, // Required for Gemini 3
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
logger.info('Gemini client initialized', { model: DEFAULT_MODEL });
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Check if Gemini is available
|
|
42
|
+
*/
|
|
43
|
+
export function isGeminiAvailable() {
|
|
44
|
+
return model !== null;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Get cache key for a request
|
|
48
|
+
*/
|
|
49
|
+
function getCacheKey(prompt, systemInstruction) {
|
|
50
|
+
return `${prompt.slice(0, 100)}:${systemInstruction?.slice(0, 50) || 'default'}`;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Check and return cached response if valid
|
|
54
|
+
*/
|
|
55
|
+
function getCachedResponse(key) {
|
|
56
|
+
const cached = responseCache.get(key);
|
|
57
|
+
if (cached && Date.now() - cached.timestamp < CACHE_TTL_MS) {
|
|
58
|
+
cacheHits++;
|
|
59
|
+
logger.debug('Cache hit', { key: key.slice(0, 30) });
|
|
60
|
+
return cached.response;
|
|
61
|
+
}
|
|
62
|
+
if (cached) {
|
|
63
|
+
responseCache.delete(key); // Expired
|
|
64
|
+
}
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Store response in cache
|
|
69
|
+
*/
|
|
70
|
+
function setCachedResponse(key, response) {
|
|
71
|
+
// Evict oldest if at capacity
|
|
72
|
+
if (responseCache.size >= MAX_CACHE_SIZE) {
|
|
73
|
+
const oldestKey = responseCache.keys().next().value;
|
|
74
|
+
if (oldestKey)
|
|
75
|
+
responseCache.delete(oldestKey);
|
|
76
|
+
}
|
|
77
|
+
responseCache.set(key, { response, timestamp: Date.now() });
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get performance statistics
|
|
81
|
+
*/
|
|
82
|
+
export function getStats() {
|
|
83
|
+
return {
|
|
84
|
+
totalRequests,
|
|
85
|
+
cacheHits,
|
|
86
|
+
avgLatencyMs: totalRequests > 0 ? Math.round(totalLatencyMs / totalRequests) : 0,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* System instruction for prompt generation
|
|
91
|
+
*/
|
|
92
|
+
const SYSTEM_INSTRUCTION = `You are PromptArchitect, an expert prompt engineer. Your role is to transform user ideas into well-structured, effective prompts for AI models.
|
|
93
|
+
|
|
94
|
+
## Core Principles
|
|
95
|
+
|
|
96
|
+
1. **Clarity**: Write clear, unambiguous instructions
|
|
97
|
+
2. **Structure**: Use logical organization with headers, bullets, and sections
|
|
98
|
+
3. **Specificity**: Include concrete details, constraints, and examples
|
|
99
|
+
4. **Context**: Provide necessary background information
|
|
100
|
+
5. **Output Format**: Specify exactly how the response should be formatted
|
|
101
|
+
|
|
102
|
+
## Output Format
|
|
103
|
+
|
|
104
|
+
Always structure your generated prompts with:
|
|
105
|
+
- A clear objective statement
|
|
106
|
+
- Relevant context and constraints
|
|
107
|
+
- Step-by-step instructions when applicable
|
|
108
|
+
- Expected output format specification
|
|
109
|
+
- Edge cases or special considerations
|
|
110
|
+
|
|
111
|
+
Generate prompts that are immediately usable with any major AI model (GPT-4, Claude, Gemini).`;
|
|
112
|
+
/**
|
|
113
|
+
* Generate content using Gemini
|
|
114
|
+
*
|
|
115
|
+
* Features:
|
|
116
|
+
* - Request caching for repeated similar prompts
|
|
117
|
+
* - Performance tracking
|
|
118
|
+
* - Detailed error context
|
|
119
|
+
*/
|
|
120
|
+
export async function generateContent(userPrompt, systemInstruction, options) {
|
|
121
|
+
if (!model) {
|
|
122
|
+
throw new Error('Gemini client not initialized. Set GEMINI_API_KEY environment variable.');
|
|
123
|
+
}
|
|
124
|
+
totalRequests++;
|
|
125
|
+
const startTime = Date.now();
|
|
126
|
+
const fullSystemInstruction = systemInstruction || SYSTEM_INSTRUCTION;
|
|
127
|
+
// Check cache first (unless explicitly skipped)
|
|
128
|
+
if (!options?.skipCache) {
|
|
129
|
+
const cacheKey = getCacheKey(userPrompt, systemInstruction);
|
|
130
|
+
const cached = getCachedResponse(cacheKey);
|
|
131
|
+
if (cached) {
|
|
132
|
+
totalLatencyMs += Date.now() - startTime;
|
|
133
|
+
return cached;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
try {
|
|
137
|
+
logger.debug('Generating content', { promptLength: userPrompt.length });
|
|
138
|
+
const result = await model.generateContent({
|
|
139
|
+
contents: [{ role: 'user', parts: [{ text: userPrompt }] }],
|
|
140
|
+
systemInstruction: { role: 'model', parts: [{ text: fullSystemInstruction }] },
|
|
141
|
+
generationConfig: {
|
|
142
|
+
temperature: options?.temperature ?? 0.7,
|
|
143
|
+
topP: 0.95,
|
|
144
|
+
topK: 40,
|
|
145
|
+
maxOutputTokens: 8192,
|
|
146
|
+
},
|
|
147
|
+
});
|
|
148
|
+
const response = result.response;
|
|
149
|
+
const text = response.text();
|
|
150
|
+
const latency = Date.now() - startTime;
|
|
151
|
+
totalLatencyMs += latency;
|
|
152
|
+
// Cache the response
|
|
153
|
+
if (!options?.skipCache) {
|
|
154
|
+
const cacheKey = getCacheKey(userPrompt, systemInstruction);
|
|
155
|
+
setCachedResponse(cacheKey, text);
|
|
156
|
+
}
|
|
157
|
+
logger.debug('Content generated', { responseLength: text.length, latencyMs: latency });
|
|
158
|
+
return text;
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
const latency = Date.now() - startTime;
|
|
162
|
+
totalLatencyMs += latency;
|
|
163
|
+
// Provide actionable error context
|
|
164
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
165
|
+
logger.error('Gemini generation failed', {
|
|
166
|
+
error: errorMessage,
|
|
167
|
+
promptLength: userPrompt.length,
|
|
168
|
+
latencyMs: latency,
|
|
169
|
+
});
|
|
170
|
+
// Wrap with more context for the user
|
|
171
|
+
throw new Error(`AI generation failed after ${latency}ms: ${errorMessage}. Try again or simplify your prompt.`);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Analyze a prompt for quality metrics
|
|
176
|
+
*/
|
|
177
|
+
export async function analyzePromptQuality(prompt) {
|
|
178
|
+
if (!model) {
|
|
179
|
+
// Return rule-based analysis if Gemini not available
|
|
180
|
+
return ruleBasedAnalysis(prompt);
|
|
181
|
+
}
|
|
182
|
+
const analysisPrompt = `Analyze the following prompt for quality and provide:
|
|
183
|
+
1. Scores (0-10) for: clarity, specificity, actionability, completeness
|
|
184
|
+
2. 2-3 specific suggestions for improvement
|
|
185
|
+
3. Any warnings about potential issues
|
|
186
|
+
|
|
187
|
+
Respond in JSON format:
|
|
188
|
+
{
|
|
189
|
+
"scores": { "clarity": X, "specificity": X, "actionability": X, "completeness": X },
|
|
190
|
+
"suggestions": ["suggestion1", "suggestion2"],
|
|
191
|
+
"warnings": ["warning1"] // or empty array
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
PROMPT TO ANALYZE:
|
|
195
|
+
${prompt}`;
|
|
196
|
+
try {
|
|
197
|
+
const result = await model.generateContent({
|
|
198
|
+
contents: [{ role: 'user', parts: [{ text: analysisPrompt }] }],
|
|
199
|
+
generationConfig: {
|
|
200
|
+
temperature: 0.3,
|
|
201
|
+
maxOutputTokens: 1024,
|
|
202
|
+
},
|
|
203
|
+
});
|
|
204
|
+
const text = result.response.text();
|
|
205
|
+
// Extract JSON from response
|
|
206
|
+
const jsonMatch = text.match(/\{[\s\S]*\}/);
|
|
207
|
+
if (jsonMatch) {
|
|
208
|
+
return JSON.parse(jsonMatch[0]);
|
|
209
|
+
}
|
|
210
|
+
return ruleBasedAnalysis(prompt);
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
logger.warn('LLM analysis failed, using rule-based', { error: String(error) });
|
|
214
|
+
return ruleBasedAnalysis(prompt);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Rule-based prompt analysis fallback
|
|
219
|
+
*/
|
|
220
|
+
function ruleBasedAnalysis(prompt) {
|
|
221
|
+
const wordCount = prompt.split(/\s+/).length;
|
|
222
|
+
const hasStructure = /^#+\s|^\d+\.|^-\s|^\*\s/m.test(prompt);
|
|
223
|
+
const hasExamples = /example|e\.g\.|for instance|such as/i.test(prompt);
|
|
224
|
+
const hasConstraints = /must|should|cannot|don't|avoid|ensure/i.test(prompt);
|
|
225
|
+
const hasOutputFormat = /output|format|respond|return|provide/i.test(prompt);
|
|
226
|
+
const clarity = Math.min(10, 5 + (hasStructure ? 2 : 0) + (wordCount > 20 ? 2 : 0) + (wordCount < 500 ? 1 : 0));
|
|
227
|
+
const specificity = Math.min(10, 4 + (hasExamples ? 3 : 0) + (hasConstraints ? 2 : 0) + (wordCount > 50 ? 1 : 0));
|
|
228
|
+
const actionability = Math.min(10, 5 + (hasConstraints ? 2 : 0) + (hasOutputFormat ? 2 : 0) + (hasStructure ? 1 : 0));
|
|
229
|
+
const completeness = Math.min(10, 3 + (hasStructure ? 2 : 0) + (hasExamples ? 2 : 0) + (hasOutputFormat ? 2 : 0) + (wordCount > 100 ? 1 : 0));
|
|
230
|
+
const suggestions = [];
|
|
231
|
+
const warnings = [];
|
|
232
|
+
if (!hasStructure)
|
|
233
|
+
suggestions.push('Add structure using headers, bullets, or numbered lists');
|
|
234
|
+
if (!hasExamples)
|
|
235
|
+
suggestions.push('Include concrete examples to clarify expectations');
|
|
236
|
+
if (!hasOutputFormat)
|
|
237
|
+
suggestions.push('Specify the desired output format');
|
|
238
|
+
if (wordCount < 20)
|
|
239
|
+
warnings.push('Prompt may be too brief - consider adding more context');
|
|
240
|
+
if (wordCount > 1000)
|
|
241
|
+
warnings.push('Prompt is quite long - consider breaking into sections');
|
|
242
|
+
return {
|
|
243
|
+
scores: { clarity, specificity, actionability, completeness },
|
|
244
|
+
suggestions: suggestions.slice(0, 3),
|
|
245
|
+
warnings,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
export default {
|
|
249
|
+
initializeGemini,
|
|
250
|
+
isGeminiAvailable,
|
|
251
|
+
generateContent,
|
|
252
|
+
analyzePromptQuality,
|
|
253
|
+
};
|
|
254
|
+
//# sourceMappingURL=gemini.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/utils/gemini.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,QAAQ,GACT,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAiB,MAAM,aAAa,CAAC;AACjE,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,QAAQ,GACT,MAAM,aAAa,CAAC"}
|