rag-eval-node-ts 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.
Files changed (94) hide show
  1. package/README.md +204 -0
  2. package/dist/__tests__/evaluate.test.d.ts +2 -0
  3. package/dist/__tests__/evaluate.test.d.ts.map +1 -0
  4. package/dist/__tests__/evaluate.test.js +130 -0
  5. package/dist/__tests__/evaluate.test.js.map +1 -0
  6. package/dist/__tests__/evaluator.test.d.ts +2 -0
  7. package/dist/__tests__/evaluator.test.d.ts.map +1 -0
  8. package/dist/__tests__/evaluator.test.js +92 -0
  9. package/dist/__tests__/evaluator.test.js.map +1 -0
  10. package/dist/__tests__/heuristic/ngrams.test.d.ts +2 -0
  11. package/dist/__tests__/heuristic/ngrams.test.d.ts.map +1 -0
  12. package/dist/__tests__/heuristic/ngrams.test.js +89 -0
  13. package/dist/__tests__/heuristic/ngrams.test.js.map +1 -0
  14. package/dist/__tests__/heuristic/tfidf.test.d.ts +2 -0
  15. package/dist/__tests__/heuristic/tfidf.test.d.ts.map +1 -0
  16. package/dist/__tests__/heuristic/tfidf.test.js +57 -0
  17. package/dist/__tests__/heuristic/tfidf.test.js.map +1 -0
  18. package/dist/__tests__/heuristic/token-f1.test.d.ts +2 -0
  19. package/dist/__tests__/heuristic/token-f1.test.d.ts.map +1 -0
  20. package/dist/__tests__/heuristic/token-f1.test.js +40 -0
  21. package/dist/__tests__/heuristic/token-f1.test.js.map +1 -0
  22. package/dist/__tests__/metrics/faithfulness.test.d.ts +2 -0
  23. package/dist/__tests__/metrics/faithfulness.test.d.ts.map +1 -0
  24. package/dist/__tests__/metrics/faithfulness.test.js +66 -0
  25. package/dist/__tests__/metrics/faithfulness.test.js.map +1 -0
  26. package/dist/__tests__/types.test.d.ts +2 -0
  27. package/dist/__tests__/types.test.d.ts.map +1 -0
  28. package/dist/__tests__/types.test.js +531 -0
  29. package/dist/__tests__/types.test.js.map +1 -0
  30. package/dist/evaluate.d.ts +14 -0
  31. package/dist/evaluate.d.ts.map +1 -0
  32. package/dist/evaluate.js +208 -0
  33. package/dist/evaluate.js.map +1 -0
  34. package/dist/evaluator.d.ts +10 -0
  35. package/dist/evaluator.d.ts.map +1 -0
  36. package/dist/evaluator.js +39 -0
  37. package/dist/evaluator.js.map +1 -0
  38. package/dist/heuristic/ngrams.d.ts +22 -0
  39. package/dist/heuristic/ngrams.d.ts.map +1 -0
  40. package/dist/heuristic/ngrams.js +70 -0
  41. package/dist/heuristic/ngrams.js.map +1 -0
  42. package/dist/heuristic/sentences.d.ts +13 -0
  43. package/dist/heuristic/sentences.d.ts.map +1 -0
  44. package/dist/heuristic/sentences.js +23 -0
  45. package/dist/heuristic/sentences.js.map +1 -0
  46. package/dist/heuristic/tfidf.d.ts +21 -0
  47. package/dist/heuristic/tfidf.d.ts.map +1 -0
  48. package/dist/heuristic/tfidf.js +87 -0
  49. package/dist/heuristic/tfidf.js.map +1 -0
  50. package/dist/heuristic/token-f1.d.ts +12 -0
  51. package/dist/heuristic/token-f1.d.ts.map +1 -0
  52. package/dist/heuristic/token-f1.js +41 -0
  53. package/dist/heuristic/token-f1.js.map +1 -0
  54. package/dist/index.d.ts +9 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +37 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/metrics/answer-correctness.d.ts +7 -0
  59. package/dist/metrics/answer-correctness.d.ts.map +1 -0
  60. package/dist/metrics/answer-correctness.js +51 -0
  61. package/dist/metrics/answer-correctness.js.map +1 -0
  62. package/dist/metrics/answer-relevance.d.ts +6 -0
  63. package/dist/metrics/answer-relevance.d.ts.map +1 -0
  64. package/dist/metrics/answer-relevance.js +37 -0
  65. package/dist/metrics/answer-relevance.js.map +1 -0
  66. package/dist/metrics/context-precision.d.ts +6 -0
  67. package/dist/metrics/context-precision.d.ts.map +1 -0
  68. package/dist/metrics/context-precision.js +57 -0
  69. package/dist/metrics/context-precision.js.map +1 -0
  70. package/dist/metrics/context-recall.d.ts +7 -0
  71. package/dist/metrics/context-recall.d.ts.map +1 -0
  72. package/dist/metrics/context-recall.js +66 -0
  73. package/dist/metrics/context-recall.js.map +1 -0
  74. package/dist/metrics/context-relevance.d.ts +6 -0
  75. package/dist/metrics/context-relevance.d.ts.map +1 -0
  76. package/dist/metrics/context-relevance.js +48 -0
  77. package/dist/metrics/context-relevance.js.map +1 -0
  78. package/dist/metrics/faithfulness.d.ts +6 -0
  79. package/dist/metrics/faithfulness.d.ts.map +1 -0
  80. package/dist/metrics/faithfulness.js +64 -0
  81. package/dist/metrics/faithfulness.js.map +1 -0
  82. package/dist/metrics/hallucination-rate.d.ts +7 -0
  83. package/dist/metrics/hallucination-rate.d.ts.map +1 -0
  84. package/dist/metrics/hallucination-rate.js +65 -0
  85. package/dist/metrics/hallucination-rate.js.map +1 -0
  86. package/dist/metrics/index.d.ts +14 -0
  87. package/dist/metrics/index.d.ts.map +1 -0
  88. package/dist/metrics/index.js +40 -0
  89. package/dist/metrics/index.js.map +1 -0
  90. package/dist/types.d.ts +169 -0
  91. package/dist/types.d.ts.map +1 -0
  92. package/dist/types.js +4 -0
  93. package/dist/types.js.map +1 -0
  94. package/package.json +53 -0
@@ -0,0 +1,169 @@
1
+ /** The atomic unit of RAG evaluation. All metrics operate on this structure. */
2
+ export interface EvalSample {
3
+ /** The user's question or query. */
4
+ question: string;
5
+ /** The generated answer from the RAG pipeline. */
6
+ answer: string;
7
+ /**
8
+ * The retrieved context chunks provided to the LLM.
9
+ * Order matters for contextPrecision: index 0 is the highest-ranked chunk.
10
+ */
11
+ contexts: string[];
12
+ /**
13
+ * The reference (ground truth) answer.
14
+ * Required for: contextPrecision, contextRecall, answerCorrectness.
15
+ * Optional for all other metrics.
16
+ */
17
+ groundTruth?: string;
18
+ /** Optional identifier for tracking in batch results and reports. */
19
+ id?: string;
20
+ /** Optional metadata for grouping, filtering, or annotation. */
21
+ metadata?: Record<string, unknown>;
22
+ }
23
+ export type MetricId = 'faithfulness' | 'answerRelevance' | 'contextPrecision' | 'contextRecall' | 'contextRelevance' | 'answerCorrectness' | 'hallucinationRate';
24
+ export type EvaluationMode = 'heuristic' | 'llm' | 'hybrid';
25
+ /** A specific finding detected during metric computation. */
26
+ export interface EvalSignal {
27
+ /** Machine-readable identifier for this signal type. */
28
+ id: string;
29
+ /** Which metric produced this signal. */
30
+ metricId: MetricId;
31
+ /** Severity level of the signal. */
32
+ severity: 'info' | 'warning' | 'critical';
33
+ /** Human-readable description of the finding. */
34
+ message: string;
35
+ /**
36
+ * The specific text (claim, sentence, context chunk excerpt) that triggered this signal.
37
+ */
38
+ evidence?: string;
39
+ /** Index of the context chunk involved, if applicable. */
40
+ contextChunkIndex?: number;
41
+ }
42
+ /** The result of computing one metric on one EvalSample. */
43
+ export interface MetricResult {
44
+ metricId: MetricId;
45
+ /**
46
+ * The 0-1 score. null if the metric could not be computed
47
+ * (missing required inputs, all LLM calls failed).
48
+ */
49
+ score: number | null;
50
+ /** The mode used to compute this metric (heuristic or llm, not hybrid). */
51
+ mode: 'heuristic' | 'llm';
52
+ /** Whether the score meets the configured threshold. null if score is null. */
53
+ passed: boolean | null;
54
+ /** The configured threshold used for pass/fail. */
55
+ threshold: number;
56
+ /** Human-readable explanation of how the score was determined. */
57
+ explanation: string;
58
+ /** Specific findings supporting the score. */
59
+ signals: EvalSignal[];
60
+ /** Number of LLM judge calls made for this metric. */
61
+ llmCalls: number;
62
+ /** Wall-clock duration in milliseconds. */
63
+ durationMs: number;
64
+ }
65
+ /** Cost tracking for an evaluation run. */
66
+ export interface CostTracker {
67
+ llmCalls: number;
68
+ estimatedInputTokens: number;
69
+ estimatedOutputTokens: number;
70
+ parseFailures: number;
71
+ }
72
+ /** The result of evaluating a single EvalSample. */
73
+ export interface EvalResult {
74
+ sample: EvalSample;
75
+ metrics: Record<MetricId, MetricResult>;
76
+ /**
77
+ * Weighted average of all computed metric scores.
78
+ * null if no metrics were successfully computed.
79
+ */
80
+ compositeScore: number | null;
81
+ /** true if all computed metrics passed their thresholds and composite score passes compositeThreshold. */
82
+ passed: boolean;
83
+ cost: CostTracker;
84
+ durationMs: number;
85
+ evaluatedAt: string;
86
+ }
87
+ /** Per-metric aggregate statistics across a batch. */
88
+ export interface MetricAggregate {
89
+ metricId: MetricId;
90
+ mean: number;
91
+ median: number;
92
+ min: number;
93
+ max: number;
94
+ stdDev: number;
95
+ passRate: number;
96
+ nullRate: number;
97
+ }
98
+ /** Regression comparison for a single metric against a baseline. */
99
+ export interface MetricRegression {
100
+ metricId: MetricId;
101
+ baselineMean: number;
102
+ currentMean: number;
103
+ delta: number;
104
+ regressed: boolean;
105
+ }
106
+ /** The result of evaluating a batch of EvalSamples. */
107
+ export interface BatchEvalResult {
108
+ results: EvalResult[];
109
+ aggregates: Record<MetricId, MetricAggregate>;
110
+ compositeAggregate: {
111
+ mean: number;
112
+ median: number;
113
+ min: number;
114
+ max: number;
115
+ stdDev: number;
116
+ passRate: number;
117
+ };
118
+ passed: boolean;
119
+ totalCost: CostTracker;
120
+ totalDurationMs: number;
121
+ regressions?: MetricRegression[];
122
+ evaluatedAt: string;
123
+ }
124
+ export type JudgeFn = (prompt: string) => Promise<string>;
125
+ export type PromptOverrides = Partial<Record<MetricId, string>>;
126
+ export interface MetricThresholds {
127
+ faithfulness?: number;
128
+ answerRelevance?: number;
129
+ contextPrecision?: number;
130
+ contextRecall?: number;
131
+ contextRelevance?: number;
132
+ answerCorrectness?: number;
133
+ hallucinationRate?: number;
134
+ }
135
+ export interface HeuristicOptions {
136
+ claimSupportThreshold?: number;
137
+ chunkRelevanceThreshold?: number;
138
+ sentenceCoverageThreshold?: number;
139
+ ngramWeight?: number;
140
+ tfidfWeight?: number;
141
+ ngramSizes?: number[];
142
+ ngramWeights?: number[];
143
+ }
144
+ export interface EvaluateOptions {
145
+ mode?: EvaluationMode;
146
+ judge?: JudgeFn;
147
+ thresholds?: MetricThresholds;
148
+ metricModes?: Partial<Record<MetricId, 'heuristic' | 'llm'>>;
149
+ compositeThreshold?: number;
150
+ compositeWeights?: Partial<Record<MetricId, number>>;
151
+ heuristic?: HeuristicOptions;
152
+ promptOverrides?: PromptOverrides;
153
+ }
154
+ export interface BatchEvaluateOptions extends EvaluateOptions {
155
+ concurrency?: number;
156
+ onProgress?: (completed: number, total: number) => void;
157
+ baselineResult?: BatchEvalResult;
158
+ regressionThreshold?: number;
159
+ }
160
+ export interface EvaluatorConfig extends EvaluateOptions {
161
+ metrics?: MetricId[];
162
+ }
163
+ /** A pre-configured evaluator instance. */
164
+ export interface Evaluator {
165
+ evaluate(sample: EvalSample, metrics?: MetricId[], options?: EvaluateOptions): Promise<EvalResult>;
166
+ evaluateBatch(samples: EvalSample[], metrics?: MetricId[], options?: BatchEvaluateOptions): Promise<BatchEvalResult>;
167
+ readonly config: EvaluatorConfig;
168
+ }
169
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ // ── Input Types ──────────────────────────────────────────────────────
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA,wEAAwE"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "rag-eval-node-ts",
3
+ "version": "0.3.0",
4
+ "description": "Lightweight RAG evaluation metrics for CI/CD pipelines",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "rag-eval": "dist/cli/cli.js"
9
+ },
10
+ "exports": {
11
+ ".": "./dist/index.js",
12
+ "./adapters/openai": "./dist/adapters/openai.js",
13
+ "./adapters/anthropic": "./dist/adapters/anthropic.js"
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsc",
20
+ "test": "vitest run",
21
+ "lint": "eslint src/",
22
+ "prepublishOnly": "npm run build"
23
+ },
24
+ "keywords": [],
25
+ "author": "",
26
+ "license": "MIT",
27
+ "engines": {
28
+ "node": ">=18"
29
+ },
30
+ "publishConfig": {
31
+ "access": "public"
32
+ },
33
+ "peerDependencies": {
34
+ "openai": "^4.0.0",
35
+ "@anthropic-ai/sdk": "^0.20.0"
36
+ },
37
+ "peerDependenciesMeta": {
38
+ "openai": {
39
+ "optional": true
40
+ },
41
+ "@anthropic-ai/sdk": {
42
+ "optional": true
43
+ }
44
+ },
45
+ "devDependencies": {
46
+ "@types/node": "^25.5.0",
47
+ "@typescript-eslint/eslint-plugin": "^8.57.1",
48
+ "@typescript-eslint/parser": "^8.57.1",
49
+ "eslint": "^10.1.0",
50
+ "typescript": "^5.9.3",
51
+ "vitest": "^4.1.0"
52
+ }
53
+ }