@librechat/agents 3.4.1 → 3.4.2

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.
Files changed (128) hide show
  1. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  2. package/dist/cjs/graphs/Graph.cjs +57 -33
  3. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  4. package/dist/cjs/graphs/MultiAgentGraph.cjs +81 -33
  5. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
  6. package/dist/cjs/graphs/applyGraphRuntimeConfig.cjs +14 -0
  7. package/dist/cjs/graphs/applyGraphRuntimeConfig.cjs.map +1 -0
  8. package/dist/cjs/graphs/createGraph.cjs +15 -0
  9. package/dist/cjs/graphs/createGraph.cjs.map +1 -0
  10. package/dist/cjs/graphs/index.cjs +1 -0
  11. package/dist/cjs/hooks/createWorkspacePolicyHook.cjs +1 -1
  12. package/dist/cjs/main.cjs +20 -11
  13. package/dist/cjs/run.cjs +48 -38
  14. package/dist/cjs/run.cjs.map +1 -1
  15. package/dist/cjs/session/JsonlSessionStore.cjs +2 -2
  16. package/dist/cjs/tools/SubagentTool.cjs +4 -4
  17. package/dist/cjs/tools/SubagentTool.cjs.map +1 -1
  18. package/dist/cjs/tools/ToolNode.cjs +13 -9
  19. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  20. package/dist/cjs/tools/eagerEventExecution.cjs +1 -0
  21. package/dist/cjs/tools/local/LocalExecutionEngine.cjs +3 -3
  22. package/dist/cjs/tools/local/LocalProgrammaticToolCalling.cjs +2 -2
  23. package/dist/cjs/tools/search/rerankers.cjs +154 -1
  24. package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
  25. package/dist/cjs/tools/search/tool.cjs +4 -1
  26. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  27. package/dist/cjs/tools/subagent/SubagentExecutionRegistry.cjs +601 -0
  28. package/dist/cjs/tools/subagent/SubagentExecutionRegistry.cjs.map +1 -0
  29. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +672 -343
  30. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
  31. package/dist/cjs/tools/subagent/SubagentReplay.cjs +3 -1
  32. package/dist/cjs/tools/subagent/SubagentReplay.cjs.map +1 -1
  33. package/dist/cjs/tools/subagent/childGraphConfig.cjs +278 -0
  34. package/dist/cjs/tools/subagent/childGraphConfig.cjs.map +1 -0
  35. package/dist/cjs/tools/subagent/index.cjs +1 -0
  36. package/dist/cjs/tools/subagent/runtimeLimits.cjs +5 -0
  37. package/dist/cjs/tools/subagent/runtimeLimits.cjs.map +1 -0
  38. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  39. package/dist/esm/graphs/Graph.mjs +57 -33
  40. package/dist/esm/graphs/Graph.mjs.map +1 -1
  41. package/dist/esm/graphs/MultiAgentGraph.mjs +81 -33
  42. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  43. package/dist/esm/graphs/applyGraphRuntimeConfig.mjs +14 -0
  44. package/dist/esm/graphs/applyGraphRuntimeConfig.mjs.map +1 -0
  45. package/dist/esm/graphs/createGraph.mjs +15 -0
  46. package/dist/esm/graphs/createGraph.mjs.map +1 -0
  47. package/dist/esm/graphs/index.mjs +1 -0
  48. package/dist/esm/hooks/createWorkspacePolicyHook.mjs +1 -1
  49. package/dist/esm/main.mjs +12 -10
  50. package/dist/esm/run.mjs +48 -38
  51. package/dist/esm/run.mjs.map +1 -1
  52. package/dist/esm/session/JsonlSessionStore.mjs +2 -2
  53. package/dist/esm/tools/SubagentTool.mjs +4 -4
  54. package/dist/esm/tools/SubagentTool.mjs.map +1 -1
  55. package/dist/esm/tools/ToolNode.mjs +13 -9
  56. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  57. package/dist/esm/tools/eagerEventExecution.mjs +1 -1
  58. package/dist/esm/tools/local/LocalExecutionEngine.mjs +3 -3
  59. package/dist/esm/tools/local/LocalProgrammaticToolCalling.mjs +2 -2
  60. package/dist/esm/tools/search/rerankers.mjs +154 -1
  61. package/dist/esm/tools/search/rerankers.mjs.map +1 -1
  62. package/dist/esm/tools/search/tool.mjs +4 -1
  63. package/dist/esm/tools/search/tool.mjs.map +1 -1
  64. package/dist/esm/tools/subagent/SubagentExecutionRegistry.mjs +597 -0
  65. package/dist/esm/tools/subagent/SubagentExecutionRegistry.mjs.map +1 -0
  66. package/dist/esm/tools/subagent/SubagentExecutor.mjs +672 -343
  67. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
  68. package/dist/esm/tools/subagent/SubagentReplay.mjs +3 -1
  69. package/dist/esm/tools/subagent/SubagentReplay.mjs.map +1 -1
  70. package/dist/esm/tools/subagent/childGraphConfig.mjs +272 -0
  71. package/dist/esm/tools/subagent/childGraphConfig.mjs.map +1 -0
  72. package/dist/esm/tools/subagent/index.mjs +1 -0
  73. package/dist/esm/tools/subagent/runtimeLimits.mjs +5 -0
  74. package/dist/esm/tools/subagent/runtimeLimits.mjs.map +1 -0
  75. package/dist/types/agents/AgentContext.d.ts +1 -1
  76. package/dist/types/graphs/Graph.d.ts +7 -2
  77. package/dist/types/graphs/MultiAgentGraph.d.ts +7 -1
  78. package/dist/types/graphs/applyGraphRuntimeConfig.d.ts +3 -0
  79. package/dist/types/graphs/createGraph.d.ts +13 -0
  80. package/dist/types/graphs/graphFactory.d.ts +13 -0
  81. package/dist/types/graphs/index.d.ts +2 -0
  82. package/dist/types/run.d.ts +2 -2
  83. package/dist/types/tools/SubagentTool.d.ts +1 -1
  84. package/dist/types/tools/search/rerankers.d.ts +28 -0
  85. package/dist/types/tools/search/types.d.ts +38 -1
  86. package/dist/types/tools/subagent/SubagentExecutionRegistry.d.ts +171 -0
  87. package/dist/types/tools/subagent/SubagentExecutor.d.ts +32 -37
  88. package/dist/types/tools/subagent/SubagentReplay.d.ts +5 -1
  89. package/dist/types/tools/subagent/childGraphConfig.d.ts +37 -0
  90. package/dist/types/tools/subagent/index.d.ts +1 -1
  91. package/dist/types/tools/subagent/runtimeLimits.d.ts +4 -0
  92. package/dist/types/types/graph.d.ts +184 -19
  93. package/package.json +3 -1
  94. package/src/agents/AgentContext.ts +1 -1
  95. package/src/graphs/Graph.ts +111 -60
  96. package/src/graphs/MultiAgentGraph.ts +149 -47
  97. package/src/graphs/__tests__/MultiAgentGraph.test.ts +86 -0
  98. package/src/graphs/__tests__/composition.smoke.test.ts +152 -0
  99. package/src/graphs/__tests__/createGraph.test.ts +206 -0
  100. package/src/graphs/applyGraphRuntimeConfig.ts +25 -0
  101. package/src/graphs/createGraph.ts +32 -0
  102. package/src/graphs/graphFactory.ts +12 -0
  103. package/src/graphs/index.ts +2 -0
  104. package/src/run.ts +50 -38
  105. package/src/specs/graph-subagent.live.test.ts +242 -0
  106. package/src/specs/graph-subagent.test.ts +322 -0
  107. package/src/specs/langfuse-routing.integration.test.ts +120 -1
  108. package/src/specs/subagent.test.ts +130 -4
  109. package/src/tools/SubagentTool.ts +4 -4
  110. package/src/tools/ToolNode.ts +22 -10
  111. package/src/tools/__tests__/SubagentExecutor.test.ts +198 -9
  112. package/src/tools/__tests__/SubagentReplay.test.ts +29 -0
  113. package/src/tools/__tests__/directToolHITLResumeScope.test.ts +28 -2
  114. package/src/tools/__tests__/subagentHooks.test.ts +90 -3
  115. package/src/tools/search/rag-api-reranker.test.ts +891 -0
  116. package/src/tools/search/rerankers.ts +260 -0
  117. package/src/tools/search/tool.ts +6 -0
  118. package/src/tools/search/types.ts +45 -1
  119. package/src/tools/subagent/SubagentExecutionRegistry.ts +1159 -0
  120. package/src/tools/subagent/SubagentExecutor.ts +1245 -563
  121. package/src/tools/subagent/SubagentReplay.ts +10 -1
  122. package/src/tools/subagent/__tests__/SubagentExecutionRegistry.test.ts +637 -0
  123. package/src/tools/subagent/__tests__/SubagentExecutor.lazy.test.ts +3054 -0
  124. package/src/tools/subagent/__tests__/childGraphConfig.test.ts +521 -0
  125. package/src/tools/subagent/childGraphConfig.ts +694 -0
  126. package/src/tools/subagent/index.ts +6 -0
  127. package/src/tools/subagent/runtimeLimits.ts +7 -0
  128. package/src/types/graph.ts +217 -19
@@ -225,6 +225,250 @@ export class CohereReranker extends BaseReranker {
225
225
  }
226
226
  }
227
227
 
228
+ /** rag_api's `/v1/rerank` contract caps candidates at 50 and `top_n` at 25;
229
+ * violating either is a client bug, not a server error, so both are clamped
230
+ * locally with a debug log instead of erroring. */
231
+ const RAG_API_MAX_CANDIDATES = 50;
232
+ const RAG_API_MAX_TOP_N = 25;
233
+ const RAG_API_DEFAULT_PROFILE = 'fast-v1';
234
+
235
+ const getDefaultRagApiUrl = (): string | undefined =>
236
+ process.env.RAG_API_URL != null && process.env.RAG_API_URL !== ''
237
+ ? process.env.RAG_API_URL
238
+ : undefined;
239
+
240
+ const toRagApiCandidate = (
241
+ text: string,
242
+ index: number
243
+ ): t.RagApiRerankCandidate => ({ id: String(index), text, base_score: 0 });
244
+
245
+ /** A single source split into overlapping chunks routinely exceeds the
246
+ * contract limit, so documents are capped before any candidate is built:
247
+ * only the submittable window is ever allocated. */
248
+ const buildRagApiCandidates = (
249
+ documents: string[],
250
+ logger: t.Logger
251
+ ): t.RagApiRerankCandidate[] => {
252
+ if (documents.length <= RAG_API_MAX_CANDIDATES) {
253
+ return documents.map(toRagApiCandidate);
254
+ }
255
+ logger.debug(
256
+ `rag_api fast-v1 accepts at most ${RAG_API_MAX_CANDIDATES} candidates; truncating ${documents.length} to ${RAG_API_MAX_CANDIDATES}.`
257
+ );
258
+ return documents.slice(0, RAG_API_MAX_CANDIDATES).map(toRagApiCandidate);
259
+ };
260
+
261
+ const clampRagApiTopN = (topN: number, logger: t.Logger): number => {
262
+ if (topN <= RAG_API_MAX_TOP_N) {
263
+ return topN;
264
+ }
265
+ logger.debug(
266
+ `rag_api fast-v1 accepts top_n <= ${RAG_API_MAX_TOP_N}; clamping ${topN} to ${RAG_API_MAX_TOP_N}.`
267
+ );
268
+ return RAG_API_MAX_TOP_N;
269
+ };
270
+
271
+ /** Deterministic tie ordering: rank by score descending, breaking ties on
272
+ * original candidate index rather than relying on rag_api's response order. */
273
+ const sortRagApiResults = (
274
+ results: t.RagApiRerankResult[]
275
+ ): t.RagApiRerankResult[] =>
276
+ [...results].sort((a, b) => b.score - a.score || a.index - b.index);
277
+
278
+ /** Indices are only meaningful against the candidates actually submitted:
279
+ * anything beyond `candidateCount` refers to text the server never saw. */
280
+ const isValidRagApiResult = (
281
+ result: t.RagApiRerankResult | undefined,
282
+ candidateCount: number
283
+ ): result is t.RagApiRerankResult =>
284
+ result != null &&
285
+ typeof result.index === 'number' &&
286
+ Number.isInteger(result.index) &&
287
+ result.index >= 0 &&
288
+ result.index < candidateCount &&
289
+ typeof result.score === 'number' &&
290
+ Number.isFinite(result.score);
291
+
292
+ /** A repeated index would map one document into several `top_n` slots and
293
+ * silently drop distinct results, so a duplicate invalidates the batch just
294
+ * like any other malformed row. Seen indices are tracked in the same pass
295
+ * that validates each row. */
296
+ const isValidRagApiBatch = (
297
+ results: t.RagApiRerankResult[],
298
+ candidateCount: number
299
+ ): boolean => {
300
+ const seenIndices = new Set<number>();
301
+ return results.every((result) => {
302
+ if (!isValidRagApiResult(result, candidateCount)) {
303
+ return false;
304
+ }
305
+ if (seenIndices.has(result.index)) {
306
+ return false;
307
+ }
308
+ seenIndices.add(result.index);
309
+ return true;
310
+ });
311
+ };
312
+
313
+ /** Bounds the whole rerank round trip, token acquisition included: the
314
+ * supplier mints its token over the network, so awaiting it before axios
315
+ * starts would leave the search unbounded whenever an auth service stalls.
316
+ * The signal reaches both legs, so returning a fallback also cancels whatever
317
+ * is still in flight rather than leaving a request running past its caller.
318
+ * A non-positive timeout keeps axios' "no timeout" semantics. */
319
+ const withRerankDeadline = <T>(
320
+ operation: (signal?: AbortSignal) => Promise<T>,
321
+ timeout: number
322
+ ): Promise<T> => {
323
+ if (timeout <= 0) {
324
+ return operation();
325
+ }
326
+
327
+ const controller = new AbortController();
328
+ let timer: ReturnType<typeof setTimeout> | undefined;
329
+ const deadline = new Promise<never>((_resolve, reject) => {
330
+ timer = setTimeout(() => {
331
+ controller.abort();
332
+ reject(new Error(`rag_api rerank exceeded its ${timeout}ms timeout.`));
333
+ }, timeout);
334
+ });
335
+
336
+ const pending = operation(controller.signal);
337
+ pending.catch(() => undefined);
338
+
339
+ return Promise.race([pending, deadline]).finally(() => clearTimeout(timer));
340
+ };
341
+
342
+ /**
343
+ * Calls the public `danny-avila/rag_api` `/v1/rerank` endpoint (the
344
+ * `fast-v1` profile). Auth is supplied per call by a token supplier (a
345
+ * short-lived JWT minted by the host app) rather than a static key. A
346
+ * reranker failure must never throw into the search flow: on a missing
347
+ * base URL/token supplier, a timeout (covering token acquisition as well as
348
+ * the request), a non-2xx response, or any malformed payload, this falls back
349
+ * to the candidates' original order via {@link BaseReranker.getDefaultRanking}.
350
+ */
351
+ export class RagApiReranker extends BaseReranker {
352
+ private baseUrl?: string;
353
+ private tokenSupplier?: t.RagApiTokenSupplier;
354
+ private profile: string;
355
+ private timeout: number;
356
+ private httpAgent?: t.HttpAgent;
357
+ private httpsAgent?: t.HttpsAgent;
358
+
359
+ constructor({
360
+ baseUrl = getDefaultRagApiUrl(),
361
+ tokenSupplier,
362
+ profile = RAG_API_DEFAULT_PROFILE,
363
+ timeout = DEFAULT_RERANKER_TIMEOUT,
364
+ logger,
365
+ httpAgent,
366
+ httpsAgent,
367
+ }: {
368
+ baseUrl?: string;
369
+ tokenSupplier?: t.RagApiTokenSupplier;
370
+ profile?: string;
371
+ timeout?: number;
372
+ logger?: t.Logger;
373
+ } & t.HttpAgentConfig) {
374
+ super(logger);
375
+ this.baseUrl = baseUrl?.replace(/\/+$/, '');
376
+ this.tokenSupplier = tokenSupplier;
377
+ this.profile = profile;
378
+ this.timeout = timeout;
379
+ this.httpAgent = httpAgent;
380
+ this.httpsAgent = httpsAgent;
381
+ }
382
+
383
+ async rerank(
384
+ query: string,
385
+ documents: string[],
386
+ topK: number = 5
387
+ ): Promise<t.Highlight[]> {
388
+ if (documents.length === 0) {
389
+ return [];
390
+ }
391
+
392
+ this.logger.debug(
393
+ `Reranking ${documents.length} chunks with rag_api (${this.profile}) using base URL: ${this.baseUrl}`
394
+ );
395
+
396
+ const baseUrl = this.baseUrl;
397
+ if (baseUrl == null || baseUrl === '') {
398
+ this.logger.warn('RAG_API_URL is not set. Using default ranking.');
399
+ return this.getDefaultRanking(documents, topK);
400
+ }
401
+
402
+ const tokenSupplier = this.tokenSupplier;
403
+ if (tokenSupplier == null) {
404
+ this.logger.warn(
405
+ 'No rag_api token supplier configured. Using default ranking.'
406
+ );
407
+ return this.getDefaultRanking(documents, topK);
408
+ }
409
+
410
+ const candidates = buildRagApiCandidates(documents, this.logger);
411
+ const topN = clampRagApiTopN(Math.max(0, topK), this.logger);
412
+ const requestData: t.RagApiRerankRequestBody = {
413
+ profile: this.profile,
414
+ query,
415
+ candidates,
416
+ top_n: topN,
417
+ };
418
+
419
+ try {
420
+ const data = await withRerankDeadline(async (signal) => {
421
+ const token = await tokenSupplier(signal);
422
+ const response = await axios.post<t.RagApiRerankResponse | undefined>(
423
+ `${baseUrl}/v1/rerank`,
424
+ requestData,
425
+ {
426
+ headers: {
427
+ 'Content-Type': 'application/json',
428
+ Authorization: `Bearer ${token}`,
429
+ },
430
+ timeout: this.timeout,
431
+ httpAgent: this.httpAgent,
432
+ httpsAgent: this.httpsAgent,
433
+ signal,
434
+ }
435
+ );
436
+ return response.data;
437
+ }, this.timeout);
438
+
439
+ this.logger.debug('rag_api rerank model:', data?.model);
440
+
441
+ const rawResults = data?.results;
442
+ if (!Array.isArray(rawResults) || rawResults.length === 0) {
443
+ this.logger.warn(
444
+ 'Unexpected response format from rag_api rerank. Using default ranking.'
445
+ );
446
+ return this.getDefaultRanking(documents, topK);
447
+ }
448
+
449
+ if (!isValidRagApiBatch(rawResults, candidates.length)) {
450
+ this.logger.warn(
451
+ 'rag_api rerank response contained no valid results. Using default ranking.'
452
+ );
453
+ return this.getDefaultRanking(documents, topK);
454
+ }
455
+
456
+ return sortRagApiResults(rawResults)
457
+ .slice(0, topN)
458
+ .map((result) => ({
459
+ text: documents[result.index],
460
+ score: result.score,
461
+ }));
462
+ } catch (error) {
463
+ this.logger.error(
464
+ 'Error using rag_api reranker',
465
+ formatErrorForLog(error)
466
+ );
467
+ return this.getDefaultRanking(documents, topK);
468
+ }
469
+ }
470
+ }
471
+
228
472
  export class InfinityReranker extends BaseReranker {
229
473
  constructor(logger?: t.Logger) {
230
474
  super(logger);
@@ -253,6 +497,9 @@ export const createReranker = (
253
497
  jinaApiKey?: string;
254
498
  jinaApiUrl?: string;
255
499
  cohereApiKey?: string;
500
+ ragApiUrl?: string;
501
+ ragApiTokenSupplier?: t.RagApiTokenSupplier;
502
+ ragApiProfile?: string;
256
503
  rerankerTimeout?: number;
257
504
  logger?: t.Logger;
258
505
  } & t.HttpAgentConfig
@@ -262,6 +509,9 @@ export const createReranker = (
262
509
  jinaApiKey,
263
510
  jinaApiUrl,
264
511
  cohereApiKey,
512
+ ragApiUrl,
513
+ ragApiTokenSupplier,
514
+ ragApiProfile,
265
515
  rerankerTimeout,
266
516
  logger,
267
517
  httpAgent,
@@ -289,6 +539,16 @@ export const createReranker = (
289
539
  httpAgent,
290
540
  httpsAgent,
291
541
  });
542
+ case 'rag-api':
543
+ return new RagApiReranker({
544
+ baseUrl: ragApiUrl,
545
+ tokenSupplier: ragApiTokenSupplier,
546
+ profile: ragApiProfile,
547
+ timeout: rerankerTimeout,
548
+ logger: defaultLogger,
549
+ httpAgent,
550
+ httpsAgent,
551
+ });
292
552
  case 'infinity':
293
553
  return new InfinityReranker(defaultLogger);
294
554
  case 'none':
@@ -452,6 +452,9 @@ export const createSearchTool = (
452
452
  jinaApiKey,
453
453
  jinaApiUrl,
454
454
  cohereApiKey,
455
+ ragApiUrl,
456
+ ragApiTokenSupplier,
457
+ ragApiProfile,
455
458
  httpAgent,
456
459
  httpsAgent,
457
460
  onSearchResults: _onSearchResults,
@@ -571,6 +574,9 @@ export const createSearchTool = (
571
574
  jinaApiKey,
572
575
  jinaApiUrl,
573
576
  cohereApiKey,
577
+ ragApiUrl,
578
+ ragApiTokenSupplier,
579
+ ragApiProfile,
574
580
  rerankerTimeout,
575
581
  httpAgent,
576
582
  httpsAgent,
@@ -32,7 +32,7 @@ export type ScraperProvider =
32
32
  | 'tavily'
33
33
  | 'crw'
34
34
  | 'keenable';
35
- export type RerankerType = 'infinity' | 'jina' | 'cohere' | 'none';
35
+ export type RerankerType = 'infinity' | 'jina' | 'cohere' | 'rag-api' | 'none';
36
36
 
37
37
  export interface Highlight {
38
38
  score: number;
@@ -353,6 +353,41 @@ export interface CohereRerankerResponse {
353
353
  };
354
354
  }
355
355
 
356
+ /** Mints a short-lived JWT per call; rag_api tokens are never cached or
357
+ * reused across requests by the reranker itself. Receives the rerank
358
+ * deadline's `AbortSignal` so a supplier minting its token over the network
359
+ * can cancel that request when the deadline fires instead of leaving it
360
+ * running past its caller. The argument is optional: zero-argument suppliers
361
+ * remain valid. */
362
+ export type RagApiTokenSupplier = (
363
+ signal?: AbortSignal
364
+ ) => string | Promise<string>;
365
+
366
+ export interface RagApiRerankCandidate {
367
+ id: string;
368
+ text: string;
369
+ base_score: number;
370
+ }
371
+
372
+ export interface RagApiRerankRequestBody {
373
+ profile: string;
374
+ query: string;
375
+ candidates: RagApiRerankCandidate[];
376
+ top_n: number;
377
+ }
378
+
379
+ export interface RagApiRerankResult {
380
+ id: string;
381
+ index: number;
382
+ score: number;
383
+ }
384
+
385
+ export interface RagApiRerankResponse {
386
+ profile: string;
387
+ model: string;
388
+ results: RagApiRerankResult[];
389
+ }
390
+
356
391
  export type SafeSearchLevel = 0 | 1 | 2;
357
392
 
358
393
  export type Logger = WinstonLogger;
@@ -375,6 +410,15 @@ export interface SearchToolConfig
375
410
  jinaApiKey?: string;
376
411
  jinaApiUrl?: string;
377
412
  cohereApiKey?: string;
413
+ /** Base URL of the public `rag_api` service (`RAG_API_URL` env fallback).
414
+ * Requests post to `${ragApiUrl}/v1/rerank`. */
415
+ ragApiUrl?: string;
416
+ /** Resolves a short-lived rag_api JWT immediately before each rerank call.
417
+ * Required for the `'rag-api'` reranker type — without it, reranking falls
418
+ * back to default (unranked) ordering. */
419
+ ragApiTokenSupplier?: RagApiTokenSupplier;
420
+ /** rag_api rerank profile. Defaults to `'fast-v1'`. */
421
+ ragApiProfile?: string;
378
422
  rerankerType?: RerankerType;
379
423
  /** Timeout (ms) for rerank API requests. Defaults to 10,000. */
380
424
  rerankerTimeout?: number;