vesper-memory 0.3.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/.env.example +28 -0
- package/CHANGELOG.md +137 -0
- package/LICENSE +21 -0
- package/README.md +665 -0
- package/config/sqlite-schema.sql +413 -0
- package/dist/benchmark/index.d.ts +18 -0
- package/dist/benchmark/index.d.ts.map +1 -0
- package/dist/benchmark/index.js +19 -0
- package/dist/benchmark/index.js.map +1 -0
- package/dist/benchmark/metrics-collector.d.ts +90 -0
- package/dist/benchmark/metrics-collector.d.ts.map +1 -0
- package/dist/benchmark/metrics-collector.js +196 -0
- package/dist/benchmark/metrics-collector.js.map +1 -0
- package/dist/benchmark/report-generator.d.ts +35 -0
- package/dist/benchmark/report-generator.d.ts.map +1 -0
- package/dist/benchmark/report-generator.js +221 -0
- package/dist/benchmark/report-generator.js.map +1 -0
- package/dist/benchmark/runner.d.ts +30 -0
- package/dist/benchmark/runner.d.ts.map +1 -0
- package/dist/benchmark/runner.js +308 -0
- package/dist/benchmark/runner.js.map +1 -0
- package/dist/benchmark/scenarios/context-recall.d.ts +65 -0
- package/dist/benchmark/scenarios/context-recall.d.ts.map +1 -0
- package/dist/benchmark/scenarios/context-recall.js +180 -0
- package/dist/benchmark/scenarios/context-recall.js.map +1 -0
- package/dist/benchmark/scenarios/index.d.ts +34 -0
- package/dist/benchmark/scenarios/index.d.ts.map +1 -0
- package/dist/benchmark/scenarios/index.js +230 -0
- package/dist/benchmark/scenarios/index.js.map +1 -0
- package/dist/benchmark/statistics.d.ts +125 -0
- package/dist/benchmark/statistics.d.ts.map +1 -0
- package/dist/benchmark/statistics.js +520 -0
- package/dist/benchmark/statistics.js.map +1 -0
- package/dist/benchmark/types.d.ts +458 -0
- package/dist/benchmark/types.d.ts.map +1 -0
- package/dist/benchmark/types.js +297 -0
- package/dist/benchmark/types.js.map +1 -0
- package/dist/cli 2.js +583 -0
- package/dist/cli.d 2.ts +8 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts 2.map +1 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +583 -0
- package/dist/cli.js 2.map +1 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/rate-limits.d.ts +76 -0
- package/dist/config/rate-limits.d.ts.map +1 -0
- package/dist/config/rate-limits.js +161 -0
- package/dist/config/rate-limits.js.map +1 -0
- package/dist/config 2/rate-limits.d.ts +76 -0
- package/dist/config 2/rate-limits.d.ts.map +1 -0
- package/dist/config 2/rate-limits.js +161 -0
- package/dist/config 2/rate-limits.js.map +1 -0
- package/dist/consolidation/pipeline.d.ts +52 -0
- package/dist/consolidation/pipeline.d.ts.map +1 -0
- package/dist/consolidation/pipeline.js +193 -0
- package/dist/consolidation/pipeline.js.map +1 -0
- package/dist/consolidation 2/pipeline.d.ts +52 -0
- package/dist/consolidation 2/pipeline.d.ts.map +1 -0
- package/dist/consolidation 2/pipeline.js +193 -0
- package/dist/consolidation 2/pipeline.js.map +1 -0
- package/dist/embeddings/client.d.ts +95 -0
- package/dist/embeddings/client.d.ts.map +1 -0
- package/dist/embeddings/client.js +162 -0
- package/dist/embeddings/client.js.map +1 -0
- package/dist/embeddings 2/client.d.ts +94 -0
- package/dist/embeddings 2/client.d.ts.map +1 -0
- package/dist/embeddings 2/client.js +144 -0
- package/dist/embeddings 2/client.js.map +1 -0
- package/dist/memory-layers/semantic-memory.d.ts +76 -0
- package/dist/memory-layers/semantic-memory.d.ts.map +1 -0
- package/dist/memory-layers/semantic-memory.js +231 -0
- package/dist/memory-layers/semantic-memory.js.map +1 -0
- package/dist/memory-layers/skill-library.d.ts +25 -0
- package/dist/memory-layers/skill-library.d.ts.map +1 -0
- package/dist/memory-layers/skill-library.js +54 -0
- package/dist/memory-layers/skill-library.js.map +1 -0
- package/dist/memory-layers/working-memory.d.ts +57 -0
- package/dist/memory-layers/working-memory.d.ts.map +1 -0
- package/dist/memory-layers/working-memory.js +153 -0
- package/dist/memory-layers/working-memory.js.map +1 -0
- package/dist/memory-layers 2/semantic-memory.d.ts +33 -0
- package/dist/memory-layers 2/semantic-memory.d.ts.map +1 -0
- package/dist/memory-layers 2/semantic-memory.js +114 -0
- package/dist/memory-layers 2/semantic-memory.js.map +1 -0
- package/dist/memory-layers 2/skill-library.d.ts +25 -0
- package/dist/memory-layers 2/skill-library.d.ts.map +1 -0
- package/dist/memory-layers 2/skill-library.js +54 -0
- package/dist/memory-layers 2/skill-library.js.map +1 -0
- package/dist/memory-layers 2/working-memory.d.ts +57 -0
- package/dist/memory-layers 2/working-memory.d.ts.map +1 -0
- package/dist/memory-layers 2/working-memory.js +153 -0
- package/dist/memory-layers 2/working-memory.js.map +1 -0
- package/dist/middleware/auth.d.ts +287 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +610 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware 2/auth.d.ts +287 -0
- package/dist/middleware 2/auth.d.ts.map +1 -0
- package/dist/middleware 2/auth.js +610 -0
- package/dist/middleware 2/auth.js.map +1 -0
- package/dist/monitoring/health.d.ts +241 -0
- package/dist/monitoring/health.d.ts.map +1 -0
- package/dist/monitoring/health.js +649 -0
- package/dist/monitoring/health.js.map +1 -0
- package/dist/monitoring/metrics.d.ts +153 -0
- package/dist/monitoring/metrics.d.ts.map +1 -0
- package/dist/monitoring/metrics.js +349 -0
- package/dist/monitoring/metrics.js.map +1 -0
- package/dist/monitoring 2/health.d.ts +241 -0
- package/dist/monitoring 2/health.d.ts.map +1 -0
- package/dist/monitoring 2/health.js +649 -0
- package/dist/monitoring 2/health.js.map +1 -0
- package/dist/monitoring 2/metrics.d.ts +153 -0
- package/dist/monitoring 2/metrics.d.ts.map +1 -0
- package/dist/monitoring 2/metrics.js +349 -0
- package/dist/monitoring 2/metrics.js.map +1 -0
- package/dist/retrieval/hybrid-search.d.ts +186 -0
- package/dist/retrieval/hybrid-search.d.ts.map +1 -0
- package/dist/retrieval/hybrid-search.js +330 -0
- package/dist/retrieval/hybrid-search.js.map +1 -0
- package/dist/retrieval 2/hybrid-search.d.ts +186 -0
- package/dist/retrieval 2/hybrid-search.d.ts.map +1 -0
- package/dist/retrieval 2/hybrid-search.js +327 -0
- package/dist/retrieval 2/hybrid-search.js.map +1 -0
- package/dist/router/smart-router.d.ts +157 -0
- package/dist/router/smart-router.d.ts.map +1 -0
- package/dist/router/smart-router.js +524 -0
- package/dist/router/smart-router.js.map +1 -0
- package/dist/router 2/smart-router.d.ts +111 -0
- package/dist/router 2/smart-router.d.ts.map +1 -0
- package/dist/router 2/smart-router.js +383 -0
- package/dist/router 2/smart-router.js.map +1 -0
- package/dist/security/rate-limit-middleware.d.ts +119 -0
- package/dist/security/rate-limit-middleware.d.ts.map +1 -0
- package/dist/security/rate-limit-middleware.js +193 -0
- package/dist/security/rate-limit-middleware.js.map +1 -0
- package/dist/security 2/rate-limit-middleware.d.ts +119 -0
- package/dist/security 2/rate-limit-middleware.d.ts.map +1 -0
- package/dist/security 2/rate-limit-middleware.js +193 -0
- package/dist/security 2/rate-limit-middleware.js.map +1 -0
- package/dist/server 2.js +861 -0
- package/dist/server-wrapper 2.js +170 -0
- package/dist/server-wrapper.d 2.ts +12 -0
- package/dist/server-wrapper.d.ts +12 -0
- package/dist/server-wrapper.d.ts 2.map +1 -0
- package/dist/server-wrapper.d.ts.map +1 -0
- package/dist/server-wrapper.js +170 -0
- package/dist/server-wrapper.js 2.map +1 -0
- package/dist/server-wrapper.js.map +1 -0
- package/dist/server.d 2.ts +14 -0
- package/dist/server.d.ts +14 -0
- package/dist/server.d.ts 2.map +1 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +656 -0
- package/dist/server.js 2.map +1 -0
- package/dist/server.js.map +1 -0
- package/dist/synthesis/conflict-detector.d.ts +43 -0
- package/dist/synthesis/conflict-detector.d.ts.map +1 -0
- package/dist/synthesis/conflict-detector.js +125 -0
- package/dist/synthesis/conflict-detector.js.map +1 -0
- package/dist/synthesis 2/conflict-detector.d.ts +43 -0
- package/dist/synthesis 2/conflict-detector.d.ts.map +1 -0
- package/dist/synthesis 2/conflict-detector.js +125 -0
- package/dist/synthesis 2/conflict-detector.js.map +1 -0
- package/dist/utils/monitoring.d.ts +25 -0
- package/dist/utils/monitoring.d.ts.map +1 -0
- package/dist/utils/monitoring.js +41 -0
- package/dist/utils/monitoring.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +97 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +166 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/dist/utils/validation.d.ts +139 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +195 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/utils 2/monitoring.d.ts +25 -0
- package/dist/utils 2/monitoring.d.ts.map +1 -0
- package/dist/utils 2/monitoring.js +41 -0
- package/dist/utils 2/monitoring.js.map +1 -0
- package/dist/utils 2/rate-limiter.d.ts +97 -0
- package/dist/utils 2/rate-limiter.d.ts.map +1 -0
- package/dist/utils 2/rate-limiter.js +166 -0
- package/dist/utils 2/rate-limiter.js.map +1 -0
- package/dist/utils 2/validation.d.ts +139 -0
- package/dist/utils 2/validation.d.ts.map +1 -0
- package/dist/utils 2/validation.js +195 -0
- package/dist/utils 2/validation.js.map +1 -0
- package/docker-compose.yml +65 -0
- package/embedding-service/Dockerfile +29 -0
- package/embedding-service/README.md +68 -0
- package/embedding-service/requirements.txt +6 -0
- package/embedding-service/server.py +110 -0
- package/package.json +92 -0
- package/scripts/FRESH_INSTALL.md +280 -0
- package/scripts/README.md +101 -0
- package/scripts/ensure-infrastructure.sh +38 -0
- package/scripts/fresh-install-auto.sh +96 -0
- package/scripts/fresh-install.sh +167 -0
- package/scripts/health-check.sh +72 -0
- package/scripts/init-qdrant.ts +201 -0
- package/scripts/postinstall.js +94 -0
- package/scripts/run-accuracy-benchmark.ts +1237 -0
- package/scripts/run-real-benchmark.ts +581 -0
- package/scripts/test-mcp-server.sh +38 -0
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metrics Collector for Scientific Benchmarks
|
|
3
|
+
*
|
|
4
|
+
* Real-time collection and aggregation of benchmark metrics.
|
|
5
|
+
* Provides accurate latency measurement, token estimation, and quality evaluation.
|
|
6
|
+
*/
|
|
7
|
+
import { mean, percentile, standardDeviation } from "./statistics.js";
|
|
8
|
+
/**
|
|
9
|
+
* Error class for metrics collection errors
|
|
10
|
+
*/
|
|
11
|
+
export class MetricsCollectorError extends Error {
|
|
12
|
+
constructor(message) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.name = "MetricsCollectorError";
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Create a new metrics collector
|
|
19
|
+
*/
|
|
20
|
+
export function createMetricsCollector() {
|
|
21
|
+
const metrics = [];
|
|
22
|
+
return {
|
|
23
|
+
record(snapshot) {
|
|
24
|
+
metrics.push(snapshot);
|
|
25
|
+
},
|
|
26
|
+
getMetrics() {
|
|
27
|
+
// Return a copy to maintain immutability
|
|
28
|
+
return [...metrics];
|
|
29
|
+
},
|
|
30
|
+
getCount() {
|
|
31
|
+
return metrics.length;
|
|
32
|
+
},
|
|
33
|
+
clear() {
|
|
34
|
+
metrics.length = 0;
|
|
35
|
+
},
|
|
36
|
+
aggregate() {
|
|
37
|
+
if (metrics.length === 0) {
|
|
38
|
+
throw new MetricsCollectorError("Cannot aggregate empty metrics");
|
|
39
|
+
}
|
|
40
|
+
return aggregateMetrics(metrics);
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Measure the latency of a function execution
|
|
46
|
+
*
|
|
47
|
+
* @param fn - Function to measure (can be sync or async)
|
|
48
|
+
* @returns Object containing the result and latency in milliseconds
|
|
49
|
+
*/
|
|
50
|
+
export async function measureLatency(fn) {
|
|
51
|
+
const start = performance.now();
|
|
52
|
+
try {
|
|
53
|
+
const result = await fn();
|
|
54
|
+
const latencyMs = performance.now() - start;
|
|
55
|
+
return { result, latencyMs };
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
// Re-throw to propagate errors
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Estimate the number of tokens in a text string
|
|
64
|
+
*
|
|
65
|
+
* Uses a heuristic approximation:
|
|
66
|
+
* - English prose: ~4 characters per token
|
|
67
|
+
* - Code: ~3 characters per token (more punctuation)
|
|
68
|
+
* - Mixed: ~3.5 characters per token
|
|
69
|
+
*
|
|
70
|
+
* @param text - The text to estimate tokens for
|
|
71
|
+
* @param contentType - Optional hint about content type
|
|
72
|
+
* @returns Estimated token count
|
|
73
|
+
*/
|
|
74
|
+
export function estimateTokens(text, contentType = "mixed") {
|
|
75
|
+
if (!text || text.trim().length === 0) {
|
|
76
|
+
return 0;
|
|
77
|
+
}
|
|
78
|
+
// Clean up text
|
|
79
|
+
const cleanText = text.trim();
|
|
80
|
+
// Characters per token varies by content type
|
|
81
|
+
let charsPerToken;
|
|
82
|
+
switch (contentType) {
|
|
83
|
+
case "code":
|
|
84
|
+
charsPerToken = 3.0; // Code has more special chars = more tokens
|
|
85
|
+
break;
|
|
86
|
+
case "prose":
|
|
87
|
+
charsPerToken = 4.0; // English prose averages ~4 chars per token
|
|
88
|
+
break;
|
|
89
|
+
case "mixed":
|
|
90
|
+
default:
|
|
91
|
+
charsPerToken = 3.5;
|
|
92
|
+
}
|
|
93
|
+
// Basic estimation
|
|
94
|
+
const basicEstimate = cleanText.length / charsPerToken;
|
|
95
|
+
// Adjust for word boundaries (whitespace indicates token boundaries)
|
|
96
|
+
const wordCount = cleanText.split(/\s+/).filter((w) => w.length > 0).length;
|
|
97
|
+
// Adjust for punctuation (often separate tokens)
|
|
98
|
+
const punctuationCount = (cleanText.match(/[.,!?;:'"()\[\]{}]/g) || []).length;
|
|
99
|
+
// Combine estimates with weights
|
|
100
|
+
const weightedEstimate = basicEstimate * 0.6 + wordCount * 0.3 + punctuationCount * 0.1;
|
|
101
|
+
return Math.round(weightedEstimate);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Evaluate the quality of a response against expected content
|
|
105
|
+
*
|
|
106
|
+
* @param actual - The actual response
|
|
107
|
+
* @param expected - Expected response (string) or keywords (array)
|
|
108
|
+
* @param options - Evaluation options
|
|
109
|
+
* @returns Quality score from 0.0 to 1.0
|
|
110
|
+
*/
|
|
111
|
+
export function evaluateResponseQuality(actual, expected, options = {}) {
|
|
112
|
+
const { mode = "similarity" } = options;
|
|
113
|
+
if (!actual || actual.trim().length === 0) {
|
|
114
|
+
return 0.0;
|
|
115
|
+
}
|
|
116
|
+
const actualLower = actual.toLowerCase().trim();
|
|
117
|
+
// Keyword matching mode
|
|
118
|
+
if (mode === "keywords" && Array.isArray(expected)) {
|
|
119
|
+
const keywordsFound = expected.filter((keyword) => actualLower.includes(keyword.toLowerCase())).length;
|
|
120
|
+
return keywordsFound / expected.length;
|
|
121
|
+
}
|
|
122
|
+
// Similarity mode
|
|
123
|
+
const expectedStr = Array.isArray(expected) ? expected.join(" ") : expected;
|
|
124
|
+
const expectedLower = expectedStr.toLowerCase().trim();
|
|
125
|
+
// Exact match
|
|
126
|
+
if (actualLower === expectedLower) {
|
|
127
|
+
return 1.0;
|
|
128
|
+
}
|
|
129
|
+
// Calculate word overlap (Jaccard-like similarity)
|
|
130
|
+
const actualWords = new Set(actualLower.split(/\s+/).filter((w) => w.length > 2));
|
|
131
|
+
const expectedWords = new Set(expectedLower.split(/\s+/).filter((w) => w.length > 2));
|
|
132
|
+
if (actualWords.size === 0 || expectedWords.size === 0) {
|
|
133
|
+
return actualWords.size === expectedWords.size ? 1.0 : 0.0;
|
|
134
|
+
}
|
|
135
|
+
// Count intersection
|
|
136
|
+
let intersection = 0;
|
|
137
|
+
for (const word of actualWords) {
|
|
138
|
+
if (expectedWords.has(word)) {
|
|
139
|
+
intersection++;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Jaccard similarity: intersection / union
|
|
143
|
+
const union = actualWords.size + expectedWords.size - intersection;
|
|
144
|
+
const jaccard = intersection / union;
|
|
145
|
+
// Also check for substring inclusion (important for factual responses)
|
|
146
|
+
let substringBonus = 0;
|
|
147
|
+
if (actualLower.includes(expectedLower) || expectedLower.includes(actualLower)) {
|
|
148
|
+
substringBonus = 0.3;
|
|
149
|
+
}
|
|
150
|
+
// Combine metrics
|
|
151
|
+
return Math.min(1.0, jaccard + substringBonus);
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Aggregate an array of metrics snapshots into summary statistics
|
|
155
|
+
*
|
|
156
|
+
* @param metrics - Array of metrics snapshots
|
|
157
|
+
* @returns Aggregated metrics
|
|
158
|
+
* @throws MetricsCollectorError if metrics array is empty
|
|
159
|
+
*/
|
|
160
|
+
export function aggregateMetrics(metrics) {
|
|
161
|
+
if (metrics.length === 0) {
|
|
162
|
+
throw new MetricsCollectorError("Cannot aggregate empty metrics");
|
|
163
|
+
}
|
|
164
|
+
// Extract latencies
|
|
165
|
+
const latencies = metrics.map((m) => m.latencyMs);
|
|
166
|
+
// Calculate latency percentiles
|
|
167
|
+
const latencyP50 = percentile(latencies, 50);
|
|
168
|
+
const latencyP95 = percentile(latencies, 95);
|
|
169
|
+
const latencyP99 = percentile(latencies, 99);
|
|
170
|
+
const latencyMean = mean(latencies);
|
|
171
|
+
const latencyStdDev = latencies.length >= 2 ? standardDeviation(latencies, true) : 0;
|
|
172
|
+
// Calculate memory hit rate
|
|
173
|
+
const memoryHits = metrics.filter((m) => m.memoryHit).length;
|
|
174
|
+
const memoryHitRate = memoryHits / metrics.length;
|
|
175
|
+
// Calculate average tokens if available
|
|
176
|
+
const tokensValues = metrics
|
|
177
|
+
.filter((m) => m.tokensUsed !== undefined)
|
|
178
|
+
.map((m) => m.tokensUsed);
|
|
179
|
+
const avgTokens = tokensValues.length > 0 ? Math.round(mean(tokensValues)) : undefined;
|
|
180
|
+
// Calculate average accuracy if available
|
|
181
|
+
const accuracyValues = metrics
|
|
182
|
+
.filter((m) => m.retrievalAccuracy !== undefined)
|
|
183
|
+
.map((m) => m.retrievalAccuracy);
|
|
184
|
+
const avgAccuracy = accuracyValues.length > 0 ? mean(accuracyValues) : undefined;
|
|
185
|
+
return {
|
|
186
|
+
latencyP50,
|
|
187
|
+
latencyP95,
|
|
188
|
+
latencyP99,
|
|
189
|
+
latencyMean,
|
|
190
|
+
latencyStdDev,
|
|
191
|
+
memoryHitRate,
|
|
192
|
+
avgTokens,
|
|
193
|
+
avgAccuracy,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=metrics-collector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics-collector.js","sourceRoot":"","sources":["../../src/benchmark/metrics-collector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Report Generator for Scientific Benchmarks
|
|
3
|
+
*
|
|
4
|
+
* Generates comprehensive markdown reports from benchmark results.
|
|
5
|
+
* Includes statistical analysis, comparisons, and visualizations.
|
|
6
|
+
*/
|
|
7
|
+
import type { BenchmarkResult, ComparisonResult, BenchmarkSummary } from "./types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Generate a complete markdown report from benchmark results
|
|
10
|
+
*
|
|
11
|
+
* @param result - The benchmark result to report on
|
|
12
|
+
* @returns Markdown string
|
|
13
|
+
*/
|
|
14
|
+
export declare function generateMarkdownReport(result: BenchmarkResult): string;
|
|
15
|
+
/**
|
|
16
|
+
* Generate summary table
|
|
17
|
+
*/
|
|
18
|
+
export declare function generateSummaryTable(summary: BenchmarkSummary): string;
|
|
19
|
+
/**
|
|
20
|
+
* Generate comparison section for a scenario
|
|
21
|
+
*/
|
|
22
|
+
export declare function generateComparisonSection(comparison: ComparisonResult): string;
|
|
23
|
+
/**
|
|
24
|
+
* Format a number with optional decimal places and thousand separators
|
|
25
|
+
*/
|
|
26
|
+
export declare function formatNumber(value: number, decimals?: number): string;
|
|
27
|
+
/**
|
|
28
|
+
* Format a percentage with sign
|
|
29
|
+
*/
|
|
30
|
+
export declare function formatPercentage(value: number): string;
|
|
31
|
+
/**
|
|
32
|
+
* Format duration in human-readable format
|
|
33
|
+
*/
|
|
34
|
+
export declare function formatDuration(ms: number): string;
|
|
35
|
+
//# sourceMappingURL=report-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-generator.d.ts","sourceRoot":"","sources":["../../src/benchmark/report-generator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAEjB,MAAM,YAAY,CAAC;AAGpB;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAiDtE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAatE;AA2BD;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,gBAAgB,GAAG,MAAM,CA2D9E;AAwDD;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAU,GAAG,MAAM,CAKxE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAStD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAUjD"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Report Generator for Scientific Benchmarks
|
|
3
|
+
*
|
|
4
|
+
* Generates comprehensive markdown reports from benchmark results.
|
|
5
|
+
* Includes statistical analysis, comparisons, and visualizations.
|
|
6
|
+
*/
|
|
7
|
+
import { SCENARIO_DESCRIPTIONS } from "./types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Generate a complete markdown report from benchmark results
|
|
10
|
+
*
|
|
11
|
+
* @param result - The benchmark result to report on
|
|
12
|
+
* @returns Markdown string
|
|
13
|
+
*/
|
|
14
|
+
export function generateMarkdownReport(result) {
|
|
15
|
+
const sections = [];
|
|
16
|
+
// Title
|
|
17
|
+
sections.push("# Vesper Benchmark Report\n");
|
|
18
|
+
// Timestamp
|
|
19
|
+
const timestamp = new Date(result.endTime).toISOString();
|
|
20
|
+
sections.push(`**Generated:** ${timestamp}\n`);
|
|
21
|
+
sections.push(`**Benchmark ID:** ${result.id}\n`);
|
|
22
|
+
sections.push(`**Duration:** ${formatDuration(result.endTime - result.startTime)}\n`);
|
|
23
|
+
sections.push("");
|
|
24
|
+
// Summary
|
|
25
|
+
sections.push("## Summary\n");
|
|
26
|
+
sections.push(generateSummaryTable(result.summary));
|
|
27
|
+
sections.push("");
|
|
28
|
+
// Overall conclusion
|
|
29
|
+
sections.push(generateConclusion(result.summary));
|
|
30
|
+
sections.push("");
|
|
31
|
+
// Detailed comparisons
|
|
32
|
+
sections.push("## Scenario Results\n");
|
|
33
|
+
for (const comparison of result.comparisons) {
|
|
34
|
+
sections.push(generateComparisonSection(comparison));
|
|
35
|
+
sections.push("");
|
|
36
|
+
}
|
|
37
|
+
// Configuration
|
|
38
|
+
sections.push("## Configuration\n");
|
|
39
|
+
sections.push(generateConfigSection(result));
|
|
40
|
+
sections.push("");
|
|
41
|
+
// Metadata
|
|
42
|
+
sections.push("## Metadata\n");
|
|
43
|
+
sections.push(generateMetadataSection(result));
|
|
44
|
+
sections.push("");
|
|
45
|
+
// Footer
|
|
46
|
+
sections.push("---\n");
|
|
47
|
+
sections.push("*Report generated by Vesper Scientific Benchmark System*\n");
|
|
48
|
+
sections.push("*Run benchmarks yourself: `npm run benchmark:scientific`*\n");
|
|
49
|
+
return sections.join("\n");
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Generate summary table
|
|
53
|
+
*/
|
|
54
|
+
export function generateSummaryTable(summary) {
|
|
55
|
+
const rows = [
|
|
56
|
+
["Metric", "Value"],
|
|
57
|
+
["---", "---"],
|
|
58
|
+
["Total Scenarios", String(summary.totalScenarios)],
|
|
59
|
+
["Vesper Wins", String(summary.vesperWins)],
|
|
60
|
+
["Disabled Wins", String(summary.disabledWins)],
|
|
61
|
+
["Ties", String(summary.ties)],
|
|
62
|
+
["Overall Improvement", formatPercentage(summary.overallImprovement)],
|
|
63
|
+
["Statistically Significant", summary.statisticallySignificant ? "Yes" : "No"],
|
|
64
|
+
];
|
|
65
|
+
return rows.map((row) => `| ${row.join(" | ")} |`).join("\n");
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Generate conclusion based on summary
|
|
69
|
+
*/
|
|
70
|
+
function generateConclusion(summary) {
|
|
71
|
+
const winRate = (summary.vesperWins / summary.totalScenarios) * 100;
|
|
72
|
+
let conclusion = "### Conclusion\n\n";
|
|
73
|
+
if (winRate >= 80 && summary.statisticallySignificant) {
|
|
74
|
+
conclusion += `Vesper demonstrates **strong, statistically significant improvements** across ${summary.vesperWins}/${summary.totalScenarios} scenarios. `;
|
|
75
|
+
conclusion += `Average improvement of ${formatPercentage(summary.overallImprovement)}.\n`;
|
|
76
|
+
}
|
|
77
|
+
else if (winRate >= 60) {
|
|
78
|
+
conclusion += `Vesper shows **moderate improvements** in ${summary.vesperWins}/${summary.totalScenarios} scenarios. `;
|
|
79
|
+
conclusion += `Further testing recommended to confirm statistical significance.\n`;
|
|
80
|
+
}
|
|
81
|
+
else if (winRate >= 40) {
|
|
82
|
+
conclusion += `Results are **mixed**, with Vesper winning ${summary.vesperWins}/${summary.totalScenarios} scenarios. `;
|
|
83
|
+
conclusion += `Consider scenario-specific optimizations.\n`;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
conclusion += `Vesper shows **limited improvement** in current configuration. `;
|
|
87
|
+
conclusion += `Review implementation and test methodology.\n`;
|
|
88
|
+
}
|
|
89
|
+
return conclusion;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Generate comparison section for a scenario
|
|
93
|
+
*/
|
|
94
|
+
export function generateComparisonSection(comparison) {
|
|
95
|
+
const sections = [];
|
|
96
|
+
// Scenario header
|
|
97
|
+
const scenarioName = comparison.scenarioType.replace(/-/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
|
|
98
|
+
sections.push(`### ${scenarioName}\n`);
|
|
99
|
+
// Description
|
|
100
|
+
const description = SCENARIO_DESCRIPTIONS[comparison.scenarioType] || "";
|
|
101
|
+
if (description) {
|
|
102
|
+
sections.push(`*${description}*\n`);
|
|
103
|
+
}
|
|
104
|
+
// Winner badge
|
|
105
|
+
const winnerText = comparison.winner === "vesper-enabled"
|
|
106
|
+
? "**Winner: Vesper Enabled**"
|
|
107
|
+
: comparison.winner === "vesper-disabled"
|
|
108
|
+
? "**Winner: Vesper Disabled**"
|
|
109
|
+
: "**Result: Tie**";
|
|
110
|
+
sections.push(winnerText + "\n");
|
|
111
|
+
// Latency comparison table
|
|
112
|
+
sections.push("#### Latency (ms)\n");
|
|
113
|
+
sections.push("| Metric | Vesper Enabled | Vesper Disabled | Improvement |");
|
|
114
|
+
sections.push("| --- | --- | --- | --- |");
|
|
115
|
+
sections.push(`| P50 | ${formatNumber(comparison.enabledResult.aggregates.latencyP50, 1)} | ${formatNumber(comparison.disabledResult.aggregates.latencyP50, 1)} | ${calculateImprovementText(comparison.enabledResult.aggregates.latencyP50, comparison.disabledResult.aggregates.latencyP50)} |`);
|
|
116
|
+
sections.push(`| P95 | ${formatNumber(comparison.enabledResult.aggregates.latencyP95, 1)} | ${formatNumber(comparison.disabledResult.aggregates.latencyP95, 1)} | ${calculateImprovementText(comparison.enabledResult.aggregates.latencyP95, comparison.disabledResult.aggregates.latencyP95)} |`);
|
|
117
|
+
sections.push(`| P99 | ${formatNumber(comparison.enabledResult.aggregates.latencyP99, 1)} | ${formatNumber(comparison.disabledResult.aggregates.latencyP99, 1)} | ${calculateImprovementText(comparison.enabledResult.aggregates.latencyP99, comparison.disabledResult.aggregates.latencyP99)} |`);
|
|
118
|
+
sections.push("");
|
|
119
|
+
// Memory hit rate
|
|
120
|
+
if (comparison.enabledResult.aggregates.memoryHitRate !== undefined ||
|
|
121
|
+
comparison.disabledResult.aggregates.memoryHitRate !== undefined) {
|
|
122
|
+
const enabledHitRate = comparison.enabledResult.aggregates.memoryHitRate ?? 0;
|
|
123
|
+
const disabledHitRate = comparison.disabledResult.aggregates.memoryHitRate ?? 0;
|
|
124
|
+
sections.push(`**Memory Hit Rate:** Enabled: ${formatPercentage(enabledHitRate * 100)}, Disabled: ${formatPercentage(disabledHitRate * 100)}\n`);
|
|
125
|
+
}
|
|
126
|
+
// Statistical analysis
|
|
127
|
+
sections.push("#### Statistical Analysis\n");
|
|
128
|
+
const stats = comparison.statistics;
|
|
129
|
+
sections.push(`- **Latency Improvement:** ${formatPercentage(stats.latencyImprovement)}`);
|
|
130
|
+
sections.push(`- **t-test statistic:** ${formatNumber(stats.tTestResult.tStatistic, 3)}`);
|
|
131
|
+
sections.push(`- **p-value:** ${formatNumber(stats.tTestResult.pValue, 4)}`);
|
|
132
|
+
sections.push(`- **Significant (p < ${stats.tTestResult.alpha}):** ${stats.tTestResult.significant ? "Yes" : "No"}`);
|
|
133
|
+
sections.push(`- **Cohen's d:** ${formatNumber(stats.effectSize.cohensD, 3)} (${stats.effectSize.interpretation})`);
|
|
134
|
+
sections.push("");
|
|
135
|
+
return sections.join("\n");
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Calculate improvement text for a metric
|
|
139
|
+
*/
|
|
140
|
+
function calculateImprovementText(enabled, disabled) {
|
|
141
|
+
if (disabled === 0)
|
|
142
|
+
return "N/A";
|
|
143
|
+
const improvement = ((disabled - enabled) / disabled) * 100;
|
|
144
|
+
return formatPercentage(improvement);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Generate configuration section
|
|
148
|
+
*/
|
|
149
|
+
function generateConfigSection(result) {
|
|
150
|
+
const config = result.config;
|
|
151
|
+
const rows = [
|
|
152
|
+
["Setting", "Value"],
|
|
153
|
+
["---", "---"],
|
|
154
|
+
["Warmup Runs", String(config.warmupRuns)],
|
|
155
|
+
["Measurement Runs", String(config.measurementRuns)],
|
|
156
|
+
["Timeout (ms)", String(config.timeoutMs)],
|
|
157
|
+
["Significance Level (alpha)", String(config.significanceLevel)],
|
|
158
|
+
["Scenarios", config.scenarios.join(", ")],
|
|
159
|
+
["Output Directory", config.outputDirectory],
|
|
160
|
+
];
|
|
161
|
+
return rows.map((row) => `| ${row.join(" | ")} |`).join("\n");
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Generate metadata section
|
|
165
|
+
*/
|
|
166
|
+
function generateMetadataSection(result) {
|
|
167
|
+
const meta = result.metadata;
|
|
168
|
+
const rows = [
|
|
169
|
+
["Property", "Value"],
|
|
170
|
+
["---", "---"],
|
|
171
|
+
["Version", meta.version],
|
|
172
|
+
["Environment", meta.environment],
|
|
173
|
+
];
|
|
174
|
+
if (meta.hostname) {
|
|
175
|
+
rows.push(["Hostname", meta.hostname]);
|
|
176
|
+
}
|
|
177
|
+
if (meta.nodeVersion) {
|
|
178
|
+
rows.push(["Node Version", meta.nodeVersion]);
|
|
179
|
+
}
|
|
180
|
+
return rows.map((row) => `| ${row.join(" | ")} |`).join("\n");
|
|
181
|
+
}
|
|
182
|
+
// =============================================================================
|
|
183
|
+
// Formatting Helper Functions
|
|
184
|
+
// =============================================================================
|
|
185
|
+
/**
|
|
186
|
+
* Format a number with optional decimal places and thousand separators
|
|
187
|
+
*/
|
|
188
|
+
export function formatNumber(value, decimals = 0) {
|
|
189
|
+
if (decimals === 0) {
|
|
190
|
+
return value.toLocaleString("en-US", { maximumFractionDigits: 0 });
|
|
191
|
+
}
|
|
192
|
+
return value.toFixed(decimals);
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Format a percentage with sign
|
|
196
|
+
*/
|
|
197
|
+
export function formatPercentage(value) {
|
|
198
|
+
const formatted = value.toFixed(1);
|
|
199
|
+
if (value > 0) {
|
|
200
|
+
return `+${formatted}%`;
|
|
201
|
+
}
|
|
202
|
+
if (value < 0) {
|
|
203
|
+
return `${formatted}%`;
|
|
204
|
+
}
|
|
205
|
+
return `${formatted}%`;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Format duration in human-readable format
|
|
209
|
+
*/
|
|
210
|
+
export function formatDuration(ms) {
|
|
211
|
+
if (ms < 1000) {
|
|
212
|
+
return `${ms}ms`;
|
|
213
|
+
}
|
|
214
|
+
if (ms < 60000) {
|
|
215
|
+
return `${(ms / 1000).toFixed(1)}s`;
|
|
216
|
+
}
|
|
217
|
+
const minutes = Math.floor(ms / 60000);
|
|
218
|
+
const seconds = Math.floor((ms % 60000) / 1000);
|
|
219
|
+
return `${minutes}m ${seconds}s`;
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=report-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-generator.js","sourceRoot":"","sources":["../../src/benchmark/report-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Benchmark Runner
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates the execution of all benchmark scenarios.
|
|
5
|
+
* Runs A/B tests (Vesper enabled vs disabled) and compares results.
|
|
6
|
+
*/
|
|
7
|
+
import type { BenchmarkConfig, BenchmarkResult, ScenarioResult, StatisticalComparison } from "./types.js";
|
|
8
|
+
import { MCPClient } from "./scenarios/index.js";
|
|
9
|
+
/**
|
|
10
|
+
* Benchmark runner interface
|
|
11
|
+
*/
|
|
12
|
+
export interface BenchmarkRunner {
|
|
13
|
+
/** Get current configuration */
|
|
14
|
+
getConfig(): BenchmarkConfig;
|
|
15
|
+
/** Run all benchmarks */
|
|
16
|
+
run(): Promise<BenchmarkResult>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Create a benchmark runner
|
|
20
|
+
*
|
|
21
|
+
* @param client - MCP client for memory operations
|
|
22
|
+
* @param config - Benchmark configuration
|
|
23
|
+
* @returns BenchmarkRunner instance
|
|
24
|
+
*/
|
|
25
|
+
export declare function createBenchmarkRunner(client: MCPClient, config: BenchmarkConfig): BenchmarkRunner;
|
|
26
|
+
/**
|
|
27
|
+
* Compare two scenario results statistically
|
|
28
|
+
*/
|
|
29
|
+
export declare function comparePhasesStatistically(enabledResult: ScenarioResult, disabledResult: ScenarioResult, alpha: number): StatisticalComparison;
|
|
30
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/benchmark/runner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,cAAc,EAEd,qBAAqB,EAItB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAkB,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAIjE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,gCAAgC;IAChC,SAAS,IAAI,eAAe,CAAC;IAE7B,yBAAyB;IACzB,GAAG,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;CACjC;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,eAAe,GACtB,eAAe,CAsDjB;AA2HD;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,aAAa,EAAE,cAAc,EAC7B,cAAc,EAAE,cAAc,EAC9B,KAAK,EAAE,MAAM,GACZ,qBAAqB,CAgFvB"}
|