retrieval-eval 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +342 -0
- package/dist/cli.js +1344 -0
- package/dist/index.d.ts +376 -0
- package/dist/index.js +971 -0
- package/package.json +74 -0
- package/spec/README.md +31 -0
- package/spec/chunk-id.md +51 -0
- package/spec/drift.md +49 -0
- package/spec/fixtures/README.md +48 -0
- package/spec/fixtures/basic/expected.json +43 -0
- package/spec/fixtures/basic/judgments.jsonl +4 -0
- package/spec/fixtures/basic/run.jsonl +2 -0
- package/spec/fixtures/chunk-id/expected.json +32 -0
- package/spec/fixtures/drift/corpus.json +38 -0
- package/spec/fixtures/drift/expected.json +22 -0
- package/spec/fixtures/drift/judgments.jsonl +4 -0
- package/spec/fixtures/duplicate-ranking/expected.json +56 -0
- package/spec/fixtures/duplicate-ranking/judgments.jsonl +3 -0
- package/spec/fixtures/duplicate-ranking/run-duplicate-query.jsonl +2 -0
- package/spec/fixtures/duplicate-ranking/run-non-string-key.jsonl +1 -0
- package/spec/fixtures/duplicate-ranking/run.jsonl +2 -0
- package/spec/fixtures/merge/corpus.json +22 -0
- package/spec/fixtures/merge/expected.json +21 -0
- package/spec/fixtures/merge/judgments.jsonl +3 -0
- package/spec/fixtures/no-positives/expected.json +17 -0
- package/spec/fixtures/no-positives/judgments.jsonl +4 -0
- package/spec/fixtures/no-positives/run.jsonl +2 -0
- package/spec/fixtures/nothing-scored/expected.json +9 -0
- package/spec/fixtures/nothing-scored/judgments.jsonl +1 -0
- package/spec/fixtures/nothing-scored/run.jsonl +1 -0
- package/spec/fixtures/qrels/beir.tsv +4 -0
- package/spec/fixtures/qrels/expected.json +14 -0
- package/spec/fixtures/qrels/trec.qrels +4 -0
- package/spec/fixtures/strata/expected.json +40 -0
- package/spec/fixtures/strata/judgments.jsonl +5 -0
- package/spec/fixtures/strata/run.jsonl +5 -0
- package/spec/fixtures/stratum-order/expected.json +30 -0
- package/spec/fixtures/stratum-order/judgments.jsonl +5 -0
- package/spec/fixtures/stratum-order/run.jsonl +5 -0
- package/spec/fixtures/summarize/expected.json +53 -0
- package/spec/fixtures/unsorted-queries/expected.json +23 -0
- package/spec/fixtures/unsorted-queries/judgments.jsonl +3 -0
- package/spec/fixtures/unsound-judgments/expected.json +19 -0
- package/spec/fixtures/unsound-judgments/judgments.jsonl +3 -0
- package/spec/fixtures/unsound-judgments/run.jsonl +1 -0
- package/spec/judgments.schema.json +54 -0
- package/spec/report.schema.json +227 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalize chunk text. Exactly three steps, in this order. Any deviation breaks
|
|
3
|
+
* cross-language agreement with the Python implementation. See `spec/chunk-id.md`.
|
|
4
|
+
*/
|
|
5
|
+
declare function normalize(text: string): string;
|
|
6
|
+
/** Hash of the normalized text, so a judgment can describe itself without storing the text. */
|
|
7
|
+
declare function textSha(text: string): string;
|
|
8
|
+
interface ChunkIdInput {
|
|
9
|
+
docUri: string;
|
|
10
|
+
docRevision: string;
|
|
11
|
+
ordinal: number;
|
|
12
|
+
text: string;
|
|
13
|
+
chunkerFingerprint: string;
|
|
14
|
+
}
|
|
15
|
+
/** Content-addressed chunk id: a label points at text, not at a position in a list. */
|
|
16
|
+
declare function chunkId(input: ChunkIdInput): string;
|
|
17
|
+
|
|
18
|
+
/** One relevance judgment. A judgments file is JSONL: one of these per line. */
|
|
19
|
+
interface Judgment {
|
|
20
|
+
query_id: string;
|
|
21
|
+
query?: string;
|
|
22
|
+
doc_uri: string;
|
|
23
|
+
chunk_id?: string;
|
|
24
|
+
text_sha?: string;
|
|
25
|
+
chunk_text?: string;
|
|
26
|
+
relevance: number;
|
|
27
|
+
corpus_fingerprint?: string;
|
|
28
|
+
labeled_by?: string;
|
|
29
|
+
labeled_at?: string;
|
|
30
|
+
stratum?: string;
|
|
31
|
+
notes?: string;
|
|
32
|
+
/** Unknown fields are preserved, never rejected. */
|
|
33
|
+
[key: string]: unknown;
|
|
34
|
+
}
|
|
35
|
+
/** One query's ranked result: chunk_ids, or doc_uris for document-level evaluation. */
|
|
36
|
+
interface RunEntry {
|
|
37
|
+
query_id: string;
|
|
38
|
+
ranking: string[];
|
|
39
|
+
}
|
|
40
|
+
interface CorpusChunk {
|
|
41
|
+
chunk_id: string;
|
|
42
|
+
doc_uri: string;
|
|
43
|
+
doc_revision?: string;
|
|
44
|
+
ordinal?: number;
|
|
45
|
+
text?: string;
|
|
46
|
+
text_sha?: string;
|
|
47
|
+
}
|
|
48
|
+
interface Corpus {
|
|
49
|
+
corpus_fingerprint?: string;
|
|
50
|
+
chunker_fingerprint?: string;
|
|
51
|
+
chunks: CorpusChunk[];
|
|
52
|
+
}
|
|
53
|
+
interface Measurement {
|
|
54
|
+
value: number;
|
|
55
|
+
/** Samples. Greater than 1 for non-deterministic (LLM-judged) metrics. */
|
|
56
|
+
n?: number;
|
|
57
|
+
stdev?: number;
|
|
58
|
+
/** Required for any LLM-judged metric: a one-sample point estimate is a measurement lie. */
|
|
59
|
+
ci?: [number, number];
|
|
60
|
+
deterministic?: boolean;
|
|
61
|
+
}
|
|
62
|
+
type Status = "PASS" | "FAIL" | "INDETERMINATE";
|
|
63
|
+
interface GateResult {
|
|
64
|
+
expression: string;
|
|
65
|
+
status: Status;
|
|
66
|
+
observed?: number;
|
|
67
|
+
baseline?: number | null;
|
|
68
|
+
}
|
|
69
|
+
interface Report {
|
|
70
|
+
spec_version: "1";
|
|
71
|
+
tool: {
|
|
72
|
+
name: string;
|
|
73
|
+
version: string;
|
|
74
|
+
};
|
|
75
|
+
generated_at: string;
|
|
76
|
+
corpus: {
|
|
77
|
+
fingerprint: string | null;
|
|
78
|
+
documents?: number;
|
|
79
|
+
chunks?: number;
|
|
80
|
+
};
|
|
81
|
+
judgments: {
|
|
82
|
+
queries: number;
|
|
83
|
+
/** Queries the averages were computed from: those with at least one label at the threshold. */
|
|
84
|
+
queries_scored: number;
|
|
85
|
+
labels: number;
|
|
86
|
+
fingerprint: string | null;
|
|
87
|
+
human_labels?: number;
|
|
88
|
+
synthetic_labels?: number;
|
|
89
|
+
drift?: DriftSummary;
|
|
90
|
+
};
|
|
91
|
+
metrics: Record<string, Measurement>;
|
|
92
|
+
/** Mandatory when judgments carry strata: averages hide broken query classes. */
|
|
93
|
+
per_stratum?: Record<string, {
|
|
94
|
+
n: number;
|
|
95
|
+
metrics: Record<string, Measurement>;
|
|
96
|
+
}>;
|
|
97
|
+
verdict: {
|
|
98
|
+
status: Status;
|
|
99
|
+
reasons: string[];
|
|
100
|
+
gates?: GateResult[];
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
type DriftStatus = "VALID" | "RE_ANCHORABLE" | "MERGED" | "SPLIT" | "ORPHANED";
|
|
104
|
+
interface DriftFinding {
|
|
105
|
+
query_id: string;
|
|
106
|
+
doc_uri: string;
|
|
107
|
+
chunk_id?: string;
|
|
108
|
+
status: DriftStatus;
|
|
109
|
+
/** The live chunk_id this label should move to, when RE_ANCHORABLE or MERGED. */
|
|
110
|
+
reanchor_to?: string;
|
|
111
|
+
/** The live chunk_ids the labeled text now spans, when SPLIT. */
|
|
112
|
+
split_into?: string[];
|
|
113
|
+
}
|
|
114
|
+
interface DriftSummary {
|
|
115
|
+
valid: number;
|
|
116
|
+
re_anchorable: number;
|
|
117
|
+
merged: number;
|
|
118
|
+
split: number;
|
|
119
|
+
orphaned: number;
|
|
120
|
+
/** Share of labels that are not straightforwardly VALID. */
|
|
121
|
+
invalid_ratio: number;
|
|
122
|
+
}
|
|
123
|
+
interface DriftResult {
|
|
124
|
+
findings: DriftFinding[];
|
|
125
|
+
summary: DriftSummary;
|
|
126
|
+
judgments_fingerprint: string | null;
|
|
127
|
+
corpus_fingerprint: string | null;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
interface MetricOptions {
|
|
131
|
+
/** Cutoff for @k metrics. */
|
|
132
|
+
k?: number;
|
|
133
|
+
/** Minimum graded relevance that counts as relevant. */
|
|
134
|
+
threshold?: number;
|
|
135
|
+
}
|
|
136
|
+
interface QueryMetrics {
|
|
137
|
+
precision: number;
|
|
138
|
+
recall: number;
|
|
139
|
+
ndcg: number;
|
|
140
|
+
mrr: number;
|
|
141
|
+
ap: number;
|
|
142
|
+
hit_rate: number;
|
|
143
|
+
}
|
|
144
|
+
/** Key used to match a judgment against a ranking entry: chunk_id when present, else doc_uri. */
|
|
145
|
+
declare function judgmentKey(j: Judgment): string;
|
|
146
|
+
/**
|
|
147
|
+
* Drop repeated keys from a ranking, keeping the first occurrence.
|
|
148
|
+
*
|
|
149
|
+
* A retriever that returns the same chunk twice is routine: a hybrid search merges two indexes,
|
|
150
|
+
* or a multi-query expansion unions its results, and nothing deduplicates. Counted naively the
|
|
151
|
+
* repeat scores as a second hit, which pushes `recall@k`, `map@k` and `ndcg@k` above 1.0 and
|
|
152
|
+
* can carry a failing run past a gate. A repeat is not new evidence, so only the first
|
|
153
|
+
* occurrence counts. `score` names the queries it happened to rather than correcting quietly.
|
|
154
|
+
*/
|
|
155
|
+
declare function dedupe(ranking: readonly string[]): string[];
|
|
156
|
+
/**
|
|
157
|
+
* Metrics for a single query.
|
|
158
|
+
*
|
|
159
|
+
* `relevance` maps a ranking key to its graded relevance. Keys absent from the map are treated
|
|
160
|
+
* as relevance 0, so unjudged means not-relevant, the standard closed-world assumption. That is
|
|
161
|
+
* a real limitation of shallow judgment pools, and `validate` warns when pools look too thin.
|
|
162
|
+
*/
|
|
163
|
+
declare function queryMetrics(relevance: Map<string, number>, ranking: string[], options?: MetricOptions): QueryMetrics;
|
|
164
|
+
/** Group judgments by query, as `query_id -> (ranking key -> relevance)`. */
|
|
165
|
+
declare function relevanceByQuery(judgments: Judgment[]): Map<string, Map<string, number>>;
|
|
166
|
+
/**
|
|
167
|
+
* Turn repeated samples of a non-deterministic metric into a measurement with error bars.
|
|
168
|
+
*
|
|
169
|
+
* LLM judges vary even at temperature 0: the same triple scored three times can come back 0.8,
|
|
170
|
+
* 1.0 and 0.6. A point estimate from one sample reports that spread as certainty, which is the
|
|
171
|
+
* most common measurement lie in RAG evaluation and the reason the report format carries `n`,
|
|
172
|
+
* `stdev` and `ci` at all.
|
|
173
|
+
*
|
|
174
|
+
* One sample yields no interval rather than a zero-width one, so a `ci-lower` gate over it is
|
|
175
|
+
* INDETERMINATE instead of quietly passing. The interval is a Student-t interval on the sample
|
|
176
|
+
* mean and is not clamped: a bound outside the metric's range is what the samples support.
|
|
177
|
+
*/
|
|
178
|
+
declare function summarize(samples: number[]): Measurement;
|
|
179
|
+
interface ScoreResult {
|
|
180
|
+
metrics: Record<string, Measurement>;
|
|
181
|
+
perQuery: Map<string, QueryMetrics>;
|
|
182
|
+
/** Queries present in the judgments but missing from the run. */
|
|
183
|
+
missingQueries: string[];
|
|
184
|
+
/**
|
|
185
|
+
* Queries with no label at or above the threshold, excluded from the averages.
|
|
186
|
+
*
|
|
187
|
+
* Recall, nDCG, MRR and AP are all undefined when a query has nothing relevant to find.
|
|
188
|
+
* Scoring such a query as zero would quietly drag every average down and make a judgment set
|
|
189
|
+
* look like a retrieval failure, so they are excluded and counted instead.
|
|
190
|
+
*/
|
|
191
|
+
queriesWithoutPositives: string[];
|
|
192
|
+
/**
|
|
193
|
+
* Queries whose ranking repeated a key. The metrics above already count each key once; this
|
|
194
|
+
* says so, because a correction nobody is told about is its own kind of wrong number.
|
|
195
|
+
*/
|
|
196
|
+
queriesWithDuplicates: string[];
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Macro-average metrics over queries.
|
|
200
|
+
*
|
|
201
|
+
* Queries with judgments but no run entry score zero rather than being dropped, because
|
|
202
|
+
* silently skipping them inflates every metric. Queries with no relevant label are excluded
|
|
203
|
+
* rather than scored zero, because there is nothing for retrieval to have found.
|
|
204
|
+
*
|
|
205
|
+
* Every metric is computed over the top `k` results and is named for it. `mrr@k` and `map@k`
|
|
206
|
+
* are reciprocal rank and average precision within that cutoff, not over an unbounded run:
|
|
207
|
+
* the name says so because a number that means something other than its name is how a report
|
|
208
|
+
* stops being trustworthy.
|
|
209
|
+
*/
|
|
210
|
+
declare function score(judgments: Judgment[], run: RunEntry[], options?: MetricOptions): ScoreResult;
|
|
211
|
+
interface StratumScore {
|
|
212
|
+
n: number;
|
|
213
|
+
metrics: Record<string, Measurement>;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Per-stratum scores. A system can improve on the mean while failing an entire query class,
|
|
217
|
+
* so coverage across strata is reported rather than one average.
|
|
218
|
+
*/
|
|
219
|
+
declare function scoreByStratum(judgments: Judgment[], run: RunEntry[], options?: MetricOptions): Record<string, StratumScore>;
|
|
220
|
+
/**
|
|
221
|
+
* The lowest-scoring stratum for a metric. This is what gates should watch.
|
|
222
|
+
*
|
|
223
|
+
* Strata with no scored query are skipped rather than treated as zero. A class whose labels are
|
|
224
|
+
* all below the relevance threshold has nothing for retrieval to have found, and reporting it as
|
|
225
|
+
* the worst class would fail a build over an empty set.
|
|
226
|
+
*/
|
|
227
|
+
declare function worstStratum(perStratum: Record<string, StratumScore>, metric: string): {
|
|
228
|
+
name: string;
|
|
229
|
+
value: number;
|
|
230
|
+
n: number;
|
|
231
|
+
} | null;
|
|
232
|
+
|
|
233
|
+
declare function parseJudgments(content: string, label?: string): Judgment[];
|
|
234
|
+
/**
|
|
235
|
+
* Parse a run JSONL file.
|
|
236
|
+
*
|
|
237
|
+
* The run is the one input that used to be taken on trust, and an unchecked run is how a
|
|
238
|
+
* metric goes out of range: a ranking holding a non-string, or two entries claiming the same
|
|
239
|
+
* query, produce numbers that mean nothing and say nothing about it.
|
|
240
|
+
*
|
|
241
|
+
* Two entries for one query are rejected rather than resolved, because the file no longer says
|
|
242
|
+
* what the ranking for that query is, and picking one silently is a guess. A key repeated
|
|
243
|
+
* *within* one ranking is a different thing: the ranking is still unambiguous, so it is
|
|
244
|
+
* accepted here and counted once by `score`, which reports that it did.
|
|
245
|
+
*/
|
|
246
|
+
declare function parseRun(content: string, label?: string): RunEntry[];
|
|
247
|
+
declare function serializeJudgments(judgments: Judgment[]): string;
|
|
248
|
+
declare function parseCorpus(content: string, label?: string): Corpus;
|
|
249
|
+
type Severity = "error" | "warning";
|
|
250
|
+
interface ValidationIssue {
|
|
251
|
+
severity: Severity;
|
|
252
|
+
code: string;
|
|
253
|
+
message: string;
|
|
254
|
+
}
|
|
255
|
+
interface ValidationResult {
|
|
256
|
+
issues: ValidationIssue[];
|
|
257
|
+
queries: number;
|
|
258
|
+
labels: number;
|
|
259
|
+
humanLabels: number;
|
|
260
|
+
syntheticLabels: number;
|
|
261
|
+
fingerprint: string | null;
|
|
262
|
+
strata: Record<string, number>;
|
|
263
|
+
ok: boolean;
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Structural and statistical sanity checks. The warnings matter as much as the errors: a
|
|
267
|
+
* judgment set with no positives, no human labels, or a two-query stratum will produce
|
|
268
|
+
* confident-looking numbers that mean nothing.
|
|
269
|
+
*/
|
|
270
|
+
declare function validate(judgments: Judgment[]): ValidationResult;
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* TREC qrels: `query_id iteration doc_id relevance`, whitespace separated. Thirty years of
|
|
274
|
+
* tooling reads this (trec_eval, ir_measures, BEIR, ir_datasets), which is why judgments are
|
|
275
|
+
* a strict superset of it rather than a new idea.
|
|
276
|
+
*/
|
|
277
|
+
declare function toQrels(judgments: Judgment[]): string;
|
|
278
|
+
interface FromQrelsOptions {
|
|
279
|
+
/** Treat the qrels doc_id as a chunk_id rather than a doc_uri. */
|
|
280
|
+
asChunkIds?: boolean;
|
|
281
|
+
corpusFingerprint?: string;
|
|
282
|
+
labeledBy?: string;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Read qrels in either shape that exists in the wild:
|
|
286
|
+
*
|
|
287
|
+
* `query_id iteration doc_id relevance` the TREC form, 4 columns
|
|
288
|
+
* `query-id corpus-id score` the BEIR form, 3 columns with a header row
|
|
289
|
+
*
|
|
290
|
+
* Accepting only the first means not being able to read BEIR or `ir_datasets` exports, which
|
|
291
|
+
* is most of the reason to speak qrels at all.
|
|
292
|
+
*/
|
|
293
|
+
declare function fromQrels(content: string, options?: FromQrelsOptions): Judgment[];
|
|
294
|
+
/** TREC run format: `query_id iteration doc_id rank score run_name`. */
|
|
295
|
+
declare function toTrecRun(run: RunEntry[], runName?: string): string;
|
|
296
|
+
declare function fromTrecRun(content: string): RunEntry[];
|
|
297
|
+
|
|
298
|
+
interface DriftOptions {
|
|
299
|
+
/** Corpus fingerprint to record when judgments carry none. */
|
|
300
|
+
corpusFingerprint?: string;
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Classify every judgment against a live corpus.
|
|
304
|
+
*
|
|
305
|
+
* This is the question no other evaluation tool can answer: after you changed your chunker,
|
|
306
|
+
* which of your labels still mean what they meant when a human wrote them?
|
|
307
|
+
*
|
|
308
|
+
* - `VALID` the labeled chunk_id is still present
|
|
309
|
+
* - `RE_ANCHORABLE` the id is stale, but the exact text is still a live chunk
|
|
310
|
+
* - `MERGED` the text was absorbed into a coarser chunk; re-anchors safely
|
|
311
|
+
* - `SPLIT` the labeled text now spans two or more live chunks, so it needs re-judging
|
|
312
|
+
* - `ORPHANED` the text or its document is gone
|
|
313
|
+
*/
|
|
314
|
+
declare function drift(judgments: Judgment[], corpus: Corpus, options?: DriftOptions): DriftResult;
|
|
315
|
+
interface FixResult {
|
|
316
|
+
judgments: Judgment[];
|
|
317
|
+
reanchored: number;
|
|
318
|
+
/** Labels left untouched because they need a human: SPLIT and ORPHANED. */
|
|
319
|
+
needsReview: DriftFinding[];
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Re-anchor the recoverable labels onto their new chunk_ids and stamp the new fingerprint.
|
|
323
|
+
*
|
|
324
|
+
* RE_ANCHORABLE and MERGED are recoverable: in both cases the text a human judged is still
|
|
325
|
+
* there. SPLIT and ORPHANED are deliberately left alone, because guessing at them would
|
|
326
|
+
* silently fabricate ground truth, the exact failure this tool exists to expose.
|
|
327
|
+
*/
|
|
328
|
+
declare function fix(judgments: Judgment[], result: DriftResult): FixResult;
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* A gate expression. Four forms, because absolute thresholds get tuned until they pass:
|
|
332
|
+
*
|
|
333
|
+
* recall@5:0.8 absolute floor
|
|
334
|
+
* recall@5:-0.02 delta against a baseline (regression tolerance)
|
|
335
|
+
* worst-stratum:recall@5:0.7 floor on the weakest query class
|
|
336
|
+
* faithfulness:ci-lower:0.8 floor on the lower confidence bound, so judge noise cannot pass
|
|
337
|
+
*/
|
|
338
|
+
interface Gate {
|
|
339
|
+
raw: string;
|
|
340
|
+
kind: "absolute" | "delta" | "worst-stratum" | "ci-lower";
|
|
341
|
+
metric: string;
|
|
342
|
+
threshold: number;
|
|
343
|
+
}
|
|
344
|
+
declare function parseGate(expression: string): Gate;
|
|
345
|
+
/**
|
|
346
|
+
* The more serious of two verdicts: FAIL beats INDETERMINATE beats PASS.
|
|
347
|
+
*
|
|
348
|
+
* A gate only knows about the numbers it was pointed at. It cannot clear a finding it never
|
|
349
|
+
* looked at, such as a judgment set `validate` rejects, so a passing gate never upgrades a
|
|
350
|
+
* verdict that was already worse.
|
|
351
|
+
*/
|
|
352
|
+
declare function worseStatus(a: Status, b: Status): Status;
|
|
353
|
+
interface EvaluateGatesOptions {
|
|
354
|
+
report: Report;
|
|
355
|
+
baseline?: Report | undefined;
|
|
356
|
+
gates: Gate[];
|
|
357
|
+
}
|
|
358
|
+
declare function evaluateGates({ report, baseline, gates }: EvaluateGatesOptions): {
|
|
359
|
+
status: Status;
|
|
360
|
+
results: GateResult[];
|
|
361
|
+
reasons: string[];
|
|
362
|
+
};
|
|
363
|
+
|
|
364
|
+
declare const TOOL_NAME = "retrieval-eval";
|
|
365
|
+
declare const TOOL_VERSION = "0.1.0";
|
|
366
|
+
declare const SPEC_VERSION: "1";
|
|
367
|
+
interface BuildReportOptions extends MetricOptions {
|
|
368
|
+
judgments: Judgment[];
|
|
369
|
+
run: RunEntry[];
|
|
370
|
+
corpus?: Corpus | undefined;
|
|
371
|
+
driftResult?: DriftResult | undefined;
|
|
372
|
+
now?: Date;
|
|
373
|
+
}
|
|
374
|
+
declare function buildReport(options: BuildReportOptions): Report;
|
|
375
|
+
|
|
376
|
+
export { type BuildReportOptions, type ChunkIdInput, type Corpus, type CorpusChunk, type DriftFinding, type DriftOptions, type DriftResult, type DriftStatus, type DriftSummary, type EvaluateGatesOptions, type FixResult, type FromQrelsOptions, type Gate, type GateResult, type Judgment, type Measurement, type MetricOptions, type QueryMetrics, type Report, type RunEntry, SPEC_VERSION, type ScoreResult, type Severity, type Status, type StratumScore, TOOL_NAME, TOOL_VERSION, type ValidationIssue, type ValidationResult, buildReport, chunkId, dedupe, drift, evaluateGates, fix, fromQrels, fromTrecRun, judgmentKey, normalize, parseCorpus, parseGate, parseJudgments, parseRun, queryMetrics, relevanceByQuery, score, scoreByStratum, serializeJudgments, summarize, textSha, toQrels, toTrecRun, validate, worseStatus, worstStratum };
|