@librechat/agents 3.2.32 → 3.2.33

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 (573) 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 +195 -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 +105 -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 +398 -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 +991 -1276
  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 +427 -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 +856 -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 +2109 -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 +19 -36
  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 +195 -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 +105 -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 +397 -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 +991 -1271
  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 +427 -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 +854 -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 +2107 -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 +19 -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/tools/search/tool.d.ts +17 -0
  545. package/dist/types/tools/search/types.d.ts +4 -0
  546. package/package.json +4 -10
  547. package/src/tools/search/highlights.ts +9 -1
  548. package/src/tools/search/search.ts +41 -3
  549. package/src/tools/search/source-processing.test.ts +373 -0
  550. package/src/tools/search/tool.ts +22 -2
  551. package/src/tools/search/types.ts +4 -0
  552. package/dist/cjs/langchain/google-common.cjs.map +0 -1
  553. package/dist/cjs/langchain/index.cjs.map +0 -1
  554. package/dist/cjs/langchain/language_models/chat_models.cjs.map +0 -1
  555. package/dist/cjs/langchain/messages/tool.cjs.map +0 -1
  556. package/dist/cjs/langchain/messages.cjs.map +0 -1
  557. package/dist/cjs/langchain/openai.cjs.map +0 -1
  558. package/dist/cjs/langchain/prompts.cjs.map +0 -1
  559. package/dist/cjs/langchain/runnables.cjs.map +0 -1
  560. package/dist/cjs/langchain/tools.cjs.map +0 -1
  561. package/dist/cjs/langchain/utils/env.cjs.map +0 -1
  562. package/dist/cjs/main.cjs.map +0 -1
  563. package/dist/esm/langchain/google-common.mjs.map +0 -1
  564. package/dist/esm/langchain/index.mjs.map +0 -1
  565. package/dist/esm/langchain/language_models/chat_models.mjs.map +0 -1
  566. package/dist/esm/langchain/messages/tool.mjs.map +0 -1
  567. package/dist/esm/langchain/messages.mjs.map +0 -1
  568. package/dist/esm/langchain/openai.mjs.map +0 -1
  569. package/dist/esm/langchain/prompts.mjs.map +0 -1
  570. package/dist/esm/langchain/runnables.mjs.map +0 -1
  571. package/dist/esm/langchain/tools.mjs.map +0 -1
  572. package/dist/esm/langchain/utils/env.mjs.map +0 -1
  573. package/dist/esm/main.mjs.map +0 -1
@@ -1,759 +1,469 @@
1
- 'use strict';
2
-
3
- var node_crypto = require('node:crypto');
4
- var messages = require('@langchain/core/messages');
5
- var types = require('../types.cjs');
6
- var _enum = require('../../../common/enum.cjs');
7
-
8
- /* eslint-disable @typescript-eslint/explicit-function-return-type */
9
- /* eslint-disable no-console */
1
+ require("../../../common/enum.cjs");
2
+ require("../../../common/index.cjs");
3
+ const require_types = require("../types.cjs");
4
+ let _langchain_core_messages = require("@langchain/core/messages");
5
+ let node_crypto = require("node:crypto");
6
+ //#region src/llm/anthropic/utils/message_inputs.ts
10
7
  /**
11
- * This util file contains functions for converting LangChain messages to Anthropic messages.
12
- */
13
- const ANTHROPIC_EMPTY_TEXT_PLACEHOLDER = '_';
8
+ * This util file contains functions for converting LangChain messages to Anthropic messages.
9
+ */
10
+ const ANTHROPIC_EMPTY_TEXT_PLACEHOLDER = "_";
14
11
  const CLAUDE_4_RELEASE_DATE_MODEL_PATTERN = /claude-(?:opus|sonnet|haiku)-4-\d{8}(?:[-.@]|$)/i;
15
12
  const CLAUDE_4_MINOR_MODEL_PATTERN = /claude-(?:opus|sonnet|haiku)-4[-.](\d+)(?:[-.@]|$)/i;
16
13
  function _formatImage(imageUrl) {
17
- const parsed = messages.parseBase64DataUrl({ dataUrl: imageUrl });
18
- if (parsed) {
19
- return {
20
- type: 'base64',
21
- media_type: parsed.mime_type,
22
- data: parsed.data,
23
- };
24
- }
25
- let parsedUrl;
26
- try {
27
- parsedUrl = new URL(imageUrl);
28
- }
29
- catch {
30
- throw new Error([
31
- `Malformed image URL: ${JSON.stringify(imageUrl)}. Content blocks of type 'image_url' must be a valid http, https, or base64-encoded data URL.`,
32
- 'Example: data:image/png;base64,/9j/4AAQSk...',
33
- 'Example: https://example.com/image.jpg',
34
- ].join('\n\n'));
35
- }
36
- if (parsedUrl.protocol === 'http:' || parsedUrl.protocol === 'https:') {
37
- return {
38
- type: 'url',
39
- url: imageUrl,
40
- };
41
- }
42
- throw new Error([
43
- `Invalid image URL protocol: ${JSON.stringify(parsedUrl.protocol)}. Anthropic only supports images as http, https, or base64-encoded data URLs on 'image_url' content blocks.`,
44
- 'Example: data:image/png;base64,/9j/4AAQSk...',
45
- 'Example: https://example.com/image.jpg',
46
- ].join('\n\n'));
14
+ const parsed = (0, _langchain_core_messages.parseBase64DataUrl)({ dataUrl: imageUrl });
15
+ if (parsed) return {
16
+ type: "base64",
17
+ media_type: parsed.mime_type,
18
+ data: parsed.data
19
+ };
20
+ let parsedUrl;
21
+ try {
22
+ parsedUrl = new URL(imageUrl);
23
+ } catch {
24
+ throw new Error([
25
+ `Malformed image URL: ${JSON.stringify(imageUrl)}. Content blocks of type 'image_url' must be a valid http, https, or base64-encoded data URL.`,
26
+ "Example: data:image/png;base64,/9j/4AAQSk...",
27
+ "Example: https://example.com/image.jpg"
28
+ ].join("\n\n"));
29
+ }
30
+ if (parsedUrl.protocol === "http:" || parsedUrl.protocol === "https:") return {
31
+ type: "url",
32
+ url: imageUrl
33
+ };
34
+ throw new Error([
35
+ `Invalid image URL protocol: ${JSON.stringify(parsedUrl.protocol)}. Anthropic only supports images as http, https, or base64-encoded data URLs on 'image_url' content blocks.`,
36
+ "Example: data:image/png;base64,/9j/4AAQSk...",
37
+ "Example: https://example.com/image.jpg"
38
+ ].join("\n\n"));
47
39
  }
48
40
  const ANTHROPIC_TOOL_USE_ID_PATTERN = /^[a-zA-Z0-9_-]+$/;
49
41
  const ANTHROPIC_TOOL_USE_ID_MAX_LENGTH = 64;
50
42
  const ANTHROPIC_TOOL_USE_ID_HASH_LENGTH = 10;
51
43
  function normalizeAnthropicToolCallId(id) {
52
- if (id == null) {
53
- return id;
54
- }
55
- if (id.length <= ANTHROPIC_TOOL_USE_ID_MAX_LENGTH &&
56
- ANTHROPIC_TOOL_USE_ID_PATTERN.test(id)) {
57
- return id;
58
- }
59
- const sanitized = id.replace(/[^a-zA-Z0-9_-]/g, '_');
60
- const hash = node_crypto.createHash('sha256')
61
- .update(id)
62
- .digest('hex')
63
- .slice(0, ANTHROPIC_TOOL_USE_ID_HASH_LENGTH);
64
- const prefixMaxLength = ANTHROPIC_TOOL_USE_ID_MAX_LENGTH - ANTHROPIC_TOOL_USE_ID_HASH_LENGTH - 1;
65
- return `${sanitized.slice(0, prefixMaxLength)}_${hash}`;
44
+ if (id == null) return id;
45
+ if (id.length <= ANTHROPIC_TOOL_USE_ID_MAX_LENGTH && ANTHROPIC_TOOL_USE_ID_PATTERN.test(id)) return id;
46
+ const sanitized = id.replace(/[^a-zA-Z0-9_-]/g, "_");
47
+ const hash = (0, node_crypto.createHash)("sha256").update(id).digest("hex").slice(0, ANTHROPIC_TOOL_USE_ID_HASH_LENGTH);
48
+ const prefixMaxLength = ANTHROPIC_TOOL_USE_ID_MAX_LENGTH - ANTHROPIC_TOOL_USE_ID_HASH_LENGTH - 1;
49
+ return `${sanitized.slice(0, prefixMaxLength)}_${hash}`;
66
50
  }
67
- function _ensureMessageContents(messages$1) {
68
- // Merge runs of human/tool messages into single human messages with content blocks.
69
- const updatedMsgs = [];
70
- for (const message of messages$1) {
71
- if (message._getType() === 'tool') {
72
- if (typeof message.content === 'string') {
73
- const previousMessage = updatedMsgs[updatedMsgs.length - 1];
74
- if (previousMessage._getType() === 'human' &&
75
- Array.isArray(previousMessage.content) &&
76
- 'type' in previousMessage.content[0] &&
77
- previousMessage.content[0].type === 'tool_result') {
78
- // If the previous message was a tool result, we merge this tool message into it.
79
- previousMessage.content.push({
80
- type: 'tool_result',
81
- content: message.content,
82
- tool_use_id: normalizeAnthropicToolCallId(message.tool_call_id),
83
- });
84
- }
85
- else {
86
- // If not, we create a new human message with the tool result.
87
- updatedMsgs.push(new messages.HumanMessage({
88
- content: [
89
- {
90
- type: 'tool_result',
91
- content: message.content,
92
- tool_use_id: normalizeAnthropicToolCallId(message.tool_call_id),
93
- },
94
- ],
95
- }));
96
- }
97
- }
98
- else {
99
- const toolMessageContent = message.content;
100
- updatedMsgs.push(new messages.HumanMessage({
101
- content: [
102
- {
103
- type: 'tool_result',
104
- ...(toolMessageContent != null
105
- ? { content: _formatContent(message) }
106
- : {}),
107
- tool_use_id: normalizeAnthropicToolCallId(message.tool_call_id),
108
- },
109
- ],
110
- }));
111
- }
112
- }
113
- else {
114
- updatedMsgs.push(message);
115
- }
116
- }
117
- return updatedMsgs;
51
+ function _ensureMessageContents(messages) {
52
+ const updatedMsgs = [];
53
+ for (const message of messages) if (message._getType() === "tool") if (typeof message.content === "string") {
54
+ const previousMessage = updatedMsgs[updatedMsgs.length - 1];
55
+ if (previousMessage._getType() === "human" && Array.isArray(previousMessage.content) && "type" in previousMessage.content[0] && previousMessage.content[0].type === "tool_result") previousMessage.content.push({
56
+ type: "tool_result",
57
+ content: message.content,
58
+ tool_use_id: normalizeAnthropicToolCallId(message.tool_call_id)
59
+ });
60
+ else updatedMsgs.push(new _langchain_core_messages.HumanMessage({ content: [{
61
+ type: "tool_result",
62
+ content: message.content,
63
+ tool_use_id: normalizeAnthropicToolCallId(message.tool_call_id)
64
+ }] }));
65
+ } else {
66
+ const toolMessageContent = message.content;
67
+ updatedMsgs.push(new _langchain_core_messages.HumanMessage({ content: [{
68
+ type: "tool_result",
69
+ ...toolMessageContent != null ? { content: _formatContent(message) } : {},
70
+ tool_use_id: normalizeAnthropicToolCallId(message.tool_call_id)
71
+ }] }));
72
+ }
73
+ else updatedMsgs.push(message);
74
+ return updatedMsgs;
118
75
  }
119
76
  function _convertLangChainToolCallToAnthropic(toolCall) {
120
- if (toolCall.id === undefined) {
121
- throw new Error('Anthropic requires all tool calls to have an "id".');
122
- }
123
- const isServerTool = toolCall.id.startsWith(_enum.Constants.ANTHROPIC_SERVER_TOOL_PREFIX);
124
- return {
125
- type: isServerTool ? 'server_tool_use' : 'tool_use',
126
- id: isServerTool ? toolCall.id : normalizeAnthropicToolCallId(toolCall.id),
127
- name: toolCall.name,
128
- input: toolCall.args,
129
- };
77
+ if (toolCall.id === void 0) throw new Error("Anthropic requires all tool calls to have an \"id\".");
78
+ const isServerTool = toolCall.id.startsWith("srvtoolu_");
79
+ return {
80
+ type: isServerTool ? "server_tool_use" : "tool_use",
81
+ id: isServerTool ? toolCall.id : normalizeAnthropicToolCallId(toolCall.id),
82
+ name: toolCall.name,
83
+ input: toolCall.args
84
+ };
130
85
  }
131
86
  const standardContentBlockConverter = {
132
- providerName: 'anthropic',
133
- fromStandardTextBlock(block) {
134
- return {
135
- type: 'text',
136
- text: block.text,
137
- ...('citations' in (block.metadata ?? {})
138
- ? { citations: block.metadata.citations }
139
- : {}),
140
- ...('cache_control' in (block.metadata ?? {})
141
- ? { cache_control: block.metadata.cache_control }
142
- : {}),
143
- };
144
- },
145
- fromStandardImageBlock(block) {
146
- if (block.source_type === 'url') {
147
- const data = messages.parseBase64DataUrl({
148
- dataUrl: block.url,
149
- asTypedArray: false,
150
- });
151
- if (data) {
152
- return {
153
- type: 'image',
154
- source: {
155
- type: 'base64',
156
- data: data.data,
157
- media_type: data.mime_type,
158
- },
159
- ...('cache_control' in (block.metadata ?? {})
160
- ? { cache_control: block.metadata.cache_control }
161
- : {}),
162
- };
163
- }
164
- else {
165
- return {
166
- type: 'image',
167
- source: {
168
- type: 'url',
169
- url: block.url,
170
- media_type: block.mime_type ?? '',
171
- },
172
- ...('cache_control' in (block.metadata ?? {})
173
- ? { cache_control: block.metadata.cache_control }
174
- : {}),
175
- };
176
- }
177
- }
178
- else {
179
- if (block.source_type === 'base64') {
180
- return {
181
- type: 'image',
182
- source: {
183
- type: 'base64',
184
- data: block.data,
185
- media_type: block.mime_type ?? '',
186
- },
187
- ...('cache_control' in (block.metadata ?? {})
188
- ? { cache_control: block.metadata.cache_control }
189
- : {}),
190
- };
191
- }
192
- else {
193
- throw new Error(`Unsupported image source type: ${block.source_type}`);
194
- }
195
- }
196
- },
197
- fromStandardFileBlock(block) {
198
- const mime_type = (block.mime_type ?? '').split(';')[0];
199
- if (block.source_type === 'url') {
200
- if (mime_type === 'application/pdf' || mime_type === '') {
201
- return {
202
- type: 'document',
203
- source: {
204
- type: 'url',
205
- url: block.url,
206
- media_type: block.mime_type ?? '',
207
- },
208
- ...('cache_control' in (block.metadata ?? {})
209
- ? { cache_control: block.metadata.cache_control }
210
- : {}),
211
- ...('citations' in (block.metadata ?? {})
212
- ? { citations: block.metadata.citations }
213
- : {}),
214
- ...('context' in (block.metadata ?? {})
215
- ? { context: block.metadata.context }
216
- : {}),
217
- ...('title' in (block.metadata ?? {})
218
- ? { title: block.metadata.title }
219
- : {}),
220
- };
221
- }
222
- throw new Error(`Unsupported file mime type for file url source: ${block.mime_type}`);
223
- }
224
- else if (block.source_type === 'text') {
225
- if (mime_type === 'text/plain' || mime_type === '') {
226
- return {
227
- type: 'document',
228
- source: {
229
- type: 'text',
230
- data: block.text,
231
- media_type: block.mime_type ?? '',
232
- },
233
- ...('cache_control' in (block.metadata ?? {})
234
- ? { cache_control: block.metadata.cache_control }
235
- : {}),
236
- ...('citations' in (block.metadata ?? {})
237
- ? { citations: block.metadata.citations }
238
- : {}),
239
- ...('context' in (block.metadata ?? {})
240
- ? { context: block.metadata.context }
241
- : {}),
242
- ...('title' in (block.metadata ?? {})
243
- ? { title: block.metadata.title }
244
- : {}),
245
- };
246
- }
247
- else {
248
- throw new Error(`Unsupported file mime type for file text source: ${block.mime_type}`);
249
- }
250
- }
251
- else if (block.source_type === 'base64') {
252
- if (mime_type === 'application/pdf' || mime_type === '') {
253
- return {
254
- type: 'document',
255
- source: {
256
- type: 'base64',
257
- data: block.data,
258
- media_type: 'application/pdf',
259
- },
260
- ...('cache_control' in (block.metadata ?? {})
261
- ? { cache_control: block.metadata.cache_control }
262
- : {}),
263
- ...('citations' in (block.metadata ?? {})
264
- ? { citations: block.metadata.citations }
265
- : {}),
266
- ...('context' in (block.metadata ?? {})
267
- ? { context: block.metadata.context }
268
- : {}),
269
- ...('title' in (block.metadata ?? {})
270
- ? { title: block.metadata.title }
271
- : {}),
272
- };
273
- }
274
- else if (['image/jpeg', 'image/png', 'image/gif', 'image/webp'].includes(mime_type)) {
275
- return {
276
- type: 'document',
277
- source: {
278
- type: 'content',
279
- content: [
280
- {
281
- type: 'image',
282
- source: {
283
- type: 'base64',
284
- data: block.data,
285
- media_type: mime_type,
286
- },
287
- },
288
- ],
289
- },
290
- ...('cache_control' in (block.metadata ?? {})
291
- ? { cache_control: block.metadata.cache_control }
292
- : {}),
293
- ...('citations' in (block.metadata ?? {})
294
- ? { citations: block.metadata.citations }
295
- : {}),
296
- ...('context' in (block.metadata ?? {})
297
- ? { context: block.metadata.context }
298
- : {}),
299
- ...('title' in (block.metadata ?? {})
300
- ? { title: block.metadata.title }
301
- : {}),
302
- };
303
- }
304
- else {
305
- throw new Error(`Unsupported file mime type for file base64 source: ${block.mime_type}`);
306
- }
307
- }
308
- else {
309
- throw new Error(`Unsupported file source type: ${block.source_type}`);
310
- }
311
- },
87
+ providerName: "anthropic",
88
+ fromStandardTextBlock(block) {
89
+ return {
90
+ type: "text",
91
+ text: block.text,
92
+ ..."citations" in (block.metadata ?? {}) ? { citations: block.metadata.citations } : {},
93
+ ..."cache_control" in (block.metadata ?? {}) ? { cache_control: block.metadata.cache_control } : {}
94
+ };
95
+ },
96
+ fromStandardImageBlock(block) {
97
+ if (block.source_type === "url") {
98
+ const data = (0, _langchain_core_messages.parseBase64DataUrl)({
99
+ dataUrl: block.url,
100
+ asTypedArray: false
101
+ });
102
+ if (data) return {
103
+ type: "image",
104
+ source: {
105
+ type: "base64",
106
+ data: data.data,
107
+ media_type: data.mime_type
108
+ },
109
+ ..."cache_control" in (block.metadata ?? {}) ? { cache_control: block.metadata.cache_control } : {}
110
+ };
111
+ else return {
112
+ type: "image",
113
+ source: {
114
+ type: "url",
115
+ url: block.url,
116
+ media_type: block.mime_type ?? ""
117
+ },
118
+ ..."cache_control" in (block.metadata ?? {}) ? { cache_control: block.metadata.cache_control } : {}
119
+ };
120
+ } else if (block.source_type === "base64") return {
121
+ type: "image",
122
+ source: {
123
+ type: "base64",
124
+ data: block.data,
125
+ media_type: block.mime_type ?? ""
126
+ },
127
+ ..."cache_control" in (block.metadata ?? {}) ? { cache_control: block.metadata.cache_control } : {}
128
+ };
129
+ else throw new Error(`Unsupported image source type: ${block.source_type}`);
130
+ },
131
+ fromStandardFileBlock(block) {
132
+ const mime_type = (block.mime_type ?? "").split(";")[0];
133
+ if (block.source_type === "url") {
134
+ if (mime_type === "application/pdf" || mime_type === "") return {
135
+ type: "document",
136
+ source: {
137
+ type: "url",
138
+ url: block.url,
139
+ media_type: block.mime_type ?? ""
140
+ },
141
+ ..."cache_control" in (block.metadata ?? {}) ? { cache_control: block.metadata.cache_control } : {},
142
+ ..."citations" in (block.metadata ?? {}) ? { citations: block.metadata.citations } : {},
143
+ ..."context" in (block.metadata ?? {}) ? { context: block.metadata.context } : {},
144
+ ..."title" in (block.metadata ?? {}) ? { title: block.metadata.title } : {}
145
+ };
146
+ throw new Error(`Unsupported file mime type for file url source: ${block.mime_type}`);
147
+ } else if (block.source_type === "text") if (mime_type === "text/plain" || mime_type === "") return {
148
+ type: "document",
149
+ source: {
150
+ type: "text",
151
+ data: block.text,
152
+ media_type: block.mime_type ?? ""
153
+ },
154
+ ..."cache_control" in (block.metadata ?? {}) ? { cache_control: block.metadata.cache_control } : {},
155
+ ..."citations" in (block.metadata ?? {}) ? { citations: block.metadata.citations } : {},
156
+ ..."context" in (block.metadata ?? {}) ? { context: block.metadata.context } : {},
157
+ ..."title" in (block.metadata ?? {}) ? { title: block.metadata.title } : {}
158
+ };
159
+ else throw new Error(`Unsupported file mime type for file text source: ${block.mime_type}`);
160
+ else if (block.source_type === "base64") if (mime_type === "application/pdf" || mime_type === "") return {
161
+ type: "document",
162
+ source: {
163
+ type: "base64",
164
+ data: block.data,
165
+ media_type: "application/pdf"
166
+ },
167
+ ..."cache_control" in (block.metadata ?? {}) ? { cache_control: block.metadata.cache_control } : {},
168
+ ..."citations" in (block.metadata ?? {}) ? { citations: block.metadata.citations } : {},
169
+ ..."context" in (block.metadata ?? {}) ? { context: block.metadata.context } : {},
170
+ ..."title" in (block.metadata ?? {}) ? { title: block.metadata.title } : {}
171
+ };
172
+ else if ([
173
+ "image/jpeg",
174
+ "image/png",
175
+ "image/gif",
176
+ "image/webp"
177
+ ].includes(mime_type)) return {
178
+ type: "document",
179
+ source: {
180
+ type: "content",
181
+ content: [{
182
+ type: "image",
183
+ source: {
184
+ type: "base64",
185
+ data: block.data,
186
+ media_type: mime_type
187
+ }
188
+ }]
189
+ },
190
+ ..."cache_control" in (block.metadata ?? {}) ? { cache_control: block.metadata.cache_control } : {},
191
+ ..."citations" in (block.metadata ?? {}) ? { citations: block.metadata.citations } : {},
192
+ ..."context" in (block.metadata ?? {}) ? { context: block.metadata.context } : {},
193
+ ..."title" in (block.metadata ?? {}) ? { title: block.metadata.title } : {}
194
+ };
195
+ else throw new Error(`Unsupported file mime type for file base64 source: ${block.mime_type}`);
196
+ else throw new Error(`Unsupported file source type: ${block.source_type}`);
197
+ }
312
198
  };
313
199
  function _formatContent(message) {
314
- const toolTypes = [
315
- 'tool_use',
316
- 'tool_result',
317
- 'input_json_delta',
318
- 'server_tool_use',
319
- 'web_search_tool_result',
320
- 'web_search_result',
321
- ];
322
- const textTypes = ['text', 'text_delta'];
323
- const { content } = message;
324
- if (typeof content === 'string') {
325
- return content;
326
- }
327
- else {
328
- const contentParts = content;
329
- const contentBlocks = contentParts.map((contentPart) => {
330
- /**
331
- * Normalize server_tool_use blocks into a clean shape the API accepts.
332
- * These blocks may arrive with the correct type (server_tool_use) or mislabeled
333
- * as text/tool_use after chunk concatenation or state serialization.
334
- * Regardless of current type, if the id starts with 'srvtoolu_' we rebuild
335
- * a clean block with only the properties the API expects.
336
- */
337
- if ('id' in contentPart &&
338
- typeof contentPart.id === 'string' &&
339
- contentPart.id.startsWith(_enum.Constants.ANTHROPIC_SERVER_TOOL_PREFIX) &&
340
- 'name' in contentPart) {
341
- const rawPart = contentPart;
342
- let input = rawPart.input;
343
- if (typeof input === 'string') {
344
- try {
345
- input = JSON.parse(input);
346
- }
347
- catch {
348
- input = {};
349
- }
350
- }
351
- const corrected = {
352
- type: 'server_tool_use',
353
- id: rawPart.id,
354
- name: (rawPart.name ?? 'web_search'),
355
- input: (input ?? {}),
356
- };
357
- return corrected;
358
- }
359
- /**
360
- * Normalize web_search_tool_result blocks into a clean shape.
361
- * Same rationale as above — the block may carry extra properties from
362
- * streaming (input, index, etc.) that the API rejects. Rebuild cleanly.
363
- */
364
- if ('tool_use_id' in contentPart &&
365
- typeof contentPart.tool_use_id ===
366
- 'string' &&
367
- contentPart.tool_use_id.startsWith(_enum.Constants.ANTHROPIC_SERVER_TOOL_PREFIX) &&
368
- 'content' in contentPart) {
369
- const rawPart = contentPart;
370
- const content = rawPart.content;
371
- const isValidContent = Array.isArray(content) ||
372
- (content != null &&
373
- typeof content === 'object' &&
374
- 'type' in content &&
375
- content.type ===
376
- 'web_search_tool_result_error');
377
- if (isValidContent) {
378
- const corrected = {
379
- type: 'web_search_tool_result',
380
- tool_use_id: rawPart.tool_use_id,
381
- content: content,
382
- };
383
- return corrected;
384
- }
385
- return null;
386
- }
387
- /**
388
- * Skip non-server malformed blocks that have tool fields mixed with text type.
389
- */
390
- if ('id' in contentPart &&
391
- 'name' in contentPart &&
392
- 'input' in contentPart &&
393
- contentPart.type === 'text') {
394
- return null;
395
- }
396
- if ('tool_use_id' in contentPart &&
397
- 'content' in contentPart &&
398
- contentPart.type === 'text') {
399
- return null;
400
- }
401
- // Core's v1 streaming aggregation can leave a partial tool-input delta as a
402
- // standalone block typed `text` carrying `input` but no `text`. The assembled
403
- // input is restored on the tool_use block from `message.tool_calls`, so drop it.
404
- if (contentPart.type === 'text' &&
405
- 'input' in contentPart &&
406
- !('text' in contentPart)) {
407
- return null;
408
- }
409
- if (messages.isDataContentBlock(contentPart)) {
410
- return messages.convertToProviderContentBlock(contentPart, standardContentBlockConverter);
411
- }
412
- const cacheControl = 'cache_control' in contentPart ? contentPart.cache_control : undefined;
413
- if (contentPart.type === 'image_url') {
414
- let source;
415
- const imageUrl = contentPart.image_url;
416
- if (typeof imageUrl === 'string') {
417
- source = _formatImage(imageUrl);
418
- }
419
- else {
420
- source = _formatImage(imageUrl.url);
421
- }
422
- return {
423
- type: 'image', // Explicitly setting the type as "image"
424
- source,
425
- ...(cacheControl != null ? { cache_control: cacheControl } : {}),
426
- };
427
- }
428
- else if (types.isAnthropicImageBlockParam(contentPart)) {
429
- return contentPart;
430
- }
431
- else if (contentPart.type === 'document') {
432
- // PDF
433
- return {
434
- ...contentPart,
435
- ...(cacheControl != null ? { cache_control: cacheControl } : {}),
436
- };
437
- }
438
- else if (contentPart.type === 'thinking') {
439
- const thinkingPart = contentPart;
440
- const block = {
441
- type: 'thinking', // Explicitly setting the type as "thinking"
442
- thinking: thinkingPart.thinking,
443
- signature: thinkingPart.signature,
444
- ...(cacheControl != null ? { cache_control: cacheControl } : {}),
445
- };
446
- return block;
447
- }
448
- else if (contentPart.type === 'redacted_thinking') {
449
- const redactedPart = contentPart;
450
- const block = {
451
- type: 'redacted_thinking', // Explicitly setting the type as "redacted_thinking"
452
- data: redactedPart.data,
453
- ...(cacheControl != null ? { cache_control: cacheControl } : {}),
454
- };
455
- return block;
456
- }
457
- else if (contentPart.type === 'search_result') {
458
- const searchResultPart = contentPart;
459
- const block = {
460
- type: 'search_result',
461
- title: searchResultPart.title,
462
- source: searchResultPart.source,
463
- ...('cache_control' in contentPart &&
464
- contentPart.cache_control != null
465
- ? { cache_control: contentPart.cache_control }
466
- : {}),
467
- ...('citations' in contentPart && contentPart.citations != null
468
- ? { citations: contentPart.citations }
469
- : {}),
470
- content: searchResultPart.content,
471
- };
472
- return block;
473
- }
474
- else if (contentPart.type === 'compaction') {
475
- const compactionPart = contentPart;
476
- const block = {
477
- type: 'compaction',
478
- content: compactionPart.content,
479
- ...(cacheControl != null ? { cache_control: cacheControl } : {}),
480
- };
481
- return block;
482
- }
483
- else if (textTypes.some((t) => t === contentPart.type) &&
484
- 'text' in contentPart) {
485
- // Assuming contentPart is of type MessageContentText here
486
- return {
487
- type: 'text', // Explicitly setting the type as "text"
488
- text: contentPart.text,
489
- ...(cacheControl != null ? { cache_control: cacheControl } : {}),
490
- ...('citations' in contentPart && contentPart.citations != null
491
- ? { citations: contentPart.citations }
492
- : {}),
493
- };
494
- }
495
- else if (toolTypes.some((t) => t === contentPart.type)) {
496
- const contentPartCopy = { ...contentPart };
497
- if ('index' in contentPartCopy) {
498
- // Anthropic does not support passing the index field here, so we remove it.
499
- delete contentPartCopy.index;
500
- }
501
- if (contentPartCopy.type === 'input_json_delta') {
502
- // Orphaned partial tool-input delta with no id of its own. The assembled
503
- // input is restored on the tool_use block from `message.tool_calls`; drop it.
504
- return null;
505
- }
506
- if (contentPartCopy.type === 'tool_use' &&
507
- 'id' in contentPartCopy &&
508
- typeof contentPartCopy.id === 'string' &&
509
- contentPartCopy.id.startsWith(_enum.Constants.ANTHROPIC_SERVER_TOOL_PREFIX)) {
510
- contentPartCopy.type = 'server_tool_use';
511
- }
512
- // Core's streaming aggregation can leave the inline tool_use input empty
513
- // (the assembled arguments live in `message.tool_calls` or, for persisted
514
- // messages, in sibling input_json_delta blocks). Restore it when missing.
515
- if (contentPartCopy.type === 'tool_use' &&
516
- typeof contentPartCopy.id === 'string' &&
517
- (contentPartCopy.input === '' || contentPartCopy.input == null)) {
518
- const matchingToolCall = messages.isAIMessage(message)
519
- ? message.tool_calls?.find((toolCall) => toolCall.id === contentPartCopy.id)
520
- : undefined;
521
- if (matchingToolCall) {
522
- contentPartCopy.input = matchingToolCall.args;
523
- }
524
- else {
525
- const blockIndex = contentPart.index;
526
- const merged = contentParts
527
- .filter((part) => {
528
- const p = part;
529
- return (p.type === 'input_json_delta' &&
530
- p.index === blockIndex &&
531
- typeof p.input === 'string');
532
- })
533
- .reduce((acc, part) => acc + part.input, '');
534
- if (merged !== '') {
535
- contentPartCopy.input = merged;
536
- }
537
- }
538
- }
539
- if ('input' in contentPartCopy) {
540
- // Anthropic tool use inputs should be valid objects, when applicable.
541
- if (typeof contentPartCopy.input === 'string') {
542
- try {
543
- contentPartCopy.input = JSON.parse(contentPartCopy.input);
544
- }
545
- catch {
546
- contentPartCopy.input = {};
547
- }
548
- }
549
- }
550
- /**
551
- * For multi-turn conversations with citations, we must preserve ALL blocks
552
- * including server_tool_use, web_search_tool_result, and web_search_result.
553
- * Citations reference search results by index, so filtering changes indices and breaks references.
554
- *
555
- * The ToolNode already handles skipping server tool invocations via the srvtoolu_ prefix check.
556
- */
557
- // TODO: Fix when SDK types are fixed
558
- return {
559
- ...contentPartCopy,
560
- ...(cacheControl != null ? { cache_control: cacheControl } : {}),
561
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
562
- };
563
- }
564
- else if ('functionCall' in contentPart &&
565
- contentPart.functionCall != null &&
566
- typeof contentPart.functionCall === 'object' &&
567
- messages.isAIMessage(message)) {
568
- const functionCallPart = contentPart;
569
- const correspondingToolCall = message.tool_calls?.find((toolCall) => toolCall.name === functionCallPart.functionCall.name);
570
- if (!correspondingToolCall) {
571
- throw new Error(`Could not find tool call for function call ${functionCallPart.functionCall.name}`);
572
- }
573
- // Google GenAI models include a `functionCall` object inside content. We should ignore it as Anthropic will not support it.
574
- return {
575
- id: correspondingToolCall.id,
576
- type: 'tool_use',
577
- name: correspondingToolCall.name,
578
- input: functionCallPart.functionCall.args,
579
- };
580
- }
581
- else {
582
- console.error('Unsupported content part:', JSON.stringify(contentPart, null, 2));
583
- throw new Error('Unsupported message content format');
584
- }
585
- });
586
- const filteredContentBlocks = contentBlocks.filter((block) => block !== null &&
587
- !(block.type === 'text' &&
588
- 'text' in block &&
589
- typeof block.text === 'string' &&
590
- block.text.trim() === ''));
591
- return filteredContentBlocks.length > 0
592
- ? filteredContentBlocks
593
- : [{ type: 'text', text: ANTHROPIC_EMPTY_TEXT_PLACEHOLDER }];
594
- }
200
+ const toolTypes = [
201
+ "tool_use",
202
+ "tool_result",
203
+ "input_json_delta",
204
+ "server_tool_use",
205
+ "web_search_tool_result",
206
+ "web_search_result"
207
+ ];
208
+ const textTypes = ["text", "text_delta"];
209
+ const { content } = message;
210
+ if (typeof content === "string") return content;
211
+ else {
212
+ const contentParts = content;
213
+ const filteredContentBlocks = contentParts.map((contentPart) => {
214
+ /**
215
+ * Normalize server_tool_use blocks into a clean shape the API accepts.
216
+ * These blocks may arrive with the correct type (server_tool_use) or mislabeled
217
+ * as text/tool_use after chunk concatenation or state serialization.
218
+ * Regardless of current type, if the id starts with 'srvtoolu_' we rebuild
219
+ * a clean block with only the properties the API expects.
220
+ */
221
+ if ("id" in contentPart && typeof contentPart.id === "string" && contentPart.id.startsWith("srvtoolu_") && "name" in contentPart) {
222
+ const rawPart = contentPart;
223
+ let input = rawPart.input;
224
+ if (typeof input === "string") try {
225
+ input = JSON.parse(input);
226
+ } catch {
227
+ input = {};
228
+ }
229
+ return {
230
+ type: "server_tool_use",
231
+ id: rawPart.id,
232
+ name: rawPart.name ?? "web_search",
233
+ input: input ?? {}
234
+ };
235
+ }
236
+ /**
237
+ * Normalize web_search_tool_result blocks into a clean shape.
238
+ * Same rationale as above — the block may carry extra properties from
239
+ * streaming (input, index, etc.) that the API rejects. Rebuild cleanly.
240
+ */
241
+ if ("tool_use_id" in contentPart && typeof contentPart.tool_use_id === "string" && contentPart.tool_use_id.startsWith("srvtoolu_") && "content" in contentPart) {
242
+ const rawPart = contentPart;
243
+ const content = rawPart.content;
244
+ if (Array.isArray(content) || content != null && typeof content === "object" && "type" in content && content.type === "web_search_tool_result_error") return {
245
+ type: "web_search_tool_result",
246
+ tool_use_id: rawPart.tool_use_id,
247
+ content
248
+ };
249
+ return null;
250
+ }
251
+ /**
252
+ * Skip non-server malformed blocks that have tool fields mixed with text type.
253
+ */
254
+ if ("id" in contentPart && "name" in contentPart && "input" in contentPart && contentPart.type === "text") return null;
255
+ if ("tool_use_id" in contentPart && "content" in contentPart && contentPart.type === "text") return null;
256
+ if (contentPart.type === "text" && "input" in contentPart && !("text" in contentPart)) return null;
257
+ if ((0, _langchain_core_messages.isDataContentBlock)(contentPart)) return (0, _langchain_core_messages.convertToProviderContentBlock)(contentPart, standardContentBlockConverter);
258
+ const cacheControl = "cache_control" in contentPart ? contentPart.cache_control : void 0;
259
+ if (contentPart.type === "image_url") {
260
+ let source;
261
+ const imageUrl = contentPart.image_url;
262
+ if (typeof imageUrl === "string") source = _formatImage(imageUrl);
263
+ else source = _formatImage(imageUrl.url);
264
+ return {
265
+ type: "image",
266
+ source,
267
+ ...cacheControl != null ? { cache_control: cacheControl } : {}
268
+ };
269
+ } else if (require_types.isAnthropicImageBlockParam(contentPart)) return contentPart;
270
+ else if (contentPart.type === "document") return {
271
+ ...contentPart,
272
+ ...cacheControl != null ? { cache_control: cacheControl } : {}
273
+ };
274
+ else if (contentPart.type === "thinking") {
275
+ const thinkingPart = contentPart;
276
+ return {
277
+ type: "thinking",
278
+ thinking: thinkingPart.thinking,
279
+ signature: thinkingPart.signature,
280
+ ...cacheControl != null ? { cache_control: cacheControl } : {}
281
+ };
282
+ } else if (contentPart.type === "redacted_thinking") return {
283
+ type: "redacted_thinking",
284
+ data: contentPart.data,
285
+ ...cacheControl != null ? { cache_control: cacheControl } : {}
286
+ };
287
+ else if (contentPart.type === "search_result") {
288
+ const searchResultPart = contentPart;
289
+ return {
290
+ type: "search_result",
291
+ title: searchResultPart.title,
292
+ source: searchResultPart.source,
293
+ ..."cache_control" in contentPart && contentPart.cache_control != null ? { cache_control: contentPart.cache_control } : {},
294
+ ..."citations" in contentPart && contentPart.citations != null ? { citations: contentPart.citations } : {},
295
+ content: searchResultPart.content
296
+ };
297
+ } else if (contentPart.type === "compaction") return {
298
+ type: "compaction",
299
+ content: contentPart.content,
300
+ ...cacheControl != null ? { cache_control: cacheControl } : {}
301
+ };
302
+ else if (textTypes.some((t) => t === contentPart.type) && "text" in contentPart) return {
303
+ type: "text",
304
+ text: contentPart.text,
305
+ ...cacheControl != null ? { cache_control: cacheControl } : {},
306
+ ..."citations" in contentPart && contentPart.citations != null ? { citations: contentPart.citations } : {}
307
+ };
308
+ else if (toolTypes.some((t) => t === contentPart.type)) {
309
+ const contentPartCopy = { ...contentPart };
310
+ if ("index" in contentPartCopy) delete contentPartCopy.index;
311
+ if (contentPartCopy.type === "input_json_delta") return null;
312
+ if (contentPartCopy.type === "tool_use" && "id" in contentPartCopy && typeof contentPartCopy.id === "string" && contentPartCopy.id.startsWith("srvtoolu_")) contentPartCopy.type = "server_tool_use";
313
+ if (contentPartCopy.type === "tool_use" && typeof contentPartCopy.id === "string" && (contentPartCopy.input === "" || contentPartCopy.input == null)) {
314
+ const matchingToolCall = (0, _langchain_core_messages.isAIMessage)(message) ? message.tool_calls?.find((toolCall) => toolCall.id === contentPartCopy.id) : void 0;
315
+ if (matchingToolCall) contentPartCopy.input = matchingToolCall.args;
316
+ else {
317
+ const blockIndex = contentPart.index;
318
+ const merged = contentParts.filter((part) => {
319
+ const p = part;
320
+ return p.type === "input_json_delta" && p.index === blockIndex && typeof p.input === "string";
321
+ }).reduce((acc, part) => acc + part.input, "");
322
+ if (merged !== "") contentPartCopy.input = merged;
323
+ }
324
+ }
325
+ if ("input" in contentPartCopy) {
326
+ if (typeof contentPartCopy.input === "string") try {
327
+ contentPartCopy.input = JSON.parse(contentPartCopy.input);
328
+ } catch {
329
+ contentPartCopy.input = {};
330
+ }
331
+ }
332
+ /**
333
+ * For multi-turn conversations with citations, we must preserve ALL blocks
334
+ * including server_tool_use, web_search_tool_result, and web_search_result.
335
+ * Citations reference search results by index, so filtering changes indices and breaks references.
336
+ *
337
+ * The ToolNode already handles skipping server tool invocations via the srvtoolu_ prefix check.
338
+ */
339
+ return {
340
+ ...contentPartCopy,
341
+ ...cacheControl != null ? { cache_control: cacheControl } : {}
342
+ };
343
+ } else if ("functionCall" in contentPart && contentPart.functionCall != null && typeof contentPart.functionCall === "object" && (0, _langchain_core_messages.isAIMessage)(message)) {
344
+ const functionCallPart = contentPart;
345
+ const correspondingToolCall = message.tool_calls?.find((toolCall) => toolCall.name === functionCallPart.functionCall.name);
346
+ if (!correspondingToolCall) throw new Error(`Could not find tool call for function call ${functionCallPart.functionCall.name}`);
347
+ return {
348
+ id: correspondingToolCall.id,
349
+ type: "tool_use",
350
+ name: correspondingToolCall.name,
351
+ input: functionCallPart.functionCall.args
352
+ };
353
+ } else {
354
+ console.error("Unsupported content part:", JSON.stringify(contentPart, null, 2));
355
+ throw new Error("Unsupported message content format");
356
+ }
357
+ }).filter((block) => block !== null && !(block.type === "text" && "text" in block && typeof block.text === "string" && block.text.trim() === ""));
358
+ return filteredContentBlocks.length > 0 ? filteredContentBlocks : [{
359
+ type: "text",
360
+ text: ANTHROPIC_EMPTY_TEXT_PLACEHOLDER
361
+ }];
362
+ }
595
363
  }
596
364
  /**
597
- * Formats messages as a prompt for the model.
598
- * Used in LangSmith, export is important here.
599
- * @param messages The base messages to format as a prompt.
600
- * @returns The formatted prompt.
601
- */
602
- function _convertMessagesToAnthropicPayload(messages$1) {
603
- const mergedMessages = _ensureMessageContents(messages$1);
604
- let system;
605
- if (mergedMessages.length > 0 && mergedMessages[0]._getType() === 'system') {
606
- system = messages$1[0].content;
607
- }
608
- const conversationMessages = system !== undefined ? mergedMessages.slice(1) : mergedMessages;
609
- const formattedMessages = conversationMessages.map((message) => {
610
- let role;
611
- if (message._getType() === 'human') {
612
- role = 'user';
613
- }
614
- else if (message._getType() === 'ai') {
615
- role = 'assistant';
616
- }
617
- else if (message._getType() === 'tool') {
618
- role = 'user';
619
- }
620
- else if (message._getType() === 'system') {
621
- throw new Error('System messages are only permitted as the first passed message.');
622
- }
623
- else {
624
- throw new Error(`Message type "${message._getType()}" is not supported.`);
625
- }
626
- const isAI = messages.isAIMessage(message);
627
- const toolCalls = isAI ? (message.tool_calls ?? []) : [];
628
- if (isAI && toolCalls.length > 0) {
629
- if (typeof message.content === 'string') {
630
- const clientToolCalls = toolCalls.filter((tc) => !(tc.id?.startsWith(_enum.Constants.ANTHROPIC_SERVER_TOOL_PREFIX) ?? false));
631
- if (message.content === '') {
632
- return {
633
- role,
634
- content: clientToolCalls.length > 0
635
- ? clientToolCalls.map(_convertLangChainToolCallToAnthropic)
636
- : [
637
- {
638
- type: 'text',
639
- text: ANTHROPIC_EMPTY_TEXT_PLACEHOLDER,
640
- },
641
- ],
642
- };
643
- }
644
- else {
645
- return {
646
- role,
647
- content: [
648
- { type: 'text', text: message.content },
649
- ...clientToolCalls.map(_convertLangChainToolCallToAnthropic),
650
- ],
651
- };
652
- }
653
- }
654
- else {
655
- const { content } = message;
656
- const hasMismatchedToolCalls = !toolCalls.every((toolCall) => !!content.find((contentPart) => (contentPart.type === 'tool_use' ||
657
- contentPart.type === 'input_json_delta' ||
658
- contentPart.type === 'server_tool_use') &&
659
- contentPart.id === toolCall.id));
660
- if (hasMismatchedToolCalls) {
661
- console.warn('The "tool_calls" field on a message is only respected if content is a string.');
662
- }
663
- return {
664
- role,
665
- content: _formatContent(message),
666
- };
667
- }
668
- }
669
- else {
670
- return {
671
- role,
672
- content: _formatContent(message),
673
- };
674
- }
675
- });
676
- return {
677
- messages: mergeMessages(formattedMessages),
678
- system,
679
- };
365
+ * Formats messages as a prompt for the model.
366
+ * Used in LangSmith, export is important here.
367
+ * @param messages The base messages to format as a prompt.
368
+ * @returns The formatted prompt.
369
+ */
370
+ function _convertMessagesToAnthropicPayload(messages) {
371
+ const mergedMessages = _ensureMessageContents(messages);
372
+ let system;
373
+ if (mergedMessages.length > 0 && mergedMessages[0]._getType() === "system") system = messages[0].content;
374
+ return {
375
+ messages: mergeMessages((system !== void 0 ? mergedMessages.slice(1) : mergedMessages).map((message) => {
376
+ let role;
377
+ if (message._getType() === "human") role = "user";
378
+ else if (message._getType() === "ai") role = "assistant";
379
+ else if (message._getType() === "tool") role = "user";
380
+ else if (message._getType() === "system") throw new Error("System messages are only permitted as the first passed message.");
381
+ else throw new Error(`Message type "${message._getType()}" is not supported.`);
382
+ const isAI = (0, _langchain_core_messages.isAIMessage)(message);
383
+ const toolCalls = isAI ? message.tool_calls ?? [] : [];
384
+ if (isAI && toolCalls.length > 0) if (typeof message.content === "string") {
385
+ const clientToolCalls = toolCalls.filter((tc) => !(tc.id?.startsWith("srvtoolu_") ?? false));
386
+ if (message.content === "") return {
387
+ role,
388
+ content: clientToolCalls.length > 0 ? clientToolCalls.map(_convertLangChainToolCallToAnthropic) : [{
389
+ type: "text",
390
+ text: ANTHROPIC_EMPTY_TEXT_PLACEHOLDER
391
+ }]
392
+ };
393
+ else return {
394
+ role,
395
+ content: [{
396
+ type: "text",
397
+ text: message.content
398
+ }, ...clientToolCalls.map(_convertLangChainToolCallToAnthropic)]
399
+ };
400
+ } else {
401
+ const { content } = message;
402
+ if (!toolCalls.every((toolCall) => !!content.find((contentPart) => (contentPart.type === "tool_use" || contentPart.type === "input_json_delta" || contentPart.type === "server_tool_use") && contentPart.id === toolCall.id))) console.warn("The \"tool_calls\" field on a message is only respected if content is a string.");
403
+ return {
404
+ role,
405
+ content: _formatContent(message)
406
+ };
407
+ }
408
+ else return {
409
+ role,
410
+ content: _formatContent(message)
411
+ };
412
+ })),
413
+ system
414
+ };
680
415
  }
681
416
  function modelDisallowsAssistantPrefill(model) {
682
- const modelId = model ?? '';
683
- if (CLAUDE_4_RELEASE_DATE_MODEL_PATTERN.test(modelId)) {
684
- return false;
685
- }
686
- const match = CLAUDE_4_MINOR_MODEL_PATTERN.exec(modelId);
687
- if (!match) {
688
- return false;
689
- }
690
- return Number(match[1]) >= 6;
417
+ const modelId = model ?? "";
418
+ if (CLAUDE_4_RELEASE_DATE_MODEL_PATTERN.test(modelId)) return false;
419
+ const match = CLAUDE_4_MINOR_MODEL_PATTERN.exec(modelId);
420
+ if (!match) return false;
421
+ return Number(match[1]) >= 6;
691
422
  }
692
423
  function stripUnsupportedAssistantPrefill(request) {
693
- if (!modelDisallowsAssistantPrefill(request.model)) {
694
- return request;
695
- }
696
- const messages = request.messages;
697
- if (messages.length <= 1 ||
698
- messages[messages.length - 1]?.role !== 'assistant') {
699
- return request;
700
- }
701
- const nextMessages = [...messages];
702
- while (nextMessages.length > 1 &&
703
- nextMessages[nextMessages.length - 1]?.role === 'assistant') {
704
- nextMessages.pop();
705
- }
706
- return {
707
- ...request,
708
- messages: nextMessages,
709
- };
424
+ if (!modelDisallowsAssistantPrefill(request.model)) return request;
425
+ const messages = request.messages;
426
+ if (messages.length <= 1 || messages[messages.length - 1]?.role !== "assistant") return request;
427
+ const nextMessages = [...messages];
428
+ while (nextMessages.length > 1 && nextMessages[nextMessages.length - 1]?.role === "assistant") nextMessages.pop();
429
+ return {
430
+ ...request,
431
+ messages: nextMessages
432
+ };
710
433
  }
711
434
  function mergeMessages(messages) {
712
- if (messages.length <= 1) {
713
- return messages;
714
- }
715
- const result = [];
716
- let currentMessage = messages[0];
717
- const normalizeContent = (content) => {
718
- if (typeof content === 'string') {
719
- return [{ type: 'text', text: content }];
720
- }
721
- return content;
722
- };
723
- const isToolResultMessage = (msg) => {
724
- if (msg.role !== 'user')
725
- return false;
726
- if (typeof msg.content === 'string') {
727
- return false;
728
- }
729
- return (Array.isArray(msg.content) &&
730
- msg.content.every((item) => item.type === 'tool_result'));
731
- };
732
- for (let i = 1; i < messages.length; i += 1) {
733
- const nextMessage = messages[i];
734
- if (isToolResultMessage(currentMessage) &&
735
- isToolResultMessage(nextMessage)) {
736
- // Merge the messages by combining their content arrays
737
- currentMessage = {
738
- ...currentMessage,
739
- content: [
740
- ...normalizeContent(currentMessage.content),
741
- ...normalizeContent(nextMessage.content),
742
- ],
743
- };
744
- }
745
- else {
746
- result.push(currentMessage);
747
- currentMessage = nextMessage;
748
- }
749
- }
750
- result.push(currentMessage);
751
- return result;
435
+ if (messages.length <= 1) return messages;
436
+ const result = [];
437
+ let currentMessage = messages[0];
438
+ const normalizeContent = (content) => {
439
+ if (typeof content === "string") return [{
440
+ type: "text",
441
+ text: content
442
+ }];
443
+ return content;
444
+ };
445
+ const isToolResultMessage = (msg) => {
446
+ if (msg.role !== "user") return false;
447
+ if (typeof msg.content === "string") return false;
448
+ return Array.isArray(msg.content) && msg.content.every((item) => item.type === "tool_result");
449
+ };
450
+ for (let i = 1; i < messages.length; i += 1) {
451
+ const nextMessage = messages[i];
452
+ if (isToolResultMessage(currentMessage) && isToolResultMessage(nextMessage)) currentMessage = {
453
+ ...currentMessage,
454
+ content: [...normalizeContent(currentMessage.content), ...normalizeContent(nextMessage.content)]
455
+ };
456
+ else {
457
+ result.push(currentMessage);
458
+ currentMessage = nextMessage;
459
+ }
460
+ }
461
+ result.push(currentMessage);
462
+ return result;
752
463
  }
753
-
754
- exports._convertLangChainToolCallToAnthropic = _convertLangChainToolCallToAnthropic;
464
+ //#endregion
755
465
  exports._convertMessagesToAnthropicPayload = _convertMessagesToAnthropicPayload;
756
- exports.modelDisallowsAssistantPrefill = modelDisallowsAssistantPrefill;
757
466
  exports.normalizeAnthropicToolCallId = normalizeAnthropicToolCallId;
758
467
  exports.stripUnsupportedAssistantPrefill = stripUnsupportedAssistantPrefill;
759
- //# sourceMappingURL=message_inputs.cjs.map
468
+
469
+ //# sourceMappingURL=message_inputs.cjs.map