@illuma-ai/agents 1.0.81

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 (558) hide show
  1. package/README.md +485 -0
  2. package/dist/cjs/agents/AgentContext.cjs +734 -0
  3. package/dist/cjs/agents/AgentContext.cjs.map +1 -0
  4. package/dist/cjs/common/enum.cjs +190 -0
  5. package/dist/cjs/common/enum.cjs.map +1 -0
  6. package/dist/cjs/events.cjs +172 -0
  7. package/dist/cjs/events.cjs.map +1 -0
  8. package/dist/cjs/graphs/Graph.cjs +1615 -0
  9. package/dist/cjs/graphs/Graph.cjs.map +1 -0
  10. package/dist/cjs/graphs/MultiAgentGraph.cjs +890 -0
  11. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -0
  12. package/dist/cjs/instrumentation.cjs +21 -0
  13. package/dist/cjs/instrumentation.cjs.map +1 -0
  14. package/dist/cjs/llm/anthropic/index.cjs +292 -0
  15. package/dist/cjs/llm/anthropic/index.cjs.map +1 -0
  16. package/dist/cjs/llm/anthropic/types.cjs +50 -0
  17. package/dist/cjs/llm/anthropic/types.cjs.map +1 -0
  18. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +630 -0
  19. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -0
  20. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +218 -0
  21. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -0
  22. package/dist/cjs/llm/anthropic/utils/tools.cjs +29 -0
  23. package/dist/cjs/llm/anthropic/utils/tools.cjs.map +1 -0
  24. package/dist/cjs/llm/bedrock/index.cjs +282 -0
  25. package/dist/cjs/llm/bedrock/index.cjs.map +1 -0
  26. package/dist/cjs/llm/fake.cjs +97 -0
  27. package/dist/cjs/llm/fake.cjs.map +1 -0
  28. package/dist/cjs/llm/google/index.cjs +216 -0
  29. package/dist/cjs/llm/google/index.cjs.map +1 -0
  30. package/dist/cjs/llm/google/utils/common.cjs +647 -0
  31. package/dist/cjs/llm/google/utils/common.cjs.map +1 -0
  32. package/dist/cjs/llm/openai/index.cjs +1028 -0
  33. package/dist/cjs/llm/openai/index.cjs.map +1 -0
  34. package/dist/cjs/llm/openai/utils/index.cjs +765 -0
  35. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -0
  36. package/dist/cjs/llm/openrouter/index.cjs +212 -0
  37. package/dist/cjs/llm/openrouter/index.cjs.map +1 -0
  38. package/dist/cjs/llm/providers.cjs +43 -0
  39. package/dist/cjs/llm/providers.cjs.map +1 -0
  40. package/dist/cjs/llm/text.cjs +69 -0
  41. package/dist/cjs/llm/text.cjs.map +1 -0
  42. package/dist/cjs/llm/vertexai/index.cjs +329 -0
  43. package/dist/cjs/llm/vertexai/index.cjs.map +1 -0
  44. package/dist/cjs/main.cjs +240 -0
  45. package/dist/cjs/main.cjs.map +1 -0
  46. package/dist/cjs/messages/cache.cjs +387 -0
  47. package/dist/cjs/messages/cache.cjs.map +1 -0
  48. package/dist/cjs/messages/content.cjs +53 -0
  49. package/dist/cjs/messages/content.cjs.map +1 -0
  50. package/dist/cjs/messages/core.cjs +367 -0
  51. package/dist/cjs/messages/core.cjs.map +1 -0
  52. package/dist/cjs/messages/format.cjs +761 -0
  53. package/dist/cjs/messages/format.cjs.map +1 -0
  54. package/dist/cjs/messages/ids.cjs +23 -0
  55. package/dist/cjs/messages/ids.cjs.map +1 -0
  56. package/dist/cjs/messages/prune.cjs +398 -0
  57. package/dist/cjs/messages/prune.cjs.map +1 -0
  58. package/dist/cjs/messages/tools.cjs +96 -0
  59. package/dist/cjs/messages/tools.cjs.map +1 -0
  60. package/dist/cjs/run.cjs +328 -0
  61. package/dist/cjs/run.cjs.map +1 -0
  62. package/dist/cjs/schemas/validate.cjs +324 -0
  63. package/dist/cjs/schemas/validate.cjs.map +1 -0
  64. package/dist/cjs/splitStream.cjs +210 -0
  65. package/dist/cjs/splitStream.cjs.map +1 -0
  66. package/dist/cjs/stream.cjs +620 -0
  67. package/dist/cjs/stream.cjs.map +1 -0
  68. package/dist/cjs/tools/BrowserTools.cjs +248 -0
  69. package/dist/cjs/tools/BrowserTools.cjs.map +1 -0
  70. package/dist/cjs/tools/Calculator.cjs +66 -0
  71. package/dist/cjs/tools/Calculator.cjs.map +1 -0
  72. package/dist/cjs/tools/CodeExecutor.cjs +234 -0
  73. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -0
  74. package/dist/cjs/tools/ProgrammaticToolCalling.cjs +636 -0
  75. package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -0
  76. package/dist/cjs/tools/ToolNode.cjs +548 -0
  77. package/dist/cjs/tools/ToolNode.cjs.map +1 -0
  78. package/dist/cjs/tools/ToolSearch.cjs +909 -0
  79. package/dist/cjs/tools/ToolSearch.cjs.map +1 -0
  80. package/dist/cjs/tools/handlers.cjs +255 -0
  81. package/dist/cjs/tools/handlers.cjs.map +1 -0
  82. package/dist/cjs/tools/schema.cjs +31 -0
  83. package/dist/cjs/tools/schema.cjs.map +1 -0
  84. package/dist/cjs/tools/search/anthropic.cjs +40 -0
  85. package/dist/cjs/tools/search/anthropic.cjs.map +1 -0
  86. package/dist/cjs/tools/search/content.cjs +140 -0
  87. package/dist/cjs/tools/search/content.cjs.map +1 -0
  88. package/dist/cjs/tools/search/firecrawl.cjs +179 -0
  89. package/dist/cjs/tools/search/firecrawl.cjs.map +1 -0
  90. package/dist/cjs/tools/search/format.cjs +203 -0
  91. package/dist/cjs/tools/search/format.cjs.map +1 -0
  92. package/dist/cjs/tools/search/highlights.cjs +245 -0
  93. package/dist/cjs/tools/search/highlights.cjs.map +1 -0
  94. package/dist/cjs/tools/search/rerankers.cjs +174 -0
  95. package/dist/cjs/tools/search/rerankers.cjs.map +1 -0
  96. package/dist/cjs/tools/search/schema.cjs +117 -0
  97. package/dist/cjs/tools/search/schema.cjs.map +1 -0
  98. package/dist/cjs/tools/search/search.cjs +566 -0
  99. package/dist/cjs/tools/search/search.cjs.map +1 -0
  100. package/dist/cjs/tools/search/serper-scraper.cjs +132 -0
  101. package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -0
  102. package/dist/cjs/tools/search/tool.cjs +456 -0
  103. package/dist/cjs/tools/search/tool.cjs.map +1 -0
  104. package/dist/cjs/tools/search/utils.cjs +66 -0
  105. package/dist/cjs/tools/search/utils.cjs.map +1 -0
  106. package/dist/cjs/types/graph.cjs +29 -0
  107. package/dist/cjs/types/graph.cjs.map +1 -0
  108. package/dist/cjs/utils/contextAnalytics.cjs +66 -0
  109. package/dist/cjs/utils/contextAnalytics.cjs.map +1 -0
  110. package/dist/cjs/utils/events.cjs +31 -0
  111. package/dist/cjs/utils/events.cjs.map +1 -0
  112. package/dist/cjs/utils/graph.cjs +16 -0
  113. package/dist/cjs/utils/graph.cjs.map +1 -0
  114. package/dist/cjs/utils/handlers.cjs +70 -0
  115. package/dist/cjs/utils/handlers.cjs.map +1 -0
  116. package/dist/cjs/utils/llm.cjs +27 -0
  117. package/dist/cjs/utils/llm.cjs.map +1 -0
  118. package/dist/cjs/utils/misc.cjs +56 -0
  119. package/dist/cjs/utils/misc.cjs.map +1 -0
  120. package/dist/cjs/utils/run.cjs +73 -0
  121. package/dist/cjs/utils/run.cjs.map +1 -0
  122. package/dist/cjs/utils/schema.cjs +27 -0
  123. package/dist/cjs/utils/schema.cjs.map +1 -0
  124. package/dist/cjs/utils/title.cjs +125 -0
  125. package/dist/cjs/utils/title.cjs.map +1 -0
  126. package/dist/cjs/utils/tokens.cjs +125 -0
  127. package/dist/cjs/utils/tokens.cjs.map +1 -0
  128. package/dist/cjs/utils/toonFormat.cjs +388 -0
  129. package/dist/cjs/utils/toonFormat.cjs.map +1 -0
  130. package/dist/esm/agents/AgentContext.mjs +732 -0
  131. package/dist/esm/agents/AgentContext.mjs.map +1 -0
  132. package/dist/esm/common/enum.mjs +190 -0
  133. package/dist/esm/common/enum.mjs.map +1 -0
  134. package/dist/esm/events.mjs +164 -0
  135. package/dist/esm/events.mjs.map +1 -0
  136. package/dist/esm/graphs/Graph.mjs +1612 -0
  137. package/dist/esm/graphs/Graph.mjs.map +1 -0
  138. package/dist/esm/graphs/MultiAgentGraph.mjs +888 -0
  139. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -0
  140. package/dist/esm/instrumentation.mjs +19 -0
  141. package/dist/esm/instrumentation.mjs.map +1 -0
  142. package/dist/esm/llm/anthropic/index.mjs +290 -0
  143. package/dist/esm/llm/anthropic/index.mjs.map +1 -0
  144. package/dist/esm/llm/anthropic/types.mjs +48 -0
  145. package/dist/esm/llm/anthropic/types.mjs.map +1 -0
  146. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +627 -0
  147. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -0
  148. package/dist/esm/llm/anthropic/utils/message_outputs.mjs +216 -0
  149. package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -0
  150. package/dist/esm/llm/anthropic/utils/tools.mjs +27 -0
  151. package/dist/esm/llm/anthropic/utils/tools.mjs.map +1 -0
  152. package/dist/esm/llm/bedrock/index.mjs +280 -0
  153. package/dist/esm/llm/bedrock/index.mjs.map +1 -0
  154. package/dist/esm/llm/fake.mjs +94 -0
  155. package/dist/esm/llm/fake.mjs.map +1 -0
  156. package/dist/esm/llm/google/index.mjs +214 -0
  157. package/dist/esm/llm/google/index.mjs.map +1 -0
  158. package/dist/esm/llm/google/utils/common.mjs +638 -0
  159. package/dist/esm/llm/google/utils/common.mjs.map +1 -0
  160. package/dist/esm/llm/openai/index.mjs +1018 -0
  161. package/dist/esm/llm/openai/index.mjs.map +1 -0
  162. package/dist/esm/llm/openai/utils/index.mjs +759 -0
  163. package/dist/esm/llm/openai/utils/index.mjs.map +1 -0
  164. package/dist/esm/llm/openrouter/index.mjs +210 -0
  165. package/dist/esm/llm/openrouter/index.mjs.map +1 -0
  166. package/dist/esm/llm/providers.mjs +39 -0
  167. package/dist/esm/llm/providers.mjs.map +1 -0
  168. package/dist/esm/llm/text.mjs +67 -0
  169. package/dist/esm/llm/text.mjs.map +1 -0
  170. package/dist/esm/llm/vertexai/index.mjs +327 -0
  171. package/dist/esm/llm/vertexai/index.mjs.map +1 -0
  172. package/dist/esm/main.mjs +37 -0
  173. package/dist/esm/main.mjs.map +1 -0
  174. package/dist/esm/messages/cache.mjs +382 -0
  175. package/dist/esm/messages/cache.mjs.map +1 -0
  176. package/dist/esm/messages/content.mjs +51 -0
  177. package/dist/esm/messages/content.mjs.map +1 -0
  178. package/dist/esm/messages/core.mjs +359 -0
  179. package/dist/esm/messages/core.mjs.map +1 -0
  180. package/dist/esm/messages/format.mjs +752 -0
  181. package/dist/esm/messages/format.mjs.map +1 -0
  182. package/dist/esm/messages/ids.mjs +21 -0
  183. package/dist/esm/messages/ids.mjs.map +1 -0
  184. package/dist/esm/messages/prune.mjs +393 -0
  185. package/dist/esm/messages/prune.mjs.map +1 -0
  186. package/dist/esm/messages/tools.mjs +93 -0
  187. package/dist/esm/messages/tools.mjs.map +1 -0
  188. package/dist/esm/run.mjs +325 -0
  189. package/dist/esm/run.mjs.map +1 -0
  190. package/dist/esm/schemas/validate.mjs +317 -0
  191. package/dist/esm/schemas/validate.mjs.map +1 -0
  192. package/dist/esm/splitStream.mjs +207 -0
  193. package/dist/esm/splitStream.mjs.map +1 -0
  194. package/dist/esm/stream.mjs +616 -0
  195. package/dist/esm/stream.mjs.map +1 -0
  196. package/dist/esm/tools/BrowserTools.mjs +244 -0
  197. package/dist/esm/tools/BrowserTools.mjs.map +1 -0
  198. package/dist/esm/tools/Calculator.mjs +41 -0
  199. package/dist/esm/tools/Calculator.mjs.map +1 -0
  200. package/dist/esm/tools/CodeExecutor.mjs +226 -0
  201. package/dist/esm/tools/CodeExecutor.mjs.map +1 -0
  202. package/dist/esm/tools/ProgrammaticToolCalling.mjs +622 -0
  203. package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -0
  204. package/dist/esm/tools/ToolNode.mjs +545 -0
  205. package/dist/esm/tools/ToolNode.mjs.map +1 -0
  206. package/dist/esm/tools/ToolSearch.mjs +870 -0
  207. package/dist/esm/tools/ToolSearch.mjs.map +1 -0
  208. package/dist/esm/tools/handlers.mjs +250 -0
  209. package/dist/esm/tools/handlers.mjs.map +1 -0
  210. package/dist/esm/tools/schema.mjs +28 -0
  211. package/dist/esm/tools/schema.mjs.map +1 -0
  212. package/dist/esm/tools/search/anthropic.mjs +37 -0
  213. package/dist/esm/tools/search/anthropic.mjs.map +1 -0
  214. package/dist/esm/tools/search/content.mjs +119 -0
  215. package/dist/esm/tools/search/content.mjs.map +1 -0
  216. package/dist/esm/tools/search/firecrawl.mjs +176 -0
  217. package/dist/esm/tools/search/firecrawl.mjs.map +1 -0
  218. package/dist/esm/tools/search/format.mjs +201 -0
  219. package/dist/esm/tools/search/format.mjs.map +1 -0
  220. package/dist/esm/tools/search/highlights.mjs +243 -0
  221. package/dist/esm/tools/search/highlights.mjs.map +1 -0
  222. package/dist/esm/tools/search/rerankers.mjs +168 -0
  223. package/dist/esm/tools/search/rerankers.mjs.map +1 -0
  224. package/dist/esm/tools/search/schema.mjs +104 -0
  225. package/dist/esm/tools/search/schema.mjs.map +1 -0
  226. package/dist/esm/tools/search/search.mjs +563 -0
  227. package/dist/esm/tools/search/search.mjs.map +1 -0
  228. package/dist/esm/tools/search/serper-scraper.mjs +129 -0
  229. package/dist/esm/tools/search/serper-scraper.mjs.map +1 -0
  230. package/dist/esm/tools/search/tool.mjs +454 -0
  231. package/dist/esm/tools/search/tool.mjs.map +1 -0
  232. package/dist/esm/tools/search/utils.mjs +61 -0
  233. package/dist/esm/tools/search/utils.mjs.map +1 -0
  234. package/dist/esm/types/graph.mjs +26 -0
  235. package/dist/esm/types/graph.mjs.map +1 -0
  236. package/dist/esm/utils/contextAnalytics.mjs +64 -0
  237. package/dist/esm/utils/contextAnalytics.mjs.map +1 -0
  238. package/dist/esm/utils/events.mjs +29 -0
  239. package/dist/esm/utils/events.mjs.map +1 -0
  240. package/dist/esm/utils/graph.mjs +13 -0
  241. package/dist/esm/utils/graph.mjs.map +1 -0
  242. package/dist/esm/utils/handlers.mjs +68 -0
  243. package/dist/esm/utils/handlers.mjs.map +1 -0
  244. package/dist/esm/utils/llm.mjs +24 -0
  245. package/dist/esm/utils/llm.mjs.map +1 -0
  246. package/dist/esm/utils/misc.mjs +53 -0
  247. package/dist/esm/utils/misc.mjs.map +1 -0
  248. package/dist/esm/utils/run.mjs +70 -0
  249. package/dist/esm/utils/run.mjs.map +1 -0
  250. package/dist/esm/utils/schema.mjs +24 -0
  251. package/dist/esm/utils/schema.mjs.map +1 -0
  252. package/dist/esm/utils/title.mjs +122 -0
  253. package/dist/esm/utils/title.mjs.map +1 -0
  254. package/dist/esm/utils/tokens.mjs +121 -0
  255. package/dist/esm/utils/tokens.mjs.map +1 -0
  256. package/dist/esm/utils/toonFormat.mjs +381 -0
  257. package/dist/esm/utils/toonFormat.mjs.map +1 -0
  258. package/dist/types/agents/AgentContext.d.ts +293 -0
  259. package/dist/types/common/enum.d.ts +155 -0
  260. package/dist/types/common/index.d.ts +1 -0
  261. package/dist/types/events.d.ts +31 -0
  262. package/dist/types/graphs/Graph.d.ts +216 -0
  263. package/dist/types/graphs/MultiAgentGraph.d.ts +104 -0
  264. package/dist/types/graphs/index.d.ts +2 -0
  265. package/dist/types/index.d.ts +21 -0
  266. package/dist/types/instrumentation.d.ts +1 -0
  267. package/dist/types/llm/anthropic/index.d.ts +39 -0
  268. package/dist/types/llm/anthropic/types.d.ts +37 -0
  269. package/dist/types/llm/anthropic/utils/message_inputs.d.ts +14 -0
  270. package/dist/types/llm/anthropic/utils/message_outputs.d.ts +14 -0
  271. package/dist/types/llm/anthropic/utils/output_parsers.d.ts +22 -0
  272. package/dist/types/llm/anthropic/utils/tools.d.ts +3 -0
  273. package/dist/types/llm/bedrock/index.d.ts +141 -0
  274. package/dist/types/llm/bedrock/types.d.ts +27 -0
  275. package/dist/types/llm/bedrock/utils/index.d.ts +5 -0
  276. package/dist/types/llm/bedrock/utils/message_inputs.d.ts +31 -0
  277. package/dist/types/llm/bedrock/utils/message_outputs.d.ts +33 -0
  278. package/dist/types/llm/fake.d.ts +31 -0
  279. package/dist/types/llm/google/index.d.ts +24 -0
  280. package/dist/types/llm/google/types.d.ts +42 -0
  281. package/dist/types/llm/google/utils/common.d.ts +34 -0
  282. package/dist/types/llm/google/utils/tools.d.ts +10 -0
  283. package/dist/types/llm/google/utils/zod_to_genai_parameters.d.ts +14 -0
  284. package/dist/types/llm/openai/index.d.ts +127 -0
  285. package/dist/types/llm/openai/types.d.ts +10 -0
  286. package/dist/types/llm/openai/utils/index.d.ts +29 -0
  287. package/dist/types/llm/openrouter/index.d.ts +15 -0
  288. package/dist/types/llm/providers.d.ts +5 -0
  289. package/dist/types/llm/text.d.ts +21 -0
  290. package/dist/types/llm/vertexai/index.d.ts +293 -0
  291. package/dist/types/messages/cache.d.ts +54 -0
  292. package/dist/types/messages/content.d.ts +7 -0
  293. package/dist/types/messages/core.d.ts +14 -0
  294. package/dist/types/messages/format.d.ts +137 -0
  295. package/dist/types/messages/ids.d.ts +3 -0
  296. package/dist/types/messages/index.d.ts +7 -0
  297. package/dist/types/messages/prune.d.ts +52 -0
  298. package/dist/types/messages/reducer.d.ts +9 -0
  299. package/dist/types/messages/tools.d.ts +17 -0
  300. package/dist/types/mockStream.d.ts +32 -0
  301. package/dist/types/prompts/collab.d.ts +1 -0
  302. package/dist/types/prompts/index.d.ts +2 -0
  303. package/dist/types/prompts/taskmanager.d.ts +41 -0
  304. package/dist/types/run.d.ts +41 -0
  305. package/dist/types/schemas/index.d.ts +1 -0
  306. package/dist/types/schemas/validate.d.ts +59 -0
  307. package/dist/types/splitStream.d.ts +37 -0
  308. package/dist/types/stream.d.ts +15 -0
  309. package/dist/types/test/mockTools.d.ts +28 -0
  310. package/dist/types/tools/BrowserTools.d.ts +87 -0
  311. package/dist/types/tools/Calculator.d.ts +34 -0
  312. package/dist/types/tools/CodeExecutor.d.ts +57 -0
  313. package/dist/types/tools/ProgrammaticToolCalling.d.ts +138 -0
  314. package/dist/types/tools/ToolNode.d.ts +51 -0
  315. package/dist/types/tools/ToolSearch.d.ts +219 -0
  316. package/dist/types/tools/handlers.d.ts +22 -0
  317. package/dist/types/tools/schema.d.ts +12 -0
  318. package/dist/types/tools/search/anthropic.d.ts +16 -0
  319. package/dist/types/tools/search/content.d.ts +4 -0
  320. package/dist/types/tools/search/firecrawl.d.ts +54 -0
  321. package/dist/types/tools/search/format.d.ts +5 -0
  322. package/dist/types/tools/search/highlights.d.ts +13 -0
  323. package/dist/types/tools/search/index.d.ts +3 -0
  324. package/dist/types/tools/search/rerankers.d.ts +38 -0
  325. package/dist/types/tools/search/schema.d.ts +103 -0
  326. package/dist/types/tools/search/search.d.ts +8 -0
  327. package/dist/types/tools/search/serper-scraper.d.ts +59 -0
  328. package/dist/types/tools/search/test.d.ts +1 -0
  329. package/dist/types/tools/search/tool.d.ts +3 -0
  330. package/dist/types/tools/search/types.d.ts +575 -0
  331. package/dist/types/tools/search/utils.d.ts +10 -0
  332. package/dist/types/types/graph.d.ts +399 -0
  333. package/dist/types/types/index.d.ts +5 -0
  334. package/dist/types/types/llm.d.ts +105 -0
  335. package/dist/types/types/messages.d.ts +4 -0
  336. package/dist/types/types/run.d.ts +112 -0
  337. package/dist/types/types/stream.d.ts +308 -0
  338. package/dist/types/types/tools.d.ts +296 -0
  339. package/dist/types/utils/contextAnalytics.d.ts +37 -0
  340. package/dist/types/utils/events.d.ts +6 -0
  341. package/dist/types/utils/graph.d.ts +2 -0
  342. package/dist/types/utils/handlers.d.ts +34 -0
  343. package/dist/types/utils/index.d.ts +9 -0
  344. package/dist/types/utils/llm.d.ts +3 -0
  345. package/dist/types/utils/llmConfig.d.ts +3 -0
  346. package/dist/types/utils/logging.d.ts +1 -0
  347. package/dist/types/utils/misc.d.ts +7 -0
  348. package/dist/types/utils/run.d.ts +27 -0
  349. package/dist/types/utils/schema.d.ts +8 -0
  350. package/dist/types/utils/title.d.ts +4 -0
  351. package/dist/types/utils/tokens.d.ts +28 -0
  352. package/dist/types/utils/toonFormat.d.ts +111 -0
  353. package/package.json +190 -0
  354. package/src/agents/AgentContext.test.ts +458 -0
  355. package/src/agents/AgentContext.ts +972 -0
  356. package/src/agents/__tests__/AgentContext.test.ts +805 -0
  357. package/src/agents/__tests__/resolveStructuredOutputMode.test.ts +137 -0
  358. package/src/common/enum.ts +203 -0
  359. package/src/common/index.ts +2 -0
  360. package/src/events.ts +223 -0
  361. package/src/graphs/Graph.ts +2228 -0
  362. package/src/graphs/MultiAgentGraph.ts +1063 -0
  363. package/src/graphs/__tests__/structured-output.integration.test.ts +809 -0
  364. package/src/graphs/__tests__/structured-output.test.ts +183 -0
  365. package/src/graphs/index.ts +2 -0
  366. package/src/index.ts +34 -0
  367. package/src/instrumentation.ts +22 -0
  368. package/src/llm/anthropic/Jacob_Lee_Resume_2023.pdf +0 -0
  369. package/src/llm/anthropic/index.ts +413 -0
  370. package/src/llm/anthropic/llm.spec.ts +1442 -0
  371. package/src/llm/anthropic/types.ts +140 -0
  372. package/src/llm/anthropic/utils/message_inputs.ts +757 -0
  373. package/src/llm/anthropic/utils/message_outputs.ts +289 -0
  374. package/src/llm/anthropic/utils/output_parsers.ts +133 -0
  375. package/src/llm/anthropic/utils/tools.ts +29 -0
  376. package/src/llm/bedrock/__tests__/bedrock-caching.test.ts +495 -0
  377. package/src/llm/bedrock/index.ts +411 -0
  378. package/src/llm/bedrock/llm.spec.ts +616 -0
  379. package/src/llm/bedrock/types.ts +51 -0
  380. package/src/llm/bedrock/utils/index.ts +18 -0
  381. package/src/llm/bedrock/utils/message_inputs.ts +563 -0
  382. package/src/llm/bedrock/utils/message_outputs.ts +310 -0
  383. package/src/llm/fake.ts +133 -0
  384. package/src/llm/google/data/gettysburg10.wav +0 -0
  385. package/src/llm/google/data/hotdog.jpg +0 -0
  386. package/src/llm/google/index.ts +337 -0
  387. package/src/llm/google/llm.spec.ts +934 -0
  388. package/src/llm/google/types.ts +56 -0
  389. package/src/llm/google/utils/common.ts +873 -0
  390. package/src/llm/google/utils/tools.ts +160 -0
  391. package/src/llm/google/utils/zod_to_genai_parameters.ts +86 -0
  392. package/src/llm/openai/index.ts +1366 -0
  393. package/src/llm/openai/types.ts +24 -0
  394. package/src/llm/openai/utils/index.ts +1035 -0
  395. package/src/llm/openai/utils/isReasoningModel.test.ts +90 -0
  396. package/src/llm/openrouter/index.ts +291 -0
  397. package/src/llm/providers.ts +52 -0
  398. package/src/llm/text.ts +94 -0
  399. package/src/llm/vertexai/index.ts +359 -0
  400. package/src/messages/__tests__/tools.test.ts +473 -0
  401. package/src/messages/cache.test.ts +1261 -0
  402. package/src/messages/cache.ts +518 -0
  403. package/src/messages/content.test.ts +362 -0
  404. package/src/messages/content.ts +63 -0
  405. package/src/messages/core.ts +473 -0
  406. package/src/messages/ensureThinkingBlock.test.ts +468 -0
  407. package/src/messages/format.ts +1029 -0
  408. package/src/messages/formatAgentMessages.test.ts +1513 -0
  409. package/src/messages/formatAgentMessages.tools.test.ts +419 -0
  410. package/src/messages/formatMessage.test.ts +693 -0
  411. package/src/messages/ids.ts +26 -0
  412. package/src/messages/index.ts +7 -0
  413. package/src/messages/labelContentByAgent.test.ts +887 -0
  414. package/src/messages/prune.ts +568 -0
  415. package/src/messages/reducer.ts +80 -0
  416. package/src/messages/shiftIndexTokenCountMap.test.ts +81 -0
  417. package/src/messages/tools.ts +108 -0
  418. package/src/mockStream.ts +99 -0
  419. package/src/prompts/collab.ts +6 -0
  420. package/src/prompts/index.ts +2 -0
  421. package/src/prompts/taskmanager.ts +61 -0
  422. package/src/run.ts +467 -0
  423. package/src/schemas/index.ts +2 -0
  424. package/src/schemas/schema-preparation.test.ts +500 -0
  425. package/src/schemas/validate.test.ts +358 -0
  426. package/src/schemas/validate.ts +454 -0
  427. package/src/scripts/abort.ts +157 -0
  428. package/src/scripts/ant_web_search.ts +158 -0
  429. package/src/scripts/ant_web_search_edge_case.ts +162 -0
  430. package/src/scripts/ant_web_search_error_edge_case.ts +148 -0
  431. package/src/scripts/args.ts +48 -0
  432. package/src/scripts/caching.ts +132 -0
  433. package/src/scripts/cli.ts +172 -0
  434. package/src/scripts/cli2.ts +133 -0
  435. package/src/scripts/cli3.ts +184 -0
  436. package/src/scripts/cli4.ts +191 -0
  437. package/src/scripts/cli5.ts +191 -0
  438. package/src/scripts/code_exec.ts +213 -0
  439. package/src/scripts/code_exec_files.ts +236 -0
  440. package/src/scripts/code_exec_multi_session.ts +241 -0
  441. package/src/scripts/code_exec_ptc.ts +334 -0
  442. package/src/scripts/code_exec_session.ts +282 -0
  443. package/src/scripts/code_exec_simple.ts +147 -0
  444. package/src/scripts/content.ts +138 -0
  445. package/src/scripts/empty_input.ts +137 -0
  446. package/src/scripts/handoff-test.ts +135 -0
  447. package/src/scripts/image.ts +178 -0
  448. package/src/scripts/memory.ts +97 -0
  449. package/src/scripts/multi-agent-chain.ts +331 -0
  450. package/src/scripts/multi-agent-conditional.ts +221 -0
  451. package/src/scripts/multi-agent-document-review-chain.ts +197 -0
  452. package/src/scripts/multi-agent-hybrid-flow.ts +310 -0
  453. package/src/scripts/multi-agent-parallel-start.ts +265 -0
  454. package/src/scripts/multi-agent-parallel.ts +394 -0
  455. package/src/scripts/multi-agent-sequence.ts +217 -0
  456. package/src/scripts/multi-agent-supervisor.ts +365 -0
  457. package/src/scripts/multi-agent-test.ts +186 -0
  458. package/src/scripts/parallel-asymmetric-tools-test.ts +274 -0
  459. package/src/scripts/parallel-full-metadata-test.ts +240 -0
  460. package/src/scripts/parallel-tools-test.ts +340 -0
  461. package/src/scripts/programmatic_exec.ts +396 -0
  462. package/src/scripts/programmatic_exec_agent.ts +231 -0
  463. package/src/scripts/search.ts +146 -0
  464. package/src/scripts/sequential-full-metadata-test.ts +197 -0
  465. package/src/scripts/simple.ts +225 -0
  466. package/src/scripts/single-agent-metadata-test.ts +198 -0
  467. package/src/scripts/stream.ts +140 -0
  468. package/src/scripts/test-custom-prompt-key.ts +145 -0
  469. package/src/scripts/test-handoff-input.ts +170 -0
  470. package/src/scripts/test-handoff-preamble.ts +277 -0
  471. package/src/scripts/test-multi-agent-list-handoff.ts +417 -0
  472. package/src/scripts/test-parallel-agent-labeling.ts +325 -0
  473. package/src/scripts/test-parallel-handoffs.ts +291 -0
  474. package/src/scripts/test-thinking-handoff-bedrock.ts +153 -0
  475. package/src/scripts/test-thinking-handoff.ts +155 -0
  476. package/src/scripts/test-tools-before-handoff.ts +226 -0
  477. package/src/scripts/test_code_api.ts +361 -0
  478. package/src/scripts/thinking-bedrock.ts +159 -0
  479. package/src/scripts/thinking.ts +171 -0
  480. package/src/scripts/tool_search.ts +162 -0
  481. package/src/scripts/tools.ts +177 -0
  482. package/src/specs/agent-handoffs.test.ts +888 -0
  483. package/src/specs/anthropic.simple.test.ts +387 -0
  484. package/src/specs/azure.simple.test.ts +364 -0
  485. package/src/specs/cache.simple.test.ts +396 -0
  486. package/src/specs/deepseek.simple.test.ts +283 -0
  487. package/src/specs/emergency-prune.test.ts +407 -0
  488. package/src/specs/moonshot.simple.test.ts +358 -0
  489. package/src/specs/openai.simple.test.ts +311 -0
  490. package/src/specs/openrouter.simple.test.ts +107 -0
  491. package/src/specs/prune.test.ts +901 -0
  492. package/src/specs/reasoning.test.ts +201 -0
  493. package/src/specs/spec.utils.ts +3 -0
  494. package/src/specs/thinking-handoff.test.ts +620 -0
  495. package/src/specs/thinking-prune.test.ts +703 -0
  496. package/src/specs/token-distribution-edge-case.test.ts +316 -0
  497. package/src/specs/token-memoization.test.ts +32 -0
  498. package/src/specs/tool-error.test.ts +198 -0
  499. package/src/splitStream.test.ts +691 -0
  500. package/src/splitStream.ts +234 -0
  501. package/src/stream.test.ts +94 -0
  502. package/src/stream.ts +801 -0
  503. package/src/test/mockTools.ts +386 -0
  504. package/src/tools/BrowserTools.ts +393 -0
  505. package/src/tools/Calculator.test.ts +278 -0
  506. package/src/tools/Calculator.ts +46 -0
  507. package/src/tools/CodeExecutor.ts +270 -0
  508. package/src/tools/ProgrammaticToolCalling.ts +785 -0
  509. package/src/tools/ToolNode.ts +674 -0
  510. package/src/tools/ToolSearch.ts +1095 -0
  511. package/src/tools/__tests__/BrowserTools.test.ts +265 -0
  512. package/src/tools/__tests__/ProgrammaticToolCalling.integration.test.ts +319 -0
  513. package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +1006 -0
  514. package/src/tools/__tests__/ToolSearch.integration.test.ts +162 -0
  515. package/src/tools/__tests__/ToolSearch.test.ts +1003 -0
  516. package/src/tools/handlers.ts +363 -0
  517. package/src/tools/schema.ts +37 -0
  518. package/src/tools/search/anthropic.ts +51 -0
  519. package/src/tools/search/content.test.ts +173 -0
  520. package/src/tools/search/content.ts +147 -0
  521. package/src/tools/search/firecrawl.ts +210 -0
  522. package/src/tools/search/format.ts +250 -0
  523. package/src/tools/search/highlights.ts +320 -0
  524. package/src/tools/search/index.ts +3 -0
  525. package/src/tools/search/jina-reranker.test.ts +130 -0
  526. package/src/tools/search/output.md +2775 -0
  527. package/src/tools/search/rerankers.ts +242 -0
  528. package/src/tools/search/schema.ts +113 -0
  529. package/src/tools/search/search.ts +768 -0
  530. package/src/tools/search/serper-scraper.ts +155 -0
  531. package/src/tools/search/test.html +884 -0
  532. package/src/tools/search/test.md +643 -0
  533. package/src/tools/search/test.ts +159 -0
  534. package/src/tools/search/tool.ts +657 -0
  535. package/src/tools/search/types.ts +665 -0
  536. package/src/tools/search/utils.ts +79 -0
  537. package/src/types/graph.test.ts +218 -0
  538. package/src/types/graph.ts +533 -0
  539. package/src/types/index.ts +6 -0
  540. package/src/types/llm.ts +140 -0
  541. package/src/types/messages.ts +4 -0
  542. package/src/types/run.ts +128 -0
  543. package/src/types/stream.ts +417 -0
  544. package/src/types/tools.ts +355 -0
  545. package/src/utils/contextAnalytics.ts +103 -0
  546. package/src/utils/events.ts +32 -0
  547. package/src/utils/graph.ts +11 -0
  548. package/src/utils/handlers.ts +107 -0
  549. package/src/utils/index.ts +9 -0
  550. package/src/utils/llm.ts +26 -0
  551. package/src/utils/llmConfig.ts +208 -0
  552. package/src/utils/logging.ts +48 -0
  553. package/src/utils/misc.ts +57 -0
  554. package/src/utils/run.ts +106 -0
  555. package/src/utils/schema.ts +35 -0
  556. package/src/utils/title.ts +177 -0
  557. package/src/utils/tokens.ts +142 -0
  558. package/src/utils/toonFormat.ts +475 -0
@@ -0,0 +1,1035 @@
1
+ /* eslint-disable @typescript-eslint/ban-ts-comment */
2
+ /* eslint-disable @typescript-eslint/explicit-function-return-type */
3
+ import { type OpenAI as OpenAIClient } from 'openai';
4
+ import type {
5
+ ChatCompletionContentPartText,
6
+ ChatCompletionContentPartImage,
7
+ ChatCompletionContentPartInputAudio,
8
+ ChatCompletionContentPart,
9
+ } from 'openai/resources/chat/completions';
10
+ import {
11
+ AIMessage,
12
+ AIMessageChunk,
13
+ type BaseMessage,
14
+ ChatMessage,
15
+ ToolMessage,
16
+ isAIMessage,
17
+ type UsageMetadata,
18
+ type BaseMessageFields,
19
+ type MessageContent,
20
+ type InvalidToolCall,
21
+ type MessageContentImageUrl,
22
+ StandardContentBlockConverter,
23
+ parseBase64DataUrl,
24
+ parseMimeType,
25
+ convertToProviderContentBlock,
26
+ isDataContentBlock,
27
+ } from '@langchain/core/messages';
28
+ import { ChatGenerationChunk } from '@langchain/core/outputs';
29
+ import {
30
+ convertLangChainToolCallToOpenAI,
31
+ makeInvalidToolCall,
32
+ parseToolCall,
33
+ } from '@langchain/core/output_parsers/openai_tools';
34
+ import type { ToolCall, ToolCallChunk } from '@langchain/core/messages/tool';
35
+ import type {
36
+ OpenAICallOptions,
37
+ OpenAIChatInput,
38
+ ChatOpenAIReasoningSummary,
39
+ } from '@langchain/openai';
40
+
41
+ export type { OpenAICallOptions, OpenAIChatInput };
42
+
43
+ // Utility types to get hidden OpenAI response types
44
+ type ExtractAsyncIterableType<T> = T extends AsyncIterable<infer U> ? U : never;
45
+ type ExcludeController<T> = T extends { controller: unknown } ? never : T;
46
+ type ExcludeNonController<T> = T extends { controller: unknown } ? T : never;
47
+
48
+ type ResponsesCreate = OpenAIClient.Responses['create'];
49
+ type ResponsesParse = OpenAIClient.Responses['parse'];
50
+
51
+ type ResponsesInputItem = OpenAIClient.Responses.ResponseInputItem;
52
+
53
+ type ResponsesCreateInvoke = ExcludeController<
54
+ Awaited<ReturnType<ResponsesCreate>>
55
+ >;
56
+
57
+ type ResponsesParseInvoke = ExcludeController<
58
+ Awaited<ReturnType<ResponsesParse>>
59
+ >;
60
+
61
+ type ResponsesCreateStream = ExcludeNonController<
62
+ Awaited<ReturnType<ResponsesCreate>>
63
+ >;
64
+
65
+ export type ResponseReturnStreamEvents =
66
+ ExtractAsyncIterableType<ResponsesCreateStream>;
67
+
68
+ // TODO import from SDK when available
69
+ type OpenAIRoleEnum =
70
+ | 'system'
71
+ | 'developer'
72
+ | 'assistant'
73
+ | 'user'
74
+ | 'function'
75
+ | 'tool';
76
+
77
+ type OpenAICompletionParam =
78
+ OpenAIClient.Chat.Completions.ChatCompletionMessageParam;
79
+
80
+ function extractGenericMessageCustomRole(message: ChatMessage) {
81
+ if (
82
+ message.role !== 'system' &&
83
+ message.role !== 'developer' &&
84
+ message.role !== 'assistant' &&
85
+ message.role !== 'user' &&
86
+ message.role !== 'function' &&
87
+ message.role !== 'tool'
88
+ ) {
89
+ console.warn(`Unknown message role: ${message.role}`);
90
+ }
91
+
92
+ return message.role as OpenAIRoleEnum;
93
+ }
94
+
95
+ export function messageToOpenAIRole(message: BaseMessage): OpenAIRoleEnum {
96
+ const type = message._getType();
97
+ switch (type) {
98
+ case 'system':
99
+ return 'system';
100
+ case 'ai':
101
+ return 'assistant';
102
+ case 'human':
103
+ return 'user';
104
+ case 'function':
105
+ return 'function';
106
+ case 'tool':
107
+ return 'tool';
108
+ case 'generic': {
109
+ if (!ChatMessage.isInstance(message))
110
+ throw new Error('Invalid generic chat message');
111
+ return extractGenericMessageCustomRole(message);
112
+ }
113
+ default:
114
+ throw new Error(`Unknown message type: ${type}`);
115
+ }
116
+ }
117
+
118
+ const completionsApiContentBlockConverter: StandardContentBlockConverter<{
119
+ text: ChatCompletionContentPartText;
120
+ image: ChatCompletionContentPartImage;
121
+ audio: ChatCompletionContentPartInputAudio;
122
+ file: ChatCompletionContentPart.File;
123
+ }> = {
124
+ providerName: 'ChatOpenAI',
125
+
126
+ fromStandardTextBlock(block): ChatCompletionContentPartText {
127
+ return { type: 'text', text: block.text };
128
+ },
129
+
130
+ fromStandardImageBlock(block): ChatCompletionContentPartImage {
131
+ if (block.source_type === 'url') {
132
+ return {
133
+ type: 'image_url',
134
+ image_url: {
135
+ url: block.url,
136
+ ...(block.metadata?.detail
137
+ ? { detail: block.metadata.detail as 'auto' | 'low' | 'high' }
138
+ : {}),
139
+ },
140
+ };
141
+ }
142
+
143
+ if (block.source_type === 'base64') {
144
+ const url = `data:${block.mime_type ?? ''};base64,${block.data}`;
145
+ return {
146
+ type: 'image_url',
147
+ image_url: {
148
+ url,
149
+ ...(block.metadata?.detail
150
+ ? { detail: block.metadata.detail as 'auto' | 'low' | 'high' }
151
+ : {}),
152
+ },
153
+ };
154
+ }
155
+
156
+ throw new Error(
157
+ `Image content blocks with source_type ${block.source_type} are not supported for ChatOpenAI`
158
+ );
159
+ },
160
+
161
+ fromStandardAudioBlock(block): ChatCompletionContentPartInputAudio {
162
+ if (block.source_type === 'url') {
163
+ const data = parseBase64DataUrl({ dataUrl: block.url });
164
+ if (!data) {
165
+ throw new Error(
166
+ `URL audio blocks with source_type ${block.source_type} must be formatted as a data URL for ChatOpenAI`
167
+ );
168
+ }
169
+
170
+ const rawMimeType = data.mime_type || block.mime_type || '';
171
+ let mimeType: { type: string; subtype: string };
172
+
173
+ try {
174
+ mimeType = parseMimeType(rawMimeType);
175
+ } catch {
176
+ throw new Error(
177
+ `Audio blocks with source_type ${block.source_type} must have mime type of audio/wav or audio/mp3`
178
+ );
179
+ }
180
+
181
+ if (
182
+ mimeType.type !== 'audio' ||
183
+ (mimeType.subtype !== 'wav' && mimeType.subtype !== 'mp3')
184
+ ) {
185
+ throw new Error(
186
+ `Audio blocks with source_type ${block.source_type} must have mime type of audio/wav or audio/mp3`
187
+ );
188
+ }
189
+
190
+ return {
191
+ type: 'input_audio',
192
+ input_audio: {
193
+ format: mimeType.subtype,
194
+ data: data.data,
195
+ },
196
+ };
197
+ }
198
+
199
+ if (block.source_type === 'base64') {
200
+ let mimeType: { type: string; subtype: string };
201
+
202
+ try {
203
+ mimeType = parseMimeType(block.mime_type ?? '');
204
+ } catch {
205
+ throw new Error(
206
+ `Audio blocks with source_type ${block.source_type} must have mime type of audio/wav or audio/mp3`
207
+ );
208
+ }
209
+
210
+ if (
211
+ mimeType.type !== 'audio' ||
212
+ (mimeType.subtype !== 'wav' && mimeType.subtype !== 'mp3')
213
+ ) {
214
+ throw new Error(
215
+ `Audio blocks with source_type ${block.source_type} must have mime type of audio/wav or audio/mp3`
216
+ );
217
+ }
218
+
219
+ return {
220
+ type: 'input_audio',
221
+ input_audio: {
222
+ format: mimeType.subtype,
223
+ data: block.data,
224
+ },
225
+ };
226
+ }
227
+
228
+ throw new Error(
229
+ `Audio content blocks with source_type ${block.source_type} are not supported for ChatOpenAI`
230
+ );
231
+ },
232
+
233
+ fromStandardFileBlock(block): ChatCompletionContentPart.File {
234
+ if (block.source_type === 'url') {
235
+ const data = parseBase64DataUrl({ dataUrl: block.url });
236
+ if (!data) {
237
+ throw new Error(
238
+ `URL file blocks with source_type ${block.source_type} must be formatted as a data URL for ChatOpenAI`
239
+ );
240
+ }
241
+
242
+ return {
243
+ type: 'file',
244
+ file: {
245
+ file_data: block.url, // formatted as base64 data URL
246
+ ...(block.metadata?.filename || block.metadata?.name
247
+ ? {
248
+ filename: (block.metadata.filename ||
249
+ block.metadata.name) as string,
250
+ }
251
+ : {}),
252
+ },
253
+ };
254
+ }
255
+
256
+ if (block.source_type === 'base64') {
257
+ return {
258
+ type: 'file',
259
+ file: {
260
+ file_data: `data:${block.mime_type ?? ''};base64,${block.data}`,
261
+ ...(block.metadata?.filename ||
262
+ block.metadata?.name ||
263
+ block.metadata?.title
264
+ ? {
265
+ filename: (block.metadata.filename ||
266
+ block.metadata.name ||
267
+ block.metadata.title) as string,
268
+ }
269
+ : {}),
270
+ },
271
+ };
272
+ }
273
+
274
+ if (block.source_type === 'id') {
275
+ return {
276
+ type: 'file',
277
+ file: {
278
+ file_id: block.id,
279
+ },
280
+ };
281
+ }
282
+
283
+ throw new Error(
284
+ `File content blocks with source_type ${block.source_type} are not supported for ChatOpenAI`
285
+ );
286
+ },
287
+ };
288
+
289
+ /** Options for converting messages to OpenAI params */
290
+ export interface ConvertMessagesOptions {
291
+ /** Include reasoning_content field for DeepSeek thinking mode with tool calls */
292
+ includeReasoningContent?: boolean;
293
+ /** Include reasoning_details field for OpenRouter/Gemini thinking mode with tool calls */
294
+ includeReasoningDetails?: boolean;
295
+ /** Convert reasoning_details to content blocks for Claude (requires content array format) */
296
+ convertReasoningDetailsToContent?: boolean;
297
+ }
298
+
299
+ // Used in LangSmith, export is important here
300
+ export function _convertMessagesToOpenAIParams(
301
+ messages: BaseMessage[],
302
+ model?: string,
303
+ options?: ConvertMessagesOptions
304
+ ): OpenAICompletionParam[] {
305
+ // TODO: Function messages do not support array content, fix cast
306
+ return messages.flatMap((message) => {
307
+ let role = messageToOpenAIRole(message);
308
+ if (role === 'system' && isReasoningModel(model)) {
309
+ role = 'developer';
310
+ }
311
+
312
+ let hasAnthropicThinkingBlock: boolean = false;
313
+
314
+ const content =
315
+ typeof message.content === 'string'
316
+ ? message.content
317
+ : message.content.map((m) => {
318
+ if ('type' in m && m.type === 'thinking') {
319
+ hasAnthropicThinkingBlock = true;
320
+ return m;
321
+ }
322
+ if (isDataContentBlock(m)) {
323
+ return convertToProviderContentBlock(
324
+ m,
325
+ completionsApiContentBlockConverter
326
+ );
327
+ }
328
+ return m;
329
+ });
330
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
331
+ const completionParam: Record<string, any> = {
332
+ role,
333
+ content,
334
+ };
335
+ if (message.name != null) {
336
+ completionParam.name = message.name;
337
+ }
338
+ if (message.additional_kwargs.function_call != null) {
339
+ completionParam.function_call = message.additional_kwargs.function_call;
340
+ completionParam.content = '';
341
+ }
342
+ if (isAIMessage(message) && !!message.tool_calls?.length) {
343
+ completionParam.tool_calls = message.tool_calls.map(
344
+ convertLangChainToolCallToOpenAI
345
+ );
346
+ completionParam.content = hasAnthropicThinkingBlock ? content : '';
347
+ if (
348
+ options?.includeReasoningContent === true &&
349
+ message.additional_kwargs.reasoning_content != null
350
+ ) {
351
+ completionParam.reasoning_content =
352
+ message.additional_kwargs.reasoning_content;
353
+ }
354
+ if (
355
+ options?.includeReasoningDetails === true &&
356
+ message.additional_kwargs.reasoning_details != null
357
+ ) {
358
+ // For Claude via OpenRouter, convert reasoning_details to content blocks
359
+ const isClaudeModel =
360
+ model?.includes('claude') === true ||
361
+ model?.includes('anthropic') === true;
362
+ if (
363
+ options.convertReasoningDetailsToContent === true &&
364
+ isClaudeModel
365
+ ) {
366
+ const reasoningDetails = message.additional_kwargs
367
+ .reasoning_details as Record<string, unknown>[];
368
+ const contentBlocks = [];
369
+
370
+ // Add thinking blocks from reasoning_details
371
+ for (const detail of reasoningDetails) {
372
+ if (detail.type === 'reasoning.text' && detail.text != null) {
373
+ contentBlocks.push({
374
+ type: 'thinking',
375
+ thinking: detail.text,
376
+ });
377
+ } else if (
378
+ detail.type === 'reasoning.encrypted' &&
379
+ detail.data != null
380
+ ) {
381
+ contentBlocks.push({
382
+ type: 'redacted_thinking',
383
+ data: detail.data,
384
+ id: detail.id,
385
+ });
386
+ }
387
+ }
388
+
389
+ // Set content to array with thinking blocks
390
+ if (contentBlocks.length > 0) {
391
+ completionParam.content = contentBlocks;
392
+ }
393
+ } else {
394
+ // For non-Claude models, pass as separate field
395
+ completionParam.reasoning_details =
396
+ message.additional_kwargs.reasoning_details;
397
+ }
398
+ }
399
+ } else {
400
+ if (message.additional_kwargs.tool_calls != null) {
401
+ completionParam.tool_calls = message.additional_kwargs.tool_calls;
402
+ if (
403
+ options?.includeReasoningContent === true &&
404
+ message.additional_kwargs.reasoning_content != null
405
+ ) {
406
+ completionParam.reasoning_content =
407
+ message.additional_kwargs.reasoning_content;
408
+ }
409
+ if (
410
+ options?.includeReasoningDetails === true &&
411
+ message.additional_kwargs.reasoning_details != null
412
+ ) {
413
+ // For Claude via OpenRouter, convert reasoning_details to content blocks
414
+ const isClaudeModel =
415
+ model?.includes('claude') === true ||
416
+ model?.includes('anthropic') === true;
417
+ if (
418
+ options.convertReasoningDetailsToContent === true &&
419
+ isClaudeModel
420
+ ) {
421
+ const reasoningDetails = message.additional_kwargs
422
+ .reasoning_details as Record<string, unknown>[];
423
+ const contentBlocks = [];
424
+
425
+ // Add thinking blocks from reasoning_details
426
+ for (const detail of reasoningDetails) {
427
+ if (detail.type === 'reasoning.text' && detail.text != null) {
428
+ contentBlocks.push({
429
+ type: 'thinking',
430
+ thinking: detail.text,
431
+ });
432
+ } else if (
433
+ detail.type === 'reasoning.encrypted' &&
434
+ detail.data != null
435
+ ) {
436
+ contentBlocks.push({
437
+ type: 'redacted_thinking',
438
+ data: detail.data,
439
+ id: detail.id,
440
+ });
441
+ }
442
+ }
443
+
444
+ // Set content to array with thinking blocks
445
+ if (contentBlocks.length > 0) {
446
+ completionParam.content = contentBlocks;
447
+ }
448
+ } else {
449
+ // For non-Claude models, pass as separate field
450
+ completionParam.reasoning_details =
451
+ message.additional_kwargs.reasoning_details;
452
+ }
453
+ }
454
+ }
455
+ if ((message as ToolMessage).tool_call_id != null) {
456
+ completionParam.tool_call_id = (message as ToolMessage).tool_call_id;
457
+ }
458
+ }
459
+
460
+ if (
461
+ message.additional_kwargs.audio &&
462
+ typeof message.additional_kwargs.audio === 'object' &&
463
+ 'id' in message.additional_kwargs.audio
464
+ ) {
465
+ const audioMessage = {
466
+ role: 'assistant',
467
+ audio: {
468
+ id: message.additional_kwargs.audio.id,
469
+ },
470
+ };
471
+ return [completionParam, audioMessage] as OpenAICompletionParam[];
472
+ }
473
+
474
+ return completionParam as OpenAICompletionParam;
475
+ });
476
+ }
477
+
478
+ const _FUNCTION_CALL_IDS_MAP_KEY = '__openai_function_call_ids__';
479
+
480
+ function _convertReasoningSummaryToOpenAIResponsesParams(
481
+ reasoning: ChatOpenAIReasoningSummary
482
+ ): OpenAIClient.Responses.ResponseReasoningItem {
483
+ // combine summary parts that have the the same index and then remove the indexes
484
+ const summary = (
485
+ reasoning.summary.length > 1
486
+ ? reasoning.summary.reduce(
487
+ (acc, curr) => {
488
+ const last = acc.at(-1);
489
+
490
+ if (last!.index === curr.index) {
491
+ last!.text += curr.text;
492
+ } else {
493
+ acc.push(curr);
494
+ }
495
+ return acc;
496
+ },
497
+ [{ ...reasoning.summary[0] }]
498
+ )
499
+ : reasoning.summary
500
+ ).map((s) =>
501
+ Object.fromEntries(Object.entries(s).filter(([k]) => k !== 'index'))
502
+ ) as OpenAIClient.Responses.ResponseReasoningItem.Summary[];
503
+
504
+ return {
505
+ ...reasoning,
506
+ summary,
507
+ } as OpenAIClient.Responses.ResponseReasoningItem;
508
+ }
509
+
510
+ export function _convertMessagesToOpenAIResponsesParams(
511
+ messages: BaseMessage[],
512
+ model?: string,
513
+ zdrEnabled?: boolean
514
+ ): ResponsesInputItem[] {
515
+ return messages.flatMap(
516
+ (lcMsg): ResponsesInputItem | ResponsesInputItem[] => {
517
+ const additional_kwargs =
518
+ lcMsg.additional_kwargs as BaseMessageFields['additional_kwargs'] & {
519
+ [_FUNCTION_CALL_IDS_MAP_KEY]?: Record<string, string>;
520
+ reasoning?: OpenAIClient.Responses.ResponseReasoningItem;
521
+ type?: string;
522
+ refusal?: string;
523
+ };
524
+
525
+ let role = messageToOpenAIRole(lcMsg);
526
+ if (role === 'system' && isReasoningModel(model)) role = 'developer';
527
+
528
+ if (role === 'function') {
529
+ throw new Error('Function messages are not supported in Responses API');
530
+ }
531
+
532
+ if (role === 'tool') {
533
+ const toolMessage = lcMsg as ToolMessage;
534
+
535
+ // Handle computer call output
536
+ if (additional_kwargs.type === 'computer_call_output') {
537
+ const output = (() => {
538
+ if (typeof toolMessage.content === 'string') {
539
+ return {
540
+ type: 'computer_screenshot' as const,
541
+ image_url: toolMessage.content,
542
+ };
543
+ }
544
+
545
+ if (Array.isArray(toolMessage.content)) {
546
+ const oaiScreenshot = toolMessage.content.find(
547
+ (i) => i.type === 'computer_screenshot'
548
+ ) as { type: 'computer_screenshot'; image_url: string };
549
+
550
+ if (oaiScreenshot) return oaiScreenshot;
551
+
552
+ const lcImage = toolMessage.content.find(
553
+ (i) => i.type === 'image_url'
554
+ ) as MessageContentImageUrl;
555
+
556
+ if (lcImage) {
557
+ return {
558
+ type: 'computer_screenshot' as const,
559
+ image_url:
560
+ typeof lcImage.image_url === 'string'
561
+ ? lcImage.image_url
562
+ : lcImage.image_url.url,
563
+ };
564
+ }
565
+ }
566
+
567
+ throw new Error('Invalid computer call output');
568
+ })();
569
+
570
+ return {
571
+ type: 'computer_call_output',
572
+ output,
573
+ call_id: toolMessage.tool_call_id,
574
+ };
575
+ }
576
+
577
+ return {
578
+ type: 'function_call_output',
579
+ call_id: toolMessage.tool_call_id,
580
+ id: toolMessage.id?.startsWith('fc_') ? toolMessage.id : undefined,
581
+ output:
582
+ typeof toolMessage.content !== 'string'
583
+ ? JSON.stringify(toolMessage.content)
584
+ : toolMessage.content,
585
+ };
586
+ }
587
+
588
+ if (role === 'assistant') {
589
+ // if we have the original response items, just reuse them
590
+ if (
591
+ !zdrEnabled &&
592
+ lcMsg.response_metadata.output != null &&
593
+ Array.isArray(lcMsg.response_metadata.output) &&
594
+ lcMsg.response_metadata.output.length > 0 &&
595
+ lcMsg.response_metadata.output.every((item) => 'type' in item)
596
+ ) {
597
+ return lcMsg.response_metadata.output;
598
+ }
599
+
600
+ // otherwise, try to reconstruct the response from what we have
601
+
602
+ const input: ResponsesInputItem[] = [];
603
+
604
+ // reasoning items
605
+ if (additional_kwargs.reasoning && !zdrEnabled) {
606
+ const reasoningItem = _convertReasoningSummaryToOpenAIResponsesParams(
607
+ additional_kwargs.reasoning
608
+ );
609
+ input.push(reasoningItem);
610
+ }
611
+
612
+ // ai content
613
+ let { content } = lcMsg;
614
+ if (additional_kwargs.refusal) {
615
+ if (typeof content === 'string') {
616
+ content = [{ type: 'output_text', text: content, annotations: [] }];
617
+ }
618
+ content = [
619
+ ...content,
620
+ { type: 'refusal', refusal: additional_kwargs.refusal },
621
+ ];
622
+ }
623
+
624
+ input.push({
625
+ type: 'message',
626
+ role: 'assistant',
627
+ ...(lcMsg.id && !zdrEnabled && lcMsg.id.startsWith('msg_')
628
+ ? { id: lcMsg.id }
629
+ : {}),
630
+ content:
631
+ typeof content === 'string'
632
+ ? content
633
+ : content.flatMap((item) => {
634
+ if (item.type === 'text') {
635
+ return {
636
+ type: 'output_text',
637
+ text: item.text,
638
+ // @ts-expect-error TODO: add types for `annotations`
639
+ annotations: item.annotations ?? [],
640
+ };
641
+ }
642
+
643
+ if (item.type === 'output_text' || item.type === 'refusal') {
644
+ return item;
645
+ }
646
+
647
+ return [];
648
+ }),
649
+ });
650
+
651
+ const functionCallIds = additional_kwargs[_FUNCTION_CALL_IDS_MAP_KEY];
652
+
653
+ if (isAIMessage(lcMsg) && !!lcMsg.tool_calls?.length) {
654
+ input.push(
655
+ ...lcMsg.tool_calls.map(
656
+ (toolCall): ResponsesInputItem => ({
657
+ type: 'function_call',
658
+ name: toolCall.name,
659
+ arguments: JSON.stringify(toolCall.args),
660
+ call_id: toolCall.id!,
661
+ ...(zdrEnabled ? { id: functionCallIds?.[toolCall.id!] } : {}),
662
+ })
663
+ )
664
+ );
665
+ } else if (additional_kwargs.tool_calls) {
666
+ input.push(
667
+ ...additional_kwargs.tool_calls.map(
668
+ (toolCall): ResponsesInputItem => ({
669
+ type: 'function_call',
670
+ name: toolCall.function.name,
671
+ call_id: toolCall.id,
672
+ arguments: toolCall.function.arguments,
673
+ ...(zdrEnabled ? { id: functionCallIds?.[toolCall.id] } : {}),
674
+ })
675
+ )
676
+ );
677
+ }
678
+
679
+ const toolOutputs =
680
+ ((
681
+ lcMsg.response_metadata.output as
682
+ | Array<ResponsesInputItem>
683
+ | undefined
684
+ )?.length ?? 0) > 0
685
+ ? lcMsg.response_metadata.output
686
+ : additional_kwargs.tool_outputs;
687
+
688
+ const fallthroughCallTypes: ResponsesInputItem['type'][] = [
689
+ 'computer_call',
690
+ /** @ts-ignore */
691
+ 'mcp_call',
692
+ /** @ts-ignore */
693
+ 'code_interpreter_call',
694
+ /** @ts-ignore */
695
+ 'image_generation_call',
696
+ ];
697
+
698
+ if (toolOutputs != null) {
699
+ const castToolOutputs = toolOutputs as Array<ResponsesInputItem>;
700
+ const fallthroughCalls = castToolOutputs.filter((item) =>
701
+ fallthroughCallTypes.includes(item.type)
702
+ );
703
+ if (fallthroughCalls.length > 0) input.push(...fallthroughCalls);
704
+ }
705
+
706
+ return input;
707
+ }
708
+
709
+ if (role === 'user' || role === 'system' || role === 'developer') {
710
+ if (typeof lcMsg.content === 'string') {
711
+ return { type: 'message', role, content: lcMsg.content };
712
+ }
713
+
714
+ const messages: ResponsesInputItem[] = [];
715
+ const content = lcMsg.content.flatMap((item) => {
716
+ if (item.type === 'mcp_approval_response') {
717
+ messages.push({
718
+ // @ts-ignore
719
+ type: 'mcp_approval_response',
720
+ approval_request_id: item.approval_request_id,
721
+ approve: item.approve,
722
+ });
723
+ }
724
+ if (isDataContentBlock(item)) {
725
+ return convertToProviderContentBlock(
726
+ item,
727
+ completionsApiContentBlockConverter
728
+ );
729
+ }
730
+ if (item.type === 'text') {
731
+ return {
732
+ type: 'input_text',
733
+ text: item.text,
734
+ };
735
+ }
736
+ if (item.type === 'image_url') {
737
+ return {
738
+ type: 'input_image',
739
+ image_url:
740
+ typeof item.image_url === 'string'
741
+ ? item.image_url
742
+ : item.image_url.url,
743
+ detail:
744
+ typeof item.image_url === 'string'
745
+ ? 'auto'
746
+ : item.image_url.detail,
747
+ };
748
+ }
749
+ if (
750
+ item.type === 'input_text' ||
751
+ item.type === 'input_image' ||
752
+ item.type === 'input_file'
753
+ ) {
754
+ return item;
755
+ }
756
+ return [];
757
+ });
758
+
759
+ if (content.length > 0) {
760
+ messages.push({ type: 'message', role, content });
761
+ }
762
+ return messages;
763
+ }
764
+
765
+ console.warn(
766
+ `Unsupported role found when converting to OpenAI Responses API: ${role}`
767
+ );
768
+ return [];
769
+ }
770
+ );
771
+ }
772
+
773
+ export function isReasoningModel(model?: string) {
774
+ return model != null && model !== '' && /\b(o\d|gpt-[5-9])\b/i.test(model);
775
+ }
776
+
777
+ function _convertOpenAIResponsesMessageToBaseMessage(
778
+ response: ResponsesCreateInvoke | ResponsesParseInvoke
779
+ ): BaseMessage {
780
+ if (response.error) {
781
+ // TODO: add support for `addLangChainErrorFields`
782
+ const error = new Error(response.error.message);
783
+ error.name = response.error.code;
784
+ throw error;
785
+ }
786
+
787
+ let messageId: string | undefined;
788
+ const content: MessageContent = [];
789
+ const tool_calls: ToolCall[] = [];
790
+ const invalid_tool_calls: InvalidToolCall[] = [];
791
+ const response_metadata: Record<string, unknown> = {
792
+ model: response.model,
793
+ created_at: response.created_at,
794
+ id: response.id,
795
+ incomplete_details: response.incomplete_details,
796
+ metadata: response.metadata,
797
+ object: response.object,
798
+ status: response.status,
799
+ user: response.user,
800
+ service_tier: response.service_tier,
801
+
802
+ // for compatibility with chat completion calls.
803
+ model_name: response.model,
804
+ };
805
+
806
+ const additional_kwargs: {
807
+ [key: string]: unknown;
808
+ refusal?: string;
809
+ reasoning?: OpenAIClient.Responses.ResponseReasoningItem;
810
+ tool_outputs?: unknown[];
811
+ parsed?: unknown;
812
+ [_FUNCTION_CALL_IDS_MAP_KEY]?: Record<string, string>;
813
+ } = {};
814
+
815
+ for (const item of response.output) {
816
+ if (item.type === 'message') {
817
+ messageId = item.id;
818
+ content.push(
819
+ ...item.content.flatMap((part) => {
820
+ if (part.type === 'output_text') {
821
+ if ('parsed' in part && part.parsed != null) {
822
+ additional_kwargs.parsed = part.parsed;
823
+ }
824
+ return {
825
+ type: 'text',
826
+ text: part.text,
827
+ annotations: part.annotations,
828
+ };
829
+ }
830
+
831
+ if (part.type === 'refusal') {
832
+ additional_kwargs.refusal = part.refusal;
833
+ return [];
834
+ }
835
+
836
+ return part;
837
+ })
838
+ );
839
+ } else if (item.type === 'function_call') {
840
+ const fnAdapter = {
841
+ function: { name: item.name, arguments: item.arguments },
842
+ id: item.call_id,
843
+ };
844
+
845
+ try {
846
+ tool_calls.push(parseToolCall(fnAdapter, { returnId: true }));
847
+ } catch (e: unknown) {
848
+ let errMessage: string | undefined;
849
+ if (
850
+ typeof e === 'object' &&
851
+ e != null &&
852
+ 'message' in e &&
853
+ typeof e.message === 'string'
854
+ ) {
855
+ errMessage = e.message;
856
+ }
857
+ invalid_tool_calls.push(makeInvalidToolCall(fnAdapter, errMessage));
858
+ }
859
+
860
+ additional_kwargs[_FUNCTION_CALL_IDS_MAP_KEY] ??= {};
861
+ if (item.id) {
862
+ additional_kwargs[_FUNCTION_CALL_IDS_MAP_KEY][item.call_id] = item.id;
863
+ }
864
+ } else if (item.type === 'reasoning') {
865
+ additional_kwargs.reasoning = item;
866
+ } else {
867
+ additional_kwargs.tool_outputs ??= [];
868
+ additional_kwargs.tool_outputs.push(item);
869
+ }
870
+ }
871
+
872
+ return new AIMessage({
873
+ id: messageId,
874
+ content,
875
+ tool_calls,
876
+ invalid_tool_calls,
877
+ usage_metadata: response.usage,
878
+ additional_kwargs,
879
+ response_metadata,
880
+ });
881
+ }
882
+
883
+ export function _convertOpenAIResponsesDeltaToBaseMessageChunk(
884
+ chunk: ResponseReturnStreamEvents
885
+ ) {
886
+ const content: Record<string, unknown>[] = [];
887
+ let generationInfo: Record<string, unknown> = {};
888
+ let usage_metadata: UsageMetadata | undefined;
889
+ const tool_call_chunks: ToolCallChunk[] = [];
890
+ const response_metadata: Record<string, unknown> = {};
891
+ const additional_kwargs: {
892
+ [key: string]: unknown;
893
+ reasoning?: Partial<ChatOpenAIReasoningSummary>;
894
+ tool_outputs?: unknown[];
895
+ } = {};
896
+ let id: string | undefined;
897
+ if (chunk.type === 'response.output_text.delta') {
898
+ content.push({
899
+ type: 'text',
900
+ text: chunk.delta,
901
+ index: chunk.content_index,
902
+ });
903
+ /** @ts-ignore */
904
+ } else if (chunk.type === 'response.output_text_annotation.added') {
905
+ content.push({
906
+ type: 'text',
907
+ text: '',
908
+ /** @ts-ignore */
909
+ annotations: [chunk.annotation],
910
+ /** @ts-ignore */
911
+ index: chunk.content_index,
912
+ });
913
+ } else if (
914
+ chunk.type === 'response.output_item.added' &&
915
+ chunk.item.type === 'message'
916
+ ) {
917
+ id = chunk.item.id;
918
+ } else if (
919
+ chunk.type === 'response.output_item.added' &&
920
+ chunk.item.type === 'function_call'
921
+ ) {
922
+ tool_call_chunks.push({
923
+ type: 'tool_call_chunk',
924
+ name: chunk.item.name,
925
+ args: chunk.item.arguments,
926
+ id: chunk.item.call_id,
927
+ index: chunk.output_index,
928
+ });
929
+
930
+ additional_kwargs[_FUNCTION_CALL_IDS_MAP_KEY] = {
931
+ [chunk.item.call_id]: chunk.item.id,
932
+ };
933
+ } else if (
934
+ chunk.type === 'response.output_item.done' &&
935
+ [
936
+ 'web_search_call',
937
+ 'file_search_call',
938
+ 'computer_call',
939
+ 'code_interpreter_call',
940
+ 'mcp_call',
941
+ 'mcp_list_tools',
942
+ 'mcp_approval_request',
943
+ 'image_generation_call',
944
+ ].includes(chunk.item.type)
945
+ ) {
946
+ additional_kwargs.tool_outputs = [chunk.item];
947
+ } else if (chunk.type === 'response.created') {
948
+ response_metadata.id = chunk.response.id;
949
+ response_metadata.model_name = chunk.response.model;
950
+ response_metadata.model = chunk.response.model;
951
+ } else if (chunk.type === 'response.completed') {
952
+ const msg = _convertOpenAIResponsesMessageToBaseMessage(chunk.response);
953
+
954
+ usage_metadata = chunk.response.usage;
955
+ if (chunk.response.text?.format?.type === 'json_schema') {
956
+ additional_kwargs.parsed ??= JSON.parse(msg.text);
957
+ }
958
+ for (const [key, value] of Object.entries(chunk.response)) {
959
+ if (key !== 'id') response_metadata[key] = value;
960
+ }
961
+ } else if (chunk.type === 'response.function_call_arguments.delta') {
962
+ tool_call_chunks.push({
963
+ type: 'tool_call_chunk',
964
+ args: chunk.delta,
965
+ index: chunk.output_index,
966
+ });
967
+ } else if (
968
+ chunk.type === 'response.web_search_call.completed' ||
969
+ chunk.type === 'response.file_search_call.completed'
970
+ ) {
971
+ generationInfo = {
972
+ tool_outputs: {
973
+ id: chunk.item_id,
974
+ type: chunk.type.replace('response.', '').replace('.completed', ''),
975
+ status: 'completed',
976
+ },
977
+ };
978
+ } else if (chunk.type === 'response.refusal.done') {
979
+ additional_kwargs.refusal = chunk.refusal;
980
+ } else if (
981
+ chunk.type === 'response.output_item.added' &&
982
+ 'item' in chunk &&
983
+ chunk.item.type === 'reasoning'
984
+ ) {
985
+ const summary: ChatOpenAIReasoningSummary['summary'] | undefined = chunk
986
+ .item.summary
987
+ ? chunk.item.summary.map((s, index) => ({
988
+ ...s,
989
+ index,
990
+ }))
991
+ : undefined;
992
+
993
+ additional_kwargs.reasoning = {
994
+ // We only capture ID in the first chunk or else the concatenated result of all chunks will
995
+ // have an ID field that is repeated once per chunk. There is special handling for the `type`
996
+ // field that prevents this, however.
997
+ id: chunk.item.id,
998
+ type: chunk.item.type,
999
+ ...(summary ? { summary } : {}),
1000
+ };
1001
+ } else if (chunk.type === 'response.reasoning_summary_part.added') {
1002
+ additional_kwargs.reasoning = {
1003
+ type: 'reasoning',
1004
+ summary: [{ ...chunk.part, index: chunk.summary_index }],
1005
+ };
1006
+ } else if (chunk.type === 'response.reasoning_summary_text.delta') {
1007
+ additional_kwargs.reasoning = {
1008
+ type: 'reasoning',
1009
+ summary: [
1010
+ { text: chunk.delta, type: 'summary_text', index: chunk.summary_index },
1011
+ ],
1012
+ };
1013
+ /** @ts-ignore */
1014
+ } else if (chunk.type === 'response.image_generation_call.partial_image') {
1015
+ // noop/fixme: retaining partial images in a message chunk means that _all_
1016
+ // partial images get kept in history, so we don't do anything here.
1017
+ return null;
1018
+ } else {
1019
+ return null;
1020
+ }
1021
+
1022
+ return new ChatGenerationChunk({
1023
+ // Legacy reasons, `onLLMNewToken` should pulls this out
1024
+ text: content.map((part) => part.text).join(''),
1025
+ message: new AIMessageChunk({
1026
+ id,
1027
+ content,
1028
+ tool_call_chunks,
1029
+ usage_metadata,
1030
+ additional_kwargs,
1031
+ response_metadata,
1032
+ }),
1033
+ generationInfo,
1034
+ });
1035
+ }