@merabylabs/promptarchitect-mcp 0.1.8 → 0.2.1
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/dist/tools/analyzePrompt.d.ts.map +1 -1
- package/dist/tools/analyzePrompt.js +28 -8
- package/dist/tools/analyzePrompt.js.map +1 -1
- package/dist/tools/generatePrompt.d.ts.map +1 -1
- package/dist/tools/generatePrompt.js +21 -4
- package/dist/tools/generatePrompt.js.map +1 -1
- package/dist/tools/refinePrompt.d.ts.map +1 -1
- package/dist/tools/refinePrompt.js +20 -4
- package/dist/tools/refinePrompt.js.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/usageTracker.d.ts +161 -0
- package/dist/utils/usageTracker.d.ts.map +1 -0
- package/dist/utils/usageTracker.js +363 -0
- package/dist/utils/usageTracker.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyzePrompt.d.ts","sourceRoot":"","sources":["../../src/tools/analyzePrompt.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"analyzePrompt.d.ts","sourceRoot":"","sources":["../../src/tools/analyzePrompt.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,eAAO,MAAM,mBAAmB;;;;;;;;;EAG9B,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAErE,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE;QACR,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,OAAO,CAAC;QACtB,WAAW,EAAE,OAAO,CAAC;QACrB,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC;CACH;AASD,wBAAsB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,cAAc,CAAC,CAiEtF;AA0HD,eAAe,aAAa,CAAC"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Uses PromptArchitect API with local fallback
|
|
5
5
|
*/
|
|
6
6
|
import { z } from 'zod';
|
|
7
|
-
import { logger, apiAnalyzePrompt, isApiClientAvailable, } from '../utils/index.js';
|
|
7
|
+
import { logger, apiAnalyzePrompt, isApiClientAvailable, trackUsage, } from '../utils/index.js';
|
|
8
8
|
export const analyzePromptSchema = z.object({
|
|
9
9
|
prompt: z.string().min(1).describe('The prompt to analyze'),
|
|
10
10
|
evaluationCriteria: z.array(z.string()).optional().describe('Specific criteria to evaluate'),
|
|
@@ -17,12 +17,16 @@ const DEFAULT_CRITERIA = [
|
|
|
17
17
|
];
|
|
18
18
|
export async function analyzePrompt(input) {
|
|
19
19
|
const { prompt, evaluationCriteria = DEFAULT_CRITERIA } = input;
|
|
20
|
+
const startTime = Date.now();
|
|
20
21
|
logger.info('Analyzing prompt', {
|
|
21
22
|
promptLength: prompt.length,
|
|
22
23
|
criteria: evaluationCriteria
|
|
23
24
|
});
|
|
24
25
|
// Calculate structural metadata (always needed)
|
|
25
26
|
const metadata = calculateMetadata(prompt);
|
|
27
|
+
let result;
|
|
28
|
+
let usedApi = false;
|
|
29
|
+
let errorMessage;
|
|
26
30
|
// Use PromptArchitect API
|
|
27
31
|
if (isApiClientAvailable()) {
|
|
28
32
|
try {
|
|
@@ -30,8 +34,9 @@ export async function analyzePrompt(input) {
|
|
|
30
34
|
prompt,
|
|
31
35
|
evaluationCriteria,
|
|
32
36
|
});
|
|
37
|
+
usedApi = true;
|
|
33
38
|
logger.info('Analyzed via PromptArchitect API');
|
|
34
|
-
|
|
39
|
+
result = {
|
|
35
40
|
scores: {
|
|
36
41
|
overall: response.overallScore,
|
|
37
42
|
clarity: response.scores.clarity,
|
|
@@ -46,14 +51,29 @@ export async function analyzePrompt(input) {
|
|
|
46
51
|
};
|
|
47
52
|
}
|
|
48
53
|
catch (error) {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
54
|
+
errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
55
|
+
logger.warn('API request failed, using fallback', { error: errorMessage });
|
|
56
|
+
result = performRuleBasedAnalysis(prompt, metadata);
|
|
52
57
|
}
|
|
53
58
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
59
|
+
else {
|
|
60
|
+
// Fallback rule-based analysis
|
|
61
|
+
logger.warn('Using fallback rule-based analysis');
|
|
62
|
+
result = performRuleBasedAnalysis(prompt, metadata);
|
|
63
|
+
}
|
|
64
|
+
const latencyMs = Date.now() - startTime;
|
|
65
|
+
// Track usage
|
|
66
|
+
await trackUsage({
|
|
67
|
+
tool: 'analyze_prompt',
|
|
68
|
+
endpoint: usedApi ? '/vscode/analyze' : 'fallback',
|
|
69
|
+
model: 'gemini-2.5-flash',
|
|
70
|
+
inputText: prompt,
|
|
71
|
+
outputText: JSON.stringify(result.scores),
|
|
72
|
+
latencyMs,
|
|
73
|
+
status: errorMessage && !result ? 'error' : 'success',
|
|
74
|
+
errorMessage,
|
|
75
|
+
});
|
|
76
|
+
return result;
|
|
57
77
|
}
|
|
58
78
|
function calculateMetadata(prompt) {
|
|
59
79
|
const words = prompt.split(/\s+/).filter(w => w.length > 0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyzePrompt.js","sourceRoot":"","sources":["../../src/tools/analyzePrompt.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,MAAM,EACN,gBAAgB,EAChB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"analyzePrompt.js","sourceRoot":"","sources":["../../src/tools/analyzePrompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generatePrompt.d.ts","sourceRoot":"","sources":["../../src/tools/generatePrompt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"generatePrompt.d.ts","sourceRoot":"","sources":["../../src/tools/generatePrompt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;EAY/B,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEvE,wBAAsB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC;IACxE,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE;QACR,eAAe,EAAE,MAAM,CAAC;QACxB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,OAAO,CAAC;KACvB,CAAC;CACH,CAAC,CAgED;AA0BD,eAAe,cAAc,CAAC"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Uses PromptArchitect backend API with fallback to local template generation.
|
|
6
6
|
*/
|
|
7
7
|
import { z } from 'zod';
|
|
8
|
-
import { logger, apiGeneratePrompt, isApiClientAvailable, } from '../utils/index.js';
|
|
8
|
+
import { logger, apiGeneratePrompt, isApiClientAvailable, trackUsage, } from '../utils/index.js';
|
|
9
9
|
export const generatePromptSchema = z.object({
|
|
10
10
|
idea: z.string().min(1).describe('The user\'s raw prompt idea or concept'),
|
|
11
11
|
template: z.enum(['coding', 'writing', 'research', 'analysis', 'factcheck', 'general'])
|
|
@@ -21,8 +21,11 @@ export const generatePromptSchema = z.object({
|
|
|
21
21
|
});
|
|
22
22
|
export async function generatePrompt(input) {
|
|
23
23
|
const { idea, template = 'general', context, targetModel, workspaceContext } = input;
|
|
24
|
+
const startTime = Date.now();
|
|
24
25
|
logger.info('Generating prompt', { template, targetModel, ideaLength: idea.length, hasWorkspaceContext: !!workspaceContext });
|
|
25
26
|
let generatedPrompt = '';
|
|
27
|
+
let usedApi = false;
|
|
28
|
+
let errorMessage;
|
|
26
29
|
// Use PromptArchitect API
|
|
27
30
|
if (isApiClientAvailable()) {
|
|
28
31
|
try {
|
|
@@ -34,12 +37,12 @@ export async function generatePrompt(input) {
|
|
|
34
37
|
workspaceContext,
|
|
35
38
|
});
|
|
36
39
|
generatedPrompt = response.prompt;
|
|
40
|
+
usedApi = true;
|
|
37
41
|
logger.info('Generated via PromptArchitect API');
|
|
38
42
|
}
|
|
39
43
|
catch (error) {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
});
|
|
44
|
+
errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
45
|
+
logger.warn('API request failed, using fallback', { error: errorMessage });
|
|
43
46
|
}
|
|
44
47
|
}
|
|
45
48
|
// Fallback template generation
|
|
@@ -51,6 +54,20 @@ export async function generatePrompt(input) {
|
|
|
51
54
|
const wordCount = generatedPrompt.split(/\s+/).length;
|
|
52
55
|
const estimatedTokens = Math.ceil(wordCount * 1.3); // Rough estimate
|
|
53
56
|
const hasStructure = /^#+\s|^\d+\.|^-\s|^\*\s/m.test(generatedPrompt);
|
|
57
|
+
const latencyMs = Date.now() - startTime;
|
|
58
|
+
// Track usage
|
|
59
|
+
const inputText = `${idea}\n${context || ''}\n${workspaceContext || ''}`;
|
|
60
|
+
await trackUsage({
|
|
61
|
+
tool: 'generate_prompt',
|
|
62
|
+
endpoint: usedApi ? '/vscode/generate' : 'fallback',
|
|
63
|
+
model: 'gemini-2.5-flash',
|
|
64
|
+
inputText,
|
|
65
|
+
outputText: generatedPrompt,
|
|
66
|
+
latencyMs,
|
|
67
|
+
status: errorMessage && !generatedPrompt ? 'error' : 'success',
|
|
68
|
+
errorMessage,
|
|
69
|
+
template,
|
|
70
|
+
});
|
|
54
71
|
return {
|
|
55
72
|
prompt: generatedPrompt,
|
|
56
73
|
template,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generatePrompt.js","sourceRoot":"","sources":["../../src/tools/generatePrompt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,MAAM,EACN,iBAAiB,EACjB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"generatePrompt.js","sourceRoot":"","sources":["../../src/tools/generatePrompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refinePrompt.d.ts","sourceRoot":"","sources":["../../src/tools/refinePrompt.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"refinePrompt.d.ts","sourceRoot":"","sources":["../../src/tools/refinePrompt.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;EAS7B,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,CA0ED;AA6BD,eAAe,YAAY,CAAC"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Uses PromptArchitect API with local fallback
|
|
5
5
|
*/
|
|
6
6
|
import { z } from 'zod';
|
|
7
|
-
import { logger, apiRefinePrompt, isApiClientAvailable, } from '../utils/index.js';
|
|
7
|
+
import { logger, apiRefinePrompt, isApiClientAvailable, trackUsage, } from '../utils/index.js';
|
|
8
8
|
export const refinePromptSchema = z.object({
|
|
9
9
|
prompt: z.string().min(1).describe('The current prompt to refine'),
|
|
10
10
|
feedback: z.string().min(1).describe('What should be improved or changed'),
|
|
@@ -17,6 +17,7 @@ export const refinePromptSchema = z.object({
|
|
|
17
17
|
});
|
|
18
18
|
export async function refinePrompt(input) {
|
|
19
19
|
const { prompt, feedback, preserveStructure = true, targetModel, workspaceContext } = input;
|
|
20
|
+
const startTime = Date.now();
|
|
20
21
|
logger.info('Refining prompt', {
|
|
21
22
|
promptLength: prompt.length,
|
|
22
23
|
feedbackLength: feedback.length,
|
|
@@ -26,6 +27,8 @@ export async function refinePrompt(input) {
|
|
|
26
27
|
});
|
|
27
28
|
let refinedPrompt = '';
|
|
28
29
|
let changes = [];
|
|
30
|
+
let usedApi = false;
|
|
31
|
+
let errorMessage;
|
|
29
32
|
// Use PromptArchitect API
|
|
30
33
|
if (isApiClientAvailable()) {
|
|
31
34
|
try {
|
|
@@ -38,12 +41,12 @@ export async function refinePrompt(input) {
|
|
|
38
41
|
});
|
|
39
42
|
refinedPrompt = response.refinedPrompt;
|
|
40
43
|
changes = response.changes || ['Prompt refined based on feedback'];
|
|
44
|
+
usedApi = true;
|
|
41
45
|
logger.info('Refined via PromptArchitect API');
|
|
42
46
|
}
|
|
43
47
|
catch (error) {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
});
|
|
48
|
+
errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
49
|
+
logger.warn('API request failed, using fallback', { error: errorMessage });
|
|
47
50
|
}
|
|
48
51
|
}
|
|
49
52
|
// Fallback basic refinement
|
|
@@ -58,6 +61,19 @@ export async function refinePrompt(input) {
|
|
|
58
61
|
const originalHasStructure = /^#+\s|^\d+\.|^-\s|^\*\s/m.test(prompt);
|
|
59
62
|
const refinedHasStructure = /^#+\s|^\d+\.|^-\s|^\*\s/m.test(refinedPrompt);
|
|
60
63
|
const structurePreserved = !originalHasStructure || refinedHasStructure;
|
|
64
|
+
const latencyMs = Date.now() - startTime;
|
|
65
|
+
// Track usage
|
|
66
|
+
const inputText = `${prompt}\n${feedback}\n${workspaceContext || ''}`;
|
|
67
|
+
await trackUsage({
|
|
68
|
+
tool: 'refine_prompt',
|
|
69
|
+
endpoint: usedApi ? '/vscode/refine' : 'fallback',
|
|
70
|
+
model: 'gemini-2.5-flash',
|
|
71
|
+
inputText,
|
|
72
|
+
outputText: refinedPrompt,
|
|
73
|
+
latencyMs,
|
|
74
|
+
status: errorMessage && !refinedPrompt ? 'error' : 'success',
|
|
75
|
+
errorMessage,
|
|
76
|
+
});
|
|
61
77
|
return {
|
|
62
78
|
refinedPrompt,
|
|
63
79
|
changes,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refinePrompt.js","sourceRoot":"","sources":["../../src/tools/refinePrompt.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,MAAM,EACN,eAAe,EACf,oBAAoB,
|
|
1
|
+
{"version":3,"file":"refinePrompt.js","sourceRoot":"","sources":["../../src/tools/refinePrompt.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -2,4 +2,5 @@ export { logger, setLogLevel, type LogLevel } from './logger.js';
|
|
|
2
2
|
export { initializeGemini, isGeminiAvailable, generateContent, analyzePromptQuality, getStats, } from './gemini.js';
|
|
3
3
|
export { initializeApiClient, isApiClientAvailable, getApiUrl, apiGeneratePrompt, apiRefinePrompt, apiAnalyzePrompt, } from './apiClient.js';
|
|
4
4
|
export { getConfig, updateConfig, resetConfig, isAutoRefineEnabled, enableAutoRefine, disableAutoRefine, type ServerConfig, } from './config.js';
|
|
5
|
+
export { trackUsage, calculateCost, estimateTokens, checkRateLimit, incrementRateLimit, getRateLimitHeaders, getUsageStats, getDailyCosts, exportUsageRecords, GEMINI_PRICING, type UsageRecord, type UsageStats, type RateLimitInfo, } from './usageTracker.js';
|
|
5
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +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;AACrB,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,SAAS,EACT,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,YAAY,GAClB,MAAM,aAAa,CAAC"}
|
|
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;AACrB,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,SAAS,EACT,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,YAAY,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,UAAU,EACV,aAAa,EACb,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,aAAa,GACnB,MAAM,mBAAmB,CAAC"}
|
package/dist/utils/index.js
CHANGED
|
@@ -2,4 +2,5 @@ export { logger, setLogLevel } from './logger.js';
|
|
|
2
2
|
export { initializeGemini, isGeminiAvailable, generateContent, analyzePromptQuality, getStats, } from './gemini.js';
|
|
3
3
|
export { initializeApiClient, isApiClientAvailable, getApiUrl, apiGeneratePrompt, apiRefinePrompt, apiAnalyzePrompt, } from './apiClient.js';
|
|
4
4
|
export { getConfig, updateConfig, resetConfig, isAutoRefineEnabled, enableAutoRefine, disableAutoRefine, } from './config.js';
|
|
5
|
+
export { trackUsage, calculateCost, estimateTokens, checkRateLimit, incrementRateLimit, getRateLimitHeaders, getUsageStats, getDailyCosts, exportUsageRecords, GEMINI_PRICING, } from './usageTracker.js';
|
|
5
6
|
//# sourceMappingURL=index.js.map
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +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;AACrB,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,SAAS,EACT,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,GAElB,MAAM,aAAa,CAAC"}
|
|
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;AACrB,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,SAAS,EACT,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,GAElB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,UAAU,EACV,aAAa,EACb,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,cAAc,GAIf,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Usage Tracker
|
|
3
|
+
*
|
|
4
|
+
* Tracks API usage, calculates costs, and provides analytics
|
|
5
|
+
* for determining when to introduce rate limits and paid tiers.
|
|
6
|
+
*/
|
|
7
|
+
export declare const GEMINI_PRICING: {
|
|
8
|
+
readonly 'gemini-2.5-flash': {
|
|
9
|
+
readonly inputPerMillion: 0.075;
|
|
10
|
+
readonly outputPerMillion: 0.3;
|
|
11
|
+
readonly thinkingInputPerMillion: 0.075;
|
|
12
|
+
readonly thinkingOutputPerMillion: 1.25;
|
|
13
|
+
};
|
|
14
|
+
readonly 'gemini-2.5-pro': {
|
|
15
|
+
readonly inputPerMillion: 1.25;
|
|
16
|
+
readonly outputPerMillion: 10;
|
|
17
|
+
};
|
|
18
|
+
readonly 'gemini-2.0-flash': {
|
|
19
|
+
readonly inputPerMillion: 0.1;
|
|
20
|
+
readonly outputPerMillion: 0.4;
|
|
21
|
+
};
|
|
22
|
+
readonly 'gemini-1.5-flash': {
|
|
23
|
+
readonly inputPerMillion: 0.075;
|
|
24
|
+
readonly outputPerMillion: 0.3;
|
|
25
|
+
};
|
|
26
|
+
readonly 'gemini-1.5-pro': {
|
|
27
|
+
readonly inputPerMillion: 1.25;
|
|
28
|
+
readonly outputPerMillion: 5;
|
|
29
|
+
};
|
|
30
|
+
readonly default: {
|
|
31
|
+
readonly inputPerMillion: 0.1;
|
|
32
|
+
readonly outputPerMillion: 0.4;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
export interface UsageRecord {
|
|
36
|
+
id: string;
|
|
37
|
+
timestamp: string;
|
|
38
|
+
tool: 'generate_prompt' | 'refine_prompt' | 'analyze_prompt' | 'set_auto_refine' | 'get_auto_refine_status';
|
|
39
|
+
endpoint: string;
|
|
40
|
+
model: string;
|
|
41
|
+
userHash?: string;
|
|
42
|
+
clientId?: string;
|
|
43
|
+
inputTokens: number;
|
|
44
|
+
outputTokens: number;
|
|
45
|
+
totalTokens: number;
|
|
46
|
+
inputCost: number;
|
|
47
|
+
outputCost: number;
|
|
48
|
+
totalCost: number;
|
|
49
|
+
latencyMs: number;
|
|
50
|
+
status: 'success' | 'error' | 'rate_limited';
|
|
51
|
+
errorMessage?: string;
|
|
52
|
+
mcpServerVersion: string;
|
|
53
|
+
template?: string;
|
|
54
|
+
}
|
|
55
|
+
export interface UsageStats {
|
|
56
|
+
periodStart: string;
|
|
57
|
+
periodEnd: string;
|
|
58
|
+
totalRequests: number;
|
|
59
|
+
successfulRequests: number;
|
|
60
|
+
failedRequests: number;
|
|
61
|
+
rateLimitedRequests: number;
|
|
62
|
+
requestsByTool: Record<string, number>;
|
|
63
|
+
totalInputTokens: number;
|
|
64
|
+
totalOutputTokens: number;
|
|
65
|
+
totalTokens: number;
|
|
66
|
+
totalInputCost: number;
|
|
67
|
+
totalOutputCost: number;
|
|
68
|
+
totalCost: number;
|
|
69
|
+
averageCostPerRequest: number;
|
|
70
|
+
averageLatencyMs: number;
|
|
71
|
+
p95LatencyMs: number;
|
|
72
|
+
uniqueUsers: number;
|
|
73
|
+
topUsers: Array<{
|
|
74
|
+
userHash: string;
|
|
75
|
+
requestCount: number;
|
|
76
|
+
totalCost: number;
|
|
77
|
+
}>;
|
|
78
|
+
}
|
|
79
|
+
export interface RateLimitInfo {
|
|
80
|
+
remaining: number;
|
|
81
|
+
limit: number;
|
|
82
|
+
resetAt: string;
|
|
83
|
+
tier: 'free' | 'basic' | 'pro' | 'unlimited';
|
|
84
|
+
}
|
|
85
|
+
declare const DEFAULT_RATE_LIMITS: {
|
|
86
|
+
free: number;
|
|
87
|
+
basic: number;
|
|
88
|
+
pro: number;
|
|
89
|
+
unlimited: number;
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Calculate cost for a request based on model and token usage
|
|
93
|
+
*/
|
|
94
|
+
export declare function calculateCost(model: string, inputTokens: number, outputTokens: number, isThinking?: boolean): {
|
|
95
|
+
inputCost: number;
|
|
96
|
+
outputCost: number;
|
|
97
|
+
totalCost: number;
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* Estimate token count from text (rough approximation)
|
|
101
|
+
* More accurate would use tiktoken, but this is good for estimation
|
|
102
|
+
*/
|
|
103
|
+
export declare function estimateTokens(text: string): number;
|
|
104
|
+
/**
|
|
105
|
+
* Hash a user identifier for privacy
|
|
106
|
+
*/
|
|
107
|
+
export declare function hashUser(identifier: string): string;
|
|
108
|
+
/**
|
|
109
|
+
* Track a usage event
|
|
110
|
+
*/
|
|
111
|
+
export declare function trackUsage(params: {
|
|
112
|
+
tool: UsageRecord['tool'];
|
|
113
|
+
endpoint: string;
|
|
114
|
+
model?: string;
|
|
115
|
+
inputText?: string;
|
|
116
|
+
outputText?: string;
|
|
117
|
+
inputTokens?: number;
|
|
118
|
+
outputTokens?: number;
|
|
119
|
+
latencyMs: number;
|
|
120
|
+
status: UsageRecord['status'];
|
|
121
|
+
errorMessage?: string;
|
|
122
|
+
userIdentifier?: string;
|
|
123
|
+
clientId?: string;
|
|
124
|
+
template?: string;
|
|
125
|
+
}): Promise<UsageRecord>;
|
|
126
|
+
/**
|
|
127
|
+
* Check if a user is rate limited
|
|
128
|
+
*/
|
|
129
|
+
export declare function checkRateLimit(userIdentifier: string, tier?: keyof typeof DEFAULT_RATE_LIMITS): RateLimitInfo;
|
|
130
|
+
/**
|
|
131
|
+
* Increment rate limit counter for a user
|
|
132
|
+
*/
|
|
133
|
+
export declare function incrementRateLimit(userIdentifier: string): void;
|
|
134
|
+
/**
|
|
135
|
+
* Check if user is rate limited and return headers
|
|
136
|
+
*/
|
|
137
|
+
export declare function getRateLimitHeaders(userIdentifier: string, tier?: keyof typeof DEFAULT_RATE_LIMITS): Record<string, string>;
|
|
138
|
+
/**
|
|
139
|
+
* Get usage statistics for a time period
|
|
140
|
+
*/
|
|
141
|
+
export declare function getUsageStats(startTime?: Date, endTime?: Date): UsageStats;
|
|
142
|
+
/**
|
|
143
|
+
* Get daily cost summary for the last N days
|
|
144
|
+
*/
|
|
145
|
+
export declare function getDailyCosts(days?: number): Array<{
|
|
146
|
+
date: string;
|
|
147
|
+
requests: number;
|
|
148
|
+
totalCost: number;
|
|
149
|
+
inputCost: number;
|
|
150
|
+
outputCost: number;
|
|
151
|
+
}>;
|
|
152
|
+
/**
|
|
153
|
+
* Export all usage records (for backup/analysis)
|
|
154
|
+
*/
|
|
155
|
+
export declare function exportUsageRecords(): UsageRecord[];
|
|
156
|
+
/**
|
|
157
|
+
* Clear local usage records
|
|
158
|
+
*/
|
|
159
|
+
export declare function clearUsageRecords(): void;
|
|
160
|
+
export {};
|
|
161
|
+
//# sourceMappingURL=usageTracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usageTracker.d.ts","sourceRoot":"","sources":["../../src/utils/usageTracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Usage Tracker
|
|
3
|
+
*
|
|
4
|
+
* Tracks API usage, calculates costs, and provides analytics
|
|
5
|
+
* for determining when to introduce rate limits and paid tiers.
|
|
6
|
+
*/
|
|
7
|
+
import { logger } from './logger.js';
|
|
8
|
+
import { VERSION } from '../version.js';
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// GEMINI PRICING (as of Dec 2024)
|
|
11
|
+
// https://ai.google.dev/pricing
|
|
12
|
+
// ============================================================================
|
|
13
|
+
export const GEMINI_PRICING = {
|
|
14
|
+
'gemini-2.5-flash': {
|
|
15
|
+
inputPerMillion: 0.075, // $0.075 per 1M input tokens
|
|
16
|
+
outputPerMillion: 0.30, // $0.30 per 1M output tokens
|
|
17
|
+
// Thinking mode pricing (when used)
|
|
18
|
+
thinkingInputPerMillion: 0.075,
|
|
19
|
+
thinkingOutputPerMillion: 1.25,
|
|
20
|
+
},
|
|
21
|
+
'gemini-2.5-pro': {
|
|
22
|
+
inputPerMillion: 1.25, // $1.25 per 1M input tokens
|
|
23
|
+
outputPerMillion: 10.00, // $10.00 per 1M output tokens (>200k context)
|
|
24
|
+
},
|
|
25
|
+
'gemini-2.0-flash': {
|
|
26
|
+
inputPerMillion: 0.10,
|
|
27
|
+
outputPerMillion: 0.40,
|
|
28
|
+
},
|
|
29
|
+
'gemini-1.5-flash': {
|
|
30
|
+
inputPerMillion: 0.075,
|
|
31
|
+
outputPerMillion: 0.30,
|
|
32
|
+
},
|
|
33
|
+
'gemini-1.5-pro': {
|
|
34
|
+
inputPerMillion: 1.25,
|
|
35
|
+
outputPerMillion: 5.00,
|
|
36
|
+
},
|
|
37
|
+
// Default fallback
|
|
38
|
+
'default': {
|
|
39
|
+
inputPerMillion: 0.10,
|
|
40
|
+
outputPerMillion: 0.40,
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
// ============================================================================
|
|
44
|
+
// IN-MEMORY STORAGE (for local tracking - sends to backend periodically)
|
|
45
|
+
// ============================================================================
|
|
46
|
+
const usageRecords = [];
|
|
47
|
+
const MAX_LOCAL_RECORDS = 1000; // Keep last 1000 records locally
|
|
48
|
+
// Per-user rate limiting (in-memory for quick checks)
|
|
49
|
+
const userRequestCounts = new Map();
|
|
50
|
+
const RATE_LIMIT_WINDOW_MS = 60 * 60 * 1000; // 1 hour window
|
|
51
|
+
const DEFAULT_RATE_LIMITS = {
|
|
52
|
+
free: 50, // 50 requests per hour
|
|
53
|
+
basic: 200, // 200 requests per hour
|
|
54
|
+
pro: 1000, // 1000 requests per hour
|
|
55
|
+
unlimited: Infinity,
|
|
56
|
+
};
|
|
57
|
+
// ============================================================================
|
|
58
|
+
// COST CALCULATION
|
|
59
|
+
// ============================================================================
|
|
60
|
+
/**
|
|
61
|
+
* Calculate cost for a request based on model and token usage
|
|
62
|
+
*/
|
|
63
|
+
export function calculateCost(model, inputTokens, outputTokens, isThinking = false) {
|
|
64
|
+
const normalizedModel = model.toLowerCase();
|
|
65
|
+
const pricing = GEMINI_PRICING[normalizedModel] || GEMINI_PRICING.default;
|
|
66
|
+
let inputRate = pricing.inputPerMillion;
|
|
67
|
+
let outputRate = pricing.outputPerMillion;
|
|
68
|
+
// Use thinking rates if applicable
|
|
69
|
+
if (isThinking && 'thinkingOutputPerMillion' in pricing) {
|
|
70
|
+
const thinkingPricing = pricing;
|
|
71
|
+
inputRate = thinkingPricing.thinkingInputPerMillion || inputRate;
|
|
72
|
+
outputRate = thinkingPricing.thinkingOutputPerMillion || outputRate;
|
|
73
|
+
}
|
|
74
|
+
const inputCost = (inputTokens / 1_000_000) * inputRate;
|
|
75
|
+
const outputCost = (outputTokens / 1_000_000) * outputRate;
|
|
76
|
+
return {
|
|
77
|
+
inputCost: Math.round(inputCost * 1_000_000) / 1_000_000, // 6 decimal precision
|
|
78
|
+
outputCost: Math.round(outputCost * 1_000_000) / 1_000_000,
|
|
79
|
+
totalCost: Math.round((inputCost + outputCost) * 1_000_000) / 1_000_000,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Estimate token count from text (rough approximation)
|
|
84
|
+
* More accurate would use tiktoken, but this is good for estimation
|
|
85
|
+
*/
|
|
86
|
+
export function estimateTokens(text) {
|
|
87
|
+
if (!text)
|
|
88
|
+
return 0;
|
|
89
|
+
// Rough estimate: ~4 characters per token for English
|
|
90
|
+
// Gemini models are similar to GPT tokenization
|
|
91
|
+
return Math.ceil(text.length / 4);
|
|
92
|
+
}
|
|
93
|
+
// ============================================================================
|
|
94
|
+
// USAGE TRACKING
|
|
95
|
+
// ============================================================================
|
|
96
|
+
/**
|
|
97
|
+
* Generate a unique ID for a usage record
|
|
98
|
+
*/
|
|
99
|
+
function generateId() {
|
|
100
|
+
return `mcp_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Hash a user identifier for privacy
|
|
104
|
+
*/
|
|
105
|
+
export function hashUser(identifier) {
|
|
106
|
+
// Simple hash for privacy - not cryptographically secure but sufficient for analytics
|
|
107
|
+
let hash = 0;
|
|
108
|
+
for (let i = 0; i < identifier.length; i++) {
|
|
109
|
+
const char = identifier.charCodeAt(i);
|
|
110
|
+
hash = ((hash << 5) - hash) + char;
|
|
111
|
+
hash = hash & hash; // Convert to 32-bit integer
|
|
112
|
+
}
|
|
113
|
+
return `user_${Math.abs(hash).toString(36)}`;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Track a usage event
|
|
117
|
+
*/
|
|
118
|
+
export async function trackUsage(params) {
|
|
119
|
+
const { tool, endpoint, model = 'gemini-2.5-flash', inputText, outputText, latencyMs, status, errorMessage, userIdentifier, clientId, template, } = params;
|
|
120
|
+
// Calculate tokens
|
|
121
|
+
const inputTokens = params.inputTokens ?? estimateTokens(inputText || '');
|
|
122
|
+
const outputTokens = params.outputTokens ?? estimateTokens(outputText || '');
|
|
123
|
+
const totalTokens = inputTokens + outputTokens;
|
|
124
|
+
// Calculate cost
|
|
125
|
+
const costs = calculateCost(model, inputTokens, outputTokens);
|
|
126
|
+
// Create record
|
|
127
|
+
const record = {
|
|
128
|
+
id: generateId(),
|
|
129
|
+
timestamp: new Date().toISOString(),
|
|
130
|
+
tool,
|
|
131
|
+
endpoint,
|
|
132
|
+
model,
|
|
133
|
+
userHash: userIdentifier ? hashUser(userIdentifier) : undefined,
|
|
134
|
+
clientId,
|
|
135
|
+
inputTokens,
|
|
136
|
+
outputTokens,
|
|
137
|
+
totalTokens,
|
|
138
|
+
inputCost: costs.inputCost,
|
|
139
|
+
outputCost: costs.outputCost,
|
|
140
|
+
totalCost: costs.totalCost,
|
|
141
|
+
latencyMs,
|
|
142
|
+
status,
|
|
143
|
+
errorMessage,
|
|
144
|
+
mcpServerVersion: VERSION,
|
|
145
|
+
template,
|
|
146
|
+
};
|
|
147
|
+
// Store locally
|
|
148
|
+
usageRecords.push(record);
|
|
149
|
+
// Trim if too many records
|
|
150
|
+
if (usageRecords.length > MAX_LOCAL_RECORDS) {
|
|
151
|
+
usageRecords.splice(0, usageRecords.length - MAX_LOCAL_RECORDS);
|
|
152
|
+
}
|
|
153
|
+
// Log for debugging
|
|
154
|
+
logger.debug('Usage tracked', {
|
|
155
|
+
tool,
|
|
156
|
+
tokens: totalTokens,
|
|
157
|
+
cost: `$${costs.totalCost.toFixed(6)}`,
|
|
158
|
+
latency: `${latencyMs}ms`,
|
|
159
|
+
status,
|
|
160
|
+
});
|
|
161
|
+
// Send to backend asynchronously (fire and forget)
|
|
162
|
+
sendToBackend(record).catch(err => {
|
|
163
|
+
logger.warn('Failed to send usage to backend', { error: err.message });
|
|
164
|
+
});
|
|
165
|
+
return record;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Send usage record to PromptArchitect backend
|
|
169
|
+
*/
|
|
170
|
+
async function sendToBackend(record) {
|
|
171
|
+
const apiUrl = process.env.PROMPTARCHITECT_API_URL ||
|
|
172
|
+
'https://us-central1-prompt-architect-3df7a.cloudfunctions.net/api';
|
|
173
|
+
try {
|
|
174
|
+
const response = await fetch(`${apiUrl}/mcp/usage`, {
|
|
175
|
+
method: 'POST',
|
|
176
|
+
headers: {
|
|
177
|
+
'Content-Type': 'application/json',
|
|
178
|
+
'X-Client': 'mcp-server',
|
|
179
|
+
'X-Client-Version': VERSION,
|
|
180
|
+
},
|
|
181
|
+
body: JSON.stringify(record),
|
|
182
|
+
});
|
|
183
|
+
if (!response.ok) {
|
|
184
|
+
throw new Error(`HTTP ${response.status}`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
// Silently fail - usage tracking shouldn't break main functionality
|
|
189
|
+
logger.debug('Backend usage tracking failed', { error });
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// ============================================================================
|
|
193
|
+
// RATE LIMITING
|
|
194
|
+
// ============================================================================
|
|
195
|
+
/**
|
|
196
|
+
* Check if a user is rate limited
|
|
197
|
+
*/
|
|
198
|
+
export function checkRateLimit(userIdentifier, tier = 'free') {
|
|
199
|
+
const userHash = hashUser(userIdentifier);
|
|
200
|
+
const now = Date.now();
|
|
201
|
+
const limit = DEFAULT_RATE_LIMITS[tier];
|
|
202
|
+
// Get or create user's request count
|
|
203
|
+
let userData = userRequestCounts.get(userHash);
|
|
204
|
+
if (!userData || now - userData.windowStart >= RATE_LIMIT_WINDOW_MS) {
|
|
205
|
+
// New window
|
|
206
|
+
userData = { count: 0, windowStart: now };
|
|
207
|
+
userRequestCounts.set(userHash, userData);
|
|
208
|
+
}
|
|
209
|
+
const windowEnd = userData.windowStart + RATE_LIMIT_WINDOW_MS;
|
|
210
|
+
const remaining = Math.max(0, limit - userData.count);
|
|
211
|
+
return {
|
|
212
|
+
remaining,
|
|
213
|
+
limit: limit === Infinity ? -1 : limit, // -1 indicates unlimited
|
|
214
|
+
resetAt: new Date(windowEnd).toISOString(),
|
|
215
|
+
tier,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Increment rate limit counter for a user
|
|
220
|
+
*/
|
|
221
|
+
export function incrementRateLimit(userIdentifier) {
|
|
222
|
+
const userHash = hashUser(userIdentifier);
|
|
223
|
+
const now = Date.now();
|
|
224
|
+
let userData = userRequestCounts.get(userHash);
|
|
225
|
+
if (!userData || now - userData.windowStart >= RATE_LIMIT_WINDOW_MS) {
|
|
226
|
+
userData = { count: 1, windowStart: now };
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
userData.count++;
|
|
230
|
+
}
|
|
231
|
+
userRequestCounts.set(userHash, userData);
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Check if user is rate limited and return headers
|
|
235
|
+
*/
|
|
236
|
+
export function getRateLimitHeaders(userIdentifier, tier = 'free') {
|
|
237
|
+
const info = checkRateLimit(userIdentifier, tier);
|
|
238
|
+
return {
|
|
239
|
+
'X-RateLimit-Limit': info.limit === -1 ? 'unlimited' : String(info.limit),
|
|
240
|
+
'X-RateLimit-Remaining': String(info.remaining),
|
|
241
|
+
'X-RateLimit-Reset': info.resetAt,
|
|
242
|
+
'X-RateLimit-Tier': info.tier,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
// ============================================================================
|
|
246
|
+
// ANALYTICS
|
|
247
|
+
// ============================================================================
|
|
248
|
+
/**
|
|
249
|
+
* Get usage statistics for a time period
|
|
250
|
+
*/
|
|
251
|
+
export function getUsageStats(startTime, endTime) {
|
|
252
|
+
const start = startTime || new Date(Date.now() - 24 * 60 * 60 * 1000); // Default: last 24h
|
|
253
|
+
const end = endTime || new Date();
|
|
254
|
+
const filtered = usageRecords.filter(r => {
|
|
255
|
+
const ts = new Date(r.timestamp);
|
|
256
|
+
return ts >= start && ts <= end;
|
|
257
|
+
});
|
|
258
|
+
// Calculate stats
|
|
259
|
+
const stats = {
|
|
260
|
+
periodStart: start.toISOString(),
|
|
261
|
+
periodEnd: end.toISOString(),
|
|
262
|
+
totalRequests: filtered.length,
|
|
263
|
+
successfulRequests: filtered.filter(r => r.status === 'success').length,
|
|
264
|
+
failedRequests: filtered.filter(r => r.status === 'error').length,
|
|
265
|
+
rateLimitedRequests: filtered.filter(r => r.status === 'rate_limited').length,
|
|
266
|
+
requestsByTool: {},
|
|
267
|
+
totalInputTokens: 0,
|
|
268
|
+
totalOutputTokens: 0,
|
|
269
|
+
totalTokens: 0,
|
|
270
|
+
totalInputCost: 0,
|
|
271
|
+
totalOutputCost: 0,
|
|
272
|
+
totalCost: 0,
|
|
273
|
+
averageCostPerRequest: 0,
|
|
274
|
+
averageLatencyMs: 0,
|
|
275
|
+
p95LatencyMs: 0,
|
|
276
|
+
uniqueUsers: 0,
|
|
277
|
+
topUsers: [],
|
|
278
|
+
};
|
|
279
|
+
// Aggregate
|
|
280
|
+
const userStats = new Map();
|
|
281
|
+
const latencies = [];
|
|
282
|
+
for (const record of filtered) {
|
|
283
|
+
// By tool
|
|
284
|
+
stats.requestsByTool[record.tool] = (stats.requestsByTool[record.tool] || 0) + 1;
|
|
285
|
+
// Tokens
|
|
286
|
+
stats.totalInputTokens += record.inputTokens;
|
|
287
|
+
stats.totalOutputTokens += record.outputTokens;
|
|
288
|
+
stats.totalTokens += record.totalTokens;
|
|
289
|
+
// Costs
|
|
290
|
+
stats.totalInputCost += record.inputCost;
|
|
291
|
+
stats.totalOutputCost += record.outputCost;
|
|
292
|
+
stats.totalCost += record.totalCost;
|
|
293
|
+
// Latency
|
|
294
|
+
latencies.push(record.latencyMs);
|
|
295
|
+
// User stats
|
|
296
|
+
if (record.userHash) {
|
|
297
|
+
const existing = userStats.get(record.userHash) || { count: 0, cost: 0 };
|
|
298
|
+
existing.count++;
|
|
299
|
+
existing.cost += record.totalCost;
|
|
300
|
+
userStats.set(record.userHash, existing);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
// Calculate averages
|
|
304
|
+
if (filtered.length > 0) {
|
|
305
|
+
stats.averageCostPerRequest = stats.totalCost / filtered.length;
|
|
306
|
+
stats.averageLatencyMs = latencies.reduce((a, b) => a + b, 0) / latencies.length;
|
|
307
|
+
// P95 latency
|
|
308
|
+
latencies.sort((a, b) => a - b);
|
|
309
|
+
const p95Index = Math.floor(latencies.length * 0.95);
|
|
310
|
+
stats.p95LatencyMs = latencies[p95Index] || 0;
|
|
311
|
+
}
|
|
312
|
+
// User stats
|
|
313
|
+
stats.uniqueUsers = userStats.size;
|
|
314
|
+
stats.topUsers = Array.from(userStats.entries())
|
|
315
|
+
.map(([userHash, data]) => ({ userHash, requestCount: data.count, totalCost: data.cost }))
|
|
316
|
+
.sort((a, b) => b.requestCount - a.requestCount)
|
|
317
|
+
.slice(0, 10);
|
|
318
|
+
// Round costs
|
|
319
|
+
stats.totalInputCost = Math.round(stats.totalInputCost * 1_000_000) / 1_000_000;
|
|
320
|
+
stats.totalOutputCost = Math.round(stats.totalOutputCost * 1_000_000) / 1_000_000;
|
|
321
|
+
stats.totalCost = Math.round(stats.totalCost * 1_000_000) / 1_000_000;
|
|
322
|
+
stats.averageCostPerRequest = Math.round(stats.averageCostPerRequest * 1_000_000) / 1_000_000;
|
|
323
|
+
return stats;
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Get daily cost summary for the last N days
|
|
327
|
+
*/
|
|
328
|
+
export function getDailyCosts(days = 7) {
|
|
329
|
+
const results = [];
|
|
330
|
+
for (let i = 0; i < days; i++) {
|
|
331
|
+
const date = new Date();
|
|
332
|
+
date.setDate(date.getDate() - i);
|
|
333
|
+
date.setHours(0, 0, 0, 0);
|
|
334
|
+
const nextDate = new Date(date);
|
|
335
|
+
nextDate.setDate(nextDate.getDate() + 1);
|
|
336
|
+
const dayRecords = usageRecords.filter(r => {
|
|
337
|
+
const ts = new Date(r.timestamp);
|
|
338
|
+
return ts >= date && ts < nextDate;
|
|
339
|
+
});
|
|
340
|
+
results.push({
|
|
341
|
+
date: date.toISOString().slice(0, 10),
|
|
342
|
+
requests: dayRecords.length,
|
|
343
|
+
totalCost: dayRecords.reduce((sum, r) => sum + r.totalCost, 0),
|
|
344
|
+
inputCost: dayRecords.reduce((sum, r) => sum + r.inputCost, 0),
|
|
345
|
+
outputCost: dayRecords.reduce((sum, r) => sum + r.outputCost, 0),
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
return results.reverse(); // Oldest first
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Export all usage records (for backup/analysis)
|
|
352
|
+
*/
|
|
353
|
+
export function exportUsageRecords() {
|
|
354
|
+
return [...usageRecords];
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Clear local usage records
|
|
358
|
+
*/
|
|
359
|
+
export function clearUsageRecords() {
|
|
360
|
+
usageRecords.length = 0;
|
|
361
|
+
logger.info('Usage records cleared');
|
|
362
|
+
}
|
|
363
|
+
//# sourceMappingURL=usageTracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usageTracker.js","sourceRoot":"","sources":["../../src/utils/usageTracker.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@merabylabs/promptarchitect-mcp",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "MCP (Model Context Protocol) server for PromptArchitect - AI-powered prompt engineering tools for Claude, Cursor, VS Code, Windsurf, Zed & more",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mcp",
|