@librechat/agents 3.2.21 → 3.2.32

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 (402) 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 +2 -2
  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 +38 -3
  20. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  21. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +6 -2
  22. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -1
  23. package/dist/cjs/llm/bedrock/index.cjs +2 -2
  24. package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
  25. package/dist/cjs/llm/bedrock/toolCache.cjs +8 -5
  26. package/dist/cjs/llm/bedrock/toolCache.cjs.map +1 -1
  27. package/dist/cjs/llm/fake.cjs +16 -14
  28. package/dist/cjs/llm/fake.cjs.map +1 -1
  29. package/dist/cjs/llm/google/index.cjs +22 -0
  30. package/dist/cjs/llm/google/index.cjs.map +1 -1
  31. package/dist/cjs/llm/google/utils/common.cjs +88 -27
  32. package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
  33. package/dist/cjs/llm/init.cjs +2 -2
  34. package/dist/cjs/llm/invoke.cjs +108 -11
  35. package/dist/cjs/llm/invoke.cjs.map +1 -1
  36. package/dist/cjs/llm/openai/index.cjs +1 -1
  37. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  38. package/dist/cjs/llm/openai/utils/index.cjs +1 -1
  39. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  40. package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
  41. package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
  42. package/dist/cjs/main.cjs +1 -0
  43. package/dist/cjs/main.cjs.map +1 -1
  44. package/dist/cjs/messages/cache.cjs +29 -8
  45. package/dist/cjs/messages/cache.cjs.map +1 -1
  46. package/dist/cjs/messages/content.cjs.map +1 -1
  47. package/dist/cjs/messages/contextPruning.cjs.map +1 -1
  48. package/dist/cjs/messages/format.cjs +129 -17
  49. package/dist/cjs/messages/format.cjs.map +1 -1
  50. package/dist/cjs/messages/prune.cjs.map +1 -1
  51. package/dist/cjs/messages/reducer.cjs +1 -1
  52. package/dist/cjs/messages/reducer.cjs.map +1 -1
  53. package/dist/cjs/messages/tools.cjs +1 -1
  54. package/dist/cjs/messages/tools.cjs.map +1 -1
  55. package/dist/cjs/openai/index.cjs.map +1 -1
  56. package/dist/cjs/responses/index.cjs.map +1 -1
  57. package/dist/cjs/run.cjs +41 -20
  58. package/dist/cjs/run.cjs.map +1 -1
  59. package/dist/cjs/session/AgentSession.cjs +4 -4
  60. package/dist/cjs/session/AgentSession.cjs.map +1 -1
  61. package/dist/cjs/session/JsonlSessionStore.cjs +2 -2
  62. package/dist/cjs/session/JsonlSessionStore.cjs.map +1 -1
  63. package/dist/cjs/session/handlers.cjs +2 -2
  64. package/dist/cjs/session/handlers.cjs.map +1 -1
  65. package/dist/cjs/stream.cjs +248 -25
  66. package/dist/cjs/stream.cjs.map +1 -1
  67. package/dist/cjs/summarization/node.cjs.map +1 -1
  68. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs +1 -1
  69. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs.map +1 -1
  70. package/dist/cjs/tools/Calculator.cjs +1 -1
  71. package/dist/cjs/tools/Calculator.cjs.map +1 -1
  72. package/dist/cjs/tools/CodeExecutor.cjs +1 -1
  73. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
  74. package/dist/cjs/tools/SubagentTool.cjs.map +1 -1
  75. package/dist/cjs/tools/ToolNode.cjs +37 -18
  76. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  77. package/dist/cjs/tools/ToolSearch.cjs +1 -1
  78. package/dist/cjs/tools/ToolSearch.cjs.map +1 -1
  79. package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs +7 -4
  80. package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs.map +1 -1
  81. package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs +4 -4
  82. package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs.map +1 -1
  83. package/dist/cjs/tools/handlers.cjs +2 -1
  84. package/dist/cjs/tools/handlers.cjs.map +1 -1
  85. package/dist/cjs/tools/local/CompileCheckTool.cjs.map +1 -1
  86. package/dist/cjs/tools/local/FileCheckpointer.cjs +2 -1
  87. package/dist/cjs/tools/local/FileCheckpointer.cjs.map +1 -1
  88. package/dist/cjs/tools/local/LocalCodingTools.cjs +45 -19
  89. package/dist/cjs/tools/local/LocalCodingTools.cjs.map +1 -1
  90. package/dist/cjs/tools/local/LocalExecutionEngine.cjs +3 -3
  91. package/dist/cjs/tools/local/LocalExecutionEngine.cjs.map +1 -1
  92. package/dist/cjs/tools/local/LocalExecutionTools.cjs +2 -2
  93. package/dist/cjs/tools/local/LocalExecutionTools.cjs.map +1 -1
  94. package/dist/cjs/tools/local/LocalProgrammaticToolCalling.cjs +4 -3
  95. package/dist/cjs/tools/local/LocalProgrammaticToolCalling.cjs.map +1 -1
  96. package/dist/cjs/tools/local/attachments.cjs +0 -5
  97. package/dist/cjs/tools/local/attachments.cjs.map +1 -1
  98. package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs +4 -4
  99. package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs.map +1 -1
  100. package/dist/cjs/tools/search/firecrawl.cjs +1 -1
  101. package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
  102. package/dist/cjs/tools/search/rerankers.cjs +7 -3
  103. package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
  104. package/dist/cjs/tools/search/tavily-search.cjs +1 -1
  105. package/dist/cjs/tools/search/tavily-search.cjs.map +1 -1
  106. package/dist/cjs/tools/search/utils.cjs +76 -8
  107. package/dist/cjs/tools/search/utils.cjs.map +1 -1
  108. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +1 -1
  109. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
  110. package/dist/cjs/utils/handlers.cjs +1 -1
  111. package/dist/cjs/utils/handlers.cjs.map +1 -1
  112. package/dist/cjs/utils/run.cjs +1 -1
  113. package/dist/cjs/utils/run.cjs.map +1 -1
  114. package/dist/esm/agents/AgentContext.mjs +3 -2
  115. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  116. package/dist/esm/events.mjs.map +1 -1
  117. package/dist/esm/graphs/Graph.mjs +200 -54
  118. package/dist/esm/graphs/Graph.mjs.map +1 -1
  119. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  120. package/dist/esm/hooks/createWorkspacePolicyHook.mjs +13 -7
  121. package/dist/esm/hooks/createWorkspacePolicyHook.mjs.map +1 -1
  122. package/dist/esm/hooks/executeHooks.mjs.map +1 -1
  123. package/dist/esm/hooks/types.mjs.map +1 -1
  124. package/dist/esm/instrumentation.mjs +2 -2
  125. package/dist/esm/instrumentation.mjs.map +1 -1
  126. package/dist/esm/langfuse.mjs +17 -2
  127. package/dist/esm/langfuse.mjs.map +1 -1
  128. package/dist/esm/langfuseToolOutputTracing.mjs +2 -2
  129. package/dist/esm/langfuseToolOutputTracing.mjs.map +1 -1
  130. package/dist/esm/llm/anthropic/index.mjs +1 -1
  131. package/dist/esm/llm/anthropic/index.mjs.map +1 -1
  132. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +38 -3
  133. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  134. package/dist/esm/llm/anthropic/utils/message_outputs.mjs +6 -2
  135. package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -1
  136. package/dist/esm/llm/bedrock/index.mjs +2 -2
  137. package/dist/esm/llm/bedrock/index.mjs.map +1 -1
  138. package/dist/esm/llm/bedrock/toolCache.mjs +8 -5
  139. package/dist/esm/llm/bedrock/toolCache.mjs.map +1 -1
  140. package/dist/esm/llm/fake.mjs +16 -14
  141. package/dist/esm/llm/fake.mjs.map +1 -1
  142. package/dist/esm/llm/google/index.mjs +23 -1
  143. package/dist/esm/llm/google/index.mjs.map +1 -1
  144. package/dist/esm/llm/google/utils/common.mjs +88 -27
  145. package/dist/esm/llm/google/utils/common.mjs.map +1 -1
  146. package/dist/esm/llm/init.mjs +2 -2
  147. package/dist/esm/llm/invoke.mjs +104 -7
  148. package/dist/esm/llm/invoke.mjs.map +1 -1
  149. package/dist/esm/llm/openai/index.mjs +1 -1
  150. package/dist/esm/llm/openai/index.mjs.map +1 -1
  151. package/dist/esm/llm/openai/utils/index.mjs +1 -1
  152. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  153. package/dist/esm/llm/openrouter/index.mjs.map +1 -1
  154. package/dist/esm/llm/vertexai/index.mjs.map +1 -1
  155. package/dist/esm/main.mjs +1 -1
  156. package/dist/esm/messages/cache.mjs +29 -8
  157. package/dist/esm/messages/cache.mjs.map +1 -1
  158. package/dist/esm/messages/content.mjs.map +1 -1
  159. package/dist/esm/messages/contextPruning.mjs.map +1 -1
  160. package/dist/esm/messages/format.mjs +129 -18
  161. package/dist/esm/messages/format.mjs.map +1 -1
  162. package/dist/esm/messages/prune.mjs.map +1 -1
  163. package/dist/esm/messages/reducer.mjs +1 -1
  164. package/dist/esm/messages/reducer.mjs.map +1 -1
  165. package/dist/esm/messages/tools.mjs +1 -1
  166. package/dist/esm/messages/tools.mjs.map +1 -1
  167. package/dist/esm/openai/index.mjs.map +1 -1
  168. package/dist/esm/responses/index.mjs.map +1 -1
  169. package/dist/esm/run.mjs +41 -20
  170. package/dist/esm/run.mjs.map +1 -1
  171. package/dist/esm/session/AgentSession.mjs +4 -4
  172. package/dist/esm/session/AgentSession.mjs.map +1 -1
  173. package/dist/esm/session/JsonlSessionStore.mjs +2 -2
  174. package/dist/esm/session/JsonlSessionStore.mjs.map +1 -1
  175. package/dist/esm/session/handlers.mjs +2 -2
  176. package/dist/esm/session/handlers.mjs.map +1 -1
  177. package/dist/esm/stream.mjs +248 -25
  178. package/dist/esm/stream.mjs.map +1 -1
  179. package/dist/esm/summarization/node.mjs.map +1 -1
  180. package/dist/esm/tools/BashProgrammaticToolCalling.mjs +1 -1
  181. package/dist/esm/tools/BashProgrammaticToolCalling.mjs.map +1 -1
  182. package/dist/esm/tools/Calculator.mjs +1 -1
  183. package/dist/esm/tools/Calculator.mjs.map +1 -1
  184. package/dist/esm/tools/CodeExecutor.mjs +1 -1
  185. package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
  186. package/dist/esm/tools/SubagentTool.mjs.map +1 -1
  187. package/dist/esm/tools/ToolNode.mjs +37 -18
  188. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  189. package/dist/esm/tools/ToolSearch.mjs +1 -1
  190. package/dist/esm/tools/ToolSearch.mjs.map +1 -1
  191. package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs +7 -4
  192. package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs.map +1 -1
  193. package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs +4 -4
  194. package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs.map +1 -1
  195. package/dist/esm/tools/handlers.mjs +2 -1
  196. package/dist/esm/tools/handlers.mjs.map +1 -1
  197. package/dist/esm/tools/local/CompileCheckTool.mjs.map +1 -1
  198. package/dist/esm/tools/local/FileCheckpointer.mjs +2 -1
  199. package/dist/esm/tools/local/FileCheckpointer.mjs.map +1 -1
  200. package/dist/esm/tools/local/LocalCodingTools.mjs +45 -19
  201. package/dist/esm/tools/local/LocalCodingTools.mjs.map +1 -1
  202. package/dist/esm/tools/local/LocalExecutionEngine.mjs +3 -3
  203. package/dist/esm/tools/local/LocalExecutionEngine.mjs.map +1 -1
  204. package/dist/esm/tools/local/LocalExecutionTools.mjs +2 -2
  205. package/dist/esm/tools/local/LocalExecutionTools.mjs.map +1 -1
  206. package/dist/esm/tools/local/LocalProgrammaticToolCalling.mjs +4 -3
  207. package/dist/esm/tools/local/LocalProgrammaticToolCalling.mjs.map +1 -1
  208. package/dist/esm/tools/local/attachments.mjs +0 -5
  209. package/dist/esm/tools/local/attachments.mjs.map +1 -1
  210. package/dist/esm/tools/local/resolveLocalExecutionTools.mjs +4 -4
  211. package/dist/esm/tools/local/resolveLocalExecutionTools.mjs.map +1 -1
  212. package/dist/esm/tools/search/firecrawl.mjs +1 -1
  213. package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
  214. package/dist/esm/tools/search/rerankers.mjs +8 -4
  215. package/dist/esm/tools/search/rerankers.mjs.map +1 -1
  216. package/dist/esm/tools/search/tavily-search.mjs +1 -1
  217. package/dist/esm/tools/search/tavily-search.mjs.map +1 -1
  218. package/dist/esm/tools/search/utils.mjs +76 -9
  219. package/dist/esm/tools/search/utils.mjs.map +1 -1
  220. package/dist/esm/tools/subagent/SubagentExecutor.mjs +1 -1
  221. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
  222. package/dist/esm/utils/handlers.mjs +1 -1
  223. package/dist/esm/utils/handlers.mjs.map +1 -1
  224. package/dist/esm/utils/run.mjs +1 -1
  225. package/dist/esm/utils/run.mjs.map +1 -1
  226. package/dist/types/agents/__tests__/promptCacheLiveHelpers.d.ts +1 -1
  227. package/dist/types/events.d.ts +1 -1
  228. package/dist/types/graphs/Graph.d.ts +7 -1
  229. package/dist/types/hooks/executeHooks.d.ts +1 -1
  230. package/dist/types/hooks/types.d.ts +5 -0
  231. package/dist/types/langfuse.d.ts +4 -0
  232. package/dist/types/llm/anthropic/utils/message_inputs.d.ts +1 -1
  233. package/dist/types/llm/anthropic/utils/message_outputs.d.ts +1 -1
  234. package/dist/types/llm/anthropic/utils/output_parsers.d.ts +2 -2
  235. package/dist/types/llm/bedrock/index.d.ts +2 -2
  236. package/dist/types/llm/fake.d.ts +3 -3
  237. package/dist/types/llm/google/index.d.ts +1 -0
  238. package/dist/types/llm/google/types.d.ts +1 -1
  239. package/dist/types/llm/google/utils/common.d.ts +2 -2
  240. package/dist/types/llm/google/utils/tools.d.ts +1 -1
  241. package/dist/types/llm/google/utils/zod_to_genai_parameters.d.ts +1 -1
  242. package/dist/types/llm/openai/index.d.ts +2 -2
  243. package/dist/types/llm/openai/utils/index.d.ts +1 -1
  244. package/dist/types/llm/openrouter/index.d.ts +4 -4
  245. package/dist/types/messages/contextPruning.d.ts +1 -1
  246. package/dist/types/messages/format.d.ts +14 -4
  247. package/dist/types/messages/prune.d.ts +1 -1
  248. package/dist/types/session/JsonlSessionStore.d.ts +1 -1
  249. package/dist/types/session/handlers.d.ts +1 -1
  250. package/dist/types/session/types.d.ts +1 -1
  251. package/dist/types/summarization/node.d.ts +1 -1
  252. package/dist/types/tools/SubagentTool.d.ts +2 -2
  253. package/dist/types/tools/ToolNode.d.ts +9 -2
  254. package/dist/types/tools/cloudflare/CloudflareSandboxExecutionEngine.d.ts +1 -1
  255. package/dist/types/tools/search/types.d.ts +1 -1
  256. package/dist/types/tools/search/utils.d.ts +11 -0
  257. package/dist/types/types/graph.d.ts +4 -4
  258. package/dist/types/types/llm.d.ts +4 -3
  259. package/dist/types/types/messages.d.ts +1 -1
  260. package/dist/types/types/run.d.ts +6 -6
  261. package/dist/types/types/stream.d.ts +2 -2
  262. package/dist/types/types/tools.d.ts +5 -1
  263. package/dist/types/utils/handlers.d.ts +2 -2
  264. package/dist/types/utils/run.d.ts +1 -1
  265. package/package.json +13 -10
  266. package/src/__tests__/stream.eagerEventExecution.test.ts +543 -6
  267. package/src/agents/AgentContext.ts +2 -2
  268. package/src/agents/__tests__/AgentContext.test.ts +3 -3
  269. package/src/agents/__tests__/promptCacheLiveHelpers.ts +1 -1
  270. package/src/events.ts +1 -1
  271. package/src/graphs/Graph.ts +329 -72
  272. package/src/graphs/MultiAgentGraph.ts +1 -1
  273. package/src/graphs/__tests__/Graph.reasoning.test.ts +919 -6
  274. package/src/graphs/__tests__/MultiAgentGraph.test.ts +1 -1
  275. package/src/graphs/__tests__/composition.smoke.test.ts +1 -1
  276. package/src/hooks/__tests__/HookRegistry.test.ts +1 -1
  277. package/src/hooks/__tests__/compactHooks.test.ts +8 -8
  278. package/src/hooks/__tests__/createWorkspacePolicyHook.test.ts +34 -22
  279. package/src/hooks/__tests__/executeHooks.test.ts +3 -3
  280. package/src/hooks/__tests__/integration.test.ts +3 -3
  281. package/src/hooks/__tests__/toolHooks.test.ts +10 -10
  282. package/src/hooks/createWorkspacePolicyHook.ts +17 -14
  283. package/src/hooks/executeHooks.ts +1 -1
  284. package/src/hooks/types.ts +5 -0
  285. package/src/instrumentation.ts +11 -11
  286. package/src/langfuse.ts +35 -1
  287. package/src/langfuseToolOutputTracing.ts +2 -2
  288. package/src/llm/anthropic/index.ts +1 -1
  289. package/src/llm/anthropic/llm.spec.ts +36 -0
  290. package/src/llm/anthropic/utils/message_inputs.ts +46 -4
  291. package/src/llm/anthropic/utils/message_outputs.ts +9 -7
  292. package/src/llm/anthropic/utils/output_parsers.ts +5 -5
  293. package/src/llm/anthropic/utils/streaming-tool-input.test.ts +186 -0
  294. package/src/llm/bedrock/index.ts +4 -4
  295. package/src/llm/bedrock/toolCache.test.ts +48 -9
  296. package/src/llm/bedrock/toolCache.ts +11 -6
  297. package/src/llm/fake.ts +30 -25
  298. package/src/llm/google/index.ts +43 -1
  299. package/src/llm/google/llm.spec.ts +173 -1
  300. package/src/llm/google/types.ts +1 -1
  301. package/src/llm/google/utils/common.ts +154 -45
  302. package/src/llm/google/utils/tools.ts +8 -8
  303. package/src/llm/google/utils/zod_to_genai_parameters.ts +4 -4
  304. package/src/llm/invoke.test.ts +3 -3
  305. package/src/llm/invoke.ts +170 -10
  306. package/src/llm/openai/index.ts +4 -4
  307. package/src/llm/openai/utils/index.ts +14 -14
  308. package/src/llm/openrouter/index.ts +4 -4
  309. package/src/llm/openrouter/reasoning.test.ts +2 -2
  310. package/src/llm/vertexai/fixThoughtSignatures.test.ts +1 -1
  311. package/src/llm/vertexai/index.ts +1 -1
  312. package/src/messages/cache.test.ts +144 -0
  313. package/src/messages/cache.ts +50 -13
  314. package/src/messages/content.ts +1 -1
  315. package/src/messages/contextPruning.ts +1 -1
  316. package/src/messages/format.ts +236 -43
  317. package/src/messages/formatAgentMessages.skills.test.ts +205 -26
  318. package/src/messages/formatAgentMessages.test.ts +841 -10
  319. package/src/messages/labelContentByAgent.test.ts +2 -2
  320. package/src/messages/prune.ts +1 -1
  321. package/src/messages/reducer.ts +1 -1
  322. package/src/messages/tools.ts +1 -1
  323. package/src/openai/__tests__/openai.test.ts +2 -2
  324. package/src/openai/index.ts +1 -1
  325. package/src/responses/__tests__/responses.test.ts +2 -2
  326. package/src/responses/index.ts +1 -1
  327. package/src/run.ts +68 -41
  328. package/src/session/AgentSession.ts +6 -6
  329. package/src/session/JsonlSessionStore.ts +3 -3
  330. package/src/session/__tests__/JsonlSessionStore.test.ts +5 -5
  331. package/src/session/__tests__/handlers.test.ts +2 -2
  332. package/src/session/handlers.ts +5 -5
  333. package/src/session/types.ts +1 -1
  334. package/src/specs/agent-handoffs.test.ts +1 -1
  335. package/src/specs/langfuse-callbacks.test.ts +2 -2
  336. package/src/specs/langfuse-metadata.test.ts +39 -0
  337. package/src/specs/langfuse-tool-output-tracing.test.ts +1 -1
  338. package/src/specs/multi-agent-summarization.test.ts +4 -4
  339. package/src/specs/subagent.test.ts +3 -3
  340. package/src/specs/summarization-unit.test.ts +1 -1
  341. package/src/specs/thinking-handoff.test.ts +1 -1
  342. package/src/splitStream.test.ts +48 -0
  343. package/src/stream.test.ts +53 -3
  344. package/src/stream.ts +450 -39
  345. package/src/summarization/__tests__/aggregator.test.ts +2 -2
  346. package/src/summarization/__tests__/node.test.ts +2 -2
  347. package/src/summarization/node.ts +1 -1
  348. package/src/tools/BashProgrammaticToolCalling.ts +5 -5
  349. package/src/tools/Calculator.ts +1 -1
  350. package/src/tools/CodeExecutor.ts +2 -4
  351. package/src/tools/SubagentTool.ts +2 -2
  352. package/src/tools/ToolNode.ts +37 -16
  353. package/src/tools/ToolSearch.ts +1 -1
  354. package/src/tools/__tests__/CloudflareSandboxExecution.test.ts +4 -4
  355. package/src/tools/__tests__/CodeApiAuthHeaders.test.ts +12 -12
  356. package/src/tools/__tests__/LocalExecutionTools.test.ts +125 -93
  357. package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +29 -5
  358. package/src/tools/__tests__/ReadFile.test.ts +1 -1
  359. package/src/tools/__tests__/SkillTool.test.ts +4 -4
  360. package/src/tools/__tests__/SubagentExecutor.test.ts +17 -13
  361. package/src/tools/__tests__/SubagentTool.test.ts +2 -2
  362. package/src/tools/__tests__/ToolNode.eagerEventExecution.test.ts +1 -1
  363. package/src/tools/__tests__/ToolNode.outputReferences.test.ts +2 -5
  364. package/src/tools/__tests__/ToolNode.session.test.ts +1 -1
  365. package/src/tools/__tests__/ToolSearch.test.ts +1 -1
  366. package/src/tools/__tests__/annotateMessagesForLLM.test.ts +1 -1
  367. package/src/tools/__tests__/directToolHITLResumeScope.test.ts +35 -32
  368. package/src/tools/__tests__/directToolHooks.test.ts +41 -0
  369. package/src/tools/__tests__/handlers.test.ts +2 -2
  370. package/src/tools/__tests__/hitl.test.ts +11 -11
  371. package/src/tools/__tests__/localToolNames.test.ts +8 -6
  372. package/src/tools/__tests__/skillCatalog.test.ts +1 -1
  373. package/src/tools/__tests__/subagentHooks.test.ts +20 -10
  374. package/src/tools/__tests__/workspaceSeam.test.ts +20 -7
  375. package/src/tools/cloudflare/CloudflareSandboxExecutionEngine.ts +9 -6
  376. package/src/tools/cloudflare/CloudflareSandboxTools.ts +19 -19
  377. package/src/tools/handlers.ts +5 -5
  378. package/src/tools/local/CompileCheckTool.ts +4 -7
  379. package/src/tools/local/FileCheckpointer.ts +6 -5
  380. package/src/tools/local/LocalCodingTools.ts +100 -45
  381. package/src/tools/local/LocalExecutionEngine.ts +5 -5
  382. package/src/tools/local/LocalExecutionTools.ts +9 -9
  383. package/src/tools/local/LocalProgrammaticToolCalling.ts +5 -4
  384. package/src/tools/local/attachments.ts +0 -6
  385. package/src/tools/local/resolveLocalExecutionTools.ts +15 -15
  386. package/src/tools/search/firecrawl.ts +1 -1
  387. package/src/tools/search/jina-reranker.test.ts +148 -37
  388. package/src/tools/search/rerankers.ts +14 -4
  389. package/src/tools/search/tavily-search.ts +2 -2
  390. package/src/tools/search/types.ts +1 -1
  391. package/src/tools/search/utils.ts +99 -9
  392. package/src/tools/subagent/SubagentExecutor.ts +12 -6
  393. package/src/types/graph.ts +12 -12
  394. package/src/types/llm.ts +7 -6
  395. package/src/types/messages.ts +1 -1
  396. package/src/types/run.ts +7 -7
  397. package/src/types/stream.ts +2 -2
  398. package/src/types/tools.ts +5 -1
  399. package/src/utils/handlers.ts +2 -2
  400. package/src/utils/llmConfig.ts +1 -1
  401. package/src/utils/logging.ts +20 -10
  402. package/src/utils/run.ts +2 -2
@@ -11,6 +11,7 @@ import type {
11
11
  MessageContent,
12
12
  MessageContentImageUrl,
13
13
  } from '@langchain/core/messages';
14
+ import type { RunnableConfig } from '@langchain/core/runnables';
14
15
  import type { ToolCall } from '@langchain/core/messages/tool';
15
16
  import type {
16
17
  BedrockReasoningContentText,
@@ -25,10 +26,10 @@ import type {
25
26
  TPayload,
26
27
  TMessage,
27
28
  } from '@/types';
28
- import type { RunnableConfig } from '@langchain/core/runnables';
29
- import { emitAgentLog } from '@/utils/events';
30
- import { Providers, ContentTypes, Constants } from '@/common';
29
+ import { normalizeAnthropicToolCallId } from '@/llm/anthropic/utils/message_inputs';
31
30
  import { toLangChainContent, toLangChainMessageFields } from './langchain';
31
+ import { Providers, ContentTypes, Constants } from '@/common';
32
+ import { emitAgentLog } from '@/utils/events';
32
33
 
33
34
  interface MediaMessageParams {
34
35
  message: {
@@ -106,6 +107,29 @@ interface FormatMessageParams {
106
107
  langChain?: boolean;
107
108
  }
108
109
 
110
+ export type LangChainMessageRole = 'system' | 'user' | 'assistant' | 'tool';
111
+
112
+ export type RoleBearingMessage<T extends BaseMessage = BaseMessage> = T & {
113
+ role: LangChainMessageRole;
114
+ };
115
+
116
+ export function withMessageRole<T extends BaseMessage>(
117
+ message: T,
118
+ role: LangChainMessageRole
119
+ ): RoleBearingMessage<T> {
120
+ const roleMessage = message as T & { role?: LangChainMessageRole };
121
+ if (roleMessage.role === role) {
122
+ return roleMessage as RoleBearingMessage<T>;
123
+ }
124
+ Object.defineProperty(roleMessage, 'role', {
125
+ value: role,
126
+ writable: true,
127
+ enumerable: false,
128
+ configurable: true,
129
+ });
130
+ return roleMessage as RoleBearingMessage<T>;
131
+ }
132
+
109
133
  interface FormattedMessage {
110
134
  role: string;
111
135
  content: string | MessageContentComplex[];
@@ -127,9 +151,9 @@ export const formatMessage = ({
127
151
  langChain = false,
128
152
  }: FormatMessageParams):
129
153
  | FormattedMessage
130
- | HumanMessage
131
- | AIMessage
132
- | SystemMessage => {
154
+ | RoleBearingMessage<HumanMessage>
155
+ | RoleBearingMessage<AIMessage>
156
+ | RoleBearingMessage<SystemMessage> => {
133
157
  // eslint-disable-next-line prefer-const
134
158
  let { role: _role, _name, sender, text, content: _content, lc_id } = message;
135
159
  if (lc_id && lc_id[2] && !langChain) {
@@ -217,7 +241,10 @@ export const formatMessage = ({
217
241
  return mediaMessage;
218
242
  }
219
243
 
220
- return new HumanMessage(toLangChainMessageFields(mediaMessage));
244
+ return withMessageRole(
245
+ new HumanMessage(toLangChainMessageFields(mediaMessage)),
246
+ 'user'
247
+ );
221
248
  }
222
249
 
223
250
  if (!langChain) {
@@ -225,11 +252,20 @@ export const formatMessage = ({
225
252
  }
226
253
 
227
254
  if (role === 'user') {
228
- return new HumanMessage(toLangChainMessageFields(formattedMessage));
255
+ return withMessageRole(
256
+ new HumanMessage(toLangChainMessageFields(formattedMessage)),
257
+ 'user'
258
+ );
229
259
  } else if (role === 'assistant') {
230
- return new AIMessage(toLangChainMessageFields(formattedMessage));
260
+ return withMessageRole(
261
+ new AIMessage(toLangChainMessageFields(formattedMessage)),
262
+ 'assistant'
263
+ );
231
264
  } else {
232
- return new SystemMessage(toLangChainMessageFields(formattedMessage));
265
+ return withMessageRole(
266
+ new SystemMessage(toLangChainMessageFields(formattedMessage)),
267
+ 'system'
268
+ );
233
269
  }
234
270
  };
235
271
 
@@ -243,14 +279,21 @@ export const formatMessage = ({
243
279
  export const formatLangChainMessages = (
244
280
  messages: Array<MessageInput>,
245
281
  formatOptions: Omit<FormatMessageParams, 'message' | 'langChain'>
246
- ): Array<HumanMessage | AIMessage | SystemMessage> => {
282
+ ): Array<
283
+ | RoleBearingMessage<HumanMessage>
284
+ | RoleBearingMessage<AIMessage>
285
+ | RoleBearingMessage<SystemMessage>
286
+ > => {
247
287
  return messages.map((msg) => {
248
288
  const formatted = formatMessage({
249
289
  ...formatOptions,
250
290
  message: msg,
251
291
  langChain: true,
252
292
  });
253
- return formatted as HumanMessage | AIMessage | SystemMessage;
293
+ return formatted as
294
+ | RoleBearingMessage<HumanMessage>
295
+ | RoleBearingMessage<AIMessage>
296
+ | RoleBearingMessage<SystemMessage>;
254
297
  });
255
298
  };
256
299
 
@@ -284,12 +327,17 @@ export const formatFromLangChain = (
284
327
  };
285
328
 
286
329
  interface FormatAssistantMessageOptions {
330
+ preserveUnpairedServerToolUses?: boolean;
287
331
  preserveReasoningContent?: boolean;
288
332
  provider?: Providers;
289
333
  }
290
334
 
291
335
  interface FormatAgentMessagesOptions {
292
336
  provider?: Providers;
337
+ /** Skill names already primed fresh this turn (manual/always-apply). Their
338
+ * historical `skill` tool_calls are not reconstructed into a HumanMessage,
339
+ * so the same SKILL.md body is not injected twice in one request. */
340
+ skipSkillBodyNames?: Set<string>;
293
341
  }
294
342
 
295
343
  function extractReasoningContent(
@@ -371,6 +419,40 @@ function getToolUseId(part: MessageContentComplex): string | undefined {
371
419
  return part.tool_use_id;
372
420
  }
373
421
 
422
+ function isValidServerToolResult(part: MessageContentComplex): boolean {
423
+ const toolUseId = getToolUseId(part);
424
+ if (
425
+ toolUseId?.startsWith(Constants.ANTHROPIC_SERVER_TOOL_PREFIX) !== true ||
426
+ !('content' in part)
427
+ ) {
428
+ return false;
429
+ }
430
+ const { content } = part as { content?: unknown };
431
+ return (
432
+ Array.isArray(content) ||
433
+ (content != null &&
434
+ typeof content === 'object' &&
435
+ 'type' in content &&
436
+ (content as { type?: unknown }).type === 'web_search_tool_result_error')
437
+ );
438
+ }
439
+
440
+ function getToolCallId(part: MessageContentComplex): string | undefined {
441
+ if (part.type !== ContentTypes.TOOL_CALL) {
442
+ return undefined;
443
+ }
444
+ const id = part.tool_call?.id;
445
+ return typeof id === 'string' && id !== '' ? id : undefined;
446
+ }
447
+
448
+ function hasToolCallOutput(part: MessageContentComplex): boolean {
449
+ if (part.type !== ContentTypes.TOOL_CALL) {
450
+ return false;
451
+ }
452
+ const output = part.tool_call?.output;
453
+ return output != null && output !== '';
454
+ }
455
+
374
456
  /**
375
457
  * Helper function to format an assistant message
376
458
  * @param message The message to format
@@ -380,16 +462,20 @@ function getToolUseId(part: MessageContentComplex): string | undefined {
380
462
  function formatAssistantMessage(
381
463
  message: Partial<TMessage>,
382
464
  options?: FormatAssistantMessageOptions
383
- ): Array<AIMessage | ToolMessage> {
384
- const formattedMessages: Array<AIMessage | ToolMessage> = [];
465
+ ): Array<RoleBearingMessage<AIMessage> | RoleBearingMessage<ToolMessage>> {
466
+ const formattedMessages: Array<
467
+ RoleBearingMessage<AIMessage> | RoleBearingMessage<ToolMessage>
468
+ > = [];
385
469
  let currentContent: MessageContentComplex[] = [];
386
- let lastAIMessage: AIMessage | null = null;
470
+ let lastAIMessage: RoleBearingMessage<AIMessage> | null = null;
387
471
  let hasReasoning = false;
388
472
  let pendingReasoningContent = '';
389
473
  const emittedServerToolUseIds = new Set<string>();
390
474
  const pendingServerToolUses = new Map<string, MessageContentComplex>();
391
475
  const shouldPreserveReasoningContent =
392
476
  options?.preserveReasoningContent === true;
477
+ const serverToolResultIds = new Set<string>();
478
+ const preferredToolCallParts = new Map<string, MessageContentComplex>();
393
479
 
394
480
  const takePendingReasoningContent = (): string | undefined => {
395
481
  if (!shouldPreserveReasoningContent || !pendingReasoningContent) {
@@ -400,14 +486,19 @@ function formatAssistantMessage(
400
486
  return reasoningContent;
401
487
  };
402
488
 
403
- const createAIMessage = (content: MessageContent): AIMessage => {
489
+ const createAIMessage = (
490
+ content: MessageContent
491
+ ): RoleBearingMessage<AIMessage> => {
404
492
  const reasoningContent = takePendingReasoningContent();
405
- return new AIMessage({
406
- content,
407
- ...(reasoningContent != null && {
408
- additional_kwargs: { reasoning_content: reasoningContent },
493
+ return withMessageRole(
494
+ new AIMessage({
495
+ content,
496
+ ...(reasoningContent != null && {
497
+ additional_kwargs: { reasoning_content: reasoningContent },
498
+ }),
409
499
  }),
410
- });
500
+ 'assistant'
501
+ );
411
502
  };
412
503
 
413
504
  const attachPendingReasoningContent = (aiMessage: AIMessage): void => {
@@ -437,15 +528,52 @@ function formatAssistantMessage(
437
528
  MessageContentComplex | undefined | null
438
529
  >;
439
530
 
531
+ for (const part of contentParts) {
532
+ if (part == null) {
533
+ continue;
534
+ }
535
+ if (isValidServerToolResult(part)) {
536
+ serverToolResultIds.add(getToolUseId(part) ?? '');
537
+ }
538
+ if (options?.provider === Providers.ANTHROPIC) {
539
+ const toolCallId = getToolCallId(part);
540
+ if (toolCallId == null) {
541
+ continue;
542
+ }
543
+ const preferredPart = preferredToolCallParts.get(toolCallId);
544
+ if (
545
+ preferredPart == null ||
546
+ (!hasToolCallOutput(preferredPart) && hasToolCallOutput(part))
547
+ ) {
548
+ preferredToolCallParts.set(toolCallId, part);
549
+ }
550
+ }
551
+ }
552
+
440
553
  for (const part of contentParts) {
441
554
  if (part == null) {
442
555
  continue;
443
556
  }
444
557
  const toolUseId = getToolUseId(part);
445
558
  if (toolUseId != null) {
559
+ const isServerToolResult = isValidServerToolResult(part);
560
+ if (
561
+ toolUseId.startsWith(Constants.ANTHROPIC_SERVER_TOOL_PREFIX) &&
562
+ !isServerToolResult
563
+ ) {
564
+ continue;
565
+ }
446
566
  flushPendingServerToolUse(toolUseId);
567
+ if (isServerToolResult) {
568
+ currentContent.push(part);
569
+ continue;
570
+ }
447
571
  } else if (hasMeaningfulAssistantContent(part)) {
448
- pendingServerToolUses.clear();
572
+ for (const id of pendingServerToolUses.keys()) {
573
+ if (!serverToolResultIds.has(id)) {
574
+ pendingServerToolUses.delete(id);
575
+ }
576
+ }
449
577
  }
450
578
  if (part.type === ContentTypes.TEXT && part.tool_call_ids) {
451
579
  /*
@@ -453,6 +581,15 @@ function formatAssistantMessage(
453
581
  For Anthropic models, the "tool_calls" field on a message is only respected if content is a string.
454
582
  */
455
583
  if (currentContent.length > 0) {
584
+ if (
585
+ currentContent.some((content) => content.type !== ContentTypes.TEXT)
586
+ ) {
587
+ currentContent.push(part);
588
+ lastAIMessage = createAIMessage(toLangChainContent(currentContent));
589
+ formattedMessages.push(lastAIMessage);
590
+ currentContent = [];
591
+ continue;
592
+ }
456
593
  let content = currentContent.reduce((acc, curr) => {
457
594
  if (curr.type === ContentTypes.TEXT) {
458
595
  return `${acc}${getTextContent(curr)}\n`;
@@ -473,6 +610,14 @@ function formatAssistantMessage(
473
610
  if (part.tool_call == null) {
474
611
  continue;
475
612
  }
613
+ const toolCallId = getToolCallId(part);
614
+ if (
615
+ options?.provider === Providers.ANTHROPIC &&
616
+ toolCallId != null &&
617
+ preferredToolCallParts.get(toolCallId) !== part
618
+ ) {
619
+ continue;
620
+ }
476
621
 
477
622
  // Note: `tool_calls` list is defined when constructed by `AIMessage` class, and outputs should be excluded from it
478
623
  const {
@@ -494,6 +639,12 @@ function formatAssistantMessage(
494
639
  typeof _tool_call.id === 'string' &&
495
640
  _tool_call.id.startsWith(Constants.ANTHROPIC_SERVER_TOOL_PREFIX)
496
641
  ) {
642
+ if (
643
+ !serverToolResultIds.has(_tool_call.id) &&
644
+ options.preserveUnpairedServerToolUses !== true
645
+ ) {
646
+ continue;
647
+ }
497
648
  if (
498
649
  emittedServerToolUseIds.has(_tool_call.id) ||
499
650
  pendingServerToolUses.has(_tool_call.id)
@@ -531,17 +682,34 @@ function formatAssistantMessage(
531
682
  }
532
683
 
533
684
  tool_call.args = args;
534
- if (!lastAIMessage.tool_calls) {
535
- lastAIMessage.tool_calls = [];
685
+ if (
686
+ options?.provider === Providers.ANTHROPIC &&
687
+ Array.isArray(lastAIMessage.content)
688
+ ) {
689
+ const content = lastAIMessage.content as MessageContentComplex[];
690
+ content.push({
691
+ type: 'tool_use',
692
+ id: normalizeAnthropicToolCallId(tool_call.id ?? ''),
693
+ name: tool_call.name,
694
+ input: args,
695
+ } as MessageContentComplex);
696
+ lastAIMessage.content = content as MessageContent;
697
+ } else {
698
+ if (!lastAIMessage.tool_calls) {
699
+ lastAIMessage.tool_calls = [];
700
+ }
701
+ lastAIMessage.tool_calls.push(tool_call as ToolCall);
536
702
  }
537
- lastAIMessage.tool_calls.push(tool_call as ToolCall);
538
703
 
539
704
  formattedMessages.push(
540
- new ToolMessage({
541
- tool_call_id: tool_call.id ?? '',
542
- name: tool_call.name,
543
- content: output != null ? output : '',
544
- })
705
+ withMessageRole(
706
+ new ToolMessage({
707
+ tool_call_id: tool_call.id ?? '',
708
+ name: tool_call.name,
709
+ content: output != null ? output : '',
710
+ }),
711
+ 'tool'
712
+ )
545
713
  );
546
714
  } else if (
547
715
  part.type === ContentTypes.THINK ||
@@ -995,6 +1163,7 @@ function extractSkillName(args: unknown): string | undefined {
995
1163
  * @param indexTokenCountMap - Optional map of message indices to token counts.
996
1164
  * @param tools - Optional set of tool names that are allowed in the request.
997
1165
  * @param skills - Optional map of skill name to body for reconstructing skill HumanMessages.
1166
+ * @param options - Optional formatting options (provider, skipSkillBodyNames).
998
1167
  * @returns - Object containing formatted messages and updated indexTokenCountMap if provided.
999
1168
  */
1000
1169
  export const formatAgentMessages = (
@@ -1007,7 +1176,12 @@ export const formatAgentMessages = (
1007
1176
  skills?: Map<string, string>,
1008
1177
  options?: FormatAgentMessagesOptions
1009
1178
  ): {
1010
- messages: Array<HumanMessage | AIMessage | SystemMessage | ToolMessage>;
1179
+ messages: Array<
1180
+ | RoleBearingMessage<HumanMessage>
1181
+ | RoleBearingMessage<AIMessage>
1182
+ | RoleBearingMessage<SystemMessage>
1183
+ | RoleBearingMessage<ToolMessage>
1184
+ >;
1011
1185
  indexTokenCountMap?: Record<number, number>;
1012
1186
  /** Cross-run summary extracted from the payload. Should be forwarded to the
1013
1187
  * agent run so it can be included in the system message via AgentContext. */
@@ -1022,7 +1196,10 @@ export const formatAgentMessages = (
1022
1196
  };
1023
1197
  } => {
1024
1198
  const messages: Array<
1025
- HumanMessage | AIMessage | SystemMessage | ToolMessage
1199
+ | RoleBearingMessage<HumanMessage>
1200
+ | RoleBearingMessage<AIMessage>
1201
+ | RoleBearingMessage<SystemMessage>
1202
+ | RoleBearingMessage<ToolMessage>
1026
1203
  > = [];
1027
1204
  // If indexTokenCountMap is provided, create a new map to track the updated indices
1028
1205
  const updatedIndexTokenCountMap: Record<number, number> = {};
@@ -1078,7 +1255,10 @@ export const formatAgentMessages = (
1078
1255
  const formattedMessage = formatMessage({
1079
1256
  message: message as MessageInput,
1080
1257
  langChain: true,
1081
- }) as HumanMessage | AIMessage | SystemMessage;
1258
+ }) as
1259
+ | RoleBearingMessage<HumanMessage>
1260
+ | RoleBearingMessage<AIMessage>
1261
+ | RoleBearingMessage<SystemMessage>;
1082
1262
  if (sourceMessageId != null && sourceMessageId !== '') {
1083
1263
  formattedMessage.id = sourceMessageId;
1084
1264
  }
@@ -1254,6 +1434,7 @@ export const formatAgentMessages = (
1254
1434
  }
1255
1435
 
1256
1436
  const formattedMessages = formatAssistantMessage(processedMessage, {
1437
+ preserveUnpairedServerToolUses: i === payload.length - 1,
1257
1438
  preserveReasoningContent: options?.provider === Providers.DEEPSEEK,
1258
1439
  provider: options?.provider,
1259
1440
  });
@@ -1269,19 +1450,26 @@ export const formatAgentMessages = (
1269
1450
  const endMessageIndex = messages.length;
1270
1451
 
1271
1452
  if (pendingSkillNames?.size != null && pendingSkillNames.size > 0) {
1453
+ const skipSkillBodyNames = options?.skipSkillBodyNames;
1272
1454
  for (const skillName of pendingSkillNames) {
1455
+ if (skipSkillBodyNames != null && skipSkillBodyNames.has(skillName)) {
1456
+ continue;
1457
+ }
1273
1458
  const body = skills?.get(skillName) ?? '';
1274
1459
  if (body) {
1275
1460
  messages.push(
1276
- new HumanMessage({
1277
- content: body,
1278
- additional_kwargs: {
1279
- role: 'user',
1280
- isMeta: true,
1281
- source: 'skill',
1282
- skillName,
1283
- },
1284
- })
1461
+ withMessageRole(
1462
+ new HumanMessage({
1463
+ content: body,
1464
+ additional_kwargs: {
1465
+ role: 'user',
1466
+ isMeta: true,
1467
+ source: 'skill',
1468
+ skillName,
1469
+ },
1470
+ }),
1471
+ 'user'
1472
+ )
1285
1473
  );
1286
1474
  }
1287
1475
  }
@@ -1721,7 +1909,12 @@ export function ensureThinkingBlockInMessages(
1721
1909
  'ensureThinkingBlockInMessages: injecting [Previous agent context] HumanMessage' +
1722
1910
  ` (${parts.length} msgs at index ${i}, no thinking block in chain)`
1723
1911
  );
1724
- result.push(new HumanMessage({ content: toLangChainContent(parts) }));
1912
+ result.push(
1913
+ withMessageRole(
1914
+ new HumanMessage({ content: toLangChainContent(parts) }),
1915
+ 'user'
1916
+ )
1917
+ );
1725
1918
  i = j;
1726
1919
  } else {
1727
1920
  // Keep the message as is