@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.
package/dist/ai/index.js CHANGED
@@ -1823,7 +1823,13 @@ var defaultComplete = (usage, durationMs, model) => {
1823
1823
  var defaultError = (message) => `<div class="ai-error">${escapeHtml(message)}</div>`;
1824
1824
  var defaultCanceled = () => `<div class="ai-canceled">Canceled.</div>`;
1825
1825
  var defaultRAGRetrieving = () => `<div class="ai-retrieving">Retrieving sources...</div>`;
1826
- var defaultRAGRetrieved = (sources) => sources.length === 0 ? "" : `<div class="ai-sources">` + `<h4>Citations</h4>` + `<ul>` + `${sources.map((source) => `<li>[${source.chunkId}] ${escapeHtml(source.text)}${source.source ? ` (${escapeHtml(source.source)})` : ""}</li>`).join("")}` + `</ul>` + `</div>`;
1826
+ var renderTraceSummary = (trace) => {
1827
+ if (!trace) {
1828
+ return "";
1829
+ }
1830
+ return `<div class="ai-trace-summary">` + `Mode: ${escapeHtml(trace.mode)} \xB7 Final: ${trace.resultCounts.final} \xB7 Vector: ${trace.resultCounts.vector} \xB7 Lexical: ${trace.resultCounts.lexical}` + `</div>`;
1831
+ };
1832
+ var defaultRAGRetrieved = (sources, input) => sources.length === 0 ? "" : `<div class="ai-sources">` + `<h4>Citations</h4>` + renderTraceSummary(input?.trace) + `<ul>` + `${sources.map((source) => `<li>[${source.chunkId}] ${escapeHtml(source.text)}${source.source ? ` (${escapeHtml(source.source)})` : ""}</li>`).join("")}` + `</ul>` + `</div>`;
1827
1833
  var resolveRenderers = (custom) => ({
1828
1834
  chunk: custom?.chunk ?? defaultChunk,
1829
1835
  messageStart: custom?.messageStart ?? defaultMessageStart,
@@ -5285,6 +5291,114 @@ var buildRAGAnswerGroundingEvaluationLeaderboard = (runs) => {
5285
5291
  totalCases: run.response.totalCases
5286
5292
  }));
5287
5293
  };
5294
+ var buildTraceStageCounts = (traces) => {
5295
+ const counts = {};
5296
+ for (const trace of traces) {
5297
+ for (const step of trace.steps) {
5298
+ counts[step.stage] = (counts[step.stage] ?? 0) + 1;
5299
+ }
5300
+ }
5301
+ return counts;
5302
+ };
5303
+ var roundTraceAverage = (value, total) => total > 0 ? Number((value / total).toFixed(2)) : 0;
5304
+ var summarizeRetrievalTraces = (traces) => {
5305
+ if (traces.length === 0) {
5306
+ return;
5307
+ }
5308
+ const totalCases = traces.length;
5309
+ const modeSet = new Set;
5310
+ let vectorCases = 0;
5311
+ let lexicalCases = 0;
5312
+ let transformedCases = 0;
5313
+ let variantCases = 0;
5314
+ let finalCountSum = 0;
5315
+ let vectorCountSum = 0;
5316
+ let lexicalCountSum = 0;
5317
+ let candidateTopKSum = 0;
5318
+ let lexicalTopKSum = 0;
5319
+ for (const trace of traces) {
5320
+ modeSet.add(trace.mode);
5321
+ if (trace.runVector) {
5322
+ vectorCases += 1;
5323
+ }
5324
+ if (trace.runLexical) {
5325
+ lexicalCases += 1;
5326
+ }
5327
+ if (trace.transformedQuery !== trace.query) {
5328
+ transformedCases += 1;
5329
+ }
5330
+ if (trace.variantQueries.length > 0) {
5331
+ variantCases += 1;
5332
+ }
5333
+ finalCountSum += trace.resultCounts.final;
5334
+ vectorCountSum += trace.resultCounts.vector;
5335
+ lexicalCountSum += trace.resultCounts.lexical;
5336
+ candidateTopKSum += trace.candidateTopK;
5337
+ lexicalTopKSum += trace.lexicalTopK;
5338
+ }
5339
+ return {
5340
+ averageCandidateTopK: roundTraceAverage(candidateTopKSum, totalCases),
5341
+ averageFinalCount: roundTraceAverage(finalCountSum, totalCases),
5342
+ averageLexicalCount: roundTraceAverage(lexicalCountSum, totalCases),
5343
+ averageLexicalTopK: roundTraceAverage(lexicalTopKSum, totalCases),
5344
+ averageVectorCount: roundTraceAverage(vectorCountSum, totalCases),
5345
+ lexicalCases,
5346
+ modes: Array.from(modeSet),
5347
+ stageCounts: buildTraceStageCounts(traces),
5348
+ totalCases,
5349
+ transformedCases,
5350
+ variantCases,
5351
+ vectorCases
5352
+ };
5353
+ };
5354
+ var evaluateRAGCollectionCases = async ({
5355
+ collection,
5356
+ input,
5357
+ defaultTopK = DEFAULT_TOP_K2,
5358
+ rerank,
5359
+ includeTrace = false
5360
+ }) => {
5361
+ if (input.dryRun) {
5362
+ return executeDryRunRAGEvaluation(input, defaultTopK).map((caseResult) => ({
5363
+ caseResult,
5364
+ trace: undefined
5365
+ }));
5366
+ }
5367
+ return Promise.all(input.cases.map(async (caseInput, caseIndex) => {
5368
+ const startedAt = Date.now();
5369
+ const mode = resolveEvaluationMode(caseInput);
5370
+ const query = caseInput.query.trim();
5371
+ const expectedIds = normalizeExpectedIds(mode === "chunkId" ? caseInput.expectedChunkIds ?? [] : mode === "source" ? caseInput.expectedSources ?? [] : caseInput.expectedDocumentIds ?? []);
5372
+ const topK = typeof caseInput.topK === "number" ? caseInput.topK : typeof input.topK === "number" ? input.topK : defaultTopK;
5373
+ const searchInput = {
5374
+ filter: typeof caseInput.filter === "object" ? caseInput.filter : input.filter,
5375
+ model: caseInput.model ?? input.model,
5376
+ query,
5377
+ rerank,
5378
+ scoreThreshold: typeof caseInput.scoreThreshold === "number" ? caseInput.scoreThreshold : input.scoreThreshold,
5379
+ topK
5380
+ };
5381
+ const searchOutcome = includeTrace ? await collection.searchWithTrace(searchInput) : {
5382
+ results: await collection.search(searchInput),
5383
+ trace: undefined
5384
+ };
5385
+ const sources = buildSources(searchOutcome.results);
5386
+ const elapsedMs = Date.now() - startedAt;
5387
+ const retrievedIds = normalizeExpectedIds(sources.map((source) => extractExpectedId(source, mode)));
5388
+ return {
5389
+ caseResult: summarizeRAGEvaluationCase({
5390
+ caseIndex,
5391
+ caseInput: { ...caseInput, topK },
5392
+ elapsedMs,
5393
+ expectedIds,
5394
+ mode,
5395
+ query,
5396
+ retrievedIds
5397
+ }),
5398
+ trace: searchOutcome.trace
5399
+ };
5400
+ }));
5401
+ };
5288
5402
  var buildRAGAnswerGroundingCaseDifficultyLeaderboard = (entries) => {
5289
5403
  const grouped = new Map;
5290
5404
  for (const entry of entries) {
@@ -5920,17 +6034,20 @@ var compareRAGRerankers = async ({
5920
6034
  defaultTopK = DEFAULT_TOP_K2
5921
6035
  }) => {
5922
6036
  const entries = await Promise.all(rerankers.map(async (candidate) => {
5923
- const response = await evaluateRAGCollection({
6037
+ const evaluated = await evaluateRAGCollectionCases({
5924
6038
  collection,
5925
6039
  defaultTopK,
5926
6040
  input: suite.input,
6041
+ includeTrace: true,
5927
6042
  rerank: candidate.rerank
5928
6043
  });
6044
+ const response = buildRAGEvaluationResponse(evaluated.map((entry) => entry.caseResult));
5929
6045
  return {
5930
6046
  label: candidate.label ?? candidate.id,
5931
6047
  providerName: typeof candidate.rerank === "function" ? undefined : candidate.rerank?.providerName,
5932
6048
  response,
5933
- rerankerId: candidate.id
6049
+ rerankerId: candidate.id,
6050
+ traceSummary: summarizeRetrievalTraces(evaluated.map((entry) => entry.trace).filter((trace) => Boolean(trace)))
5934
6051
  };
5935
6052
  }));
5936
6053
  const leaderboard = buildRAGEvaluationLeaderboard(entries.map((entry) => ({
@@ -5985,25 +6102,37 @@ var compareRAGRetrievalStrategies = async ({
5985
6102
  defaultTopK = DEFAULT_TOP_K2
5986
6103
  }) => {
5987
6104
  const entries = await Promise.all(retrievals.map(async (candidate) => {
5988
- const response = await evaluateRAGCollection({
6105
+ const tracedCollection = {
6106
+ ...collection,
6107
+ search: (input) => collection.search({
6108
+ ...input,
6109
+ queryTransform: candidate.queryTransform ?? input.queryTransform,
6110
+ rerank: candidate.rerank ?? input.rerank,
6111
+ retrieval: candidate.retrieval ?? input.retrieval
6112
+ }),
6113
+ searchWithTrace: (input) => collection.searchWithTrace({
6114
+ ...input,
6115
+ queryTransform: candidate.queryTransform ?? input.queryTransform,
6116
+ rerank: candidate.rerank ?? input.rerank,
6117
+ retrieval: candidate.retrieval ?? input.retrieval
6118
+ })
6119
+ };
6120
+ const evaluated = await evaluateRAGCollectionCases({
5989
6121
  collection: {
5990
- ...collection,
5991
- search: (input) => collection.search({
5992
- ...input,
5993
- queryTransform: candidate.queryTransform ?? input.queryTransform,
5994
- rerank: candidate.rerank ?? input.rerank,
5995
- retrieval: candidate.retrieval ?? input.retrieval
5996
- })
6122
+ ...tracedCollection
5997
6123
  },
5998
6124
  defaultTopK,
5999
6125
  input: suite.input,
6126
+ includeTrace: true,
6000
6127
  rerank: candidate.rerank
6001
6128
  });
6129
+ const response = buildRAGEvaluationResponse(evaluated.map((entry) => entry.caseResult));
6002
6130
  return {
6003
6131
  label: candidate.label ?? candidate.id,
6004
6132
  response,
6005
6133
  retrievalId: candidate.id,
6006
- retrievalMode: resolveRetrievalMode(candidate)
6134
+ retrievalMode: resolveRetrievalMode(candidate),
6135
+ traceSummary: summarizeRetrievalTraces(evaluated.map((entry) => entry.trace).filter((trace) => Boolean(trace)))
6007
6136
  };
6008
6137
  }));
6009
6138
  const leaderboard = buildRAGEvaluationLeaderboard(entries.map((entry) => ({
@@ -6030,37 +6159,14 @@ var evaluateRAGCollection = async ({
6030
6159
  defaultTopK = DEFAULT_TOP_K2,
6031
6160
  rerank
6032
6161
  }) => {
6033
- if (input.dryRun) {
6034
- return buildRAGEvaluationResponse(executeDryRunRAGEvaluation(input, defaultTopK));
6035
- }
6036
- const evaluated = await Promise.all(input.cases.map(async (caseInput, caseIndex) => {
6037
- const startedAt = Date.now();
6038
- const mode = resolveEvaluationMode(caseInput);
6039
- const query = caseInput.query.trim();
6040
- const expectedIds = normalizeExpectedIds(mode === "chunkId" ? caseInput.expectedChunkIds ?? [] : mode === "source" ? caseInput.expectedSources ?? [] : caseInput.expectedDocumentIds ?? []);
6041
- const topK = typeof caseInput.topK === "number" ? caseInput.topK : typeof input.topK === "number" ? input.topK : defaultTopK;
6042
- const searchResults = await collection.search({
6043
- filter: typeof caseInput.filter === "object" ? caseInput.filter : input.filter,
6044
- model: caseInput.model ?? input.model,
6045
- query,
6046
- rerank,
6047
- scoreThreshold: typeof caseInput.scoreThreshold === "number" ? caseInput.scoreThreshold : input.scoreThreshold,
6048
- topK
6049
- });
6050
- const sources = buildSources(searchResults);
6051
- const elapsedMs = Date.now() - startedAt;
6052
- const retrievedIds = normalizeExpectedIds(sources.map((source) => extractExpectedId(source, mode)));
6053
- return summarizeRAGEvaluationCase({
6054
- caseIndex,
6055
- caseInput: { ...caseInput, topK },
6056
- elapsedMs,
6057
- expectedIds,
6058
- mode,
6059
- query,
6060
- retrievedIds
6061
- });
6062
- }));
6063
- return buildRAGEvaluationResponse(evaluated);
6162
+ const evaluated = await evaluateRAGCollectionCases({
6163
+ collection,
6164
+ defaultTopK,
6165
+ includeTrace: false,
6166
+ input,
6167
+ rerank
6168
+ });
6169
+ return buildRAGEvaluationResponse(evaluated.map((entry) => entry.caseResult));
6064
6170
  };
6065
6171
  var executeDryRunRAGEvaluation = (input, defaultTopK = DEFAULT_TOP_K2) => input.cases.map((caseInput, caseIndex) => {
6066
6172
  const mode = resolveEvaluationMode(caseInput);
@@ -7514,7 +7620,7 @@ var ragChat = (config) => {
7514
7620
  event: "retrieval"
7515
7621
  };
7516
7622
  const provider = config.provider(providerName);
7517
- const { ragContext, sources } = await buildRAGContextFromQuery(config, topK, scoreThreshold, content, ragModel, config.embedding, config.embeddingModel);
7623
+ const { ragContext, sources, trace } = await buildRAGContextFromQuery(config, topK, scoreThreshold, content, ragModel, config.embedding, config.embeddingModel);
7518
7624
  const retrievedAt = Date.now();
7519
7625
  const retrievalDurationMs = retrievedAt - retrievalStartedAt;
7520
7626
  yield {
@@ -7527,7 +7633,8 @@ var ragChat = (config) => {
7527
7633
  messageId,
7528
7634
  retrievalDurationMs,
7529
7635
  retrievalStartedAt,
7530
- retrievedAt
7636
+ retrievedAt,
7637
+ trace
7531
7638
  }),
7532
7639
  event: "sources"
7533
7640
  };
@@ -10245,6 +10352,7 @@ var serverMessageToAction = (msg) => {
10245
10352
  retrievalStartedAt: msg.retrievalStartedAt,
10246
10353
  retrievedAt: msg.retrievedAt,
10247
10354
  sources: msg.sources,
10355
+ trace: msg.trace,
10248
10356
  type: "rag_retrieved"
10249
10357
  };
10250
10358
  case "error":
@@ -10512,6 +10620,7 @@ var handleRAGRetrieved = (state, action) => {
10512
10620
  message.retrievalStartedAt = action.retrievalStartedAt ?? message.retrievalStartedAt;
10513
10621
  message.retrievedAt = action.retrievedAt;
10514
10622
  message.retrievalDurationMs = action.retrievalDurationMs;
10623
+ message.retrievalTrace = action.trace;
10515
10624
  conversation.messages = [...conversation.messages];
10516
10625
  };
10517
10626
  var handleRAGRetrieving = (state, action) => {
@@ -11102,8 +11211,19 @@ var createRAGClient = (options) => {
11102
11211
  return parseJson(response);
11103
11212
  },
11104
11213
  async search(input) {
11105
- const result = await this.searchDetailed(input);
11106
- return result.results;
11214
+ const response = await fetchImpl(`${basePath}/search`, {
11215
+ body: JSON.stringify(input),
11216
+ headers: jsonHeaders,
11217
+ method: "POST"
11218
+ });
11219
+ if (!response.ok) {
11220
+ throw new Error(await toErrorMessage3(response));
11221
+ }
11222
+ const payload = await parseJson(response);
11223
+ if (!payload.ok) {
11224
+ throw new Error(payload.error ?? "RAG search failed");
11225
+ }
11226
+ return payload.results ?? [];
11107
11227
  },
11108
11228
  async searchDetailed(input) {
11109
11229
  const response = await fetchImpl(`${basePath}/search`, {
@@ -11283,5 +11403,5 @@ export {
11283
11403
  aiChat
11284
11404
  };
11285
11405
 
11286
- //# debugId=A637A580CF9E784264756E2164756E21
11406
+ //# debugId=3553069554C7849B64756E2164756E21
11287
11407
  //# sourceMappingURL=index.js.map