@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.
@@ -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) => {
@@ -1591,8 +1593,19 @@ var createRAGClient = (options) => {
1591
1593
  return parseJson(response);
1592
1594
  },
1593
1595
  async search(input) {
1594
- const result = await this.searchDetailed(input);
1595
- return result.results;
1596
+ const response = await fetchImpl(`${basePath}/search`, {
1597
+ body: JSON.stringify(input),
1598
+ headers: jsonHeaders,
1599
+ method: "POST"
1600
+ });
1601
+ if (!response.ok) {
1602
+ throw new Error(await toErrorMessage(response));
1603
+ }
1604
+ const payload = await parseJson(response);
1605
+ if (!payload.ok) {
1606
+ throw new Error(payload.error ?? "RAG search failed");
1607
+ }
1608
+ return payload.results ?? [];
1596
1609
  },
1597
1610
  async searchDetailed(input) {
1598
1611
  const response = await fetchImpl(`${basePath}/search`, {
@@ -1731,6 +1744,114 @@ var buildRAGAnswerGroundingEvaluationLeaderboard = (runs) => {
1731
1744
  totalCases: run.response.totalCases
1732
1745
  }));
1733
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
+ };
1734
1855
  var buildRAGAnswerGroundingCaseDifficultyLeaderboard = (entries) => {
1735
1856
  const grouped = new Map;
1736
1857
  for (const entry of entries) {
@@ -2366,17 +2487,20 @@ var compareRAGRerankers = async ({
2366
2487
  defaultTopK = DEFAULT_TOP_K
2367
2488
  }) => {
2368
2489
  const entries = await Promise.all(rerankers.map(async (candidate) => {
2369
- const response = await evaluateRAGCollection({
2490
+ const evaluated = await evaluateRAGCollectionCases({
2370
2491
  collection,
2371
2492
  defaultTopK,
2372
2493
  input: suite.input,
2494
+ includeTrace: true,
2373
2495
  rerank: candidate.rerank
2374
2496
  });
2497
+ const response = buildRAGEvaluationResponse(evaluated.map((entry) => entry.caseResult));
2375
2498
  return {
2376
2499
  label: candidate.label ?? candidate.id,
2377
2500
  providerName: typeof candidate.rerank === "function" ? undefined : candidate.rerank?.providerName,
2378
2501
  response,
2379
- rerankerId: candidate.id
2502
+ rerankerId: candidate.id,
2503
+ traceSummary: summarizeRetrievalTraces(evaluated.map((entry) => entry.trace).filter((trace) => Boolean(trace)))
2380
2504
  };
2381
2505
  }));
2382
2506
  const leaderboard = buildRAGEvaluationLeaderboard(entries.map((entry) => ({
@@ -2431,25 +2555,37 @@ var compareRAGRetrievalStrategies = async ({
2431
2555
  defaultTopK = DEFAULT_TOP_K
2432
2556
  }) => {
2433
2557
  const entries = await Promise.all(retrievals.map(async (candidate) => {
2434
- 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({
2435
2574
  collection: {
2436
- ...collection,
2437
- search: (input) => collection.search({
2438
- ...input,
2439
- queryTransform: candidate.queryTransform ?? input.queryTransform,
2440
- rerank: candidate.rerank ?? input.rerank,
2441
- retrieval: candidate.retrieval ?? input.retrieval
2442
- })
2575
+ ...tracedCollection
2443
2576
  },
2444
2577
  defaultTopK,
2445
2578
  input: suite.input,
2579
+ includeTrace: true,
2446
2580
  rerank: candidate.rerank
2447
2581
  });
2582
+ const response = buildRAGEvaluationResponse(evaluated.map((entry) => entry.caseResult));
2448
2583
  return {
2449
2584
  label: candidate.label ?? candidate.id,
2450
2585
  response,
2451
2586
  retrievalId: candidate.id,
2452
- retrievalMode: resolveRetrievalMode(candidate)
2587
+ retrievalMode: resolveRetrievalMode(candidate),
2588
+ traceSummary: summarizeRetrievalTraces(evaluated.map((entry) => entry.trace).filter((trace) => Boolean(trace)))
2453
2589
  };
2454
2590
  }));
2455
2591
  const leaderboard = buildRAGEvaluationLeaderboard(entries.map((entry) => ({
@@ -2476,37 +2612,14 @@ var evaluateRAGCollection = async ({
2476
2612
  defaultTopK = DEFAULT_TOP_K,
2477
2613
  rerank
2478
2614
  }) => {
2479
- if (input.dryRun) {
2480
- return buildRAGEvaluationResponse(executeDryRunRAGEvaluation(input, defaultTopK));
2481
- }
2482
- const evaluated = await Promise.all(input.cases.map(async (caseInput, caseIndex) => {
2483
- const startedAt = Date.now();
2484
- const mode = resolveEvaluationMode(caseInput);
2485
- const query = caseInput.query.trim();
2486
- const expectedIds = normalizeExpectedIds(mode === "chunkId" ? caseInput.expectedChunkIds ?? [] : mode === "source" ? caseInput.expectedSources ?? [] : caseInput.expectedDocumentIds ?? []);
2487
- const topK = typeof caseInput.topK === "number" ? caseInput.topK : typeof input.topK === "number" ? input.topK : defaultTopK;
2488
- const searchResults = await collection.search({
2489
- filter: typeof caseInput.filter === "object" ? caseInput.filter : input.filter,
2490
- model: caseInput.model ?? input.model,
2491
- query,
2492
- rerank,
2493
- scoreThreshold: typeof caseInput.scoreThreshold === "number" ? caseInput.scoreThreshold : input.scoreThreshold,
2494
- topK
2495
- });
2496
- const sources = buildSources(searchResults);
2497
- const elapsedMs = Date.now() - startedAt;
2498
- const retrievedIds = normalizeExpectedIds(sources.map((source) => extractExpectedId(source, mode)));
2499
- return summarizeRAGEvaluationCase({
2500
- caseIndex,
2501
- caseInput: { ...caseInput, topK },
2502
- elapsedMs,
2503
- expectedIds,
2504
- mode,
2505
- query,
2506
- retrievedIds
2507
- });
2508
- }));
2509
- 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));
2510
2623
  };
2511
2624
  var executeDryRunRAGEvaluation = (input, defaultTopK = DEFAULT_TOP_K) => input.cases.map((caseInput, caseIndex) => {
2512
2625
  const mode = resolveEvaluationMode(caseInput);
@@ -3513,5 +3626,5 @@ export {
3513
3626
  AIStreamProvider
3514
3627
  };
3515
3628
 
3516
- //# debugId=63CA4B6008DC331A64756E2164756E21
3629
+ //# debugId=A3847C62324D17B964756E2164756E21
3517
3630
  //# sourceMappingURL=index.js.map