@absolutejs/absolute 0.19.0-beta.531 → 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.
@@ -1744,6 +1744,114 @@ var buildRAGAnswerGroundingEvaluationLeaderboard = (runs) => {
1744
1744
  totalCases: run.response.totalCases
1745
1745
  }));
1746
1746
  };
1747
+ var buildTraceStageCounts = (traces) => {
1748
+ const counts = {};
1749
+ for (const trace of traces) {
1750
+ for (const step of trace.steps) {
1751
+ counts[step.stage] = (counts[step.stage] ?? 0) + 1;
1752
+ }
1753
+ }
1754
+ return counts;
1755
+ };
1756
+ var roundTraceAverage = (value, total) => total > 0 ? Number((value / total).toFixed(2)) : 0;
1757
+ var summarizeRetrievalTraces = (traces) => {
1758
+ if (traces.length === 0) {
1759
+ return;
1760
+ }
1761
+ const totalCases = traces.length;
1762
+ const modeSet = new Set;
1763
+ let vectorCases = 0;
1764
+ let lexicalCases = 0;
1765
+ let transformedCases = 0;
1766
+ let variantCases = 0;
1767
+ let finalCountSum = 0;
1768
+ let vectorCountSum = 0;
1769
+ let lexicalCountSum = 0;
1770
+ let candidateTopKSum = 0;
1771
+ let lexicalTopKSum = 0;
1772
+ for (const trace of traces) {
1773
+ modeSet.add(trace.mode);
1774
+ if (trace.runVector) {
1775
+ vectorCases += 1;
1776
+ }
1777
+ if (trace.runLexical) {
1778
+ lexicalCases += 1;
1779
+ }
1780
+ if (trace.transformedQuery !== trace.query) {
1781
+ transformedCases += 1;
1782
+ }
1783
+ if (trace.variantQueries.length > 0) {
1784
+ variantCases += 1;
1785
+ }
1786
+ finalCountSum += trace.resultCounts.final;
1787
+ vectorCountSum += trace.resultCounts.vector;
1788
+ lexicalCountSum += trace.resultCounts.lexical;
1789
+ candidateTopKSum += trace.candidateTopK;
1790
+ lexicalTopKSum += trace.lexicalTopK;
1791
+ }
1792
+ return {
1793
+ averageCandidateTopK: roundTraceAverage(candidateTopKSum, totalCases),
1794
+ averageFinalCount: roundTraceAverage(finalCountSum, totalCases),
1795
+ averageLexicalCount: roundTraceAverage(lexicalCountSum, totalCases),
1796
+ averageLexicalTopK: roundTraceAverage(lexicalTopKSum, totalCases),
1797
+ averageVectorCount: roundTraceAverage(vectorCountSum, totalCases),
1798
+ lexicalCases,
1799
+ modes: Array.from(modeSet),
1800
+ stageCounts: buildTraceStageCounts(traces),
1801
+ totalCases,
1802
+ transformedCases,
1803
+ variantCases,
1804
+ vectorCases
1805
+ };
1806
+ };
1807
+ var evaluateRAGCollectionCases = async ({
1808
+ collection,
1809
+ input,
1810
+ defaultTopK = DEFAULT_TOP_K,
1811
+ rerank,
1812
+ includeTrace = false
1813
+ }) => {
1814
+ if (input.dryRun) {
1815
+ return executeDryRunRAGEvaluation(input, defaultTopK).map((caseResult) => ({
1816
+ caseResult,
1817
+ trace: undefined
1818
+ }));
1819
+ }
1820
+ return Promise.all(input.cases.map(async (caseInput, caseIndex) => {
1821
+ const startedAt = Date.now();
1822
+ const mode = resolveEvaluationMode(caseInput);
1823
+ const query = caseInput.query.trim();
1824
+ const expectedIds = normalizeExpectedIds(mode === "chunkId" ? caseInput.expectedChunkIds ?? [] : mode === "source" ? caseInput.expectedSources ?? [] : caseInput.expectedDocumentIds ?? []);
1825
+ const topK = typeof caseInput.topK === "number" ? caseInput.topK : typeof input.topK === "number" ? input.topK : defaultTopK;
1826
+ const searchInput = {
1827
+ filter: typeof caseInput.filter === "object" ? caseInput.filter : input.filter,
1828
+ model: caseInput.model ?? input.model,
1829
+ query,
1830
+ rerank,
1831
+ scoreThreshold: typeof caseInput.scoreThreshold === "number" ? caseInput.scoreThreshold : input.scoreThreshold,
1832
+ topK
1833
+ };
1834
+ const searchOutcome = includeTrace ? await collection.searchWithTrace(searchInput) : {
1835
+ results: await collection.search(searchInput),
1836
+ trace: undefined
1837
+ };
1838
+ const sources = buildSources(searchOutcome.results);
1839
+ const elapsedMs = Date.now() - startedAt;
1840
+ const retrievedIds = normalizeExpectedIds(sources.map((source) => extractExpectedId(source, mode)));
1841
+ return {
1842
+ caseResult: summarizeRAGEvaluationCase({
1843
+ caseIndex,
1844
+ caseInput: { ...caseInput, topK },
1845
+ elapsedMs,
1846
+ expectedIds,
1847
+ mode,
1848
+ query,
1849
+ retrievedIds
1850
+ }),
1851
+ trace: searchOutcome.trace
1852
+ };
1853
+ }));
1854
+ };
1747
1855
  var buildRAGAnswerGroundingCaseDifficultyLeaderboard = (entries) => {
1748
1856
  const grouped = new Map;
1749
1857
  for (const entry of entries) {
@@ -2379,17 +2487,20 @@ var compareRAGRerankers = async ({
2379
2487
  defaultTopK = DEFAULT_TOP_K
2380
2488
  }) => {
2381
2489
  const entries = await Promise.all(rerankers.map(async (candidate) => {
2382
- const response = await evaluateRAGCollection({
2490
+ const evaluated = await evaluateRAGCollectionCases({
2383
2491
  collection,
2384
2492
  defaultTopK,
2385
2493
  input: suite.input,
2494
+ includeTrace: true,
2386
2495
  rerank: candidate.rerank
2387
2496
  });
2497
+ const response = buildRAGEvaluationResponse(evaluated.map((entry) => entry.caseResult));
2388
2498
  return {
2389
2499
  label: candidate.label ?? candidate.id,
2390
2500
  providerName: typeof candidate.rerank === "function" ? undefined : candidate.rerank?.providerName,
2391
2501
  response,
2392
- rerankerId: candidate.id
2502
+ rerankerId: candidate.id,
2503
+ traceSummary: summarizeRetrievalTraces(evaluated.map((entry) => entry.trace).filter((trace) => Boolean(trace)))
2393
2504
  };
2394
2505
  }));
2395
2506
  const leaderboard = buildRAGEvaluationLeaderboard(entries.map((entry) => ({
@@ -2444,25 +2555,37 @@ var compareRAGRetrievalStrategies = async ({
2444
2555
  defaultTopK = DEFAULT_TOP_K
2445
2556
  }) => {
2446
2557
  const entries = await Promise.all(retrievals.map(async (candidate) => {
2447
- const response = await evaluateRAGCollection({
2558
+ const tracedCollection = {
2559
+ ...collection,
2560
+ search: (input) => collection.search({
2561
+ ...input,
2562
+ queryTransform: candidate.queryTransform ?? input.queryTransform,
2563
+ rerank: candidate.rerank ?? input.rerank,
2564
+ retrieval: candidate.retrieval ?? input.retrieval
2565
+ }),
2566
+ searchWithTrace: (input) => collection.searchWithTrace({
2567
+ ...input,
2568
+ queryTransform: candidate.queryTransform ?? input.queryTransform,
2569
+ rerank: candidate.rerank ?? input.rerank,
2570
+ retrieval: candidate.retrieval ?? input.retrieval
2571
+ })
2572
+ };
2573
+ const evaluated = await evaluateRAGCollectionCases({
2448
2574
  collection: {
2449
- ...collection,
2450
- search: (input) => collection.search({
2451
- ...input,
2452
- queryTransform: candidate.queryTransform ?? input.queryTransform,
2453
- rerank: candidate.rerank ?? input.rerank,
2454
- retrieval: candidate.retrieval ?? input.retrieval
2455
- })
2575
+ ...tracedCollection
2456
2576
  },
2457
2577
  defaultTopK,
2458
2578
  input: suite.input,
2579
+ includeTrace: true,
2459
2580
  rerank: candidate.rerank
2460
2581
  });
2582
+ const response = buildRAGEvaluationResponse(evaluated.map((entry) => entry.caseResult));
2461
2583
  return {
2462
2584
  label: candidate.label ?? candidate.id,
2463
2585
  response,
2464
2586
  retrievalId: candidate.id,
2465
- retrievalMode: resolveRetrievalMode(candidate)
2587
+ retrievalMode: resolveRetrievalMode(candidate),
2588
+ traceSummary: summarizeRetrievalTraces(evaluated.map((entry) => entry.trace).filter((trace) => Boolean(trace)))
2466
2589
  };
2467
2590
  }));
2468
2591
  const leaderboard = buildRAGEvaluationLeaderboard(entries.map((entry) => ({
@@ -2489,37 +2612,14 @@ var evaluateRAGCollection = async ({
2489
2612
  defaultTopK = DEFAULT_TOP_K,
2490
2613
  rerank
2491
2614
  }) => {
2492
- if (input.dryRun) {
2493
- return buildRAGEvaluationResponse(executeDryRunRAGEvaluation(input, defaultTopK));
2494
- }
2495
- const evaluated = await Promise.all(input.cases.map(async (caseInput, caseIndex) => {
2496
- const startedAt = Date.now();
2497
- const mode = resolveEvaluationMode(caseInput);
2498
- const query = caseInput.query.trim();
2499
- const expectedIds = normalizeExpectedIds(mode === "chunkId" ? caseInput.expectedChunkIds ?? [] : mode === "source" ? caseInput.expectedSources ?? [] : caseInput.expectedDocumentIds ?? []);
2500
- const topK = typeof caseInput.topK === "number" ? caseInput.topK : typeof input.topK === "number" ? input.topK : defaultTopK;
2501
- const searchResults = await collection.search({
2502
- filter: typeof caseInput.filter === "object" ? caseInput.filter : input.filter,
2503
- model: caseInput.model ?? input.model,
2504
- query,
2505
- rerank,
2506
- scoreThreshold: typeof caseInput.scoreThreshold === "number" ? caseInput.scoreThreshold : input.scoreThreshold,
2507
- topK
2508
- });
2509
- const sources = buildSources(searchResults);
2510
- const elapsedMs = Date.now() - startedAt;
2511
- const retrievedIds = normalizeExpectedIds(sources.map((source) => extractExpectedId(source, mode)));
2512
- return summarizeRAGEvaluationCase({
2513
- caseIndex,
2514
- caseInput: { ...caseInput, topK },
2515
- elapsedMs,
2516
- expectedIds,
2517
- mode,
2518
- query,
2519
- retrievedIds
2520
- });
2521
- }));
2522
- return buildRAGEvaluationResponse(evaluated);
2615
+ const evaluated = await evaluateRAGCollectionCases({
2616
+ collection,
2617
+ defaultTopK,
2618
+ includeTrace: false,
2619
+ input,
2620
+ rerank
2621
+ });
2622
+ return buildRAGEvaluationResponse(evaluated.map((entry) => entry.caseResult));
2523
2623
  };
2524
2624
  var executeDryRunRAGEvaluation = (input, defaultTopK = DEFAULT_TOP_K) => input.cases.map((caseInput, caseIndex) => {
2525
2625
  const mode = resolveEvaluationMode(caseInput);
@@ -2639,5 +2739,5 @@ export {
2639
2739
  buildRAGAnswerWorkflowState
2640
2740
  };
2641
2741
 
2642
- //# debugId=CBECE8C7471759AC64756E2164756E21
2742
+ //# debugId=9271E9C7FE8F8B9964756E2164756E21
2643
2743
  //# sourceMappingURL=index.js.map