@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
package/src/stream.ts ADDED
@@ -0,0 +1,801 @@
1
+ // src/stream.ts
2
+ import type { ChatOpenAIReasoningSummary } from '@langchain/openai';
3
+ import type { AIMessageChunk } from '@langchain/core/messages';
4
+ import type { ToolCall } from '@langchain/core/messages/tool';
5
+ import type { AgentContext } from '@/agents/AgentContext';
6
+ import type { StandardGraph } from '@/graphs';
7
+ import type * as t from '@/types';
8
+ import {
9
+ ToolCallTypes,
10
+ ContentTypes,
11
+ GraphEvents,
12
+ StepTypes,
13
+ Providers,
14
+ } from '@/common';
15
+ import {
16
+ handleServerToolResult,
17
+ handleToolCallChunks,
18
+ handleToolCalls,
19
+ } from '@/tools/handlers';
20
+ import { getMessageId } from '@/messages';
21
+
22
+ /**
23
+ * Parses content to extract thinking sections enclosed in <think> tags using string operations
24
+ * @param content The content to parse
25
+ * @returns An object with separated text and thinking content
26
+ */
27
+ function parseThinkingContent(content: string): {
28
+ text: string;
29
+ thinking: string;
30
+ } {
31
+ // If no think tags, return the original content as text
32
+ if (!content.includes('<think>')) {
33
+ return { text: content, thinking: '' };
34
+ }
35
+
36
+ let textResult = '';
37
+ const thinkingResult: string[] = [];
38
+ let position = 0;
39
+
40
+ while (position < content.length) {
41
+ const thinkStart = content.indexOf('<think>', position);
42
+
43
+ if (thinkStart === -1) {
44
+ // No more think tags, add the rest and break
45
+ textResult += content.slice(position);
46
+ break;
47
+ }
48
+
49
+ // Add text before the think tag
50
+ textResult += content.slice(position, thinkStart);
51
+
52
+ const thinkEnd = content.indexOf('</think>', thinkStart);
53
+ if (thinkEnd === -1) {
54
+ // Malformed input, no closing tag
55
+ textResult += content.slice(thinkStart);
56
+ break;
57
+ }
58
+
59
+ // Add the thinking content
60
+ const thinkContent = content.slice(thinkStart + 7, thinkEnd);
61
+ thinkingResult.push(thinkContent);
62
+
63
+ // Move position to after the think tag
64
+ position = thinkEnd + 8; // 8 is the length of '</think>'
65
+ }
66
+
67
+ return {
68
+ text: textResult.trim(),
69
+ thinking: thinkingResult.join('\n').trim(),
70
+ };
71
+ }
72
+
73
+ function getNonEmptyValue(possibleValues: string[]): string | undefined {
74
+ for (const value of possibleValues) {
75
+ if (value && value.trim() !== '') {
76
+ return value;
77
+ }
78
+ }
79
+ return undefined;
80
+ }
81
+
82
+ export function getChunkContent({
83
+ chunk,
84
+ provider,
85
+ reasoningKey,
86
+ }: {
87
+ chunk?: Partial<AIMessageChunk>;
88
+ provider?: Providers;
89
+ reasoningKey: 'reasoning_content' | 'reasoning';
90
+ }): string | t.MessageContentComplex[] | undefined {
91
+ if (
92
+ (provider === Providers.OPENAI || provider === Providers.AZURE) &&
93
+ (
94
+ chunk?.additional_kwargs?.reasoning as
95
+ | Partial<ChatOpenAIReasoningSummary>
96
+ | undefined
97
+ )?.summary?.[0]?.text != null &&
98
+ ((
99
+ chunk?.additional_kwargs?.reasoning as
100
+ | Partial<ChatOpenAIReasoningSummary>
101
+ | undefined
102
+ )?.summary?.[0]?.text?.length ?? 0) > 0
103
+ ) {
104
+ return (
105
+ chunk?.additional_kwargs?.reasoning as
106
+ | Partial<ChatOpenAIReasoningSummary>
107
+ | undefined
108
+ )?.summary?.[0]?.text;
109
+ }
110
+ /**
111
+ * For OpenRouter, reasoning is stored in additional_kwargs.reasoning (not reasoning_content).
112
+ * NOTE: We intentionally do NOT extract text from reasoning_details here.
113
+ * The reasoning_details array contains the FULL accumulated reasoning text (set only on final chunk),
114
+ * but individual reasoning tokens are already streamed via additional_kwargs.reasoning.
115
+ * Extracting from reasoning_details would cause duplication.
116
+ * The reasoning_details is only used for:
117
+ * 1. Detecting reasoning mode in handleReasoning()
118
+ * 2. Final message storage (for thought signatures)
119
+ */
120
+ if (provider === Providers.OPENROUTER) {
121
+ // Content presence signals end of reasoning phase - prefer content over reasoning
122
+ // This handles transitional chunks that may have both reasoning and content
123
+ if (typeof chunk?.content === 'string' && chunk.content !== '') {
124
+ return chunk.content;
125
+ }
126
+ const reasoning = chunk?.additional_kwargs?.reasoning as string | undefined;
127
+ if (reasoning != null && reasoning !== '') {
128
+ return reasoning;
129
+ }
130
+ return chunk?.content;
131
+ }
132
+ return (
133
+ ((chunk?.additional_kwargs?.[reasoningKey] as string | undefined) ?? '') ||
134
+ chunk?.content
135
+ );
136
+ }
137
+
138
+ export class ChatModelStreamHandler implements t.EventHandler {
139
+ async handle(
140
+ event: string,
141
+ data: t.StreamEventData,
142
+ metadata?: Record<string, unknown>,
143
+ graph?: StandardGraph
144
+ ): Promise<void> {
145
+ if (!graph) {
146
+ throw new Error('Graph not found');
147
+ }
148
+ if (!graph.config) {
149
+ throw new Error('Config not found in graph');
150
+ }
151
+ if (!data.chunk) {
152
+ console.warn(`No chunk found in ${event} event`);
153
+ return;
154
+ }
155
+
156
+ const agentContext = graph.getAgentContext(metadata);
157
+
158
+ const chunk = data.chunk as Partial<AIMessageChunk>;
159
+ const content = getChunkContent({
160
+ chunk,
161
+ reasoningKey: agentContext.reasoningKey,
162
+ provider: agentContext.provider,
163
+ });
164
+ const skipHandling = await handleServerToolResult({
165
+ graph,
166
+ content,
167
+ metadata,
168
+ agentContext,
169
+ });
170
+ if (skipHandling) {
171
+ return;
172
+ }
173
+ this.handleReasoning(chunk, agentContext);
174
+ let hasToolCalls = false;
175
+ if (
176
+ chunk.tool_calls &&
177
+ chunk.tool_calls.length > 0 &&
178
+ chunk.tool_calls.every(
179
+ (tc) =>
180
+ tc.id != null &&
181
+ tc.id !== '' &&
182
+ (tc as Partial<ToolCall>).name != null &&
183
+ tc.name !== ''
184
+ )
185
+ ) {
186
+ hasToolCalls = true;
187
+ await handleToolCalls(chunk.tool_calls, metadata, graph);
188
+ }
189
+
190
+ const hasToolCallChunks =
191
+ (chunk.tool_call_chunks && chunk.tool_call_chunks.length > 0) ?? false;
192
+ const isEmptyContent =
193
+ typeof content === 'undefined' ||
194
+ !content.length ||
195
+ (typeof content === 'string' && !content);
196
+
197
+ /** Set a preliminary message ID if found in empty chunk */
198
+ const isEmptyChunk = isEmptyContent && !hasToolCallChunks;
199
+ if (
200
+ isEmptyChunk &&
201
+ (chunk.id ?? '') !== '' &&
202
+ !graph.prelimMessageIdsByStepKey.has(chunk.id ?? '')
203
+ ) {
204
+ const stepKey = graph.getStepKey(metadata);
205
+ graph.prelimMessageIdsByStepKey.set(stepKey, chunk.id ?? '');
206
+ } else if (isEmptyChunk) {
207
+ return;
208
+ }
209
+
210
+ const stepKey = graph.getStepKey(metadata);
211
+
212
+ if (
213
+ hasToolCallChunks &&
214
+ chunk.tool_call_chunks &&
215
+ chunk.tool_call_chunks.length &&
216
+ typeof chunk.tool_call_chunks[0]?.index === 'number'
217
+ ) {
218
+ await handleToolCallChunks({
219
+ graph,
220
+ stepKey,
221
+ toolCallChunks: chunk.tool_call_chunks,
222
+ metadata,
223
+ });
224
+ }
225
+
226
+ if (isEmptyContent) {
227
+ return;
228
+ }
229
+
230
+ const message_id = getMessageId(stepKey, graph) ?? '';
231
+ if (message_id) {
232
+ await graph.dispatchRunStep(
233
+ stepKey,
234
+ {
235
+ type: StepTypes.MESSAGE_CREATION,
236
+ message_creation: {
237
+ message_id,
238
+ },
239
+ },
240
+ metadata
241
+ );
242
+ }
243
+
244
+ const stepId = graph.getStepIdByKey(stepKey);
245
+ const runStep = graph.getRunStep(stepId);
246
+ if (!runStep) {
247
+ console.warn(`\n
248
+ ==============================================================
249
+
250
+
251
+ Run step for ${stepId} does not exist, cannot dispatch delta event.
252
+
253
+ event: ${event}
254
+ stepId: ${stepId}
255
+ stepKey: ${stepKey}
256
+ message_id: ${message_id}
257
+ hasToolCalls: ${hasToolCalls}
258
+ hasToolCallChunks: ${hasToolCallChunks}
259
+
260
+ ==============================================================
261
+ \n`);
262
+ return;
263
+ }
264
+
265
+ /* Note: tool call chunks may have non-empty content that matches the current tool chunk generation */
266
+ if (typeof content === 'string' && runStep.type === StepTypes.TOOL_CALLS) {
267
+ return;
268
+ } else if (
269
+ hasToolCallChunks &&
270
+ (chunk.tool_call_chunks?.some((tc) => tc.args === content) ?? false)
271
+ ) {
272
+ return;
273
+ } else if (typeof content === 'string') {
274
+ if (agentContext.currentTokenType === ContentTypes.TEXT) {
275
+ await graph.dispatchMessageDelta(stepId, {
276
+ content: [
277
+ {
278
+ type: ContentTypes.TEXT,
279
+ text: content,
280
+ },
281
+ ],
282
+ });
283
+ } else if (agentContext.currentTokenType === 'think_and_text') {
284
+ const { text, thinking } = parseThinkingContent(content);
285
+ if (thinking) {
286
+ await graph.dispatchReasoningDelta(stepId, {
287
+ content: [
288
+ {
289
+ type: ContentTypes.THINK,
290
+ think: thinking,
291
+ },
292
+ ],
293
+ });
294
+ }
295
+ if (text) {
296
+ agentContext.currentTokenType = ContentTypes.TEXT;
297
+ agentContext.tokenTypeSwitch = 'content';
298
+ const newStepKey = graph.getStepKey(metadata);
299
+ const message_id = getMessageId(newStepKey, graph) ?? '';
300
+ await graph.dispatchRunStep(
301
+ newStepKey,
302
+ {
303
+ type: StepTypes.MESSAGE_CREATION,
304
+ message_creation: {
305
+ message_id,
306
+ },
307
+ },
308
+ metadata
309
+ );
310
+
311
+ const newStepId = graph.getStepIdByKey(newStepKey);
312
+ await graph.dispatchMessageDelta(newStepId, {
313
+ content: [
314
+ {
315
+ type: ContentTypes.TEXT,
316
+ text: text,
317
+ },
318
+ ],
319
+ });
320
+ }
321
+ } else {
322
+ await graph.dispatchReasoningDelta(stepId, {
323
+ content: [
324
+ {
325
+ type: ContentTypes.THINK,
326
+ think: content,
327
+ },
328
+ ],
329
+ });
330
+ }
331
+ } else if (
332
+ content.every((c) => c.type?.startsWith(ContentTypes.TEXT) ?? false)
333
+ ) {
334
+ await graph.dispatchMessageDelta(stepId, {
335
+ content,
336
+ });
337
+ } else if (
338
+ content.every(
339
+ (c) =>
340
+ (c.type?.startsWith(ContentTypes.THINKING) ?? false) ||
341
+ (c.type?.startsWith(ContentTypes.REASONING) ?? false) ||
342
+ (c.type?.startsWith(ContentTypes.REASONING_CONTENT) ?? false) ||
343
+ c.type === 'redacted_thinking'
344
+ )
345
+ ) {
346
+ await graph.dispatchReasoningDelta(stepId, {
347
+ content: content.map((c) => ({
348
+ type: ContentTypes.THINK,
349
+ think:
350
+ (c as t.ThinkingContentText).thinking ??
351
+ (c as Partial<t.GoogleReasoningContentText>).reasoning ??
352
+ (c as Partial<t.BedrockReasoningContentText>).reasoningText?.text ??
353
+ '',
354
+ })),
355
+ });
356
+ }
357
+ }
358
+ handleReasoning(
359
+ chunk: Partial<AIMessageChunk>,
360
+ agentContext: AgentContext
361
+ ): void {
362
+ let reasoning_content = chunk.additional_kwargs?.[
363
+ agentContext.reasoningKey
364
+ ] as string | Partial<ChatOpenAIReasoningSummary> | undefined;
365
+ if (
366
+ Array.isArray(chunk.content) &&
367
+ (chunk.content[0]?.type === ContentTypes.THINKING ||
368
+ chunk.content[0]?.type === ContentTypes.REASONING ||
369
+ chunk.content[0]?.type === ContentTypes.REASONING_CONTENT ||
370
+ chunk.content[0]?.type === 'redacted_thinking')
371
+ ) {
372
+ reasoning_content = 'valid';
373
+ } else if (
374
+ (agentContext.provider === Providers.OPENAI ||
375
+ agentContext.provider === Providers.AZURE) &&
376
+ reasoning_content != null &&
377
+ typeof reasoning_content !== 'string' &&
378
+ reasoning_content.summary?.[0]?.text != null &&
379
+ reasoning_content.summary[0].text
380
+ ) {
381
+ reasoning_content = 'valid';
382
+ } else if (
383
+ agentContext.provider === Providers.OPENROUTER &&
384
+ // Only set reasoning as valid if content is NOT present (content signals end of reasoning)
385
+ (chunk.content == null || chunk.content === '') &&
386
+ // Check for reasoning_details (final chunk) OR reasoning string (intermediate chunks)
387
+ ((chunk.additional_kwargs?.reasoning_details != null &&
388
+ Array.isArray(chunk.additional_kwargs.reasoning_details) &&
389
+ chunk.additional_kwargs.reasoning_details.length > 0) ||
390
+ (typeof chunk.additional_kwargs?.reasoning === 'string' &&
391
+ chunk.additional_kwargs.reasoning !== ''))
392
+ ) {
393
+ reasoning_content = 'valid';
394
+ }
395
+ if (
396
+ reasoning_content != null &&
397
+ reasoning_content !== '' &&
398
+ (chunk.content == null ||
399
+ chunk.content === '' ||
400
+ reasoning_content === 'valid')
401
+ ) {
402
+ agentContext.currentTokenType = ContentTypes.THINK;
403
+ agentContext.tokenTypeSwitch = 'reasoning';
404
+ return;
405
+ } else if (
406
+ agentContext.tokenTypeSwitch === 'reasoning' &&
407
+ agentContext.currentTokenType !== ContentTypes.TEXT &&
408
+ ((chunk.content != null && chunk.content !== '') ||
409
+ (chunk.tool_calls?.length ?? 0) > 0 ||
410
+ (chunk.tool_call_chunks?.length ?? 0) > 0)
411
+ ) {
412
+ agentContext.currentTokenType = ContentTypes.TEXT;
413
+ agentContext.tokenTypeSwitch = 'content';
414
+ } else if (
415
+ chunk.content != null &&
416
+ typeof chunk.content === 'string' &&
417
+ chunk.content.includes('<think>') &&
418
+ chunk.content.includes('</think>')
419
+ ) {
420
+ agentContext.currentTokenType = 'think_and_text';
421
+ agentContext.tokenTypeSwitch = 'content';
422
+ } else if (
423
+ chunk.content != null &&
424
+ typeof chunk.content === 'string' &&
425
+ chunk.content.includes('<think>')
426
+ ) {
427
+ agentContext.currentTokenType = ContentTypes.THINK;
428
+ agentContext.tokenTypeSwitch = 'content';
429
+ } else if (
430
+ agentContext.lastToken != null &&
431
+ agentContext.lastToken.includes('</think>')
432
+ ) {
433
+ agentContext.currentTokenType = ContentTypes.TEXT;
434
+ agentContext.tokenTypeSwitch = 'content';
435
+ }
436
+ if (typeof chunk.content !== 'string') {
437
+ return;
438
+ }
439
+ agentContext.lastToken = chunk.content;
440
+ }
441
+ }
442
+
443
+ export function createContentAggregator(): t.ContentAggregatorResult {
444
+ const contentParts: Array<t.MessageContentComplex | undefined> = [];
445
+ const stepMap = new Map<string, t.RunStep>();
446
+ const toolCallIdMap = new Map<string, string>();
447
+ // Track step IDs for structured output tool calls that should be skipped
448
+ const skippedStructuredOutputSteps = new Set<string>();
449
+ // Track agentId and groupId for each content index (applied to content parts)
450
+ const contentMetaMap = new Map<
451
+ number,
452
+ { agentId?: string; groupId?: number }
453
+ >();
454
+
455
+ const updateContent = (
456
+ index: number,
457
+ contentPart?: t.MessageContentComplex,
458
+ finalUpdate = false
459
+ ): void => {
460
+ if (!contentPart) {
461
+ console.warn('No content part found in \'updateContent\'');
462
+ return;
463
+ }
464
+ const partType = contentPart.type ?? '';
465
+ if (!partType) {
466
+ console.warn('No content type found in content part');
467
+ return;
468
+ }
469
+
470
+ if (!contentParts[index]) {
471
+ contentParts[index] = { type: partType };
472
+ }
473
+
474
+ if (!partType.startsWith(contentParts[index]?.type ?? '')) {
475
+ console.warn('Content type mismatch');
476
+ return;
477
+ }
478
+
479
+ if (
480
+ partType.startsWith(ContentTypes.TEXT) &&
481
+ ContentTypes.TEXT in contentPart &&
482
+ typeof contentPart.text === 'string'
483
+ ) {
484
+ // TODO: update this!!
485
+ const currentContent = contentParts[index] as t.MessageDeltaUpdate;
486
+ const update: t.MessageDeltaUpdate = {
487
+ type: ContentTypes.TEXT,
488
+ text: (currentContent.text || '') + contentPart.text,
489
+ };
490
+
491
+ if (contentPart.tool_call_ids) {
492
+ update.tool_call_ids = contentPart.tool_call_ids;
493
+ }
494
+ contentParts[index] = update;
495
+ } else if (
496
+ partType.startsWith(ContentTypes.THINK) &&
497
+ ContentTypes.THINK in contentPart &&
498
+ typeof contentPart.think === 'string'
499
+ ) {
500
+ const currentContent = contentParts[index] as t.ReasoningDeltaUpdate;
501
+ const update: t.ReasoningDeltaUpdate = {
502
+ type: ContentTypes.THINK,
503
+ think: (currentContent.think || '') + contentPart.think,
504
+ };
505
+ contentParts[index] = update;
506
+ } else if (
507
+ partType.startsWith(ContentTypes.AGENT_UPDATE) &&
508
+ ContentTypes.AGENT_UPDATE in contentPart &&
509
+ contentPart.agent_update != null
510
+ ) {
511
+ const update: t.AgentUpdate = {
512
+ type: ContentTypes.AGENT_UPDATE,
513
+ agent_update: contentPart.agent_update,
514
+ };
515
+
516
+ contentParts[index] = update;
517
+ } else if (
518
+ partType === ContentTypes.IMAGE_URL &&
519
+ 'image_url' in contentPart
520
+ ) {
521
+ const currentContent = contentParts[index] as {
522
+ type: 'image_url';
523
+ image_url: string;
524
+ };
525
+ contentParts[index] = {
526
+ ...currentContent,
527
+ };
528
+ } else if (
529
+ partType === ContentTypes.TOOL_CALL &&
530
+ 'tool_call' in contentPart
531
+ ) {
532
+ const incomingName = contentPart.tool_call.name;
533
+ const incomingId = contentPart.tool_call.id;
534
+ const toolCallArgs = (contentPart.tool_call as t.ToolCallPart).args;
535
+
536
+ // When we receive a tool call with a name, it's the complete tool call
537
+ // Consolidate with any previously accumulated args from chunks
538
+ const hasValidName = incomingName != null && incomingName !== '';
539
+
540
+ // Only process if incoming has a valid name (complete tool call)
541
+ // or if we're doing a final update with complete data
542
+ if (!hasValidName && !finalUpdate) {
543
+ return;
544
+ }
545
+
546
+ const existingContent = contentParts[index] as
547
+ | (Omit<t.ToolCallContent, 'tool_call'> & {
548
+ tool_call?: t.ToolCallPart;
549
+ })
550
+ | undefined;
551
+
552
+ /** When args are a valid object, they are likely already invoked */
553
+ let args =
554
+ finalUpdate ||
555
+ typeof existingContent?.tool_call?.args === 'object' ||
556
+ typeof toolCallArgs === 'object'
557
+ ? contentPart.tool_call.args
558
+ : (existingContent?.tool_call?.args ?? '') + (toolCallArgs ?? '');
559
+ if (
560
+ finalUpdate &&
561
+ args == null &&
562
+ existingContent?.tool_call?.args != null
563
+ ) {
564
+ args = existingContent.tool_call.args;
565
+ }
566
+
567
+ const id =
568
+ getNonEmptyValue([incomingId, existingContent?.tool_call?.id]) ?? '';
569
+ const name =
570
+ getNonEmptyValue([incomingName, existingContent?.tool_call?.name]) ??
571
+ '';
572
+
573
+ const newToolCall: ToolCall & t.PartMetadata = {
574
+ id,
575
+ name,
576
+ args,
577
+ type: ToolCallTypes.TOOL_CALL,
578
+ };
579
+
580
+ if (finalUpdate) {
581
+ newToolCall.progress = 1;
582
+ newToolCall.output = contentPart.tool_call.output;
583
+ }
584
+
585
+ contentParts[index] = {
586
+ type: ContentTypes.TOOL_CALL,
587
+ tool_call: newToolCall,
588
+ };
589
+ }
590
+
591
+ // Apply agentId (for MultiAgentGraph) and groupId (for parallel execution) to content parts
592
+ // - agentId present → MultiAgentGraph (show agent labels)
593
+ // - groupId present → parallel execution (render columns)
594
+ const meta = contentMetaMap.get(index);
595
+ if (meta?.agentId != null) {
596
+ (contentParts[index] as t.MessageContentComplex).agentId = meta.agentId;
597
+ }
598
+ if (meta?.groupId != null) {
599
+ (contentParts[index] as t.MessageContentComplex).groupId = meta.groupId;
600
+ }
601
+ };
602
+
603
+ const aggregateContent = ({
604
+ event,
605
+ data,
606
+ }: {
607
+ event: GraphEvents;
608
+ data:
609
+ | t.RunStep
610
+ | t.AgentUpdate
611
+ | t.MessageDeltaEvent
612
+ | t.RunStepDeltaEvent
613
+ | { result: t.ToolEndEvent }
614
+ | { structuredResponse: Record<string, unknown>; schema: Record<string, unknown> };
615
+ }): void => {
616
+ // Handle structured output - add the JSON response as a text content part
617
+ if (event === GraphEvents.ON_STRUCTURED_OUTPUT) {
618
+ const structuredData = data as { structuredResponse: Record<string, unknown>; schema: Record<string, unknown> };
619
+ if (structuredData.structuredResponse) {
620
+ const contentPart: t.MessageContentComplex = {
621
+ type: ContentTypes.TEXT,
622
+ text: JSON.stringify(structuredData.structuredResponse, null, 2),
623
+ };
624
+ // Use the next available index
625
+ const nextIndex = contentParts.length;
626
+ updateContent(nextIndex, contentPart);
627
+ }
628
+ return;
629
+ }
630
+
631
+ if (event === GraphEvents.ON_RUN_STEP) {
632
+ const runStep = data as t.RunStep;
633
+ stepMap.set(runStep.id, runStep);
634
+
635
+ // Track agentId (MultiAgentGraph) and groupId (parallel execution) separately
636
+ // - agentId: present for all MultiAgentGraph runs (enables agent labels in UI)
637
+ // - groupId: present only for parallel execution (enables column rendering)
638
+ const hasAgentId = runStep.agentId != null && runStep.agentId !== '';
639
+ const hasGroupId = runStep.groupId != null;
640
+ if (hasAgentId || hasGroupId) {
641
+ const existingMeta = contentMetaMap.get(runStep.index) ?? {};
642
+ if (hasAgentId) {
643
+ existingMeta.agentId = runStep.agentId;
644
+ }
645
+ if (hasGroupId) {
646
+ existingMeta.groupId = runStep.groupId;
647
+ }
648
+ contentMetaMap.set(runStep.index, existingMeta);
649
+ }
650
+
651
+ // Store tool call IDs if present
652
+ if (
653
+ runStep.stepDetails.type === StepTypes.TOOL_CALLS &&
654
+ runStep.stepDetails.tool_calls
655
+ ) {
656
+ // Check if ALL tool calls are structured output tool calls
657
+ const toolCalls = runStep.stepDetails.tool_calls as ToolCall[];
658
+ const allAreStructuredOutput = toolCalls.every((toolCall) => {
659
+ const toolName = toolCall.name?.toLowerCase() ?? '';
660
+ return (
661
+ toolName === 'response' ||
662
+ toolName === 'structuredresponse' ||
663
+ toolName === 'structured_response'
664
+ );
665
+ });
666
+
667
+ // If all tool calls are structured output, skip this entire step
668
+ if (allAreStructuredOutput) {
669
+ skippedStructuredOutputSteps.add(runStep.id);
670
+ return;
671
+ }
672
+
673
+ toolCalls.forEach((toolCall) => {
674
+ // Skip structured output tool calls - these are synthetic tool calls
675
+ // used by withStructuredOutput() to extract JSON, not real tools
676
+ const toolName = toolCall.name?.toLowerCase() ?? '';
677
+ if (
678
+ toolName === 'response' ||
679
+ toolName === 'structuredresponse' ||
680
+ toolName === 'structured_response'
681
+ ) {
682
+ return;
683
+ }
684
+
685
+ const toolCallId = toolCall.id ?? '';
686
+ if ('id' in toolCall && toolCallId) {
687
+ toolCallIdMap.set(runStep.id, toolCallId);
688
+ }
689
+ const contentPart: t.MessageContentComplex = {
690
+ type: ContentTypes.TOOL_CALL,
691
+ tool_call: {
692
+ args: toolCall.args,
693
+ name: toolCall.name,
694
+ id: toolCallId,
695
+ },
696
+ };
697
+
698
+ updateContent(runStep.index, contentPart);
699
+ });
700
+ }
701
+ } else if (event === GraphEvents.ON_MESSAGE_DELTA) {
702
+ const messageDelta = data as t.MessageDeltaEvent;
703
+ const runStep = stepMap.get(messageDelta.id);
704
+ if (!runStep) {
705
+ console.warn('No run step or runId found for message delta event');
706
+ return;
707
+ }
708
+
709
+ if (messageDelta.delta.content) {
710
+ const contentPart = Array.isArray(messageDelta.delta.content)
711
+ ? messageDelta.delta.content[0]
712
+ : messageDelta.delta.content;
713
+
714
+ updateContent(runStep.index, contentPart);
715
+ }
716
+ } else if (
717
+ event === GraphEvents.ON_AGENT_UPDATE &&
718
+ (data as t.AgentUpdate | undefined)?.agent_update
719
+ ) {
720
+ const contentPart = data as t.AgentUpdate | undefined;
721
+ if (!contentPart) {
722
+ return;
723
+ }
724
+ updateContent(contentPart.agent_update.index, contentPart);
725
+ } else if (event === GraphEvents.ON_REASONING_DELTA) {
726
+ const reasoningDelta = data as t.ReasoningDeltaEvent;
727
+ const runStep = stepMap.get(reasoningDelta.id);
728
+ if (!runStep) {
729
+ console.warn('No run step or runId found for reasoning delta event');
730
+ return;
731
+ }
732
+
733
+ if (reasoningDelta.delta.content) {
734
+ const contentPart = Array.isArray(reasoningDelta.delta.content)
735
+ ? reasoningDelta.delta.content[0]
736
+ : reasoningDelta.delta.content;
737
+
738
+ updateContent(runStep.index, contentPart);
739
+ }
740
+ } else if (event === GraphEvents.ON_RUN_STEP_DELTA) {
741
+ const runStepDelta = data as t.RunStepDeltaEvent;
742
+
743
+ // Skip deltas for structured output tool calls
744
+ if (skippedStructuredOutputSteps.has(runStepDelta.id)) {
745
+ return;
746
+ }
747
+
748
+ const runStep = stepMap.get(runStepDelta.id);
749
+ if (!runStep) {
750
+ console.warn('No run step or runId found for run step delta event');
751
+ return;
752
+ }
753
+
754
+ if (
755
+ runStepDelta.delta.type === StepTypes.TOOL_CALLS &&
756
+ runStepDelta.delta.tool_calls
757
+ ) {
758
+ runStepDelta.delta.tool_calls.forEach((toolCallDelta) => {
759
+ const toolCallId = toolCallIdMap.get(runStepDelta.id);
760
+
761
+ const contentPart: t.MessageContentComplex = {
762
+ type: ContentTypes.TOOL_CALL,
763
+ tool_call: {
764
+ args: toolCallDelta.args ?? '',
765
+ name: toolCallDelta.name,
766
+ id: toolCallId,
767
+ },
768
+ };
769
+
770
+ updateContent(runStep.index, contentPart);
771
+ });
772
+ }
773
+ } else if (event === GraphEvents.ON_RUN_STEP_COMPLETED) {
774
+ const { result } = data as unknown as { result: t.ToolEndEvent };
775
+
776
+ const { id: stepId } = result;
777
+
778
+ // Skip completion events for structured output tool calls
779
+ if (skippedStructuredOutputSteps.has(stepId)) {
780
+ return;
781
+ }
782
+
783
+ const runStep = stepMap.get(stepId);
784
+ if (!runStep) {
785
+ console.warn(
786
+ 'No run step or runId found for completed tool call event'
787
+ );
788
+ return;
789
+ }
790
+
791
+ const contentPart: t.MessageContentComplex = {
792
+ type: ContentTypes.TOOL_CALL,
793
+ tool_call: result.tool_call,
794
+ };
795
+
796
+ updateContent(runStep.index, contentPart, true);
797
+ }
798
+ };
799
+
800
+ return { contentParts, aggregateContent, stepMap };
801
+ }