@librechat/agents 3.2.32 → 3.2.34

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 (597) hide show
  1. package/dist/cjs/_virtual/_rolldown/runtime.cjs +23 -0
  2. package/dist/cjs/agents/AgentContext.cjs +844 -1046
  3. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  4. package/dist/cjs/common/constants.cjs +13 -13
  5. package/dist/cjs/common/constants.cjs.map +1 -1
  6. package/dist/cjs/common/enum.cjs +233 -240
  7. package/dist/cjs/common/enum.cjs.map +1 -1
  8. package/dist/cjs/common/index.cjs +2 -0
  9. package/dist/cjs/events.cjs +121 -169
  10. package/dist/cjs/events.cjs.map +1 -1
  11. package/dist/cjs/graphs/Graph.cjs +1389 -1807
  12. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  13. package/dist/cjs/graphs/MultiAgentGraph.cjs +713 -945
  14. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
  15. package/dist/cjs/graphs/index.cjs +2 -0
  16. package/dist/cjs/hitl/askUserQuestion.cjs +60 -62
  17. package/dist/cjs/hitl/askUserQuestion.cjs.map +1 -1
  18. package/dist/cjs/hitl/index.cjs +1 -0
  19. package/dist/cjs/hooks/HookRegistry.cjs +176 -202
  20. package/dist/cjs/hooks/HookRegistry.cjs.map +1 -1
  21. package/dist/cjs/hooks/createToolPolicyHook.cjs +71 -101
  22. package/dist/cjs/hooks/createToolPolicyHook.cjs.map +1 -1
  23. package/dist/cjs/hooks/createWorkspacePolicyHook.cjs +170 -273
  24. package/dist/cjs/hooks/createWorkspacePolicyHook.cjs.map +1 -1
  25. package/dist/cjs/hooks/executeHooks.cjs +227 -282
  26. package/dist/cjs/hooks/executeHooks.cjs.map +1 -1
  27. package/dist/cjs/hooks/index.cjs +6 -0
  28. package/dist/cjs/hooks/matchers.cjs +196 -230
  29. package/dist/cjs/hooks/matchers.cjs.map +1 -1
  30. package/dist/cjs/hooks/types.cjs +24 -24
  31. package/dist/cjs/hooks/types.cjs.map +1 -1
  32. package/dist/cjs/instrumentation.cjs +110 -137
  33. package/dist/cjs/instrumentation.cjs.map +1 -1
  34. package/dist/cjs/langchain/google-common.cjs +0 -3
  35. package/dist/cjs/langchain/index.cjs +80 -43
  36. package/dist/cjs/langchain/language_models/chat_models.cjs +0 -3
  37. package/dist/cjs/langchain/messages/tool.cjs +0 -3
  38. package/dist/cjs/langchain/messages.cjs +35 -18
  39. package/dist/cjs/langchain/openai.cjs +0 -3
  40. package/dist/cjs/langchain/prompts.cjs +5 -8
  41. package/dist/cjs/langchain/runnables.cjs +11 -10
  42. package/dist/cjs/langchain/tools.cjs +14 -11
  43. package/dist/cjs/langchain/utils/env.cjs +5 -8
  44. package/dist/cjs/langfuse.cjs +60 -79
  45. package/dist/cjs/langfuse.cjs.map +1 -1
  46. package/dist/cjs/langfuseToolOutputTracing.cjs +267 -399
  47. package/dist/cjs/langfuseToolOutputTracing.cjs.map +1 -1
  48. package/dist/cjs/llm/anthropic/index.cjs +432 -562
  49. package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
  50. package/dist/cjs/llm/anthropic/types.cjs +23 -47
  51. package/dist/cjs/llm/anthropic/types.cjs.map +1 -1
  52. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +441 -731
  53. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  54. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +171 -256
  55. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -1
  56. package/dist/cjs/llm/anthropic/utils/output_parsers.cjs +2 -0
  57. package/dist/cjs/llm/anthropic/utils/tools.cjs +12 -26
  58. package/dist/cjs/llm/anthropic/utils/tools.cjs.map +1 -1
  59. package/dist/cjs/llm/bedrock/index.cjs +214 -240
  60. package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
  61. package/dist/cjs/llm/bedrock/toolCache.cjs +84 -106
  62. package/dist/cjs/llm/bedrock/toolCache.cjs.map +1 -1
  63. package/dist/cjs/llm/bedrock/utils/index.cjs +2 -0
  64. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs +357 -620
  65. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs.map +1 -1
  66. package/dist/cjs/llm/bedrock/utils/message_outputs.cjs +141 -149
  67. package/dist/cjs/llm/bedrock/utils/message_outputs.cjs.map +1 -1
  68. package/dist/cjs/llm/fake.cjs +86 -96
  69. package/dist/cjs/llm/fake.cjs.map +1 -1
  70. package/dist/cjs/llm/google/index.cjs +183 -237
  71. package/dist/cjs/llm/google/index.cjs.map +1 -1
  72. package/dist/cjs/llm/google/utils/common.cjs +404 -674
  73. package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
  74. package/dist/cjs/llm/google/utils/zod_to_genai_parameters.cjs +2 -0
  75. package/dist/cjs/llm/init.cjs +44 -53
  76. package/dist/cjs/llm/init.cjs.map +1 -1
  77. package/dist/cjs/llm/invoke.cjs +142 -182
  78. package/dist/cjs/llm/invoke.cjs.map +1 -1
  79. package/dist/cjs/llm/openai/index.cjs +1035 -1273
  80. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  81. package/dist/cjs/llm/openai/utils/index.cjs +189 -316
  82. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  83. package/dist/cjs/llm/openrouter/index.cjs +102 -153
  84. package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
  85. package/dist/cjs/llm/openrouter/toolCache.cjs +35 -44
  86. package/dist/cjs/llm/openrouter/toolCache.cjs.map +1 -1
  87. package/dist/cjs/llm/providers.cjs +29 -37
  88. package/dist/cjs/llm/providers.cjs.map +1 -1
  89. package/dist/cjs/llm/request.cjs +20 -33
  90. package/dist/cjs/llm/request.cjs.map +1 -1
  91. package/dist/cjs/llm/vertexai/index.cjs +446 -453
  92. package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
  93. package/dist/cjs/main.cjs +547 -528
  94. package/dist/cjs/messages/anthropicToolCache.cjs +68 -119
  95. package/dist/cjs/messages/anthropicToolCache.cjs.map +1 -1
  96. package/dist/cjs/messages/cache.cjs +305 -418
  97. package/dist/cjs/messages/cache.cjs.map +1 -1
  98. package/dist/cjs/messages/content.cjs +36 -49
  99. package/dist/cjs/messages/content.cjs.map +1 -1
  100. package/dist/cjs/messages/contextPruning.cjs +112 -145
  101. package/dist/cjs/messages/contextPruning.cjs.map +1 -1
  102. package/dist/cjs/messages/contextPruningSettings.cjs +36 -46
  103. package/dist/cjs/messages/contextPruningSettings.cjs.map +1 -1
  104. package/dist/cjs/messages/core.cjs +256 -397
  105. package/dist/cjs/messages/core.cjs.map +1 -1
  106. package/dist/cjs/messages/format.cjs +904 -1387
  107. package/dist/cjs/messages/format.cjs.map +1 -1
  108. package/dist/cjs/messages/ids.cjs +16 -20
  109. package/dist/cjs/messages/ids.cjs.map +1 -1
  110. package/dist/cjs/messages/index.cjs +12 -0
  111. package/dist/cjs/messages/langchain.cjs +18 -18
  112. package/dist/cjs/messages/langchain.cjs.map +1 -1
  113. package/dist/cjs/messages/prune.cjs +1054 -1517
  114. package/dist/cjs/messages/prune.cjs.map +1 -1
  115. package/dist/cjs/messages/recency.cjs +77 -95
  116. package/dist/cjs/messages/recency.cjs.map +1 -1
  117. package/dist/cjs/messages/reducer.cjs +63 -78
  118. package/dist/cjs/messages/reducer.cjs.map +1 -1
  119. package/dist/cjs/messages/tools.cjs +51 -79
  120. package/dist/cjs/messages/tools.cjs.map +1 -1
  121. package/dist/cjs/openai/index.cjs +171 -217
  122. package/dist/cjs/openai/index.cjs.map +1 -1
  123. package/dist/cjs/responses/index.cjs +302 -391
  124. package/dist/cjs/responses/index.cjs.map +1 -1
  125. package/dist/cjs/run.cjs +903 -1113
  126. package/dist/cjs/run.cjs.map +1 -1
  127. package/dist/cjs/session/AgentSession.cjs +805 -986
  128. package/dist/cjs/session/AgentSession.cjs.map +1 -1
  129. package/dist/cjs/session/JsonlSessionStore.cjs +327 -410
  130. package/dist/cjs/session/JsonlSessionStore.cjs.map +1 -1
  131. package/dist/cjs/session/handlers.cjs +192 -208
  132. package/dist/cjs/session/handlers.cjs.map +1 -1
  133. package/dist/cjs/session/ids.cjs +9 -10
  134. package/dist/cjs/session/ids.cjs.map +1 -1
  135. package/dist/cjs/session/index.cjs +4 -0
  136. package/dist/cjs/session/messageSerialization.cjs +94 -156
  137. package/dist/cjs/session/messageSerialization.cjs.map +1 -1
  138. package/dist/cjs/splitStream.cjs +147 -206
  139. package/dist/cjs/splitStream.cjs.map +1 -1
  140. package/dist/cjs/stream.cjs +874 -1344
  141. package/dist/cjs/stream.cjs.map +1 -1
  142. package/dist/cjs/summarization/index.cjs +57 -101
  143. package/dist/cjs/summarization/index.cjs.map +1 -1
  144. package/dist/cjs/summarization/node.cjs +643 -796
  145. package/dist/cjs/summarization/node.cjs.map +1 -1
  146. package/dist/cjs/tools/BashExecutor.cjs +110 -136
  147. package/dist/cjs/tools/BashExecutor.cjs.map +1 -1
  148. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs +165 -245
  149. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs.map +1 -1
  150. package/dist/cjs/tools/Calculator.cjs +36 -57
  151. package/dist/cjs/tools/Calculator.cjs.map +1 -1
  152. package/dist/cjs/tools/CodeExecutor.cjs +126 -168
  153. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
  154. package/dist/cjs/tools/CodeSessionFileSummary.cjs +36 -46
  155. package/dist/cjs/tools/CodeSessionFileSummary.cjs.map +1 -1
  156. package/dist/cjs/tools/ProgrammaticToolCalling.cjs +459 -649
  157. package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
  158. package/dist/cjs/tools/ReadFile.cjs +17 -20
  159. package/dist/cjs/tools/ReadFile.cjs.map +1 -1
  160. package/dist/cjs/tools/SkillTool.cjs +26 -27
  161. package/dist/cjs/tools/SkillTool.cjs.map +1 -1
  162. package/dist/cjs/tools/SubagentTool.cjs +59 -61
  163. package/dist/cjs/tools/SubagentTool.cjs.map +1 -1
  164. package/dist/cjs/tools/ToolNode.cjs +2146 -2686
  165. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  166. package/dist/cjs/tools/ToolSearch.cjs +663 -825
  167. package/dist/cjs/tools/ToolSearch.cjs.map +1 -1
  168. package/dist/cjs/tools/cloudflare/CloudflareBridgeRuntime.cjs +248 -340
  169. package/dist/cjs/tools/cloudflare/CloudflareBridgeRuntime.cjs.map +1 -1
  170. package/dist/cjs/tools/cloudflare/CloudflareProgrammaticToolCalling.cjs +170 -197
  171. package/dist/cjs/tools/cloudflare/CloudflareProgrammaticToolCalling.cjs.map +1 -1
  172. package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs +425 -520
  173. package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs.map +1 -1
  174. package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs +91 -124
  175. package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs.map +1 -1
  176. package/dist/cjs/tools/cloudflare/index.cjs +4 -0
  177. package/dist/cjs/tools/eagerEventExecution.cjs +75 -99
  178. package/dist/cjs/tools/eagerEventExecution.cjs.map +1 -1
  179. package/dist/cjs/tools/handlers.cjs +200 -262
  180. package/dist/cjs/tools/handlers.cjs.map +1 -1
  181. package/dist/cjs/tools/local/CompileCheckTool.cjs +150 -212
  182. package/dist/cjs/tools/local/CompileCheckTool.cjs.map +1 -1
  183. package/dist/cjs/tools/local/FileCheckpointer.cjs +77 -85
  184. package/dist/cjs/tools/local/FileCheckpointer.cjs.map +1 -1
  185. package/dist/cjs/tools/local/LocalCodingTools.cjs +763 -1022
  186. package/dist/cjs/tools/local/LocalCodingTools.cjs.map +1 -1
  187. package/dist/cjs/tools/local/LocalExecutionEngine.cjs +666 -941
  188. package/dist/cjs/tools/local/LocalExecutionEngine.cjs.map +1 -1
  189. package/dist/cjs/tools/local/LocalExecutionTools.cjs +49 -92
  190. package/dist/cjs/tools/local/LocalExecutionTools.cjs.map +1 -1
  191. package/dist/cjs/tools/local/LocalProgrammaticToolCalling.cjs +286 -354
  192. package/dist/cjs/tools/local/LocalProgrammaticToolCalling.cjs.map +1 -1
  193. package/dist/cjs/tools/local/attachments.cjs +108 -165
  194. package/dist/cjs/tools/local/attachments.cjs.map +1 -1
  195. package/dist/cjs/tools/local/bashAst.cjs +99 -113
  196. package/dist/cjs/tools/local/bashAst.cjs.map +1 -1
  197. package/dist/cjs/tools/local/editStrategies.cjs +126 -169
  198. package/dist/cjs/tools/local/editStrategies.cjs.map +1 -1
  199. package/dist/cjs/tools/local/index.cjs +12 -0
  200. package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs +136 -218
  201. package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs.map +1 -1
  202. package/dist/cjs/tools/local/syntaxCheck.cjs +142 -161
  203. package/dist/cjs/tools/local/syntaxCheck.cjs.map +1 -1
  204. package/dist/cjs/tools/local/textEncoding.cjs +25 -23
  205. package/dist/cjs/tools/local/textEncoding.cjs.map +1 -1
  206. package/dist/cjs/tools/local/workspaceFS.cjs +38 -46
  207. package/dist/cjs/tools/local/workspaceFS.cjs.map +1 -1
  208. package/dist/cjs/tools/ptcTimeout.cjs +27 -47
  209. package/dist/cjs/tools/ptcTimeout.cjs.map +1 -1
  210. package/dist/cjs/tools/schema.cjs +24 -23
  211. package/dist/cjs/tools/schema.cjs.map +1 -1
  212. package/dist/cjs/tools/search/anthropic.cjs +24 -33
  213. package/dist/cjs/tools/search/anthropic.cjs.map +1 -1
  214. package/dist/cjs/tools/search/content.cjs +95 -137
  215. package/dist/cjs/tools/search/content.cjs.map +1 -1
  216. package/dist/cjs/tools/search/firecrawl.cjs +141 -172
  217. package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
  218. package/dist/cjs/tools/search/format.cjs +128 -196
  219. package/dist/cjs/tools/search/format.cjs.map +1 -1
  220. package/dist/cjs/tools/search/highlights.cjs +165 -232
  221. package/dist/cjs/tools/search/highlights.cjs.map +1 -1
  222. package/dist/cjs/tools/search/index.cjs +2 -0
  223. package/dist/cjs/tools/search/rerankers.cjs +151 -174
  224. package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
  225. package/dist/cjs/tools/search/schema.cjs +40 -39
  226. package/dist/cjs/tools/search/schema.cjs.map +1 -1
  227. package/dist/cjs/tools/search/search.cjs +428 -530
  228. package/dist/cjs/tools/search/search.cjs.map +1 -1
  229. package/dist/cjs/tools/search/serper-scraper.cjs +106 -127
  230. package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -1
  231. package/dist/cjs/tools/search/tavily-scraper.cjs +129 -181
  232. package/dist/cjs/tools/search/tavily-scraper.cjs.map +1 -1
  233. package/dist/cjs/tools/search/tavily-search.cjs +295 -359
  234. package/dist/cjs/tools/search/tavily-search.cjs.map +1 -1
  235. package/dist/cjs/tools/search/tool.cjs +260 -299
  236. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  237. package/dist/cjs/tools/search/utils.cjs +74 -117
  238. package/dist/cjs/tools/search/utils.cjs.map +1 -1
  239. package/dist/cjs/tools/skillCatalog.cjs +54 -72
  240. package/dist/cjs/tools/skillCatalog.cjs.map +1 -1
  241. package/dist/cjs/tools/streamedToolCallSeals.cjs +46 -34
  242. package/dist/cjs/tools/streamedToolCallSeals.cjs.map +1 -1
  243. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +612 -771
  244. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
  245. package/dist/cjs/tools/subagent/index.cjs +1 -0
  246. package/dist/cjs/tools/toolOutputReferences.cjs +523 -630
  247. package/dist/cjs/tools/toolOutputReferences.cjs.map +1 -1
  248. package/dist/cjs/utils/callbacks.cjs +11 -21
  249. package/dist/cjs/utils/callbacks.cjs.map +1 -1
  250. package/dist/cjs/utils/errors.cjs +70 -95
  251. package/dist/cjs/utils/errors.cjs.map +1 -1
  252. package/dist/cjs/utils/events.cjs +32 -42
  253. package/dist/cjs/utils/events.cjs.map +1 -1
  254. package/dist/cjs/utils/graph.cjs +8 -12
  255. package/dist/cjs/utils/graph.cjs.map +1 -1
  256. package/dist/cjs/utils/handlers.cjs +60 -82
  257. package/dist/cjs/utils/handlers.cjs.map +1 -1
  258. package/dist/cjs/utils/index.cjs +9 -0
  259. package/dist/cjs/utils/llm.cjs +19 -27
  260. package/dist/cjs/utils/llm.cjs.map +1 -1
  261. package/dist/cjs/utils/misc.cjs +30 -46
  262. package/dist/cjs/utils/misc.cjs.map +1 -1
  263. package/dist/cjs/utils/run.cjs +50 -66
  264. package/dist/cjs/utils/run.cjs.map +1 -1
  265. package/dist/cjs/utils/schema.cjs +11 -19
  266. package/dist/cjs/utils/schema.cjs.map +1 -1
  267. package/dist/cjs/utils/title.cjs +71 -106
  268. package/dist/cjs/utils/title.cjs.map +1 -1
  269. package/dist/cjs/utils/tokens.cjs +186 -283
  270. package/dist/cjs/utils/tokens.cjs.map +1 -1
  271. package/dist/cjs/utils/truncation.cjs +95 -114
  272. package/dist/cjs/utils/truncation.cjs.map +1 -1
  273. package/dist/esm/agents/AgentContext.mjs +844 -1044
  274. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  275. package/dist/esm/common/constants.mjs +13 -11
  276. package/dist/esm/common/constants.mjs.map +1 -1
  277. package/dist/esm/common/enum.mjs +221 -238
  278. package/dist/esm/common/enum.mjs.map +1 -1
  279. package/dist/esm/common/index.mjs +3 -0
  280. package/dist/esm/events.mjs +121 -167
  281. package/dist/esm/events.mjs.map +1 -1
  282. package/dist/esm/graphs/Graph.mjs +1388 -1804
  283. package/dist/esm/graphs/Graph.mjs.map +1 -1
  284. package/dist/esm/graphs/MultiAgentGraph.mjs +713 -943
  285. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  286. package/dist/esm/graphs/index.mjs +3 -0
  287. package/dist/esm/hitl/askUserQuestion.mjs +60 -60
  288. package/dist/esm/hitl/askUserQuestion.mjs.map +1 -1
  289. package/dist/esm/hitl/index.mjs +2 -0
  290. package/dist/esm/hooks/HookRegistry.mjs +176 -200
  291. package/dist/esm/hooks/HookRegistry.mjs.map +1 -1
  292. package/dist/esm/hooks/createToolPolicyHook.mjs +71 -99
  293. package/dist/esm/hooks/createToolPolicyHook.mjs.map +1 -1
  294. package/dist/esm/hooks/createWorkspacePolicyHook.mjs +170 -271
  295. package/dist/esm/hooks/createWorkspacePolicyHook.mjs.map +1 -1
  296. package/dist/esm/hooks/executeHooks.mjs +227 -280
  297. package/dist/esm/hooks/executeHooks.mjs.map +1 -1
  298. package/dist/esm/hooks/index.mjs +7 -0
  299. package/dist/esm/hooks/matchers.mjs +196 -228
  300. package/dist/esm/hooks/matchers.mjs.map +1 -1
  301. package/dist/esm/hooks/types.mjs +24 -22
  302. package/dist/esm/hooks/types.mjs.map +1 -1
  303. package/dist/esm/instrumentation.mjs +109 -132
  304. package/dist/esm/instrumentation.mjs.map +1 -1
  305. package/dist/esm/langchain/google-common.mjs +1 -2
  306. package/dist/esm/langchain/index.mjs +5 -5
  307. package/dist/esm/langchain/language_models/chat_models.mjs +1 -2
  308. package/dist/esm/langchain/messages/tool.mjs +1 -2
  309. package/dist/esm/langchain/messages.mjs +2 -2
  310. package/dist/esm/langchain/openai.mjs +1 -2
  311. package/dist/esm/langchain/prompts.mjs +2 -2
  312. package/dist/esm/langchain/runnables.mjs +2 -2
  313. package/dist/esm/langchain/tools.mjs +2 -2
  314. package/dist/esm/langchain/utils/env.mjs +2 -2
  315. package/dist/esm/langfuse.mjs +60 -76
  316. package/dist/esm/langfuse.mjs.map +1 -1
  317. package/dist/esm/langfuseToolOutputTracing.mjs +267 -395
  318. package/dist/esm/langfuseToolOutputTracing.mjs.map +1 -1
  319. package/dist/esm/llm/anthropic/index.mjs +432 -559
  320. package/dist/esm/llm/anthropic/index.mjs.map +1 -1
  321. package/dist/esm/llm/anthropic/types.mjs +23 -45
  322. package/dist/esm/llm/anthropic/types.mjs.map +1 -1
  323. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +439 -725
  324. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  325. package/dist/esm/llm/anthropic/utils/message_outputs.mjs +171 -253
  326. package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -1
  327. package/dist/esm/llm/anthropic/utils/output_parsers.mjs +3 -0
  328. package/dist/esm/llm/anthropic/utils/tools.mjs +12 -24
  329. package/dist/esm/llm/anthropic/utils/tools.mjs.map +1 -1
  330. package/dist/esm/llm/bedrock/index.mjs +214 -238
  331. package/dist/esm/llm/bedrock/index.mjs.map +1 -1
  332. package/dist/esm/llm/bedrock/toolCache.mjs +84 -104
  333. package/dist/esm/llm/bedrock/toolCache.mjs.map +1 -1
  334. package/dist/esm/llm/bedrock/utils/index.mjs +3 -0
  335. package/dist/esm/llm/bedrock/utils/message_inputs.mjs +357 -618
  336. package/dist/esm/llm/bedrock/utils/message_inputs.mjs.map +1 -1
  337. package/dist/esm/llm/bedrock/utils/message_outputs.mjs +140 -147
  338. package/dist/esm/llm/bedrock/utils/message_outputs.mjs.map +1 -1
  339. package/dist/esm/llm/fake.mjs +86 -94
  340. package/dist/esm/llm/fake.mjs.map +1 -1
  341. package/dist/esm/llm/google/index.mjs +183 -235
  342. package/dist/esm/llm/google/index.mjs.map +1 -1
  343. package/dist/esm/llm/google/utils/common.mjs +403 -666
  344. package/dist/esm/llm/google/utils/common.mjs.map +1 -1
  345. package/dist/esm/llm/google/utils/zod_to_genai_parameters.mjs +3 -0
  346. package/dist/esm/llm/init.mjs +44 -51
  347. package/dist/esm/llm/init.mjs.map +1 -1
  348. package/dist/esm/llm/invoke.mjs +142 -180
  349. package/dist/esm/llm/invoke.mjs.map +1 -1
  350. package/dist/esm/llm/openai/index.mjs +1035 -1268
  351. package/dist/esm/llm/openai/index.mjs.map +1 -1
  352. package/dist/esm/llm/openai/utils/index.mjs +188 -312
  353. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  354. package/dist/esm/llm/openrouter/index.mjs +102 -151
  355. package/dist/esm/llm/openrouter/index.mjs.map +1 -1
  356. package/dist/esm/llm/openrouter/toolCache.mjs +35 -42
  357. package/dist/esm/llm/openrouter/toolCache.mjs.map +1 -1
  358. package/dist/esm/llm/providers.mjs +29 -34
  359. package/dist/esm/llm/providers.mjs.map +1 -1
  360. package/dist/esm/llm/request.mjs +20 -31
  361. package/dist/esm/llm/request.mjs.map +1 -1
  362. package/dist/esm/llm/vertexai/index.mjs +446 -449
  363. package/dist/esm/llm/vertexai/index.mjs.map +1 -1
  364. package/dist/esm/main.mjs +99 -87
  365. package/dist/esm/messages/anthropicToolCache.mjs +68 -117
  366. package/dist/esm/messages/anthropicToolCache.mjs.map +1 -1
  367. package/dist/esm/messages/cache.mjs +305 -416
  368. package/dist/esm/messages/cache.mjs.map +1 -1
  369. package/dist/esm/messages/content.mjs +36 -47
  370. package/dist/esm/messages/content.mjs.map +1 -1
  371. package/dist/esm/messages/contextPruning.mjs +112 -143
  372. package/dist/esm/messages/contextPruning.mjs.map +1 -1
  373. package/dist/esm/messages/contextPruningSettings.mjs +36 -44
  374. package/dist/esm/messages/contextPruningSettings.mjs.map +1 -1
  375. package/dist/esm/messages/core.mjs +254 -393
  376. package/dist/esm/messages/core.mjs.map +1 -1
  377. package/dist/esm/messages/format.mjs +902 -1383
  378. package/dist/esm/messages/format.mjs.map +1 -1
  379. package/dist/esm/messages/ids.mjs +16 -18
  380. package/dist/esm/messages/ids.mjs.map +1 -1
  381. package/dist/esm/messages/index.mjs +13 -0
  382. package/dist/esm/messages/langchain.mjs +18 -16
  383. package/dist/esm/messages/langchain.mjs.map +1 -1
  384. package/dist/esm/messages/prune.mjs +1053 -1514
  385. package/dist/esm/messages/prune.mjs.map +1 -1
  386. package/dist/esm/messages/recency.mjs +77 -93
  387. package/dist/esm/messages/recency.mjs.map +1 -1
  388. package/dist/esm/messages/reducer.mjs +63 -76
  389. package/dist/esm/messages/reducer.mjs.map +1 -1
  390. package/dist/esm/messages/tools.mjs +49 -75
  391. package/dist/esm/messages/tools.mjs.map +1 -1
  392. package/dist/esm/openai/index.mjs +170 -215
  393. package/dist/esm/openai/index.mjs.map +1 -1
  394. package/dist/esm/responses/index.mjs +301 -389
  395. package/dist/esm/responses/index.mjs.map +1 -1
  396. package/dist/esm/run.mjs +903 -1111
  397. package/dist/esm/run.mjs.map +1 -1
  398. package/dist/esm/session/AgentSession.mjs +806 -985
  399. package/dist/esm/session/AgentSession.mjs.map +1 -1
  400. package/dist/esm/session/JsonlSessionStore.mjs +326 -407
  401. package/dist/esm/session/JsonlSessionStore.mjs.map +1 -1
  402. package/dist/esm/session/handlers.mjs +192 -206
  403. package/dist/esm/session/handlers.mjs.map +1 -1
  404. package/dist/esm/session/ids.mjs +9 -8
  405. package/dist/esm/session/ids.mjs.map +1 -1
  406. package/dist/esm/session/index.mjs +5 -0
  407. package/dist/esm/session/messageSerialization.mjs +94 -154
  408. package/dist/esm/session/messageSerialization.mjs.map +1 -1
  409. package/dist/esm/splitStream.mjs +147 -204
  410. package/dist/esm/splitStream.mjs.map +1 -1
  411. package/dist/esm/stream.mjs +872 -1341
  412. package/dist/esm/stream.mjs.map +1 -1
  413. package/dist/esm/summarization/index.mjs +57 -99
  414. package/dist/esm/summarization/index.mjs.map +1 -1
  415. package/dist/esm/summarization/node.mjs +640 -790
  416. package/dist/esm/summarization/node.mjs.map +1 -1
  417. package/dist/esm/tools/BashExecutor.mjs +103 -129
  418. package/dist/esm/tools/BashExecutor.mjs.map +1 -1
  419. package/dist/esm/tools/BashProgrammaticToolCalling.mjs +162 -239
  420. package/dist/esm/tools/BashProgrammaticToolCalling.mjs.map +1 -1
  421. package/dist/esm/tools/Calculator.mjs +34 -36
  422. package/dist/esm/tools/Calculator.mjs.map +1 -1
  423. package/dist/esm/tools/CodeExecutor.mjs +123 -164
  424. package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
  425. package/dist/esm/tools/CodeSessionFileSummary.mjs +36 -44
  426. package/dist/esm/tools/CodeSessionFileSummary.mjs.map +1 -1
  427. package/dist/esm/tools/ProgrammaticToolCalling.mjs +454 -644
  428. package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
  429. package/dist/esm/tools/ReadFile.mjs +17 -18
  430. package/dist/esm/tools/ReadFile.mjs.map +1 -1
  431. package/dist/esm/tools/SkillTool.mjs +26 -25
  432. package/dist/esm/tools/SkillTool.mjs.map +1 -1
  433. package/dist/esm/tools/SubagentTool.mjs +59 -59
  434. package/dist/esm/tools/SubagentTool.mjs.map +1 -1
  435. package/dist/esm/tools/ToolNode.mjs +2144 -2684
  436. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  437. package/dist/esm/tools/ToolSearch.mjs +659 -804
  438. package/dist/esm/tools/ToolSearch.mjs.map +1 -1
  439. package/dist/esm/tools/cloudflare/CloudflareBridgeRuntime.mjs +248 -338
  440. package/dist/esm/tools/cloudflare/CloudflareBridgeRuntime.mjs.map +1 -1
  441. package/dist/esm/tools/cloudflare/CloudflareProgrammaticToolCalling.mjs +170 -195
  442. package/dist/esm/tools/cloudflare/CloudflareProgrammaticToolCalling.mjs.map +1 -1
  443. package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs +424 -517
  444. package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs.map +1 -1
  445. package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs +91 -122
  446. package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs.map +1 -1
  447. package/dist/esm/tools/cloudflare/index.mjs +5 -0
  448. package/dist/esm/tools/eagerEventExecution.mjs +75 -96
  449. package/dist/esm/tools/eagerEventExecution.mjs.map +1 -1
  450. package/dist/esm/tools/handlers.mjs +200 -260
  451. package/dist/esm/tools/handlers.mjs.map +1 -1
  452. package/dist/esm/tools/local/CompileCheckTool.mjs +150 -210
  453. package/dist/esm/tools/local/CompileCheckTool.mjs.map +1 -1
  454. package/dist/esm/tools/local/FileCheckpointer.mjs +77 -83
  455. package/dist/esm/tools/local/FileCheckpointer.mjs.map +1 -1
  456. package/dist/esm/tools/local/LocalCodingTools.mjs +760 -1017
  457. package/dist/esm/tools/local/LocalCodingTools.mjs.map +1 -1
  458. package/dist/esm/tools/local/LocalExecutionEngine.mjs +663 -936
  459. package/dist/esm/tools/local/LocalExecutionEngine.mjs.map +1 -1
  460. package/dist/esm/tools/local/LocalExecutionTools.mjs +49 -90
  461. package/dist/esm/tools/local/LocalExecutionTools.mjs.map +1 -1
  462. package/dist/esm/tools/local/LocalProgrammaticToolCalling.mjs +283 -349
  463. package/dist/esm/tools/local/LocalProgrammaticToolCalling.mjs.map +1 -1
  464. package/dist/esm/tools/local/attachments.mjs +108 -163
  465. package/dist/esm/tools/local/attachments.mjs.map +1 -1
  466. package/dist/esm/tools/local/bashAst.mjs +99 -111
  467. package/dist/esm/tools/local/bashAst.mjs.map +1 -1
  468. package/dist/esm/tools/local/editStrategies.mjs +126 -167
  469. package/dist/esm/tools/local/editStrategies.mjs.map +1 -1
  470. package/dist/esm/tools/local/index.mjs +13 -0
  471. package/dist/esm/tools/local/resolveLocalExecutionTools.mjs +136 -216
  472. package/dist/esm/tools/local/resolveLocalExecutionTools.mjs.map +1 -1
  473. package/dist/esm/tools/local/syntaxCheck.mjs +138 -155
  474. package/dist/esm/tools/local/syntaxCheck.mjs.map +1 -1
  475. package/dist/esm/tools/local/textEncoding.mjs +25 -21
  476. package/dist/esm/tools/local/textEncoding.mjs.map +1 -1
  477. package/dist/esm/tools/local/workspaceFS.mjs +38 -44
  478. package/dist/esm/tools/local/workspaceFS.mjs.map +1 -1
  479. package/dist/esm/tools/ptcTimeout.mjs +27 -42
  480. package/dist/esm/tools/ptcTimeout.mjs.map +1 -1
  481. package/dist/esm/tools/schema.mjs +24 -21
  482. package/dist/esm/tools/schema.mjs.map +1 -1
  483. package/dist/esm/tools/search/anthropic.mjs +24 -31
  484. package/dist/esm/tools/search/anthropic.mjs.map +1 -1
  485. package/dist/esm/tools/search/content.mjs +93 -116
  486. package/dist/esm/tools/search/content.mjs.map +1 -1
  487. package/dist/esm/tools/search/firecrawl.mjs +139 -169
  488. package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
  489. package/dist/esm/tools/search/format.mjs +128 -194
  490. package/dist/esm/tools/search/format.mjs.map +1 -1
  491. package/dist/esm/tools/search/highlights.mjs +165 -230
  492. package/dist/esm/tools/search/highlights.mjs.map +1 -1
  493. package/dist/esm/tools/search/index.mjs +3 -0
  494. package/dist/esm/tools/search/rerankers.mjs +149 -168
  495. package/dist/esm/tools/search/rerankers.mjs.map +1 -1
  496. package/dist/esm/tools/search/schema.mjs +39 -37
  497. package/dist/esm/tools/search/schema.mjs.map +1 -1
  498. package/dist/esm/tools/search/search.mjs +426 -528
  499. package/dist/esm/tools/search/search.mjs.map +1 -1
  500. package/dist/esm/tools/search/serper-scraper.mjs +104 -124
  501. package/dist/esm/tools/search/serper-scraper.mjs.map +1 -1
  502. package/dist/esm/tools/search/tavily-scraper.mjs +127 -178
  503. package/dist/esm/tools/search/tavily-scraper.mjs.map +1 -1
  504. package/dist/esm/tools/search/tavily-search.mjs +293 -357
  505. package/dist/esm/tools/search/tavily-search.mjs.map +1 -1
  506. package/dist/esm/tools/search/tool.mjs +259 -297
  507. package/dist/esm/tools/search/tool.mjs.map +1 -1
  508. package/dist/esm/tools/search/utils.mjs +74 -115
  509. package/dist/esm/tools/search/utils.mjs.map +1 -1
  510. package/dist/esm/tools/skillCatalog.mjs +54 -70
  511. package/dist/esm/tools/skillCatalog.mjs.map +1 -1
  512. package/dist/esm/tools/streamedToolCallSeals.mjs +42 -31
  513. package/dist/esm/tools/streamedToolCallSeals.mjs.map +1 -1
  514. package/dist/esm/tools/subagent/SubagentExecutor.mjs +612 -768
  515. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
  516. package/dist/esm/tools/subagent/index.mjs +2 -0
  517. package/dist/esm/tools/toolOutputReferences.mjs +523 -624
  518. package/dist/esm/tools/toolOutputReferences.mjs.map +1 -1
  519. package/dist/esm/utils/callbacks.mjs +11 -19
  520. package/dist/esm/utils/callbacks.mjs.map +1 -1
  521. package/dist/esm/utils/errors.mjs +70 -93
  522. package/dist/esm/utils/errors.mjs.map +1 -1
  523. package/dist/esm/utils/events.mjs +32 -40
  524. package/dist/esm/utils/events.mjs.map +1 -1
  525. package/dist/esm/utils/graph.mjs +8 -10
  526. package/dist/esm/utils/graph.mjs.map +1 -1
  527. package/dist/esm/utils/handlers.mjs +60 -80
  528. package/dist/esm/utils/handlers.mjs.map +1 -1
  529. package/dist/esm/utils/index.mjs +10 -0
  530. package/dist/esm/utils/llm.mjs +19 -25
  531. package/dist/esm/utils/llm.mjs.map +1 -1
  532. package/dist/esm/utils/misc.mjs +30 -44
  533. package/dist/esm/utils/misc.mjs.map +1 -1
  534. package/dist/esm/utils/run.mjs +50 -64
  535. package/dist/esm/utils/run.mjs.map +1 -1
  536. package/dist/esm/utils/schema.mjs +11 -17
  537. package/dist/esm/utils/schema.mjs.map +1 -1
  538. package/dist/esm/utils/title.mjs +71 -104
  539. package/dist/esm/utils/title.mjs.map +1 -1
  540. package/dist/esm/utils/tokens.mjs +186 -281
  541. package/dist/esm/utils/tokens.mjs.map +1 -1
  542. package/dist/esm/utils/truncation.mjs +95 -112
  543. package/dist/esm/utils/truncation.mjs.map +1 -1
  544. package/dist/types/llm/bedrock/utils/index.d.ts +1 -1
  545. package/dist/types/llm/bedrock/utils/message_outputs.d.ts +9 -0
  546. package/dist/types/llm/vertexai/index.d.ts +10 -0
  547. package/dist/types/tools/ToolNode.d.ts +8 -0
  548. package/dist/types/tools/search/tool.d.ts +17 -0
  549. package/dist/types/tools/search/types.d.ts +4 -0
  550. package/dist/types/tools/streamedToolCallSeals.d.ts +5 -1
  551. package/dist/types/types/tools.d.ts +10 -0
  552. package/package.json +4 -10
  553. package/src/__tests__/stream.eagerEventExecution.test.ts +703 -0
  554. package/src/llm/bedrock/index.ts +40 -0
  555. package/src/llm/bedrock/streamSealDispatch.test.ts +158 -0
  556. package/src/llm/bedrock/utils/index.ts +1 -0
  557. package/src/llm/bedrock/utils/message_outputs.test.ts +85 -0
  558. package/src/llm/bedrock/utils/message_outputs.ts +43 -0
  559. package/src/llm/google/utils/common.test.ts +64 -0
  560. package/src/llm/google/utils/common.ts +18 -0
  561. package/src/llm/openai/index.ts +95 -1
  562. package/src/llm/openai/sequentialToolCallSeals.test.ts +199 -0
  563. package/src/llm/vertexai/index.ts +31 -0
  564. package/src/llm/vertexai/sealStreamedToolCalls.test.ts +88 -0
  565. package/src/llm/vertexai/streamSealDispatch.test.ts +148 -0
  566. package/src/stream.ts +40 -6
  567. package/src/tools/ToolNode.ts +85 -3
  568. package/src/tools/__tests__/ToolNode.onResultCompletion.test.ts +368 -0
  569. package/src/tools/search/highlights.ts +9 -1
  570. package/src/tools/search/search.ts +41 -3
  571. package/src/tools/search/source-processing.test.ts +373 -0
  572. package/src/tools/search/tool.ts +22 -2
  573. package/src/tools/search/types.ts +4 -0
  574. package/src/tools/streamedToolCallSeals.ts +37 -9
  575. package/src/types/tools.ts +10 -0
  576. package/dist/cjs/langchain/google-common.cjs.map +0 -1
  577. package/dist/cjs/langchain/index.cjs.map +0 -1
  578. package/dist/cjs/langchain/language_models/chat_models.cjs.map +0 -1
  579. package/dist/cjs/langchain/messages/tool.cjs.map +0 -1
  580. package/dist/cjs/langchain/messages.cjs.map +0 -1
  581. package/dist/cjs/langchain/openai.cjs.map +0 -1
  582. package/dist/cjs/langchain/prompts.cjs.map +0 -1
  583. package/dist/cjs/langchain/runnables.cjs.map +0 -1
  584. package/dist/cjs/langchain/tools.cjs.map +0 -1
  585. package/dist/cjs/langchain/utils/env.cjs.map +0 -1
  586. package/dist/cjs/main.cjs.map +0 -1
  587. package/dist/esm/langchain/google-common.mjs.map +0 -1
  588. package/dist/esm/langchain/index.mjs.map +0 -1
  589. package/dist/esm/langchain/language_models/chat_models.mjs.map +0 -1
  590. package/dist/esm/langchain/messages/tool.mjs.map +0 -1
  591. package/dist/esm/langchain/messages.mjs.map +0 -1
  592. package/dist/esm/langchain/openai.mjs.map +0 -1
  593. package/dist/esm/langchain/prompts.mjs.map +0 -1
  594. package/dist/esm/langchain/runnables.mjs.map +0 -1
  595. package/dist/esm/langchain/tools.mjs.map +0 -1
  596. package/dist/esm/langchain/utils/env.mjs.map +0 -1
  597. package/dist/esm/main.mjs.map +0 -1
@@ -34,6 +34,7 @@ import type { BaseMessage, ResponseMetadata } from '@langchain/core/messages';
34
34
  import type { ChatBedrockConverseInput } from '@langchain/aws';
35
35
  import {
36
36
  convertToConverseMessages,
37
+ createConverseToolUseStopChunk,
37
38
  handleConverseStreamContentBlockStart,
38
39
  handleConverseStreamContentBlockDelta,
39
40
  handleConverseStreamMetadata,
@@ -224,6 +225,15 @@ export class CustomChatBedrockConverse extends ChatBedrockConverse {
224
225
  }
225
226
 
226
227
  const seenBlockIndices = new Set<number>();
228
+ const toolUseBlockIndices = new Set<number>();
229
+ /**
230
+ * Guardrails can reject an already-streamed toolUse block at
231
+ * `messageStop` (`guardrail_intervened`), after `contentBlockStop` has
232
+ * passed. Only emit eager-execution seals when no guardrails are
233
+ * configured, so a later intervention can't race an eagerly started tool.
234
+ */
235
+ const sealToolUseOnStop =
236
+ options.guardrailConfig == null && this.guardrailConfig == null;
227
237
 
228
238
  for await (const event of response.stream) {
229
239
  if (event.contentBlockStart != null) {
@@ -234,8 +244,23 @@ export class CustomChatBedrockConverse extends ChatBedrockConverse {
234
244
  const idx = event.contentBlockStart.contentBlockIndex;
235
245
  if (idx != null) {
236
246
  seenBlockIndices.add(idx);
247
+ if (event.contentBlockStart.start?.toolUse != null) {
248
+ toolUseBlockIndices.add(idx);
249
+ }
237
250
  }
238
251
  yield this.enrichChunk(startChunk, seenBlockIndices);
252
+
253
+ // Registered stream handlers receive chunks through callback
254
+ // events, not the yielded generator — dispatch the start chunk so
255
+ // they see the tool call's id/name (eager chunk state needs both).
256
+ await runManager?.handleLLMNewToken(
257
+ startChunk.text,
258
+ undefined,
259
+ undefined,
260
+ undefined,
261
+ undefined,
262
+ { chunk: startChunk }
263
+ );
239
264
  }
240
265
  } else if (event.contentBlockDelta != null) {
241
266
  const deltaChunk = handleConverseStreamContentBlockDelta(
@@ -263,6 +288,21 @@ export class CustomChatBedrockConverse extends ChatBedrockConverse {
263
288
  const stopIdx = event.contentBlockStop.contentBlockIndex;
264
289
  if (stopIdx != null) {
265
290
  seenBlockIndices.add(stopIdx);
291
+ if (sealToolUseOnStop && toolUseBlockIndices.has(stopIdx)) {
292
+ // Converse guarantees the block's input is complete at stop, so
293
+ // emit an explicit seal chunk for eager tool execution — through
294
+ // the callback path too, for registered stream handlers.
295
+ const sealChunk = createConverseToolUseStopChunk(stopIdx);
296
+ yield sealChunk;
297
+ await runManager?.handleLLMNewToken(
298
+ sealChunk.text,
299
+ undefined,
300
+ undefined,
301
+ undefined,
302
+ undefined,
303
+ { chunk: sealChunk }
304
+ );
305
+ }
266
306
  }
267
307
  } else {
268
308
  yield new ChatGenerationChunk({
@@ -0,0 +1,158 @@
1
+ import { expect, test, describe, jest } from '@jest/globals';
2
+ import { HumanMessage, AIMessageChunk } from '@langchain/core/messages';
3
+ import type { CallbackManagerForLLMRun } from '@langchain/core/callbacks/manager';
4
+ import type { ChatGenerationChunk } from '@langchain/core/outputs';
5
+ import {
6
+ STREAMED_TOOL_CALL_SEAL_METADATA_KEY,
7
+ STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY,
8
+ BEDROCK_CONVERSE_STREAMED_TOOL_CALL_ADAPTER,
9
+ } from '@/tools/streamedToolCallSeals';
10
+ import { CustomChatBedrockConverse } from './index';
11
+
12
+ /**
13
+ * Registered stream handlers consume chunks through `handleLLMNewToken`
14
+ * callback events, not the yielded generator (`attemptInvoke` skips manual
15
+ * dispatch when a handler is registered). These tests drive the Converse
16
+ * stream loop with a stubbed client and assert that toolUse start and stop
17
+ * seal chunks reach BOTH paths.
18
+ */
19
+ describe('Converse stream seal dispatch', () => {
20
+ async function runStream(
21
+ events: Array<Record<string, unknown>>,
22
+ modelFields: Record<string, unknown> = {}
23
+ ): Promise<{
24
+ yielded: AIMessageChunk[];
25
+ dispatched: AIMessageChunk[];
26
+ }> {
27
+ const model = new CustomChatBedrockConverse({
28
+ model: 'anthropic.claude-3-5-sonnet-20240620-v1:0',
29
+ region: 'us-east-1',
30
+ credentials: { accessKeyId: 'test', secretAccessKey: 'test' },
31
+ ...modelFields,
32
+ });
33
+
34
+ (model as unknown as { client: { send: unknown } }).client.send = jest.fn(
35
+ async () => ({
36
+ stream: (async function* () {
37
+ yield* events;
38
+ })(),
39
+ })
40
+ );
41
+
42
+ const dispatched: AIMessageChunk[] = [];
43
+ const runManager = {
44
+ handleLLMNewToken: jest.fn(
45
+ async (
46
+ _token: string,
47
+ _idx?: unknown,
48
+ _runId?: unknown,
49
+ _parentRunId?: unknown,
50
+ _tags?: unknown,
51
+ fields?: { chunk?: ChatGenerationChunk }
52
+ ) => {
53
+ const message = fields?.chunk?.message;
54
+ if (message instanceof AIMessageChunk) {
55
+ dispatched.push(message);
56
+ }
57
+ }
58
+ ),
59
+ } as unknown as CallbackManagerForLLMRun;
60
+
61
+ const yielded: AIMessageChunk[] = [];
62
+ for await (const chunk of model._streamResponseChunks(
63
+ [new HumanMessage('hi')],
64
+ {} as Parameters<CustomChatBedrockConverse['_streamResponseChunks']>[1],
65
+ runManager
66
+ )) {
67
+ if (chunk.message instanceof AIMessageChunk) {
68
+ yielded.push(chunk.message);
69
+ }
70
+ }
71
+ return { yielded, dispatched };
72
+ }
73
+
74
+ const toolUseEvents = [
75
+ {
76
+ contentBlockStart: {
77
+ contentBlockIndex: 1,
78
+ start: { toolUse: { toolUseId: 'call_1', name: 'weather' } },
79
+ },
80
+ },
81
+ {
82
+ contentBlockDelta: {
83
+ contentBlockIndex: 1,
84
+ delta: { toolUse: { input: '{"city":"NYC"}' } },
85
+ },
86
+ },
87
+ { contentBlockStop: { contentBlockIndex: 1 } },
88
+ ];
89
+
90
+ test('dispatches toolUse start and stop seal chunks to callbacks', async () => {
91
+ const { yielded, dispatched } = await runStream(toolUseEvents);
92
+
93
+ const sealOf = (m: AIMessageChunk): unknown =>
94
+ (m.response_metadata as Record<string, unknown>)[
95
+ STREAMED_TOOL_CALL_SEAL_METADATA_KEY
96
+ ];
97
+
98
+ expect(yielded.some((m) => sealOf(m) != null)).toBe(true);
99
+
100
+ expect(dispatched).toHaveLength(3);
101
+ expect(dispatched[0].tool_call_chunks).toMatchObject([
102
+ { id: 'call_1', name: 'weather', index: 1 },
103
+ ]);
104
+ expect(dispatched[1].tool_call_chunks).toMatchObject([
105
+ { args: '{"city":"NYC"}', index: 1 },
106
+ ]);
107
+ expect(sealOf(dispatched[2])).toEqual({ kind: 'single', index: 1 });
108
+ expect(
109
+ (dispatched[2].response_metadata as Record<string, unknown>)[
110
+ STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY
111
+ ]
112
+ ).toBe(BEDROCK_CONVERSE_STREAMED_TOOL_CALL_ADAPTER);
113
+ });
114
+
115
+ test('does not emit seal chunks when guardrails are configured', async () => {
116
+ const { yielded, dispatched } = await runStream(toolUseEvents, {
117
+ guardrailConfig: {
118
+ guardrailIdentifier: 'guardrail_1',
119
+ guardrailVersion: '1',
120
+ },
121
+ });
122
+
123
+ const hasSeal = (m: AIMessageChunk): boolean =>
124
+ (m.response_metadata as Record<string, unknown>)[
125
+ STREAMED_TOOL_CALL_SEAL_METADATA_KEY
126
+ ] != null;
127
+
128
+ // Guardrails can reject the turn at messageStop after contentBlockStop,
129
+ // so no eager seal may be emitted — but tool chunks still stream.
130
+ expect(yielded.some(hasSeal)).toBe(false);
131
+ expect(dispatched.some(hasSeal)).toBe(false);
132
+ expect(dispatched).toHaveLength(2);
133
+ expect(dispatched[0].tool_call_chunks).toMatchObject([
134
+ { id: 'call_1', name: 'weather', index: 1 },
135
+ ]);
136
+ });
137
+
138
+ test('does not emit seal chunks for non-toolUse block stops', async () => {
139
+ const { yielded, dispatched } = await runStream([
140
+ {
141
+ contentBlockDelta: {
142
+ contentBlockIndex: 0,
143
+ delta: { text: 'hello' },
144
+ },
145
+ },
146
+ { contentBlockStop: { contentBlockIndex: 0 } },
147
+ ]);
148
+
149
+ const hasSeal = (m: AIMessageChunk): boolean =>
150
+ (m.response_metadata as Record<string, unknown>)[
151
+ STREAMED_TOOL_CALL_SEAL_METADATA_KEY
152
+ ] != null;
153
+
154
+ expect(yielded.some(hasSeal)).toBe(false);
155
+ expect(dispatched.some(hasSeal)).toBe(false);
156
+ expect(dispatched).toHaveLength(1);
157
+ });
158
+ });
@@ -10,6 +10,7 @@ export {
10
10
 
11
11
  export {
12
12
  convertConverseMessageToLangChainMessage,
13
+ createConverseToolUseStopChunk,
13
14
  handleConverseStreamContentBlockStart,
14
15
  handleConverseStreamContentBlockDelta,
15
16
  handleConverseStreamMetadata,
@@ -0,0 +1,85 @@
1
+ import { expect, test, describe } from '@jest/globals';
2
+ import { AIMessageChunk } from '@langchain/core/messages';
3
+ import type { ContentBlockDeltaEvent, ContentBlockStartEvent } from '../types';
4
+ import {
5
+ STREAMED_TOOL_CALL_SEAL_METADATA_KEY,
6
+ STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY,
7
+ BEDROCK_CONVERSE_STREAMED_TOOL_CALL_ADAPTER,
8
+ } from '@/tools/streamedToolCallSeals';
9
+ import {
10
+ createConverseToolUseStopChunk,
11
+ handleConverseStreamContentBlockStart,
12
+ handleConverseStreamContentBlockDelta,
13
+ } from './message_outputs';
14
+
15
+ function asAIMessageChunk(message: unknown): AIMessageChunk {
16
+ expect(message).toBeInstanceOf(AIMessageChunk);
17
+ return message as AIMessageChunk;
18
+ }
19
+
20
+ describe('Converse streamed tool-call seal metadata', () => {
21
+ test('stamps the adapter on toolUse content block starts', () => {
22
+ const chunk = handleConverseStreamContentBlockStart({
23
+ contentBlockIndex: 1,
24
+ start: {
25
+ toolUse: { toolUseId: 'call_1', name: 'weather' },
26
+ },
27
+ } as ContentBlockStartEvent);
28
+
29
+ const message = asAIMessageChunk(chunk?.message);
30
+ expect(message.response_metadata).toMatchObject({
31
+ contentBlockIndex: 1,
32
+ [STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY]:
33
+ BEDROCK_CONVERSE_STREAMED_TOOL_CALL_ADAPTER,
34
+ });
35
+ expect(message.tool_call_chunks).toEqual([
36
+ {
37
+ id: 'call_1',
38
+ name: 'weather',
39
+ index: 1,
40
+ type: 'tool_call_chunk',
41
+ },
42
+ ]);
43
+ });
44
+
45
+ test('stamps the adapter on toolUse deltas but not text deltas', () => {
46
+ const toolChunk = handleConverseStreamContentBlockDelta({
47
+ contentBlockIndex: 1,
48
+ delta: { toolUse: { input: '{"city":' } },
49
+ } as ContentBlockDeltaEvent);
50
+ const toolMetadata = asAIMessageChunk(toolChunk.message)
51
+ .response_metadata as Record<string, unknown>;
52
+ expect(toolMetadata[STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY]).toBe(
53
+ BEDROCK_CONVERSE_STREAMED_TOOL_CALL_ADAPTER
54
+ );
55
+
56
+ const textChunk = handleConverseStreamContentBlockDelta({
57
+ contentBlockIndex: 0,
58
+ delta: { text: 'hello' },
59
+ } as ContentBlockDeltaEvent);
60
+ const textMetadata = asAIMessageChunk(textChunk.message)
61
+ .response_metadata as Record<string, unknown>;
62
+ expect(
63
+ textMetadata[STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY]
64
+ ).toBeUndefined();
65
+ });
66
+
67
+ test('builds an explicit single seal chunk for a stopped toolUse block', () => {
68
+ const chunk = createConverseToolUseStopChunk(2);
69
+
70
+ const message = asAIMessageChunk(chunk.message);
71
+ expect(message.response_metadata).toEqual({
72
+ [STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY]:
73
+ BEDROCK_CONVERSE_STREAMED_TOOL_CALL_ADAPTER,
74
+ [STREAMED_TOOL_CALL_SEAL_METADATA_KEY]: { kind: 'single', index: 2 },
75
+ });
76
+ expect(message.tool_call_chunks).toEqual([
77
+ {
78
+ args: '',
79
+ index: 2,
80
+ type: 'tool_call_chunk',
81
+ },
82
+ ]);
83
+ expect(message.content).toBe('');
84
+ });
85
+ });
@@ -17,6 +17,11 @@ import type {
17
17
  MessageContentReasoningBlockReasoningTextPartial,
18
18
  MessageContentReasoningBlockRedacted,
19
19
  } from '../types';
20
+ import {
21
+ STREAMED_TOOL_CALL_SEAL_METADATA_KEY,
22
+ STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY,
23
+ BEDROCK_CONVERSE_STREAMED_TOOL_CALL_ADAPTER,
24
+ } from '@/tools/streamedToolCallSeals';
20
25
  import { toLangChainContent } from '@/messages/langchain';
21
26
 
22
27
  /**
@@ -235,6 +240,8 @@ export function handleConverseStreamContentBlockDelta(
235
240
  ],
236
241
  response_metadata: {
237
242
  contentBlockIndex: contentBlockDelta.contentBlockIndex,
243
+ [STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY]:
244
+ BEDROCK_CONVERSE_STREAMED_TOOL_CALL_ADAPTER,
238
245
  },
239
246
  }),
240
247
  });
@@ -292,6 +299,8 @@ export function handleConverseStreamContentBlockStart(
292
299
  ],
293
300
  response_metadata: {
294
301
  contentBlockIndex: index,
302
+ [STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY]:
303
+ BEDROCK_CONVERSE_STREAMED_TOOL_CALL_ADAPTER,
295
304
  },
296
305
  }),
297
306
  });
@@ -301,6 +310,40 @@ export function handleConverseStreamContentBlockStart(
301
310
  return null;
302
311
  }
303
312
 
313
+ /**
314
+ * Build the chunk emitted when a Converse `contentBlockStop` event closes a
315
+ * toolUse block. The Converse protocol guarantees a block's input is complete
316
+ * at `contentBlockStop`, so this chunk carries an explicit streamed tool-call
317
+ * seal for that block index. The empty `args` delta merges as a no-op into the
318
+ * accumulated tool call; id/name are omitted so the chunk matches the existing
319
+ * entry purely by index.
320
+ */
321
+ export function createConverseToolUseStopChunk(
322
+ contentBlockIndex: number
323
+ ): ChatGenerationChunk {
324
+ return new ChatGenerationChunk({
325
+ text: '',
326
+ message: new AIMessageChunk({
327
+ content: '',
328
+ tool_call_chunks: [
329
+ {
330
+ args: '',
331
+ index: contentBlockIndex,
332
+ type: 'tool_call_chunk',
333
+ },
334
+ ],
335
+ response_metadata: {
336
+ [STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY]:
337
+ BEDROCK_CONVERSE_STREAMED_TOOL_CALL_ADAPTER,
338
+ [STREAMED_TOOL_CALL_SEAL_METADATA_KEY]: {
339
+ kind: 'single',
340
+ index: contentBlockIndex,
341
+ },
342
+ },
343
+ }),
344
+ });
345
+ }
346
+
304
347
  /**
305
348
  * Handle a metadata event from Bedrock Converse stream.
306
349
  */
@@ -0,0 +1,64 @@
1
+ import { expect, test, describe } from '@jest/globals';
2
+ import { AIMessageChunk } from '@langchain/core/messages';
3
+ import type { EnhancedGenerateContentResponse } from '@google/generative-ai';
4
+ import {
5
+ STREAMED_TOOL_CALL_SEAL_METADATA_KEY,
6
+ STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY,
7
+ GOOGLE_STREAMED_TOOL_CALL_ADAPTER,
8
+ } from '@/tools/streamedToolCallSeals';
9
+ import { convertResponseContentToChatGenerationChunk } from './common';
10
+
11
+ function buildResponse(
12
+ parts: Array<Record<string, unknown>>
13
+ ): EnhancedGenerateContentResponse {
14
+ return {
15
+ candidates: [
16
+ {
17
+ content: { role: 'model', parts },
18
+ index: 0,
19
+ },
20
+ ],
21
+ } as unknown as EnhancedGenerateContentResponse;
22
+ }
23
+
24
+ function asAIMessageChunk(message: unknown): AIMessageChunk {
25
+ expect(message).toBeInstanceOf(AIMessageChunk);
26
+ return message as AIMessageChunk;
27
+ }
28
+
29
+ describe('convertResponseContentToChatGenerationChunk seal metadata', () => {
30
+ test('stamps an on-arrival seal on function call chunks', () => {
31
+ const chunk = convertResponseContentToChatGenerationChunk(
32
+ buildResponse([
33
+ {
34
+ functionCall: { name: 'weather', args: { city: 'NYC' } },
35
+ },
36
+ ]),
37
+ { usageMetadata: undefined, index: 0 }
38
+ );
39
+
40
+ const message = asAIMessageChunk(chunk?.message);
41
+ expect(message.response_metadata).toMatchObject({
42
+ [STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY]:
43
+ GOOGLE_STREAMED_TOOL_CALL_ADAPTER,
44
+ [STREAMED_TOOL_CALL_SEAL_METADATA_KEY]: { kind: 'all' },
45
+ });
46
+ expect(message.tool_call_chunks).toHaveLength(1);
47
+ expect(message.tool_calls?.[0]).toMatchObject({
48
+ name: 'weather',
49
+ args: { city: 'NYC' },
50
+ });
51
+ });
52
+
53
+ test('does not stamp seal metadata on text-only chunks', () => {
54
+ const chunk = convertResponseContentToChatGenerationChunk(
55
+ buildResponse([{ text: 'hello' }]),
56
+ { usageMetadata: undefined, index: 0 }
57
+ );
58
+
59
+ const metadata = asAIMessageChunk(chunk?.message)
60
+ .response_metadata as Record<string, unknown>;
61
+ expect(metadata[STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY]).toBeUndefined();
62
+ expect(metadata[STREAMED_TOOL_CALL_SEAL_METADATA_KEY]).toBeUndefined();
63
+ });
64
+ });
@@ -35,6 +35,11 @@ import {
35
35
  type FunctionDeclarationsTool as GoogleGenerativeAIFunctionDeclarationsTool,
36
36
  } from '@google/generative-ai';
37
37
  import type { ChatGeneration, ChatResult } from '@langchain/core/outputs';
38
+ import {
39
+ STREAMED_TOOL_CALL_SEAL_METADATA_KEY,
40
+ STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY,
41
+ GOOGLE_STREAMED_TOOL_CALL_ADAPTER,
42
+ } from '@/tools/streamedToolCallSeals';
38
43
  import {
39
44
  jsonSchemaToGeminiParameters,
40
45
  schemaToGenerativeAIParameters,
@@ -770,6 +775,18 @@ export function convertResponseContentToChatGenerationChunk(
770
775
  response.candidates[0]?.finishReason === 'MAX_TOKENS' ||
771
776
  response.candidates[0]?.finishReason === 'SAFETY';
772
777
 
778
+ // The GenAI API delivers function calls as complete objects (never partial
779
+ // arg deltas), so every call on this chunk is sealed on arrival for eager
780
+ // tool execution.
781
+ const response_metadata: Record<string, unknown> | undefined =
782
+ toolCallChunks.length > 0
783
+ ? {
784
+ [STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY]:
785
+ GOOGLE_STREAMED_TOOL_CALL_ADAPTER,
786
+ [STREAMED_TOOL_CALL_SEAL_METADATA_KEY]: { kind: 'all' },
787
+ }
788
+ : undefined;
789
+
773
790
  return new ChatGenerationChunk({
774
791
  text,
775
792
  message: new AIMessageChunk({
@@ -779,6 +796,7 @@ export function convertResponseContentToChatGenerationChunk(
779
796
  // Each chunk can have unique "generationInfo", and merging strategy is unclear,
780
797
  // so leave blank for now.
781
798
  additional_kwargs,
799
+ response_metadata,
782
800
  usage_metadata: isFinalChunk ? extra.usageMetadata : undefined,
783
801
  }),
784
802
  generationInfo,
@@ -34,6 +34,10 @@ import type { ChatGeneration, ChatResult } from '@langchain/core/outputs';
34
34
  import type { ChatXAIInput } from '@langchain/xai';
35
35
  import type * as t from '@langchain/openai';
36
36
  import type { HeaderValue, HeadersLike } from './types';
37
+ import {
38
+ STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY,
39
+ OPENAI_CHAT_SEQUENTIAL_STREAMED_TOOL_CALL_ADAPTER,
40
+ } from '@/tools/streamedToolCallSeals';
37
41
  import { isReasoningModel, _convertMessagesToOpenAIParams } from './utils';
38
42
 
39
43
  // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
@@ -670,6 +674,69 @@ export class CustomAzureOpenAIClient extends AzureOpenAIClient {
670
674
  }
671
675
  }
672
676
 
677
+ const OFFICIAL_OPENAI_BASE_URL_PATTERN = /^https:\/\/api\.openai\.com(\/|$)/;
678
+
679
+ /**
680
+ * Official OpenAI (api.openai.com) and Azure OpenAI Chat Completions streams
681
+ * emit tool-call deltas strictly sequentially by index: once a delta for a
682
+ * later index appears, a prior index's arguments never change. Stamping this
683
+ * adapter lets the stream handler seal a prior call for eager execution the
684
+ * moment the next call begins. OpenAI-compatible endpoints (custom baseURL)
685
+ * must NOT be stamped — e.g. live Kimi/Moonshot streams revise prior-index
686
+ * args after advancing — so callers gate on the wire endpoint, not the class.
687
+ */
688
+ function stampSequentialStreamedToolCallAdapter(
689
+ message: BaseMessageChunk
690
+ ): BaseMessageChunk {
691
+ if (
692
+ message instanceof AIMessageChunk &&
693
+ (message.tool_call_chunks?.length ?? 0) > 0
694
+ ) {
695
+ message.response_metadata = {
696
+ ...message.response_metadata,
697
+ [STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY]:
698
+ OPENAI_CHAT_SEQUENTIAL_STREAMED_TOOL_CALL_ADAPTER,
699
+ };
700
+ }
701
+ return message;
702
+ }
703
+
704
+ function isOfficialOpenAIBaseURL(baseURL: string | null | undefined): boolean {
705
+ // The OpenAI SDK falls back to OPENAI_BASE_URL when the client has no
706
+ // explicit baseURL, so an unset constructor value can still route to an
707
+ // OpenAI-compatible endpoint.
708
+ const effectiveBaseURL =
709
+ baseURL != null && baseURL !== '' ? baseURL : process.env.OPENAI_BASE_URL;
710
+ if (effectiveBaseURL == null || effectiveBaseURL === '') {
711
+ return true;
712
+ }
713
+ return OFFICIAL_OPENAI_BASE_URL_PATTERN.test(effectiveBaseURL);
714
+ }
715
+
716
+ const AZURE_FIRST_PARTY_BASE_PATH_PATTERN =
717
+ /^https:\/\/[^/]+\.(openai\.azure\.com|cognitiveservices\.azure\.com|api\.cognitive\.microsoft\.com)(:\d+)?(\/|$)/;
718
+
719
+ /**
720
+ * Azure OpenAI is first-party when requests resolve to an instance-name
721
+ * endpoint or an *.openai.azure.com / *.cognitiveservices.azure.com /
722
+ * regional *.api.cognitive.microsoft.com base path. A custom
723
+ * `clientConfig.baseURL` or a non-Azure `azureOpenAIBasePath` routes through
724
+ * a proxy or Azure-compatible endpoint whose stream contract is unknown, so
725
+ * those are not stamped.
726
+ */
727
+ function isFirstPartyAzureEndpoint(args: {
728
+ baseURL: string | null | undefined;
729
+ azureOpenAIBasePath: string | undefined;
730
+ }): boolean {
731
+ if (args.baseURL != null && args.baseURL !== '') {
732
+ return false;
733
+ }
734
+ if (args.azureOpenAIBasePath == null || args.azureOpenAIBasePath === '') {
735
+ return true;
736
+ }
737
+ return AZURE_FIRST_PARTY_BASE_PATH_PATTERN.test(args.azureOpenAIBasePath);
738
+ }
739
+
673
740
  class LibreChatOpenAICompletions extends OriginalChatOpenAICompletions {
674
741
  private includeReasoningContent?: boolean;
675
742
  private includeReasoningDetails?: boolean;
@@ -721,7 +788,7 @@ class LibreChatOpenAICompletions extends OriginalChatOpenAICompletions {
721
788
  rawResponse: OpenAIClient.Chat.Completions.ChatCompletionChunk,
722
789
  defaultRole?: OpenAIClient.Chat.ChatCompletionRole
723
790
  ): BaseMessageChunk {
724
- return attachLibreChatDeltaFields(
791
+ const message = attachLibreChatDeltaFields(
725
792
  super._convertCompletionsDeltaToBaseMessageChunk(
726
793
  delta,
727
794
  rawResponse,
@@ -729,6 +796,10 @@ class LibreChatOpenAICompletions extends OriginalChatOpenAICompletions {
729
796
  ),
730
797
  delta
731
798
  );
799
+ if (isOfficialOpenAIBaseURL(this.clientConfig.baseURL)) {
800
+ return stampSequentialStreamedToolCallAdapter(message);
801
+ }
802
+ return message;
732
803
  }
733
804
 
734
805
  protected _convertCompletionsMessageToBaseMessage(
@@ -1090,6 +1161,29 @@ class LibreChatAzureOpenAICompletions extends OriginalAzureChatOpenAICompletions
1090
1161
  return getGatedReasoningParams(this.model, this.reasoning, options);
1091
1162
  }
1092
1163
 
1164
+ protected _convertCompletionsDeltaToBaseMessageChunk(
1165
+ delta: Record<string, unknown>,
1166
+ rawResponse: OpenAIClient.Chat.Completions.ChatCompletionChunk,
1167
+ defaultRole?: OpenAIClient.Chat.ChatCompletionRole
1168
+ ): BaseMessageChunk {
1169
+ const message = super._convertCompletionsDeltaToBaseMessageChunk(
1170
+ delta,
1171
+ rawResponse,
1172
+ defaultRole
1173
+ );
1174
+ if (
1175
+ isFirstPartyAzureEndpoint({
1176
+ baseURL: this.clientConfig.baseURL,
1177
+ azureOpenAIBasePath: this.azureOpenAIBasePath,
1178
+ })
1179
+ ) {
1180
+ // First-party Azure OpenAI: same sequential-by-index stream contract
1181
+ // as api.openai.com.
1182
+ return stampSequentialStreamedToolCallAdapter(message);
1183
+ }
1184
+ return message;
1185
+ }
1186
+
1093
1187
  _getClientOptions(
1094
1188
  options: OpenAICoreRequestOptions | undefined
1095
1189
  ): OpenAICoreRequestOptions {