@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.
@@ -1256,6 +1256,20 @@ export type RAGRerankerCandidate = {
1256
1256
  label?: string;
1257
1257
  rerank?: RAGRerankerProviderLike;
1258
1258
  };
1259
+ export type RAGRetrievalTraceComparisonSummary = {
1260
+ totalCases: number;
1261
+ modes: RAGHybridRetrievalMode[];
1262
+ vectorCases: number;
1263
+ lexicalCases: number;
1264
+ transformedCases: number;
1265
+ variantCases: number;
1266
+ averageFinalCount: number;
1267
+ averageVectorCount: number;
1268
+ averageLexicalCount: number;
1269
+ averageCandidateTopK: number;
1270
+ averageLexicalTopK: number;
1271
+ stageCounts: Partial<Record<RAGRetrievalTraceStage, number>>;
1272
+ };
1259
1273
  export type RAGRetrievalCandidate = {
1260
1274
  id: string;
1261
1275
  label?: string;
@@ -1268,6 +1282,7 @@ export type RAGRerankerComparisonEntry = {
1268
1282
  label: string;
1269
1283
  providerName?: string;
1270
1284
  response: RAGEvaluationResponse;
1285
+ traceSummary?: RAGRetrievalTraceComparisonSummary;
1271
1286
  };
1272
1287
  export type RAGRerankerComparisonSummary = {
1273
1288
  bestByPassingRate?: string;
@@ -1286,6 +1301,7 @@ export type RAGRetrievalComparisonEntry = {
1286
1301
  label: string;
1287
1302
  retrievalMode: RAGHybridRetrievalMode;
1288
1303
  response: RAGEvaluationResponse;
1304
+ traceSummary?: RAGRetrievalTraceComparisonSummary;
1289
1305
  };
1290
1306
  export type RAGRetrievalComparisonSummary = {
1291
1307
  bestByPassingRate?: string;
@@ -1500,6 +1516,7 @@ export type AIRetrievedMessage = {
1500
1516
  retrievedAt: number;
1501
1517
  retrievalDurationMs?: number;
1502
1518
  sources: RAGSource[];
1519
+ trace?: RAGRetrievalTrace;
1503
1520
  };
1504
1521
  export type AIServerMessage = AIChunkMessage | AIThinkingMessage | AIToolStatusMessage | AIImageMessage | AICompleteMessage | AIRetrievingMessage | AIRetrievedMessage | AIErrorMessage;
1505
1522
  export type AIRole = 'user' | 'assistant' | 'system';
@@ -1626,6 +1643,7 @@ export type AIStoreAction = {
1626
1643
  retrievedAt: number;
1627
1644
  retrievalDurationMs?: number;
1628
1645
  sources: RAGSource[];
1646
+ trace?: RAGRetrievalTrace;
1629
1647
  } | {
1630
1648
  type: 'send';
1631
1649
  content: string;
@@ -1679,6 +1697,7 @@ export type AIHTMXRenderConfig = {
1679
1697
  retrievalStartedAt?: number;
1680
1698
  retrievedAt?: number;
1681
1699
  retrievalDurationMs?: number;
1700
+ trace?: RAGRetrievalTrace;
1682
1701
  }) => string;
1683
1702
  canceled?: () => string;
1684
1703
  error?: (message: string) => string;
@@ -218,6 +218,7 @@ var serverMessageToAction = (msg) => {
218
218
  retrievalStartedAt: msg.retrievalStartedAt,
219
219
  retrievedAt: msg.retrievedAt,
220
220
  sources: msg.sources,
221
+ trace: msg.trace,
221
222
  type: "rag_retrieved"
222
223
  };
223
224
  case "error":
@@ -485,6 +486,7 @@ var handleRAGRetrieved = (state, action) => {
485
486
  message.retrievalStartedAt = action.retrievalStartedAt ?? message.retrievalStartedAt;
486
487
  message.retrievedAt = action.retrievedAt;
487
488
  message.retrievalDurationMs = action.retrievalDurationMs;
489
+ message.retrievalTrace = action.trace;
488
490
  conversation.messages = [...conversation.messages];
489
491
  };
490
492
  var handleRAGRetrieving = (state, action) => {
@@ -1027,8 +1029,19 @@ var createRAGClient = (options) => {
1027
1029
  return parseJson(response);
1028
1030
  },
1029
1031
  async search(input) {
1030
- const result = await this.searchDetailed(input);
1031
- return result.results;
1032
+ const response = await fetchImpl(`${basePath}/search`, {
1033
+ body: JSON.stringify(input),
1034
+ headers: jsonHeaders,
1035
+ method: "POST"
1036
+ });
1037
+ if (!response.ok) {
1038
+ throw new Error(await toErrorMessage(response));
1039
+ }
1040
+ const payload = await parseJson(response);
1041
+ if (!payload.ok) {
1042
+ throw new Error(payload.error ?? "RAG search failed");
1043
+ }
1044
+ return payload.results ?? [];
1032
1045
  },
1033
1046
  async searchDetailed(input) {
1034
1047
  const response = await fetchImpl(`${basePath}/search`, {
@@ -1755,6 +1768,114 @@ var buildRAGAnswerGroundingEvaluationLeaderboard = (runs) => {
1755
1768
  totalCases: run.response.totalCases
1756
1769
  }));
1757
1770
  };
1771
+ var buildTraceStageCounts = (traces) => {
1772
+ const counts = {};
1773
+ for (const trace of traces) {
1774
+ for (const step of trace.steps) {
1775
+ counts[step.stage] = (counts[step.stage] ?? 0) + 1;
1776
+ }
1777
+ }
1778
+ return counts;
1779
+ };
1780
+ var roundTraceAverage = (value, total) => total > 0 ? Number((value / total).toFixed(2)) : 0;
1781
+ var summarizeRetrievalTraces = (traces) => {
1782
+ if (traces.length === 0) {
1783
+ return;
1784
+ }
1785
+ const totalCases = traces.length;
1786
+ const modeSet = new Set;
1787
+ let vectorCases = 0;
1788
+ let lexicalCases = 0;
1789
+ let transformedCases = 0;
1790
+ let variantCases = 0;
1791
+ let finalCountSum = 0;
1792
+ let vectorCountSum = 0;
1793
+ let lexicalCountSum = 0;
1794
+ let candidateTopKSum = 0;
1795
+ let lexicalTopKSum = 0;
1796
+ for (const trace of traces) {
1797
+ modeSet.add(trace.mode);
1798
+ if (trace.runVector) {
1799
+ vectorCases += 1;
1800
+ }
1801
+ if (trace.runLexical) {
1802
+ lexicalCases += 1;
1803
+ }
1804
+ if (trace.transformedQuery !== trace.query) {
1805
+ transformedCases += 1;
1806
+ }
1807
+ if (trace.variantQueries.length > 0) {
1808
+ variantCases += 1;
1809
+ }
1810
+ finalCountSum += trace.resultCounts.final;
1811
+ vectorCountSum += trace.resultCounts.vector;
1812
+ lexicalCountSum += trace.resultCounts.lexical;
1813
+ candidateTopKSum += trace.candidateTopK;
1814
+ lexicalTopKSum += trace.lexicalTopK;
1815
+ }
1816
+ return {
1817
+ averageCandidateTopK: roundTraceAverage(candidateTopKSum, totalCases),
1818
+ averageFinalCount: roundTraceAverage(finalCountSum, totalCases),
1819
+ averageLexicalCount: roundTraceAverage(lexicalCountSum, totalCases),
1820
+ averageLexicalTopK: roundTraceAverage(lexicalTopKSum, totalCases),
1821
+ averageVectorCount: roundTraceAverage(vectorCountSum, totalCases),
1822
+ lexicalCases,
1823
+ modes: Array.from(modeSet),
1824
+ stageCounts: buildTraceStageCounts(traces),
1825
+ totalCases,
1826
+ transformedCases,
1827
+ variantCases,
1828
+ vectorCases
1829
+ };
1830
+ };
1831
+ var evaluateRAGCollectionCases = async ({
1832
+ collection,
1833
+ input,
1834
+ defaultTopK = DEFAULT_TOP_K,
1835
+ rerank,
1836
+ includeTrace = false
1837
+ }) => {
1838
+ if (input.dryRun) {
1839
+ return executeDryRunRAGEvaluation(input, defaultTopK).map((caseResult) => ({
1840
+ caseResult,
1841
+ trace: undefined
1842
+ }));
1843
+ }
1844
+ return Promise.all(input.cases.map(async (caseInput, caseIndex) => {
1845
+ const startedAt = Date.now();
1846
+ const mode = resolveEvaluationMode(caseInput);
1847
+ const query = caseInput.query.trim();
1848
+ const expectedIds = normalizeExpectedIds(mode === "chunkId" ? caseInput.expectedChunkIds ?? [] : mode === "source" ? caseInput.expectedSources ?? [] : caseInput.expectedDocumentIds ?? []);
1849
+ const topK = typeof caseInput.topK === "number" ? caseInput.topK : typeof input.topK === "number" ? input.topK : defaultTopK;
1850
+ const searchInput = {
1851
+ filter: typeof caseInput.filter === "object" ? caseInput.filter : input.filter,
1852
+ model: caseInput.model ?? input.model,
1853
+ query,
1854
+ rerank,
1855
+ scoreThreshold: typeof caseInput.scoreThreshold === "number" ? caseInput.scoreThreshold : input.scoreThreshold,
1856
+ topK
1857
+ };
1858
+ const searchOutcome = includeTrace ? await collection.searchWithTrace(searchInput) : {
1859
+ results: await collection.search(searchInput),
1860
+ trace: undefined
1861
+ };
1862
+ const sources = buildSources(searchOutcome.results);
1863
+ const elapsedMs = Date.now() - startedAt;
1864
+ const retrievedIds = normalizeExpectedIds(sources.map((source) => extractExpectedId(source, mode)));
1865
+ return {
1866
+ caseResult: summarizeRAGEvaluationCase({
1867
+ caseIndex,
1868
+ caseInput: { ...caseInput, topK },
1869
+ elapsedMs,
1870
+ expectedIds,
1871
+ mode,
1872
+ query,
1873
+ retrievedIds
1874
+ }),
1875
+ trace: searchOutcome.trace
1876
+ };
1877
+ }));
1878
+ };
1758
1879
  var buildRAGAnswerGroundingCaseDifficultyLeaderboard = (entries) => {
1759
1880
  const grouped = new Map;
1760
1881
  for (const entry of entries) {
@@ -2390,17 +2511,20 @@ var compareRAGRerankers = async ({
2390
2511
  defaultTopK = DEFAULT_TOP_K
2391
2512
  }) => {
2392
2513
  const entries = await Promise.all(rerankers.map(async (candidate) => {
2393
- const response = await evaluateRAGCollection({
2514
+ const evaluated = await evaluateRAGCollectionCases({
2394
2515
  collection,
2395
2516
  defaultTopK,
2396
2517
  input: suite.input,
2518
+ includeTrace: true,
2397
2519
  rerank: candidate.rerank
2398
2520
  });
2521
+ const response = buildRAGEvaluationResponse(evaluated.map((entry) => entry.caseResult));
2399
2522
  return {
2400
2523
  label: candidate.label ?? candidate.id,
2401
2524
  providerName: typeof candidate.rerank === "function" ? undefined : candidate.rerank?.providerName,
2402
2525
  response,
2403
- rerankerId: candidate.id
2526
+ rerankerId: candidate.id,
2527
+ traceSummary: summarizeRetrievalTraces(evaluated.map((entry) => entry.trace).filter((trace) => Boolean(trace)))
2404
2528
  };
2405
2529
  }));
2406
2530
  const leaderboard = buildRAGEvaluationLeaderboard(entries.map((entry) => ({
@@ -2455,25 +2579,37 @@ var compareRAGRetrievalStrategies = async ({
2455
2579
  defaultTopK = DEFAULT_TOP_K
2456
2580
  }) => {
2457
2581
  const entries = await Promise.all(retrievals.map(async (candidate) => {
2458
- const response = await evaluateRAGCollection({
2582
+ const tracedCollection = {
2583
+ ...collection,
2584
+ search: (input) => collection.search({
2585
+ ...input,
2586
+ queryTransform: candidate.queryTransform ?? input.queryTransform,
2587
+ rerank: candidate.rerank ?? input.rerank,
2588
+ retrieval: candidate.retrieval ?? input.retrieval
2589
+ }),
2590
+ searchWithTrace: (input) => collection.searchWithTrace({
2591
+ ...input,
2592
+ queryTransform: candidate.queryTransform ?? input.queryTransform,
2593
+ rerank: candidate.rerank ?? input.rerank,
2594
+ retrieval: candidate.retrieval ?? input.retrieval
2595
+ })
2596
+ };
2597
+ const evaluated = await evaluateRAGCollectionCases({
2459
2598
  collection: {
2460
- ...collection,
2461
- search: (input) => collection.search({
2462
- ...input,
2463
- queryTransform: candidate.queryTransform ?? input.queryTransform,
2464
- rerank: candidate.rerank ?? input.rerank,
2465
- retrieval: candidate.retrieval ?? input.retrieval
2466
- })
2599
+ ...tracedCollection
2467
2600
  },
2468
2601
  defaultTopK,
2469
2602
  input: suite.input,
2603
+ includeTrace: true,
2470
2604
  rerank: candidate.rerank
2471
2605
  });
2606
+ const response = buildRAGEvaluationResponse(evaluated.map((entry) => entry.caseResult));
2472
2607
  return {
2473
2608
  label: candidate.label ?? candidate.id,
2474
2609
  response,
2475
2610
  retrievalId: candidate.id,
2476
- retrievalMode: resolveRetrievalMode(candidate)
2611
+ retrievalMode: resolveRetrievalMode(candidate),
2612
+ traceSummary: summarizeRetrievalTraces(evaluated.map((entry) => entry.trace).filter((trace) => Boolean(trace)))
2477
2613
  };
2478
2614
  }));
2479
2615
  const leaderboard = buildRAGEvaluationLeaderboard(entries.map((entry) => ({
@@ -2500,37 +2636,14 @@ var evaluateRAGCollection = async ({
2500
2636
  defaultTopK = DEFAULT_TOP_K,
2501
2637
  rerank
2502
2638
  }) => {
2503
- if (input.dryRun) {
2504
- return buildRAGEvaluationResponse(executeDryRunRAGEvaluation(input, defaultTopK));
2505
- }
2506
- const evaluated = await Promise.all(input.cases.map(async (caseInput, caseIndex) => {
2507
- const startedAt = Date.now();
2508
- const mode = resolveEvaluationMode(caseInput);
2509
- const query = caseInput.query.trim();
2510
- const expectedIds = normalizeExpectedIds(mode === "chunkId" ? caseInput.expectedChunkIds ?? [] : mode === "source" ? caseInput.expectedSources ?? [] : caseInput.expectedDocumentIds ?? []);
2511
- const topK = typeof caseInput.topK === "number" ? caseInput.topK : typeof input.topK === "number" ? input.topK : defaultTopK;
2512
- const searchResults = await collection.search({
2513
- filter: typeof caseInput.filter === "object" ? caseInput.filter : input.filter,
2514
- model: caseInput.model ?? input.model,
2515
- query,
2516
- rerank,
2517
- scoreThreshold: typeof caseInput.scoreThreshold === "number" ? caseInput.scoreThreshold : input.scoreThreshold,
2518
- topK
2519
- });
2520
- const sources = buildSources(searchResults);
2521
- const elapsedMs = Date.now() - startedAt;
2522
- const retrievedIds = normalizeExpectedIds(sources.map((source) => extractExpectedId(source, mode)));
2523
- return summarizeRAGEvaluationCase({
2524
- caseIndex,
2525
- caseInput: { ...caseInput, topK },
2526
- elapsedMs,
2527
- expectedIds,
2528
- mode,
2529
- query,
2530
- retrievedIds
2531
- });
2532
- }));
2533
- return buildRAGEvaluationResponse(evaluated);
2639
+ const evaluated = await evaluateRAGCollectionCases({
2640
+ collection,
2641
+ defaultTopK,
2642
+ includeTrace: false,
2643
+ input,
2644
+ rerank
2645
+ });
2646
+ return buildRAGEvaluationResponse(evaluated.map((entry) => entry.caseResult));
2534
2647
  };
2535
2648
  var executeDryRunRAGEvaluation = (input, defaultTopK = DEFAULT_TOP_K) => input.cases.map((caseInput, caseIndex) => {
2536
2649
  const mode = resolveEvaluationMode(caseInput);
@@ -3289,5 +3402,5 @@ export {
3289
3402
  AIStreamKey
3290
3403
  };
3291
3404
 
3292
- //# debugId=4CD93E092D2A92E664756E2164756E21
3405
+ //# debugId=28BD639F9F0C6C1364756E2164756E21
3293
3406
  //# sourceMappingURL=index.js.map