@eucoder/rag 0.2.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 (103) hide show
  1. package/README.md +384 -0
  2. package/dist/ab-testing.d.ts +52 -0
  3. package/dist/ab-testing.d.ts.map +1 -0
  4. package/dist/ab-testing.js +144 -0
  5. package/dist/ab-testing.js.map +1 -0
  6. package/dist/ab-testing.test.d.ts +2 -0
  7. package/dist/ab-testing.test.d.ts.map +1 -0
  8. package/dist/ab-testing.test.js +147 -0
  9. package/dist/ab-testing.test.js.map +1 -0
  10. package/dist/agentic-rag.d.ts +23 -0
  11. package/dist/agentic-rag.d.ts.map +1 -0
  12. package/dist/agentic-rag.js +170 -0
  13. package/dist/agentic-rag.js.map +1 -0
  14. package/dist/agentic-rag.test.d.ts +2 -0
  15. package/dist/agentic-rag.test.d.ts.map +1 -0
  16. package/dist/agentic-rag.test.js +174 -0
  17. package/dist/agentic-rag.test.js.map +1 -0
  18. package/dist/corrective-rag.d.ts +16 -0
  19. package/dist/corrective-rag.d.ts.map +1 -0
  20. package/dist/corrective-rag.js +85 -0
  21. package/dist/corrective-rag.js.map +1 -0
  22. package/dist/corrective-rag.test.d.ts +2 -0
  23. package/dist/corrective-rag.test.d.ts.map +1 -0
  24. package/dist/corrective-rag.test.js +140 -0
  25. package/dist/corrective-rag.test.js.map +1 -0
  26. package/dist/feedback.d.ts +77 -0
  27. package/dist/feedback.d.ts.map +1 -0
  28. package/dist/feedback.js +44 -0
  29. package/dist/feedback.js.map +1 -0
  30. package/dist/feedback.test.d.ts +2 -0
  31. package/dist/feedback.test.d.ts.map +1 -0
  32. package/dist/feedback.test.js +202 -0
  33. package/dist/feedback.test.js.map +1 -0
  34. package/dist/hybrid-search.d.ts +14 -0
  35. package/dist/hybrid-search.d.ts.map +1 -0
  36. package/dist/hybrid-search.js +70 -0
  37. package/dist/hybrid-search.js.map +1 -0
  38. package/dist/hybrid-search.test.d.ts +2 -0
  39. package/dist/hybrid-search.test.d.ts.map +1 -0
  40. package/dist/hybrid-search.test.js +93 -0
  41. package/dist/hybrid-search.test.js.map +1 -0
  42. package/dist/index.d.ts +17 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +12 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/knowledge-graph.d.ts +24 -0
  47. package/dist/knowledge-graph.d.ts.map +1 -0
  48. package/dist/knowledge-graph.js +131 -0
  49. package/dist/knowledge-graph.js.map +1 -0
  50. package/dist/knowledge-graph.test.d.ts +2 -0
  51. package/dist/knowledge-graph.test.d.ts.map +1 -0
  52. package/dist/knowledge-graph.test.js +140 -0
  53. package/dist/knowledge-graph.test.js.map +1 -0
  54. package/dist/llm-grader.d.ts +19 -0
  55. package/dist/llm-grader.d.ts.map +1 -0
  56. package/dist/llm-grader.js +63 -0
  57. package/dist/llm-grader.js.map +1 -0
  58. package/dist/metrics.d.ts +26 -0
  59. package/dist/metrics.d.ts.map +1 -0
  60. package/dist/metrics.js +100 -0
  61. package/dist/metrics.js.map +1 -0
  62. package/dist/optimizer.d.ts +52 -0
  63. package/dist/optimizer.d.ts.map +1 -0
  64. package/dist/optimizer.js +228 -0
  65. package/dist/optimizer.js.map +1 -0
  66. package/dist/optimizer.test.d.ts +2 -0
  67. package/dist/optimizer.test.d.ts.map +1 -0
  68. package/dist/optimizer.test.js +201 -0
  69. package/dist/optimizer.test.js.map +1 -0
  70. package/dist/self-improving.d.ts +85 -0
  71. package/dist/self-improving.d.ts.map +1 -0
  72. package/dist/self-improving.js +163 -0
  73. package/dist/self-improving.js.map +1 -0
  74. package/dist/self-improving.test.d.ts +2 -0
  75. package/dist/self-improving.test.d.ts.map +1 -0
  76. package/dist/self-improving.test.js +234 -0
  77. package/dist/self-improving.test.js.map +1 -0
  78. package/dist/types.d.ts +117 -0
  79. package/dist/types.d.ts.map +1 -0
  80. package/dist/types.js +2 -0
  81. package/dist/types.js.map +1 -0
  82. package/package.json +42 -0
  83. package/src/ab-testing.test.ts +239 -0
  84. package/src/ab-testing.ts +214 -0
  85. package/src/agentic-rag.test.ts +201 -0
  86. package/src/agentic-rag.ts +220 -0
  87. package/src/corrective-rag.test.ts +166 -0
  88. package/src/corrective-rag.ts +115 -0
  89. package/src/feedback.test.ts +227 -0
  90. package/src/feedback.ts +118 -0
  91. package/src/hybrid-search.test.ts +107 -0
  92. package/src/hybrid-search.ts +86 -0
  93. package/src/index.ts +57 -0
  94. package/src/knowledge-graph.test.ts +170 -0
  95. package/src/knowledge-graph.ts +182 -0
  96. package/src/llm-grader.ts +69 -0
  97. package/src/metrics.ts +121 -0
  98. package/src/optimizer.test.ts +232 -0
  99. package/src/optimizer.ts +307 -0
  100. package/src/self-improving.test.ts +341 -0
  101. package/src/self-improving.ts +239 -0
  102. package/src/types.ts +139 -0
  103. package/tsconfig.json +9 -0
@@ -0,0 +1,147 @@
1
+ import { describe, it, expect, beforeEach } from "vitest";
2
+ import { ABTestFramework } from "./ab-testing.js";
3
+ import { InMemoryFeedbackStorage } from "./feedback.js";
4
+ describe("ABTestFramework", () => {
5
+ let framework;
6
+ let storage;
7
+ beforeEach(() => {
8
+ storage = new InMemoryFeedbackStorage();
9
+ framework = new ABTestFramework(storage);
10
+ });
11
+ it("should register strategies", () => {
12
+ const config = {
13
+ name: "strategy-a",
14
+ type: "corrective",
15
+ params: { minGoodHits: 2 },
16
+ };
17
+ framework.registerStrategy(config);
18
+ // Strategy registered successfully
19
+ expect(true).toBe(true);
20
+ });
21
+ it("should select strategy randomly", () => {
22
+ const configA = {
23
+ name: "strategy-a",
24
+ type: "corrective",
25
+ params: {},
26
+ };
27
+ const configB = {
28
+ name: "strategy-b",
29
+ type: "hybrid",
30
+ params: {},
31
+ };
32
+ framework.registerStrategy(configA);
33
+ framework.registerStrategy(configB);
34
+ const selected = framework.selectStrategy();
35
+ expect(["strategy-a", "strategy-b"]).toContain(selected.name);
36
+ });
37
+ it("should throw error when no strategies registered", () => {
38
+ expect(() => framework.selectStrategy()).toThrow("No strategies registered");
39
+ });
40
+ it("should record feedback", async () => {
41
+ const config = {
42
+ name: "strategy-a",
43
+ type: "corrective",
44
+ params: {},
45
+ };
46
+ framework.registerStrategy(config);
47
+ await framework.recordFeedback("test query", { text: "test answer", citations: [], steps: [], rewrites: 0 }, 4, 0.8, 0.7, 0.9, "strategy-a");
48
+ const feedback = await storage.getFeedback("strategy-a");
49
+ expect(feedback).toHaveLength(1);
50
+ expect(feedback[0]?.rating).toBe(4);
51
+ });
52
+ it("should run A/B test with sufficient samples", async () => {
53
+ const configA = {
54
+ name: "strategy-a",
55
+ type: "corrective",
56
+ params: {},
57
+ };
58
+ const configB = {
59
+ name: "strategy-b",
60
+ type: "hybrid",
61
+ params: {},
62
+ };
63
+ framework.registerStrategy(configA);
64
+ framework.registerStrategy(configB);
65
+ // Add 30 samples for strategy A (lower quality)
66
+ for (let i = 0; i < 30; i++) {
67
+ await framework.recordFeedback(`query ${i}`, { text: `answer ${i}`, citations: [], steps: [], rewrites: 0 }, 3, 0.6, 0.5, 0.7, "strategy-a");
68
+ }
69
+ // Add 30 samples for strategy B (higher quality)
70
+ for (let i = 0; i < 30; i++) {
71
+ await framework.recordFeedback(`query ${i}`, { text: `answer ${i}`, citations: [], steps: [], rewrites: 0 }, 5, 0.9, 0.85, 0.95, "strategy-b");
72
+ }
73
+ const result = await framework.runABTest("strategy-a", "strategy-b", 20);
74
+ expect(result.strategyA).toBe("strategy-a");
75
+ expect(result.strategyB).toBe("strategy-b");
76
+ expect(result.winner).toBe("B");
77
+ expect(result.improvement).toBeGreaterThan(0);
78
+ expect(result.statisticalSignificance).toBeGreaterThan(0);
79
+ expect(result.recommendation).toContain("B");
80
+ });
81
+ it("should throw error with insufficient samples", async () => {
82
+ const configA = {
83
+ name: "strategy-a",
84
+ type: "corrective",
85
+ params: {},
86
+ };
87
+ const configB = {
88
+ name: "strategy-b",
89
+ type: "hybrid",
90
+ params: {},
91
+ };
92
+ framework.registerStrategy(configA);
93
+ framework.registerStrategy(configB);
94
+ // Add only 10 samples (not enough)
95
+ for (let i = 0; i < 10; i++) {
96
+ await framework.recordFeedback(`query ${i}`, { text: `answer ${i}`, citations: [], steps: [], rewrites: 0 }, 4, 0.8, 0.7, 0.9, "strategy-a");
97
+ }
98
+ await expect(framework.runABTest("strategy-a", "strategy-b", 20))
99
+ .rejects.toThrow("Insufficient samples");
100
+ });
101
+ it("should get strategy metrics", async () => {
102
+ const config = {
103
+ name: "strategy-a",
104
+ type: "corrective",
105
+ params: {},
106
+ };
107
+ framework.registerStrategy(config);
108
+ for (let i = 0; i < 5; i++) {
109
+ await framework.recordFeedback(`query ${i}`, { text: `answer ${i}`, citations: [], steps: [], rewrites: 0 }, 4, 0.8, 0.7, 0.9, "strategy-a");
110
+ }
111
+ const metrics = await framework.getStrategyMetrics("strategy-a");
112
+ expect(metrics).not.toBeNull();
113
+ expect(metrics?.totalQueries).toBe(5);
114
+ expect(metrics?.averageRating).toBe(4);
115
+ });
116
+ it("should return null for non-existent strategy metrics", async () => {
117
+ const metrics = await framework.getStrategyMetrics("non-existent");
118
+ expect(metrics).toBeNull();
119
+ });
120
+ it("should get all metrics sorted by score", async () => {
121
+ const configA = {
122
+ name: "strategy-a",
123
+ type: "corrective",
124
+ params: {},
125
+ };
126
+ const configB = {
127
+ name: "strategy-b",
128
+ type: "hybrid",
129
+ params: {},
130
+ };
131
+ framework.registerStrategy(configA);
132
+ framework.registerStrategy(configB);
133
+ // Strategy A: lower quality
134
+ for (let i = 0; i < 5; i++) {
135
+ await framework.recordFeedback(`query ${i}`, { text: `answer ${i}`, citations: [], steps: [], rewrites: 0 }, 3, 0.6, 0.5, 0.7, "strategy-a");
136
+ }
137
+ // Strategy B: higher quality
138
+ for (let i = 0; i < 5; i++) {
139
+ await framework.recordFeedback(`query ${i}`, { text: `answer ${i}`, citations: [], steps: [], rewrites: 0 }, 5, 0.9, 0.85, 0.95, "strategy-b");
140
+ }
141
+ const allMetrics = await framework.getAllMetrics();
142
+ expect(allMetrics).toHaveLength(2);
143
+ expect(allMetrics[0]?.strategy).toBe("strategy-b");
144
+ expect(allMetrics[0]?.overallScore).toBeGreaterThan(allMetrics[1]?.overallScore || 0);
145
+ });
146
+ });
147
+ //# sourceMappingURL=ab-testing.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ab-testing.test.js","sourceRoot":"","sources":["../src/ab-testing.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { AgenticRagOptions, AgenticRagResult } from "./types.js";
2
+ /**
3
+ * Agentic RAG con Reasoning e Self-Reflection
4
+ *
5
+ * Implementa un ciclo di ragionamento:
6
+ * 1. Thought: Analizza la query e pianifica l'approccio
7
+ * 2. Action: Esegue retrieval e grading
8
+ * 3. Observation: Valuta i risultati
9
+ * 4. Self-Reflection: Valuta la qualità della risposta
10
+ * 5. Itera se necessario
11
+ */
12
+ export declare class AgenticRag {
13
+ private options;
14
+ constructor(options: AgenticRagOptions);
15
+ search(query: string): Promise<AgenticRagResult>;
16
+ private generateThought;
17
+ private gradeHits;
18
+ private generateObservation;
19
+ private selfReflect;
20
+ private buildAnswer;
21
+ private finalReflection;
22
+ }
23
+ //# sourceMappingURL=agentic-rag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentic-rag.d.ts","sourceRoot":"","sources":["../src/agentic-rag.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAGjB,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;GASG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAA8B;gBAEjC,OAAO,EAAE,iBAAiB;IAShC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAiFtD,OAAO,CAAC,eAAe;YAQT,SAAS;IAavB,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,WAAW;IAoCnB,OAAO,CAAC,eAAe;CAyBxB"}
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Agentic RAG con Reasoning e Self-Reflection
3
+ *
4
+ * Implementa un ciclo di ragionamento:
5
+ * 1. Thought: Analizza la query e pianifica l'approccio
6
+ * 2. Action: Esegue retrieval e grading
7
+ * 3. Observation: Valuta i risultati
8
+ * 4. Self-Reflection: Valuta la qualità della risposta
9
+ * 5. Itera se necessario
10
+ */
11
+ export class AgenticRag {
12
+ options;
13
+ constructor(options) {
14
+ this.options = {
15
+ maxIterations: options.maxIterations ?? 3,
16
+ enableSelfReflection: options.enableSelfReflection ?? true,
17
+ enableChainOfThought: options.enableChainOfThought ?? true,
18
+ ...options,
19
+ };
20
+ }
21
+ async search(query) {
22
+ const reasoningSteps = [];
23
+ let currentQuery = query;
24
+ let bestHits = [];
25
+ let bestScore = 0;
26
+ let iterations = 0;
27
+ // Ciclo di ragionamento
28
+ for (let i = 0; i < this.options.maxIterations; i++) {
29
+ iterations++;
30
+ // Step 1: Thought
31
+ const thought = this.generateThought(currentQuery, i);
32
+ // Step 2: Action - Retrieval
33
+ const hits = await this.options.retriever.search(currentQuery, 10);
34
+ // Step 3: Action - Grading
35
+ const gradedHits = await this.gradeHits(currentQuery, hits);
36
+ const avgScore = gradedHits.length > 0
37
+ ? gradedHits.reduce((sum, h) => sum + h.score, 0) / gradedHits.length
38
+ : 0;
39
+ // Step 4: Observation
40
+ const observation = this.generateObservation(gradedHits, avgScore);
41
+ reasoningSteps.push({
42
+ thought,
43
+ action: `Retrieved ${hits.length} hits, graded ${gradedHits.length} as relevant`,
44
+ observation,
45
+ });
46
+ // Aggiorna best hits se migliori
47
+ if (avgScore > bestScore) {
48
+ bestScore = avgScore;
49
+ bestHits = gradedHits;
50
+ }
51
+ // Step 5: Self-Reflection (se abilitato)
52
+ if (this.options.enableSelfReflection && i < this.options.maxIterations - 1) {
53
+ const reflection = this.selfReflect(currentQuery, gradedHits, avgScore);
54
+ if (reflection.shouldRewrite) {
55
+ // Riscrivi la query
56
+ currentQuery = await this.options.rewriter.rewrite(currentQuery, gradedHits.map((h) => h.text).join("\n"));
57
+ continue;
58
+ }
59
+ else if (reflection.isSatisfied) {
60
+ break; // Risultati soddisfacenti
61
+ }
62
+ }
63
+ else if (avgScore > 0.7) {
64
+ break; // Score足够高, termina
65
+ }
66
+ }
67
+ // Genera risposta finale
68
+ const answer = this.buildAnswer(query, bestHits, reasoningSteps);
69
+ const citations = bestHits.map((hit) => ({
70
+ path: hit.path,
71
+ startLine: hit.startLine,
72
+ endLine: hit.endLine,
73
+ text: hit.text,
74
+ }));
75
+ // Self-reflection finale
76
+ const selfReflection = this.options.enableSelfReflection
77
+ ? this.finalReflection(query, bestHits, bestScore, iterations)
78
+ : undefined;
79
+ return {
80
+ answer,
81
+ citations,
82
+ reasoningSteps,
83
+ selfReflection,
84
+ iterations,
85
+ confidence: bestScore,
86
+ };
87
+ }
88
+ generateThought(query, iteration) {
89
+ if (iteration === 0) {
90
+ return `Analizzo la query: "${query}". Cerco documenti rilevanti e valuto la loro pertinenza.`;
91
+ }
92
+ else {
93
+ return `Iterazione ${iteration + 1}. I risultati precedenti non erano sufficientemente pertinenti. Riscrivo la query per migliorare i risultati.`;
94
+ }
95
+ }
96
+ async gradeHits(query, hits) {
97
+ const graded = await Promise.all(hits.map(async (hit) => {
98
+ const result = await this.options.grader.grade(query, hit);
99
+ return { ...hit, score: result.score };
100
+ }));
101
+ return graded
102
+ .filter((h) => h.score > 0.3)
103
+ .sort((a, b) => b.score - a.score);
104
+ }
105
+ generateObservation(hits, avgScore) {
106
+ if (hits.length === 0) {
107
+ return "Nessun documento rilevante trovato. Score medio: 0";
108
+ }
109
+ return `Trovati ${hits.length} documenti rilevanti. Score medio: ${avgScore.toFixed(2)}. Miglior documento: ${hits[0]?.path ?? "N/A"}`;
110
+ }
111
+ selfReflect(_query, hits, avgScore) {
112
+ // Se score è alto, siamo soddisfatti
113
+ if (avgScore > 0.7 && hits.length >= 3) {
114
+ return { shouldRewrite: false, isSatisfied: true };
115
+ }
116
+ // Se score è molto basso, riscrivi
117
+ if (avgScore < 0.4 || hits.length < 2) {
118
+ return { shouldRewrite: true, isSatisfied: false };
119
+ }
120
+ // Score medio, continua ma non riscrivere
121
+ return { shouldRewrite: false, isSatisfied: false };
122
+ }
123
+ buildAnswer(_query, hits, reasoningSteps) {
124
+ const parts = [];
125
+ // Chain of Thought (se abilitato)
126
+ if (this.options.enableChainOfThought && reasoningSteps.length > 0) {
127
+ parts.push(`## Processo di Ragionamento\n`);
128
+ reasoningSteps.forEach((step, i) => {
129
+ parts.push(`### Step ${i + 1}`);
130
+ parts.push(`**Thought:** ${step.thought}`);
131
+ parts.push(`**Action:** ${step.action}`);
132
+ parts.push(`**Observation:** ${step.observation}\n`);
133
+ });
134
+ }
135
+ // Risposta finale
136
+ parts.push(`## Risposta\n`);
137
+ if (hits.length === 0) {
138
+ parts.push(`Non sono stati trovati documenti rilevanti per la query fornita.`);
139
+ }
140
+ else {
141
+ parts.push(`Basato su ${hits.length} documenti pertinenti:\n`);
142
+ hits.slice(0, 5).forEach((hit, i) => {
143
+ parts.push(`### Fonte ${i + 1}: ${hit.path}`);
144
+ parts.push(`Righe ${hit.startLine}-${hit.endLine} (score: ${hit.score.toFixed(2)})\n`);
145
+ parts.push(`\`\`\`\n${hit.text}\n\`\`\`\n`);
146
+ });
147
+ }
148
+ return parts.join("\n");
149
+ }
150
+ finalReflection(query, hits, avgScore, iterations) {
151
+ const parts = [];
152
+ parts.push(`**Valutazione Finale:**`);
153
+ parts.push(`- Query: "${query}"`);
154
+ parts.push(`- Iterazioni: ${iterations}`);
155
+ parts.push(`- Documenti trovati: ${hits.length}`);
156
+ parts.push(`- Score medio: ${avgScore.toFixed(2)}`);
157
+ parts.push(`- Confidenza: ${avgScore > 0.7 ? "Alta" : avgScore > 0.4 ? "Media" : "Bassa"}`);
158
+ if (avgScore > 0.7) {
159
+ parts.push(`\n✅ I risultati sono altamente pertinenti alla query.`);
160
+ }
161
+ else if (avgScore > 0.4) {
162
+ parts.push(`\n⚠️ I risultati sono parzialmente pertinenti. Potrebbe essere necessario raffinare la query.`);
163
+ }
164
+ else {
165
+ parts.push(`\n❌ I risultati non sono sufficientemente pertinenti. Considera di riformulare la query.`);
166
+ }
167
+ return parts.join("\n");
168
+ }
169
+ }
170
+ //# sourceMappingURL=agentic-rag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentic-rag.js","sourceRoot":"","sources":["../src/agentic-rag.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agentic-rag.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentic-rag.test.d.ts","sourceRoot":"","sources":["../src/agentic-rag.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,174 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { AgenticRag } from "./agentic-rag.js";
3
+ class MockRetriever {
4
+ callCount = 0;
5
+ async search(_query, topK) {
6
+ this.callCount++;
7
+ // First call returns poor results, second call returns good results
8
+ if (this.callCount === 1) {
9
+ return [
10
+ {
11
+ id: "hit-1",
12
+ path: "src/unrelated.ts",
13
+ startLine: 1,
14
+ endLine: 10,
15
+ text: "Unrelated content",
16
+ score: 0.3,
17
+ },
18
+ ].slice(0, topK);
19
+ }
20
+ return [
21
+ {
22
+ id: "hit-2",
23
+ path: "src/auth.ts",
24
+ startLine: 10,
25
+ endLine: 20,
26
+ text: "Authentication implementation",
27
+ score: 0.9,
28
+ },
29
+ {
30
+ id: "hit-3",
31
+ path: "src/login.ts",
32
+ startLine: 5,
33
+ endLine: 15,
34
+ text: "Login logic",
35
+ score: 0.85,
36
+ },
37
+ ].slice(0, topK);
38
+ }
39
+ }
40
+ class MockGrader {
41
+ async grade(_query, hit) {
42
+ return {
43
+ relevant: hit.score > 0.5,
44
+ score: hit.score,
45
+ };
46
+ }
47
+ }
48
+ class MockRewriter {
49
+ async rewrite(query, _context) {
50
+ return `${query} (improved)`;
51
+ }
52
+ }
53
+ describe("AgenticRag", () => {
54
+ it("should perform iterative search with reasoning", async () => {
55
+ const agentic = new AgenticRag({
56
+ retriever: new MockRetriever(),
57
+ grader: new MockGrader(),
58
+ rewriter: new MockRewriter(),
59
+ maxIterations: 3,
60
+ enableSelfReflection: true,
61
+ enableChainOfThought: true,
62
+ });
63
+ const result = await agentic.search("authentication");
64
+ expect(result.iterations).toBeGreaterThan(0);
65
+ expect(result.reasoningSteps.length).toBeGreaterThan(0);
66
+ expect(result.answer).toContain("Processo di Ragionamento");
67
+ expect(result.citations.length).toBeGreaterThan(0);
68
+ });
69
+ it("should stop early when results are good enough", async () => {
70
+ const goodRetriever = {
71
+ async search(_query, topK) {
72
+ return [
73
+ {
74
+ id: "hit-1",
75
+ path: "src/auth.ts",
76
+ startLine: 10,
77
+ endLine: 20,
78
+ text: "Authentication implementation",
79
+ score: 0.9,
80
+ },
81
+ {
82
+ id: "hit-2",
83
+ path: "src/login.ts",
84
+ startLine: 5,
85
+ endLine: 15,
86
+ text: "Login logic",
87
+ score: 0.85,
88
+ },
89
+ {
90
+ id: "hit-3",
91
+ path: "src/session.ts",
92
+ startLine: 1,
93
+ endLine: 10,
94
+ text: "Session management",
95
+ score: 0.8,
96
+ },
97
+ ].slice(0, topK);
98
+ },
99
+ };
100
+ const agentic = new AgenticRag({
101
+ retriever: goodRetriever,
102
+ grader: new MockGrader(),
103
+ rewriter: new MockRewriter(),
104
+ maxIterations: 5,
105
+ enableSelfReflection: true,
106
+ });
107
+ const result = await agentic.search("authentication");
108
+ // Should stop after 1 iteration because results are good
109
+ expect(result.iterations).toBe(1);
110
+ expect(result.confidence).toBeGreaterThan(0.7);
111
+ });
112
+ it("should rewrite query when results are poor", async () => {
113
+ const poorRetriever = {
114
+ async search(_query, topK) {
115
+ return [
116
+ {
117
+ id: "hit-1",
118
+ path: "src/unrelated.ts",
119
+ startLine: 1,
120
+ endLine: 10,
121
+ text: "Unrelated content",
122
+ score: 0.2,
123
+ },
124
+ ].slice(0, topK);
125
+ },
126
+ };
127
+ const agentic = new AgenticRag({
128
+ retriever: poorRetriever,
129
+ grader: new MockGrader(),
130
+ rewriter: new MockRewriter(),
131
+ maxIterations: 3,
132
+ enableSelfReflection: true,
133
+ });
134
+ const result = await agentic.search("authentication");
135
+ // Should iterate multiple times trying to improve
136
+ expect(result.iterations).toBeGreaterThan(1);
137
+ expect(result.confidence).toBeLessThan(0.5);
138
+ });
139
+ it("should include self-reflection when enabled", async () => {
140
+ const agentic = new AgenticRag({
141
+ retriever: new MockRetriever(),
142
+ grader: new MockGrader(),
143
+ rewriter: new MockRewriter(),
144
+ maxIterations: 2,
145
+ enableSelfReflection: true,
146
+ });
147
+ const result = await agentic.search("authentication");
148
+ expect(result.selfReflection).toBeDefined();
149
+ expect(result.selfReflection).toContain("Valutazione Finale");
150
+ });
151
+ it("should skip self-reflection when disabled", async () => {
152
+ const agentic = new AgenticRag({
153
+ retriever: new MockRetriever(),
154
+ grader: new MockGrader(),
155
+ rewriter: new MockRewriter(),
156
+ maxIterations: 2,
157
+ enableSelfReflection: false,
158
+ });
159
+ const result = await agentic.search("authentication");
160
+ expect(result.selfReflection).toBeUndefined();
161
+ });
162
+ it("should skip chain of thought when disabled", async () => {
163
+ const agentic = new AgenticRag({
164
+ retriever: new MockRetriever(),
165
+ grader: new MockGrader(),
166
+ rewriter: new MockRewriter(),
167
+ maxIterations: 2,
168
+ enableChainOfThought: false,
169
+ });
170
+ const result = await agentic.search("authentication");
171
+ expect(result.answer).not.toContain("Processo di Ragionamento");
172
+ });
173
+ });
174
+ //# sourceMappingURL=agentic-rag.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentic-rag.test.js","sourceRoot":"","sources":["../src/agentic-rag.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { CorrectiveRagOptions, RagAnswer } from "./types.js";
2
+ export declare class CorrectiveRag {
3
+ private retriever;
4
+ private grader;
5
+ private rewriter;
6
+ private maxRewrites;
7
+ private minGoodHits;
8
+ private minScore;
9
+ private webFallback?;
10
+ constructor(options: CorrectiveRagOptions);
11
+ answer(query: string): Promise<RagAnswer>;
12
+ private gradeHits;
13
+ private formatAnswer;
14
+ }
15
+ export declare function createCorrectiveRag(options: CorrectiveRagOptions): CorrectiveRag;
16
+ //# sourceMappingURL=corrective-rag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"corrective-rag.d.ts","sourceRoot":"","sources":["../src/corrective-rag.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,SAAS,EAKV,MAAM,YAAY,CAAC;AAOpB,qBAAa,aAAa;IACxB,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAC,CAAoC;gBAE5C,OAAO,EAAE,oBAAoB;IAUnC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;YAoDjC,SAAS;IAavB,OAAO,CAAC,YAAY;CAYrB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAEhF"}