@librechat/agents 4.0.1 → 4.0.3

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 (245) hide show
  1. package/dist/cjs/agents/AgentContext.cjs +3 -2
  2. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  3. package/dist/cjs/decisions/deadline.cjs +52 -0
  4. package/dist/cjs/decisions/deadline.cjs.map +1 -0
  5. package/dist/cjs/decisions/dialect.cjs +88 -0
  6. package/dist/cjs/decisions/dialect.cjs.map +1 -0
  7. package/dist/cjs/decisions/http.cjs +77 -0
  8. package/dist/cjs/decisions/http.cjs.map +1 -0
  9. package/dist/cjs/decisions/index.cjs +7 -0
  10. package/dist/cjs/decisions/presets.cjs +82 -0
  11. package/dist/cjs/decisions/presets.cjs.map +1 -0
  12. package/dist/cjs/decisions/questions.cjs +70 -0
  13. package/dist/cjs/decisions/questions.cjs.map +1 -0
  14. package/dist/cjs/decisions/structuredChat.cjs +172 -0
  15. package/dist/cjs/decisions/structuredChat.cjs.map +1 -0
  16. package/dist/cjs/decisions/structuredOutput.cjs +18 -0
  17. package/dist/cjs/decisions/structuredOutput.cjs.map +1 -0
  18. package/dist/cjs/decisions/traceMarker.cjs +6 -0
  19. package/dist/cjs/decisions/traceMarker.cjs.map +1 -0
  20. package/dist/cjs/decisions/transport.cjs +166 -0
  21. package/dist/cjs/decisions/transport.cjs.map +1 -0
  22. package/dist/cjs/decisions/types.cjs +44 -0
  23. package/dist/cjs/decisions/types.cjs.map +1 -0
  24. package/dist/cjs/graphs/Graph.cjs +28 -9
  25. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  26. package/dist/cjs/langfuseToolOutputTracing.cjs +6 -1
  27. package/dist/cjs/langfuseToolOutputTracing.cjs.map +1 -1
  28. package/dist/cjs/llm/google/index.cjs +1 -1
  29. package/dist/cjs/llm/invoke.cjs +34 -12
  30. package/dist/cjs/llm/invoke.cjs.map +1 -1
  31. package/dist/cjs/llm/openai/index.cjs +7 -0
  32. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  33. package/dist/cjs/llm/providerTextBoundary.cjs +355 -0
  34. package/dist/cjs/llm/providerTextBoundary.cjs.map +1 -0
  35. package/dist/cjs/llm/providerTextChunk.cjs +14 -0
  36. package/dist/cjs/llm/providerTextChunk.cjs.map +1 -0
  37. package/dist/cjs/llm/providerTextControls.cjs +236 -0
  38. package/dist/cjs/llm/providerTextControls.cjs.map +1 -0
  39. package/dist/cjs/llm/stream/smoother.cjs +2 -1
  40. package/dist/cjs/llm/stream/smoother.cjs.map +1 -1
  41. package/dist/cjs/main.cjs +49 -1
  42. package/dist/cjs/protection/providerText.cjs +224 -0
  43. package/dist/cjs/protection/providerText.cjs.map +1 -0
  44. package/dist/cjs/protection/providerTextInput.cjs +25 -0
  45. package/dist/cjs/protection/providerTextInput.cjs.map +1 -0
  46. package/dist/cjs/rerank/index.cjs +2 -0
  47. package/dist/cjs/rerank/search.cjs +45 -0
  48. package/dist/cjs/rerank/search.cjs.map +1 -0
  49. package/dist/cjs/rerank/systemone.cjs +70 -0
  50. package/dist/cjs/rerank/systemone.cjs.map +1 -0
  51. package/dist/cjs/run.cjs +11 -1
  52. package/dist/cjs/run.cjs.map +1 -1
  53. package/dist/cjs/stream.cjs +42 -14
  54. package/dist/cjs/stream.cjs.map +1 -1
  55. package/dist/cjs/summarization/node.cjs +26 -8
  56. package/dist/cjs/summarization/node.cjs.map +1 -1
  57. package/dist/cjs/tools/SubagentTool.cjs +11 -3
  58. package/dist/cjs/tools/SubagentTool.cjs.map +1 -1
  59. package/dist/cjs/tools/ToolNode.cjs +6 -5
  60. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  61. package/dist/cjs/tools/search/rerankers.cjs +1 -0
  62. package/dist/cjs/tools/search/search.cjs +3 -3
  63. package/dist/cjs/tools/search/search.cjs.map +1 -1
  64. package/dist/cjs/tools/search/tool.cjs +4 -3
  65. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  66. package/dist/cjs/tools/subagent/SubagentExecutionRegistry.cjs +13 -2
  67. package/dist/cjs/tools/subagent/SubagentExecutionRegistry.cjs.map +1 -1
  68. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +149 -26
  69. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
  70. package/dist/cjs/tools/subagent/SubagentReplay.cjs +4 -2
  71. package/dist/cjs/tools/subagent/SubagentReplay.cjs.map +1 -1
  72. package/dist/cjs/tools/subagent/childGraphConfig.cjs +3 -1
  73. package/dist/cjs/tools/subagent/childGraphConfig.cjs.map +1 -1
  74. package/dist/cjs/tools/subagent/diagnostics.cjs +88 -2
  75. package/dist/cjs/tools/subagent/diagnostics.cjs.map +1 -1
  76. package/dist/cjs/tools/subagent/hostArgs.cjs +214 -0
  77. package/dist/cjs/tools/subagent/hostArgs.cjs.map +1 -0
  78. package/dist/cjs/tools/subagent/index.cjs +2 -0
  79. package/dist/cjs/tools/toolErrorContent.cjs +1 -1
  80. package/dist/esm/agents/AgentContext.mjs +3 -2
  81. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  82. package/dist/esm/decisions/deadline.mjs +52 -0
  83. package/dist/esm/decisions/deadline.mjs.map +1 -0
  84. package/dist/esm/decisions/dialect.mjs +87 -0
  85. package/dist/esm/decisions/dialect.mjs.map +1 -0
  86. package/dist/esm/decisions/http.mjs +75 -0
  87. package/dist/esm/decisions/http.mjs.map +1 -0
  88. package/dist/esm/decisions/index.mjs +8 -0
  89. package/dist/esm/decisions/presets.mjs +77 -0
  90. package/dist/esm/decisions/presets.mjs.map +1 -0
  91. package/dist/esm/decisions/questions.mjs +67 -0
  92. package/dist/esm/decisions/questions.mjs.map +1 -0
  93. package/dist/esm/decisions/structuredChat.mjs +172 -0
  94. package/dist/esm/decisions/structuredChat.mjs.map +1 -0
  95. package/dist/esm/decisions/structuredOutput.mjs +18 -0
  96. package/dist/esm/decisions/structuredOutput.mjs.map +1 -0
  97. package/dist/esm/decisions/traceMarker.mjs +6 -0
  98. package/dist/esm/decisions/traceMarker.mjs.map +1 -0
  99. package/dist/esm/decisions/transport.mjs +164 -0
  100. package/dist/esm/decisions/transport.mjs.map +1 -0
  101. package/dist/esm/decisions/types.mjs +39 -0
  102. package/dist/esm/decisions/types.mjs.map +1 -0
  103. package/dist/esm/graphs/Graph.mjs +28 -9
  104. package/dist/esm/graphs/Graph.mjs.map +1 -1
  105. package/dist/esm/langfuseToolOutputTracing.mjs +6 -1
  106. package/dist/esm/langfuseToolOutputTracing.mjs.map +1 -1
  107. package/dist/esm/llm/google/index.mjs +1 -1
  108. package/dist/esm/llm/invoke.mjs +34 -12
  109. package/dist/esm/llm/invoke.mjs.map +1 -1
  110. package/dist/esm/llm/openai/index.mjs +7 -0
  111. package/dist/esm/llm/openai/index.mjs.map +1 -1
  112. package/dist/esm/llm/providerTextBoundary.mjs +355 -0
  113. package/dist/esm/llm/providerTextBoundary.mjs.map +1 -0
  114. package/dist/esm/llm/providerTextChunk.mjs +13 -0
  115. package/dist/esm/llm/providerTextChunk.mjs.map +1 -0
  116. package/dist/esm/llm/providerTextControls.mjs +230 -0
  117. package/dist/esm/llm/providerTextControls.mjs.map +1 -0
  118. package/dist/esm/llm/stream/smoother.mjs +2 -1
  119. package/dist/esm/llm/stream/smoother.mjs.map +1 -1
  120. package/dist/esm/main.mjs +16 -2
  121. package/dist/esm/protection/providerText.mjs +218 -0
  122. package/dist/esm/protection/providerText.mjs.map +1 -0
  123. package/dist/esm/protection/providerTextInput.mjs +24 -0
  124. package/dist/esm/protection/providerTextInput.mjs.map +1 -0
  125. package/dist/esm/rerank/index.mjs +3 -0
  126. package/dist/esm/rerank/search.mjs +45 -0
  127. package/dist/esm/rerank/search.mjs.map +1 -0
  128. package/dist/esm/rerank/systemone.mjs +70 -0
  129. package/dist/esm/rerank/systemone.mjs.map +1 -0
  130. package/dist/esm/run.mjs +11 -1
  131. package/dist/esm/run.mjs.map +1 -1
  132. package/dist/esm/stream.mjs +42 -14
  133. package/dist/esm/stream.mjs.map +1 -1
  134. package/dist/esm/summarization/node.mjs +26 -8
  135. package/dist/esm/summarization/node.mjs.map +1 -1
  136. package/dist/esm/tools/SubagentTool.mjs +11 -3
  137. package/dist/esm/tools/SubagentTool.mjs.map +1 -1
  138. package/dist/esm/tools/ToolNode.mjs +6 -5
  139. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  140. package/dist/esm/tools/search/rerankers.mjs +1 -1
  141. package/dist/esm/tools/search/search.mjs +3 -3
  142. package/dist/esm/tools/search/search.mjs.map +1 -1
  143. package/dist/esm/tools/search/tool.mjs +4 -3
  144. package/dist/esm/tools/search/tool.mjs.map +1 -1
  145. package/dist/esm/tools/subagent/SubagentExecutionRegistry.mjs +13 -2
  146. package/dist/esm/tools/subagent/SubagentExecutionRegistry.mjs.map +1 -1
  147. package/dist/esm/tools/subagent/SubagentExecutor.mjs +149 -26
  148. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
  149. package/dist/esm/tools/subagent/SubagentReplay.mjs +4 -2
  150. package/dist/esm/tools/subagent/SubagentReplay.mjs.map +1 -1
  151. package/dist/esm/tools/subagent/childGraphConfig.mjs +3 -1
  152. package/dist/esm/tools/subagent/childGraphConfig.mjs.map +1 -1
  153. package/dist/esm/tools/subagent/diagnostics.mjs +84 -3
  154. package/dist/esm/tools/subagent/diagnostics.mjs.map +1 -1
  155. package/dist/esm/tools/subagent/hostArgs.mjs +207 -0
  156. package/dist/esm/tools/subagent/hostArgs.mjs.map +1 -0
  157. package/dist/esm/tools/subagent/index.mjs +2 -0
  158. package/dist/esm/tools/toolErrorContent.mjs +1 -1
  159. package/dist/types/decisions/deadline.d.ts +3 -0
  160. package/dist/types/decisions/dialect.d.ts +11 -0
  161. package/dist/types/decisions/http.d.ts +22 -0
  162. package/dist/types/decisions/index.d.ts +10 -0
  163. package/dist/types/decisions/presets.d.ts +17 -0
  164. package/dist/types/decisions/questions.d.ts +8 -0
  165. package/dist/types/decisions/structuredChat.d.ts +17 -0
  166. package/dist/types/decisions/structuredOutput.d.ts +4 -0
  167. package/dist/types/decisions/traceMarker.d.ts +2 -0
  168. package/dist/types/decisions/transport.d.ts +29 -0
  169. package/dist/types/decisions/types.d.ts +119 -0
  170. package/dist/types/graphs/Graph.d.ts +7 -3
  171. package/dist/types/index.d.ts +4 -0
  172. package/dist/types/llm/invoke.d.ts +4 -1
  173. package/dist/types/llm/providerTextBoundary.d.ts +4 -0
  174. package/dist/types/llm/providerTextChunk.d.ts +7 -0
  175. package/dist/types/llm/providerTextControls.d.ts +18 -0
  176. package/dist/types/protection/providerText.d.ts +77 -0
  177. package/dist/types/protection/providerTextInput.d.ts +3 -0
  178. package/dist/types/rerank/index.d.ts +4 -0
  179. package/dist/types/rerank/search.d.ts +7 -0
  180. package/dist/types/rerank/systemone.d.ts +13 -0
  181. package/dist/types/rerank/types.d.ts +24 -0
  182. package/dist/types/run.d.ts +2 -0
  183. package/dist/types/tools/BashExecutor.d.ts +4 -0
  184. package/dist/types/tools/CodeExecutor.d.ts +4 -0
  185. package/dist/types/tools/ReadFile.d.ts +4 -0
  186. package/dist/types/tools/SkillTool.d.ts +4 -0
  187. package/dist/types/tools/SubagentTool.d.ts +2 -0
  188. package/dist/types/tools/ToolSearch.d.ts +4 -0
  189. package/dist/types/tools/search/schema.d.ts +4 -0
  190. package/dist/types/tools/search/types.d.ts +3 -1
  191. package/dist/types/tools/subagent/SubagentExecutionRegistry.d.ts +6 -0
  192. package/dist/types/tools/subagent/SubagentExecutor.d.ts +22 -1
  193. package/dist/types/tools/subagent/SubagentReplay.d.ts +3 -1
  194. package/dist/types/tools/subagent/diagnostics.d.ts +56 -8
  195. package/dist/types/tools/subagent/hostArgs.d.ts +57 -0
  196. package/dist/types/tools/subagent/index.d.ts +3 -0
  197. package/dist/types/types/graph.d.ts +39 -0
  198. package/dist/types/types/run.d.ts +6 -2
  199. package/dist/types/types/tools.d.ts +2 -0
  200. package/package.json +4 -4
  201. package/src/agents/AgentContext.ts +3 -2
  202. package/src/decisions/deadline.ts +92 -0
  203. package/src/decisions/dialect.ts +200 -0
  204. package/src/decisions/http.ts +175 -0
  205. package/src/decisions/index.ts +14 -0
  206. package/src/decisions/presets.ts +111 -0
  207. package/src/decisions/questions.ts +128 -0
  208. package/src/decisions/structuredChat.ts +358 -0
  209. package/src/decisions/structuredOutput.ts +25 -0
  210. package/src/decisions/traceMarker.ts +2 -0
  211. package/src/decisions/transport.ts +335 -0
  212. package/src/decisions/types.ts +193 -0
  213. package/src/graphs/Graph.ts +57 -9
  214. package/src/index.ts +9 -0
  215. package/src/langfuseToolOutputTracing.ts +8 -1
  216. package/src/llm/invoke.ts +48 -7
  217. package/src/llm/openai/index.ts +8 -0
  218. package/src/llm/providerTextBoundary.ts +446 -0
  219. package/src/llm/providerTextChunk.ts +15 -0
  220. package/src/llm/providerTextControls.ts +173 -0
  221. package/src/llm/stream/smoother.ts +4 -2
  222. package/src/protection/providerText.ts +325 -0
  223. package/src/protection/providerTextInput.ts +21 -0
  224. package/src/rerank/index.ts +4 -0
  225. package/src/rerank/search.ts +85 -0
  226. package/src/rerank/systemone.ts +140 -0
  227. package/src/rerank/types.ts +28 -0
  228. package/src/run.ts +13 -0
  229. package/src/stream.ts +33 -7
  230. package/src/summarization/node.ts +32 -14
  231. package/src/tools/SubagentTool.ts +14 -3
  232. package/src/tools/ToolNode.ts +7 -3
  233. package/src/tools/search/search.ts +4 -4
  234. package/src/tools/search/tool.ts +27 -25
  235. package/src/tools/search/types.ts +4 -1
  236. package/src/tools/subagent/SubagentExecutionRegistry.ts +27 -2
  237. package/src/tools/subagent/SubagentExecutor.ts +323 -28
  238. package/src/tools/subagent/SubagentReplay.ts +10 -3
  239. package/src/tools/subagent/childGraphConfig.ts +12 -1
  240. package/src/tools/subagent/diagnostics.ts +180 -9
  241. package/src/tools/subagent/hostArgs.ts +413 -0
  242. package/src/tools/subagent/index.ts +20 -0
  243. package/src/types/graph.ts +44 -0
  244. package/src/types/run.ts +6 -2
  245. package/src/types/tools.ts +6 -1
package/src/index.ts CHANGED
@@ -119,3 +119,12 @@ export type {
119
119
  StreamLimitState,
120
120
  StreamLimitKind,
121
121
  } from './llm/streamLimits';
122
+ export * from './decisions';
123
+ export * from './rerank';
124
+
125
+ export { PROVIDER_TEXT_PROTECTION_VERSION, ProviderTextProtectionError } from './protection/providerText';
126
+ export type {
127
+ ProviderTextProtection,
128
+ ProviderTextProtectionResult,
129
+ ProviderTextProtectionErrorCode,
130
+ } from './protection/providerText';
@@ -21,6 +21,7 @@ import {
21
21
  shouldDropLangfuseSpan,
22
22
  } from '@/langfuseTraceShaping';
23
23
  import { resolveToolOutputTracingConfigForSpan } from '@/langfuseRuntimeScope';
24
+ import { DECISION_PROMPT_PREFIX } from '@/decisions/traceMarker';
24
25
 
25
26
  export { LANGFUSE_TOOL_OUTPUT_REDACTION_TEXT, resolveLangfuseConfig };
26
27
 
@@ -603,6 +604,10 @@ function redactValue(
603
604
  return changed ? { value: next, changed } : { value, changed };
604
605
  }
605
606
 
607
+ if (typeof value === 'string' && value.startsWith(DECISION_PROMPT_PREFIX)) {
608
+ return { value: config.redactionText, changed: true };
609
+ }
610
+
606
611
  if (!isRecord(value)) {
607
612
  return { value, changed: false };
608
613
  }
@@ -686,7 +691,9 @@ function redactSerializedValue(
686
691
 
687
692
  const trimmed = value.trim();
688
693
  if (!trimmed.startsWith('{') && !trimmed.startsWith('[')) {
689
- return { value, changed: false };
694
+ return trimmed.startsWith(DECISION_PROMPT_PREFIX)
695
+ ? redactValue(trimmed, config, redactionContext)
696
+ : { value, changed: false };
690
697
  }
691
698
 
692
699
  try {
package/src/llm/invoke.ts CHANGED
@@ -14,6 +14,7 @@ import type { ToolCall } from '@langchain/core/messages/tool';
14
14
  import type { BaseMessage } from '@langchain/core/messages';
15
15
  import type { ToolOutputReferenceRegistry } from '@/tools/toolOutputReferences';
16
16
  import type { PreparedProviderRequest } from '@/llm/prepareProviderRequest';
17
+ import type { ProviderTextProtection } from '@/protection/providerText';
17
18
  import type { ContextOverflowContext } from '@/utils/errors';
18
19
  import type { StreamLimitState } from '@/llm/streamLimits';
19
20
  import type { PreemptAction } from '@/llm/preempt';
@@ -28,6 +29,12 @@ import {
28
29
  STREAM_LIMIT_REDISPATCH_KEY,
29
30
  STREAM_LIMIT_ATTEMPT_KEY,
30
31
  } from '@/llm/streamLimits';
32
+ import {
33
+ validateProviderTextProtection,
34
+ ProviderTextProtectionError,
35
+ createProviderTextRestartCancellation,
36
+ isProviderTextRestartCancellation,
37
+ } from '@/protection/providerText';
31
38
  import {
32
39
  inspectProviderMessageProjection,
33
40
  ProviderMessageProjectionInvariantError,
@@ -56,6 +63,7 @@ import {
56
63
  } from '@/llm/providers';
57
64
  import { ChatModelStreamHandler, dispatchesChatModelStream } from '@/stream';
58
65
  import { Constants, ContentTypes, GraphEvents, Providers } from '@/common';
66
+ import { withProviderTextBoundary } from '@/llm/providerTextBoundary';
59
67
  import { PreparedSubagentError } from '@/tools/preparedSubagents';
60
68
  import { assertNotTruncatedToolCall } from '@/llm/truncation';
61
69
  import { resolveClientOptionsModel } from '@/llm/request';
@@ -623,6 +631,7 @@ function appendStreamChunk({
623
631
  */
624
632
  interface AttemptInvokeCommonParams {
625
633
  context?: InvokeContext;
634
+ providerTextProtection?: ProviderTextProtection;
626
635
  onChunk?: OnChunk;
627
636
  /**
628
637
  * The agent lane this attempt belongs to, as the model node names it. Only
@@ -697,6 +706,9 @@ export async function attemptInvoke(
697
706
  params: AttemptInvokeParams,
698
707
  config?: RunnableConfig
699
708
  ): Promise<Partial<t.BaseGraphState>> {
709
+ const policy =
710
+ params.providerTextProtection ?? params.context?.providerTextProtection;
711
+ if (policy != null) validateProviderTextProtection(policy);
700
712
  const provider = resolveAttemptProvider(params);
701
713
  const providerStampedConfig: RunnableConfig = {
702
714
  ...config,
@@ -707,7 +719,14 @@ export async function attemptInvoke(
707
719
  resolvedProvider: provider,
708
720
  },
709
721
  };
710
- const request = resolveAttemptRequest(params, providerStampedConfig);
722
+ const preparedRequest = resolveAttemptRequest(params, providerStampedConfig);
723
+ const request =
724
+ policy == null
725
+ ? preparedRequest
726
+ : {
727
+ ...preparedRequest,
728
+ model: withProviderTextBoundary(preparedRequest.model, policy, provider),
729
+ };
711
730
  const configuredModel =
712
731
  providerStampedConfig.metadata?.[Constants.INVOKED_MODEL];
713
732
  const modelId =
@@ -763,6 +782,7 @@ export async function attemptInvoke(
763
782
  context: params.context,
764
783
  onChunk: params.onChunk,
765
784
  preemptAgentId: params.preemptAgentId,
785
+ providerTextProtection: policy,
766
786
  },
767
787
  stampedConfig
768
788
  );
@@ -775,6 +795,16 @@ export async function attemptInvoke(
775
795
  prepared?.finish(preparedAttempt, calls);
776
796
  return result;
777
797
  } catch (error) {
798
+ if (policy != null && config?.signal?.aborted === true) {
799
+ const reason: unknown = config.signal.reason;
800
+ if (reason instanceof StreamLimitExceededError || reason instanceof PreparedSubagentError) {
801
+ prepared?.finish(preparedAttempt, undefined, reason);
802
+ throw reason;
803
+ }
804
+ const cancelled = new ProviderTextProtectionError(reason instanceof ProviderTextProtectionError ? reason.code : 'cancelled');
805
+ prepared?.finish(preparedAttempt, undefined, cancelled);
806
+ throw cancelled;
807
+ }
778
808
  prepared?.finish(preparedAttempt, undefined, error);
779
809
  throw error;
780
810
  } finally {
@@ -799,9 +829,10 @@ async function attemptInvokeBody(
799
829
  context,
800
830
  onChunk,
801
831
  preemptAgentId,
832
+ providerTextProtection,
802
833
  }: Pick<
803
834
  AttemptInvokeCommonParams,
804
- 'context' | 'onChunk' | 'preemptAgentId'
835
+ 'context' | 'onChunk' | 'preemptAgentId' | 'providerTextProtection'
805
836
  > & {
806
837
  request: PreparedProviderRequest;
807
838
  },
@@ -1068,7 +1099,7 @@ async function attemptInvokeBody(
1068
1099
  notePreemptRestartedRun(sealedRunId, finalChunk);
1069
1100
  }
1070
1101
  restartRoute = 'aborted';
1071
- restartController.abort();
1102
+ restartController.abort(providerTextProtection == null ? undefined : createProviderTextRestartCancellation());
1072
1103
  return true;
1073
1104
  };
1074
1105
  const unsubscribeWake =
@@ -1085,7 +1116,8 @@ async function attemptInvokeBody(
1085
1116
  if (
1086
1117
  signal?.aborted === true &&
1087
1118
  (signal.reason instanceof StreamLimitExceededError ||
1088
- signal.reason instanceof PreparedSubagentError)
1119
+ signal.reason instanceof PreparedSubagentError ||
1120
+ signal.reason instanceof ProviderTextProtectionError)
1089
1121
  ) {
1090
1122
  throw signal.reason;
1091
1123
  }
@@ -1334,6 +1366,7 @@ async function attemptInvokeBody(
1334
1366
  restartRoute === 'aborted' &&
1335
1367
  !(error instanceof StreamLimitExceededError) &&
1336
1368
  !(error instanceof PreparedSubagentError) &&
1369
+ (!(error instanceof ProviderTextProtectionError) || isProviderTextRestartCancellation(error)) &&
1337
1370
  config.signal?.aborted !== true;
1338
1371
  if (!ownAbort) {
1339
1372
  throw error;
@@ -1561,6 +1594,7 @@ export async function tryFallbackProviders({
1561
1594
  context,
1562
1595
  onChunk,
1563
1596
  streamLimitState,
1597
+ providerTextProtection,
1564
1598
  preemptAgentId,
1565
1599
  overflowContext,
1566
1600
  prepareProviderRequest: prepareFallbackRequest,
@@ -1576,6 +1610,7 @@ export async function tryFallbackProviders({
1576
1610
  /** Accounting-lease owner forwarded to each fallback attempt (see
1577
1611
  * `AttemptInvokeParams.streamLimitState`). */
1578
1612
  streamLimitState?: StreamLimitState;
1613
+ providerTextProtection?: ProviderTextProtection;
1579
1614
  /** Forwarded so a fallback-served attempt records a discarded turn in the
1580
1615
  * SAME lane the primary would have (see
1581
1616
  * `AttemptInvokeParams.preemptAgentId`). Dropping it here would leave the
@@ -1610,6 +1645,7 @@ export async function tryFallbackProviders({
1610
1645
  config?: RunnableConfig;
1611
1646
  }) => BaseMessage[] | Promise<BaseMessage[]>;
1612
1647
  }): Promise<Partial<t.BaseGraphState> | undefined> {
1648
+ if (primaryError instanceof ProviderTextProtectionError) throw primaryError;
1613
1649
  const isOverflow = (
1614
1650
  error: unknown,
1615
1651
  contextOverride = overflowContext
@@ -1686,7 +1722,8 @@ export async function tryFallbackProviders({
1686
1722
  if (
1687
1723
  config?.signal?.aborted === true &&
1688
1724
  (config.signal.reason instanceof StreamLimitExceededError ||
1689
- config.signal.reason instanceof PreparedSubagentError)
1725
+ config.signal.reason instanceof PreparedSubagentError ||
1726
+ config.signal.reason instanceof ProviderTextProtectionError)
1690
1727
  ) {
1691
1728
  throw config.signal.reason;
1692
1729
  }
@@ -1697,6 +1734,7 @@ export async function tryFallbackProviders({
1697
1734
  context,
1698
1735
  onChunk,
1699
1736
  streamLimitState,
1737
+ providerTextProtection,
1700
1738
  preemptAgentId,
1701
1739
  },
1702
1740
  fbConfig
@@ -1710,6 +1748,7 @@ export async function tryFallbackProviders({
1710
1748
  context,
1711
1749
  onChunk,
1712
1750
  streamLimitState,
1751
+ providerTextProtection,
1713
1752
  preemptAgentId,
1714
1753
  },
1715
1754
  fbConfig
@@ -1723,7 +1762,8 @@ export async function tryFallbackProviders({
1723
1762
  if (
1724
1763
  e instanceof StreamLimitExceededError ||
1725
1764
  e instanceof PreparedSubagentError ||
1726
- e instanceof InvalidModelToolCallError
1765
+ e instanceof InvalidModelToolCallError ||
1766
+ e instanceof ProviderTextProtectionError
1727
1767
  ) {
1728
1768
  throw e;
1729
1769
  }
@@ -1734,7 +1774,8 @@ export async function tryFallbackProviders({
1734
1774
  if (
1735
1775
  config?.signal?.aborted === true &&
1736
1776
  (config.signal.reason instanceof StreamLimitExceededError ||
1737
- config.signal.reason instanceof PreparedSubagentError)
1777
+ config.signal.reason instanceof PreparedSubagentError ||
1778
+ config.signal.reason instanceof ProviderTextProtectionError)
1738
1779
  ) {
1739
1780
  throw config.signal.reason;
1740
1781
  }
@@ -63,6 +63,7 @@ import {
63
63
  hasToolCallChunks,
64
64
  getReasoningKwargsText,
65
65
  } from '@/llm/stream/chunkAdapters';
66
+ import { registerProviderTextChunkConstructor } from '@/llm/providerTextChunk';
66
67
  import { isReasoningModel, _convertMessagesToOpenAIParams } from './utils';
67
68
  import { smoothStream, resolveStreamDelay } from '@/llm/stream/smoother';
68
69
  import { INTENT_ARG, isIntentLabelProperty } from '@/tools/intentArg';
@@ -855,6 +856,8 @@ class ResponsesReplayAIMessageChunk extends AIMessageChunk {
855
856
  }
856
857
  }
857
858
 
859
+ registerProviderTextChunkConstructor(ResponsesReplayAIMessageChunk);
860
+
858
861
  function makeResponsesReplayAggregationSafe(
859
862
  chunk: ChatGenerationChunk
860
863
  ): ChatGenerationChunk {
@@ -2923,6 +2926,11 @@ export class AzureChatOpenAI extends OriginalAzureChatOpenAI {
2923
2926
  super(fields);
2924
2927
  this.completions = new LibreChatAzureOpenAICompletions(fields);
2925
2928
  this.responses = new LibreChatAzureOpenAIResponses(fields);
2929
+ this.fields = {
2930
+ ...this.fields,
2931
+ completions: this.completions,
2932
+ responses: this.responses,
2933
+ };
2926
2934
  this._lc_stream_delay = resolveStreamDelay(fields?._lc_stream_delay);
2927
2935
  this.firstPartyEndpoint = fields?.firstPartyEndpoint;
2928
2936
  }