@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
@@ -6,6 +6,9 @@ import {
6
6
  STREAMED_TOOL_CALL_SEAL_METADATA_KEY,
7
7
  STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY,
8
8
  OPENAI_RESPONSES_STREAMED_TOOL_CALL_ADAPTER,
9
+ BEDROCK_CONVERSE_STREAMED_TOOL_CALL_ADAPTER,
10
+ GOOGLE_STREAMED_TOOL_CALL_ADAPTER,
11
+ OPENAI_CHAT_SEQUENTIAL_STREAMED_TOOL_CALL_ADAPTER,
9
12
  } from '@/tools/streamedToolCallSeals';
10
13
  import {
11
14
  Constants,
@@ -139,6 +142,18 @@ const openAIResponsesToolCallMetadata = {
139
142
  [STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY]:
140
143
  OPENAI_RESPONSES_STREAMED_TOOL_CALL_ADAPTER,
141
144
  };
145
+ const bedrockConverseToolCallMetadata = {
146
+ [STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY]:
147
+ BEDROCK_CONVERSE_STREAMED_TOOL_CALL_ADAPTER,
148
+ };
149
+ const googleOnArrivalToolCallMetadata = {
150
+ [STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY]: GOOGLE_STREAMED_TOOL_CALL_ADAPTER,
151
+ [STREAMED_TOOL_CALL_SEAL_METADATA_KEY]: { kind: 'all' },
152
+ };
153
+ const openAIChatSequentialToolCallMetadata = {
154
+ [STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY]:
155
+ OPENAI_CHAT_SEQUENTIAL_STREAMED_TOOL_CALL_ADAPTER,
156
+ };
142
157
 
143
158
  describe('ChatModelStreamHandler eager event tool execution', () => {
144
159
  afterEach(() => {
@@ -4023,4 +4038,692 @@ describe('ChatModelStreamHandler eager event tool execution', () => {
4023
4038
  });
4024
4039
  expect(graph.eagerEventToolUsageCount.get('weather')).toBe(2);
4025
4040
  });
4041
+
4042
+ it('prestarts Bedrock Converse streamed tool calls on content block stop seals', async () => {
4043
+ const graph = createGraph({
4044
+ getAgentContext: jest.fn(
4045
+ (): Partial<AgentContext> => ({
4046
+ provider: Providers.BEDROCK,
4047
+ reasoningKey: 'reasoning_content',
4048
+ toolDefinitions: [{ name: 'weather' }],
4049
+ graphTools: [],
4050
+ agentId: 'agent_1',
4051
+ })
4052
+ ) as unknown as StandardGraph['getAgentContext'],
4053
+ });
4054
+ const toolExecuteCalls: t.ToolExecuteBatchRequest[] = [];
4055
+ jest
4056
+ .spyOn(events, 'safeDispatchCustomEvent')
4057
+ .mockImplementation(async (event, data): Promise<void> => {
4058
+ if (event !== GraphEvents.ON_TOOL_EXECUTE) {
4059
+ return;
4060
+ }
4061
+ const batch = data as t.ToolExecuteBatchRequest;
4062
+ toolExecuteCalls.push(batch);
4063
+ batch.resolve([
4064
+ {
4065
+ toolCallId: 'call_weather',
4066
+ status: 'success',
4067
+ content: 'sunny',
4068
+ },
4069
+ ]);
4070
+ });
4071
+
4072
+ const handler = new ChatModelStreamHandler();
4073
+ const metadata = { langgraph_node: 'agent' };
4074
+
4075
+ await handler.handle(
4076
+ GraphEvents.CHAT_MODEL_STREAM,
4077
+ {
4078
+ chunk: {
4079
+ content: '',
4080
+ tool_call_chunks: [
4081
+ {
4082
+ id: 'call_weather',
4083
+ name: 'weather',
4084
+ index: 1,
4085
+ },
4086
+ ],
4087
+ response_metadata: bedrockConverseToolCallMetadata,
4088
+ } as unknown as t.StreamChunk,
4089
+ },
4090
+ metadata,
4091
+ graph
4092
+ );
4093
+ await handler.handle(
4094
+ GraphEvents.CHAT_MODEL_STREAM,
4095
+ {
4096
+ chunk: {
4097
+ content: '',
4098
+ tool_call_chunks: [
4099
+ {
4100
+ args: '{"city":"N',
4101
+ index: 1,
4102
+ },
4103
+ ],
4104
+ response_metadata: bedrockConverseToolCallMetadata,
4105
+ } as unknown as t.StreamChunk,
4106
+ },
4107
+ metadata,
4108
+ graph
4109
+ );
4110
+ await handler.handle(
4111
+ GraphEvents.CHAT_MODEL_STREAM,
4112
+ {
4113
+ chunk: {
4114
+ content: '',
4115
+ tool_call_chunks: [
4116
+ {
4117
+ args: 'YC"}',
4118
+ index: 1,
4119
+ },
4120
+ ],
4121
+ response_metadata: bedrockConverseToolCallMetadata,
4122
+ } as unknown as t.StreamChunk,
4123
+ },
4124
+ metadata,
4125
+ graph
4126
+ );
4127
+
4128
+ expect(toolExecuteCalls).toHaveLength(0);
4129
+
4130
+ await handler.handle(
4131
+ GraphEvents.CHAT_MODEL_STREAM,
4132
+ {
4133
+ chunk: {
4134
+ content: '',
4135
+ tool_call_chunks: [
4136
+ {
4137
+ args: '',
4138
+ index: 1,
4139
+ },
4140
+ ],
4141
+ response_metadata: {
4142
+ ...bedrockConverseToolCallMetadata,
4143
+ [STREAMED_TOOL_CALL_SEAL_METADATA_KEY]: {
4144
+ kind: 'single',
4145
+ index: 1,
4146
+ },
4147
+ },
4148
+ } as unknown as t.StreamChunk,
4149
+ },
4150
+ metadata,
4151
+ graph
4152
+ );
4153
+
4154
+ expect(toolExecuteCalls).toHaveLength(1);
4155
+ expect(toolExecuteCalls[0].toolCalls[0]).toMatchObject({
4156
+ id: 'call_weather',
4157
+ name: 'weather',
4158
+ args: { city: 'NYC' },
4159
+ stepId: expect.stringMatching(/^step_/),
4160
+ turn: 0,
4161
+ });
4162
+ expect(
4163
+ graph.eagerEventToolCallChunks.has(chunkStateKey('step-key', 1))
4164
+ ).toBe(false);
4165
+ });
4166
+
4167
+ it('prestarts each Bedrock tool call at its own stop seal in multi-call turns', async () => {
4168
+ const graph = createGraph({
4169
+ getAgentContext: jest.fn(
4170
+ (): Partial<AgentContext> => ({
4171
+ provider: Providers.BEDROCK,
4172
+ reasoningKey: 'reasoning_content',
4173
+ toolDefinitions: [{ name: 'weather' }, { name: 'stock' }],
4174
+ graphTools: [],
4175
+ agentId: 'agent_1',
4176
+ })
4177
+ ) as unknown as StandardGraph['getAgentContext'],
4178
+ });
4179
+ const toolExecuteCalls: t.ToolExecuteBatchRequest[] = [];
4180
+ jest
4181
+ .spyOn(events, 'safeDispatchCustomEvent')
4182
+ .mockImplementation(async (event, data): Promise<void> => {
4183
+ if (event !== GraphEvents.ON_TOOL_EXECUTE) {
4184
+ return;
4185
+ }
4186
+ const batch = data as t.ToolExecuteBatchRequest;
4187
+ toolExecuteCalls.push(batch);
4188
+ batch.resolve(
4189
+ batch.toolCalls.map((call) => ({
4190
+ toolCallId: call.id,
4191
+ status: 'success',
4192
+ content: `ok ${call.name}`,
4193
+ }))
4194
+ );
4195
+ });
4196
+
4197
+ const handler = new ChatModelStreamHandler();
4198
+ const metadata = { langgraph_node: 'agent' };
4199
+ const sendChunk = async (chunk: Record<string, unknown>): Promise<void> =>
4200
+ handler.handle(
4201
+ GraphEvents.CHAT_MODEL_STREAM,
4202
+ { chunk: chunk as unknown as t.StreamChunk },
4203
+ metadata,
4204
+ graph
4205
+ );
4206
+
4207
+ await sendChunk({
4208
+ content: '',
4209
+ tool_call_chunks: [{ id: 'call_weather', name: 'weather', index: 1 }],
4210
+ response_metadata: bedrockConverseToolCallMetadata,
4211
+ });
4212
+ await sendChunk({
4213
+ content: '',
4214
+ tool_call_chunks: [{ args: '{"city":"NYC"}', index: 1 }],
4215
+ response_metadata: bedrockConverseToolCallMetadata,
4216
+ });
4217
+ await sendChunk({
4218
+ content: '',
4219
+ tool_call_chunks: [{ args: '', index: 1 }],
4220
+ response_metadata: {
4221
+ ...bedrockConverseToolCallMetadata,
4222
+ [STREAMED_TOOL_CALL_SEAL_METADATA_KEY]: { kind: 'single', index: 1 },
4223
+ },
4224
+ });
4225
+
4226
+ expect(toolExecuteCalls).toHaveLength(1);
4227
+ expect(toolExecuteCalls[0].toolCalls[0]).toMatchObject({
4228
+ id: 'call_weather',
4229
+ args: { city: 'NYC' },
4230
+ });
4231
+
4232
+ await sendChunk({
4233
+ content: '',
4234
+ tool_call_chunks: [{ id: 'call_stock', name: 'stock', index: 2 }],
4235
+ response_metadata: bedrockConverseToolCallMetadata,
4236
+ });
4237
+ await sendChunk({
4238
+ content: '',
4239
+ tool_call_chunks: [{ args: '{"ticker":"CH"}', index: 2 }],
4240
+ response_metadata: bedrockConverseToolCallMetadata,
4241
+ });
4242
+
4243
+ expect(toolExecuteCalls).toHaveLength(1);
4244
+
4245
+ await sendChunk({
4246
+ content: '',
4247
+ tool_call_chunks: [{ args: '', index: 2 }],
4248
+ response_metadata: {
4249
+ ...bedrockConverseToolCallMetadata,
4250
+ [STREAMED_TOOL_CALL_SEAL_METADATA_KEY]: { kind: 'single', index: 2 },
4251
+ },
4252
+ });
4253
+
4254
+ expect(toolExecuteCalls).toHaveLength(2);
4255
+ expect(toolExecuteCalls[1].toolCalls[0]).toMatchObject({
4256
+ id: 'call_stock',
4257
+ args: { ticker: 'CH' },
4258
+ turn: 0,
4259
+ });
4260
+ });
4261
+
4262
+ it('prestarts Google tool calls sealed on arrival without a final tool-call signal', async () => {
4263
+ const graph = createGraph({
4264
+ getAgentContext: jest.fn(
4265
+ (): Partial<AgentContext> => ({
4266
+ provider: Providers.GOOGLE,
4267
+ reasoningKey: 'reasoning',
4268
+ toolDefinitions: [{ name: 'weather' }, { name: 'stock' }],
4269
+ graphTools: [],
4270
+ agentId: 'agent_1',
4271
+ })
4272
+ ) as unknown as StandardGraph['getAgentContext'],
4273
+ });
4274
+ const toolExecuteCalls: t.ToolExecuteBatchRequest[] = [];
4275
+ jest
4276
+ .spyOn(events, 'safeDispatchCustomEvent')
4277
+ .mockImplementation(async (event, data): Promise<void> => {
4278
+ if (event !== GraphEvents.ON_TOOL_EXECUTE) {
4279
+ return;
4280
+ }
4281
+ const batch = data as t.ToolExecuteBatchRequest;
4282
+ toolExecuteCalls.push(batch);
4283
+ batch.resolve(
4284
+ batch.toolCalls.map((call) => ({
4285
+ toolCallId: call.id,
4286
+ status: 'success',
4287
+ content: `ok ${call.name}`,
4288
+ }))
4289
+ );
4290
+ });
4291
+
4292
+ const handler = new ChatModelStreamHandler();
4293
+ const metadata = { langgraph_node: 'agent' };
4294
+
4295
+ await handler.handle(
4296
+ GraphEvents.CHAT_MODEL_STREAM,
4297
+ {
4298
+ chunk: {
4299
+ content: '',
4300
+ tool_calls: [
4301
+ {
4302
+ id: 'call_weather',
4303
+ name: 'weather',
4304
+ args: { city: 'NYC' },
4305
+ },
4306
+ ],
4307
+ tool_call_chunks: [
4308
+ {
4309
+ id: 'call_weather',
4310
+ name: 'weather',
4311
+ args: '{"city":"NYC"}',
4312
+ },
4313
+ ],
4314
+ response_metadata: googleOnArrivalToolCallMetadata,
4315
+ } as unknown as t.StreamChunk,
4316
+ },
4317
+ metadata,
4318
+ graph
4319
+ );
4320
+
4321
+ expect(toolExecuteCalls).toHaveLength(1);
4322
+ expect(toolExecuteCalls[0].toolCalls[0]).toMatchObject({
4323
+ id: 'call_weather',
4324
+ name: 'weather',
4325
+ args: { city: 'NYC' },
4326
+ stepId: expect.stringMatching(/^step_/),
4327
+ turn: 0,
4328
+ });
4329
+
4330
+ // A later chunk with another sealed call prestarts independently.
4331
+ await handler.handle(
4332
+ GraphEvents.CHAT_MODEL_STREAM,
4333
+ {
4334
+ chunk: {
4335
+ content: '',
4336
+ tool_calls: [
4337
+ {
4338
+ id: 'call_stock',
4339
+ name: 'stock',
4340
+ args: { ticker: 'CH' },
4341
+ },
4342
+ ],
4343
+ tool_call_chunks: [
4344
+ {
4345
+ id: 'call_stock',
4346
+ name: 'stock',
4347
+ args: '{"ticker":"CH"}',
4348
+ },
4349
+ ],
4350
+ response_metadata: googleOnArrivalToolCallMetadata,
4351
+ } as unknown as t.StreamChunk,
4352
+ },
4353
+ metadata,
4354
+ graph
4355
+ );
4356
+
4357
+ expect(toolExecuteCalls).toHaveLength(2);
4358
+ expect(toolExecuteCalls[1].toolCalls[0]).toMatchObject({
4359
+ id: 'call_stock',
4360
+ name: 'stock',
4361
+ args: { ticker: 'CH' },
4362
+ turn: 0,
4363
+ });
4364
+ expect(graph.eagerEventToolExecutions.has('call_weather')).toBe(true);
4365
+ expect(graph.eagerEventToolExecutions.has('call_stock')).toBe(true);
4366
+ });
4367
+
4368
+ it('keeps Google tool calls lazy without an on-arrival seal', async () => {
4369
+ const graph = createGraph({
4370
+ getAgentContext: jest.fn(
4371
+ (): Partial<AgentContext> => ({
4372
+ provider: Providers.GOOGLE,
4373
+ reasoningKey: 'reasoning',
4374
+ toolDefinitions: [{ name: 'weather' }],
4375
+ graphTools: [],
4376
+ agentId: 'agent_1',
4377
+ })
4378
+ ) as unknown as StandardGraph['getAgentContext'],
4379
+ });
4380
+ const toolExecuteCalls: t.ToolExecuteBatchRequest[] = [];
4381
+ jest
4382
+ .spyOn(events, 'safeDispatchCustomEvent')
4383
+ .mockImplementation(async (event, data): Promise<void> => {
4384
+ if (event !== GraphEvents.ON_TOOL_EXECUTE) {
4385
+ return;
4386
+ }
4387
+ toolExecuteCalls.push(data as t.ToolExecuteBatchRequest);
4388
+ });
4389
+
4390
+ await new ChatModelStreamHandler().handle(
4391
+ GraphEvents.CHAT_MODEL_STREAM,
4392
+ {
4393
+ chunk: {
4394
+ content: '',
4395
+ tool_calls: [
4396
+ {
4397
+ id: 'call_weather',
4398
+ name: 'weather',
4399
+ args: { city: 'NYC' },
4400
+ },
4401
+ ],
4402
+ tool_call_chunks: [
4403
+ {
4404
+ id: 'call_weather',
4405
+ name: 'weather',
4406
+ args: '{"city":"NYC"}',
4407
+ },
4408
+ ],
4409
+ } as unknown as t.StreamChunk,
4410
+ },
4411
+ { langgraph_node: 'agent' },
4412
+ graph
4413
+ );
4414
+
4415
+ expect(toolExecuteCalls).toHaveLength(0);
4416
+ expect(graph.eagerEventToolExecutions.size).toBe(0);
4417
+ });
4418
+
4419
+ it('does not prestart on-arrival sealed calls when batch-sensitive hooks are configured', async () => {
4420
+ const graph = createGraph({
4421
+ hookRegistry: {} as StandardGraph['hookRegistry'],
4422
+ });
4423
+ const dispatchSpy = jest.spyOn(events, 'safeDispatchCustomEvent');
4424
+
4425
+ await new ChatModelStreamHandler().handle(
4426
+ GraphEvents.CHAT_MODEL_STREAM,
4427
+ {
4428
+ chunk: {
4429
+ content: '',
4430
+ tool_calls: [
4431
+ {
4432
+ id: 'call_weather',
4433
+ name: 'weather',
4434
+ args: { city: 'NYC' },
4435
+ },
4436
+ ],
4437
+ tool_call_chunks: [
4438
+ {
4439
+ id: 'call_weather',
4440
+ name: 'weather',
4441
+ args: '{"city":"NYC"}',
4442
+ },
4443
+ ],
4444
+ response_metadata: googleOnArrivalToolCallMetadata,
4445
+ } as unknown as t.StreamChunk,
4446
+ },
4447
+ { langgraph_node: 'agent' },
4448
+ graph
4449
+ );
4450
+
4451
+ expect(dispatchSpy).not.toHaveBeenCalledWith(
4452
+ GraphEvents.ON_TOOL_EXECUTE,
4453
+ expect.anything(),
4454
+ expect.anything()
4455
+ );
4456
+ expect(graph.eagerEventToolExecutions.size).toBe(0);
4457
+ });
4458
+
4459
+ it('does not prestart on-arrival sealed calls for programmatic tool calling batches', async () => {
4460
+ const graph = createGraph();
4461
+ const dispatchSpy = jest.spyOn(events, 'safeDispatchCustomEvent');
4462
+
4463
+ await new ChatModelStreamHandler().handle(
4464
+ GraphEvents.CHAT_MODEL_STREAM,
4465
+ {
4466
+ chunk: {
4467
+ content: '',
4468
+ tool_calls: [
4469
+ {
4470
+ id: 'call_weather',
4471
+ name: 'weather',
4472
+ args: { city: 'NYC' },
4473
+ },
4474
+ ],
4475
+ tool_call_chunks: [
4476
+ {
4477
+ id: 'call_weather',
4478
+ name: 'weather',
4479
+ args: '{"city":"NYC"}',
4480
+ },
4481
+ ],
4482
+ response_metadata: googleOnArrivalToolCallMetadata,
4483
+ } as unknown as t.StreamChunk,
4484
+ },
4485
+ {
4486
+ langgraph_node: 'agent',
4487
+ [Constants.PROGRAMMATIC_TOOL_CALLING]: true,
4488
+ },
4489
+ graph
4490
+ );
4491
+
4492
+ expect(dispatchSpy).not.toHaveBeenCalledWith(
4493
+ GraphEvents.ON_TOOL_EXECUTE,
4494
+ expect.anything(),
4495
+ expect.anything()
4496
+ );
4497
+ expect(graph.eagerEventToolExecutions.size).toBe(0);
4498
+ });
4499
+
4500
+ it('does not prestart on-arrival sealed calls when eager execution is disabled', async () => {
4501
+ const graph = createGraph({
4502
+ eagerEventToolExecution: { enabled: false },
4503
+ } as Partial<StandardGraph>);
4504
+ const dispatchSpy = jest.spyOn(events, 'safeDispatchCustomEvent');
4505
+
4506
+ await new ChatModelStreamHandler().handle(
4507
+ GraphEvents.CHAT_MODEL_STREAM,
4508
+ {
4509
+ chunk: {
4510
+ content: '',
4511
+ tool_calls: [
4512
+ {
4513
+ id: 'call_weather',
4514
+ name: 'weather',
4515
+ args: { city: 'NYC' },
4516
+ },
4517
+ ],
4518
+ tool_call_chunks: [
4519
+ {
4520
+ id: 'call_weather',
4521
+ name: 'weather',
4522
+ args: '{"city":"NYC"}',
4523
+ },
4524
+ ],
4525
+ response_metadata: googleOnArrivalToolCallMetadata,
4526
+ } as unknown as t.StreamChunk,
4527
+ },
4528
+ { langgraph_node: 'agent' },
4529
+ graph
4530
+ );
4531
+
4532
+ expect(dispatchSpy).not.toHaveBeenCalledWith(
4533
+ GraphEvents.ON_TOOL_EXECUTE,
4534
+ expect.anything(),
4535
+ expect.anything()
4536
+ );
4537
+ expect(graph.eagerEventToolExecutions.size).toBe(0);
4538
+ });
4539
+
4540
+ it('prestarts official OpenAI sequential streamed tool calls when a later index begins', async () => {
4541
+ const graph = createGraph({
4542
+ getAgentContext: jest.fn(
4543
+ (): Partial<AgentContext> => ({
4544
+ provider: Providers.OPENAI,
4545
+ reasoningKey: 'reasoning_content',
4546
+ toolDefinitions: [{ name: 'weather' }, { name: 'stock' }],
4547
+ graphTools: [],
4548
+ agentId: 'agent_1',
4549
+ })
4550
+ ) as unknown as StandardGraph['getAgentContext'],
4551
+ });
4552
+ const toolExecuteCalls: t.ToolExecuteBatchRequest[] = [];
4553
+ jest
4554
+ .spyOn(events, 'safeDispatchCustomEvent')
4555
+ .mockImplementation(async (event, data): Promise<void> => {
4556
+ if (event !== GraphEvents.ON_TOOL_EXECUTE) {
4557
+ return;
4558
+ }
4559
+ const batch = data as t.ToolExecuteBatchRequest;
4560
+ toolExecuteCalls.push(batch);
4561
+ batch.resolve(
4562
+ batch.toolCalls.map((call) => ({
4563
+ toolCallId: call.id,
4564
+ status: 'success',
4565
+ content: `ok ${call.name}`,
4566
+ }))
4567
+ );
4568
+ });
4569
+
4570
+ const handler = new ChatModelStreamHandler();
4571
+ const metadata = { langgraph_node: 'agent' };
4572
+
4573
+ await handler.handle(
4574
+ GraphEvents.CHAT_MODEL_STREAM,
4575
+ {
4576
+ chunk: {
4577
+ content: '',
4578
+ tool_call_chunks: [
4579
+ {
4580
+ id: 'call_weather',
4581
+ name: 'weather',
4582
+ args: '{"city":"NYC"}',
4583
+ index: 0,
4584
+ },
4585
+ ],
4586
+ response_metadata: openAIChatSequentialToolCallMetadata,
4587
+ } as unknown as t.StreamChunk,
4588
+ },
4589
+ metadata,
4590
+ graph
4591
+ );
4592
+
4593
+ expect(toolExecuteCalls).toHaveLength(0);
4594
+
4595
+ await handler.handle(
4596
+ GraphEvents.CHAT_MODEL_STREAM,
4597
+ {
4598
+ chunk: {
4599
+ content: '',
4600
+ tool_call_chunks: [
4601
+ {
4602
+ id: 'call_stock',
4603
+ name: 'stock',
4604
+ index: 1,
4605
+ },
4606
+ ],
4607
+ response_metadata: openAIChatSequentialToolCallMetadata,
4608
+ } as unknown as t.StreamChunk,
4609
+ },
4610
+ metadata,
4611
+ graph
4612
+ );
4613
+
4614
+ expect(toolExecuteCalls).toHaveLength(1);
4615
+ expect(toolExecuteCalls[0].toolCalls[0]).toMatchObject({
4616
+ id: 'call_weather',
4617
+ name: 'weather',
4618
+ args: { city: 'NYC' },
4619
+ stepId: expect.stringMatching(/^step_/),
4620
+ turn: 0,
4621
+ });
4622
+
4623
+ await handler.handle(
4624
+ GraphEvents.CHAT_MODEL_STREAM,
4625
+ {
4626
+ chunk: {
4627
+ content: '',
4628
+ tool_call_chunks: [
4629
+ {
4630
+ args: '{"ticker":"CH"}',
4631
+ index: 1,
4632
+ },
4633
+ ],
4634
+ response_metadata: openAIChatSequentialToolCallMetadata,
4635
+ } as unknown as t.StreamChunk,
4636
+ },
4637
+ metadata,
4638
+ graph
4639
+ );
4640
+
4641
+ expect(toolExecuteCalls).toHaveLength(1);
4642
+
4643
+ // The final cumulative tool_calls chunk dispatches only the unstarted call.
4644
+ await handler.handle(
4645
+ GraphEvents.CHAT_MODEL_STREAM,
4646
+ {
4647
+ chunk: {
4648
+ content: '',
4649
+ tool_calls: [
4650
+ {
4651
+ id: 'call_weather',
4652
+ name: 'weather',
4653
+ args: { city: 'NYC' },
4654
+ },
4655
+ {
4656
+ id: 'call_stock',
4657
+ name: 'stock',
4658
+ args: { ticker: 'CH' },
4659
+ },
4660
+ ],
4661
+ response_metadata: finalToolCallResponseMetadata,
4662
+ } as unknown as t.StreamChunk,
4663
+ },
4664
+ metadata,
4665
+ graph
4666
+ );
4667
+
4668
+ expect(toolExecuteCalls).toHaveLength(2);
4669
+ expect(toolExecuteCalls[1].toolCalls).toHaveLength(1);
4670
+ expect(toolExecuteCalls[1].toolCalls[0]).toMatchObject({
4671
+ id: 'call_stock',
4672
+ name: 'stock',
4673
+ args: { ticker: 'CH' },
4674
+ turn: 0,
4675
+ });
4676
+ });
4677
+
4678
+ it('does not prestart on-arrival sealed calls when direct tools may stream', async () => {
4679
+ const graph = createGraph({
4680
+ getAgentContext: jest.fn(
4681
+ (): Partial<AgentContext> => ({
4682
+ provider: Providers.GOOGLE,
4683
+ reasoningKey: 'reasoning',
4684
+ toolDefinitions: [{ name: 'weather' }],
4685
+ graphTools: [{ name: 'lookup' }],
4686
+ agentId: 'agent_1',
4687
+ })
4688
+ ) as unknown as StandardGraph['getAgentContext'],
4689
+ });
4690
+ const toolExecuteCalls: t.ToolExecuteBatchRequest[] = [];
4691
+ jest
4692
+ .spyOn(events, 'safeDispatchCustomEvent')
4693
+ .mockImplementation(async (event, data): Promise<void> => {
4694
+ if (event !== GraphEvents.ON_TOOL_EXECUTE) {
4695
+ return;
4696
+ }
4697
+ toolExecuteCalls.push(data as t.ToolExecuteBatchRequest);
4698
+ });
4699
+
4700
+ await new ChatModelStreamHandler().handle(
4701
+ GraphEvents.CHAT_MODEL_STREAM,
4702
+ {
4703
+ chunk: {
4704
+ content: '',
4705
+ tool_calls: [
4706
+ {
4707
+ id: 'call_weather',
4708
+ name: 'weather',
4709
+ args: { city: 'NYC' },
4710
+ },
4711
+ ],
4712
+ tool_call_chunks: [
4713
+ {
4714
+ id: 'call_weather',
4715
+ name: 'weather',
4716
+ args: '{"city":"NYC"}',
4717
+ },
4718
+ ],
4719
+ response_metadata: googleOnArrivalToolCallMetadata,
4720
+ } as unknown as t.StreamChunk,
4721
+ },
4722
+ { langgraph_node: 'agent' },
4723
+ graph
4724
+ );
4725
+
4726
+ expect(toolExecuteCalls).toHaveLength(0);
4727
+ expect(graph.eagerEventToolExecutions.size).toBe(0);
4728
+ });
4026
4729
  });