@librechat/agents 3.3.13 → 3.4.1

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 (192) hide show
  1. package/dist/cjs/graphs/Graph.cjs +121 -27
  2. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  3. package/dist/cjs/hooks/HookRegistry.cjs +83 -0
  4. package/dist/cjs/hooks/HookRegistry.cjs.map +1 -1
  5. package/dist/cjs/hooks/executeHooks.cjs +60 -14
  6. package/dist/cjs/hooks/executeHooks.cjs.map +1 -1
  7. package/dist/cjs/hooks/index.cjs.map +1 -1
  8. package/dist/cjs/hooks/types.cjs +2 -0
  9. package/dist/cjs/hooks/types.cjs.map +1 -1
  10. package/dist/cjs/llm/anthropic/index.cjs +35 -206
  11. package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
  12. package/dist/cjs/llm/bedrock/index.cjs +121 -241
  13. package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
  14. package/dist/cjs/llm/google/index.cjs +19 -12
  15. package/dist/cjs/llm/google/index.cjs.map +1 -1
  16. package/dist/cjs/llm/init.cjs +3 -3
  17. package/dist/cjs/llm/invoke.cjs +2 -2
  18. package/dist/cjs/llm/mistral/index.cjs +26 -0
  19. package/dist/cjs/llm/mistral/index.cjs.map +1 -0
  20. package/dist/cjs/llm/openai/index.cjs +82 -80
  21. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  22. package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
  23. package/dist/cjs/llm/providers.cjs +19 -19
  24. package/dist/cjs/llm/providers.cjs.map +1 -1
  25. package/dist/cjs/llm/stream/chunkAdapters.cjs +198 -0
  26. package/dist/cjs/llm/stream/chunkAdapters.cjs.map +1 -0
  27. package/dist/cjs/llm/stream/smoother.cjs +369 -0
  28. package/dist/cjs/llm/stream/smoother.cjs.map +1 -0
  29. package/dist/cjs/llm/vertexai/index.cjs +13 -1
  30. package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
  31. package/dist/cjs/main.cjs +25 -16
  32. package/dist/cjs/messages/format.cjs +40 -23
  33. package/dist/cjs/messages/format.cjs.map +1 -1
  34. package/dist/cjs/run.cjs +82 -15
  35. package/dist/cjs/run.cjs.map +1 -1
  36. package/dist/cjs/session/AgentSession.cjs +37 -2
  37. package/dist/cjs/session/AgentSession.cjs.map +1 -1
  38. package/dist/cjs/stream.cjs +1 -1
  39. package/dist/cjs/summarization/node.cjs +6 -3
  40. package/dist/cjs/summarization/node.cjs.map +1 -1
  41. package/dist/cjs/tools/BashExecutor.cjs +1 -1
  42. package/dist/cjs/tools/CodeExecutor.cjs +1 -1
  43. package/dist/cjs/tools/ProgrammaticToolCalling.cjs +1 -1
  44. package/dist/cjs/tools/ToolNode.cjs +316 -94
  45. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  46. package/dist/cjs/tools/ToolSearch.cjs +1 -1
  47. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +664 -80
  48. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
  49. package/dist/cjs/tools/subagent/SubagentReplay.cjs +175 -0
  50. package/dist/cjs/tools/subagent/SubagentReplay.cjs.map +1 -0
  51. package/dist/cjs/tools/toolOutputReferences.cjs +20 -0
  52. package/dist/cjs/tools/toolOutputReferences.cjs.map +1 -1
  53. package/dist/cjs/utils/index.cjs +2 -2
  54. package/dist/cjs/utils/tokens.cjs +76 -29
  55. package/dist/cjs/utils/tokens.cjs.map +1 -1
  56. package/dist/esm/graphs/Graph.mjs +121 -27
  57. package/dist/esm/graphs/Graph.mjs.map +1 -1
  58. package/dist/esm/hooks/HookRegistry.mjs +83 -0
  59. package/dist/esm/hooks/HookRegistry.mjs.map +1 -1
  60. package/dist/esm/hooks/executeHooks.mjs +60 -14
  61. package/dist/esm/hooks/executeHooks.mjs.map +1 -1
  62. package/dist/esm/hooks/index.mjs.map +1 -1
  63. package/dist/esm/hooks/types.mjs +2 -1
  64. package/dist/esm/hooks/types.mjs.map +1 -1
  65. package/dist/esm/llm/anthropic/index.mjs +34 -205
  66. package/dist/esm/llm/anthropic/index.mjs.map +1 -1
  67. package/dist/esm/llm/bedrock/index.mjs +120 -240
  68. package/dist/esm/llm/bedrock/index.mjs.map +1 -1
  69. package/dist/esm/llm/google/index.mjs +19 -12
  70. package/dist/esm/llm/google/index.mjs.map +1 -1
  71. package/dist/esm/llm/init.mjs +1 -1
  72. package/dist/esm/llm/invoke.mjs +2 -2
  73. package/dist/esm/llm/mistral/index.mjs +26 -0
  74. package/dist/esm/llm/mistral/index.mjs.map +1 -0
  75. package/dist/esm/llm/openai/index.mjs +82 -80
  76. package/dist/esm/llm/openai/index.mjs.map +1 -1
  77. package/dist/esm/llm/openrouter/index.mjs.map +1 -1
  78. package/dist/esm/llm/providers.mjs +3 -3
  79. package/dist/esm/llm/providers.mjs.map +1 -1
  80. package/dist/esm/llm/stream/chunkAdapters.mjs +195 -0
  81. package/dist/esm/llm/stream/chunkAdapters.mjs.map +1 -0
  82. package/dist/esm/llm/stream/smoother.mjs +365 -0
  83. package/dist/esm/llm/stream/smoother.mjs.map +1 -0
  84. package/dist/esm/llm/vertexai/index.mjs +13 -1
  85. package/dist/esm/llm/vertexai/index.mjs.map +1 -1
  86. package/dist/esm/main.mjs +13 -11
  87. package/dist/esm/messages/format.mjs +40 -23
  88. package/dist/esm/messages/format.mjs.map +1 -1
  89. package/dist/esm/run.mjs +83 -16
  90. package/dist/esm/run.mjs.map +1 -1
  91. package/dist/esm/session/AgentSession.mjs +37 -2
  92. package/dist/esm/session/AgentSession.mjs.map +1 -1
  93. package/dist/esm/stream.mjs +1 -1
  94. package/dist/esm/summarization/node.mjs +6 -3
  95. package/dist/esm/summarization/node.mjs.map +1 -1
  96. package/dist/esm/tools/BashExecutor.mjs +1 -1
  97. package/dist/esm/tools/CodeExecutor.mjs +1 -1
  98. package/dist/esm/tools/ProgrammaticToolCalling.mjs +1 -1
  99. package/dist/esm/tools/ToolNode.mjs +317 -95
  100. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  101. package/dist/esm/tools/ToolSearch.mjs +1 -1
  102. package/dist/esm/tools/subagent/SubagentExecutor.mjs +665 -81
  103. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
  104. package/dist/esm/tools/subagent/SubagentReplay.mjs +168 -0
  105. package/dist/esm/tools/subagent/SubagentReplay.mjs.map +1 -0
  106. package/dist/esm/tools/toolOutputReferences.mjs +20 -0
  107. package/dist/esm/tools/toolOutputReferences.mjs.map +1 -1
  108. package/dist/esm/utils/index.mjs +2 -2
  109. package/dist/esm/utils/tokens.mjs +76 -30
  110. package/dist/esm/utils/tokens.mjs.map +1 -1
  111. package/dist/types/graphs/Graph.d.ts +19 -1
  112. package/dist/types/hooks/HookRegistry.d.ts +10 -1
  113. package/dist/types/hooks/executeHooks.d.ts +5 -1
  114. package/dist/types/hooks/index.d.ts +2 -2
  115. package/dist/types/hooks/types.d.ts +12 -0
  116. package/dist/types/index.d.ts +3 -0
  117. package/dist/types/llm/google/index.d.ts +2 -0
  118. package/dist/types/llm/mistral/index.d.ts +11 -0
  119. package/dist/types/llm/openai/index.d.ts +20 -4
  120. package/dist/types/llm/openrouter/index.d.ts +4 -1
  121. package/dist/types/llm/stream/chunkAdapters.d.ts +48 -0
  122. package/dist/types/llm/stream/smoother.d.ts +95 -0
  123. package/dist/types/llm/vertexai/index.d.ts +2 -0
  124. package/dist/types/run.d.ts +4 -1
  125. package/dist/types/session/AgentSession.d.ts +1 -0
  126. package/dist/types/tools/ToolNode.d.ts +23 -15
  127. package/dist/types/tools/subagent/SubagentExecutor.d.ts +49 -7
  128. package/dist/types/tools/subagent/SubagentReplay.d.ts +81 -0
  129. package/dist/types/tools/toolOutputReferences.d.ts +12 -0
  130. package/dist/types/types/graph.d.ts +5 -5
  131. package/dist/types/types/hitl.d.ts +15 -0
  132. package/dist/types/types/llm.d.ts +21 -14
  133. package/dist/types/utils/tokens.d.ts +10 -0
  134. package/package.json +6 -2
  135. package/src/graphs/Graph.ts +257 -52
  136. package/src/graphs/__tests__/Graph.breakerLifecycle.test.ts +48 -9
  137. package/src/graphs/__tests__/Graph.contextOverflow.test.ts +1 -1
  138. package/src/graphs/__tests__/Graph.subagentResumeState.test.ts +80 -0
  139. package/src/hooks/HookRegistry.ts +151 -1
  140. package/src/hooks/__tests__/HookRegistry.test.ts +96 -0
  141. package/src/hooks/__tests__/executeHooks.test.ts +160 -0
  142. package/src/hooks/executeHooks.ts +133 -15
  143. package/src/hooks/index.ts +3 -1
  144. package/src/hooks/types.ts +16 -0
  145. package/src/index.ts +8 -0
  146. package/src/llm/anthropic/index.ts +85 -354
  147. package/src/llm/bedrock/index.ts +174 -390
  148. package/src/llm/bedrock/llm.spec.ts +2 -0
  149. package/src/llm/bedrock/streamSealDispatch.test.ts +76 -0
  150. package/src/llm/custom-chat-models.smoke.test.ts +16 -1
  151. package/src/llm/google/index.ts +17 -18
  152. package/src/llm/google/streamSmoothing.test.ts +121 -0
  153. package/src/llm/mistral/index.ts +33 -0
  154. package/src/llm/mistral/streamSmoothing.test.ts +97 -0
  155. package/src/llm/openai/deepseek.test.ts +56 -0
  156. package/src/llm/openai/index.ts +119 -126
  157. package/src/llm/openrouter/index.ts +4 -1
  158. package/src/llm/providers.ts +3 -3
  159. package/src/llm/stream/chunkAdapters.test.ts +202 -0
  160. package/src/llm/stream/chunkAdapters.ts +317 -0
  161. package/src/llm/stream/reassembly.test.ts +241 -0
  162. package/src/llm/stream/smoother.bench.test.ts +155 -0
  163. package/src/llm/stream/smoother.test.ts +519 -0
  164. package/src/llm/stream/smoother.ts +574 -0
  165. package/src/llm/vertexai/index.ts +17 -1
  166. package/src/llm/vertexai/streamSmoothing.test.ts +109 -0
  167. package/src/messages/format.ts +54 -26
  168. package/src/messages/formatAgentMessages.reducer.test.ts +162 -0
  169. package/src/messages/formatAgentMessages.steer.test.ts +16 -11
  170. package/src/messages/formatAgentMessages.test.ts +7 -2
  171. package/src/run.ts +164 -18
  172. package/src/session/AgentSession.ts +52 -2
  173. package/src/session/__tests__/JsonlSessionStore.test.ts +53 -0
  174. package/src/specs/subagent.test.ts +44 -0
  175. package/src/specs/tokens.test.ts +159 -14
  176. package/src/summarization/__tests__/node.test.ts +32 -14
  177. package/src/summarization/node.ts +15 -11
  178. package/src/tools/ToolNode.ts +631 -157
  179. package/src/tools/__tests__/SubagentExecutor.test.ts +590 -7
  180. package/src/tools/__tests__/SubagentReplay.test.ts +300 -0
  181. package/src/tools/__tests__/ToolNode.breakerSignal.test.ts +208 -2
  182. package/src/tools/__tests__/directToolHITLResumeScope.test.ts +486 -2
  183. package/src/tools/__tests__/hitl.test.ts +234 -5
  184. package/src/tools/__tests__/subagentHooks.test.ts +1040 -62
  185. package/src/tools/__tests__/toolOutputReferences.test.ts +19 -2
  186. package/src/tools/subagent/SubagentExecutor.ts +1438 -136
  187. package/src/tools/subagent/SubagentReplay.ts +575 -0
  188. package/src/tools/toolOutputReferences.ts +40 -1
  189. package/src/types/graph.ts +5 -5
  190. package/src/types/hitl.ts +16 -0
  191. package/src/types/llm.ts +53 -36
  192. package/src/utils/tokens.ts +115 -30
@@ -8,6 +8,7 @@ import type {
8
8
  ToolDecision,
9
9
  StopDecision,
10
10
  HookCallback,
11
+ ToolApprovalReplayKey,
11
12
  AggregatedHookResult,
12
13
  } from './types';
13
14
  import type { HookRegistry } from './HookRegistry';
@@ -28,6 +29,10 @@ export interface ExecuteHooksOptions {
28
29
  sessionId?: string;
29
30
  /** Query string matched against each matcher's pattern (tool name, etc.). */
30
31
  matchQuery?: string;
32
+ /** Stable tool-call key for replaying consumed one-shot contributions. */
33
+ onceReplayKey?: ToolApprovalReplayKey;
34
+ /** Storage scope for replay state when it must outlive or branch from the hook session. */
35
+ onceReplaySessionId?: string;
31
36
  /** Parent AbortSignal — combined with per-hook timeout into the hook signal. */
32
37
  signal?: AbortSignal;
33
38
  /** Default per-hook timeout; overridden by `matcher.timeout` when present. */
@@ -301,12 +306,79 @@ function applyAllowedDecisions(
301
306
  agg.allowedDecisions = output.allowedDecisions;
302
307
  }
303
308
 
304
- function fold(outcomes: readonly HookOutcome[]): AggregatedHookResult {
305
- const agg = freshResult();
309
+ function applyAggregatedResult(
310
+ target: AggregatedHookResult,
311
+ source: AggregatedHookResult
312
+ ): void {
313
+ target.additionalContexts.push(...source.additionalContexts);
314
+ target.injectedMessages.push(...source.injectedMessages);
315
+ target.errors.push(...source.errors);
316
+ if (source.decision != null) {
317
+ applyToolDecision(target, source.decision, source.reason);
318
+ }
319
+ if (source.stopDecision != null) {
320
+ applyStopDecision(target, source.stopDecision, source.reason);
321
+ }
322
+ if (source.updatedInput != null) {
323
+ target.updatedInput = source.updatedInput;
324
+ }
325
+ if (source.updatedOutput !== undefined) {
326
+ target.updatedOutput = source.updatedOutput;
327
+ }
328
+ if (source.allowedDecisions != null) {
329
+ target.allowedDecisions = source.allowedDecisions;
330
+ }
331
+ if (source.preventContinuation === true) {
332
+ target.preventContinuation = true;
333
+ target.stopReason ??= source.stopReason;
334
+ }
335
+ }
336
+
337
+ function combineAggregatedResults(
338
+ first: AggregatedHookResult | undefined,
339
+ second: AggregatedHookResult
340
+ ): AggregatedHookResult {
341
+ if (first == null) {
342
+ return second;
343
+ }
344
+ const combined = freshResult();
345
+ applyAggregatedResult(combined, first);
346
+ applyAggregatedResult(combined, second);
347
+ return combined;
348
+ }
349
+
350
+ function createPendingApprovalReplay(
351
+ approvalResult: AggregatedHookResult,
352
+ pendingApproval: AggregatedHookResult | undefined,
353
+ onceContribution: AggregatedHookResult
354
+ ): AggregatedHookResult {
355
+ const replay = freshResult();
356
+ if (pendingApproval != null) {
357
+ applyAggregatedResult(replay, pendingApproval);
358
+ }
359
+ applyAggregatedResult(replay, onceContribution);
360
+ replay.decision = 'ask';
361
+ replay.reason = approvalResult.reason;
362
+ if (approvalResult.allowedDecisions == null) {
363
+ delete replay.allowedDecisions;
364
+ } else {
365
+ replay.allowedDecisions = approvalResult.allowedDecisions;
366
+ }
367
+ return replay;
368
+ }
369
+
370
+ function fold(outcomes: readonly HookOutcome[]): {
371
+ aggregated: AggregatedHookResult;
372
+ onceReplayContribution?: AggregatedHookResult;
373
+ } {
374
+ const aggregated = freshResult();
375
+ const onceContribution = freshResult();
376
+ let hasOnceContribution = false;
306
377
  for (const outcome of outcomes) {
378
+ const isOnceMatcher = outcome.matcher.once === true;
307
379
  if (outcome.error !== null) {
308
380
  if (outcome.matcher.internal !== true) {
309
- agg.errors.push(outcome.error);
381
+ aggregated.errors.push(outcome.error);
310
382
  }
311
383
  continue;
312
384
  }
@@ -323,15 +395,28 @@ function fold(outcomes: readonly HookOutcome[]): AggregatedHookResult {
323
395
  if (output.async === true) {
324
396
  continue;
325
397
  }
326
- applyContext(agg, output);
327
- applyInjectedMessages(agg, output);
328
- applyStopFlag(agg, output);
329
- applyDecision(agg, output);
330
- applyUpdatedInput(agg, output);
331
- applyUpdatedOutput(agg, output);
332
- applyAllowedDecisions(agg, output);
333
- }
334
- return agg;
398
+ const targets = isOnceMatcher
399
+ ? [aggregated, onceContribution]
400
+ : [aggregated];
401
+ if (isOnceMatcher) {
402
+ hasOnceContribution = true;
403
+ }
404
+ for (const target of targets) {
405
+ applyContext(target, output);
406
+ applyInjectedMessages(target, output);
407
+ applyStopFlag(target, output);
408
+ applyDecision(target, output);
409
+ applyUpdatedInput(target, output);
410
+ applyUpdatedOutput(target, output);
411
+ applyAllowedDecisions(target, output);
412
+ }
413
+ }
414
+ return {
415
+ aggregated,
416
+ ...(hasOnceContribution
417
+ ? { onceReplayContribution: onceContribution }
418
+ : {}),
419
+ };
335
420
  }
336
421
 
337
422
  /**
@@ -396,14 +481,21 @@ export async function executeHooks(
396
481
  input,
397
482
  sessionId,
398
483
  matchQuery,
484
+ onceReplayKey,
485
+ onceReplaySessionId,
399
486
  signal,
400
487
  timeoutMs = DEFAULT_HOOK_TIMEOUT_MS,
401
488
  logger,
402
489
  } = opts;
403
490
  const event = input.hook_event_name;
491
+ const replaySessionId = onceReplaySessionId ?? sessionId;
492
+ const pendingApproval =
493
+ event === 'PreToolUse' && replaySessionId != null && onceReplayKey != null
494
+ ? registry.getPendingToolApproval(replaySessionId, onceReplayKey)
495
+ : undefined;
404
496
  const matchers = registry.getMatchers(event, sessionId);
405
497
  if (matchers.length === 0) {
406
- return freshResult();
498
+ return pendingApproval ?? freshResult();
407
499
  }
408
500
 
409
501
  // --- SYNC CRITICAL SECTION: once-matcher removal must complete before any await ---
@@ -424,12 +516,38 @@ export async function executeHooks(
424
516
  }
425
517
  // --- END SYNC CRITICAL SECTION ---
426
518
  if (tasks.length === 0) {
427
- return freshResult();
519
+ return pendingApproval ?? freshResult();
428
520
  }
429
521
 
430
522
  const outcomes = (await Promise.all(tasks)).flat();
431
523
  reportErrors(outcomes, event, logger);
432
- const aggregated = fold(outcomes);
524
+ const { aggregated: liveResult, onceReplayContribution } = fold(outcomes);
525
+ const aggregated = combineAggregatedResults(pendingApproval, liveResult);
526
+ if (
527
+ event === 'PreToolUse' &&
528
+ aggregated.decision === 'ask' &&
529
+ onceReplayContribution != null &&
530
+ replaySessionId != null &&
531
+ onceReplayKey != null
532
+ ) {
533
+ registry.setPendingToolApproval(
534
+ replaySessionId,
535
+ onceReplayKey,
536
+ createPendingApprovalReplay(
537
+ aggregated,
538
+ pendingApproval,
539
+ onceReplayContribution
540
+ )
541
+ );
542
+ } else if (
543
+ event === 'PreToolUse' &&
544
+ aggregated.decision !== 'ask' &&
545
+ pendingApproval != null &&
546
+ replaySessionId != null &&
547
+ onceReplayKey != null
548
+ ) {
549
+ registry.clearPendingToolApproval(replaySessionId, onceReplayKey);
550
+ }
433
551
  /**
434
552
  * Centralized `preventContinuation` propagation: when any hook (across
435
553
  * any callsite — RunStart, PreToolUse, PostToolBatch, SubagentStop,
@@ -42,7 +42,7 @@ export type {
42
42
  WorkspacePolicyConfig,
43
43
  PathExtractor,
44
44
  } from './createWorkspacePolicyHook';
45
- export { HOOK_EVENTS } from './types';
45
+ export { HOOK_EVENTS, TOOL_APPROVAL_EXECUTION_SCOPE_CONFIG_KEY } from './types';
46
46
  export type {
47
47
  HookEvent,
48
48
  HookInput,
@@ -56,6 +56,8 @@ export type {
56
56
  BaseHookOutput,
57
57
  ToolDecision,
58
58
  StopDecision,
59
+ ToolApprovalReplayKey,
60
+ ToolApprovalReplaySnapshot,
59
61
  AggregatedHookResult,
60
62
  RunStartHookInput,
61
63
  UserPromptSubmitHookInput,
@@ -27,6 +27,9 @@ export const HOOK_EVENTS = [
27
27
  'PostCompact',
28
28
  ] as const;
29
29
 
30
+ export const TOOL_APPROVAL_EXECUTION_SCOPE_CONFIG_KEY =
31
+ '__librechat_tool_approval_execution_scope';
32
+
30
33
  export type HookEvent = (typeof HOOK_EVENTS)[number];
31
34
 
32
35
  /** Tool-gating decision; executeHooks folds with `deny > ask > allow` precedence. */
@@ -393,6 +396,19 @@ export interface PreToolUseHookOutput extends BaseHookOutput {
393
396
  allowedDecisions?: ReadonlyArray<'approve' | 'reject' | 'edit' | 'respond'>;
394
397
  }
395
398
 
399
+ /** Stable identity for replaying a consumed one-shot tool approval. */
400
+ export interface ToolApprovalReplayKey {
401
+ executionScope: string;
402
+ agentId: string;
403
+ toolUseId: string;
404
+ }
405
+
406
+ /** Checkpoint-safe copy of a consumed one-shot approval contribution. */
407
+ export interface ToolApprovalReplaySnapshot {
408
+ key: ToolApprovalReplayKey;
409
+ result: AggregatedHookResult;
410
+ }
411
+
396
412
  export interface PostToolUseHookOutput extends BaseHookOutput {
397
413
  /**
398
414
  * Replacement tool output. Flows through the aggregated result so the
package/src/index.ts CHANGED
@@ -77,6 +77,14 @@ export type {
77
77
  ChatOpenRouterCallOptions,
78
78
  } from './llm/openrouter';
79
79
  export { getChatModelClass } from './llm/providers';
80
+ export { CustomChatMistralAI } from './llm/mistral';
81
+ export {
82
+ smoothStream,
83
+ resolveStreamDelay,
84
+ DEFAULT_STREAM_DELAY,
85
+ computeAdaptivePieceSize,
86
+ } from './llm/stream/smoother';
87
+ export type { SmoothItem, SmoothPiece } from './llm/stream/smoother';
80
88
  export { FakeChatModel, createFakeStreamingLLM } from './llm/fake';
81
89
  export { initializeModel } from './llm/init';
82
90
  export { attemptInvoke, tryFallbackProviders } from './llm/invoke';