fastrmemory 0.5.0 → 0.6.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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +2 -2
- package/.cursor/skills/skills.json +1 -1
- package/README.md +40 -30
- package/dist/bin/fastr.js +122 -14
- package/dist/bin/fastr.js.map +1 -1
- package/dist/src/bench/harness.d.ts.map +1 -1
- package/dist/src/bench/harness.js +4 -0
- package/dist/src/bench/harness.js.map +1 -1
- package/dist/src/bench/marker-corpus.d.ts +98 -0
- package/dist/src/bench/marker-corpus.d.ts.map +1 -0
- package/dist/src/bench/marker-corpus.js +306 -0
- package/dist/src/bench/marker-corpus.js.map +1 -0
- package/dist/src/bench/mcp-stdio.d.ts +55 -0
- package/dist/src/bench/mcp-stdio.d.ts.map +1 -0
- package/dist/src/bench/mcp-stdio.js +146 -0
- package/dist/src/bench/mcp-stdio.js.map +1 -0
- package/dist/src/bench/public-datasets.d.ts +2 -0
- package/dist/src/bench/public-datasets.d.ts.map +1 -1
- package/dist/src/bench/public-datasets.js +2 -1
- package/dist/src/bench/public-datasets.js.map +1 -1
- package/dist/src/bench/public-harness.d.ts +14 -0
- package/dist/src/bench/public-harness.d.ts.map +1 -1
- package/dist/src/bench/public-harness.js +83 -8
- package/dist/src/bench/public-harness.js.map +1 -1
- package/dist/src/bench/public-pins.js +5 -5
- package/dist/src/bench/public-pins.js.map +1 -1
- package/dist/src/bench/split.d.ts +33 -0
- package/dist/src/bench/split.d.ts.map +1 -0
- package/dist/src/bench/split.js +56 -0
- package/dist/src/bench/split.js.map +1 -0
- package/dist/src/bench/stats.d.ts +40 -0
- package/dist/src/bench/stats.d.ts.map +1 -0
- package/dist/src/bench/stats.js +99 -0
- package/dist/src/bench/stats.js.map +1 -0
- package/dist/src/bench/vs-engines.d.ts +51 -0
- package/dist/src/bench/vs-engines.d.ts.map +1 -0
- package/dist/src/bench/vs-engines.js +121 -0
- package/dist/src/bench/vs-engines.js.map +1 -0
- package/dist/src/config.d.ts +33 -0
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +84 -1
- package/dist/src/config.js.map +1 -1
- package/dist/src/db/doctor.d.ts +8 -0
- package/dist/src/db/doctor.d.ts.map +1 -1
- package/dist/src/db/doctor.js +65 -1
- package/dist/src/db/doctor.js.map +1 -1
- package/dist/src/db/fts-queue.d.ts +35 -0
- package/dist/src/db/fts-queue.d.ts.map +1 -0
- package/dist/src/db/fts-queue.js +78 -0
- package/dist/src/db/fts-queue.js.map +1 -0
- package/dist/src/db/repository.d.ts +63 -1
- package/dist/src/db/repository.d.ts.map +1 -1
- package/dist/src/db/repository.js +244 -50
- package/dist/src/db/repository.js.map +1 -1
- package/dist/src/db/schema.d.ts +1 -1
- package/dist/src/db/schema.d.ts.map +1 -1
- package/dist/src/db/schema.js +63 -2
- package/dist/src/db/schema.js.map +1 -1
- package/dist/src/installer/copilot.d.ts +21 -0
- package/dist/src/installer/copilot.d.ts.map +1 -1
- package/dist/src/installer/copilot.js +72 -1
- package/dist/src/installer/copilot.js.map +1 -1
- package/dist/src/installer/gemini.d.ts +13 -0
- package/dist/src/installer/gemini.d.ts.map +1 -1
- package/dist/src/installer/gemini.js +64 -1
- package/dist/src/installer/gemini.js.map +1 -1
- package/dist/src/installer/hooks.d.ts +42 -5
- package/dist/src/installer/hooks.d.ts.map +1 -1
- package/dist/src/installer/hooks.js +270 -62
- package/dist/src/installer/hooks.js.map +1 -1
- package/dist/src/installer/json-config.d.ts +25 -1
- package/dist/src/installer/json-config.d.ts.map +1 -1
- package/dist/src/installer/json-config.js +95 -2
- package/dist/src/installer/json-config.js.map +1 -1
- package/dist/src/installer/mcp-init.d.ts.map +1 -1
- package/dist/src/installer/mcp-init.js +5 -6
- package/dist/src/installer/mcp-init.js.map +1 -1
- package/dist/src/installer/opencode.d.ts +18 -0
- package/dist/src/installer/opencode.d.ts.map +1 -1
- package/dist/src/installer/opencode.js +81 -1
- package/dist/src/installer/opencode.js.map +1 -1
- package/dist/src/installer/setup.d.ts +7 -0
- package/dist/src/installer/setup.d.ts.map +1 -1
- package/dist/src/installer/setup.js +32 -0
- package/dist/src/installer/setup.js.map +1 -1
- package/dist/src/mcp/profiles.d.ts +9 -6
- package/dist/src/mcp/profiles.d.ts.map +1 -1
- package/dist/src/mcp/profiles.js +12 -9
- package/dist/src/mcp/profiles.js.map +1 -1
- package/dist/src/mcp/server.d.ts +1 -1
- package/dist/src/mcp/server.d.ts.map +1 -1
- package/dist/src/mcp/server.js +80 -0
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/search/aggregate.d.ts +24 -0
- package/dist/src/search/aggregate.d.ts.map +1 -0
- package/dist/src/search/aggregate.js +59 -0
- package/dist/src/search/aggregate.js.map +1 -0
- package/dist/src/search/backfill.d.ts.map +1 -1
- package/dist/src/search/backfill.js +7 -2
- package/dist/src/search/backfill.js.map +1 -1
- package/dist/src/search/budget.d.ts +2 -0
- package/dist/src/search/budget.d.ts.map +1 -1
- package/dist/src/search/budget.js.map +1 -1
- package/dist/src/search/embeddings.d.ts +35 -2
- package/dist/src/search/embeddings.d.ts.map +1 -1
- package/dist/src/search/embeddings.js +128 -5
- package/dist/src/search/embeddings.js.map +1 -1
- package/dist/src/search/hybrid-rrf.d.ts +45 -0
- package/dist/src/search/hybrid-rrf.d.ts.map +1 -1
- package/dist/src/search/hybrid-rrf.js +212 -56
- package/dist/src/search/hybrid-rrf.js.map +1 -1
- package/dist/src/search/static-model-install.d.ts +43 -0
- package/dist/src/search/static-model-install.d.ts.map +1 -0
- package/dist/src/search/static-model-install.js +112 -0
- package/dist/src/search/static-model-install.js.map +1 -0
- package/dist/src/search/static-model.d.ts +63 -0
- package/dist/src/search/static-model.d.ts.map +1 -0
- package/dist/src/search/static-model.js +244 -0
- package/dist/src/search/static-model.js.map +1 -0
- package/dist/src/search/temporal.d.ts +32 -0
- package/dist/src/search/temporal.d.ts.map +1 -0
- package/dist/src/search/temporal.js +164 -0
- package/dist/src/search/temporal.js.map +1 -0
- package/llms-install.md +3 -3
- package/package.json +5 -1
- package/server.json +1 -1
- package/skills/skills.json +1 -1
|
@@ -14,6 +14,8 @@ export interface PublicEngine {
|
|
|
14
14
|
retrieval: RetrievalConfig;
|
|
15
15
|
requiresEmbeddings?: boolean;
|
|
16
16
|
embeddingModel?: 'hash' | 'minilm';
|
|
17
|
+
/** Result depth the engine returns (default 10). */
|
|
18
|
+
limit?: number;
|
|
17
19
|
}
|
|
18
20
|
export declare const PUBLIC_ENGINES: PublicEngine[];
|
|
19
21
|
export interface PublicCaseResult {
|
|
@@ -27,11 +29,16 @@ export interface PublicCaseResult {
|
|
|
27
29
|
hitAt10: number;
|
|
28
30
|
recallAt5: number;
|
|
29
31
|
fullRecallAt5: number;
|
|
32
|
+
/** Strict@10: every gold id is present in the top 10. */
|
|
33
|
+
fullRecallAt10: number;
|
|
30
34
|
goldCount: number;
|
|
31
35
|
retrieved: string[];
|
|
32
36
|
goldIds: string[];
|
|
33
37
|
tokens: number;
|
|
34
38
|
latencyMs: number;
|
|
39
|
+
/** Parsed temporal window applied to this case, when the engine used one. */
|
|
40
|
+
temporalWindow?: string;
|
|
41
|
+
temporalFallback?: boolean;
|
|
35
42
|
}
|
|
36
43
|
export interface PublicMetrics {
|
|
37
44
|
count: number;
|
|
@@ -41,6 +48,8 @@ export interface PublicMetrics {
|
|
|
41
48
|
mrr: number;
|
|
42
49
|
evidenceRecallAt5: number;
|
|
43
50
|
fullRecallAt5: number;
|
|
51
|
+
/** Strict@10 = all gold ids in the top 10, averaged over cases. */
|
|
52
|
+
fullRecallAt10: number;
|
|
44
53
|
avgTokens: number;
|
|
45
54
|
p50LatencyMs: number;
|
|
46
55
|
p95LatencyMs: number;
|
|
@@ -48,11 +57,16 @@ export interface PublicMetrics {
|
|
|
48
57
|
export interface PublicCategoryMetrics extends PublicMetrics {
|
|
49
58
|
category: string;
|
|
50
59
|
}
|
|
60
|
+
/** Metrics restricted to cases with an exact gold count (the aggregate-question slice). */
|
|
61
|
+
export interface PublicGoldBucket extends PublicMetrics {
|
|
62
|
+
goldCount: number;
|
|
63
|
+
}
|
|
51
64
|
export interface PublicEngineEval {
|
|
52
65
|
name: string;
|
|
53
66
|
config: RetrievalConfig;
|
|
54
67
|
overall: PublicMetrics;
|
|
55
68
|
byCategory: PublicCategoryMetrics[];
|
|
69
|
+
byGoldCount: PublicGoldBucket[];
|
|
56
70
|
cases: PublicCaseResult[];
|
|
57
71
|
}
|
|
58
72
|
export interface PublicHarnessOptions {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public-harness.d.ts","sourceRoot":"","sources":["../../../src/bench/public-harness.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"public-harness.d.ts","sourceRoot":"","sources":["../../../src/bench/public-harness.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EAAkB,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAEtE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,eAAe,CAAC;IAC3B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IACnC,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,cAAc,EAAE,YAAY,EAyFxC,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,mEAAmE;IACnE,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,qBAAsB,SAAQ,aAAa;IAC1D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,2FAA2F;AAC3F,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IACrD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,EAAE,qBAAqB,EAAE,CAAC;IACpC,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,aAAa,GAAG;IAAE,EAAE,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,eAAe,CAAA;CAAE,CAsCrG;AAED,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,YAAY,EAChB,IAAI,EAAE,eAAe,EACrB,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,MAAM,CAAC,CAQjB;AAaD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,EAAE,GAAG,aAAa,CA+BzE;AAED,wBAAgB,UAAU,CACxB,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,MAAM,EAAE,EACnB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,gBAAgB,CA2BlB;AAED,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,YAAY,EAChB,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,gBAAgB,CAAC,CA8C3B"}
|
|
@@ -9,22 +9,78 @@ import { DatabaseSync } from 'node:sqlite';
|
|
|
9
9
|
import { applySchema } from '../db/schema.js';
|
|
10
10
|
import { FastrRepository } from '../db/repository.js';
|
|
11
11
|
import { backfillEmbeddings } from '../search/backfill.js';
|
|
12
|
+
import { drainFtsQueue } from '../db/fts-queue.js';
|
|
12
13
|
import { searchMemories } from '../search/hybrid-rrf.js';
|
|
13
14
|
export const PUBLIC_ENGINES = [
|
|
14
15
|
{
|
|
15
16
|
name: 'bm25_only',
|
|
16
|
-
retrieval: {
|
|
17
|
+
retrieval: {
|
|
18
|
+
enableBm25: true,
|
|
19
|
+
enableVector: false,
|
|
20
|
+
enableGraph: false,
|
|
21
|
+
trapBoost: 1,
|
|
22
|
+
verifiedBoost: 1,
|
|
23
|
+
aggregateCoverage: false
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
// Same first stage, plus the parsed date window as a pre-ranking filter.
|
|
28
|
+
name: 'bm25_temporal',
|
|
29
|
+
retrieval: {
|
|
30
|
+
enableBm25: true,
|
|
31
|
+
enableVector: false,
|
|
32
|
+
enableGraph: false,
|
|
33
|
+
trapBoost: 1,
|
|
34
|
+
verifiedBoost: 1,
|
|
35
|
+
temporalFilter: true,
|
|
36
|
+
aggregateCoverage: false
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
// Counting questions search with their content terms only and return the full set.
|
|
41
|
+
name: 'bm25_aggregate',
|
|
42
|
+
retrieval: {
|
|
43
|
+
enableBm25: true,
|
|
44
|
+
enableVector: false,
|
|
45
|
+
enableGraph: false,
|
|
46
|
+
trapBoost: 1,
|
|
47
|
+
verifiedBoost: 1,
|
|
48
|
+
aggregateCoverage: true,
|
|
49
|
+
aggregateLimit: 20
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
// Both stages: the window removes out-of-range rows, the aggregate pass removes
|
|
54
|
+
// scaffolding from the lexical query.
|
|
55
|
+
name: 'bm25_temporal_aggregate',
|
|
56
|
+
retrieval: {
|
|
57
|
+
enableBm25: true,
|
|
58
|
+
enableVector: false,
|
|
59
|
+
enableGraph: false,
|
|
60
|
+
trapBoost: 1,
|
|
61
|
+
verifiedBoost: 1,
|
|
62
|
+
temporalFilter: true,
|
|
63
|
+
aggregateCoverage: true,
|
|
64
|
+
aggregateLimit: 20
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
// The shipped default after P0: full pipeline, vector stream off unless a semantic
|
|
69
|
+
// provider is loaded. This is what a user gets with no configuration at all.
|
|
70
|
+
name: 'default_config',
|
|
71
|
+
retrieval: {}
|
|
17
72
|
},
|
|
18
73
|
{
|
|
19
74
|
name: 'full_hash',
|
|
20
75
|
retrieval: {
|
|
21
76
|
enableBm25: true,
|
|
22
|
-
|
|
77
|
+
vectorMode: 'hash',
|
|
23
78
|
enableGraph: true,
|
|
24
79
|
graphSeedFromCandidates: false,
|
|
25
80
|
trapBoost: 2.0,
|
|
26
81
|
trapBoostMode: 'conditional',
|
|
27
|
-
verifiedBoost: 1.25
|
|
82
|
+
verifiedBoost: 1.25,
|
|
83
|
+
aggregateCoverage: false
|
|
28
84
|
},
|
|
29
85
|
requiresEmbeddings: true,
|
|
30
86
|
embeddingModel: 'hash'
|
|
@@ -33,12 +89,13 @@ export const PUBLIC_ENGINES = [
|
|
|
33
89
|
name: 'full_minilm',
|
|
34
90
|
retrieval: {
|
|
35
91
|
enableBm25: true,
|
|
36
|
-
|
|
92
|
+
vectorMode: 'semantic',
|
|
37
93
|
enableGraph: true,
|
|
38
94
|
graphSeedFromCandidates: false,
|
|
39
95
|
trapBoost: 2.0,
|
|
40
96
|
trapBoostMode: 'conditional',
|
|
41
|
-
verifiedBoost: 1.25
|
|
97
|
+
verifiedBoost: 1.25,
|
|
98
|
+
aggregateCoverage: false
|
|
42
99
|
},
|
|
43
100
|
requiresEmbeddings: true,
|
|
44
101
|
embeddingModel: 'minilm'
|
|
@@ -65,6 +122,8 @@ export function loadPublicDataset(dataset) {
|
|
|
65
122
|
db.exec('ROLLBACK');
|
|
66
123
|
throw error;
|
|
67
124
|
}
|
|
125
|
+
// Seeding is not timed; index everything so the first measured query is a warm query.
|
|
126
|
+
drainFtsQueue(db, { limit: 1_000_000, schema: 'main' });
|
|
68
127
|
return { db, repo };
|
|
69
128
|
}
|
|
70
129
|
export async function prepareEmbeddings(db, repo, dataset, engine) {
|
|
@@ -98,6 +157,7 @@ export function metricsFromCases(cases) {
|
|
|
98
157
|
mrr: 0,
|
|
99
158
|
evidenceRecallAt5: 0,
|
|
100
159
|
fullRecallAt5: 0,
|
|
160
|
+
fullRecallAt10: 0,
|
|
101
161
|
avgTokens: 0,
|
|
102
162
|
p50LatencyMs: 0,
|
|
103
163
|
p95LatencyMs: 0
|
|
@@ -112,6 +172,7 @@ export function metricsFromCases(cases) {
|
|
|
112
172
|
mrr: round(cases.reduce((sum, item) => sum + item.reciprocalRank, 0) / count, 3),
|
|
113
173
|
evidenceRecallAt5: round(cases.reduce((sum, item) => sum + item.recallAt5, 0) / count, 3),
|
|
114
174
|
fullRecallAt5: round((cases.reduce((sum, item) => sum + item.fullRecallAt5, 0) / count) * 100, 1),
|
|
175
|
+
fullRecallAt10: round((cases.reduce((sum, item) => sum + item.fullRecallAt10, 0) / count) * 100, 1),
|
|
115
176
|
avgTokens: Math.round(cases.reduce((sum, item) => sum + item.tokens, 0) / count),
|
|
116
177
|
p50LatencyMs: round(percentile(latencies, 50), 2),
|
|
117
178
|
p95LatencyMs: round(percentile(latencies, 95), 2)
|
|
@@ -124,6 +185,8 @@ export function caseResult(item, retrieved, tokens, latencyMs) {
|
|
|
124
185
|
const top5 = retrieved.slice(0, 5);
|
|
125
186
|
const foundAt5 = top5.filter((id) => gold.has(id)).length;
|
|
126
187
|
const recallAt5 = gold.size === 0 ? 0 : foundAt5 / gold.size;
|
|
188
|
+
const foundAt10 = retrieved.slice(0, 10).filter((id) => gold.has(id)).length;
|
|
189
|
+
const fullRecallAt10 = gold.size > 0 && foundAt10 === gold.size ? 1 : 0;
|
|
127
190
|
return {
|
|
128
191
|
caseId: item.id,
|
|
129
192
|
category: item.category,
|
|
@@ -135,6 +198,7 @@ export function caseResult(item, retrieved, tokens, latencyMs) {
|
|
|
135
198
|
hitAt10: rank > 0 && rank <= 10 ? 1 : 0,
|
|
136
199
|
recallAt5: round(recallAt5, 3),
|
|
137
200
|
fullRecallAt5: recallAt5 === 1 ? 1 : 0,
|
|
201
|
+
fullRecallAt10,
|
|
138
202
|
goldCount: item.goldIds.length,
|
|
139
203
|
retrieved,
|
|
140
204
|
goldIds: item.goldIds,
|
|
@@ -145,6 +209,7 @@ export function caseResult(item, retrieved, tokens, latencyMs) {
|
|
|
145
209
|
export async function evaluatePublicEngine(db, dataset, engine, options = {}) {
|
|
146
210
|
const selected = options.limit ? dataset.cases.slice(0, options.limit) : dataset.cases;
|
|
147
211
|
const budgetTokens = options.budgetTokens ?? 1_000_000;
|
|
212
|
+
const resultLimit = engine.limit ?? 10;
|
|
148
213
|
const results = [];
|
|
149
214
|
for (const item of selected) {
|
|
150
215
|
const start = performance.now();
|
|
@@ -152,14 +217,20 @@ export async function evaluatePublicEngine(db, dataset, engine, options = {}) {
|
|
|
152
217
|
projectId: item.projectId,
|
|
153
218
|
query: item.query,
|
|
154
219
|
budgetTokens,
|
|
155
|
-
limit:
|
|
220
|
+
limit: resultLimit,
|
|
156
221
|
backfill: false,
|
|
157
|
-
retrieval: engine.retrieval
|
|
222
|
+
retrieval: { ...engine.retrieval, questionDate: item.questionDate }
|
|
158
223
|
});
|
|
159
224
|
const latencyMs = performance.now() - start;
|
|
160
|
-
|
|
225
|
+
const caseRow = caseResult(item, response.memories.map((memory) => memory.memory.id), response.totalTokens, latencyMs);
|
|
226
|
+
if (response.temporalWindow) {
|
|
227
|
+
caseRow.temporalWindow = response.temporalWindow.label;
|
|
228
|
+
caseRow.temporalFallback = response.temporalFallback === true;
|
|
229
|
+
}
|
|
230
|
+
results.push(caseRow);
|
|
161
231
|
}
|
|
162
232
|
const categories = Array.from(new Set(results.map((item) => item.category))).sort();
|
|
233
|
+
const goldCounts = Array.from(new Set(results.map((item) => item.goldCount))).sort((a, b) => a - b);
|
|
163
234
|
return {
|
|
164
235
|
name: engine.name,
|
|
165
236
|
config: engine.retrieval,
|
|
@@ -168,6 +239,10 @@ export async function evaluatePublicEngine(db, dataset, engine, options = {}) {
|
|
|
168
239
|
category,
|
|
169
240
|
...metricsFromCases(results.filter((item) => item.category === category))
|
|
170
241
|
})),
|
|
242
|
+
byGoldCount: goldCounts.map((goldCount) => ({
|
|
243
|
+
goldCount,
|
|
244
|
+
...metricsFromCases(results.filter((item) => item.goldCount === goldCount))
|
|
245
|
+
})),
|
|
171
246
|
cases: results
|
|
172
247
|
};
|
|
173
248
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public-harness.js","sourceRoot":"","sources":["../../../src/bench/public-harness.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAwB,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"public-harness.js","sourceRoot":"","sources":["../../../src/bench/public-harness.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,11 +8,11 @@ import * as crypto from 'node:crypto';
|
|
|
8
8
|
import * as fs from 'node:fs';
|
|
9
9
|
export const PUBLIC_DATASET_PINS = {
|
|
10
10
|
longmemeval: {
|
|
11
|
-
file: '
|
|
12
|
-
revision: '
|
|
13
|
-
sha256: '
|
|
14
|
-
url: 'https://huggingface.co/datasets/xiaowu0162/longmemeval',
|
|
15
|
-
source: 'huggingface:xiaowu0162/longmemeval'
|
|
11
|
+
file: 'longmemeval_s_cleaned.json',
|
|
12
|
+
revision: '98d7416c24c778c2fee6e6f3006e7a073259d48f',
|
|
13
|
+
sha256: 'D6F21EA9D60A0D56F34A05B609C79C88A451D2AE03597821EA3D5A9678C3A442',
|
|
14
|
+
url: 'https://huggingface.co/datasets/xiaowu0162/longmemeval-cleaned',
|
|
15
|
+
source: 'huggingface:xiaowu0162/longmemeval-cleaned'
|
|
16
16
|
},
|
|
17
17
|
locomo: {
|
|
18
18
|
file: 'locomo10.json',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public-pins.js","sourceRoot":"","sources":["../../../src/bench/public-pins.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAY9B,MAAM,CAAC,MAAM,mBAAmB,GAA0C;IACxE,WAAW,EAAE;QACX,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"public-pins.js","sourceRoot":"","sources":["../../../src/bench/public-pins.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAY9B,MAAM,CAAC,MAAM,mBAAmB,GAA0C;IACxE,WAAW,EAAE;QACX,IAAI,EAAE,4BAA4B;QAClC,QAAQ,EAAE,0CAA0C;QACpD,MAAM,EAAE,kEAAkE;QAC1E,GAAG,EAAE,gEAAgE;QACrE,MAAM,EAAE,4CAA4C;KACrD;IACD,MAAM,EAAE;QACN,IAAI,EAAE,eAAe;QACrB,QAAQ,EAAE,0CAA0C;QACpD,MAAM,EAAE,kEAAkE;QAC1E,GAAG,EAAE,yCAAyC;QAC9C,MAAM,EAAE,6BAA6B;KACtC;CACF,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;AAC/F,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAe,EAAE,IAAY,EAAE,aAAsB;IACpF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,yBAAyB,IAAI,sBAAsB,GAAG,CAAC,GAAG,gBAAgB,GAAG,CAAC,QAAQ,oBAAoB,IAAI,EAAE,CACjH,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CACb,6BAA6B,IAAI,cAAc,GAAG,CAAC,MAAM,cAAc,MAAM,+DAA+D,CAC7I,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic evaluation split.
|
|
3
|
+
*
|
|
4
|
+
* The split is derived from a SHA-256 of the case id and never from the case content,
|
|
5
|
+
* question type, or result. Sorting by that hash and cutting at the midpoint produces an
|
|
6
|
+
* exactly balanced 60/60 split for a 120-case slice and is stable across machines, Node
|
|
7
|
+
* versions, and runs.
|
|
8
|
+
*
|
|
9
|
+
* Tuning happens on `dev` only. The `test` half is reported but never used to choose a
|
|
10
|
+
* default, a threshold, or a fusion weight.
|
|
11
|
+
*/
|
|
12
|
+
export type BenchSplitName = 'dev' | 'test';
|
|
13
|
+
export interface SplitCase {
|
|
14
|
+
id: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function splitKey(id: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* Partitions cases into dev/test halves. The ordering of the input never matters: both
|
|
19
|
+
* halves are returned in the input order, but membership is decided by the hash rank.
|
|
20
|
+
*/
|
|
21
|
+
export declare function splitCases<T extends SplitCase>(cases: T[], devFraction?: number): {
|
|
22
|
+
dev: T[];
|
|
23
|
+
test: T[];
|
|
24
|
+
};
|
|
25
|
+
export declare function selectSplit<T extends SplitCase>(cases: T[], split: BenchSplitName | 'all'): T[];
|
|
26
|
+
/**
|
|
27
|
+
* Takes the first `perType` cases of every category, in dataset order. This is the
|
|
28
|
+
* documented slice rule: first 20 answerable questions per question_type x 6 types.
|
|
29
|
+
*/
|
|
30
|
+
export declare function slicePerType<T extends {
|
|
31
|
+
category: string;
|
|
32
|
+
}>(cases: T[], perType: number): T[];
|
|
33
|
+
//# sourceMappingURL=split.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"split.d.ts","sourceRoot":"","sources":["../../../src/bench/split.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,CAAC;AAE5C,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,WAAW,SAAM,GAAG;IAC9E,GAAG,EAAE,CAAC,EAAE,CAAC;IACT,IAAI,EAAE,CAAC,EAAE,CAAC;CACX,CAaA;AAED,wBAAgB,WAAW,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,cAAc,GAAG,KAAK,GAAG,CAAC,EAAE,CAG/F;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,EAAE,CAU7F"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic evaluation split.
|
|
3
|
+
*
|
|
4
|
+
* The split is derived from a SHA-256 of the case id and never from the case content,
|
|
5
|
+
* question type, or result. Sorting by that hash and cutting at the midpoint produces an
|
|
6
|
+
* exactly balanced 60/60 split for a 120-case slice and is stable across machines, Node
|
|
7
|
+
* versions, and runs.
|
|
8
|
+
*
|
|
9
|
+
* Tuning happens on `dev` only. The `test` half is reported but never used to choose a
|
|
10
|
+
* default, a threshold, or a fusion weight.
|
|
11
|
+
*/
|
|
12
|
+
import { createHash } from 'node:crypto';
|
|
13
|
+
export function splitKey(id) {
|
|
14
|
+
return createHash('sha256').update(id, 'utf8').digest('hex');
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Partitions cases into dev/test halves. The ordering of the input never matters: both
|
|
18
|
+
* halves are returned in the input order, but membership is decided by the hash rank.
|
|
19
|
+
*/
|
|
20
|
+
export function splitCases(cases, devFraction = 0.5) {
|
|
21
|
+
if (cases.length === 0)
|
|
22
|
+
return { dev: [], test: [] };
|
|
23
|
+
const ranked = [...cases].sort((a, b) => {
|
|
24
|
+
const ka = splitKey(a.id);
|
|
25
|
+
const kb = splitKey(b.id);
|
|
26
|
+
return ka < kb ? -1 : ka > kb ? 1 : 0;
|
|
27
|
+
});
|
|
28
|
+
const devCount = Math.round(ranked.length * devFraction);
|
|
29
|
+
const devIds = new Set(ranked.slice(0, devCount).map((item) => item.id));
|
|
30
|
+
return {
|
|
31
|
+
dev: cases.filter((item) => devIds.has(item.id)),
|
|
32
|
+
test: cases.filter((item) => !devIds.has(item.id))
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export function selectSplit(cases, split) {
|
|
36
|
+
if (split === 'all')
|
|
37
|
+
return cases;
|
|
38
|
+
return splitCases(cases)[split];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Takes the first `perType` cases of every category, in dataset order. This is the
|
|
42
|
+
* documented slice rule: first 20 answerable questions per question_type x 6 types.
|
|
43
|
+
*/
|
|
44
|
+
export function slicePerType(cases, perType) {
|
|
45
|
+
const counts = new Map();
|
|
46
|
+
const selected = [];
|
|
47
|
+
for (const item of cases) {
|
|
48
|
+
const current = counts.get(item.category) ?? 0;
|
|
49
|
+
if (current >= perType)
|
|
50
|
+
continue;
|
|
51
|
+
counts.set(item.category, current + 1);
|
|
52
|
+
selected.push(item);
|
|
53
|
+
}
|
|
54
|
+
return selected;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=split.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"split.js","sourceRoot":"","sources":["../../../src/bench/split.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAQzC,MAAM,UAAU,QAAQ,CAAC,EAAU;IACjC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAsB,KAAU,EAAE,WAAW,GAAG,GAAG;IAI3E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IACrD,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACtC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1B,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACzE,OAAO;QACL,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChD,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;KACnD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAsB,KAAU,EAAE,KAA6B;IACxF,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IAClC,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAiC,KAAU,EAAE,OAAe;IACtF,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,MAAM,QAAQ,GAAQ,EAAE,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,OAAO,IAAI,OAAO;YAAE,SAAS;QACjC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;QACvC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Paired statistics for retrieval benchmarks.
|
|
3
|
+
*
|
|
4
|
+
* Every published delta in this repo is reported with a confidence interval, and every
|
|
5
|
+
* strict-recall comparison uses an exact McNemar test, because the two engines are run on
|
|
6
|
+
* the same cases and the correct comparison is the discordant pairs, not two independent
|
|
7
|
+
* proportions.
|
|
8
|
+
*/
|
|
9
|
+
/** Wilson score interval for a binomial proportion, in percentage points. */
|
|
10
|
+
export declare function wilson(successes: number, n: number, z?: number): [number, number];
|
|
11
|
+
/**
|
|
12
|
+
* Two-sided exact McNemar test on discordant pairs.
|
|
13
|
+
* `b` = baseline correct / candidate wrong, `c` = baseline wrong / candidate correct.
|
|
14
|
+
* Returns the exact binomial p-value; when b + c is 0 the result is p = 1.
|
|
15
|
+
*/
|
|
16
|
+
export declare function mcnemarExact(b: number, c: number): number;
|
|
17
|
+
/**
|
|
18
|
+
* Paired bootstrap over per-case differences.
|
|
19
|
+
* Resamples case indices with replacement, so the interval reflects case-level variance
|
|
20
|
+
* rather than the variance of two independent samples.
|
|
21
|
+
*/
|
|
22
|
+
export declare function pairedBootstrap(diffs: number[], options?: {
|
|
23
|
+
iterations?: number;
|
|
24
|
+
seed?: number;
|
|
25
|
+
}): {
|
|
26
|
+
mean: number;
|
|
27
|
+
low: number;
|
|
28
|
+
high: number;
|
|
29
|
+
iterations: number;
|
|
30
|
+
};
|
|
31
|
+
/** Convenience wrapper: paired comparison of two per-case 0/1 vectors keyed by case id. */
|
|
32
|
+
export declare function pairedCompare(baseline: Map<string, number>, candidate: Map<string, number>): {
|
|
33
|
+
n: number;
|
|
34
|
+
fixed: number;
|
|
35
|
+
broken: number;
|
|
36
|
+
unchanged: number;
|
|
37
|
+
mcnemarP: number;
|
|
38
|
+
bootstrap: ReturnType<typeof pairedBootstrap>;
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=stats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../src/bench/stats.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,6EAA6E;AAC7E,wBAAgB,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,SAAO,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAU/E;AAQD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAOzD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GACnD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAwBjE;AAED,2FAA2F;AAC3F,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAA;CAAE,CAoBlI"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Paired statistics for retrieval benchmarks.
|
|
3
|
+
*
|
|
4
|
+
* Every published delta in this repo is reported with a confidence interval, and every
|
|
5
|
+
* strict-recall comparison uses an exact McNemar test, because the two engines are run on
|
|
6
|
+
* the same cases and the correct comparison is the discordant pairs, not two independent
|
|
7
|
+
* proportions.
|
|
8
|
+
*/
|
|
9
|
+
/** Wilson score interval for a binomial proportion, in percentage points. */
|
|
10
|
+
export function wilson(successes, n, z = 1.96) {
|
|
11
|
+
if (n === 0)
|
|
12
|
+
return [0, 0];
|
|
13
|
+
const p = successes / n;
|
|
14
|
+
const denom = 1 + (z * z) / n;
|
|
15
|
+
const center = (p + (z * z) / (2 * n)) / denom;
|
|
16
|
+
const spread = (z * Math.sqrt((p * (1 - p)) / n + (z * z) / (4 * n * n))) / denom;
|
|
17
|
+
return [
|
|
18
|
+
Math.round(Math.max(0, center - spread) * 1000) / 10,
|
|
19
|
+
Math.round(Math.min(1, center + spread) * 1000) / 10
|
|
20
|
+
];
|
|
21
|
+
}
|
|
22
|
+
function logChoose(n, k) {
|
|
23
|
+
let sum = 0;
|
|
24
|
+
for (let i = 1; i <= k; i++)
|
|
25
|
+
sum += Math.log(n - k + i) - Math.log(i);
|
|
26
|
+
return sum;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Two-sided exact McNemar test on discordant pairs.
|
|
30
|
+
* `b` = baseline correct / candidate wrong, `c` = baseline wrong / candidate correct.
|
|
31
|
+
* Returns the exact binomial p-value; when b + c is 0 the result is p = 1.
|
|
32
|
+
*/
|
|
33
|
+
export function mcnemarExact(b, c) {
|
|
34
|
+
const n = b + c;
|
|
35
|
+
if (n === 0)
|
|
36
|
+
return 1;
|
|
37
|
+
const k = Math.min(b, c);
|
|
38
|
+
let tail = 0;
|
|
39
|
+
for (let i = 0; i <= k; i++)
|
|
40
|
+
tail += Math.exp(logChoose(n, i) - n * Math.LN2);
|
|
41
|
+
return Math.min(1, Math.round(tail * 2 * 1e6) / 1e6);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Paired bootstrap over per-case differences.
|
|
45
|
+
* Resamples case indices with replacement, so the interval reflects case-level variance
|
|
46
|
+
* rather than the variance of two independent samples.
|
|
47
|
+
*/
|
|
48
|
+
export function pairedBootstrap(diffs, options = {}) {
|
|
49
|
+
const iterations = options.iterations ?? 10_000;
|
|
50
|
+
if (diffs.length === 0)
|
|
51
|
+
return { mean: 0, low: 0, high: 0, iterations };
|
|
52
|
+
const mean = diffs.reduce((sum, value) => sum + value, 0) / diffs.length;
|
|
53
|
+
// Deterministic LCG so a published interval is reproducible without a seed file.
|
|
54
|
+
let state = options.seed ?? 0x9e3779b9;
|
|
55
|
+
const next = () => {
|
|
56
|
+
state = (state * 1664525 + 1013904223) >>> 0;
|
|
57
|
+
return state / 0x100000000;
|
|
58
|
+
};
|
|
59
|
+
const means = [];
|
|
60
|
+
for (let i = 0; i < iterations; i++) {
|
|
61
|
+
let sum = 0;
|
|
62
|
+
for (let j = 0; j < diffs.length; j++)
|
|
63
|
+
sum += diffs[Math.floor(next() * diffs.length)];
|
|
64
|
+
means.push(sum / diffs.length);
|
|
65
|
+
}
|
|
66
|
+
means.sort((a, b) => a - b);
|
|
67
|
+
const at = (q) => means[Math.min(means.length - 1, Math.max(0, Math.floor(q * means.length)))];
|
|
68
|
+
return {
|
|
69
|
+
mean: Math.round(mean * 1000) / 1000,
|
|
70
|
+
low: Math.round(at(0.025) * 1000) / 1000,
|
|
71
|
+
high: Math.round(at(0.975) * 1000) / 1000,
|
|
72
|
+
iterations
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/** Convenience wrapper: paired comparison of two per-case 0/1 vectors keyed by case id. */
|
|
76
|
+
export function pairedCompare(baseline, candidate) {
|
|
77
|
+
const ids = [...baseline.keys()].filter((id) => candidate.has(id));
|
|
78
|
+
let fixed = 0;
|
|
79
|
+
let broken = 0;
|
|
80
|
+
const diffs = [];
|
|
81
|
+
for (const id of ids) {
|
|
82
|
+
const a = baseline.get(id);
|
|
83
|
+
const b = candidate.get(id);
|
|
84
|
+
if (a === 0 && b === 1)
|
|
85
|
+
fixed++;
|
|
86
|
+
else if (a === 1 && b === 0)
|
|
87
|
+
broken++;
|
|
88
|
+
diffs.push(b - a);
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
n: ids.length,
|
|
92
|
+
fixed,
|
|
93
|
+
broken,
|
|
94
|
+
unchanged: ids.length - fixed - broken,
|
|
95
|
+
mcnemarP: mcnemarExact(broken, fixed),
|
|
96
|
+
bootstrap: pairedBootstrap(diffs)
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../src/bench/stats.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Engine descriptors for the cross-engine comparison.
|
|
3
|
+
*
|
|
4
|
+
* Each descriptor pins a package version, states how to start it over MCP stdio, how to
|
|
5
|
+
* isolate its on-disk state, and how to map one marker document and one query onto its
|
|
6
|
+
* tools. Nothing engine-specific lives outside this file.
|
|
7
|
+
*
|
|
8
|
+
* Isolation was verified by probing, not assumed:
|
|
9
|
+
* - fastrmemory honours `FASTR_HOME` for the global database and `--project` for the
|
|
10
|
+
* project database.
|
|
11
|
+
* - agentmemory ignores `AGENTMEMORY_DATA_DIR` and resolves `homedir()/.agentmemory`,
|
|
12
|
+
* so `USERPROFILE` and `HOME` both point at a fresh directory per case.
|
|
13
|
+
* - hippo's MCP server ignores `HIPPO_HOME` and writes to `~/.hippo` unless the working
|
|
14
|
+
* directory contains a `.hippo` store, so each case runs `hippo init` in its own
|
|
15
|
+
* project directory first and also gets a fresh home.
|
|
16
|
+
*/
|
|
17
|
+
import type { MarkerDoc } from './marker-corpus.js';
|
|
18
|
+
import type { McpServerSpec } from './mcp-stdio.js';
|
|
19
|
+
export interface CaseDirs {
|
|
20
|
+
/** Root of the throwaway directory tree for this engine run. */
|
|
21
|
+
root: string;
|
|
22
|
+
/** Project directory handed to the engine. */
|
|
23
|
+
project: string;
|
|
24
|
+
/** Fresh home directory, so nothing escapes into the real user profile. */
|
|
25
|
+
home: string;
|
|
26
|
+
}
|
|
27
|
+
export interface VsEngine {
|
|
28
|
+
id: string;
|
|
29
|
+
label: string;
|
|
30
|
+
/** Pinned version, reported in the artifact. */
|
|
31
|
+
version: string;
|
|
32
|
+
/** Absolute path of the JavaScript entry point that is launched with `node`. */
|
|
33
|
+
entry: string;
|
|
34
|
+
bootstrap: (dirs: CaseDirs) => Promise<void>;
|
|
35
|
+
spec: (dirs: CaseDirs) => McpServerSpec;
|
|
36
|
+
rememberTool: string;
|
|
37
|
+
rememberArgs: (doc: MarkerDoc) => Record<string, unknown>;
|
|
38
|
+
recallTool: string;
|
|
39
|
+
recallArgs: (query: string, budgetTokens: number) => Record<string, unknown>;
|
|
40
|
+
/** True when the engine needs a project directory that already exists. */
|
|
41
|
+
needsProjectDir: boolean;
|
|
42
|
+
}
|
|
43
|
+
export interface EngineEnvironment {
|
|
44
|
+
repoRoot: string;
|
|
45
|
+
/** Directory holding the pinned third-party installs. */
|
|
46
|
+
externalDir: string;
|
|
47
|
+
}
|
|
48
|
+
export declare function createVsEngines(environment: EngineEnvironment): VsEngine[];
|
|
49
|
+
/** Fails early with an actionable message instead of timing out inside the MCP handshake. */
|
|
50
|
+
export declare function assertEngineAvailable(engine: VsEngine, externalDir: string): void;
|
|
51
|
+
//# sourceMappingURL=vs-engines.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vs-engines.d.ts","sourceRoot":"","sources":["../../../src/bench/vs-engines.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,MAAM,WAAW,QAAQ;IACvB,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,aAAa,CAAC;IACxC,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7E,0EAA0E;IAC1E,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,WAAW,EAAE,MAAM,CAAC;CACrB;AAOD,wBAAgB,eAAe,CAAC,WAAW,EAAE,iBAAiB,GAAG,QAAQ,EAAE,CAyF1E;AAED,6FAA6F;AAC7F,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAQjF"}
|