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