@librechat/agents 3.2.2 → 3.2.31

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 (401) hide show
  1. package/dist/cjs/agents/AgentContext.cjs +3 -2
  2. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  3. package/dist/cjs/events.cjs.map +1 -1
  4. package/dist/cjs/graphs/Graph.cjs +200 -54
  5. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  6. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
  7. package/dist/cjs/hooks/createWorkspacePolicyHook.cjs +13 -7
  8. package/dist/cjs/hooks/createWorkspacePolicyHook.cjs.map +1 -1
  9. package/dist/cjs/hooks/executeHooks.cjs.map +1 -1
  10. package/dist/cjs/hooks/types.cjs.map +1 -1
  11. package/dist/cjs/instrumentation.cjs +33 -0
  12. package/dist/cjs/instrumentation.cjs.map +1 -1
  13. package/dist/cjs/langfuse.cjs +17 -1
  14. package/dist/cjs/langfuse.cjs.map +1 -1
  15. package/dist/cjs/langfuseToolOutputTracing.cjs +2 -2
  16. package/dist/cjs/langfuseToolOutputTracing.cjs.map +1 -1
  17. package/dist/cjs/llm/anthropic/index.cjs +1 -1
  18. package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
  19. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  20. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +1 -1
  21. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -1
  22. package/dist/cjs/llm/bedrock/index.cjs +2 -2
  23. package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
  24. package/dist/cjs/llm/bedrock/toolCache.cjs +8 -5
  25. package/dist/cjs/llm/bedrock/toolCache.cjs.map +1 -1
  26. package/dist/cjs/llm/fake.cjs +16 -14
  27. package/dist/cjs/llm/fake.cjs.map +1 -1
  28. package/dist/cjs/llm/google/index.cjs +22 -0
  29. package/dist/cjs/llm/google/index.cjs.map +1 -1
  30. package/dist/cjs/llm/google/utils/common.cjs +88 -27
  31. package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
  32. package/dist/cjs/llm/init.cjs +2 -2
  33. package/dist/cjs/llm/invoke.cjs +108 -11
  34. package/dist/cjs/llm/invoke.cjs.map +1 -1
  35. package/dist/cjs/llm/openai/index.cjs +1 -1
  36. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  37. package/dist/cjs/llm/openai/utils/index.cjs +1 -1
  38. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  39. package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
  40. package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
  41. package/dist/cjs/main.cjs +1 -0
  42. package/dist/cjs/main.cjs.map +1 -1
  43. package/dist/cjs/messages/cache.cjs +8 -7
  44. package/dist/cjs/messages/cache.cjs.map +1 -1
  45. package/dist/cjs/messages/content.cjs.map +1 -1
  46. package/dist/cjs/messages/contextPruning.cjs.map +1 -1
  47. package/dist/cjs/messages/format.cjs +124 -17
  48. package/dist/cjs/messages/format.cjs.map +1 -1
  49. package/dist/cjs/messages/prune.cjs.map +1 -1
  50. package/dist/cjs/messages/reducer.cjs +1 -1
  51. package/dist/cjs/messages/reducer.cjs.map +1 -1
  52. package/dist/cjs/messages/tools.cjs +1 -1
  53. package/dist/cjs/messages/tools.cjs.map +1 -1
  54. package/dist/cjs/openai/index.cjs.map +1 -1
  55. package/dist/cjs/responses/index.cjs.map +1 -1
  56. package/dist/cjs/run.cjs +47 -21
  57. package/dist/cjs/run.cjs.map +1 -1
  58. package/dist/cjs/session/AgentSession.cjs +4 -4
  59. package/dist/cjs/session/AgentSession.cjs.map +1 -1
  60. package/dist/cjs/session/JsonlSessionStore.cjs +2 -2
  61. package/dist/cjs/session/JsonlSessionStore.cjs.map +1 -1
  62. package/dist/cjs/session/handlers.cjs +2 -2
  63. package/dist/cjs/session/handlers.cjs.map +1 -1
  64. package/dist/cjs/stream.cjs +248 -25
  65. package/dist/cjs/stream.cjs.map +1 -1
  66. package/dist/cjs/summarization/node.cjs.map +1 -1
  67. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs +1 -1
  68. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs.map +1 -1
  69. package/dist/cjs/tools/Calculator.cjs +1 -1
  70. package/dist/cjs/tools/Calculator.cjs.map +1 -1
  71. package/dist/cjs/tools/CodeExecutor.cjs +1 -1
  72. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
  73. package/dist/cjs/tools/SubagentTool.cjs.map +1 -1
  74. package/dist/cjs/tools/ToolNode.cjs +37 -18
  75. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  76. package/dist/cjs/tools/ToolSearch.cjs +1 -1
  77. package/dist/cjs/tools/ToolSearch.cjs.map +1 -1
  78. package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs +7 -4
  79. package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs.map +1 -1
  80. package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs +4 -4
  81. package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs.map +1 -1
  82. package/dist/cjs/tools/handlers.cjs +2 -1
  83. package/dist/cjs/tools/handlers.cjs.map +1 -1
  84. package/dist/cjs/tools/local/CompileCheckTool.cjs.map +1 -1
  85. package/dist/cjs/tools/local/FileCheckpointer.cjs +2 -1
  86. package/dist/cjs/tools/local/FileCheckpointer.cjs.map +1 -1
  87. package/dist/cjs/tools/local/LocalCodingTools.cjs +45 -19
  88. package/dist/cjs/tools/local/LocalCodingTools.cjs.map +1 -1
  89. package/dist/cjs/tools/local/LocalExecutionEngine.cjs +3 -3
  90. package/dist/cjs/tools/local/LocalExecutionEngine.cjs.map +1 -1
  91. package/dist/cjs/tools/local/LocalExecutionTools.cjs +2 -2
  92. package/dist/cjs/tools/local/LocalExecutionTools.cjs.map +1 -1
  93. package/dist/cjs/tools/local/LocalProgrammaticToolCalling.cjs +4 -3
  94. package/dist/cjs/tools/local/LocalProgrammaticToolCalling.cjs.map +1 -1
  95. package/dist/cjs/tools/local/attachments.cjs +0 -5
  96. package/dist/cjs/tools/local/attachments.cjs.map +1 -1
  97. package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs +4 -4
  98. package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs.map +1 -1
  99. package/dist/cjs/tools/search/firecrawl.cjs +1 -1
  100. package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
  101. package/dist/cjs/tools/search/rerankers.cjs +7 -3
  102. package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
  103. package/dist/cjs/tools/search/tavily-search.cjs +1 -1
  104. package/dist/cjs/tools/search/tavily-search.cjs.map +1 -1
  105. package/dist/cjs/tools/search/utils.cjs +76 -8
  106. package/dist/cjs/tools/search/utils.cjs.map +1 -1
  107. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +1 -1
  108. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
  109. package/dist/cjs/utils/handlers.cjs +1 -1
  110. package/dist/cjs/utils/handlers.cjs.map +1 -1
  111. package/dist/cjs/utils/run.cjs +1 -1
  112. package/dist/cjs/utils/run.cjs.map +1 -1
  113. package/dist/esm/agents/AgentContext.mjs +3 -2
  114. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  115. package/dist/esm/events.mjs.map +1 -1
  116. package/dist/esm/graphs/Graph.mjs +200 -54
  117. package/dist/esm/graphs/Graph.mjs.map +1 -1
  118. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  119. package/dist/esm/hooks/createWorkspacePolicyHook.mjs +13 -7
  120. package/dist/esm/hooks/createWorkspacePolicyHook.mjs.map +1 -1
  121. package/dist/esm/hooks/executeHooks.mjs.map +1 -1
  122. package/dist/esm/hooks/types.mjs.map +1 -1
  123. package/dist/esm/instrumentation.mjs +33 -1
  124. package/dist/esm/instrumentation.mjs.map +1 -1
  125. package/dist/esm/langfuse.mjs +17 -2
  126. package/dist/esm/langfuse.mjs.map +1 -1
  127. package/dist/esm/langfuseToolOutputTracing.mjs +2 -2
  128. package/dist/esm/langfuseToolOutputTracing.mjs.map +1 -1
  129. package/dist/esm/llm/anthropic/index.mjs +1 -1
  130. package/dist/esm/llm/anthropic/index.mjs.map +1 -1
  131. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  132. package/dist/esm/llm/anthropic/utils/message_outputs.mjs +1 -1
  133. package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -1
  134. package/dist/esm/llm/bedrock/index.mjs +2 -2
  135. package/dist/esm/llm/bedrock/index.mjs.map +1 -1
  136. package/dist/esm/llm/bedrock/toolCache.mjs +8 -5
  137. package/dist/esm/llm/bedrock/toolCache.mjs.map +1 -1
  138. package/dist/esm/llm/fake.mjs +16 -14
  139. package/dist/esm/llm/fake.mjs.map +1 -1
  140. package/dist/esm/llm/google/index.mjs +23 -1
  141. package/dist/esm/llm/google/index.mjs.map +1 -1
  142. package/dist/esm/llm/google/utils/common.mjs +88 -27
  143. package/dist/esm/llm/google/utils/common.mjs.map +1 -1
  144. package/dist/esm/llm/init.mjs +2 -2
  145. package/dist/esm/llm/invoke.mjs +104 -7
  146. package/dist/esm/llm/invoke.mjs.map +1 -1
  147. package/dist/esm/llm/openai/index.mjs +1 -1
  148. package/dist/esm/llm/openai/index.mjs.map +1 -1
  149. package/dist/esm/llm/openai/utils/index.mjs +1 -1
  150. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  151. package/dist/esm/llm/openrouter/index.mjs.map +1 -1
  152. package/dist/esm/llm/vertexai/index.mjs.map +1 -1
  153. package/dist/esm/main.mjs +1 -1
  154. package/dist/esm/messages/cache.mjs +8 -7
  155. package/dist/esm/messages/cache.mjs.map +1 -1
  156. package/dist/esm/messages/content.mjs.map +1 -1
  157. package/dist/esm/messages/contextPruning.mjs.map +1 -1
  158. package/dist/esm/messages/format.mjs +124 -18
  159. package/dist/esm/messages/format.mjs.map +1 -1
  160. package/dist/esm/messages/prune.mjs.map +1 -1
  161. package/dist/esm/messages/reducer.mjs +1 -1
  162. package/dist/esm/messages/reducer.mjs.map +1 -1
  163. package/dist/esm/messages/tools.mjs +1 -1
  164. package/dist/esm/messages/tools.mjs.map +1 -1
  165. package/dist/esm/openai/index.mjs.map +1 -1
  166. package/dist/esm/responses/index.mjs.map +1 -1
  167. package/dist/esm/run.mjs +47 -21
  168. package/dist/esm/run.mjs.map +1 -1
  169. package/dist/esm/session/AgentSession.mjs +4 -4
  170. package/dist/esm/session/AgentSession.mjs.map +1 -1
  171. package/dist/esm/session/JsonlSessionStore.mjs +2 -2
  172. package/dist/esm/session/JsonlSessionStore.mjs.map +1 -1
  173. package/dist/esm/session/handlers.mjs +2 -2
  174. package/dist/esm/session/handlers.mjs.map +1 -1
  175. package/dist/esm/stream.mjs +248 -25
  176. package/dist/esm/stream.mjs.map +1 -1
  177. package/dist/esm/summarization/node.mjs.map +1 -1
  178. package/dist/esm/tools/BashProgrammaticToolCalling.mjs +1 -1
  179. package/dist/esm/tools/BashProgrammaticToolCalling.mjs.map +1 -1
  180. package/dist/esm/tools/Calculator.mjs +1 -1
  181. package/dist/esm/tools/Calculator.mjs.map +1 -1
  182. package/dist/esm/tools/CodeExecutor.mjs +1 -1
  183. package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
  184. package/dist/esm/tools/SubagentTool.mjs.map +1 -1
  185. package/dist/esm/tools/ToolNode.mjs +37 -18
  186. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  187. package/dist/esm/tools/ToolSearch.mjs +1 -1
  188. package/dist/esm/tools/ToolSearch.mjs.map +1 -1
  189. package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs +7 -4
  190. package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs.map +1 -1
  191. package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs +4 -4
  192. package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs.map +1 -1
  193. package/dist/esm/tools/handlers.mjs +2 -1
  194. package/dist/esm/tools/handlers.mjs.map +1 -1
  195. package/dist/esm/tools/local/CompileCheckTool.mjs.map +1 -1
  196. package/dist/esm/tools/local/FileCheckpointer.mjs +2 -1
  197. package/dist/esm/tools/local/FileCheckpointer.mjs.map +1 -1
  198. package/dist/esm/tools/local/LocalCodingTools.mjs +45 -19
  199. package/dist/esm/tools/local/LocalCodingTools.mjs.map +1 -1
  200. package/dist/esm/tools/local/LocalExecutionEngine.mjs +3 -3
  201. package/dist/esm/tools/local/LocalExecutionEngine.mjs.map +1 -1
  202. package/dist/esm/tools/local/LocalExecutionTools.mjs +2 -2
  203. package/dist/esm/tools/local/LocalExecutionTools.mjs.map +1 -1
  204. package/dist/esm/tools/local/LocalProgrammaticToolCalling.mjs +4 -3
  205. package/dist/esm/tools/local/LocalProgrammaticToolCalling.mjs.map +1 -1
  206. package/dist/esm/tools/local/attachments.mjs +0 -5
  207. package/dist/esm/tools/local/attachments.mjs.map +1 -1
  208. package/dist/esm/tools/local/resolveLocalExecutionTools.mjs +4 -4
  209. package/dist/esm/tools/local/resolveLocalExecutionTools.mjs.map +1 -1
  210. package/dist/esm/tools/search/firecrawl.mjs +1 -1
  211. package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
  212. package/dist/esm/tools/search/rerankers.mjs +8 -4
  213. package/dist/esm/tools/search/rerankers.mjs.map +1 -1
  214. package/dist/esm/tools/search/tavily-search.mjs +1 -1
  215. package/dist/esm/tools/search/tavily-search.mjs.map +1 -1
  216. package/dist/esm/tools/search/utils.mjs +76 -9
  217. package/dist/esm/tools/search/utils.mjs.map +1 -1
  218. package/dist/esm/tools/subagent/SubagentExecutor.mjs +1 -1
  219. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
  220. package/dist/esm/utils/handlers.mjs +1 -1
  221. package/dist/esm/utils/handlers.mjs.map +1 -1
  222. package/dist/esm/utils/run.mjs +1 -1
  223. package/dist/esm/utils/run.mjs.map +1 -1
  224. package/dist/types/agents/__tests__/promptCacheLiveHelpers.d.ts +1 -1
  225. package/dist/types/events.d.ts +1 -1
  226. package/dist/types/graphs/Graph.d.ts +7 -1
  227. package/dist/types/hooks/executeHooks.d.ts +1 -1
  228. package/dist/types/hooks/types.d.ts +5 -0
  229. package/dist/types/instrumentation.d.ts +1 -0
  230. package/dist/types/langfuse.d.ts +4 -0
  231. package/dist/types/llm/anthropic/utils/message_inputs.d.ts +1 -1
  232. package/dist/types/llm/anthropic/utils/message_outputs.d.ts +1 -1
  233. package/dist/types/llm/anthropic/utils/output_parsers.d.ts +2 -2
  234. package/dist/types/llm/bedrock/index.d.ts +2 -2
  235. package/dist/types/llm/fake.d.ts +3 -3
  236. package/dist/types/llm/google/index.d.ts +1 -0
  237. package/dist/types/llm/google/types.d.ts +1 -1
  238. package/dist/types/llm/google/utils/common.d.ts +2 -2
  239. package/dist/types/llm/google/utils/tools.d.ts +1 -1
  240. package/dist/types/llm/google/utils/zod_to_genai_parameters.d.ts +1 -1
  241. package/dist/types/llm/openai/index.d.ts +2 -2
  242. package/dist/types/llm/openai/utils/index.d.ts +1 -1
  243. package/dist/types/llm/openrouter/index.d.ts +4 -4
  244. package/dist/types/messages/contextPruning.d.ts +1 -1
  245. package/dist/types/messages/format.d.ts +9 -4
  246. package/dist/types/messages/prune.d.ts +1 -1
  247. package/dist/types/session/JsonlSessionStore.d.ts +1 -1
  248. package/dist/types/session/handlers.d.ts +1 -1
  249. package/dist/types/session/types.d.ts +1 -1
  250. package/dist/types/summarization/node.d.ts +1 -1
  251. package/dist/types/tools/SubagentTool.d.ts +2 -2
  252. package/dist/types/tools/ToolNode.d.ts +9 -2
  253. package/dist/types/tools/cloudflare/CloudflareSandboxExecutionEngine.d.ts +1 -1
  254. package/dist/types/tools/search/types.d.ts +1 -1
  255. package/dist/types/tools/search/utils.d.ts +11 -0
  256. package/dist/types/types/graph.d.ts +12 -4
  257. package/dist/types/types/llm.d.ts +4 -3
  258. package/dist/types/types/messages.d.ts +1 -1
  259. package/dist/types/types/run.d.ts +6 -6
  260. package/dist/types/types/stream.d.ts +2 -2
  261. package/dist/types/types/tools.d.ts +5 -1
  262. package/dist/types/utils/handlers.d.ts +2 -2
  263. package/dist/types/utils/run.d.ts +1 -1
  264. package/package.json +6 -3
  265. package/src/__tests__/stream.eagerEventExecution.test.ts +543 -6
  266. package/src/agents/AgentContext.ts +2 -2
  267. package/src/agents/__tests__/AgentContext.test.ts +3 -3
  268. package/src/agents/__tests__/promptCacheLiveHelpers.ts +1 -1
  269. package/src/events.ts +1 -1
  270. package/src/graphs/Graph.ts +329 -72
  271. package/src/graphs/MultiAgentGraph.ts +1 -1
  272. package/src/graphs/__tests__/Graph.reasoning.test.ts +919 -6
  273. package/src/graphs/__tests__/MultiAgentGraph.test.ts +1 -1
  274. package/src/graphs/__tests__/composition.smoke.test.ts +1 -1
  275. package/src/hooks/__tests__/HookRegistry.test.ts +1 -1
  276. package/src/hooks/__tests__/compactHooks.test.ts +8 -8
  277. package/src/hooks/__tests__/createWorkspacePolicyHook.test.ts +34 -22
  278. package/src/hooks/__tests__/executeHooks.test.ts +3 -3
  279. package/src/hooks/__tests__/integration.test.ts +3 -3
  280. package/src/hooks/__tests__/toolHooks.test.ts +10 -10
  281. package/src/hooks/createWorkspacePolicyHook.ts +17 -14
  282. package/src/hooks/executeHooks.ts +1 -1
  283. package/src/hooks/types.ts +5 -0
  284. package/src/instrumentation.ts +49 -8
  285. package/src/langfuse.ts +35 -1
  286. package/src/langfuseToolOutputTracing.ts +2 -2
  287. package/src/llm/anthropic/index.ts +1 -1
  288. package/src/llm/anthropic/utils/message_inputs.ts +1 -1
  289. package/src/llm/anthropic/utils/message_outputs.ts +3 -5
  290. package/src/llm/anthropic/utils/output_parsers.ts +5 -5
  291. package/src/llm/bedrock/index.ts +4 -4
  292. package/src/llm/bedrock/toolCache.test.ts +48 -9
  293. package/src/llm/bedrock/toolCache.ts +11 -6
  294. package/src/llm/custom-chat-models.smoke.test.ts +114 -0
  295. package/src/llm/fake.ts +30 -25
  296. package/src/llm/google/index.ts +43 -1
  297. package/src/llm/google/llm.spec.ts +173 -1
  298. package/src/llm/google/types.ts +1 -1
  299. package/src/llm/google/utils/common.ts +154 -45
  300. package/src/llm/google/utils/tools.ts +8 -8
  301. package/src/llm/google/utils/zod_to_genai_parameters.ts +4 -4
  302. package/src/llm/invoke.test.ts +3 -3
  303. package/src/llm/invoke.ts +170 -10
  304. package/src/llm/openai/index.ts +4 -4
  305. package/src/llm/openai/utils/index.ts +14 -14
  306. package/src/llm/openrouter/index.ts +4 -4
  307. package/src/llm/openrouter/reasoning.test.ts +2 -2
  308. package/src/llm/vertexai/fixThoughtSignatures.test.ts +1 -1
  309. package/src/llm/vertexai/index.ts +1 -1
  310. package/src/messages/cache.test.ts +22 -0
  311. package/src/messages/cache.ts +25 -12
  312. package/src/messages/content.ts +1 -1
  313. package/src/messages/contextPruning.ts +1 -1
  314. package/src/messages/format.ts +227 -43
  315. package/src/messages/formatAgentMessages.skills.test.ts +105 -26
  316. package/src/messages/formatAgentMessages.test.ts +841 -10
  317. package/src/messages/labelContentByAgent.test.ts +2 -2
  318. package/src/messages/prune.ts +1 -1
  319. package/src/messages/reducer.ts +1 -1
  320. package/src/messages/tools.ts +1 -1
  321. package/src/openai/__tests__/openai.test.ts +2 -2
  322. package/src/openai/index.ts +1 -1
  323. package/src/responses/__tests__/responses.test.ts +2 -2
  324. package/src/responses/index.ts +1 -1
  325. package/src/run.ts +82 -47
  326. package/src/session/AgentSession.ts +6 -6
  327. package/src/session/JsonlSessionStore.ts +3 -3
  328. package/src/session/__tests__/JsonlSessionStore.test.ts +5 -5
  329. package/src/session/__tests__/handlers.test.ts +2 -2
  330. package/src/session/handlers.ts +5 -5
  331. package/src/session/types.ts +1 -1
  332. package/src/specs/agent-handoffs.test.ts +1 -1
  333. package/src/specs/deterministic-trace-id.test.ts +50 -0
  334. package/src/specs/langfuse-callbacks.test.ts +2 -2
  335. package/src/specs/langfuse-metadata.test.ts +39 -0
  336. package/src/specs/langfuse-tool-output-tracing.test.ts +1 -1
  337. package/src/specs/multi-agent-summarization.test.ts +4 -4
  338. package/src/specs/subagent.test.ts +3 -3
  339. package/src/specs/summarization-unit.test.ts +1 -1
  340. package/src/specs/thinking-handoff.test.ts +1 -1
  341. package/src/splitStream.test.ts +48 -0
  342. package/src/stream.test.ts +53 -3
  343. package/src/stream.ts +450 -39
  344. package/src/summarization/__tests__/aggregator.test.ts +2 -2
  345. package/src/summarization/__tests__/node.test.ts +2 -2
  346. package/src/summarization/node.ts +1 -1
  347. package/src/tools/BashProgrammaticToolCalling.ts +5 -5
  348. package/src/tools/Calculator.ts +1 -1
  349. package/src/tools/CodeExecutor.ts +2 -4
  350. package/src/tools/SubagentTool.ts +2 -2
  351. package/src/tools/ToolNode.ts +37 -16
  352. package/src/tools/ToolSearch.ts +1 -1
  353. package/src/tools/__tests__/CloudflareSandboxExecution.test.ts +4 -4
  354. package/src/tools/__tests__/CodeApiAuthHeaders.test.ts +12 -12
  355. package/src/tools/__tests__/LocalExecutionTools.test.ts +125 -93
  356. package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +29 -5
  357. package/src/tools/__tests__/ReadFile.test.ts +1 -1
  358. package/src/tools/__tests__/SkillTool.test.ts +4 -4
  359. package/src/tools/__tests__/SubagentExecutor.test.ts +17 -13
  360. package/src/tools/__tests__/SubagentTool.test.ts +2 -2
  361. package/src/tools/__tests__/ToolNode.eagerEventExecution.test.ts +1 -1
  362. package/src/tools/__tests__/ToolNode.outputReferences.test.ts +2 -5
  363. package/src/tools/__tests__/ToolNode.session.test.ts +1 -1
  364. package/src/tools/__tests__/ToolSearch.test.ts +1 -1
  365. package/src/tools/__tests__/annotateMessagesForLLM.test.ts +1 -1
  366. package/src/tools/__tests__/directToolHITLResumeScope.test.ts +35 -32
  367. package/src/tools/__tests__/directToolHooks.test.ts +41 -0
  368. package/src/tools/__tests__/handlers.test.ts +2 -2
  369. package/src/tools/__tests__/hitl.test.ts +11 -11
  370. package/src/tools/__tests__/localToolNames.test.ts +8 -6
  371. package/src/tools/__tests__/skillCatalog.test.ts +1 -1
  372. package/src/tools/__tests__/subagentHooks.test.ts +20 -10
  373. package/src/tools/__tests__/workspaceSeam.test.ts +20 -7
  374. package/src/tools/cloudflare/CloudflareSandboxExecutionEngine.ts +9 -6
  375. package/src/tools/cloudflare/CloudflareSandboxTools.ts +19 -19
  376. package/src/tools/handlers.ts +5 -5
  377. package/src/tools/local/CompileCheckTool.ts +4 -7
  378. package/src/tools/local/FileCheckpointer.ts +6 -5
  379. package/src/tools/local/LocalCodingTools.ts +100 -45
  380. package/src/tools/local/LocalExecutionEngine.ts +5 -5
  381. package/src/tools/local/LocalExecutionTools.ts +9 -9
  382. package/src/tools/local/LocalProgrammaticToolCalling.ts +5 -4
  383. package/src/tools/local/attachments.ts +0 -6
  384. package/src/tools/local/resolveLocalExecutionTools.ts +15 -15
  385. package/src/tools/search/firecrawl.ts +1 -1
  386. package/src/tools/search/jina-reranker.test.ts +148 -37
  387. package/src/tools/search/rerankers.ts +14 -4
  388. package/src/tools/search/tavily-search.ts +2 -2
  389. package/src/tools/search/types.ts +1 -1
  390. package/src/tools/search/utils.ts +99 -9
  391. package/src/tools/subagent/SubagentExecutor.ts +12 -6
  392. package/src/types/graph.ts +20 -12
  393. package/src/types/llm.ts +7 -6
  394. package/src/types/messages.ts +1 -1
  395. package/src/types/run.ts +7 -7
  396. package/src/types/stream.ts +2 -2
  397. package/src/types/tools.ts +5 -1
  398. package/src/utils/handlers.ts +2 -2
  399. package/src/utils/llmConfig.ts +1 -1
  400. package/src/utils/logging.ts +20 -10
  401. package/src/utils/run.ts +2 -2
@@ -11,51 +11,50 @@ import { partitionAndMarkAnthropicToolCache, makeIsDeferred } from '../messages/
11
11
  import { formatContentStrings } from '../messages/content.mjs';
12
12
  import { extractToolDiscoveries } from '../messages/tools.mjs';
13
13
  import { messagesStateReducer } from '../messages/reducer.mjs';
14
- import { GraphNodeKeys, ContentTypes, Providers, GraphEvents, StepTypes } from '../common/enum.mjs';
14
+ import { shouldTraceToolNodeForLangfuse, resolveLangfuseConfig, withLangfuseToolOutputTracingConfig } from '../langfuseToolOutputTracing.mjs';
15
+ import { createLangfuseTraceMetadata, createLangfuseHandler, disposeLangfuseHandler, isLangfuseCallbackHandler } from '../langfuse.mjs';
15
16
  import { resetIfNotEmpty, joinKeys } from '../utils/graph.mjs';
16
17
  import { isAnthropicLike, isOpenAILike, isGoogleLike } from '../utils/llm.mjs';
17
18
  import '../stream.mjs';
19
+ import { GraphNodeKeys, ContentTypes, Providers, GraphEvents, StepTypes } from '../common/enum.mjs';
18
20
  import { sleep } from '../utils/run.mjs';
19
21
  import 'ai-tokenizer';
20
22
  import 'zod-to-json-schema';
21
- import { resolveSubagentConfigs, SubagentExecutor } from '../tools/subagent/SubagentExecutor.mjs';
22
- import { buildSubagentToolParams } from '../tools/SubagentTool.mjs';
23
+ import { findCallback, appendCallbacks } from '../utils/callbacks.mjs';
24
+ import { partitionAndMarkOpenRouterToolCache } from '../llm/openrouter/toolCache.mjs';
23
25
  import { ToolNode, toolsCondition } from '../tools/ToolNode.mjs';
26
+ import { createLocalCodingToolBundle } from '../tools/local/LocalCodingTools.mjs';
27
+ import { resolveSubagentConfigs, SubagentExecutor } from '../tools/subagent/SubagentExecutor.mjs';
24
28
  import { ToolOutputReferenceRegistry } from '../tools/toolOutputReferences.mjs';
29
+ import { partitionAndMarkBedrockToolCache } from '../llm/bedrock/toolCache.mjs';
25
30
  import { emitAgentLog, safeDispatchCustomEvent } from '../utils/events.mjs';
31
+ import 'path';
32
+ import '../tools/cloudflare/CloudflareProgrammaticToolCalling.mjs';
33
+ import 'stream';
34
+ import 'events';
35
+ import '../tools/local/LocalExecutionEngine.mjs';
36
+ import { createCloudflareCodingToolBundle } from '../tools/cloudflare/CloudflareSandboxTools.mjs';
26
37
  import { attemptInvoke, tryFallbackProviders } from '../llm/invoke.mjs';
38
+ import { buildSubagentToolParams } from '../tools/SubagentTool.mjs';
39
+ import { initializeLangfuseTracing } from '../instrumentation.mjs';
27
40
  import { shouldTriggerSummarization } from '../summarization/index.mjs';
28
- import { createSummarizeNode } from '../summarization/node.mjs';
29
- import { findCallback, appendCallbacks } from '../utils/callbacks.mjs';
30
- import { createSchemaOnlyTools } from '../tools/schema.mjs';
31
- import { AgentContext } from '../agents/AgentContext.mjs';
32
- import { createFakeStreamingLLM } from '../llm/fake.mjs';
33
- import { handleToolCalls } from '../tools/handlers.mjs';
34
41
  import '../tools/local/CompileCheckTool.mjs';
35
- import 'path';
36
42
  import 'fs/promises';
37
- import { createLocalCodingToolBundle } from '../tools/local/LocalCodingTools.mjs';
38
- import '../tools/local/LocalExecutionEngine.mjs';
39
- import '../tools/CodeExecutor.mjs';
40
43
  import '../tools/BashExecutor.mjs';
41
- import 'crypto';
44
+ import '../tools/CodeExecutor.mjs';
42
45
  import 'http';
43
- import '../hooks/createWorkspacePolicyHook.mjs';
46
+ import 'crypto';
44
47
  import '../tools/ProgrammaticToolCalling.mjs';
45
48
  import '../tools/BashProgrammaticToolCalling.mjs';
49
+ import '../hooks/createWorkspacePolicyHook.mjs';
46
50
  import { resolveLocalToolsForBinding } from '../tools/local/resolveLocalExecutionTools.mjs';
47
- import '../tools/local/attachments.mjs';
48
- import '../tools/cloudflare/CloudflareProgrammaticToolCalling.mjs';
49
- import 'events';
50
- import 'stream';
51
- import { createCloudflareCodingToolBundle } from '../tools/cloudflare/CloudflareSandboxTools.mjs';
51
+ import { createSummarizeNode } from '../summarization/node.mjs';
52
+ import { createSchemaOnlyTools } from '../tools/schema.mjs';
53
+ import { AgentContext } from '../agents/AgentContext.mjs';
54
+ import { createFakeStreamingLLM } from '../llm/fake.mjs';
55
+ import { handleToolCalls } from '../tools/handlers.mjs';
52
56
  import { isThinkingEnabled } from '../llm/request.mjs';
53
57
  import { initializeModel } from '../llm/init.mjs';
54
- import { createLangfuseTraceMetadata, createLangfuseHandler, disposeLangfuseHandler, isLangfuseCallbackHandler } from '../langfuse.mjs';
55
- import { initializeLangfuseTracing } from '../instrumentation.mjs';
56
- import { shouldTraceToolNodeForLangfuse, resolveLangfuseConfig, withLangfuseToolOutputTracingConfig } from '../langfuseToolOutputTracing.mjs';
57
- import { partitionAndMarkOpenRouterToolCache } from '../llm/openrouter/toolCache.mjs';
58
- import { partitionAndMarkBedrockToolCache } from '../llm/bedrock/toolCache.mjs';
59
58
 
60
59
  /* eslint-disable no-console */
61
60
  const { AGENT, TOOLS, SUMMARIZE } = GraphNodeKeys;
@@ -104,7 +103,23 @@ function getResponseReasoningContent({ responseMessage, reasoningKey, }) {
104
103
  }
105
104
  return getReasoningDetailsText(additionalKwargs.reasoning_details);
106
105
  }
107
- function getTextMessageDeltaContent(content) {
106
+ function isTextMessageContentPart(contentPart) {
107
+ return (typeof contentPart === 'object' &&
108
+ 'type' in contentPart &&
109
+ typeof contentPart.type === 'string' &&
110
+ contentPart.type.startsWith('text'));
111
+ }
112
+ function isGoogleServerSideToolMessageContentPart(contentPart) {
113
+ return (typeof contentPart === 'object' &&
114
+ 'type' in contentPart &&
115
+ (contentPart.type === 'toolCall' || contentPart.type === 'toolResponse'));
116
+ }
117
+ function hasGoogleServerSideToolDeltaContent(provider, content) {
118
+ return (isGoogleLike(provider) &&
119
+ Array.isArray(content) &&
120
+ content.some((contentPart) => isGoogleServerSideToolMessageContentPart(contentPart)));
121
+ }
122
+ function getMessageDeltaContent(provider, content) {
108
123
  if (content == null) {
109
124
  return undefined;
110
125
  }
@@ -116,24 +131,91 @@ function getTextMessageDeltaContent(content) {
116
131
  if (content.length === 0) {
117
132
  return undefined;
118
133
  }
119
- if (!content.every((contentPart) => typeof contentPart === 'object' &&
120
- 'type' in contentPart &&
121
- typeof contentPart.type === 'string' &&
122
- contentPart.type.startsWith('text'))) {
134
+ const hasGoogleServerSideToolPart = isGoogleLike(provider) &&
135
+ content.some((contentPart) => isGoogleServerSideToolMessageContentPart(contentPart));
136
+ if (content.every((contentPart) => isTextMessageContentPart(contentPart))) {
137
+ return content;
138
+ }
139
+ if (!hasGoogleServerSideToolPart) {
123
140
  return undefined;
124
141
  }
125
- return content;
142
+ const messageContent = content.filter((contentPart) => isTextMessageContentPart(contentPart) ||
143
+ isGoogleServerSideToolMessageContentPart(contentPart));
144
+ return messageContent.length > 0
145
+ ? messageContent
146
+ : undefined;
126
147
  }
127
- async function dispatchTextMessageContent({ graph, stepKey, content, metadata, }) {
128
- const messageId = getMessageId(stepKey, graph) ?? '';
129
- if (!messageId) {
148
+ function hasTextDeltaContent(content) {
149
+ if (content == null) {
130
150
  return false;
131
151
  }
152
+ return content.some((contentPart) => {
153
+ if (contentPart.type?.startsWith(ContentTypes.TEXT) !== true) {
154
+ return false;
155
+ }
156
+ const text = contentPart.text;
157
+ return typeof text === 'string' && text !== '';
158
+ });
159
+ }
160
+ function hasReasoningDeltaContent(content) {
161
+ if (content == null) {
162
+ return false;
163
+ }
164
+ return content.some((contentPart) => contentPart.type === ContentTypes.THINK && contentPart.think !== '');
165
+ }
166
+ function getCurrentStepIds({ graph, metadata, }) {
167
+ const baseStepKey = graph.getStepBaseKey(metadata);
168
+ const currentStepIds = [];
169
+ for (const [stepKey, stepIds] of graph.stepKeyIds) {
170
+ if (stepKey !== baseStepKey && !stepKey.startsWith(`${baseStepKey}_`)) {
171
+ continue;
172
+ }
173
+ currentStepIds.push(...stepIds);
174
+ }
175
+ return currentStepIds;
176
+ }
177
+ function hasCurrentTextDeltaStep({ graph, metadata, }) {
178
+ return getCurrentStepIds({ graph, metadata }).some((stepId) => graph.messageStepHasTextDeltas.has(stepId));
179
+ }
180
+ function hasCurrentReasoningDeltaStep({ graph, metadata, }) {
181
+ return getCurrentStepIds({ graph, metadata }).some((stepId) => graph.reasoningStepHasDeltas.has(stepId));
182
+ }
183
+ function clearCurrentDeltaStepMarkers({ graph, metadata, }) {
184
+ for (const stepId of getCurrentStepIds({ graph, metadata })) {
185
+ graph.messageStepHasTextDeltas.delete(stepId);
186
+ graph.reasoningStepHasDeltas.delete(stepId);
187
+ }
188
+ }
189
+ async function dispatchMessageCreationStep({ graph, stepKey, messageId, metadata, }) {
132
190
  await graph.dispatchRunStep(stepKey, {
133
191
  type: StepTypes.MESSAGE_CREATION,
134
192
  message_creation: { message_id: messageId },
135
193
  }, metadata);
136
- const stepId = graph.getStepIdByKey(stepKey);
194
+ return graph.getStepIdByKey(stepKey);
195
+ }
196
+ async function dispatchTextMessageContent({ graph, stepKey, provider, content, metadata, }) {
197
+ const messageId = getMessageId(stepKey, graph) ?? '';
198
+ if (!messageId) {
199
+ return false;
200
+ }
201
+ if (hasGoogleServerSideToolDeltaContent(provider, content)) {
202
+ for (const contentPart of content) {
203
+ const stepId = await dispatchMessageCreationStep({
204
+ graph,
205
+ stepKey,
206
+ messageId,
207
+ metadata,
208
+ });
209
+ await graph.dispatchMessageDelta(stepId, { content: [contentPart] }, metadata);
210
+ }
211
+ return true;
212
+ }
213
+ const stepId = await dispatchMessageCreationStep({
214
+ graph,
215
+ stepKey,
216
+ messageId,
217
+ metadata,
218
+ });
137
219
  await graph.dispatchMessageDelta(stepId, { content }, metadata);
138
220
  return true;
139
221
  }
@@ -170,7 +252,18 @@ function markPostReasoningContent(agentContext) {
170
252
  agentContext.tokenTypeSwitch = 'content';
171
253
  agentContext.reasoningTransitionCount++;
172
254
  }
255
+ function getDispatchableFinalReasoningContent({ agentContext, responseReasoningContent, hasStreamedTextDeltaStep, hasStreamedReasoningDeltaStep, }) {
256
+ if (responseReasoningContent == null || hasStreamedReasoningDeltaStep) {
257
+ return undefined;
258
+ }
259
+ if (agentContext.provider === Providers.OPENROUTER &&
260
+ hasStreamedTextDeltaStep) {
261
+ return undefined;
262
+ }
263
+ return responseReasoningContent;
264
+ }
173
265
  class Graph {
266
+ messageStepHasTextDeltas = new Set();
174
267
  messageStepHasToolCalls = new Map();
175
268
  messageIdsByStepKey = new Map();
176
269
  prelimMessageIdsByStepKey = new Map();
@@ -185,6 +278,7 @@ class Graph {
185
278
  * the same step are scoped to the active custom event dispatch.
186
279
  */
187
280
  handlerDispatchedStepIds = new Set();
281
+ reasoningStepHasDeltas = new Set();
188
282
  handlerDispatchedEventCounts = new Map();
189
283
  signal;
190
284
  /** Set of invoked tool call IDs from non-message run steps completed mid-run, if any */
@@ -257,6 +351,8 @@ class Graph {
257
351
  this.stepKeyIds = new Map();
258
352
  this.toolCallStepIds.clear();
259
353
  this.messageIdsByStepKey = new Map();
354
+ this.messageStepHasTextDeltas = new Set();
355
+ this.reasoningStepHasDeltas = new Set();
260
356
  this.messageStepHasToolCalls = new Map();
261
357
  this.prelimMessageIdsByStepKey = new Map();
262
358
  this.invokedToolIds = undefined;
@@ -477,6 +573,8 @@ class StandardGraph extends Graph {
477
573
  this.handlerDispatchedEventCounts = resetIfNotEmpty(this.handlerDispatchedEventCounts, new Map());
478
574
  this.messageIdsByStepKey = resetIfNotEmpty(this.messageIdsByStepKey, new Map());
479
575
  this.messageStepHasToolCalls = resetIfNotEmpty(this.messageStepHasToolCalls, new Map());
576
+ this.messageStepHasTextDeltas = resetIfNotEmpty(this.messageStepHasTextDeltas, new Set());
577
+ this.reasoningStepHasDeltas = resetIfNotEmpty(this.reasoningStepHasDeltas, new Set());
480
578
  this.prelimMessageIdsByStepKey = resetIfNotEmpty(this.prelimMessageIdsByStepKey, new Map());
481
579
  this.invokedToolIds = resetIfNotEmpty(this.invokedToolIds, undefined);
482
580
  for (const context of this.agentContexts.values()) {
@@ -524,6 +622,15 @@ class StandardGraph extends Graph {
524
622
  }
525
623
  return agentContext;
526
624
  }
625
+ getStepBaseKey(metadata) {
626
+ if (!metadata)
627
+ return '';
628
+ const keyList = this.getInvocationKeyList(metadata);
629
+ if (this.checkKeyList(keyList)) {
630
+ throw new Error('Missing metadata');
631
+ }
632
+ return joinKeys(keyList);
633
+ }
527
634
  getStepKey(metadata) {
528
635
  if (!metadata)
529
636
  return '';
@@ -562,6 +669,25 @@ class StandardGraph extends Graph {
562
669
  getKeyList(metadata) {
563
670
  if (!metadata)
564
671
  return [];
672
+ const keyList = this.getInvocationKeyList(metadata);
673
+ const agentContext = this.getAgentContext(metadata);
674
+ if (agentContext.currentTokenType === ContentTypes.THINK ||
675
+ agentContext.currentTokenType === 'think_and_text') {
676
+ keyList.push('reasoning');
677
+ }
678
+ else if (agentContext.tokenTypeSwitch === 'content') {
679
+ keyList.push(`post-reasoning-${agentContext.reasoningTransitionCount}`);
680
+ }
681
+ return keyList;
682
+ }
683
+ getInvocationKeyList(metadata) {
684
+ const keyList = this.getBaseKeyList(metadata);
685
+ if (this.invokedToolIds != null && this.invokedToolIds.size > 0) {
686
+ keyList.push(this.invokedToolIds.size + '');
687
+ }
688
+ return keyList;
689
+ }
690
+ getBaseKeyList(metadata) {
565
691
  const configurable = this.config?.configurable;
566
692
  const runId = metadata.run_id ??
567
693
  configurable?.run_id ??
@@ -579,17 +705,6 @@ class StandardGraph extends Graph {
579
705
  metadata.langgraph_step,
580
706
  checkpointNs,
581
707
  ];
582
- const agentContext = this.getAgentContext(metadata);
583
- if (agentContext.currentTokenType === ContentTypes.THINK ||
584
- agentContext.currentTokenType === 'think_and_text') {
585
- keyList.push('reasoning');
586
- }
587
- else if (agentContext.tokenTypeSwitch === 'content') {
588
- keyList.push(`post-reasoning-${agentContext.reasoningTransitionCount}`);
589
- }
590
- if (this.invokedToolIds != null && this.invokedToolIds.size > 0) {
591
- keyList.push(this.invokedToolIds.size + '');
592
- }
593
708
  return keyList;
594
709
  }
595
710
  checkKeyList(keyList) {
@@ -701,6 +816,7 @@ class StandardGraph extends Graph {
701
816
  sessions: this.sessions,
702
817
  toolDefinitions: toolDefMap,
703
818
  agentId: agentContext?.agentId,
819
+ executingAgentId: agentContext?.agentId,
704
820
  toolCallStepIds: this.toolCallStepIds,
705
821
  toolRegistry: agentContext?.toolRegistry,
706
822
  hookRegistry: this.hookRegistry,
@@ -738,6 +854,10 @@ class StandardGraph extends Graph {
738
854
  trace: traceToolNode,
739
855
  runLangfuse: this.langfuse,
740
856
  agentLangfuse: agentContext?.langfuse,
857
+ // `agentId` is intentionally left unset on this path (it is the
858
+ // subagent-scope marker); `executingAgentId` always identifies the owning
859
+ // agent so hooks can attribute the batch even at the top level.
860
+ executingAgentId: agentContext?.agentId,
741
861
  toolCallStepIds: this.toolCallStepIds,
742
862
  errorHandler: (data, metadata) => StandardGraph.handleToolCallErrorStatic(this, data, metadata),
743
863
  toolRegistry: agentContext?.toolRegistry,
@@ -1135,6 +1255,7 @@ class StandardGraph extends Graph {
1135
1255
  };
1136
1256
  }
1137
1257
  }
1258
+ const metadata = config.metadata;
1138
1259
  try {
1139
1260
  result = await withLangfuseToolOutputTracingConfig(this.langfuse, () => attemptInvoke({
1140
1261
  model: (this.overrideModel ?? model),
@@ -1144,6 +1265,10 @@ class StandardGraph extends Graph {
1144
1265
  }, invokeConfig), agentContext.langfuse);
1145
1266
  }
1146
1267
  catch (primaryError) {
1268
+ clearCurrentDeltaStepMarkers({
1269
+ graph: this,
1270
+ metadata,
1271
+ });
1147
1272
  result = await withLangfuseToolOutputTracingConfig(this.langfuse, () => tryFallbackProviders({
1148
1273
  fallbacks,
1149
1274
  tools: agentContext.tools,
@@ -1178,28 +1303,42 @@ class StandardGraph extends Graph {
1178
1303
  const toolCalls = responseMessage
1179
1304
  ?.tool_calls;
1180
1305
  const hasToolCalls = Array.isArray(toolCalls) && toolCalls.length > 0;
1181
- const metadata = config.metadata;
1182
1306
  const responseReasoningContent = getResponseReasoningContent({
1183
1307
  responseMessage: responseMessage,
1184
1308
  reasoningKey: agentContext.reasoningKey,
1185
1309
  });
1186
- const textMessageContent = getTextMessageDeltaContent(responseMessage?.content);
1310
+ const textMessageContent = getMessageDeltaContent(agentContext.provider, responseMessage?.content);
1311
+ const hasStreamedTextDeltaStep = hasCurrentTextDeltaStep({
1312
+ graph: this,
1313
+ metadata,
1314
+ });
1315
+ const hasStreamedReasoningDeltaStep = hasCurrentReasoningDeltaStep({
1316
+ graph: this,
1317
+ metadata,
1318
+ });
1319
+ const dispatchableFinalReasoningContent = getDispatchableFinalReasoningContent({
1320
+ agentContext,
1321
+ responseReasoningContent,
1322
+ hasStreamedTextDeltaStep,
1323
+ hasStreamedReasoningDeltaStep,
1324
+ });
1187
1325
  if (hasToolCalls) {
1188
- const dispatchedReasoning = responseReasoningContent != null &&
1326
+ const dispatchedReasoning = dispatchableFinalReasoningContent != null &&
1189
1327
  (await dispatchReasoningContent({
1190
1328
  graph: this,
1191
1329
  agentContext,
1192
- reasoningContent: responseReasoningContent,
1330
+ reasoningContent: dispatchableFinalReasoningContent,
1193
1331
  metadata,
1194
1332
  }));
1195
1333
  if (dispatchedReasoning) {
1196
1334
  markPostReasoningContent(agentContext);
1197
1335
  }
1198
- if (textMessageContent != null) {
1336
+ if (textMessageContent != null && !hasStreamedTextDeltaStep) {
1199
1337
  const stepKey = this.getStepKey(metadata);
1200
1338
  const dispatchedText = await dispatchTextMessageContent({
1201
1339
  graph: this,
1202
1340
  stepKey,
1341
+ provider: agentContext.provider,
1203
1342
  content: textMessageContent,
1204
1343
  metadata,
1205
1344
  });
@@ -1215,21 +1354,22 @@ class StandardGraph extends Graph {
1215
1354
  * this a no-op when the streaming path already handled the same step.
1216
1355
  */
1217
1356
  if (!hasToolCalls && responseMessage != null) {
1218
- const dispatchedReasoning = responseReasoningContent != null &&
1357
+ const dispatchedReasoning = dispatchableFinalReasoningContent != null &&
1219
1358
  (await dispatchReasoningContent({
1220
1359
  graph: this,
1221
1360
  agentContext,
1222
- reasoningContent: responseReasoningContent,
1361
+ reasoningContent: dispatchableFinalReasoningContent,
1223
1362
  metadata,
1224
1363
  }));
1225
1364
  if (dispatchedReasoning && textMessageContent != null) {
1226
1365
  markPostReasoningContent(agentContext);
1227
1366
  }
1228
- if (textMessageContent != null) {
1367
+ if (textMessageContent != null && !hasStreamedTextDeltaStep) {
1229
1368
  const stepKey = this.getStepKey(metadata);
1230
1369
  await dispatchTextMessageContent({
1231
1370
  graph: this,
1232
1371
  stepKey,
1372
+ provider: agentContext.provider,
1233
1373
  content: textMessageContent,
1234
1374
  metadata,
1235
1375
  });
@@ -1646,6 +1786,9 @@ class StandardGraph extends Graph {
1646
1786
  id,
1647
1787
  delta,
1648
1788
  };
1789
+ if (hasTextDeltaContent(delta.content)) {
1790
+ this.messageStepHasTextDeltas.add(id);
1791
+ }
1649
1792
  const handler = this.handlerRegistry?.getHandler(GraphEvents.ON_MESSAGE_DELTA);
1650
1793
  if (handler) {
1651
1794
  await handler.handle(GraphEvents.ON_MESSAGE_DELTA, messageDelta, metadata, this);
@@ -1669,6 +1812,9 @@ class StandardGraph extends Graph {
1669
1812
  id: stepId,
1670
1813
  delta,
1671
1814
  };
1815
+ if (hasReasoningDeltaContent(delta.content)) {
1816
+ this.reasoningStepHasDeltas.add(stepId);
1817
+ }
1672
1818
  const handler = this.handlerRegistry?.getHandler(GraphEvents.ON_REASONING_DELTA);
1673
1819
  if (handler) {
1674
1820
  await handler.handle(GraphEvents.ON_REASONING_DELTA, reasoningDelta, metadata, this);