illuma-agents 1.0.2

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 (437) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/common/enum.cjs +163 -0
  3. package/dist/cjs/common/enum.cjs.map +1 -0
  4. package/dist/cjs/events.cjs +143 -0
  5. package/dist/cjs/events.cjs.map +1 -0
  6. package/dist/cjs/graphs/Graph.cjs +581 -0
  7. package/dist/cjs/graphs/Graph.cjs.map +1 -0
  8. package/dist/cjs/instrumentation.cjs +21 -0
  9. package/dist/cjs/instrumentation.cjs.map +1 -0
  10. package/dist/cjs/llm/anthropic/index.cjs +292 -0
  11. package/dist/cjs/llm/anthropic/index.cjs.map +1 -0
  12. package/dist/cjs/llm/anthropic/types.cjs +50 -0
  13. package/dist/cjs/llm/anthropic/types.cjs.map +1 -0
  14. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +553 -0
  15. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -0
  16. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +218 -0
  17. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -0
  18. package/dist/cjs/llm/anthropic/utils/tools.cjs +29 -0
  19. package/dist/cjs/llm/anthropic/utils/tools.cjs.map +1 -0
  20. package/dist/cjs/llm/fake.cjs +97 -0
  21. package/dist/cjs/llm/fake.cjs.map +1 -0
  22. package/dist/cjs/llm/google/index.cjs +147 -0
  23. package/dist/cjs/llm/google/index.cjs.map +1 -0
  24. package/dist/cjs/llm/google/utils/common.cjs +490 -0
  25. package/dist/cjs/llm/google/utils/common.cjs.map +1 -0
  26. package/dist/cjs/llm/ollama/index.cjs +70 -0
  27. package/dist/cjs/llm/ollama/index.cjs.map +1 -0
  28. package/dist/cjs/llm/ollama/utils.cjs +158 -0
  29. package/dist/cjs/llm/ollama/utils.cjs.map +1 -0
  30. package/dist/cjs/llm/openai/index.cjs +613 -0
  31. package/dist/cjs/llm/openai/index.cjs.map +1 -0
  32. package/dist/cjs/llm/openai/utils/index.cjs +677 -0
  33. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -0
  34. package/dist/cjs/llm/openrouter/index.cjs +29 -0
  35. package/dist/cjs/llm/openrouter/index.cjs.map +1 -0
  36. package/dist/cjs/llm/providers.cjs +47 -0
  37. package/dist/cjs/llm/providers.cjs.map +1 -0
  38. package/dist/cjs/llm/text.cjs +69 -0
  39. package/dist/cjs/llm/text.cjs.map +1 -0
  40. package/dist/cjs/llm/vertexai/index.cjs +330 -0
  41. package/dist/cjs/llm/vertexai/index.cjs.map +1 -0
  42. package/dist/cjs/main.cjs +127 -0
  43. package/dist/cjs/main.cjs.map +1 -0
  44. package/dist/cjs/messages/core.cjs +359 -0
  45. package/dist/cjs/messages/core.cjs.map +1 -0
  46. package/dist/cjs/messages/format.cjs +455 -0
  47. package/dist/cjs/messages/format.cjs.map +1 -0
  48. package/dist/cjs/messages/ids.cjs +23 -0
  49. package/dist/cjs/messages/ids.cjs.map +1 -0
  50. package/dist/cjs/messages/prune.cjs +398 -0
  51. package/dist/cjs/messages/prune.cjs.map +1 -0
  52. package/dist/cjs/run.cjs +264 -0
  53. package/dist/cjs/run.cjs.map +1 -0
  54. package/dist/cjs/splitStream.cjs +210 -0
  55. package/dist/cjs/splitStream.cjs.map +1 -0
  56. package/dist/cjs/stream.cjs +504 -0
  57. package/dist/cjs/stream.cjs.map +1 -0
  58. package/dist/cjs/tools/CodeExecutor.cjs +192 -0
  59. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -0
  60. package/dist/cjs/tools/ToolNode.cjs +125 -0
  61. package/dist/cjs/tools/ToolNode.cjs.map +1 -0
  62. package/dist/cjs/tools/handlers.cjs +250 -0
  63. package/dist/cjs/tools/handlers.cjs.map +1 -0
  64. package/dist/cjs/tools/search/anthropic.cjs +40 -0
  65. package/dist/cjs/tools/search/anthropic.cjs.map +1 -0
  66. package/dist/cjs/tools/search/content.cjs +140 -0
  67. package/dist/cjs/tools/search/content.cjs.map +1 -0
  68. package/dist/cjs/tools/search/firecrawl.cjs +179 -0
  69. package/dist/cjs/tools/search/firecrawl.cjs.map +1 -0
  70. package/dist/cjs/tools/search/format.cjs +203 -0
  71. package/dist/cjs/tools/search/format.cjs.map +1 -0
  72. package/dist/cjs/tools/search/highlights.cjs +245 -0
  73. package/dist/cjs/tools/search/highlights.cjs.map +1 -0
  74. package/dist/cjs/tools/search/rerankers.cjs +174 -0
  75. package/dist/cjs/tools/search/rerankers.cjs.map +1 -0
  76. package/dist/cjs/tools/search/schema.cjs +70 -0
  77. package/dist/cjs/tools/search/schema.cjs.map +1 -0
  78. package/dist/cjs/tools/search/search.cjs +561 -0
  79. package/dist/cjs/tools/search/search.cjs.map +1 -0
  80. package/dist/cjs/tools/search/serper-scraper.cjs +132 -0
  81. package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -0
  82. package/dist/cjs/tools/search/tool.cjs +331 -0
  83. package/dist/cjs/tools/search/tool.cjs.map +1 -0
  84. package/dist/cjs/tools/search/utils.cjs +66 -0
  85. package/dist/cjs/tools/search/utils.cjs.map +1 -0
  86. package/dist/cjs/utils/graph.cjs +16 -0
  87. package/dist/cjs/utils/graph.cjs.map +1 -0
  88. package/dist/cjs/utils/llm.cjs +28 -0
  89. package/dist/cjs/utils/llm.cjs.map +1 -0
  90. package/dist/cjs/utils/misc.cjs +56 -0
  91. package/dist/cjs/utils/misc.cjs.map +1 -0
  92. package/dist/cjs/utils/run.cjs +69 -0
  93. package/dist/cjs/utils/run.cjs.map +1 -0
  94. package/dist/cjs/utils/title.cjs +111 -0
  95. package/dist/cjs/utils/title.cjs.map +1 -0
  96. package/dist/cjs/utils/tokens.cjs +65 -0
  97. package/dist/cjs/utils/tokens.cjs.map +1 -0
  98. package/dist/esm/common/enum.mjs +163 -0
  99. package/dist/esm/common/enum.mjs.map +1 -0
  100. package/dist/esm/events.mjs +135 -0
  101. package/dist/esm/events.mjs.map +1 -0
  102. package/dist/esm/graphs/Graph.mjs +578 -0
  103. package/dist/esm/graphs/Graph.mjs.map +1 -0
  104. package/dist/esm/instrumentation.mjs +19 -0
  105. package/dist/esm/instrumentation.mjs.map +1 -0
  106. package/dist/esm/llm/anthropic/index.mjs +290 -0
  107. package/dist/esm/llm/anthropic/index.mjs.map +1 -0
  108. package/dist/esm/llm/anthropic/types.mjs +48 -0
  109. package/dist/esm/llm/anthropic/types.mjs.map +1 -0
  110. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +550 -0
  111. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -0
  112. package/dist/esm/llm/anthropic/utils/message_outputs.mjs +216 -0
  113. package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -0
  114. package/dist/esm/llm/anthropic/utils/tools.mjs +27 -0
  115. package/dist/esm/llm/anthropic/utils/tools.mjs.map +1 -0
  116. package/dist/esm/llm/fake.mjs +94 -0
  117. package/dist/esm/llm/fake.mjs.map +1 -0
  118. package/dist/esm/llm/google/index.mjs +145 -0
  119. package/dist/esm/llm/google/index.mjs.map +1 -0
  120. package/dist/esm/llm/google/utils/common.mjs +484 -0
  121. package/dist/esm/llm/google/utils/common.mjs.map +1 -0
  122. package/dist/esm/llm/ollama/index.mjs +68 -0
  123. package/dist/esm/llm/ollama/index.mjs.map +1 -0
  124. package/dist/esm/llm/ollama/utils.mjs +155 -0
  125. package/dist/esm/llm/ollama/utils.mjs.map +1 -0
  126. package/dist/esm/llm/openai/index.mjs +604 -0
  127. package/dist/esm/llm/openai/index.mjs.map +1 -0
  128. package/dist/esm/llm/openai/utils/index.mjs +671 -0
  129. package/dist/esm/llm/openai/utils/index.mjs.map +1 -0
  130. package/dist/esm/llm/openrouter/index.mjs +27 -0
  131. package/dist/esm/llm/openrouter/index.mjs.map +1 -0
  132. package/dist/esm/llm/providers.mjs +43 -0
  133. package/dist/esm/llm/providers.mjs.map +1 -0
  134. package/dist/esm/llm/text.mjs +67 -0
  135. package/dist/esm/llm/text.mjs.map +1 -0
  136. package/dist/esm/llm/vertexai/index.mjs +328 -0
  137. package/dist/esm/llm/vertexai/index.mjs.map +1 -0
  138. package/dist/esm/main.mjs +20 -0
  139. package/dist/esm/main.mjs.map +1 -0
  140. package/dist/esm/messages/core.mjs +351 -0
  141. package/dist/esm/messages/core.mjs.map +1 -0
  142. package/dist/esm/messages/format.mjs +447 -0
  143. package/dist/esm/messages/format.mjs.map +1 -0
  144. package/dist/esm/messages/ids.mjs +21 -0
  145. package/dist/esm/messages/ids.mjs.map +1 -0
  146. package/dist/esm/messages/prune.mjs +393 -0
  147. package/dist/esm/messages/prune.mjs.map +1 -0
  148. package/dist/esm/run.mjs +261 -0
  149. package/dist/esm/run.mjs.map +1 -0
  150. package/dist/esm/splitStream.mjs +207 -0
  151. package/dist/esm/splitStream.mjs.map +1 -0
  152. package/dist/esm/stream.mjs +500 -0
  153. package/dist/esm/stream.mjs.map +1 -0
  154. package/dist/esm/tools/CodeExecutor.mjs +188 -0
  155. package/dist/esm/tools/CodeExecutor.mjs.map +1 -0
  156. package/dist/esm/tools/ToolNode.mjs +122 -0
  157. package/dist/esm/tools/ToolNode.mjs.map +1 -0
  158. package/dist/esm/tools/handlers.mjs +245 -0
  159. package/dist/esm/tools/handlers.mjs.map +1 -0
  160. package/dist/esm/tools/search/anthropic.mjs +37 -0
  161. package/dist/esm/tools/search/anthropic.mjs.map +1 -0
  162. package/dist/esm/tools/search/content.mjs +119 -0
  163. package/dist/esm/tools/search/content.mjs.map +1 -0
  164. package/dist/esm/tools/search/firecrawl.mjs +176 -0
  165. package/dist/esm/tools/search/firecrawl.mjs.map +1 -0
  166. package/dist/esm/tools/search/format.mjs +201 -0
  167. package/dist/esm/tools/search/format.mjs.map +1 -0
  168. package/dist/esm/tools/search/highlights.mjs +243 -0
  169. package/dist/esm/tools/search/highlights.mjs.map +1 -0
  170. package/dist/esm/tools/search/rerankers.mjs +168 -0
  171. package/dist/esm/tools/search/rerankers.mjs.map +1 -0
  172. package/dist/esm/tools/search/schema.mjs +61 -0
  173. package/dist/esm/tools/search/schema.mjs.map +1 -0
  174. package/dist/esm/tools/search/search.mjs +558 -0
  175. package/dist/esm/tools/search/search.mjs.map +1 -0
  176. package/dist/esm/tools/search/serper-scraper.mjs +129 -0
  177. package/dist/esm/tools/search/serper-scraper.mjs.map +1 -0
  178. package/dist/esm/tools/search/tool.mjs +329 -0
  179. package/dist/esm/tools/search/tool.mjs.map +1 -0
  180. package/dist/esm/tools/search/utils.mjs +61 -0
  181. package/dist/esm/tools/search/utils.mjs.map +1 -0
  182. package/dist/esm/utils/graph.mjs +13 -0
  183. package/dist/esm/utils/graph.mjs.map +1 -0
  184. package/dist/esm/utils/llm.mjs +25 -0
  185. package/dist/esm/utils/llm.mjs.map +1 -0
  186. package/dist/esm/utils/misc.mjs +53 -0
  187. package/dist/esm/utils/misc.mjs.map +1 -0
  188. package/dist/esm/utils/run.mjs +66 -0
  189. package/dist/esm/utils/run.mjs.map +1 -0
  190. package/dist/esm/utils/title.mjs +108 -0
  191. package/dist/esm/utils/title.mjs.map +1 -0
  192. package/dist/esm/utils/tokens.mjs +62 -0
  193. package/dist/esm/utils/tokens.mjs.map +1 -0
  194. package/dist/types/common/enum.d.ts +128 -0
  195. package/dist/types/common/index.d.ts +1 -0
  196. package/dist/types/events.d.ts +29 -0
  197. package/dist/types/graphs/Graph.d.ts +122 -0
  198. package/dist/types/graphs/index.d.ts +1 -0
  199. package/dist/types/index.d.ts +13 -0
  200. package/dist/types/instrumentation.d.ts +1 -0
  201. package/dist/types/llm/anthropic/index.d.ts +39 -0
  202. package/dist/types/llm/anthropic/types.d.ts +37 -0
  203. package/dist/types/llm/anthropic/utils/message_inputs.d.ts +14 -0
  204. package/dist/types/llm/anthropic/utils/message_outputs.d.ts +14 -0
  205. package/dist/types/llm/anthropic/utils/output_parsers.d.ts +22 -0
  206. package/dist/types/llm/anthropic/utils/tools.d.ts +3 -0
  207. package/dist/types/llm/fake.d.ts +31 -0
  208. package/dist/types/llm/google/index.d.ts +14 -0
  209. package/dist/types/llm/google/types.d.ts +32 -0
  210. package/dist/types/llm/google/utils/common.d.ts +19 -0
  211. package/dist/types/llm/google/utils/tools.d.ts +10 -0
  212. package/dist/types/llm/google/utils/zod_to_genai_parameters.d.ts +14 -0
  213. package/dist/types/llm/ollama/index.d.ts +8 -0
  214. package/dist/types/llm/ollama/utils.d.ts +7 -0
  215. package/dist/types/llm/openai/index.d.ts +103 -0
  216. package/dist/types/llm/openai/types.d.ts +10 -0
  217. package/dist/types/llm/openai/utils/index.d.ts +20 -0
  218. package/dist/types/llm/openrouter/index.d.ts +12 -0
  219. package/dist/types/llm/providers.d.ts +5 -0
  220. package/dist/types/llm/text.d.ts +21 -0
  221. package/dist/types/llm/vertexai/index.d.ts +293 -0
  222. package/dist/types/messages/core.d.ts +14 -0
  223. package/dist/types/messages/format.d.ts +113 -0
  224. package/dist/types/messages/ids.d.ts +3 -0
  225. package/dist/types/messages/index.d.ts +4 -0
  226. package/dist/types/messages/prune.d.ts +51 -0
  227. package/dist/types/mockStream.d.ts +32 -0
  228. package/dist/types/prompts/collab.d.ts +1 -0
  229. package/dist/types/prompts/index.d.ts +2 -0
  230. package/dist/types/prompts/taskmanager.d.ts +41 -0
  231. package/dist/types/run.d.ts +30 -0
  232. package/dist/types/scripts/abort.d.ts +1 -0
  233. package/dist/types/scripts/ant_web_search.d.ts +1 -0
  234. package/dist/types/scripts/args.d.ts +7 -0
  235. package/dist/types/scripts/caching.d.ts +1 -0
  236. package/dist/types/scripts/cli.d.ts +1 -0
  237. package/dist/types/scripts/cli2.d.ts +1 -0
  238. package/dist/types/scripts/cli3.d.ts +1 -0
  239. package/dist/types/scripts/cli4.d.ts +1 -0
  240. package/dist/types/scripts/cli5.d.ts +1 -0
  241. package/dist/types/scripts/code_exec.d.ts +1 -0
  242. package/dist/types/scripts/code_exec_files.d.ts +1 -0
  243. package/dist/types/scripts/code_exec_simple.d.ts +1 -0
  244. package/dist/types/scripts/content.d.ts +1 -0
  245. package/dist/types/scripts/empty_input.d.ts +1 -0
  246. package/dist/types/scripts/image.d.ts +1 -0
  247. package/dist/types/scripts/memory.d.ts +1 -0
  248. package/dist/types/scripts/search.d.ts +1 -0
  249. package/dist/types/scripts/simple.d.ts +1 -0
  250. package/dist/types/scripts/stream.d.ts +1 -0
  251. package/dist/types/scripts/thinking.d.ts +1 -0
  252. package/dist/types/scripts/tools.d.ts +1 -0
  253. package/dist/types/specs/spec.utils.d.ts +1 -0
  254. package/dist/types/splitStream.d.ts +37 -0
  255. package/dist/types/stream.d.ts +14 -0
  256. package/dist/types/tools/CodeExecutor.d.ts +23 -0
  257. package/dist/types/tools/ToolNode.d.ts +22 -0
  258. package/dist/types/tools/example.d.ts +78 -0
  259. package/dist/types/tools/handlers.d.ts +19 -0
  260. package/dist/types/tools/search/anthropic.d.ts +16 -0
  261. package/dist/types/tools/search/content.d.ts +4 -0
  262. package/dist/types/tools/search/firecrawl.d.ts +54 -0
  263. package/dist/types/tools/search/format.d.ts +5 -0
  264. package/dist/types/tools/search/highlights.d.ts +13 -0
  265. package/dist/types/tools/search/index.d.ts +2 -0
  266. package/dist/types/tools/search/rerankers.d.ts +38 -0
  267. package/dist/types/tools/search/schema.d.ts +16 -0
  268. package/dist/types/tools/search/search.d.ts +8 -0
  269. package/dist/types/tools/search/serper-scraper.d.ts +59 -0
  270. package/dist/types/tools/search/test.d.ts +1 -0
  271. package/dist/types/tools/search/tool.d.ts +54 -0
  272. package/dist/types/tools/search/types.d.ts +591 -0
  273. package/dist/types/tools/search/utils.d.ts +10 -0
  274. package/dist/types/types/graph.d.ts +138 -0
  275. package/dist/types/types/index.d.ts +5 -0
  276. package/dist/types/types/llm.d.ts +102 -0
  277. package/dist/types/types/run.d.ts +74 -0
  278. package/dist/types/types/stream.d.ts +293 -0
  279. package/dist/types/types/tools.d.ts +61 -0
  280. package/dist/types/utils/graph.d.ts +2 -0
  281. package/dist/types/utils/index.d.ts +5 -0
  282. package/dist/types/utils/llm.d.ts +3 -0
  283. package/dist/types/utils/llmConfig.d.ts +3 -0
  284. package/dist/types/utils/logging.d.ts +1 -0
  285. package/dist/types/utils/misc.d.ts +7 -0
  286. package/dist/types/utils/run.d.ts +27 -0
  287. package/dist/types/utils/title.d.ts +4 -0
  288. package/dist/types/utils/tokens.d.ts +3 -0
  289. package/package.json +145 -0
  290. package/src/common/enum.ts +176 -0
  291. package/src/common/index.ts +2 -0
  292. package/src/events.ts +191 -0
  293. package/src/graphs/Graph.ts +846 -0
  294. package/src/graphs/index.ts +1 -0
  295. package/src/index.ts +24 -0
  296. package/src/instrumentation.ts +22 -0
  297. package/src/llm/anthropic/Jacob_Lee_Resume_2023.pdf +0 -0
  298. package/src/llm/anthropic/index.ts +413 -0
  299. package/src/llm/anthropic/llm.spec.ts +1442 -0
  300. package/src/llm/anthropic/types.ts +140 -0
  301. package/src/llm/anthropic/utils/message_inputs.ts +660 -0
  302. package/src/llm/anthropic/utils/message_outputs.ts +289 -0
  303. package/src/llm/anthropic/utils/output_parsers.ts +133 -0
  304. package/src/llm/anthropic/utils/tools.ts +29 -0
  305. package/src/llm/fake.ts +133 -0
  306. package/src/llm/google/index.ts +222 -0
  307. package/src/llm/google/types.ts +43 -0
  308. package/src/llm/google/utils/common.ts +660 -0
  309. package/src/llm/google/utils/tools.ts +160 -0
  310. package/src/llm/google/utils/zod_to_genai_parameters.ts +88 -0
  311. package/src/llm/ollama/index.ts +92 -0
  312. package/src/llm/ollama/utils.ts +193 -0
  313. package/src/llm/openai/index.ts +853 -0
  314. package/src/llm/openai/types.ts +24 -0
  315. package/src/llm/openai/utils/index.ts +918 -0
  316. package/src/llm/openai/utils/isReasoningModel.test.ts +90 -0
  317. package/src/llm/openrouter/index.ts +60 -0
  318. package/src/llm/providers.ts +57 -0
  319. package/src/llm/text.ts +94 -0
  320. package/src/llm/vertexai/index.ts +360 -0
  321. package/src/messages/core.ts +463 -0
  322. package/src/messages/format.ts +625 -0
  323. package/src/messages/formatAgentMessages.test.ts +917 -0
  324. package/src/messages/formatAgentMessages.tools.test.ts +400 -0
  325. package/src/messages/formatMessage.test.ts +693 -0
  326. package/src/messages/ids.ts +26 -0
  327. package/src/messages/index.ts +4 -0
  328. package/src/messages/prune.ts +567 -0
  329. package/src/messages/shiftIndexTokenCountMap.test.ts +81 -0
  330. package/src/mockStream.ts +99 -0
  331. package/src/prompts/collab.ts +6 -0
  332. package/src/prompts/index.ts +2 -0
  333. package/src/prompts/taskmanager.ts +61 -0
  334. package/src/proto/CollabGraph.ts +269 -0
  335. package/src/proto/TaskManager.ts +243 -0
  336. package/src/proto/collab.ts +200 -0
  337. package/src/proto/collab_design.ts +184 -0
  338. package/src/proto/collab_design_v2.ts +224 -0
  339. package/src/proto/collab_design_v3.ts +255 -0
  340. package/src/proto/collab_design_v4.ts +220 -0
  341. package/src/proto/collab_design_v5.ts +251 -0
  342. package/src/proto/collab_graph.ts +181 -0
  343. package/src/proto/collab_original.ts +123 -0
  344. package/src/proto/example.ts +93 -0
  345. package/src/proto/example_new.ts +68 -0
  346. package/src/proto/example_old.ts +201 -0
  347. package/src/proto/example_test.ts +152 -0
  348. package/src/proto/example_test_anthropic.ts +100 -0
  349. package/src/proto/log_stream.ts +202 -0
  350. package/src/proto/main_collab_community_event.ts +133 -0
  351. package/src/proto/main_collab_design_v2.ts +96 -0
  352. package/src/proto/main_collab_design_v4.ts +100 -0
  353. package/src/proto/main_collab_design_v5.ts +135 -0
  354. package/src/proto/main_collab_global_analysis.ts +122 -0
  355. package/src/proto/main_collab_hackathon_event.ts +153 -0
  356. package/src/proto/main_collab_space_mission.ts +153 -0
  357. package/src/proto/main_philosophy.ts +210 -0
  358. package/src/proto/original_script.ts +126 -0
  359. package/src/proto/standard.ts +100 -0
  360. package/src/proto/stream.ts +56 -0
  361. package/src/proto/tasks.ts +118 -0
  362. package/src/proto/tools/global_analysis_tools.ts +86 -0
  363. package/src/proto/tools/space_mission_tools.ts +60 -0
  364. package/src/proto/vertexai.ts +54 -0
  365. package/src/run.ts +381 -0
  366. package/src/scripts/abort.ts +138 -0
  367. package/src/scripts/ant_web_search.ts +158 -0
  368. package/src/scripts/args.ts +48 -0
  369. package/src/scripts/caching.ts +124 -0
  370. package/src/scripts/cli.ts +167 -0
  371. package/src/scripts/cli2.ts +125 -0
  372. package/src/scripts/cli3.ts +178 -0
  373. package/src/scripts/cli4.ts +184 -0
  374. package/src/scripts/cli5.ts +184 -0
  375. package/src/scripts/code_exec.ts +214 -0
  376. package/src/scripts/code_exec_files.ts +193 -0
  377. package/src/scripts/code_exec_simple.ts +129 -0
  378. package/src/scripts/content.ts +120 -0
  379. package/src/scripts/empty_input.ts +137 -0
  380. package/src/scripts/image.ts +178 -0
  381. package/src/scripts/memory.ts +97 -0
  382. package/src/scripts/search.ts +150 -0
  383. package/src/scripts/simple.ts +225 -0
  384. package/src/scripts/stream.ts +122 -0
  385. package/src/scripts/thinking.ts +150 -0
  386. package/src/scripts/tools.ts +155 -0
  387. package/src/specs/anthropic.simple.test.ts +317 -0
  388. package/src/specs/azure.simple.test.ts +316 -0
  389. package/src/specs/openai.simple.test.ts +316 -0
  390. package/src/specs/prune.test.ts +763 -0
  391. package/src/specs/reasoning.test.ts +165 -0
  392. package/src/specs/spec.utils.ts +3 -0
  393. package/src/specs/thinking-prune.test.ts +703 -0
  394. package/src/specs/token-distribution-edge-case.test.ts +316 -0
  395. package/src/specs/tool-error.test.ts +193 -0
  396. package/src/splitStream.test.ts +691 -0
  397. package/src/splitStream.ts +234 -0
  398. package/src/stream.test.ts +94 -0
  399. package/src/stream.ts +651 -0
  400. package/src/tools/CodeExecutor.ts +220 -0
  401. package/src/tools/ToolNode.ts +170 -0
  402. package/src/tools/example.ts +129 -0
  403. package/src/tools/handlers.ts +336 -0
  404. package/src/tools/search/anthropic.ts +51 -0
  405. package/src/tools/search/content.test.ts +173 -0
  406. package/src/tools/search/content.ts +147 -0
  407. package/src/tools/search/firecrawl.ts +210 -0
  408. package/src/tools/search/format.ts +250 -0
  409. package/src/tools/search/highlights.ts +320 -0
  410. package/src/tools/search/index.ts +2 -0
  411. package/src/tools/search/jina-reranker.test.ts +126 -0
  412. package/src/tools/search/output.md +2775 -0
  413. package/src/tools/search/rerankers.ts +242 -0
  414. package/src/tools/search/schema.ts +63 -0
  415. package/src/tools/search/search.ts +759 -0
  416. package/src/tools/search/serper-scraper.ts +155 -0
  417. package/src/tools/search/test.html +884 -0
  418. package/src/tools/search/test.md +643 -0
  419. package/src/tools/search/test.ts +159 -0
  420. package/src/tools/search/tool.ts +471 -0
  421. package/src/tools/search/types.ts +687 -0
  422. package/src/tools/search/utils.ts +79 -0
  423. package/src/types/graph.ts +185 -0
  424. package/src/types/index.ts +6 -0
  425. package/src/types/llm.ts +140 -0
  426. package/src/types/run.ts +89 -0
  427. package/src/types/stream.ts +400 -0
  428. package/src/types/tools.ts +80 -0
  429. package/src/utils/graph.ts +11 -0
  430. package/src/utils/index.ts +5 -0
  431. package/src/utils/llm.ts +27 -0
  432. package/src/utils/llmConfig.ts +183 -0
  433. package/src/utils/logging.ts +48 -0
  434. package/src/utils/misc.ts +57 -0
  435. package/src/utils/run.ts +101 -0
  436. package/src/utils/title.ts +165 -0
  437. package/src/utils/tokens.ts +70 -0
@@ -0,0 +1,846 @@
1
+ /* eslint-disable no-console */
2
+ // src/graphs/Graph.ts
3
+ import { nanoid } from 'nanoid';
4
+ import { concat } from '@langchain/core/utils/stream';
5
+ import { ToolNode } from '@langchain/langgraph/prebuilt';
6
+ import { ChatVertexAI } from '@langchain/google-vertexai';
7
+ import { START, END, StateGraph } from '@langchain/langgraph';
8
+ import { Runnable, RunnableConfig } from '@langchain/core/runnables';
9
+ import { dispatchCustomEvent } from '@langchain/core/callbacks/dispatch';
10
+ import {
11
+ AIMessageChunk,
12
+ ToolMessage,
13
+ SystemMessage,
14
+ } from '@langchain/core/messages';
15
+ import type {
16
+ BaseMessage,
17
+ BaseMessageFields,
18
+ UsageMetadata,
19
+ } from '@langchain/core/messages';
20
+ import type * as t from '@/types';
21
+ import {
22
+ Providers,
23
+ GraphEvents,
24
+ GraphNodeKeys,
25
+ StepTypes,
26
+ Callback,
27
+ ContentTypes,
28
+ } from '@/common';
29
+ import type { ToolCall } from '@langchain/core/messages/tool';
30
+ import { getChatModelClass, manualToolStreamProviders } from '@/llm/providers';
31
+ import { ToolNode as CustomToolNode, toolsCondition } from '@/tools/ToolNode';
32
+ import {
33
+ createPruneMessages,
34
+ modifyDeltaProperties,
35
+ formatArtifactPayload,
36
+ convertMessagesToContent,
37
+ formatAnthropicArtifactContent,
38
+ } from '@/messages';
39
+ import {
40
+ resetIfNotEmpty,
41
+ isOpenAILike,
42
+ isGoogleLike,
43
+ joinKeys,
44
+ sleep,
45
+ } from '@/utils';
46
+ import { ChatOpenAI, AzureChatOpenAI } from '@/llm/openai';
47
+ import { createFakeStreamingLLM } from '@/llm/fake';
48
+ import { HandlerRegistry } from '@/events';
49
+
50
+ const { AGENT, TOOLS } = GraphNodeKeys;
51
+ export type GraphNode = GraphNodeKeys | typeof START;
52
+ export type ClientCallback<T extends unknown[]> = (
53
+ graph: StandardGraph,
54
+ ...args: T
55
+ ) => void;
56
+ export type ClientCallbacks = {
57
+ [Callback.TOOL_ERROR]?: ClientCallback<[Error, string]>;
58
+ [Callback.TOOL_START]?: ClientCallback<unknown[]>;
59
+ [Callback.TOOL_END]?: ClientCallback<unknown[]>;
60
+ };
61
+ export type SystemCallbacks = {
62
+ [K in keyof ClientCallbacks]: ClientCallbacks[K] extends ClientCallback<
63
+ infer Args
64
+ >
65
+ ? (...args: Args) => void
66
+ : never;
67
+ };
68
+
69
+ export abstract class Graph<
70
+ T extends t.BaseGraphState = t.BaseGraphState,
71
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
72
+ TNodeName extends string = string,
73
+ > {
74
+ abstract resetValues(): void;
75
+ abstract createGraphState(): t.GraphStateChannels<T>;
76
+ abstract initializeTools(): CustomToolNode<T> | ToolNode<T>;
77
+ abstract initializeModel(): Runnable;
78
+ abstract getRunMessages(): BaseMessage[] | undefined;
79
+ abstract getContentParts(): t.MessageContentComplex[] | undefined;
80
+ abstract generateStepId(stepKey: string): [string, number];
81
+ abstract getKeyList(
82
+ metadata: Record<string, unknown> | undefined
83
+ ): (string | number | undefined)[];
84
+ abstract getStepKey(metadata: Record<string, unknown> | undefined): string;
85
+ abstract checkKeyList(keyList: (string | number | undefined)[]): boolean;
86
+ abstract getStepIdByKey(stepKey: string, index?: number): string;
87
+ abstract getRunStep(stepId: string): t.RunStep | undefined;
88
+ abstract dispatchRunStep(stepKey: string, stepDetails: t.StepDetails): string;
89
+ abstract dispatchRunStepDelta(id: string, delta: t.ToolCallDelta): void;
90
+ abstract dispatchMessageDelta(id: string, delta: t.MessageDelta): void;
91
+ abstract dispatchReasoningDelta(
92
+ stepId: string,
93
+ delta: t.ReasoningDelta
94
+ ): void;
95
+ abstract handleToolCallCompleted(
96
+ data: t.ToolEndData,
97
+ metadata?: Record<string, unknown>,
98
+ omitOutput?: boolean
99
+ ): void;
100
+
101
+ abstract createCallModel(): (
102
+ state: T,
103
+ config?: RunnableConfig
104
+ ) => Promise<Partial<T>>;
105
+ abstract createWorkflow(): t.CompiledWorkflow<T>;
106
+ lastToken?: string;
107
+ tokenTypeSwitch?: 'reasoning' | 'content';
108
+ reasoningKey: 'reasoning_content' | 'reasoning' = 'reasoning_content';
109
+ currentTokenType: ContentTypes.TEXT | ContentTypes.THINK | 'think_and_text' =
110
+ ContentTypes.TEXT;
111
+ messageStepHasToolCalls: Map<string, boolean> = new Map();
112
+ messageIdsByStepKey: Map<string, string> = new Map();
113
+ prelimMessageIdsByStepKey: Map<string, string> = new Map();
114
+ config: RunnableConfig | undefined;
115
+ contentData: t.RunStep[] = [];
116
+ stepKeyIds: Map<string, string[]> = new Map<string, string[]>();
117
+ contentIndexMap: Map<string, number> = new Map();
118
+ toolCallStepIds: Map<string, string> = new Map();
119
+ currentUsage: Partial<UsageMetadata> | undefined;
120
+ indexTokenCountMap: Record<string, number | undefined> = {};
121
+ maxContextTokens: number | undefined;
122
+ pruneMessages?: ReturnType<typeof createPruneMessages>;
123
+ /** The amount of time that should pass before another consecutive API call */
124
+ streamBuffer: number | undefined;
125
+ tokenCounter?: t.TokenCounter;
126
+ signal?: AbortSignal;
127
+ /** Set of invoked tool call IDs from non-message run steps completed mid-run, if any */
128
+ invokedToolIds?: Set<string>;
129
+ handlerRegistry: HandlerRegistry | undefined;
130
+ }
131
+
132
+ export class StandardGraph extends Graph<t.BaseGraphState, GraphNode> {
133
+ private graphState: t.GraphStateChannels<t.BaseGraphState>;
134
+ clientOptions: t.ClientOptions;
135
+ boundModel?: Runnable;
136
+ /** The last recorded timestamp that a stream API call was invoked */
137
+ lastStreamCall: number | undefined;
138
+ systemMessage: SystemMessage | undefined;
139
+ messages: BaseMessage[] = [];
140
+ runId: string | undefined;
141
+ tools?: t.GraphTools;
142
+ toolMap?: t.ToolMap;
143
+ startIndex: number = 0;
144
+ provider: Providers;
145
+ toolEnd: boolean;
146
+ signal?: AbortSignal;
147
+
148
+ constructor({
149
+ runId,
150
+ tools,
151
+ signal,
152
+ toolMap,
153
+ provider,
154
+ streamBuffer,
155
+ instructions,
156
+ reasoningKey,
157
+ clientOptions,
158
+ toolEnd = false,
159
+ additional_instructions = '',
160
+ }: t.StandardGraphInput) {
161
+ super();
162
+ this.runId = runId;
163
+ this.tools = tools;
164
+ this.signal = signal;
165
+ this.toolEnd = toolEnd;
166
+ this.toolMap = toolMap;
167
+ this.provider = provider;
168
+ this.streamBuffer = streamBuffer;
169
+ this.clientOptions = clientOptions;
170
+ this.graphState = this.createGraphState();
171
+ this.boundModel = this.initializeModel();
172
+ if (reasoningKey) {
173
+ this.reasoningKey = reasoningKey;
174
+ }
175
+
176
+ let finalInstructions: string | BaseMessageFields | undefined =
177
+ instructions;
178
+ if (additional_instructions) {
179
+ finalInstructions =
180
+ finalInstructions != null && finalInstructions
181
+ ? `${finalInstructions}\n\n${additional_instructions}`
182
+ : additional_instructions;
183
+ }
184
+
185
+ if (
186
+ finalInstructions != null &&
187
+ finalInstructions &&
188
+ provider === Providers.ANTHROPIC &&
189
+ ((
190
+ (clientOptions as t.AnthropicClientOptions).clientOptions
191
+ ?.defaultHeaders as Record<string, string> | undefined
192
+ )?.['anthropic-beta']?.includes('prompt-caching') ??
193
+ false)
194
+ ) {
195
+ finalInstructions = {
196
+ content: [
197
+ {
198
+ type: 'text',
199
+ text: instructions,
200
+ cache_control: { type: 'ephemeral' },
201
+ },
202
+ ],
203
+ };
204
+ }
205
+
206
+ if (finalInstructions != null && finalInstructions !== '') {
207
+ this.systemMessage = new SystemMessage(finalInstructions);
208
+ }
209
+ }
210
+
211
+ /* Init */
212
+
213
+ resetValues(keepContent?: boolean): void {
214
+ this.messages = [];
215
+ this.config = resetIfNotEmpty(this.config, undefined);
216
+ if (keepContent !== true) {
217
+ this.contentData = resetIfNotEmpty(this.contentData, []);
218
+ this.contentIndexMap = resetIfNotEmpty(this.contentIndexMap, new Map());
219
+ }
220
+ this.stepKeyIds = resetIfNotEmpty(this.stepKeyIds, new Map());
221
+ this.toolCallStepIds = resetIfNotEmpty(this.toolCallStepIds, new Map());
222
+ this.messageIdsByStepKey = resetIfNotEmpty(
223
+ this.messageIdsByStepKey,
224
+ new Map()
225
+ );
226
+ this.messageStepHasToolCalls = resetIfNotEmpty(
227
+ this.prelimMessageIdsByStepKey,
228
+ new Map()
229
+ );
230
+ this.prelimMessageIdsByStepKey = resetIfNotEmpty(
231
+ this.prelimMessageIdsByStepKey,
232
+ new Map()
233
+ );
234
+ this.currentTokenType = resetIfNotEmpty(
235
+ this.currentTokenType,
236
+ ContentTypes.TEXT
237
+ );
238
+ this.lastToken = resetIfNotEmpty(this.lastToken, undefined);
239
+ this.tokenTypeSwitch = resetIfNotEmpty(this.tokenTypeSwitch, undefined);
240
+ this.indexTokenCountMap = resetIfNotEmpty(this.indexTokenCountMap, {});
241
+ this.currentUsage = resetIfNotEmpty(this.currentUsage, undefined);
242
+ this.tokenCounter = resetIfNotEmpty(this.tokenCounter, undefined);
243
+ this.maxContextTokens = resetIfNotEmpty(this.maxContextTokens, undefined);
244
+ this.invokedToolIds = resetIfNotEmpty(this.invokedToolIds, undefined);
245
+ }
246
+
247
+ /* Run Step Processing */
248
+
249
+ getRunStep(stepId: string): t.RunStep | undefined {
250
+ const index = this.contentIndexMap.get(stepId);
251
+ if (index !== undefined) {
252
+ return this.contentData[index];
253
+ }
254
+ return undefined;
255
+ }
256
+
257
+ getStepKey(metadata: Record<string, unknown> | undefined): string {
258
+ if (!metadata) return '';
259
+
260
+ const keyList = this.getKeyList(metadata);
261
+ if (this.checkKeyList(keyList)) {
262
+ throw new Error('Missing metadata');
263
+ }
264
+
265
+ return joinKeys(keyList);
266
+ }
267
+
268
+ getStepIdByKey(stepKey: string, index?: number): string {
269
+ const stepIds = this.stepKeyIds.get(stepKey);
270
+ if (!stepIds) {
271
+ throw new Error(`No step IDs found for stepKey ${stepKey}`);
272
+ }
273
+
274
+ if (index === undefined) {
275
+ return stepIds[stepIds.length - 1];
276
+ }
277
+
278
+ return stepIds[index];
279
+ }
280
+
281
+ generateStepId(stepKey: string): [string, number] {
282
+ const stepIds = this.stepKeyIds.get(stepKey);
283
+ let newStepId: string | undefined;
284
+ let stepIndex = 0;
285
+ if (stepIds) {
286
+ stepIndex = stepIds.length;
287
+ newStepId = `step_${nanoid()}`;
288
+ stepIds.push(newStepId);
289
+ this.stepKeyIds.set(stepKey, stepIds);
290
+ } else {
291
+ newStepId = `step_${nanoid()}`;
292
+ this.stepKeyIds.set(stepKey, [newStepId]);
293
+ }
294
+
295
+ return [newStepId, stepIndex];
296
+ }
297
+
298
+ getKeyList(
299
+ metadata: Record<string, unknown> | undefined
300
+ ): (string | number | undefined)[] {
301
+ if (!metadata) return [];
302
+
303
+ const keyList = [
304
+ metadata.run_id as string,
305
+ metadata.thread_id as string,
306
+ metadata.langgraph_node as string,
307
+ metadata.langgraph_step as number,
308
+ metadata.checkpoint_ns as string,
309
+ ];
310
+ if (
311
+ this.currentTokenType === ContentTypes.THINK ||
312
+ this.currentTokenType === 'think_and_text'
313
+ ) {
314
+ keyList.push('reasoning');
315
+ } else if (this.tokenTypeSwitch === 'content') {
316
+ keyList.push('post-reasoning');
317
+ }
318
+
319
+ if (this.invokedToolIds != null && this.invokedToolIds.size > 0) {
320
+ keyList.push(this.invokedToolIds.size + '');
321
+ }
322
+
323
+ return keyList;
324
+ }
325
+
326
+ checkKeyList(keyList: (string | number | undefined)[]): boolean {
327
+ return keyList.some((key) => key === undefined);
328
+ }
329
+
330
+ /* Misc.*/
331
+
332
+ getRunMessages(): BaseMessage[] | undefined {
333
+ return this.messages.slice(this.startIndex);
334
+ }
335
+
336
+ getContentParts(): t.MessageContentComplex[] | undefined {
337
+ return convertMessagesToContent(this.messages.slice(this.startIndex));
338
+ }
339
+
340
+ /* Graph */
341
+
342
+ createGraphState(): t.GraphStateChannels<t.BaseGraphState> {
343
+ return {
344
+ messages: {
345
+ value: (x: BaseMessage[], y: BaseMessage[]): BaseMessage[] => {
346
+ if (!x.length) {
347
+ if (this.systemMessage) {
348
+ x.push(this.systemMessage);
349
+ }
350
+
351
+ this.startIndex = x.length + y.length;
352
+ }
353
+ const current = x.concat(y);
354
+ this.messages = current;
355
+ return current;
356
+ },
357
+ default: () => [],
358
+ },
359
+ };
360
+ }
361
+
362
+ initializeTools():
363
+ | CustomToolNode<t.BaseGraphState>
364
+ | ToolNode<t.BaseGraphState> {
365
+ // return new ToolNode<t.BaseGraphState>(this.tools);
366
+ return new CustomToolNode<t.BaseGraphState>({
367
+ tools: (this.tools as t.GenericTool[] | undefined) || [],
368
+ toolMap: this.toolMap,
369
+ toolCallStepIds: this.toolCallStepIds,
370
+ errorHandler: (data, metadata) =>
371
+ StandardGraph.handleToolCallErrorStatic(this, data, metadata),
372
+ });
373
+ }
374
+
375
+ initializeModel(): Runnable {
376
+ const ChatModelClass = getChatModelClass(this.provider);
377
+ const model = new ChatModelClass(this.clientOptions);
378
+
379
+ if (
380
+ isOpenAILike(this.provider) &&
381
+ (model instanceof ChatOpenAI || model instanceof AzureChatOpenAI)
382
+ ) {
383
+ model.temperature = (this.clientOptions as t.OpenAIClientOptions)
384
+ .temperature as number;
385
+ model.topP = (this.clientOptions as t.OpenAIClientOptions).topP as number;
386
+ model.frequencyPenalty = (this.clientOptions as t.OpenAIClientOptions)
387
+ .frequencyPenalty as number;
388
+ model.presencePenalty = (this.clientOptions as t.OpenAIClientOptions)
389
+ .presencePenalty as number;
390
+ model.n = (this.clientOptions as t.OpenAIClientOptions).n as number;
391
+ } else if (
392
+ this.provider === Providers.VERTEXAI &&
393
+ model instanceof ChatVertexAI
394
+ ) {
395
+ model.temperature = (this.clientOptions as t.VertexAIClientOptions)
396
+ .temperature as number;
397
+ model.topP = (this.clientOptions as t.VertexAIClientOptions)
398
+ .topP as number;
399
+ model.topK = (this.clientOptions as t.VertexAIClientOptions)
400
+ .topK as number;
401
+ model.topLogprobs = (this.clientOptions as t.VertexAIClientOptions)
402
+ .topLogprobs as number;
403
+ model.frequencyPenalty = (this.clientOptions as t.VertexAIClientOptions)
404
+ .frequencyPenalty as number;
405
+ model.presencePenalty = (this.clientOptions as t.VertexAIClientOptions)
406
+ .presencePenalty as number;
407
+ model.maxOutputTokens = (this.clientOptions as t.VertexAIClientOptions)
408
+ .maxOutputTokens as number;
409
+ }
410
+
411
+ if (!this.tools || this.tools.length === 0) {
412
+ return model as unknown as Runnable;
413
+ }
414
+
415
+ return (model as t.ModelWithTools).bindTools(this.tools);
416
+ }
417
+ overrideTestModel(
418
+ responses: string[],
419
+ sleep?: number,
420
+ toolCalls?: ToolCall[]
421
+ ): void {
422
+ this.boundModel = createFakeStreamingLLM({
423
+ responses,
424
+ sleep,
425
+ toolCalls,
426
+ });
427
+ }
428
+
429
+ getNewModel({
430
+ provider,
431
+ clientOptions,
432
+ omitOptions,
433
+ }: {
434
+ provider: Providers;
435
+ clientOptions?: t.ClientOptions;
436
+ omitOptions?: Set<string>;
437
+ }): t.ChatModelInstance {
438
+ const ChatModelClass = getChatModelClass(provider);
439
+ const options =
440
+ omitOptions && clientOptions == null
441
+ ? Object.assign(
442
+ Object.fromEntries(
443
+ Object.entries(this.clientOptions).filter(
444
+ ([key]) => !omitOptions.has(key)
445
+ )
446
+ ),
447
+ clientOptions
448
+ )
449
+ : (clientOptions ?? this.clientOptions);
450
+ return new ChatModelClass(options);
451
+ }
452
+
453
+ storeUsageMetadata(finalMessage?: BaseMessage): void {
454
+ if (
455
+ finalMessage &&
456
+ 'usage_metadata' in finalMessage &&
457
+ finalMessage.usage_metadata != null
458
+ ) {
459
+ this.currentUsage = finalMessage.usage_metadata as Partial<UsageMetadata>;
460
+ }
461
+ }
462
+
463
+ cleanupSignalListener(): void {
464
+ if (!this.signal) {
465
+ return;
466
+ }
467
+ if (!this.boundModel) {
468
+ return;
469
+ }
470
+ const client = (this.boundModel as ChatOpenAI | undefined)?.exposedClient;
471
+ if (!client?.abortHandler) {
472
+ return;
473
+ }
474
+ this.signal.removeEventListener('abort', client.abortHandler);
475
+ client.abortHandler = undefined;
476
+ }
477
+
478
+ createCallModel() {
479
+ return async (
480
+ state: t.BaseGraphState,
481
+ config?: RunnableConfig
482
+ ): Promise<Partial<t.BaseGraphState>> => {
483
+ const { provider = '' } =
484
+ (config?.configurable as t.GraphConfig | undefined) ?? {};
485
+ if (this.boundModel == null) {
486
+ throw new Error('No Graph model found');
487
+ }
488
+ if (!config || !provider) {
489
+ throw new Error(`No ${config ? 'provider' : 'config'} provided`);
490
+ }
491
+ if (!config.signal) {
492
+ config.signal = this.signal;
493
+ }
494
+ this.config = config;
495
+ const { messages } = state;
496
+
497
+ let messagesToUse = messages;
498
+ if (
499
+ !this.pruneMessages &&
500
+ this.tokenCounter &&
501
+ this.maxContextTokens != null &&
502
+ this.indexTokenCountMap[0] != null
503
+ ) {
504
+ const isAnthropicWithThinking =
505
+ (this.provider === Providers.ANTHROPIC &&
506
+ (this.clientOptions as t.AnthropicClientOptions).thinking !=
507
+ null) ||
508
+ (this.provider === Providers.BEDROCK &&
509
+ (this.clientOptions as t.BedrockAnthropicInput)
510
+ .additionalModelRequestFields?.['thinking'] != null) ||
511
+ (this.provider === Providers.OPENAI &&
512
+ (
513
+ (this.clientOptions as t.OpenAIClientOptions).modelKwargs
514
+ ?.thinking as t.AnthropicClientOptions['thinking']
515
+ )?.type === 'enabled');
516
+
517
+ this.pruneMessages = createPruneMessages({
518
+ provider: this.provider,
519
+ indexTokenCountMap: this.indexTokenCountMap,
520
+ maxTokens: this.maxContextTokens,
521
+ tokenCounter: this.tokenCounter,
522
+ startIndex: this.startIndex,
523
+ thinkingEnabled: isAnthropicWithThinking,
524
+ });
525
+ }
526
+ if (this.pruneMessages) {
527
+ const { context, indexTokenCountMap } = this.pruneMessages({
528
+ messages,
529
+ usageMetadata: this.currentUsage,
530
+ // startOnMessageType: 'human',
531
+ });
532
+ this.indexTokenCountMap = indexTokenCountMap;
533
+ messagesToUse = context;
534
+ }
535
+
536
+ const finalMessages = messagesToUse;
537
+ const lastMessageX =
538
+ finalMessages.length >= 2
539
+ ? finalMessages[finalMessages.length - 2]
540
+ : null;
541
+ const lastMessageY =
542
+ finalMessages.length >= 1
543
+ ? finalMessages[finalMessages.length - 1]
544
+ : null;
545
+
546
+ if (
547
+ provider === Providers.BEDROCK &&
548
+ lastMessageX instanceof AIMessageChunk &&
549
+ lastMessageY instanceof ToolMessage &&
550
+ typeof lastMessageX.content === 'string'
551
+ ) {
552
+ finalMessages[finalMessages.length - 2].content = '';
553
+ }
554
+
555
+ const isLatestToolMessage = lastMessageY instanceof ToolMessage;
556
+
557
+ if (isLatestToolMessage && provider === Providers.ANTHROPIC) {
558
+ formatAnthropicArtifactContent(finalMessages);
559
+ } else if (
560
+ isLatestToolMessage &&
561
+ (isOpenAILike(provider) || isGoogleLike(provider))
562
+ ) {
563
+ formatArtifactPayload(finalMessages);
564
+ }
565
+
566
+ if (this.lastStreamCall != null && this.streamBuffer != null) {
567
+ const timeSinceLastCall = Date.now() - this.lastStreamCall;
568
+ if (timeSinceLastCall < this.streamBuffer) {
569
+ const timeToWait =
570
+ Math.ceil((this.streamBuffer - timeSinceLastCall) / 1000) * 1000;
571
+ await sleep(timeToWait);
572
+ }
573
+ }
574
+
575
+ this.lastStreamCall = Date.now();
576
+
577
+ let result: Partial<t.BaseGraphState>;
578
+ if (
579
+ (this.tools?.length ?? 0) > 0 &&
580
+ manualToolStreamProviders.has(provider)
581
+ ) {
582
+ const stream = await this.boundModel.stream(finalMessages, config);
583
+ let finalChunk: AIMessageChunk | undefined;
584
+ for await (const chunk of stream) {
585
+ dispatchCustomEvent(GraphEvents.CHAT_MODEL_STREAM, { chunk }, config);
586
+ if (!finalChunk) {
587
+ finalChunk = chunk;
588
+ } else {
589
+ finalChunk = concat(finalChunk, chunk);
590
+ }
591
+ }
592
+
593
+ finalChunk = modifyDeltaProperties(this.provider, finalChunk);
594
+ result = { messages: [finalChunk as AIMessageChunk] };
595
+ } else {
596
+ const finalMessage = (await this.boundModel.invoke(
597
+ finalMessages,
598
+ config
599
+ )) as AIMessageChunk;
600
+ if ((finalMessage.tool_calls?.length ?? 0) > 0) {
601
+ finalMessage.tool_calls = finalMessage.tool_calls?.filter(
602
+ (tool_call) => {
603
+ if (!tool_call.name) {
604
+ return false;
605
+ }
606
+ return true;
607
+ }
608
+ );
609
+ }
610
+ result = { messages: [finalMessage] };
611
+ }
612
+
613
+ this.storeUsageMetadata(result.messages?.[0]);
614
+ this.cleanupSignalListener();
615
+ return result;
616
+ };
617
+ }
618
+
619
+ createWorkflow(): t.CompiledWorkflow<t.BaseGraphState> {
620
+ const routeMessage = (
621
+ state: t.BaseGraphState,
622
+ config?: RunnableConfig
623
+ ): string => {
624
+ this.config = config;
625
+ return toolsCondition(state, this.invokedToolIds);
626
+ };
627
+
628
+ const workflow = new StateGraph<t.BaseGraphState>({
629
+ channels: this.graphState,
630
+ })
631
+ .addNode(AGENT, this.createCallModel())
632
+ .addNode(TOOLS, this.initializeTools())
633
+ .addEdge(START, AGENT)
634
+ .addConditionalEdges(AGENT, routeMessage)
635
+ .addEdge(TOOLS, this.toolEnd ? END : AGENT);
636
+
637
+ return workflow.compile();
638
+ }
639
+
640
+ /* Dispatchers */
641
+
642
+ /**
643
+ * Dispatches a run step to the client, returns the step ID
644
+ */
645
+ dispatchRunStep(stepKey: string, stepDetails: t.StepDetails): string {
646
+ if (!this.config) {
647
+ throw new Error('No config provided');
648
+ }
649
+
650
+ const [stepId, stepIndex] = this.generateStepId(stepKey);
651
+ if (stepDetails.type === StepTypes.TOOL_CALLS && stepDetails.tool_calls) {
652
+ for (const tool_call of stepDetails.tool_calls) {
653
+ const toolCallId = tool_call.id ?? '';
654
+ if (!toolCallId || this.toolCallStepIds.has(toolCallId)) {
655
+ continue;
656
+ }
657
+ this.toolCallStepIds.set(toolCallId, stepId);
658
+ }
659
+ }
660
+
661
+ const runStep: t.RunStep = {
662
+ stepIndex,
663
+ id: stepId,
664
+ type: stepDetails.type,
665
+ index: this.contentData.length,
666
+ stepDetails,
667
+ usage: null,
668
+ };
669
+
670
+ const runId = this.runId ?? '';
671
+ if (runId) {
672
+ runStep.runId = runId;
673
+ }
674
+
675
+ this.contentData.push(runStep);
676
+ this.contentIndexMap.set(stepId, runStep.index);
677
+ dispatchCustomEvent(GraphEvents.ON_RUN_STEP, runStep, this.config);
678
+ return stepId;
679
+ }
680
+
681
+ handleToolCallCompleted(
682
+ data: t.ToolEndData,
683
+ metadata?: Record<string, unknown>,
684
+ omitOutput?: boolean
685
+ ): void {
686
+ if (!this.config) {
687
+ throw new Error('No config provided');
688
+ }
689
+
690
+ if (!data.output) {
691
+ return;
692
+ }
693
+
694
+ const { input, output } = data;
695
+ const { tool_call_id } = output;
696
+ const stepId = this.toolCallStepIds.get(tool_call_id) ?? '';
697
+ if (!stepId) {
698
+ throw new Error(`No stepId found for tool_call_id ${tool_call_id}`);
699
+ }
700
+
701
+ const runStep = this.getRunStep(stepId);
702
+ if (!runStep) {
703
+ throw new Error(`No run step found for stepId ${stepId}`);
704
+ }
705
+
706
+ const dispatchedOutput =
707
+ typeof output.content === 'string'
708
+ ? output.content
709
+ : JSON.stringify(output.content);
710
+
711
+ const args = typeof input === 'string' ? input : input.input;
712
+ const tool_call = {
713
+ args: typeof args === 'string' ? args : JSON.stringify(args),
714
+ name: output.name ?? '',
715
+ id: output.tool_call_id,
716
+ output: omitOutput === true ? '' : dispatchedOutput,
717
+ progress: 1,
718
+ };
719
+
720
+ this.handlerRegistry?.getHandler(GraphEvents.ON_RUN_STEP_COMPLETED)?.handle(
721
+ GraphEvents.ON_RUN_STEP_COMPLETED,
722
+ {
723
+ result: {
724
+ id: stepId,
725
+ index: runStep.index,
726
+ type: 'tool_call',
727
+ tool_call,
728
+ } as t.ToolCompleteEvent,
729
+ },
730
+ metadata,
731
+ this
732
+ );
733
+ }
734
+ /**
735
+ * Static version of handleToolCallError to avoid creating strong references
736
+ * that prevent garbage collection
737
+ */
738
+ static handleToolCallErrorStatic(
739
+ graph: StandardGraph,
740
+ data: t.ToolErrorData,
741
+ metadata?: Record<string, unknown>
742
+ ): void {
743
+ if (!graph.config) {
744
+ throw new Error('No config provided');
745
+ }
746
+
747
+ if (!data.id) {
748
+ console.warn('No Tool ID provided for Tool Error');
749
+ return;
750
+ }
751
+
752
+ const stepId = graph.toolCallStepIds.get(data.id) ?? '';
753
+ if (!stepId) {
754
+ throw new Error(`No stepId found for tool_call_id ${data.id}`);
755
+ }
756
+
757
+ const { name, input: args, error } = data;
758
+
759
+ const runStep = graph.getRunStep(stepId);
760
+ if (!runStep) {
761
+ throw new Error(`No run step found for stepId ${stepId}`);
762
+ }
763
+
764
+ const tool_call: t.ProcessedToolCall = {
765
+ id: data.id,
766
+ name: name || '',
767
+ args: typeof args === 'string' ? args : JSON.stringify(args),
768
+ output: `Error processing tool${error?.message != null ? `: ${error.message}` : ''}`,
769
+ progress: 1,
770
+ };
771
+
772
+ graph.handlerRegistry
773
+ ?.getHandler(GraphEvents.ON_RUN_STEP_COMPLETED)
774
+ ?.handle(
775
+ GraphEvents.ON_RUN_STEP_COMPLETED,
776
+ {
777
+ result: {
778
+ id: stepId,
779
+ index: runStep.index,
780
+ type: 'tool_call',
781
+ tool_call,
782
+ } as t.ToolCompleteEvent,
783
+ },
784
+ metadata,
785
+ graph
786
+ );
787
+ }
788
+
789
+ /**
790
+ * Instance method that delegates to the static method
791
+ * Kept for backward compatibility
792
+ */
793
+ handleToolCallError(
794
+ data: t.ToolErrorData,
795
+ metadata?: Record<string, unknown>
796
+ ): void {
797
+ StandardGraph.handleToolCallErrorStatic(this, data, metadata);
798
+ }
799
+
800
+ dispatchRunStepDelta(id: string, delta: t.ToolCallDelta): void {
801
+ if (!this.config) {
802
+ throw new Error('No config provided');
803
+ } else if (!id) {
804
+ throw new Error('No step ID found');
805
+ }
806
+ const runStepDelta: t.RunStepDeltaEvent = {
807
+ id,
808
+ delta,
809
+ };
810
+ dispatchCustomEvent(
811
+ GraphEvents.ON_RUN_STEP_DELTA,
812
+ runStepDelta,
813
+ this.config
814
+ );
815
+ }
816
+
817
+ dispatchMessageDelta(id: string, delta: t.MessageDelta): void {
818
+ if (!this.config) {
819
+ throw new Error('No config provided');
820
+ }
821
+ const messageDelta: t.MessageDeltaEvent = {
822
+ id,
823
+ delta,
824
+ };
825
+ dispatchCustomEvent(
826
+ GraphEvents.ON_MESSAGE_DELTA,
827
+ messageDelta,
828
+ this.config
829
+ );
830
+ }
831
+
832
+ dispatchReasoningDelta = (stepId: string, delta: t.ReasoningDelta): void => {
833
+ if (!this.config) {
834
+ throw new Error('No config provided');
835
+ }
836
+ const reasoningDelta: t.ReasoningDeltaEvent = {
837
+ id: stepId,
838
+ delta,
839
+ };
840
+ dispatchCustomEvent(
841
+ GraphEvents.ON_REASONING_DELTA,
842
+ reasoningDelta,
843
+ this.config
844
+ );
845
+ };
846
+ }