@absolutejs/absolute 0.19.0-beta.530 → 0.19.0-beta.532

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.
@@ -20,6 +20,7 @@ export declare const serverMessageToAction: (msg: AIServerMessage) => {
20
20
  retrievalStartedAt?: undefined;
21
21
  retrievalDurationMs?: undefined;
22
22
  retrievedAt?: undefined;
23
+ trace?: undefined;
23
24
  message?: undefined;
24
25
  } | {
25
26
  content: string;
@@ -42,6 +43,7 @@ export declare const serverMessageToAction: (msg: AIServerMessage) => {
42
43
  retrievalStartedAt?: undefined;
43
44
  retrievalDurationMs?: undefined;
44
45
  retrievedAt?: undefined;
46
+ trace?: undefined;
45
47
  message?: undefined;
46
48
  } | {
47
49
  conversationId: string;
@@ -64,6 +66,7 @@ export declare const serverMessageToAction: (msg: AIServerMessage) => {
64
66
  retrievalStartedAt?: undefined;
65
67
  retrievalDurationMs?: undefined;
66
68
  retrievedAt?: undefined;
69
+ trace?: undefined;
67
70
  message?: undefined;
68
71
  } | {
69
72
  conversationId: string;
@@ -86,6 +89,7 @@ export declare const serverMessageToAction: (msg: AIServerMessage) => {
86
89
  retrievalStartedAt?: undefined;
87
90
  retrievalDurationMs?: undefined;
88
91
  retrievedAt?: undefined;
92
+ trace?: undefined;
89
93
  message?: undefined;
90
94
  } | {
91
95
  conversationId: string;
@@ -108,6 +112,7 @@ export declare const serverMessageToAction: (msg: AIServerMessage) => {
108
112
  retrievalStartedAt?: undefined;
109
113
  retrievalDurationMs?: undefined;
110
114
  retrievedAt?: undefined;
115
+ trace?: undefined;
111
116
  message?: undefined;
112
117
  } | {
113
118
  conversationId: string;
@@ -130,6 +135,7 @@ export declare const serverMessageToAction: (msg: AIServerMessage) => {
130
135
  usage?: undefined;
131
136
  retrievalDurationMs?: undefined;
132
137
  retrievedAt?: undefined;
138
+ trace?: undefined;
133
139
  message?: undefined;
134
140
  } | {
135
141
  conversationId: string;
@@ -138,6 +144,7 @@ export declare const serverMessageToAction: (msg: AIServerMessage) => {
138
144
  retrievalStartedAt: number | undefined;
139
145
  retrievedAt: number;
140
146
  sources: import("..").RAGSource[];
147
+ trace: import("../..").RAGRetrievalTrace | undefined;
141
148
  type: "rag_retrieved";
142
149
  content?: undefined;
143
150
  input?: undefined;
@@ -175,4 +182,5 @@ export declare const serverMessageToAction: (msg: AIServerMessage) => {
175
182
  retrievalStartedAt?: undefined;
176
183
  retrievalDurationMs?: undefined;
177
184
  retrievedAt?: undefined;
185
+ trace?: undefined;
178
186
  } | null;
@@ -215,6 +215,7 @@ var serverMessageToAction = (msg) => {
215
215
  retrievalStartedAt: msg.retrievalStartedAt,
216
216
  retrievedAt: msg.retrievedAt,
217
217
  sources: msg.sources,
218
+ trace: msg.trace,
218
219
  type: "rag_retrieved"
219
220
  };
220
221
  case "error":
@@ -482,6 +483,7 @@ var handleRAGRetrieved = (state, action) => {
482
483
  message.retrievalStartedAt = action.retrievalStartedAt ?? message.retrievalStartedAt;
483
484
  message.retrievedAt = action.retrievedAt;
484
485
  message.retrievalDurationMs = action.retrievalDurationMs;
486
+ message.retrievalTrace = action.trace;
485
487
  conversation.messages = [...conversation.messages];
486
488
  };
487
489
  var handleRAGRetrieving = (state, action) => {
@@ -1032,8 +1034,19 @@ var createRAGClient = (options) => {
1032
1034
  return parseJson(response);
1033
1035
  },
1034
1036
  async search(input) {
1035
- const result = await this.searchDetailed(input);
1036
- return result.results;
1037
+ const response = await fetchImpl(`${basePath}/search`, {
1038
+ body: JSON.stringify(input),
1039
+ headers: jsonHeaders,
1040
+ method: "POST"
1041
+ });
1042
+ if (!response.ok) {
1043
+ throw new Error(await toErrorMessage(response));
1044
+ }
1045
+ const payload = await parseJson(response);
1046
+ if (!payload.ok) {
1047
+ throw new Error(payload.error ?? "RAG search failed");
1048
+ }
1049
+ return payload.results ?? [];
1037
1050
  },
1038
1051
  async searchDetailed(input) {
1039
1052
  const response = await fetchImpl(`${basePath}/search`, {
@@ -1758,6 +1771,114 @@ var buildRAGAnswerGroundingEvaluationLeaderboard = (runs) => {
1758
1771
  totalCases: run.response.totalCases
1759
1772
  }));
1760
1773
  };
1774
+ var buildTraceStageCounts = (traces) => {
1775
+ const counts = {};
1776
+ for (const trace of traces) {
1777
+ for (const step of trace.steps) {
1778
+ counts[step.stage] = (counts[step.stage] ?? 0) + 1;
1779
+ }
1780
+ }
1781
+ return counts;
1782
+ };
1783
+ var roundTraceAverage = (value, total) => total > 0 ? Number((value / total).toFixed(2)) : 0;
1784
+ var summarizeRetrievalTraces = (traces) => {
1785
+ if (traces.length === 0) {
1786
+ return;
1787
+ }
1788
+ const totalCases = traces.length;
1789
+ const modeSet = new Set;
1790
+ let vectorCases = 0;
1791
+ let lexicalCases = 0;
1792
+ let transformedCases = 0;
1793
+ let variantCases = 0;
1794
+ let finalCountSum = 0;
1795
+ let vectorCountSum = 0;
1796
+ let lexicalCountSum = 0;
1797
+ let candidateTopKSum = 0;
1798
+ let lexicalTopKSum = 0;
1799
+ for (const trace of traces) {
1800
+ modeSet.add(trace.mode);
1801
+ if (trace.runVector) {
1802
+ vectorCases += 1;
1803
+ }
1804
+ if (trace.runLexical) {
1805
+ lexicalCases += 1;
1806
+ }
1807
+ if (trace.transformedQuery !== trace.query) {
1808
+ transformedCases += 1;
1809
+ }
1810
+ if (trace.variantQueries.length > 0) {
1811
+ variantCases += 1;
1812
+ }
1813
+ finalCountSum += trace.resultCounts.final;
1814
+ vectorCountSum += trace.resultCounts.vector;
1815
+ lexicalCountSum += trace.resultCounts.lexical;
1816
+ candidateTopKSum += trace.candidateTopK;
1817
+ lexicalTopKSum += trace.lexicalTopK;
1818
+ }
1819
+ return {
1820
+ averageCandidateTopK: roundTraceAverage(candidateTopKSum, totalCases),
1821
+ averageFinalCount: roundTraceAverage(finalCountSum, totalCases),
1822
+ averageLexicalCount: roundTraceAverage(lexicalCountSum, totalCases),
1823
+ averageLexicalTopK: roundTraceAverage(lexicalTopKSum, totalCases),
1824
+ averageVectorCount: roundTraceAverage(vectorCountSum, totalCases),
1825
+ lexicalCases,
1826
+ modes: Array.from(modeSet),
1827
+ stageCounts: buildTraceStageCounts(traces),
1828
+ totalCases,
1829
+ transformedCases,
1830
+ variantCases,
1831
+ vectorCases
1832
+ };
1833
+ };
1834
+ var evaluateRAGCollectionCases = async ({
1835
+ collection,
1836
+ input,
1837
+ defaultTopK = DEFAULT_TOP_K,
1838
+ rerank,
1839
+ includeTrace = false
1840
+ }) => {
1841
+ if (input.dryRun) {
1842
+ return executeDryRunRAGEvaluation(input, defaultTopK).map((caseResult) => ({
1843
+ caseResult,
1844
+ trace: undefined
1845
+ }));
1846
+ }
1847
+ return Promise.all(input.cases.map(async (caseInput, caseIndex) => {
1848
+ const startedAt = Date.now();
1849
+ const mode = resolveEvaluationMode(caseInput);
1850
+ const query = caseInput.query.trim();
1851
+ const expectedIds = normalizeExpectedIds(mode === "chunkId" ? caseInput.expectedChunkIds ?? [] : mode === "source" ? caseInput.expectedSources ?? [] : caseInput.expectedDocumentIds ?? []);
1852
+ const topK = typeof caseInput.topK === "number" ? caseInput.topK : typeof input.topK === "number" ? input.topK : defaultTopK;
1853
+ const searchInput = {
1854
+ filter: typeof caseInput.filter === "object" ? caseInput.filter : input.filter,
1855
+ model: caseInput.model ?? input.model,
1856
+ query,
1857
+ rerank,
1858
+ scoreThreshold: typeof caseInput.scoreThreshold === "number" ? caseInput.scoreThreshold : input.scoreThreshold,
1859
+ topK
1860
+ };
1861
+ const searchOutcome = includeTrace ? await collection.searchWithTrace(searchInput) : {
1862
+ results: await collection.search(searchInput),
1863
+ trace: undefined
1864
+ };
1865
+ const sources = buildSources(searchOutcome.results);
1866
+ const elapsedMs = Date.now() - startedAt;
1867
+ const retrievedIds = normalizeExpectedIds(sources.map((source) => extractExpectedId(source, mode)));
1868
+ return {
1869
+ caseResult: summarizeRAGEvaluationCase({
1870
+ caseIndex,
1871
+ caseInput: { ...caseInput, topK },
1872
+ elapsedMs,
1873
+ expectedIds,
1874
+ mode,
1875
+ query,
1876
+ retrievedIds
1877
+ }),
1878
+ trace: searchOutcome.trace
1879
+ };
1880
+ }));
1881
+ };
1761
1882
  var buildRAGAnswerGroundingCaseDifficultyLeaderboard = (entries) => {
1762
1883
  const grouped = new Map;
1763
1884
  for (const entry of entries) {
@@ -2393,17 +2514,20 @@ var compareRAGRerankers = async ({
2393
2514
  defaultTopK = DEFAULT_TOP_K
2394
2515
  }) => {
2395
2516
  const entries = await Promise.all(rerankers.map(async (candidate) => {
2396
- const response = await evaluateRAGCollection({
2517
+ const evaluated = await evaluateRAGCollectionCases({
2397
2518
  collection,
2398
2519
  defaultTopK,
2399
2520
  input: suite.input,
2521
+ includeTrace: true,
2400
2522
  rerank: candidate.rerank
2401
2523
  });
2524
+ const response = buildRAGEvaluationResponse(evaluated.map((entry) => entry.caseResult));
2402
2525
  return {
2403
2526
  label: candidate.label ?? candidate.id,
2404
2527
  providerName: typeof candidate.rerank === "function" ? undefined : candidate.rerank?.providerName,
2405
2528
  response,
2406
- rerankerId: candidate.id
2529
+ rerankerId: candidate.id,
2530
+ traceSummary: summarizeRetrievalTraces(evaluated.map((entry) => entry.trace).filter((trace) => Boolean(trace)))
2407
2531
  };
2408
2532
  }));
2409
2533
  const leaderboard = buildRAGEvaluationLeaderboard(entries.map((entry) => ({
@@ -2458,25 +2582,37 @@ var compareRAGRetrievalStrategies = async ({
2458
2582
  defaultTopK = DEFAULT_TOP_K
2459
2583
  }) => {
2460
2584
  const entries = await Promise.all(retrievals.map(async (candidate) => {
2461
- const response = await evaluateRAGCollection({
2585
+ const tracedCollection = {
2586
+ ...collection,
2587
+ search: (input) => collection.search({
2588
+ ...input,
2589
+ queryTransform: candidate.queryTransform ?? input.queryTransform,
2590
+ rerank: candidate.rerank ?? input.rerank,
2591
+ retrieval: candidate.retrieval ?? input.retrieval
2592
+ }),
2593
+ searchWithTrace: (input) => collection.searchWithTrace({
2594
+ ...input,
2595
+ queryTransform: candidate.queryTransform ?? input.queryTransform,
2596
+ rerank: candidate.rerank ?? input.rerank,
2597
+ retrieval: candidate.retrieval ?? input.retrieval
2598
+ })
2599
+ };
2600
+ const evaluated = await evaluateRAGCollectionCases({
2462
2601
  collection: {
2463
- ...collection,
2464
- search: (input) => collection.search({
2465
- ...input,
2466
- queryTransform: candidate.queryTransform ?? input.queryTransform,
2467
- rerank: candidate.rerank ?? input.rerank,
2468
- retrieval: candidate.retrieval ?? input.retrieval
2469
- })
2602
+ ...tracedCollection
2470
2603
  },
2471
2604
  defaultTopK,
2472
2605
  input: suite.input,
2606
+ includeTrace: true,
2473
2607
  rerank: candidate.rerank
2474
2608
  });
2609
+ const response = buildRAGEvaluationResponse(evaluated.map((entry) => entry.caseResult));
2475
2610
  return {
2476
2611
  label: candidate.label ?? candidate.id,
2477
2612
  response,
2478
2613
  retrievalId: candidate.id,
2479
- retrievalMode: resolveRetrievalMode(candidate)
2614
+ retrievalMode: resolveRetrievalMode(candidate),
2615
+ traceSummary: summarizeRetrievalTraces(evaluated.map((entry) => entry.trace).filter((trace) => Boolean(trace)))
2480
2616
  };
2481
2617
  }));
2482
2618
  const leaderboard = buildRAGEvaluationLeaderboard(entries.map((entry) => ({
@@ -2503,37 +2639,14 @@ var evaluateRAGCollection = async ({
2503
2639
  defaultTopK = DEFAULT_TOP_K,
2504
2640
  rerank
2505
2641
  }) => {
2506
- if (input.dryRun) {
2507
- return buildRAGEvaluationResponse(executeDryRunRAGEvaluation(input, defaultTopK));
2508
- }
2509
- const evaluated = await Promise.all(input.cases.map(async (caseInput, caseIndex) => {
2510
- const startedAt = Date.now();
2511
- const mode = resolveEvaluationMode(caseInput);
2512
- const query = caseInput.query.trim();
2513
- const expectedIds = normalizeExpectedIds(mode === "chunkId" ? caseInput.expectedChunkIds ?? [] : mode === "source" ? caseInput.expectedSources ?? [] : caseInput.expectedDocumentIds ?? []);
2514
- const topK = typeof caseInput.topK === "number" ? caseInput.topK : typeof input.topK === "number" ? input.topK : defaultTopK;
2515
- const searchResults = await collection.search({
2516
- filter: typeof caseInput.filter === "object" ? caseInput.filter : input.filter,
2517
- model: caseInput.model ?? input.model,
2518
- query,
2519
- rerank,
2520
- scoreThreshold: typeof caseInput.scoreThreshold === "number" ? caseInput.scoreThreshold : input.scoreThreshold,
2521
- topK
2522
- });
2523
- const sources = buildSources(searchResults);
2524
- const elapsedMs = Date.now() - startedAt;
2525
- const retrievedIds = normalizeExpectedIds(sources.map((source) => extractExpectedId(source, mode)));
2526
- return summarizeRAGEvaluationCase({
2527
- caseIndex,
2528
- caseInput: { ...caseInput, topK },
2529
- elapsedMs,
2530
- expectedIds,
2531
- mode,
2532
- query,
2533
- retrievedIds
2534
- });
2535
- }));
2536
- return buildRAGEvaluationResponse(evaluated);
2642
+ const evaluated = await evaluateRAGCollectionCases({
2643
+ collection,
2644
+ defaultTopK,
2645
+ includeTrace: false,
2646
+ input,
2647
+ rerank
2648
+ });
2649
+ return buildRAGEvaluationResponse(evaluated.map((entry) => entry.caseResult));
2537
2650
  };
2538
2651
  var executeDryRunRAGEvaluation = (input, defaultTopK = DEFAULT_TOP_K) => input.cases.map((caseInput, caseIndex) => {
2539
2652
  const mode = resolveEvaluationMode(caseInput);
@@ -3306,5 +3419,5 @@ export {
3306
3419
  createAIStream
3307
3420
  };
3308
3421
 
3309
- //# debugId=53E52BBF03C706BF64756E2164756E21
3422
+ //# debugId=1515E9DBD027AFA064756E2164756E21
3310
3423
  //# sourceMappingURL=index.js.map